diff --git a/data/layout.xml b/data/layout.xml index 35e2ab6..99eacf1 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -1087,11 +1087,11 @@ Here's a list of what's available in this release. - + diff --git a/src/canvas.cpp b/src/canvas.cpp index f081f06..6f0b06d 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -2143,6 +2143,48 @@ std::vector ui::Canvas::face_to_shape2D(int plane_index) return points; } +void ui::Canvas::push_camera() +{ + m_camera_stack.push(get_camera()); +} + +void ui::Canvas::pop_camera() +{ + if (!m_camera_stack.empty()) + { + set_camera(m_camera_stack.top()); + m_camera_stack.pop(); + } +} + +ui::Canvas::CameraData ui::Canvas::get_camera() +{ + CameraData c; + c.m_box = m_box; + c.m_mv = m_mv; + c.m_pan = m_pan; + std::copy_n(m_plane_dir, 6, c.m_plane_dir); + std::copy_n(m_plane_unproject, 6, c.m_plane_unproject); + c.m_proj = m_proj; + c.m_vp = m_vp; + return c; +} + +void ui::Canvas::set_camera(const ui::Canvas::CameraData& c) +{ + m_box = c.m_box; + m_mv = c.m_mv; + m_pan = c.m_pan; + std::copy_n(c.m_plane_dir, 6, m_plane_dir); + std::copy_n(c.m_plane_unproject, 6, m_plane_unproject); + m_proj = c.m_proj; + m_vp = c.m_vp; +} + +void ui::Canvas::reset_camera() +{ +} + std::vector ui::Canvas::triangulate_simple(const std::vector& vertices) { std::vector ret; diff --git a/src/canvas.h b/src/canvas.h index b98bce2..84b07df 100644 --- a/src/canvas.h +++ b/src/canvas.h @@ -6,6 +6,7 @@ #include "brush.h" #include "action.h" #include "canvas_modes.h" +#include NS_START @@ -100,6 +101,17 @@ struct PPIHeader } }; +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 Canvas { public: @@ -112,6 +124,7 @@ public: bool m_dirty = false; bool m_commit_delayed = false; bool m_dirty_stroke = false; + std::stack m_camera_stack; static Canvas* I; NodeCanvas* m_node = nullptr; @@ -241,6 +254,11 @@ public: void project2Dpoints(std::vector& vertices); glm::vec3 project2Dpoint(glm::vec2 pt); std::vector face_to_shape2D(int plane_index); + void push_camera(); + void pop_camera(); + CameraData get_camera(); + void set_camera(const CameraData& c); + void reset_camera(); }; class ActionStroke : public Action diff --git a/src/canvas_modes.cpp b/src/canvas_modes.cpp index 5ccf348..3021b31 100644 --- a/src/canvas_modes.cpp +++ b/src/canvas_modes.cpp @@ -493,7 +493,7 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc) { if (!m_points.empty()) { - + m_selection_cam = canvas->get_camera(); //m_points2d = poly_intersect(poly_remove_duplicate(m_points2d), canvas->face_to_shape2D(0)); auto drawer = [this](const glm::mat4& camera, const glm::mat4& proj) { //glEnable(GL_BLEND); @@ -910,6 +910,9 @@ void CanvasModeTransform::enter() canvas->m_smask_active = false; auto points = m->m_points2d; + canvas->push_camera(); + canvas->set_camera(m->m_selection_cam); + glm::vec2 bb_min(FLT_MAX); glm::vec2 bb_max(-FLT_MAX); for (auto p2d : points) @@ -1079,6 +1082,8 @@ void CanvasModeTransform::enter() m_source_image.destroy(); } + + canvas->pop_camera(); } void CanvasModeTransform::leave() diff --git a/src/canvas_modes.h b/src/canvas_modes.h index 0fecffe..c9ebd9b 100644 --- a/src/canvas_modes.h +++ b/src/canvas_modes.h @@ -3,11 +3,12 @@ #include "shape.h" #include "brush.h" #include "texture.h" +#include "canvas.h" #include -NS_START -class Canvas; -NS_END +// NS_START +// class Canvas; +// NS_END class CanvasMode { @@ -122,6 +123,7 @@ class CanvasModeMaskFree : public CanvasMode bool m_dragging = false; std::vector m_points; std::vector m_points2d; + struct ui::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;