EditorGeomNodesMeshComponent.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include "EditorGeomNodesMeshComponent.h"
  2. #include <AzCore/Serialization/EditContext.h>
  3. #include <Editor/Rendering/GNMeshData.h>
  4. #include <AzCore/Debug/Profiler.h>
  5. #include <AzCore/Component/NonUniformScaleBus.h>
  6. #include <Editor/Rendering/GNRenderMesh.h>
  7. namespace GeomNodes
  8. {
  9. EditorGeomNodesMeshComponent::EditorGeomNodesMeshComponent()
  10. {
  11. }
  12. EditorGeomNodesMeshComponent::~EditorGeomNodesMeshComponent()
  13. {
  14. }
  15. void EditorGeomNodesMeshComponent::Reflect(AZ::ReflectContext* context)
  16. {
  17. if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  18. {
  19. serializeContext->Class<EditorGeomNodesMeshComponent, EditorComponentBase>()
  20. ->Version(1);
  21. AZ::EditContext* ec = serializeContext->GetEditContext();
  22. if (ec)
  23. {
  24. ec->Class<EditorGeomNodesMeshComponent>(
  25. "Geometry Node Mesh",
  26. "The Geometry Node Mesh component is equivalent to a normal Mesh component but the model data comes from blender. ")
  27. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  28. ->Attribute(AZ::Edit::Attributes::Category, "Blender")
  29. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
  30. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("UI", 0x27ff46b0))
  31. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Level", 0x9aeacc13))
  32. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Layer", 0xe4db211a))
  33. ->Attribute(AZ::Edit::Attributes::AutoExpand, true);
  34. }
  35. }
  36. }
  37. void EditorGeomNodesMeshComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
  38. {
  39. dependent.push_back(AZ_CRC("TransformService", 0x8ee22c50));
  40. }
  41. void EditorGeomNodesMeshComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  42. {
  43. provided.push_back(AZ_CRC_CE("EditorGeomNodesMeshService"));
  44. provided.push_back(AZ_CRC_CE("MaterialConsumerService"));
  45. }
  46. void EditorGeomNodesMeshComponent::GetIncompatibleServices(
  47. [[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  48. {
  49. incompatible.push_back(AZ_CRC("EditorGeomNodesMeshService"));
  50. }
  51. void EditorGeomNodesMeshComponent::Init()
  52. {
  53. if (m_renderMesh)
  54. {
  55. return;
  56. }
  57. m_entityId = GetEntityId();
  58. m_renderMesh = AZStd::make_unique<GNRenderMesh>(m_entityId);
  59. }
  60. void EditorGeomNodesMeshComponent::Activate()
  61. {
  62. AzToolsFramework::Components::EditorComponentBase::Activate();
  63. AZ::TransformNotificationBus::Handler::BusConnect(m_entityId);
  64. EditorGeomNodesMeshComponentEventBus::Handler::BusConnect(m_entityId);
  65. AZ::TransformBus::EventResult(m_parentId, m_entityId, &AZ::TransformBus::Events::GetParentId);
  66. m_worldFromLocal = AZ::Transform::CreateIdentity();
  67. AZ::TransformBus::EventResult(m_worldFromLocal, m_entityId, &AZ::TransformBus::Events::GetWorldTM);
  68. }
  69. void EditorGeomNodesMeshComponent::Deactivate()
  70. {
  71. AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusDisconnect();
  72. AzFramework::BoundsRequestBus::Handler::BusDisconnect();
  73. EditorGeomNodesMeshComponentEventBus::Handler::BusDisconnect();
  74. AZ::TransformNotificationBus::Handler::BusDisconnect();
  75. AzToolsFramework::Components::EditorComponentBase::Deactivate();
  76. m_renderMesh.reset();
  77. }
  78. AZ::Aabb EditorGeomNodesMeshComponent::GetEditorSelectionBoundsViewport([[maybe_unused]] const AzFramework::ViewportInfo& viewportInfo)
  79. {
  80. return GetWorldBounds();
  81. }
  82. bool EditorGeomNodesMeshComponent::EditorSelectionIntersectRayViewport(const AzFramework::ViewportInfo& /*viewportInfo*/, const AZ::Vector3& src, const AZ::Vector3& dir, float& distance)
  83. {
  84. AZ_PROFILE_FUNCTION(AzToolsFramework);
  85. if (!m_renderMesh->GetModel())
  86. {
  87. return false;
  88. }
  89. AZ::Transform transform = AZ::Transform::CreateIdentity();
  90. AZ::TransformBus::EventResult(transform, GetEntityId(), &AZ::TransformBus::Events::GetWorldTM);
  91. AZ::Vector3 nonUniformScale = AZ::Vector3::CreateOne();
  92. AZ::NonUniformScaleRequestBus::EventResult(nonUniformScale, m_entityId, &AZ::NonUniformScaleRequests::GetScale);
  93. float t;
  94. AZ::Vector3 ignoreNormal;
  95. constexpr float rayLength = 1000.0f;
  96. if (m_renderMesh->GetModel()->RayIntersection(transform, nonUniformScale, src, dir * rayLength, t, ignoreNormal))
  97. {
  98. distance = rayLength * t;
  99. return true;
  100. }
  101. return false;
  102. }
  103. bool EditorGeomNodesMeshComponent::SupportsEditorRayIntersect()
  104. {
  105. return true;
  106. }
  107. AZ::Aabb EditorGeomNodesMeshComponent::GetWorldBounds()
  108. {
  109. AZ_PROFILE_FUNCTION(GeomNodes);
  110. if (!m_worldAabb.has_value())
  111. {
  112. m_worldAabb = GetLocalBounds();
  113. m_worldAabb->ApplyTransform(m_worldFromLocal);
  114. }
  115. return m_worldAabb.value();
  116. }
  117. AZ::Aabb EditorGeomNodesMeshComponent::GetLocalBounds()
  118. {
  119. AZ_PROFILE_FUNCTION(GeomNodes);
  120. if (!m_localAabb.has_value() && m_meshData.VertexCount() > 0)
  121. {
  122. m_localAabb = m_meshData.GetAabb();
  123. }
  124. return m_localAabb.value();
  125. }
  126. void EditorGeomNodesMeshComponent::OnTransformChanged([[maybe_unused]] const AZ::Transform& local, const AZ::Transform& world)
  127. {
  128. AZ_PROFILE_FUNCTION(GeomNodes);
  129. m_worldAabb.reset();
  130. m_localAabb.reset();
  131. m_worldFromLocal = world;
  132. if (m_renderMesh)
  133. {
  134. m_renderMesh->UpdateTransform(world);
  135. }
  136. }
  137. void EditorGeomNodesMeshComponent::RebuildRenderMesh()
  138. {
  139. AZ_PROFILE_FUNCTION(GeomNodes);
  140. m_worldAabb.reset();
  141. m_localAabb.reset();
  142. // EditorGeomNodesComponentRequestBus::EventResult(m_meshData, m_parentId, &EditorGeomNodesComponentRequests::GetMeshData, (AZ::u64)m_entityId);
  143. if (m_meshData.VertexCount() > 0)
  144. {
  145. m_renderMesh->BuildMesh(m_meshData, m_worldFromLocal);
  146. m_renderMesh->UpdateTransform(m_worldFromLocal);
  147. }
  148. }
  149. void EditorGeomNodesMeshComponent::OnMeshDataAssigned(const GNMeshData& meshData)
  150. {
  151. m_meshData = meshData;
  152. AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusDisconnect();
  153. AzFramework::BoundsRequestBus::Handler::BusDisconnect();
  154. RebuildRenderMesh();
  155. AzFramework::BoundsRequestBus::Handler::BusConnect(m_entityId);
  156. AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusConnect(m_entityId);
  157. }
  158. } // namespace GeomNodes