added camera pan for parallax and improved line drawing with preview line
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#include "canvas_modes.h"
|
||||
#include "layout.h"
|
||||
#include "canvas.h"
|
||||
#include "shader.h"
|
||||
|
||||
NodeCanvas* CanvasMode::node;
|
||||
ui::Canvas* CanvasMode::canvas;
|
||||
@@ -98,19 +99,24 @@ void CanvasModeLine::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
||||
switch (me->m_type)
|
||||
{
|
||||
case kEventType::MouseDownL:
|
||||
if (m_stage == 0)
|
||||
node->mouse_capture();
|
||||
m_dragging = true;
|
||||
m_drag_start = loc;
|
||||
m_drag_pos = loc;
|
||||
break;
|
||||
case kEventType::MouseUpL:
|
||||
node->mouse_release();
|
||||
if (m_dragging)
|
||||
{
|
||||
canvas->stroke_start(loc, 1.f, node->m_brush);
|
||||
node->mouse_capture();
|
||||
m_stage = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
canvas->stroke_update(loc, 1.f);
|
||||
//canvas->stroke_end();
|
||||
node->mouse_release();
|
||||
m_stage = 0;
|
||||
canvas->stroke_start(m_drag_start, 1.f, node->m_brush);
|
||||
canvas->stroke_update(m_drag_pos, 1.f);
|
||||
canvas->stroke_end();
|
||||
}
|
||||
m_dragging = false;
|
||||
break;
|
||||
case kEventType::MouseMove:
|
||||
if (m_dragging)
|
||||
m_drag_pos = loc;
|
||||
break;
|
||||
case kEventType::MouseCancel:
|
||||
node->mouse_release();
|
||||
@@ -119,3 +125,56 @@ void CanvasModeLine::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CanvasModeLine::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera)
|
||||
{
|
||||
if (m_dragging)
|
||||
{
|
||||
ui::ShaderManager::use(ui::kShader::Color);
|
||||
ui::ShaderManager::u_mat4(ui::kShaderUniform::MVP, ortho);
|
||||
ui::ShaderManager::u_vec4(ui::kShaderUniform::Col, node->m_brush.m_tip_color);
|
||||
static glm::vec4 AB[2];
|
||||
AB[0] = { m_drag_start, 0, 1 };
|
||||
AB[1] = { m_drag_pos, 0, 1 };
|
||||
AB[0].y = canvas->m_box.w - AB[0].y - 1; // invert Y
|
||||
AB[1].y = canvas->m_box.w - AB[1].y - 1; // invert Y
|
||||
m_line.update_vertices(AB);
|
||||
m_line.draw_stroke();
|
||||
}
|
||||
}
|
||||
|
||||
void CanvasModeLine::init()
|
||||
{
|
||||
m_line.create();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
void CanvasModeCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
||||
{
|
||||
switch (me->m_type)
|
||||
{
|
||||
case kEventType::MouseDownR:
|
||||
canvas->m_cam_pos = { 0, 0, 0 };
|
||||
break;
|
||||
case kEventType::MouseDownL:
|
||||
m_dragging = true;
|
||||
m_drag_start = me->m_pos;
|
||||
m_pos_start = canvas->m_cam_pos.xy;
|
||||
node->mouse_capture();
|
||||
break;
|
||||
case kEventType::MouseUpL:
|
||||
m_dragging = false;
|
||||
node->mouse_release();
|
||||
break;
|
||||
case kEventType::MouseMove:
|
||||
if (m_dragging)
|
||||
canvas->m_cam_pos.xy = m_pos_start + (me->m_pos - m_drag_start) * glm::vec2(1, -1) * 0.01f;
|
||||
break;
|
||||
case kEventType::MouseCancel:
|
||||
node->mouse_release();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user