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) {
|
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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user