#pragma once #include "event.h" #include "shape.h" #include "brush.h" #include NS_START class Canvas; NS_END class CanvasMode { public: static class NodeCanvas* node; static ui::Canvas* canvas; virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) {} virtual void on_KeyEvent(KeyEvent* ke) {} virtual void on_GestureEvent(GestureEvent* ge) {} virtual void on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) {} virtual void init() {} virtual void enter() {} virtual void leave() {} }; class CanvasModeBasicCamera : public CanvasMode { bool m_draggingR = false; glm::vec2 m_dragR_start; glm::vec2 m_pan_start; float m_camera_fov; float m_zoom_canvas = 1.f; float m_zoom_start; public: virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override; virtual void on_GestureEvent(GestureEvent* ge) override; }; class CanvasModePen : public CanvasMode { bool m_dragging = false; glm::vec2 m_pan_start; glm::vec2 m_cur_pos; float m_camera_fov; float m_zoom_canvas = 1.f; float m_zoom_start; bool m_valid_brush = false; ui::Brush m_brush; 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() override; virtual void leave() override; bool m_picking = false; }; class CanvasModeLine : public CanvasMode { ui::LineSegment m_line; bool m_dragging = false; glm::vec2 m_drag_start; glm::vec2 m_drag_pos; 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 init() override; }; class CanvasModeGrid : public CanvasMode { ui::LineSegment m_line; glm::vec3 origin; glm::vec3 dir; int m_plane_id; bool m_dragging = false; struct ray_t { glm::vec3 o, d; }; std::vector m_lines; 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 init() override; void commit(); void clear(); }; class CanvasModeCamera : public CanvasMode { bool m_dragging = false; glm::vec2 m_drag_start; glm::vec2 m_pos_start; public: virtual void on_MouseEvent(MouseEvent* me, glm::vec2& loc) override; }; class CanvasModeFill : public CanvasMode { ui::DynamicShape m_shape; bool m_dragging = false; std::vector m_points; std::vector m_points2d; std::map m_dirty_planes; 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; std::vector triangulate(const std::vector>& points); };