fix bucket undo
This commit is contained in:
@@ -3216,10 +3216,10 @@ void Layer::optimize()
|
||||
|
||||
void Layer::restore(const Snapshot& snap)
|
||||
{
|
||||
//clear({ 0, 0, 0, 0 });
|
||||
clear({ 0, 0, 0, 0 });
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
if (snap.image[i] == nullptr || snap.m_dirty_face[i] == false)
|
||||
if (snap.image[i] == nullptr)
|
||||
continue;
|
||||
|
||||
m_dirty_box[i] = snap.m_dirty_box[i];
|
||||
@@ -3242,7 +3242,7 @@ void Layer::restore(const Snapshot& snap)
|
||||
}
|
||||
}
|
||||
|
||||
Layer::Snapshot Layer::snapshot(glm::vec4 dirty_box[6] /*= nullptr*/, bool dirty_face[6] /*= nullptr*/)
|
||||
Layer::Snapshot Layer::snapshot(std::array<glm::vec4, 6> * dirty_box /*= nullptr*/, std::array<bool, 6> * dirty_face /*= nullptr*/)
|
||||
{
|
||||
Snapshot snap;
|
||||
static int counter = 0;
|
||||
@@ -3250,8 +3250,8 @@ Layer::Snapshot Layer::snapshot(glm::vec4 dirty_box[6] /*= nullptr*/, bool dirty
|
||||
//glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
snap.m_dirty_box[i] = dirty_box ? dirty_box[i] : m_dirty_box[i];
|
||||
snap.m_dirty_face[i] = dirty_face ? dirty_face[i] : m_dirty_face[i];
|
||||
snap.m_dirty_box[i] = dirty_box ? dirty_box->at(i) : m_dirty_box[i];
|
||||
snap.m_dirty_face[i] = dirty_face ? dirty_face->at(i) : m_dirty_face[i];
|
||||
|
||||
if (!snap.m_dirty_face[i])
|
||||
continue;
|
||||
|
||||
@@ -71,7 +71,7 @@ public:
|
||||
std::shared_ptr<Layer> layer;
|
||||
std::unique_ptr<bool[]> mask[6];
|
||||
std::unique_ptr<glm::u8vec4[]> rgb[6] = SIXPLETTE(0);
|
||||
bool dirty[6] = SIXPLETTE(false);
|
||||
std::array<bool, 6> dirty = SIXPLETTE(false);
|
||||
glm::vec4 bb[6];
|
||||
void apply();
|
||||
};
|
||||
|
||||
@@ -16,8 +16,8 @@ public:
|
||||
~Layer() { LOG("LAYER AUTO DESTROY"); destroy(); }
|
||||
uint32_t id;
|
||||
RTT m_rtt[6];
|
||||
glm::vec4 m_dirty_box[6] = SIXPLETTE(glm::vec4(0));
|
||||
bool m_dirty_face[6] = SIXPLETTE(false);
|
||||
std::array<glm::vec4, 6> m_dirty_box = SIXPLETTE(glm::vec4(0));
|
||||
std::array<bool, 6> m_dirty_face = SIXPLETTE(false);
|
||||
bool m_visible = true;
|
||||
bool m_alpha_locked = false;
|
||||
float m_opacity = 1.f;
|
||||
@@ -29,8 +29,8 @@ public:
|
||||
struct Snapshot
|
||||
{
|
||||
std::unique_ptr<uint8_t[]> image[6] = SIXPLETTE(0);
|
||||
glm::vec4 m_dirty_box[6] = SIXPLETTE(glm::vec4(0));
|
||||
bool m_dirty_face[6] = SIXPLETTE(false);
|
||||
std::array<glm::vec4, 6> m_dirty_box = SIXPLETTE(glm::vec4(0));
|
||||
std::array<bool, 6> m_dirty_face = SIXPLETTE(false);
|
||||
int width = 0;
|
||||
int height = 0;
|
||||
void create(int w, int h);
|
||||
@@ -41,7 +41,7 @@ public:
|
||||
void resize(int width, int height);
|
||||
bool create(int width, int height, std::string name);
|
||||
void clear(const glm::vec4& c);
|
||||
Snapshot snapshot(glm::vec4 dirty_box[6] = nullptr, bool dirty_face[6] = nullptr);
|
||||
Snapshot snapshot(std::array<glm::vec4, 6>* dirty_box = nullptr, std::array<bool, 6>* dirty_face = nullptr);
|
||||
void restore(const Snapshot& snap);
|
||||
void destroy();
|
||||
void optimize();
|
||||
|
||||
@@ -1565,6 +1565,8 @@ void CanvasModeFloodFill::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
||||
{
|
||||
std::shared_ptr<Layer> m_layer;
|
||||
std::shared_ptr<Layer::Snapshot> m_snap;
|
||||
std::array<bool, 6> m_dirty_face = SIXPLETTE(false);
|
||||
std::array<glm::vec4, 6> m_dirty_box = SIXPLETTE(glm::vec4(0));
|
||||
glm::ivec2 m_pos;
|
||||
glm::vec4 m_color;
|
||||
float m_threshold;
|
||||
@@ -1583,6 +1585,8 @@ void CanvasModeFloodFill::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
||||
a->m_layer_index = m_layer_index;
|
||||
a->m_threshold = m_threshold;
|
||||
a->m_plane = m_plane;
|
||||
a->m_dirty_box = m_dirty_box;
|
||||
a->m_dirty_face = m_dirty_face;
|
||||
return a;
|
||||
}
|
||||
virtual void undo() override
|
||||
@@ -1625,6 +1629,8 @@ void CanvasModeFloodFill::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
||||
a->m_layer_index = Canvas::I->m_current_layer_idx;
|
||||
a->m_threshold = m_tool->get_threshold();
|
||||
a->m_plane = plane;
|
||||
a->m_dirty_box = plane_data.layer->m_dirty_box;
|
||||
a->m_dirty_face = plane_data.layer->m_dirty_face;
|
||||
ActionManager::add(a);
|
||||
|
||||
plane_data.apply();
|
||||
|
||||
@@ -400,7 +400,7 @@ void NodePanelLayer::merge(int src_index, int dst_index, bool create_history)
|
||||
}
|
||||
a->m_snap = std::make_shared<Layer::Snapshot>();
|
||||
*a->m_snap = Canvas::I->m_layers[dst_index]->snapshot(
|
||||
Canvas::I->m_layers[src_index]->m_dirty_box, Canvas::I->m_layers[src_index]->m_dirty_face);
|
||||
&Canvas::I->m_layers[src_index]->m_dirty_box, &Canvas::I->m_layers[src_index]->m_dirty_face);
|
||||
a->m_layer = Canvas::I->m_layers[src_index];
|
||||
a->m_layer_node = std::static_pointer_cast<NodeLayer>(m_layers_container->m_children[src_index]);
|
||||
a->m_layer_node->m_selected = false;
|
||||
|
||||
Reference in New Issue
Block a user