#include "animation/linear_animation_instance.hpp"
#include "artboard.hpp"
#include "file.hpp"
-#include "thorvg_renderer.hpp"
+#include "tvg_renderer.hpp"
using namespace std;
#define HEIGHT 700
#define LIST_HEIGHT 200
-static unique_ptr<tvg::SwCanvas> canvas;
-static tvg::Canvas *renderCanvas;
+static unique_ptr<tvg::SwCanvas> canvas = nullptr;
static rive::File* currentFile = nullptr;
static rive::Artboard* artboard = nullptr;
static rive::LinearAnimationInstance* animationInstance = nullptr;
static Eo* view = nullptr;
static vector<std::string> rivefiles;
static double lastTime;
+static Eo* statePopup = nullptr;
static void deleteWindow(void *data, Evas_Object *obj, void *ev)
{
static void drawToCanvas(void* data, Eo* obj)
{
- if (canvas->draw() == tvg::Result::Success)
- {
- canvas->sync();
- }
+ if (canvas->draw() == tvg::Result::Success) canvas->sync();
}
static bool isRiveFile(const char *filename)
return !strcmp(dot + 1, "riv");
}
+static void initAnimation(int index)
+{
+ delete animationInstance;
+ animationInstance = nullptr;
+
+ auto animation = artboard->animation(index);
+ if (animation) animationInstance = new rive::LinearAnimationInstance(animation);
+}
+
static void loadRiveFile(const char* filename)
{
- // Clear Canvas Buffer
- renderCanvas->clear();
+ lastTime = ecore_time_get(); //Check point
+ canvas->clear(); //Clear Canvas Buffer
// Load Rive File
FILE* fp = fopen(filename, "r");
artboard->advance(0.0f);
delete animationInstance;
- delete currentFile;
+ animationInstance = nullptr;
- auto animation = artboard->firstAnimation<rive::LinearAnimation>();
- if (animation != nullptr)
- {
- animationInstance = new rive::LinearAnimationInstance(animation);
- }
- else
- {
- animationInstance = nullptr;
- }
+ auto animation = artboard->firstAnimation();
+ if (animation) animationInstance = new rive::LinearAnimationInstance(animation);
+ delete currentFile;
currentFile = file;
+
delete[] bytes;
}
{
Elm_Object_Item *item = elm_list_selected_item_get(obj);
int index = 0;
- for (Elm_Object_Item *iter = item; iter != NULL; iter = elm_list_item_prev(iter))
+ for (Elm_Object_Item *iter = item; iter != nullptr; iter = elm_list_item_prev(iter))
+ {
index++;
- if (rivefiles.size() > 0)
- loadRiveFile(rivefiles[index-1].c_str());
+ }
+ if (rivefiles.size() > 0) loadRiveFile(rivefiles[index-1].c_str());
+ if (statePopup) elm_ctxpopup_dismiss(statePopup);
}
static std::vector<std::string> riveFiles(const std::string &dirName)
struct dirent *dir;
std::vector<std::string> result;
d = opendir(dirName.c_str());
- if (d) {
- while ((dir = readdir(d)) != NULL) {
- if (isRiveFile(dir->d_name))
- result.push_back(dirName + dir->d_name);
+ if (d)
+ {
+ while ((dir = readdir(d)) != nullptr)
+ {
+ if (isRiveFile(dir->d_name)) result.push_back(dirName + dir->d_name);
}
closedir(d);
}
Eina_Bool animationLoop(void *data)
{
+ canvas->clear();
+
double currentTime = ecore_time_get();
float elapsed = currentTime - lastTime;
- static float animationTime = 0;
lastTime = currentTime;
- if (artboard != nullptr)
- {
- if (animationInstance != nullptr)
- {
- animationInstance->advance(elapsed);
- animationInstance->apply(artboard);
- }
- artboard->advance(elapsed);
-
- rive::TvgRenderer renderer(renderCanvas);
- renderer.save();
- renderer.align(rive::Fit::contain,
- rive::Alignment::center,
- rive::AABB(0, 0, WIDTH, HEIGHT),
- artboard->bounds());
- artboard->draw(&renderer);
- renderer.restore();
- }
+ if (!artboard || !animationInstance) return ECORE_CALLBACK_RENEW;
+
+ animationInstance->advance(elapsed);
+ animationInstance->apply(artboard);
+
+ artboard->advance(elapsed);
+
+ rive::TvgRenderer renderer(canvas.get());
+ renderer.save();
+ renderer.align(rive::Fit::contain,
+ rive::Alignment::center,
+ rive::AABB(0, 0, WIDTH, HEIGHT),
+ artboard->bounds());
+ artboard->draw(&renderer);
+ renderer.restore();
evas_object_image_pixels_dirty_set(view, EINA_TRUE);
evas_object_image_data_update_add(view, 0, 0, WIDTH, HEIGHT);
//Create a Canvas
canvas = tvg::SwCanvas::gen();
canvas->target(buffer, WIDTH, WIDTH, HEIGHT, tvg::SwCanvas::ARGB8888);
- renderCanvas = canvas.get();
-
- lastTime = ecore_time_get();
- ecore_animator_frametime_set(1. / 60);
animator = ecore_animator_add(animationLoop, nullptr);
}
delete animationInstance;
}
+static void animPopupItemCb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+ int animationIndex = static_cast<int>(reinterpret_cast<intptr_t>(data));
+ initAnimation(animationIndex);
+ elm_ctxpopup_dismiss(statePopup);
+}
+
+static Elm_Object_Item* animPopupItemNew(Evas_Object *obj, const char *label, int index)
+{
+ Elm_Object_Item *it = nullptr;
+
+ if (!obj) return nullptr;
+
+ return elm_ctxpopup_item_append(obj, label, nullptr, animPopupItemCb, (void*)index);
+}
+
+static void animPopupDismissCb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ evas_object_del(obj);
+ statePopup = nullptr;
+}
+
+static void viewClickedCb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+ if (!artboard) return;
+ if (statePopup) evas_object_del(statePopup);
+
+ statePopup = elm_ctxpopup_add(obj);
+ evas_object_smart_callback_add(statePopup, "dismissed", animPopupDismissCb, nullptr);
+
+ for (int index = 0; index < artboard->animationCount(); index++)
+ animPopupItemNew(statePopup, artboard->animation(index)->name().c_str(), index);
+
+ int x, y;
+ evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y);
+ evas_object_move(statePopup, x, y);
+ evas_object_show(statePopup);
+}
+
static void setupScreen(uint32_t* buffer)
{
- Eo* win = elm_win_util_standard_add(NULL, "Rive Viewer");
+ Eo* win = elm_win_util_standard_add(nullptr, "Rive Viewer");
evas_object_smart_callback_add(win, "delete,request", deleteWindow, 0);
Eo* box = elm_box_add(win);
evas_object_show(view);
elm_box_pack_end(box, view);
+ evas_object_event_callback_add(view, EVAS_CALLBACK_MOUSE_UP, viewClickedCb, nullptr);
Eo *fileList = elm_list_add(box);
evas_object_size_hint_weight_set(fileList, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
// Search Rive Files in Resource Dir
rivefiles = riveFiles(RIVE_FILE_DIR);
- for (int i = 0; i < rivefiles.size(); i++)
+ for (size_t i = 0; i < rivefiles.size(); i++)
{
const char *ptr = strrchr(rivefiles[i].c_str(), '/');
- Elm_Object_Item *item = elm_list_item_append(fileList, ptr + 1, NULL, NULL, fileClickedCb, NULL);
+ elm_list_item_append(fileList, ptr + 1, nullptr, nullptr, fileClickedCb, nullptr);
}
elm_list_go(fileList);