Unravel Engine C++ Reference
Loading...
Searching...
No Matches
transform_actions.cpp
Go to the documentation of this file.
1#include "transform_actions.h"
2#include "base/basetypes.hpp"
4#include <engine/ecs/scene.h>
5
6namespace unravel
7{
8
9// Transform Move Action Implementation
10transform_move_action_t::transform_move_action_t(entt::handle ent, const math::vec3& old_pos, const math::vec3& new_pos)
11 : entity(entt::make_uhandle(ent)), old_position(old_pos), new_position(new_pos)
12{
13 name = "Position";
14}
15
17{
18 if(auto ent = entity.resolve())
19 {
20 if(auto transform = ent.try_get<transform_component>())
21 {
22 transform->set_position_local(new_position);
23 prefab_override_context::mark_transform_as_changed(ent, true, false, false, false);
24 }
25 }
26}
27
29{
30 if(auto ent = entity.resolve())
31 {
32 if(auto transform = ent.try_get<transform_component>())
33 {
34 transform->set_position_local(old_position);
35 prefab_override_context::mark_transform_as_changed(ent, true, false, false, false);
36 }
37 }
38}
39
41{
42 const auto& prev = static_cast<const transform_move_action_t&>(previous);
43 return entity == prev.entity && name == prev.name;
44}
45
47{
48 const auto& prev = static_cast<const transform_move_action_t&>(previous);
49 old_position = prev.old_position; // Extend the range of the move
50}
51
53{
54 auto ent = entity.resolve();
55 return ent.valid() && ent.try_get<transform_component>();
56}
57
58
60{
62 {"name", "position"},
63 {"pretty_name", "Position"}}
64 );
65 draw_in_inspector_impl(ctx, old_position, new_position, custom);
66}
67
68// Transform Move Global Action Implementation
69transform_move_global_action_t::transform_move_global_action_t(entt::handle ent, const math::vec3& old_pos, const math::vec3& new_pos)
70 : entity(entt::make_uhandle(ent)), old_position(old_pos), new_position(new_pos)
71{
72 name = "Global Position";
73}
74
76{
77 if(auto ent = entity.resolve())
78 {
79 if(auto transform = ent.try_get<transform_component>())
80 {
81 transform->set_position_global(new_position);
83 }
84 }
85}
86
88{
89 if(auto ent = entity.resolve())
90 {
91 if(auto transform = ent.try_get<transform_component>())
92 {
93 transform->set_position_global(old_position);
95 }
96 }
97}
98
100{
101 const auto& prev = static_cast<const transform_move_global_action_t&>(previous);
102 return entity == prev.entity && name == prev.name;
103}
104
106{
107 const auto& prev = static_cast<const transform_move_global_action_t&>(previous);
108 old_position = prev.old_position; // Extend the range of the move
109}
110
112{
113 auto ent = entity.resolve();
114 return ent.valid() && ent.try_get<transform_component>();
115}
116
118{
120 {"name", "global_position"},
121 {"pretty_name", "Global Position"}}
122 );
123 draw_in_inspector_impl(ctx, old_position, new_position, custom);
124}
125
126// Transform Rotate Action Implementation
127transform_rotate_action_t::transform_rotate_action_t(entt::handle ent, const math::quat& old_rot, const math::quat& new_rot)
128 : entity(entt::make_uhandle(ent)), old_rotation(old_rot), new_rotation(new_rot)
129{
130 name = "Rotation";
131}
132
134{
135 if(auto ent = entity.resolve())
136 {
137 if(auto transform = ent.try_get<transform_component>())
138 {
139 transform->set_rotation_local(new_rotation);
140 prefab_override_context::mark_transform_as_changed(ent, false, true, false, false);
141 }
142 }
143}
144
146{
147 if(auto ent = entity.resolve())
148 {
149 if(auto transform = ent.try_get<transform_component>())
150 {
151 transform->set_rotation_local(old_rotation);
152 prefab_override_context::mark_transform_as_changed(ent, false, true, false, false);
153 }
154 }
155}
156
158{
159 const auto& prev = static_cast<const transform_rotate_action_t&>(previous);
160 return entity == prev.entity && name == prev.name;
161}
162
164{
165 const auto& prev = static_cast<const transform_rotate_action_t&>(previous);
166 old_rotation = prev.old_rotation; // Extend the range of the rotation
167}
168
170{
171 auto ent = entity.resolve();
172 return ent.valid() && ent.try_get<transform_component>();
173}
174
176{
178 {"name", "rotation"},
179 {"pretty_name", "Rotation"}}
180 );
181 draw_in_inspector_impl(ctx, old_rotation, new_rotation, custom);
182}
183
184
185// Transform Scale Action Implementation
186transform_scale_action_t::transform_scale_action_t(entt::handle ent, const math::vec3& old_sc, const math::vec3& new_sc)
187 : entity(entt::make_uhandle(ent)), old_scale(old_sc), new_scale(new_sc)
188{
189 name = "Scale";
190}
191
193{
194 if(auto ent = entity.resolve())
195 {
196 if(auto transform = ent.try_get<transform_component>())
197 {
198 transform->set_scale_local(new_scale);
199 prefab_override_context::mark_transform_as_changed(ent, false, false, true, false);
200 }
201 }
202}
203
205{
206 if(auto ent = entity.resolve())
207 {
208 if(auto transform = ent.try_get<transform_component>())
209 {
210 transform->set_scale_local(old_scale);
211 prefab_override_context::mark_transform_as_changed(ent, false, false, true, false);
212 }
213 }
214}
215
217{
218 const auto& prev = static_cast<const transform_scale_action_t&>(previous);
219 return entity == prev.entity && name == prev.name;
220}
221
223{
224 const auto& prev = static_cast<const transform_scale_action_t&>(previous);
225 old_scale = prev.old_scale; // Extend the range of the scale
226}
227
229{
230 auto ent = entity.resolve();
231 return ent.valid() && ent.try_get<transform_component>();
232}
233
235{
237 {"name", "scale"},
238 {"pretty_name", "Scale"}}
239 );
240 draw_in_inspector_impl(ctx, old_scale, new_scale, custom);
241}
242
243
244// Transform Skew Action Implementation
245transform_skew_action_t::transform_skew_action_t(entt::handle ent, const math::vec3& old_sk, const math::vec3& new_sk)
246 : entity(entt::make_uhandle(ent)), old_skew(old_sk), new_skew(new_sk)
247{
248 name = "Skew";
249}
250
252{
253 if(auto ent = entity.resolve())
254 {
255 if(auto transform = ent.try_get<transform_component>())
256 {
257 transform->set_skew_local(new_skew);
258 prefab_override_context::mark_transform_as_changed(ent, false, false, false, true);
259 }
260 }
261}
262
264{
265 if(auto ent = entity.resolve())
266 {
267 if(auto transform = ent.try_get<transform_component>())
268 {
269 transform->set_skew_local(old_skew);
270 prefab_override_context::mark_transform_as_changed(ent, false, false, false, true);
271 }
272 }
273}
274
276{
277 const auto& prev = static_cast<const transform_skew_action_t&>(previous);
278 return entity == prev.entity && name == prev.name;
279}
280
282{
283 const auto& prev = static_cast<const transform_skew_action_t&>(previous);
284 old_skew = prev.old_skew; // Extend the range of the skew
285}
286
288{
289 auto ent = entity.resolve();
290 return ent.valid() && ent.try_get<transform_component>();
291}
292
294{
296 {"name", "skew"},
297 {"pretty_name", "Skew"}}
298 );
299 draw_in_inspector_impl(ctx, old_skew, new_skew, custom);
300}
301
302// Transform Set Parent Action Implementation
303transform_set_parent_action_t::transform_set_parent_action_t(entt::handle ent, entt::handle old_p, entt::handle new_p)
304 : transform_set_parent_action_t(entt::make_uhandle(ent), entt::make_uhandle(old_p), entt::make_uhandle(new_p))
305{
306
307}
308
310 : entity(ent), old_parent(old_p), new_parent(new_p)
311{
312 if(new_p.resolve().valid())
313 {
314 name = "Set Parent";
315 }
316 else
317 {
318 name = "Remove Parent";
319 }
320}
321
323{
324 if(auto ent = entity.resolve())
325 {
326 if(auto transform = ent.try_get<transform_component>())
327 {
328 transform->set_parent(new_parent.resolve(), true);
329 prefab_override_context::mark_transform_as_changed(ent, true, true, true, true);
330 }
331 }
332}
333
335{
336 if(auto ent = entity.resolve())
337 {
338 if(auto transform = ent.try_get<transform_component>())
339 {
340 transform->set_parent(old_parent.resolve(), true);
341 prefab_override_context::mark_transform_as_changed(ent, true, true, true, true);
342 }
343 }
344}
345
347{
348 return false;
349}
350
352
354{
355 auto ent = entity.resolve();
356 return ent.valid() && ent.try_get<transform_component>();
357}
358
360{
362 {"name", "parent"},
363 {"pretty_name", "Parent"}});
364 draw_in_inspector_impl(ctx, entt::meta_any{std::in_place_type<entt::handle>, old_parent.resolve()},
365 entt::meta_any{std::in_place_type<entt::handle>, new_parent.resolve()}, custom);
366}
367
368} // namespace unravel
Component that handles transformations (position, rotation, scale, etc.) in the ACE framework.
std::string name
Definition hub.cpp:33
std::map< std::string, meta_any > attributes
Definition reflection.h:18
auto make_custom(Args &&...args) -> entt::meta_custom
Definition reflection.h:97
entt::handle entity
math::vec3 new_position
auto resolve() const -> entt::handle
Definition scene.cpp:486
static void mark_transform_global_as_changed(entt::handle entity, bool position, bool rotation, bool scale, bool skew)
static void mark_transform_as_changed(entt::handle entity, bool position, bool rotation, bool scale, bool skew)
Marks transform properties as changed in prefab override system.
auto is_valid() const -> bool override
void draw_in_inspector(rtti::context &ctx) override
transform_move_action_t(entt::handle ent, const math::vec3 &old_pos, const math::vec3 &new_pos)
void merge_with(const editing_action_t &previous) override
auto is_mergeable(const editing_action_t &previous) const -> bool override
transform_move_global_action_t(entt::handle ent, const math::vec3 &old_pos, const math::vec3 &new_pos)
void draw_in_inspector(rtti::context &ctx) override
auto is_mergeable(const editing_action_t &previous) const -> bool override
void merge_with(const editing_action_t &previous) override
auto is_mergeable(const editing_action_t &previous) const -> bool override
transform_rotate_action_t(entt::handle ent, const math::quat &old_rot, const math::quat &new_rot)
void merge_with(const editing_action_t &previous) override
auto is_valid() const -> bool override
void draw_in_inspector(rtti::context &ctx) override
void draw_in_inspector(rtti::context &ctx) override
auto is_mergeable(const editing_action_t &previous) const -> bool override
transform_scale_action_t(entt::handle ent, const math::vec3 &old_sc, const math::vec3 &new_sc)
void merge_with(const editing_action_t &previous) override
auto is_valid() const -> bool override
void draw_in_inspector(rtti::context &ctx) override
auto is_mergeable(const editing_action_t &previous) const -> bool override
transform_set_parent_action_t(entt::handle ent, entt::handle old_p, entt::handle new_p)
void merge_with(const editing_action_t &previous) override
auto is_valid() const -> bool override
auto is_mergeable(const editing_action_t &previous) const -> bool override
auto is_valid() const -> bool override
void draw_in_inspector(rtti::context &ctx) override
void merge_with(const editing_action_t &previous) override
transform_skew_action_t(entt::handle ent, const math::vec3 &old_sk, const math::vec3 &new_sk)