SpiecsEngine
 
Loading...
Searching...
No Matches
TransformComponent.cpp
Go to the documentation of this file.
1/**
2* @file TransformComponent.cpp.
3* @brief The TransformComponent Class Implementation.
4* @author Spices.
5*/
6
7#include "Pchheader.h"
9
10#include "Render/Vulkan/VulkanBuffer.h"
11#include "Render/Vulkan/VulkanRenderBackend.h"
12
13#define GLM_ENABLE_EXPERIMENTAL
14#include <glm/gtx/quaternion.hpp>
15#include <glm/gtc/type_ptr.hpp>
16
17#include <imgui_internal.h>
18
19#include "Render/FrameInfo.h"
20#include "World/World/World.h"
21
22namespace Spices {
23
26 {
28
29 m_ModelBuffer = std::make_shared<VulkanBuffer>(
30 VulkanRenderBackend::GetState(),
31 "ModelBuffer",
32 sizeof(glm::mat4),
33 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT ,
34 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
35 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
36 );
37
38 SetPosition({ 0.0f, 0.0f, 0.0f });
39 SetRotation({ 0.0f, 0.0f, 0.0f });
40 SetScale({ 1.0f, 1.0f, 1.0f });
41 }
42
44 {
45
46 }
47
49 {
50
51 }
52
54 {
56
57 ImGui::Spacing();
58
59 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{ 0, 3.0f });
60
61 /**
62 * @brief colume_0 width.
63 */
64 const float columeWidth = ImGuiH::GetLineItemSize().x * 5.0f;
65
66 /**
67 * @brief drag float width, 3 * drag float + 6 * buttom + colume_0 = ImGui::GetContentRegionAvail().
68 */
69 const float itemWidth = (ImGui::GetContentRegionAvail().x - 11.0f * ImGuiH::GetLineItemSize().x) / 3.0f;
70
71 {
72 SPICES_PROFILE_ZONEN("TransformComponent Translate");
73
74 ImGui::PushID("TransformComponent Translate");
75
76 ImGui::Columns(2, 0, false);
77 ImGui::SetColumnWidth(0, columeWidth);
78
79 {
80 SPICES_PROFILE_ZONEN("TransformComponent Translate table");
81
82 static bool selected = false;
83 if (ImGui::Selectable("Translate", selected)) selected = !selected;
84 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(4.0f, 4.0f));
85 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(6.0f, 6.0f));
86 if (ImGui::BeginPopupContextItem()) // <-- use last item id as popup id
87 {
88 ImGui::MenuItem("Copy");
89 ImGui::MenuItem("Paste");
90 ImGui::MenuItem("Copy Property Path");
91 ImGui::Separator();
92 ImGui::MenuItem("Disable");
93 ImGui::MenuItem("Delete");
94 ImGui::Separator();
95 ImGui::MenuItem("Set Key");
96 ImGui::MenuItem("Remove Key");
97 ImGui::MenuItem("Copy Key");
98 ImGui::MenuItem("Paste Key");
99 ImGui::Separator();
100 ImGui::MenuItem("Copy Animation");
101 ImGui::MenuItem("Paste Animation");
102 ImGui::MenuItem("Remove Animation");
103 ImGui::Separator();
104 if (ImGui::BeginMenu("Locks"))
105 {
106 ImGui::MenuItem("Lock");
107 ImGui::MenuItem("UnLock");
108
109 ImGui::EndMenu();
110 }
111
112 ImGui::EndPopup();
113 }
114 ImGui::SetItemTooltip("xformOp:translate(float3)\nRight click it to disable or delete it.");
115 ImGui::PopStyleVar(2);
116 }
117
118 ImGui::NextColumn();
119
120 {
121 SPICES_PROFILE_ZONEN("TransformComponent Translate X");
122 ImGui::PushID("TransformComponent Translate X");
123
124 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.8f, 0.1f, 0.15f, 1.0f });
125 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.9f, 0.2f, 0.2f, 1.0f });
126 ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.8f, 0.1f, 0.15f, 1.0f });
127 ImGui::Button("X", ImGuiH::GetLineItemSize());
128 ImGui::PopStyleColor(3);
129 ImGui::SameLine();
130 ImGui::PushItemWidth(itemWidth);
131 if(ImGui::DragFloat("##X", &m_Transform.position.x, 0.1f, 0.0f, 0.0f, "%.2f"))
132 {
135 }
136 ImGui::PopItemWidth();
137 ImGui::SameLine();
138 if (ImGuiH::DrawResetIcon(m_Transform.position.x != 0.0f))
139 {
140 m_Transform.position.x = 0.0f;
143 }
144 ImGui::SameLine();
145 ImGui::PopID();
146 }
147
148 {
149 SPICES_PROFILE_ZONEN("TransformComponent Translate Y");
150 ImGui::PushID("TransformComponent Translate Y");
151
152 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.2f, 0.7f, 0.2f, 1.0f });
153 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.3f, 0.8f, 0.3f, 1.0f });
154 ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.2f, 0.7f, 0.2f, 1.0f });
155 ImGui::Button("Y", ImGuiH::GetLineItemSize());
156 ImGui::PopStyleColor(3);
157 ImGui::SameLine();
158 ImGui::PushItemWidth(itemWidth);
159 if(ImGui::DragFloat("##Y", &m_Transform.position.y, 0.1f, 0.0f, 0.0f, "%.2f"))
160 {
163 }
164 ImGui::PopItemWidth();
165 ImGui::SameLine();
166 if (ImGuiH::DrawResetIcon(m_Transform.position.y != 0.0f))
167 {
168 m_Transform.position.y = 0.0f;
171 }
172 ImGui::SameLine();
173 ImGui::PopID();
174 }
175
176 {
177 SPICES_PROFILE_ZONEN("TransformComponent Translate Z");
178 ImGui::PushID("TransformComponent Translate Z");
179
180 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.1f, 0.25f, 0.8f, 1.0f });
181 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.2f, 0.35f, 0.9f, 1.0f });
182 ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.1f, 0.25f, 0.8f, 1.0f });
183 ImGui::Button("Z", ImGuiH::GetLineItemSize());
184 ImGui::PopStyleColor(3);
185 ImGui::SameLine();
186 ImGui::PushItemWidth(itemWidth);
187 if(ImGui::DragFloat("##Z", &m_Transform.position.z, 0.1f, 0.0f, 0.0f, "%.2f"))
188 {
191 }
192 ImGui::PopItemWidth();
193 ImGui::SameLine();
194 if (ImGuiH::DrawResetIcon(m_Transform.position.z != 0.0f))
195 {
196 m_Transform.position.z = 0.0f;
199 }
200 ImGui::PopID();
201 }
202
203 ImGui::Columns(1);
204 ImGui::PopID();
205 }
206
207 {
208 SPICES_PROFILE_ZONEN("TransformComponent Rotate");
209
210 ImGui::PushID("TransformComponent Rotate");
211
212 ImGui::Columns(2, 0, false);
213 ImGui::SetColumnWidth(0, columeWidth);
214 /*if (ImGui::BeginMenu("Rotate"))
215 {
216 ImGui::MenuItem(ICON_TEXT(ICON_EMPTY, XYZ));
217 ImGui::MenuItem(ICON_TEXT(ICON_EMPTY, XZY));
218 ImGui::MenuItem(ICON_TEXT(ICON_EMPTY, YXZ));
219 ImGui::MenuItem(ICON_TEXT(ICON_EMPTY, YZX));
220 ImGui::MenuItem(ICON_TEXT(ICON_EMPTY, ZXY));
221 ImGui::MenuItem(ICON_TEXT(ICON_EMPTY, ZYX));
222
223 ImGui::EndMenu();
224 }*/
225
226 {
227 SPICES_PROFILE_ZONEN("TransformComponent Rotate table");
228
229 static bool selected = false;
230 if (ImGui::Selectable("Rotate", selected)) selected = !selected;
231 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(4.0f, 4.0f));
232 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(6.0f, 6.0f));
233 if (ImGui::BeginPopupContextItem()) // <-- use last item id as popup id
234 {
235 ImGui::MenuItem("Copy");
236 ImGui::MenuItem("Paste");
237 ImGui::MenuItem("Copy Property Path");
238 ImGui::Separator();
239 ImGui::MenuItem("Disable");
240 ImGui::MenuItem("Delete");
241 ImGui::Separator();
242 ImGui::MenuItem("Set Key");
243 ImGui::MenuItem("Remove Key");
244 ImGui::MenuItem("Copy Key");
245 ImGui::MenuItem("Paste Key");
246 ImGui::Separator();
247 ImGui::MenuItem("Copy Animation");
248 ImGui::MenuItem("Paste Animation");
249 ImGui::MenuItem("Remove Animation");
250 ImGui::Separator();
251 if (ImGui::BeginMenu("Locks"))
252 {
253 ImGui::MenuItem("Lock");
254 ImGui::MenuItem("UnLock");
255
256 ImGui::EndMenu();
257 }
258
259 ImGui::EndPopup();
260 }
261 ImGui::SetItemTooltip("xformOp:rotateXYZ(float3)\nRight click it to disable or delete it.\nLeft click it to change the rotate order, default is XYZ.");
262 ImGui::PopStyleVar(2);
263 }
264
265 ImGui::NextColumn();
266
267 {
268 SPICES_PROFILE_ZONEN("TransformComponent Rotate X");
269 ImGui::PushID("TransformComponent Rotate X");
270
271 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.8f, 0.1f, 0.15f, 1.0f });
272 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.9f, 0.2f, 0.2f, 1.0f });
273 ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.8f, 0.1f, 0.15f, 1.0f });
274 ImGui::Button("X", ImGuiH::GetLineItemSize());
275 ImGui::PopStyleColor(3);
276 ImGui::SameLine();
277 ImGui::PushItemWidth(itemWidth);
278 if(ImGui::DragFloat("##X", &m_Transform.rotation.x, 0.1f, 0.0f, 0.0f, "%.2f"))
279 {
282 }
283 ImGui::PopItemWidth();
284 ImGui::SameLine();
285 if (ImGuiH::DrawResetIcon(m_Transform.rotation.x != 0.0f))
286 {
287 m_Transform.rotation.x = 0.0f;
290 }
291 ImGui::SameLine();
292 ImGui::PopID();
293 }
294
295 {
296 SPICES_PROFILE_ZONEN("TransformComponent Rotate Y");
297 ImGui::PushID("TransformComponent Rotate Y");
298
299 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.2f, 0.7f, 0.2f, 1.0f });
300 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.3f, 0.8f, 0.3f, 1.0f });
301 ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.2f, 0.7f, 0.2f, 1.0f });
302 ImGui::Button("Y", ImGuiH::GetLineItemSize());
303 ImGui::PopStyleColor(3);
304 ImGui::SameLine();
305 ImGui::PushItemWidth(itemWidth);
306 if(ImGui::DragFloat("##Y", &m_Transform.rotation.y, 0.1f, 0.0f, 0.0f, "%.2f"))
307 {
310 }
311 ImGui::PopItemWidth();
312 ImGui::SameLine();
313 if (ImGuiH::DrawResetIcon(m_Transform.rotation.y != 0.0f))
314 {
315 m_Transform.rotation.y = 0.0f;
318 }
319 ImGui::SameLine();
320 ImGui::PopID();
321 }
322
323 {
324 SPICES_PROFILE_ZONEN("TransformComponent Rotate Z");
325 ImGui::PushID("TransformComponent Rotate Z");
326
327 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.1f, 0.25f, 0.8f, 1.0f });
328 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.2f, 0.35f, 0.9f, 1.0f });
329 ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.1f, 0.25f, 0.8f, 1.0f });
330 ImGui::Button("Z", ImGuiH::GetLineItemSize());
331 ImGui::PopStyleColor(3);
332 ImGui::SameLine();
333 ImGui::PushItemWidth(itemWidth);
334 if(ImGui::DragFloat("##Z", &m_Transform.rotation.z, 0.1f, 0.0f, 0.0f, "%.2f"))
335 {
338 }
339 ImGui::PopItemWidth();
340 ImGui::SameLine();
341 if (ImGuiH::DrawResetIcon(m_Transform.rotation.z != 0.0f))
342 {
343 m_Transform.rotation.z = 0.0f;
346 }
347 ImGui::PopID();
348 }
349
350 ImGui::Columns(1);
351 ImGui::PopID();
352 }
353
354 {
355 SPICES_PROFILE_ZONEN("TransformComponent Scale");
356
357 ImGui::PushID("TransformComponent Scale");
358
359 ImGui::Columns(2, 0, false);
360 ImGui::SetColumnWidth(0, columeWidth);
361
362 {
363 SPICES_PROFILE_ZONEN("TransformComponent Scale table");
364
365 static bool selected = false;
366 if (ImGui::Selectable("Scale", selected)) selected = !selected;
367 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(4.0f, 4.0f));
368 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(6.0f, 6.0f));
369 if (ImGui::BeginPopupContextItem()) // <-- use last item id as popup id
370 {
371 ImGui::MenuItem("Copy");
372 ImGui::MenuItem("Paste");
373 ImGui::MenuItem("Copy Property Path");
374 ImGui::Separator();
375 ImGui::MenuItem("Disable");
376 ImGui::MenuItem("Delete");
377 ImGui::Separator();
378 ImGui::MenuItem("Set Key");
379 ImGui::MenuItem("Remove Key");
380 ImGui::MenuItem("Copy Key");
381 ImGui::MenuItem("Paste Key");
382 ImGui::Separator();
383 ImGui::MenuItem("Copy Animation");
384 ImGui::MenuItem("Paste Animation");
385 ImGui::MenuItem("Remove Animation");
386 ImGui::Separator();
387 if (ImGui::BeginMenu("Locks"))
388 {
389 ImGui::MenuItem("Lock");
390 ImGui::MenuItem("UnLock");
391
392 ImGui::EndMenu();
393 }
394
395 ImGui::EndPopup();
396 }
397 ImGui::SetItemTooltip("xformOp:scale(float3)\nRight click it for more options.");
398 ImGui::PopStyleVar(2);
399
400 ImGui::SameLine();
401 ImGui::Button(ICON_MD_LINK, ImGuiH::GetLineItemSize());
402 }
403
404 ImGui::NextColumn();
405
406 {
407 SPICES_PROFILE_ZONEN("TransformComponent Scale X");
408 ImGui::PushID("TransformComponent Scale X");
409
410 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.8f, 0.1f, 0.15f, 1.0f });
411 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.9f, 0.2f, 0.2f, 1.0f });
412 ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.8f, 0.1f, 0.15f, 1.0f });
413 ImGui::Button("X", ImGuiH::GetLineItemSize());
414 ImGui::PopStyleColor(3);
415 ImGui::SameLine();
416 ImGui::PushItemWidth(itemWidth);
417 if(ImGui::DragFloat("##X", &m_Transform.scale.x, 0.1f, 0.0f, 0.0f, "%.2f"))
418 {
421 }
422 ImGui::PopItemWidth();
423 ImGui::SameLine();
424 if (ImGuiH::DrawResetIcon(m_Transform.scale.x != 1.0f))
425 {
426 m_Transform.scale.x = 1.0f;
429 }
430 ImGui::SameLine();
431 ImGui::PopID();
432 }
433
434 {
435 SPICES_PROFILE_ZONEN("TransformComponent Scale Y");
436 ImGui::PushID("TransformComponent Scale Y");
437
438 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.2f, 0.7f, 0.2f, 1.0f });
439 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.3f, 0.8f, 0.3f, 1.0f });
440 ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.2f, 0.7f, 0.2f, 1.0f });
441 ImGui::Button("Y", ImGuiH::GetLineItemSize());
442 ImGui::PopStyleColor(3);
443 ImGui::SameLine();
444 ImGui::PushItemWidth(itemWidth);
445 if(ImGui::DragFloat("##Y", &m_Transform.scale.y, 0.1f, 0.0f, 0.0f, "%.2f"))
446 {
449 }
450 ImGui::PopItemWidth();
451 ImGui::SameLine();
452 if (ImGuiH::DrawResetIcon(m_Transform.scale.y != 1.0f))
453 {
454 m_Transform.scale.y = 1.0f;
457 }
458 ImGui::SameLine();
459 ImGui::PopID();
460 }
461
462 {
463 SPICES_PROFILE_ZONEN("TransformComponent Scale Z");
464 ImGui::PushID("TransformComponent Scale Z");
465
466 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.1f, 0.25f, 0.8f, 1.0f });
467 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.2f, 0.35f, 0.9f, 1.0f });
468 ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.1f, 0.25f, 0.8f, 1.0f });
469 ImGui::Button("Z", ImGuiH::GetLineItemSize());
470 ImGui::PopStyleColor(3);
471 ImGui::SameLine();
472 ImGui::PushItemWidth(itemWidth);
473 if(ImGui::DragFloat("##Z", &m_Transform.scale.z, 0.1f, 0.0f, 0.0f, "%.2f"))
474 {
477 }
478 ImGui::PopItemWidth();
479 ImGui::SameLine();
480 if (ImGuiH::DrawResetIcon(m_Transform.scale.z != 1.0f))
481 {
482 m_Transform.scale.z = 1.0f;
485 }
486 ImGui::PopID();
487 }
488
489 ImGui::Columns(1);
490 ImGui::PopID();
491 }
492
493 ImGui::PopStyleVar();
494 ImGui::Spacing();
495 }
496
498 {
500
501 return Transform::GetRoatationMatrix(m_Transform.rotation);
502 }
503
505 {
507
508 if (m_Marker & flags)
509 {
510 m_Marker ^= flags;
511 }
512 }
513
515 {
517
518 return m_ModelBuffer->GetAddress();
519 }
520
522 {
524
525 m_ModelMatrix = m_Transform.ToMatrix();
526 m_ModelBuffer->WriteToBuffer(glm::value_ptr(m_ModelMatrix));
527 }
528}
#define SPICES_PROFILE_ZONEN(...)
#define SPICES_PROFILE_ZONE
Component()=default
Constructor Function.
Component Class. This class defines the basic behaves of component. When we add an new Component,...
Definition Component.h:27
static FrameInfo & Get()
Get FrameInfo.
Definition FrameInfo.cpp:14
FrameInfo Class. This class defines the FrameInfo data.
Definition FrameInfo.h:32
glm::mat4 GetRotateMatrix() const
Get Rotate Matrix.
void ClearMarkerWithBits(TransformComponentFlags flags)
Clear TransformComponentFlags with flags.
virtual void OnSerialize() override
This interface defines how to serialize.
TransformComponentFlags m_Marker
World State this frame.
virtual void OnDeSerialize() override
This interface defines how to deserialize.
void CalMatrix()
Calculate Model Matrix.
virtual void DrawThis() override
This interface defines how to draw this component to property panel.
TransformComponent()
Constructor Function.
uint64_t GetModelBufferAddress() const
Get Model Buffer Address.
TransformComponent Class. This class defines the specific behaves of TransformComponent.
@ FrushStableFrame
Definition World.h:48
@ NeedUpdateTLAS
Definition World.h:49
World Class. This class defines the basic behaves of World. When we create an new world,...
Definition World.h:41