fix layer and frame duplicate

This commit is contained in:
2019-11-04 15:03:21 +01:00
parent adc64ad42e
commit 4b6316bf68
5 changed files with 38 additions and 13 deletions

View File

@@ -169,8 +169,9 @@ void App::init_sidebar()
}; };
layers->on_layer_add = [this](Node*, std::shared_ptr<class Layer> layer, int index) { layers->on_layer_add = [this](Node*, std::shared_ptr<class Layer> layer, int index) {
canvas->m_canvas->layer_add(layers->m_layers.back()->m_label_text.c_str(), layer, index); Canvas::I->layer_add(layers->m_layers.back()->m_label_text.c_str(), layer, index);
canvas->m_canvas->m_unsaved = true; Canvas::I->m_unsaved = true;
Canvas::I->anim_update();
animation->load_layers(); animation->load_layers();
title_update(); 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); 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& dst = Canvas::I->m_layers[source_index + 1];
auto& src = Canvas::I->m_layers[source_index]; 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)) for (int i = 0; i < 6; i++)
continue; {
dst->rtt(i).copy(src->rtt(i)); if (!src->face(i))
dst->face(i) = src->face(i); continue;
dst->box(i) = src->box(i); bool loaded = src->frame(frame).gpu_load();
dst->m_opacity = src->m_opacity; dst->frame(frame).gpu_load();
dst->m_blend_mode = src->m_blend_mode; dst->rtt(i, frame).copy(src->rtt(i));
dst->m_alpha_locked = src->m_alpha_locked; 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; Canvas::I->m_unsaved = true;
animation->load_layers(); animation->load_layers();
title_update(); title_update();

View File

@@ -1347,6 +1347,12 @@ int Canvas::anim_duration() const noexcept
return frames; 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 void Canvas::anim_goto_frame(int frame) noexcept
{ {
m_anim_frame = frame; m_anim_frame = frame;

View File

@@ -191,6 +191,7 @@ public:
void layer_order(int idx, int pos); void layer_order(int idx, int pos);
void layer_merge(int source_idx, int dest_idx); void layer_merge(int source_idx, int dest_idx);
int anim_duration() const noexcept; int anim_duration() const noexcept;
void anim_update() noexcept;
void anim_goto_frame(int frame) noexcept; void anim_goto_frame(int frame) noexcept;
void anim_goto_next() noexcept; void anim_goto_next() noexcept;
void anim_goto_prev() noexcept; void anim_goto_prev() noexcept;

View File

@@ -27,8 +27,10 @@ bool& Layer::face(int i, int frame /*= -1*/)
return m_frames[frame].m_dirty_face[i]; 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]; return m_frames[m_frame_index];
} }
@@ -205,6 +207,8 @@ void Layer::remove_frame(int frame)
void Layer::duplicate_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()); m_frames.insert(m_frames.begin() + frame + 1, m_frames[frame].clone());
frames_gpu_update(); frames_gpu_update();
} }

View File

@@ -66,7 +66,7 @@ public:
RTT& rtt(int i, int frame = -1); RTT& rtt(int i, int frame = -1);
glm::vec4& box(int i, int frame = -1); glm::vec4& box(int i, int frame = -1);
bool& face(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); void resize(int width, int height);
bool create(int width, int height, std::string name); bool create(int width, int height, std::string name);
bool add_frame(); bool add_frame();