fix layer and frame duplicate
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user