Files
panopainter/src/canvas_modes.h

199 lines
5.9 KiB
C++

#pragma once
#include "event.h"
#include "shape.h"
#include "brush.h"
#include "texture.h"
#include <poly2tri.h>
class Canvas;
struct CameraData
{
glm::mat4 m_mv{ 1 };
glm::mat4 m_proj{ 1 };
glm::vec4 m_box{ 0 };
glm::vec4 m_vp{ 0 };
glm::vec2 m_pan{ 0 };
glm::mat4 m_plane_unproject[6] = SIXPLETTE(glm::mat4(1));
glm::vec3 m_plane_dir[6] = SIXPLETTE(glm::vec3(0));
};
class CanvasMode
{
public:
static class NodeCanvas* node;
static 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() {}
CanvasMode() = default;
virtual ~CanvasMode() = default;
};
class CanvasModeBasicCamera : public CanvasMode
{
bool m_draggingR = false;
bool m_draggingT = false; // touch drag
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
{
friend class App;
bool m_draw_tip = false;
bool m_dragging = false;
glm::vec2 m_pan_start;
glm::vec2 m_cur_pos;
glm::vec2 m_size_pos_start;
float m_size_value_start;
float m_camera_fov;
float m_zoom_canvas = 1.f;
float m_zoom_start;
bool m_valid_brush = false;
Brush m_brush;
// resizing the tip
bool m_resizing = false;
public:
CanvasModePen() = default;
virtual void on_GestureEvent(GestureEvent* ge) 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 enter() override;
virtual void leave() override;
bool m_picking = false;
};
class CanvasModeLine : public CanvasMode
{
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
{
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<ray_t> 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
{
DynamicShape m_shape;
bool m_dragging = false;
std::vector<vertex_t> m_points;
std::map<int, int> 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;
};
class CanvasModeMaskFree : public CanvasMode
{
friend class CanvasModeTransform;
DynamicShape m_shape;
bool m_dragging = false;
std::vector<vertex_t> m_points;
std::vector<glm::vec2> m_points2d;
CameraData m_selection_cam;
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;
void clear();
};
class CanvasModeMaskLine : public CanvasMode
{
DynamicShape m_shape;
bool m_dragging = false;
std::vector<vertex_t> m_points;
std::vector<glm::vec2> m_points2d;
std::map<int, int> m_dirty_planes;
bool m_active_tool = false;
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 enter() override;
virtual void leave() override;
};
class CanvasModeTransform : public CanvasMode
{
DynamicShape m_shape[6]{};
Sphere m_sphere{};
Circle m_circle{};
Texture2D m_tex[6]{};
glm::vec3 m_origin{0, 0, 1 };
std::vector<glm::vec3> corners{};
std::vector<glm::vec2> corners2d{};
int corner_hl = -1;
glm::vec3 m_center_point{};
glm::vec2 m_center_point_uv{};
glm::mat4 m_xform{1};
glm::mat4 m_xform_local{1};
int m_counter = 0;
bool m_dragging = false;
int m_drag_corner = -1;
float m_drag_diag = 0;
std::vector<glm::vec2> m_drag_corners2d{};
glm::vec2 m_drag_start{};
glm::mat4 m_drag_xform{1};
glm::mat4 m_drag_xform_local{1};
std::vector<vertex_t> m_points{};
std::vector<glm::vec2> m_points2d{};
std::vector<vertex_t> m_points_face[6];
std::map<int, int> m_dirty_planes{};
bool m_active_tool = false;
public:
enum class ActionType : uint8_t { Copy, Cut, Import };
ActionType m_action;
Image m_source_image;
CanvasModeTransform() = default;
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 enter() override;
virtual void leave() override;
};