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) {
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();

View File

@@ -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;

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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();