fix selection and cursor

This commit is contained in:
2019-03-09 23:07:06 +01:00
parent f0fed897f6
commit 3af923db96
5 changed files with 57 additions and 25 deletions

View File

@@ -175,6 +175,8 @@ public:
bool m_dirty_face[6] = SIXPLETTE(false); bool m_dirty_face[6] = SIXPLETTE(false);
Layer m_smask; // selection mask Layer m_smask; // selection mask
bool m_smask_active = false; bool m_smask_active = false;
// mode 0=none, 1=free, 2=line
int m_smask_mode = 0;
RTT m_tmp[6]; RTT m_tmp[6];
RTT m_tmp_dual[6]; RTT m_tmp_dual[6];
RTT m_mixer; RTT m_mixer;
@@ -213,7 +215,7 @@ public:
auto prev = I->m_current_mode; auto prev = I->m_current_mode;
if (I->m_mode) if (I->m_mode)
for (auto& m : *I->m_mode) for (auto& m : *I->m_mode)
m->leave(); m->leave(mode);
I->m_mode = &modes[(int)mode]; I->m_mode = &modes[(int)mode];
I->m_current_mode = mode; I->m_current_mode = mode;
if (I->m_mode) if (I->m_mode)

View File

@@ -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; *m_brush = *Canvas::I->m_current_brush;
} }
@@ -390,7 +390,7 @@ void CanvasModeLine::enter(kCanvasMode prev)
App::I.brush_update(); App::I.brush_update();
} }
void CanvasModeLine::leave() void CanvasModeLine::leave(kCanvasMode next)
{ {
*m_brush = *Canvas::I->m_current_brush; *m_brush = *Canvas::I->m_current_brush;
} }
@@ -531,10 +531,14 @@ void CanvasModeMaskFree::init()
m_shape.create(); 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)); // 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() void CanvasModeMaskFree::clear()
@@ -570,6 +574,7 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
m_points.push_back(vert); m_points.push_back(vert);
Canvas::I->m_smask.clear({0, 0, 0, 0}); Canvas::I->m_smask.clear({0, 0, 0, 0});
Canvas::I->m_smask_active = true; Canvas::I->m_smask_active = true;
Canvas::I->m_smask_mode = 1;
break; break;
} }
case kEventType::MouseUpL: case kEventType::MouseUpL:
@@ -623,7 +628,7 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
acc += d; acc += d;
oldpos = loc; oldpos = loc;
oldvec = v; oldvec = v;
if (acc > 0.001) // angle change tollerance if (acc > 0.001) // angle change tolerance
{ {
//LOG("d=%f acc=%f", d, acc); //LOG("d=%f acc=%f", d, acc);
acc = 0; acc = 0;
@@ -691,8 +696,18 @@ void CanvasModeMaskLine::init()
m_shape.create(); 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) if (m_points2d.size() > 3)
{ {
std::vector<vertex_t> points; std::vector<vertex_t> points;
@@ -734,11 +749,10 @@ void CanvasModeMaskLine::leave()
void CanvasModeMaskLine::enter(kCanvasMode prev) void CanvasModeMaskLine::enter(kCanvasMode prev)
{ {
m_points2d.clear(); //m_points2d.clear();
m_points.clear(); //m_points.clear();
Canvas::I->m_smask.clear({0, 0, 0, 0}); //Canvas::I->m_smask.clear({0, 0, 0, 0});
Canvas::I->m_smask_active = true; //m_active_tool = true;
m_active_tool = true;
} }
void CanvasModeMaskLine::on_MouseEvent(MouseEvent* me, glm::vec2& loc) 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: 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(); node->mouse_capture();
m_dragging = true; m_dragging = true;
m_points2d.push_back(loc); m_points2d.push_back(loc);
@@ -828,7 +851,7 @@ void CanvasModeFill::init()
m_shape.create(); m_shape.create();
} }
void CanvasModeFill::leave() void CanvasModeFill::leave(kCanvasMode next)
{ {
if (m_points.size() > 2) 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_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); m_circle.create<16>(1.f);
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{
m_shape[i].create(); m_shape[i].create();
m_points_face[i].clear();
}
m_xform = glm::mat4(1); m_xform = glm::mat4(1);
m_xform_local = glm::mat4(1); m_xform_local = glm::mat4(1);
} }
@@ -951,7 +977,6 @@ void CanvasModeTransform::enter(kCanvasMode prev)
{ {
m_shape[i].clear(); m_shape[i].clear();
m_points_face[i].clear(); m_points_face[i].clear();
m_shape[i].clear();
} }
if (m_action == ActionType::Import) if (m_action == ActionType::Import)
@@ -1199,7 +1224,7 @@ void CanvasModeTransform::enter(kCanvasMode prev)
Canvas::I->pop_camera(); Canvas::I->pop_camera();
} }
void CanvasModeTransform::leave() void CanvasModeTransform::leave(kCanvasMode next)
{ {
if (!m_commit_on_leave) if (!m_commit_on_leave)
return; return;

View File

@@ -43,7 +43,7 @@ public:
virtual void on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) {} virtual void on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) {}
virtual void init() {} virtual void init() {}
virtual void enter(kCanvasMode prev) {} virtual void enter(kCanvasMode prev) {}
virtual void leave() {} virtual void leave(kCanvasMode next) {}
CanvasMode() = default; CanvasMode() = default;
virtual ~CanvasMode() = default; virtual ~CanvasMode() = default;
}; };
@@ -84,7 +84,7 @@ public:
virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override; 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 on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) override;
virtual void enter(kCanvasMode prev) override; virtual void enter(kCanvasMode prev) override;
virtual void leave() override; virtual void leave(kCanvasMode next) override;
bool m_picking = false; bool m_picking = false;
glm::vec2 m_cur_pos; glm::vec2 m_cur_pos;
bool m_draw_tip = false; 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 on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) override;
virtual void init() override; virtual void init() override;
virtual void enter(kCanvasMode prev) override; virtual void enter(kCanvasMode prev) override;
virtual void leave() override; virtual void leave(kCanvasMode next) override;
}; };
class CanvasModeGrid : public CanvasMode 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_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 on_MouseEvent(MouseEvent* me, glm::vec2& loc) override;
virtual void init() override; virtual void init() override;
virtual void leave() override; virtual void leave(kCanvasMode next) override;
}; };
class CanvasModeMaskBase : public CanvasMode 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_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 on_MouseEvent(MouseEvent* me, glm::vec2& loc) override;
virtual void init() override; virtual void init() override;
virtual void leave() override; virtual void leave(kCanvasMode next) override;
void clear(); void clear();
}; };
@@ -178,7 +178,7 @@ public:
virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override; virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override;
virtual void init() override; virtual void init() override;
virtual void enter(kCanvasMode prev) override; virtual void enter(kCanvasMode prev) override;
virtual void leave() override; virtual void leave(kCanvasMode next) override;
}; };
class CanvasModeTransform : public CanvasMode class CanvasModeTransform : public CanvasMode
@@ -218,5 +218,5 @@ public:
virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override; virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override;
virtual void init() override;; virtual void init() override;;
virtual void enter(kCanvasMode prev) override; virtual void enter(kCanvasMode prev) override;
virtual void leave() override; virtual void leave(kCanvasMode next) override;
}; };

View File

@@ -131,7 +131,10 @@ void win32_show_cursor(bool visible)
{ {
std::lock_guard<std::mutex> lock(main_task_mutex); std::lock_guard<std::mutex> lock(main_task_mutex);
main_tasklist.emplace_back([=] { main_tasklist.emplace_back([=] {
ShowCursor(visible); if (visible)
while (ShowCursor(true) < 0);
else
while (ShowCursor(false) >= 0);
}); });
} }

View File

@@ -383,7 +383,9 @@ void NodeCanvas::draw()
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
if (m_canvas->m_smask_active || m_canvas->m_current_mode == kCanvasMode::Copy || m_canvas->m_current_mode == kCanvasMode::Cut) if (m_canvas->m_smask_active || m_canvas->m_current_mode == kCanvasMode::Copy || m_canvas->m_current_mode == kCanvasMode::Cut)
{ {
if (m_canvas->m_smask_mode == 1)
m_canvas->modes[(int)kCanvasMode::MaskFree][0]->on_Draw(ortho_proj, proj, camera); 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); m_canvas->modes[(int)kCanvasMode::MaskLine][0]->on_Draw(ortho_proj, proj, camera);
} }