cgv
Loading...
Searching...
No Matches
transformation_gizmo.h
1#pragma once
2
3#include <cgv/math/ray.h>
4#include <cgv_gl/box_render_data.h>
5#include <cgv_gl/cone_render_data.h>
6#include <cgv_gl/rectangle_render_data.h>
7#include <cgv_gl/sphere_render_data.h>
8
9#include "gizmo.h"
10
11#include "lib_begin.h"
12
13namespace cgv {
14namespace app {
15
16class CGV_API transformation_gizmo : public gizmo {
17public:
18 enum class Mode {
19 kTranslation,
20 kRotation,
21 kScale,
22 kModel
23 };
24
26
27 std::string get_type_name() const override { return "transformation_gizmo"; }
28
29 bool init(cgv::render::context&) override;
30
31 void clear(cgv::render::context&) override;
32
33 Mode get_mode() const;
34
35 void set_mode(Mode mode);
36
37 vec3 get_scale() const;
38
39 void set_scale(const vec3& scale);
40
41 std::function<void(GizmoAction, Mode)> on_change;
42
43private:
44 void create_geometry() override;
45
46 void draw_geometry(cgv::render::context& ctx) override;
47
48 bool intersect_bounding_box(const cgv::math::ray3& ray) override;
49
50 bool intersect(const cgv::math::ray3& ray) override;
51
52 bool start_drag(const cgv::math::ray3& ray) override;
53
54 bool drag(const cgv::math::ray3& ray) override;
55
56 void end_drag(const cgv::math::ray3& ray) override;
57
58 std::pair<float, float> ray_ray_closest_approach(const cgv::math::ray3& r0, const cgv::math::ray3& r1) const;
59
60 const float _center_radius = 0.15f;
61 const float _axis_radius = 0.01f;
62 const float _handle_size = 0.1f;
63 const float _plane_size = 0.2f;
64 const size_t _ring_segment_count = 32;
65
66 std::vector<vec2> _ring_points;
67
68 vec3 _scale = { 1.0f };
69
70 Mode _mode = Mode::kTranslation;
71
72 Mode _interaction_mode = Mode::kTranslation;
73 vec3 _drag_start_position = { 0.0f };
74 quat _drag_start_rotation;
75 vec3 _drag_start_scale = { 1.0f };
76
77 cgv::render::box_renderer _box_renderer;
78 cgv::render::cone_renderer _cone_renderer;
79 cgv::render::rectangle_renderer _rectangle_renderer;
80 cgv::render::sphere_renderer _sphere_renderer;
81
86};
87
88}
89}
90
91#include <cgv/config/lib_end.h>
std::string get_type_name() const override
overload to return the type name of this object. By default the type interface is queried over get_ty...
This class defines a template for n-dimensional rays with arbitrary data type defined by origin and d...
Definition ray.h:14
Render data for box geometry with support for the box_renderer.
renderer that supports point splatting
Render data for cone geometry with support for the cone_renderer.
renderer that supports raycasting of cones
base class for all drawables, which is independent of the used rendering API.
Definition context.h:621
Render data for rectangle geometry with support for the rectangle_renderer.
renderer that supports plane rendering
Render data for sphere geometry with support for the sphere_renderer.
renderer that supports splatting of spheres
the cgv namespace
Definition print.h:11