From 4b6316bf681c9e797c29e9af125ff1a3789e075d Mon Sep 17 00:00:00 2001 From: omigamedev Date: Mon, 4 Nov 2019 15:03:21 +0100 Subject: [PATCH] fix layer and frame duplicate --- src/app_layout.cpp | 36 +++++++++++++++++++++++++----------- src/canvas.cpp | 6 ++++++ src/canvas.h | 1 + src/canvas_layer.cpp | 6 +++++- src/canvas_layer.h | 2 +- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/app_layout.cpp b/src/app_layout.cpp index 5aee5fd..15d8291 100644 --- a/src/app_layout.cpp +++ b/src/app_layout.cpp @@ -169,8 +169,9 @@ void App::init_sidebar() }; layers->on_layer_add = [this](Node*, std::shared_ptr layer, int index) { - canvas->m_canvas->layer_add(layers->m_layers.back()->m_label_text.c_str(), layer, index); - canvas->m_canvas->m_unsaved = true; + Canvas::I->layer_add(layers->m_layers.back()->m_label_text.c_str(), layer, index); + Canvas::I->m_unsaved = true; + Canvas::I->anim_update(); animation->load_layers(); title_update(); }; @@ -179,17 +180,30 @@ void App::init_sidebar() Canvas::I->layer_add(layers->m_layers.back()->m_label_text.c_str(), nullptr, source_index + 1); auto& dst = Canvas::I->m_layers[source_index + 1]; auto& src = Canvas::I->m_layers[source_index]; - for (int i = 0; i < 6; i++) + for (int i = 1; i < src->frames_count(); i++) + dst->add_frame(); + Canvas::I->anim_update(); + for (int frame = 0; frame < src->frames_count(); frame++) { - if (!src->face(i)) - continue; - dst->rtt(i).copy(src->rtt(i)); - dst->face(i) = src->face(i); - dst->box(i) = src->box(i); - dst->m_opacity = src->m_opacity; - dst->m_blend_mode = src->m_blend_mode; - dst->m_alpha_locked = src->m_alpha_locked; + for (int i = 0; i < 6; i++) + { + if (!src->face(i)) + continue; + bool loaded = src->frame(frame).gpu_load(); + dst->frame(frame).gpu_load(); + dst->rtt(i, frame).copy(src->rtt(i)); + dst->face(i, frame) = src->face(i); + dst->box(i, frame) = src->box(i); + if (!loaded) + { + dst->frame(frame).gpu_unload(); + src->frame(frame).gpu_unload(); + } + } } + dst->m_opacity = src->m_opacity; + dst->m_blend_mode = src->m_blend_mode; + dst->m_alpha_locked = src->m_alpha_locked; Canvas::I->m_unsaved = true; animation->load_layers(); title_update(); diff --git a/src/canvas.cpp b/src/canvas.cpp index d2167d8..bd0bc5d 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -1347,6 +1347,12 @@ int Canvas::anim_duration() const noexcept return frames; } +void Canvas::anim_update() noexcept +{ + for (auto& l : m_layers) + l->goto_frame(m_anim_frame); +} + void Canvas::anim_goto_frame(int frame) noexcept { m_anim_frame = frame; diff --git a/src/canvas.h b/src/canvas.h index 0fc2887..94e0060 100644 --- a/src/canvas.h +++ b/src/canvas.h @@ -191,6 +191,7 @@ public: void layer_order(int idx, int pos); void layer_merge(int source_idx, int dest_idx); int anim_duration() const noexcept; + void anim_update() noexcept; void anim_goto_frame(int frame) noexcept; void anim_goto_next() noexcept; void anim_goto_prev() noexcept; diff --git a/src/canvas_layer.cpp b/src/canvas_layer.cpp index 2c9896f..44a7467 100644 --- a/src/canvas_layer.cpp +++ b/src/canvas_layer.cpp @@ -27,8 +27,10 @@ bool& Layer::face(int i, int frame /*= -1*/) return m_frames[frame].m_dirty_face[i]; } -LayerFrame& Layer::frame() +LayerFrame& Layer::frame(int frame /*= -1*/) { + if (frame == -1) + frame = m_frame_index; return m_frames[m_frame_index]; } @@ -205,6 +207,8 @@ void Layer::remove_frame(int frame) void Layer::duplicate_frame(int frame) { + if (frame == -1) + frame = m_frame_index; m_frames.insert(m_frames.begin() + frame + 1, m_frames[frame].clone()); frames_gpu_update(); } diff --git a/src/canvas_layer.h b/src/canvas_layer.h index 8082c45..34cd428 100644 --- a/src/canvas_layer.h +++ b/src/canvas_layer.h @@ -66,7 +66,7 @@ public: RTT& rtt(int i, int frame = -1); glm::vec4& box(int i, int frame = -1); bool& face(int i, int frame = -1); - LayerFrame& frame(); + LayerFrame& frame(int frame = -1); void resize(int width, int height); bool create(int width, int height, std::string name); bool add_frame();