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