diff --git a/src/canvas.h b/src/canvas.h index 551b0b5..f1a3a16 100644 --- a/src/canvas.h +++ b/src/canvas.h @@ -175,6 +175,8 @@ public: bool m_dirty_face[6] = SIXPLETTE(false); Layer m_smask; // selection mask bool m_smask_active = false; + // mode 0=none, 1=free, 2=line + int m_smask_mode = 0; RTT m_tmp[6]; RTT m_tmp_dual[6]; RTT m_mixer; @@ -213,7 +215,7 @@ public: auto prev = I->m_current_mode; if (I->m_mode) for (auto& m : *I->m_mode) - m->leave(); + m->leave(mode); I->m_mode = &modes[(int)mode]; I->m_current_mode = mode; if (I->m_mode) diff --git a/src/canvas_modes.cpp b/src/canvas_modes.cpp index bbc1c85..4a366cf 100644 --- a/src/canvas_modes.cpp +++ b/src/canvas_modes.cpp @@ -260,7 +260,7 @@ void CanvasModePen::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const } } -void CanvasModePen::leave() +void CanvasModePen::leave(kCanvasMode next) { *m_brush = *Canvas::I->m_current_brush; } @@ -390,7 +390,7 @@ void CanvasModeLine::enter(kCanvasMode prev) App::I.brush_update(); } -void CanvasModeLine::leave() +void CanvasModeLine::leave(kCanvasMode next) { *m_brush = *Canvas::I->m_current_brush; } @@ -531,10 +531,14 @@ void CanvasModeMaskFree::init() m_shape.create(); } -void CanvasModeMaskFree::leave() +void CanvasModeMaskFree::leave(kCanvasMode next) { // Canvas::I->draw_objects(std::bind(&CanvasModeFill::on_Draw, this, glm::mat4(1), std::placeholders::_1, std::placeholders::_2)); -// m_points.clear(); + if (next != kCanvasMode::Draw && next != kCanvasMode::Erase && next != kCanvasMode::Line) + { + m_points.clear(); + Canvas::I->m_smask_active = false; + } } void CanvasModeMaskFree::clear() @@ -570,6 +574,7 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc) m_points.push_back(vert); Canvas::I->m_smask.clear({0, 0, 0, 0}); Canvas::I->m_smask_active = true; + Canvas::I->m_smask_mode = 1; break; } case kEventType::MouseUpL: @@ -623,7 +628,7 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc) acc += d; oldpos = loc; oldvec = v; - if (acc > 0.001) // angle change tollerance + if (acc > 0.001) // angle change tolerance { //LOG("d=%f acc=%f", d, acc); acc = 0; @@ -691,8 +696,18 @@ void CanvasModeMaskLine::init() m_shape.create(); } -void CanvasModeMaskLine::leave() +void CanvasModeMaskLine::leave(kCanvasMode next) { + if (next != kCanvasMode::Draw && next != kCanvasMode::Erase && next != kCanvasMode::Line) + { + m_points2d.clear(); + m_active_tool = false; + Canvas::I->m_smask_active = false; + } + + if (!m_active_tool) + return; + if (m_points2d.size() > 3) { std::vector points; @@ -734,11 +749,10 @@ void CanvasModeMaskLine::leave() void CanvasModeMaskLine::enter(kCanvasMode prev) { - m_points2d.clear(); - m_points.clear(); - Canvas::I->m_smask.clear({0, 0, 0, 0}); - Canvas::I->m_smask_active = true; - m_active_tool = true; + //m_points2d.clear(); + //m_points.clear(); + //Canvas::I->m_smask.clear({0, 0, 0, 0}); + //m_active_tool = true; } void CanvasModeMaskLine::on_MouseEvent(MouseEvent* me, glm::vec2& loc) @@ -749,6 +763,15 @@ void CanvasModeMaskLine::on_MouseEvent(MouseEvent* me, glm::vec2& loc) { case kEventType::MouseDownL: { + if (m_active_tool == false) + { + m_active_tool = true; + m_points2d.clear(); + m_points.clear(); + Canvas::I->m_smask.clear({ 0, 0, 0, 0 }); + Canvas::I->m_smask_active = true; + Canvas::I->m_smask_mode = 2; + } node->mouse_capture(); m_dragging = true; m_points2d.push_back(loc); @@ -828,7 +851,7 @@ void CanvasModeFill::init() m_shape.create(); } -void CanvasModeFill::leave() +void CanvasModeFill::leave(kCanvasMode next) { if (m_points.size() > 2) { @@ -939,7 +962,10 @@ void CanvasModeTransform::init() m_sphere.create(1.f, glm::radians(-10.f), glm::radians(10.f), glm::radians(-10.f), glm::radians(10.f), 1.f); m_circle.create<16>(1.f); for (int i = 0; i < 6; i++) + { m_shape[i].create(); + m_points_face[i].clear(); + } m_xform = glm::mat4(1); m_xform_local = glm::mat4(1); } @@ -951,7 +977,6 @@ void CanvasModeTransform::enter(kCanvasMode prev) { m_shape[i].clear(); m_points_face[i].clear(); - m_shape[i].clear(); } if (m_action == ActionType::Import) @@ -1199,7 +1224,7 @@ void CanvasModeTransform::enter(kCanvasMode prev) Canvas::I->pop_camera(); } -void CanvasModeTransform::leave() +void CanvasModeTransform::leave(kCanvasMode next) { if (!m_commit_on_leave) return; diff --git a/src/canvas_modes.h b/src/canvas_modes.h index 08dfe2b..d0d7916 100644 --- a/src/canvas_modes.h +++ b/src/canvas_modes.h @@ -43,7 +43,7 @@ public: virtual void on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) {} virtual void init() {} virtual void enter(kCanvasMode prev) {} - virtual void leave() {} + virtual void leave(kCanvasMode next) {} CanvasMode() = default; virtual ~CanvasMode() = default; }; @@ -84,7 +84,7 @@ public: virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override; virtual void on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) override; virtual void enter(kCanvasMode prev) override; - virtual void leave() override; + virtual void leave(kCanvasMode next) override; bool m_picking = false; glm::vec2 m_cur_pos; bool m_draw_tip = false; @@ -105,7 +105,7 @@ public: virtual void on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) override; virtual void init() override; virtual void enter(kCanvasMode prev) override; - virtual void leave() override; + virtual void leave(kCanvasMode next) override; }; class CanvasModeGrid : public CanvasMode @@ -144,7 +144,7 @@ public: virtual void on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) override; virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override; virtual void init() override; - virtual void leave() override; + virtual void leave(kCanvasMode next) override; }; class CanvasModeMaskBase : public CanvasMode @@ -165,7 +165,7 @@ public: virtual void on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) override; virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override; virtual void init() override; - virtual void leave() override; + virtual void leave(kCanvasMode next) override; void clear(); }; @@ -178,7 +178,7 @@ public: virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override; virtual void init() override; virtual void enter(kCanvasMode prev) override; - virtual void leave() override; + virtual void leave(kCanvasMode next) override; }; class CanvasModeTransform : public CanvasMode @@ -218,5 +218,5 @@ public: virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override; virtual void init() override;; virtual void enter(kCanvasMode prev) override; - virtual void leave() override; + virtual void leave(kCanvasMode next) override; }; diff --git a/src/main.cpp b/src/main.cpp index 6e95ba2..fc06e9a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -131,7 +131,10 @@ void win32_show_cursor(bool visible) { std::lock_guard lock(main_task_mutex); main_tasklist.emplace_back([=] { - ShowCursor(visible); + if (visible) + while (ShowCursor(true) < 0); + else + while (ShowCursor(false) >= 0); }); } diff --git a/src/node_canvas.cpp b/src/node_canvas.cpp index 2e8a691..d15a009 100644 --- a/src/node_canvas.cpp +++ b/src/node_canvas.cpp @@ -383,8 +383,10 @@ void NodeCanvas::draw() glDisable(GL_DEPTH_TEST); if (m_canvas->m_smask_active || m_canvas->m_current_mode == kCanvasMode::Copy || m_canvas->m_current_mode == kCanvasMode::Cut) { - m_canvas->modes[(int)kCanvasMode::MaskFree][0]->on_Draw(ortho_proj, proj, camera); - m_canvas->modes[(int)kCanvasMode::MaskLine][0]->on_Draw(ortho_proj, proj, camera); + if (m_canvas->m_smask_mode == 1) + m_canvas->modes[(int)kCanvasMode::MaskFree][0]->on_Draw(ortho_proj, proj, camera); + else if (m_canvas->m_smask_mode == 2) + m_canvas->modes[(int)kCanvasMode::MaskLine][0]->on_Draw(ortho_proj, proj, camera); } // keep drawing the grids