3
0

SystemComponent.cpp 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include "SystemComponent.h"
  9. #include <PhysX/Debug/PhysXDebugInterface.h>
  10. #include <PhysX/SystemComponentBus.h>
  11. #include <PhysX/MathConversion.h>
  12. #include <PhysX/UserDataTypes.h>
  13. #include <PhysX/Utils.h>
  14. #include <PhysX/PhysXLocks.h>
  15. #include <CryCommon/IConsole.h>
  16. #include <CryCommon/IRenderAuxGeom.h>
  17. #include <CryCommon/ISystem.h>
  18. #include <CryCommon/MathConversion.h>
  19. #include <AzFramework/Components/CameraBus.h>
  20. #include <AzFramework/Physics/PhysicsScene.h>
  21. #include <AzFramework/Physics/PhysicsSystem.h>
  22. #include <AzFramework/Physics/Ragdoll.h>
  23. #include <AzFramework/Physics/SystemBus.h>
  24. #include <AzFramework/Physics/Utils.h>
  25. #include <AzCore/Component/TransformBus.h>
  26. #include <AzCore/Console/IConsole.h>
  27. #include <AzCore/Debug/Profiler.h>
  28. #include <AzCore/Serialization/EditContext.h>
  29. #include <AzCore/Serialization/SerializeContext.h>
  30. namespace PhysXDebug
  31. {
  32. const float SystemComponent::m_maxCullingBoxSize = 150.0f;
  33. namespace Internal
  34. {
  35. const AZ::Crc32 VewportId = AzFramework::g_defaultSceneEntityDebugDisplayId;
  36. }
  37. bool UseEditorPhysicsScene()
  38. {
  39. // Runtime components are created when 'simulation' mode is enabled in the Editor,
  40. // so we shouldn't use Editor physics scene in this case
  41. return gEnv->IsEditing() && !gEnv->IsEditorSimulationMode();
  42. }
  43. void ReflectPhysXVisulizationSettings(AZ::ReflectContext* context)
  44. {
  45. if (auto serialize = azrtti_cast<AZ::SerializeContext*>(context))
  46. {
  47. serialize->Class<PhysXVisualizationSettings>()
  48. ->Version(1)
  49. ->Field("VisualizationEnabled", &PhysXVisualizationSettings::m_visualizationEnabled)
  50. ->Field("CollisionShapes", &PhysXVisualizationSettings::m_collisionShapes)
  51. ->Field("CollisionFNormals", &PhysXVisualizationSettings::m_collisionFNormals)
  52. ->Field("CollisionEdges", &PhysXVisualizationSettings::m_collisionEdges)
  53. ->Field("CollisionAabbs", &PhysXVisualizationSettings::m_collisionAabbs)
  54. ->Field("CollisionCompounds", &PhysXVisualizationSettings::m_collisionCompounds)
  55. ->Field("CollisionStatic", &PhysXVisualizationSettings::m_collisionStatic)
  56. ->Field("CollisionDynamic", &PhysXVisualizationSettings::m_collisionDynamic)
  57. ->Field("BodyAxis", &PhysXVisualizationSettings::m_bodyAxes)
  58. ->Field("BodyMassAxis", &PhysXVisualizationSettings::m_bodyMassAxes)
  59. ->Field("BodyLinVelocity", &PhysXVisualizationSettings::m_bodyLinVelocity)
  60. ->Field("BodyAngVelocity", &PhysXVisualizationSettings::m_bodyAngVelocity)
  61. ->Field("ContactPoint", &PhysXVisualizationSettings::m_contactPoint)
  62. ->Field("ContactNormal", &PhysXVisualizationSettings::m_contactNormal)
  63. ->Field("JointLocalFrames", &PhysXVisualizationSettings::m_jointLocalFrames)
  64. ->Field("JointLimits", &PhysXVisualizationSettings::m_jointLimits)
  65. ->Field("MbpRegions", &PhysXVisualizationSettings::m_mbpRegions)
  66. ->Field("ActorAxes", &PhysXVisualizationSettings::m_actorAxes);
  67. if (AZ::EditContext* ec = serialize->GetEditContext())
  68. {
  69. ec->Class<PhysXVisualizationSettings>("PhysX Debug Draw Settings", "Settings to configure the PhysX Debug Visualization Gem properties.")
  70. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  71. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_visualizationEnabled, "Enable PhysX Debug Visualization", "")
  72. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_collisionShapes, "Collision Shapes", "Enable collision shapes")
  73. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  74. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_collisionFNormals, "Collision FNormals", "Enable collision face normals")
  75. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  76. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_collisionEdges, "Collision Edges", "Enable collision edges")
  77. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  78. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_collisionAabbs, "Collision Aabbs", "Enable collision aabbs")
  79. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  80. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_collisionCompounds, "Collision Compounds", "Enable collision compounds")
  81. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  82. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_collisionStatic, "Collision Static", "Enable collision static")
  83. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  84. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_collisionDynamic, "Collision Dynamic", "Enable collision dynamic")
  85. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  86. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_bodyAxes, "Body Axis", "Enable body axis")
  87. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  88. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_bodyMassAxes, "Body Mass Axis", "Enable body mass axis")
  89. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  90. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_bodyLinVelocity, "Body Linear Velocity", "Enable body linear velocity")
  91. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  92. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_bodyAngVelocity, "Body Angular Velocity", "Enable body angular velocity")
  93. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  94. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_contactPoint, "Contact Point", "Enable contact point")
  95. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  96. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_contactNormal, "Contact Normal", "Enable contact normal")
  97. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  98. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_jointLocalFrames, "Joint Local Frames", "Enable joint local frames")
  99. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  100. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_jointLimits, "Joint Limits", "Enable Joint limits")
  101. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  102. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_mbpRegions, "MBP Regions", "Enable multi box pruning (MBP) regions")
  103. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  104. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &PhysXVisualizationSettings::m_actorAxes, "Actor Axes", "Enable actor axes")
  105. ->Attribute(AZ::Edit::Attributes::Visibility, &PhysXVisualizationSettings::IsPhysXDebugEnabled)
  106. ;
  107. }
  108. }
  109. }
  110. void ReflectPhysXCullingSettings(AZ::ReflectContext* context)
  111. {
  112. if (auto serialize = azrtti_cast<AZ::SerializeContext*>(context))
  113. {
  114. serialize->Class<Culling>()
  115. ->Version(1)
  116. ->Field("cullingBoxSize", &Culling::m_boxSize)
  117. ->Field("cullBox", &Culling::m_enabled)
  118. ->Field("cullBoxWireFrame", &Culling::m_boxWireframe)
  119. ;
  120. if (AZ::EditContext* ec = serialize->GetEditContext())
  121. {
  122. ec->Class<Culling>("Culling Settings", "Settings to configure the PhysX Debug Visualization Culling.")
  123. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  124. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Culling::m_enabled, "Enable Box Culling", "Enable box culling")
  125. ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Culling::m_boxWireframe, "Show Culling Box", "Visualize the culling box")
  126. ->DataElement(AZ::Edit::UIHandlers::Slider, &Culling::m_boxSize, "Culling Box Size", "Size of the culling box")
  127. ->Attribute(AZ::Edit::Attributes::Min, 1.0f)
  128. ->Attribute(AZ::Edit::Attributes::Max, 150.0f)
  129. ;
  130. }
  131. }
  132. }
  133. SystemComponent::SystemComponent()
  134. : m_sceneFinishSimHandler([this](
  135. [[maybe_unused]] AzPhysics::SceneHandle sceneHanle,
  136. [[maybe_unused]] float fixedDeltatime)
  137. {
  138. this->m_editorPhysicsSceneDirty = true;
  139. })
  140. {
  141. }
  142. void SystemComponent::ReflectPhysXDebugSettings(AZ::ReflectContext* context)
  143. {
  144. if (auto serialize = azrtti_cast<AZ::SerializeContext*>(context))
  145. {
  146. serialize->Class<SystemComponent, AZ::Component>()
  147. ->Version(1)
  148. ->Field("physxDebugSettings", &SystemComponent::m_settings)
  149. ->Field("physxDebugCulling", &SystemComponent::m_culling)
  150. ;
  151. if (AZ::EditContext* ec = serialize->GetEditContext())
  152. {
  153. ec->Class<SystemComponent>("PhysX Debug Visualization", "A debug visualization system component for PhysX.")
  154. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  155. ->Attribute(AZ::Edit::Attributes::Category, "PhysX")
  156. ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
  157. ->DataElement(AZ::Edit::UIHandlers::Default, &SystemComponent::m_settings, "Settings", "PhysX debug visualization settings")
  158. ->DataElement(AZ::Edit::UIHandlers::Default, &SystemComponent::m_culling, "Culling", "PhysX culling options")
  159. ;
  160. }
  161. }
  162. }
  163. void SystemComponent::OnCrySystemInitialized([[maybe_unused]] ISystem& system, const SSystemInitParams&)
  164. {
  165. InitPhysXColorMappings();
  166. ConfigurePhysXVisualizationParameters();
  167. }
  168. void SystemComponent::Reflect(AZ::ReflectContext* context)
  169. {
  170. ReflectPhysXVisulizationSettings(context);
  171. ReflectPhysXCullingSettings(context);
  172. ReflectPhysXDebugSettings(context);
  173. }
  174. void SystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  175. {
  176. provided.push_back(AZ_CRC_CE("PhysXDebugService"));
  177. }
  178. void SystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  179. {
  180. incompatible.push_back(AZ_CRC_CE("PhysXDebugService"));
  181. }
  182. void SystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  183. {
  184. required.push_back(AZ_CRC_CE("PhysicsService"));
  185. #ifdef PHYSXDEBUG_GEM_EDITOR
  186. required.push_back(AZ_CRC_CE("PhysicsEditorService"));
  187. #endif // PHYSXDEBUG_GEM_EDITOR
  188. }
  189. void SystemComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
  190. {
  191. (void)dependent;
  192. }
  193. void SystemComponent::Activate()
  194. {
  195. PhysXDebugRequestBus::Handler::BusConnect();
  196. AZ::TickBus::Handler::BusConnect();
  197. CrySystemEventBus::Handler::BusConnect();
  198. #ifdef IMGUI_ENABLED
  199. ImGui::ImGuiUpdateListenerBus::Handler::BusConnect();
  200. #endif // IMGUI_ENABLED
  201. #ifdef PHYSXDEBUG_GEM_EDITOR
  202. if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get())
  203. {
  204. AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::EditorPhysicsSceneName);
  205. sceneInterface->RegisterSceneSimulationFinishHandler(sceneHandle, m_sceneFinishSimHandler);
  206. }
  207. #endif // PHYSXDEBUG_GEM_EDITOR
  208. }
  209. void SystemComponent::Deactivate()
  210. {
  211. #ifdef PHYSXDEBUG_GEM_EDITOR
  212. m_sceneFinishSimHandler.Disconnect();
  213. #endif // PHYSXDEBUG_GEM_EDITOR
  214. #ifdef IMGUI_ENABLED
  215. ImGui::ImGuiUpdateListenerBus::Handler::BusDisconnect();
  216. #endif // IMGUI_ENABLED
  217. CrySystemEventBus::Handler::BusDisconnect();
  218. AZ::TickBus::Handler::BusDisconnect();
  219. PhysXDebugRequestBus::Handler::BusDisconnect();
  220. }
  221. #ifdef IMGUI_ENABLED
  222. void SystemComponent::OnImGuiMainMenuUpdate()
  223. {
  224. if (ImGui::BeginMenu("PhysX Debug"))
  225. {
  226. ImGui::Checkbox("Debug visualization", &m_settings.m_visualizationEnabled);
  227. ImGui::Checkbox("Visualize Colliders", &m_settings.m_visualizeCollidersByProximity);
  228. if (ImGui::BeginMenu("Culling"))
  229. {
  230. ImGui::Checkbox("Wireframe", &m_culling.m_boxWireframe);
  231. ImGui::SliderFloat("Size", &m_culling.m_boxSize, 0, m_maxCullingBoxSize);
  232. ImGui::EndMenu();
  233. }
  234. if (ImGui::BeginMenu("Collisions"))
  235. {
  236. ImGui::Checkbox("Shapes", &m_settings.m_collisionShapes);
  237. ImGui::Checkbox("Edges", &m_settings.m_collisionEdges);
  238. ImGui::Checkbox("F Normals", &m_settings.m_collisionFNormals);
  239. ImGui::Checkbox("Aabbs", &m_settings.m_collisionAabbs);
  240. ImGui::Checkbox("Axis", &m_settings.m_collisionAxes);
  241. ImGui::Checkbox("Compounds", &m_settings.m_collisionCompounds);
  242. ImGui::Checkbox("Static", &m_settings.m_collisionStatic);
  243. ImGui::Checkbox("Dynamic", &m_settings.m_collisionDynamic);
  244. ImGui::EndMenu();
  245. }
  246. if (ImGui::BeginMenu("Body"))
  247. {
  248. ImGui::Checkbox("Axes", &m_settings.m_bodyAxes);
  249. ImGui::Checkbox("Mass Axes", &m_settings.m_bodyMassAxes);
  250. ImGui::Checkbox("Linear Velocity", &m_settings.m_bodyLinVelocity);
  251. ImGui::Checkbox("Angular Velocity", &m_settings.m_bodyAngVelocity);
  252. ImGui::EndMenu();
  253. }
  254. if (ImGui::BeginMenu("Contact"))
  255. {
  256. ImGui::Checkbox("Point", &m_settings.m_contactPoint);
  257. ImGui::Checkbox("Normal", &m_settings.m_contactNormal);
  258. ImGui::EndMenu();
  259. }
  260. if (ImGui::BeginMenu("Character"))
  261. {
  262. ImGui::Checkbox("Joint Limits", &m_settings.m_jointLimits);
  263. ImGui::Checkbox("Mbp Regions", &m_settings.m_mbpRegions);
  264. ImGui::Checkbox("Actor Axes", &m_settings.m_actorAxes);
  265. ImGui::EndMenu();
  266. }
  267. if (ImGui::BeginMenu("PhysX Color Mappings"))
  268. {
  269. BuildColorPickingMenuItem("Black", m_colorMappings.m_black);
  270. BuildColorPickingMenuItem("Red", m_colorMappings.m_red);
  271. BuildColorPickingMenuItem("Green", m_colorMappings.m_green);
  272. BuildColorPickingMenuItem("Blue", m_colorMappings.m_blue);
  273. BuildColorPickingMenuItem("Yellow", m_colorMappings.m_yellow);
  274. BuildColorPickingMenuItem("Magenta", m_colorMappings.m_magenta);
  275. BuildColorPickingMenuItem("Cyan", m_colorMappings.m_cyan);
  276. BuildColorPickingMenuItem("White", m_colorMappings.m_white);
  277. BuildColorPickingMenuItem("Grey", m_colorMappings.m_grey);
  278. BuildColorPickingMenuItem("Dark Red", m_colorMappings.m_darkRed);
  279. BuildColorPickingMenuItem("Dark Green", m_colorMappings.m_darkGreen);
  280. BuildColorPickingMenuItem("Dark Blue", m_colorMappings.m_darkBlue);
  281. if (ImGui::Button("Reset Color Mappings"))
  282. {
  283. InitPhysXColorMappings();
  284. }
  285. ImGui::EndMenu();
  286. }
  287. if (ImGui::Button("Enable/Disable all settings"))
  288. {
  289. ToggleVisualizationConfiguration();
  290. }
  291. ImGui::SliderFloat("PhysX Scale", &m_settings.m_scale, 1.0f, 10.0f);
  292. ImGui::EndMenu();
  293. }
  294. }
  295. void SystemComponent::BuildColorPickingMenuItem(const AZStd::string& label, AZ::Color& color)
  296. {
  297. float col[3] = {color.GetR(), color.GetG(), color.GetB()};
  298. if (ImGui::ColorEdit3(label.c_str(), col, ImGuiColorEditFlags_NoAlpha))
  299. {
  300. const float r = AZ::GetClamp(col[0], 0.0f, 1.0f);
  301. const float g = AZ::GetClamp(col[1], 0.0f, 1.0f);
  302. const float b = AZ::GetClamp(col[2], 0.0f, 1.0f);
  303. color.SetR(r);
  304. color.SetG(g);
  305. color.SetB(b);
  306. }
  307. }
  308. #endif // IMGUI_ENABLED
  309. static const physx::PxRenderBuffer& GetRenderBuffer(physx::PxScene* physxScene)
  310. {
  311. AZ_PROFILE_FUNCTION(Physics);
  312. PHYSX_SCENE_READ_LOCK(physxScene);
  313. return physxScene->getRenderBuffer();
  314. }
  315. void SystemComponent::ToggleCullingWireFrame()
  316. {
  317. m_culling.m_boxWireframe = !m_culling.m_boxWireframe;
  318. }
  319. void SystemComponent::ToggleVisualizationConfiguration()
  320. {
  321. const bool updatedValue = !m_settings.m_collisionFNormals;
  322. m_settings.m_visualizeCollidersByProximity = updatedValue;
  323. m_settings.m_collisionFNormals = updatedValue;
  324. m_settings.m_collisionAabbs = updatedValue;
  325. m_settings.m_collisionAxes = updatedValue;
  326. m_settings.m_collisionCompounds = updatedValue;
  327. m_settings.m_collisionStatic = updatedValue;
  328. m_settings.m_collisionDynamic = updatedValue;
  329. m_settings.m_bodyAxes = updatedValue;
  330. m_settings.m_bodyMassAxes = updatedValue;
  331. m_settings.m_bodyLinVelocity = updatedValue;
  332. m_settings.m_bodyAngVelocity = updatedValue;
  333. m_settings.m_contactPoint = updatedValue;
  334. m_settings.m_contactNormal = updatedValue;
  335. m_settings.m_jointLocalFrames = updatedValue;
  336. m_settings.m_jointLimits = updatedValue;
  337. m_settings.m_mbpRegions = updatedValue;
  338. m_settings.m_actorAxes = updatedValue;
  339. ConfigurePhysXVisualizationParameters();
  340. }
  341. void SystemComponent::SetVisualization(bool enabled)
  342. {
  343. m_settings.m_visualizationEnabled = enabled;
  344. ConfigurePhysXVisualizationParameters();
  345. }
  346. void SystemComponent::ToggleColliderProximityDebugVisualization()
  347. {
  348. m_settings.m_visualizeCollidersByProximity = !m_settings.m_visualizeCollidersByProximity;
  349. }
  350. void SystemComponent::SetCullingBoxSize(float cullingBoxSize)
  351. {
  352. if (cullingBoxSize <= m_maxCullingBoxSize)
  353. {
  354. m_culling.m_enabled = true;
  355. m_culling.m_boxSize = cullingBoxSize;
  356. ConfigurePhysXVisualizationParameters();
  357. ConfigureCullingBox();
  358. }
  359. }
  360. physx::PxScene* SystemComponent::GetCurrentPxScene()
  361. {
  362. AzPhysics::SceneHandle sceneHandle;
  363. if (UseEditorPhysicsScene())
  364. {
  365. // Editor scene needs to be ticked for debug rendering to work (taking place in EditorSystemComponent)
  366. Physics::EditorWorldBus::BroadcastResult(sceneHandle, &Physics::EditorWorldRequests::GetEditorSceneHandle);
  367. }
  368. else
  369. {
  370. Physics::DefaultWorldBus::BroadcastResult(sceneHandle, &Physics::DefaultWorldRequests::GetDefaultSceneHandle);
  371. }
  372. if (auto* physicsSystem = AZ::Interface<AzPhysics::SystemInterface>::Get())
  373. {
  374. if (auto* scene = physicsSystem->GetScene(sceneHandle))
  375. {
  376. return static_cast<physx::PxScene*>(scene->GetNativePointer());
  377. }
  378. }
  379. return nullptr;
  380. }
  381. // TickBus::Handler
  382. void SystemComponent::OnTick([[maybe_unused]] float deltaTime, AZ::ScriptTimePoint time)
  383. {
  384. if (!m_settings.IsPhysXDebugEnabled())
  385. {
  386. return;
  387. }
  388. AZ_PROFILE_FUNCTION(Physics);
  389. m_currentTime = time;
  390. bool dirty = true;
  391. if (UseEditorPhysicsScene())
  392. {
  393. dirty = m_editorPhysicsSceneDirty;
  394. }
  395. UpdateColliderVisualizationByProximity();
  396. if (dirty)
  397. {
  398. // The physics scene is dirty and contains changes to be gathered.
  399. if (GetCurrentPxScene())
  400. {
  401. ConfigurePhysXVisualizationParameters();
  402. ConfigureCullingBox();
  403. ClearBuffers();
  404. GatherBuffers();
  405. m_editorPhysicsSceneDirty = false;
  406. }
  407. }
  408. RenderBuffers();
  409. }
  410. AZ::Vector3 GetViewCameraPosition()
  411. {
  412. using Camera::ActiveCameraRequestBus;
  413. AZ::Transform tm = AZ::Transform::CreateIdentity();
  414. ActiveCameraRequestBus::BroadcastResult(tm, &ActiveCameraRequestBus::Events::GetActiveCameraTransform);
  415. return tm.GetTranslation();
  416. }
  417. void SystemComponent::UpdateColliderVisualizationByProximity()
  418. {
  419. if (auto* debug = AZ::Interface<PhysX::Debug::PhysXDebugInterface>::Get();
  420. UseEditorPhysicsScene() && m_settings.m_visualizeCollidersByProximity
  421. && debug != nullptr)
  422. {
  423. const AZ::Vector3& viewPos = GetViewCameraPosition();
  424. const PhysX::Debug::ColliderProximityVisualization data(
  425. m_settings.m_visualizeCollidersByProximity,
  426. viewPos,
  427. m_culling.m_boxSize * 0.5f);
  428. debug->UpdateColliderProximityVisualization(data);
  429. }
  430. }
  431. void SystemComponent::ClearBuffers()
  432. {
  433. m_linePoints.clear();
  434. m_lineColors.clear();
  435. m_trianglePoints.clear();
  436. m_triangleColors.clear();
  437. }
  438. void SystemComponent::GatherBuffers()
  439. {
  440. physx::PxScene* physxScene = GetCurrentPxScene();
  441. const physx::PxRenderBuffer& rb = GetRenderBuffer(physxScene);
  442. GatherLines(rb);
  443. GatherTriangles(rb);
  444. GatherJointLimits();
  445. }
  446. void SystemComponent::RenderBuffers()
  447. {
  448. if (!m_linePoints.empty() || !m_trianglePoints.empty())
  449. {
  450. AzFramework::DebugDisplayRequestBus::BusPtr debugDisplayBus;
  451. AzFramework::DebugDisplayRequestBus::Bind(debugDisplayBus, Internal::VewportId);
  452. AZ_Assert(debugDisplayBus, "Invalid DebugDisplayRequestBus.");
  453. AzFramework::DebugDisplayRequests* debugDisplay = AzFramework::DebugDisplayRequestBus::FindFirstHandler(debugDisplayBus);
  454. if (debugDisplay)
  455. {
  456. if (!m_linePoints.empty())
  457. {
  458. AZ_Assert(m_linePoints.size() == m_lineColors.size(), "Lines: Expected an equal number of points to colors.");
  459. const size_t minLen = AZ::GetMin(m_linePoints.size(), m_lineColors.size());
  460. for (size_t i = 0; i < minLen; i += 2)
  461. {
  462. debugDisplay->DrawLine(m_linePoints[i], m_linePoints[i + 1], m_lineColors[i].GetAsVector4(), m_lineColors[i + 1].GetAsVector4());
  463. }
  464. }
  465. if (!m_trianglePoints.empty())
  466. {
  467. AZ_Assert(m_trianglePoints.size() == m_triangleColors.size(), "Triangles: Expected an equal number of points to colors.");
  468. const size_t minLen = AZ::GetMin(m_trianglePoints.size(), m_triangleColors.size());
  469. for (size_t i = 0; i < minLen; i += 3)
  470. {
  471. debugDisplay->SetColor(m_triangleColors[i]);
  472. debugDisplay->DrawTri(m_trianglePoints[i], m_trianglePoints[i + 1], m_trianglePoints[i + 2]);
  473. }
  474. }
  475. }
  476. }
  477. }
  478. static void physx_CullingBox([[maybe_unused]] const AZ::ConsoleCommandContainer& arguments)
  479. {
  480. PhysXDebug::PhysXDebugRequestBus::Broadcast(&PhysXDebug::PhysXDebugRequestBus::Events::ToggleCullingWireFrame);
  481. }
  482. AZ_CONSOLEFREEFUNC(physx_CullingBox, AZ::ConsoleFunctorFlags::DontReplicate, "Enables physx wireframe view");
  483. static void physx_PvdConnect([[maybe_unused]] const AZ::ConsoleCommandContainer& arguments)
  484. {
  485. auto* debug = AZ::Interface<PhysX::Debug::PhysXDebugInterface>::Get();
  486. if (debug)
  487. {
  488. debug->ConnectToPvd();
  489. }
  490. }
  491. AZ_CONSOLEFREEFUNC(physx_PvdConnect, AZ::ConsoleFunctorFlags::DontReplicate, "Connects to the physx visual debugger");
  492. static void physx_PvdDisconnect([[maybe_unused]] const AZ::ConsoleCommandContainer& arguments)
  493. {
  494. auto* debug = AZ::Interface<PhysX::Debug::PhysXDebugInterface>::Get();
  495. if (debug)
  496. {
  497. debug->DisconnectFromPvd();
  498. }
  499. }
  500. AZ_CONSOLEFREEFUNC(physx_PvdDisconnect, AZ::ConsoleFunctorFlags::DontReplicate, "Disconnects from the physx visual debugger");
  501. static void physx_CullingBoxSize([[maybe_unused]] const AZ::ConsoleCommandContainer& arguments)
  502. {
  503. const size_t argumentCount = arguments.size();
  504. if (argumentCount == 1)
  505. {
  506. float newCullingBoxSize = (float)strtol(AZ::CVarFixedString(arguments[0]).c_str(), nullptr, 10);
  507. PhysXDebug::PhysXDebugRequestBus::Broadcast(&PhysXDebug::PhysXDebugRequestBus::Events::SetCullingBoxSize, newCullingBoxSize);
  508. }
  509. else
  510. {
  511. AZ_Warning("PhysXDebug", false, "Invalid physx_SetDebugCullingBoxSize Arguments. "
  512. "Please use physx_SetDebugCullingBoxSize <boxSize> e.g. physx_SetDebugCullingBoxSize 100.");
  513. }
  514. }
  515. AZ_CONSOLEFREEFUNC(physx_CullingBoxSize, AZ::ConsoleFunctorFlags::DontReplicate, "Sets physx debug culling box size");
  516. static void physx_Debug([[maybe_unused]] const AZ::ConsoleCommandContainer& arguments)
  517. {
  518. const size_t argumentCount = arguments.size();
  519. if (argumentCount == 1)
  520. {
  521. const auto userPreference = static_cast<DebugCVarValues>(strtol(AZ::CVarFixedString(arguments[0]).c_str(), nullptr, 10));
  522. switch (userPreference)
  523. {
  524. case DebugCVarValues::Enable:
  525. PhysXDebug::PhysXDebugRequestBus::Broadcast(&PhysXDebug::PhysXDebugRequestBus::Events::SetVisualization, true);
  526. break;
  527. case DebugCVarValues::Disable:
  528. PhysXDebug::PhysXDebugRequestBus::Broadcast(&PhysXDebug::PhysXDebugRequestBus::Events::SetVisualization, false);
  529. break;
  530. case DebugCVarValues::SwitchConfigurationPreference:
  531. PhysXDebug::PhysXDebugRequestBus::Broadcast(&PhysXDebug::PhysXDebugRequestBus::Events::ToggleVisualizationConfiguration);
  532. break;
  533. case DebugCVarValues::ColliderProximityDebug:
  534. PhysXDebug::PhysXDebugRequestBus::Broadcast(&PhysXDebug::PhysXDebugRequestBus::Events::ToggleColliderProximityDebugVisualization);
  535. break;
  536. default:
  537. AZ_Warning("PhysXDebug", false, "Unknown user preference used.");
  538. break;
  539. }
  540. }
  541. else
  542. {
  543. AZ_Warning("PhysXDebug", false, "Invalid physx_Debug Arguments. Please use physx_Debug 1 to enable, physx_Debug 0 to disable or physx_Debug 2 to enable all configuration settings.");
  544. }
  545. }
  546. AZ_CONSOLEFREEFUNC(physx_Debug, AZ::ConsoleFunctorFlags::DontReplicate, "Toggles physx debug visualization");
  547. void SystemComponent::ConfigurePhysXVisualizationParameters()
  548. {
  549. AZ_PROFILE_FUNCTION(Physics);
  550. if (physx::PxScene* physxScene = GetCurrentPxScene())
  551. {
  552. PHYSX_SCENE_WRITE_LOCK(physxScene);
  553. // Warning: if "mScale" is enabled, then debug visualization data will be available and requested from PhysX
  554. // this however creates a "significant performance impact" !
  555. // we do however provide culling (as default), however this will only cull eCOLLISION_SHAPES, eCOLLISION_FNORMALS and eCOLLISION_EDGES.
  556. // if you enabled more settings, we will culling them but the data will still be made available in physX but simply will not be rendered in the viewport.
  557. // https://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/guide/Manual/DebugVisualization.html
  558. if (!m_settings.m_visualizationEnabled)
  559. {
  560. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eSCALE, 0.0f);
  561. }
  562. else
  563. {
  564. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eSCALE, m_settings.m_scale);
  565. }
  566. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eCOLLISION_SHAPES, m_settings.m_collisionShapes ? 1.0f : 0.0f);
  567. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eCOLLISION_FNORMALS, m_settings.m_collisionFNormals ? 1.0f : 0.0f);
  568. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eCOLLISION_EDGES, m_settings.m_collisionEdges ? 1.0f : 0.0f);
  569. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eCOLLISION_AABBS, m_settings.m_collisionAabbs ? 1.0f : 0.0f);
  570. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eBODY_AXES, m_settings.m_bodyAxes ? 1.0f : 0.0f);
  571. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eBODY_MASS_AXES, m_settings.m_bodyMassAxes ? 1.0f : 0.0f);
  572. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eBODY_LIN_VELOCITY, m_settings.m_bodyLinVelocity ? 1.0f : 0.0f);
  573. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eBODY_ANG_VELOCITY, m_settings.m_bodyAngVelocity ? 1.0f : 0.0f);
  574. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eCONTACT_POINT, m_settings.m_contactPoint ? 1.0f : 0.0f);
  575. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eCONTACT_NORMAL, m_settings.m_contactNormal ? 1.0f : 0.0f);
  576. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eCOLLISION_AXES, m_settings.m_collisionAxes ? 1.0f : 0.0f);
  577. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eCOLLISION_COMPOUNDS, m_settings.m_collisionCompounds ? 1.0f : 0.0f);
  578. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eCOLLISION_STATIC, m_settings.m_collisionStatic ? 1.0f : 0.0f);
  579. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eCOLLISION_DYNAMIC, m_settings.m_collisionDynamic ? 1.0f : 0.0f);
  580. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eJOINT_LOCAL_FRAMES, m_settings.m_jointLocalFrames ? 1.0f : 0.0f);
  581. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eJOINT_LIMITS, m_settings.m_jointLimits ? 1.0f : 0.0f);
  582. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eMBP_REGIONS, m_settings.m_mbpRegions ? 1.0f : 0.0f);
  583. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eACTOR_AXES, m_settings.m_actorAxes ? 1.0f : 0.0f);
  584. physxScene->setVisualizationParameter(physx::PxVisualizationParameter::eCULL_BOX, m_culling.m_enabled ? 1.0f : 0.0f);
  585. }
  586. }
  587. void SystemComponent::ConfigureCullingBox()
  588. {
  589. AZ_PROFILE_FUNCTION(Physics);
  590. // Currently using the Cry view camera to support Editor, Game and Launcher modes. This will be updated in due course.
  591. const AZ::Vector3 cameraTranslation = GetViewCameraPosition();
  592. if (!cameraTranslation.IsClose(AZ::Vector3::CreateZero()))
  593. {
  594. const physx::PxVec3 min = PxMathConvert(cameraTranslation - AZ::Vector3(m_culling.m_boxSize));
  595. const physx::PxVec3 max = PxMathConvert(cameraTranslation + AZ::Vector3(m_culling.m_boxSize));
  596. m_cullingBox = physx::PxBounds3(min, max);
  597. if (m_culling.m_boxWireframe)
  598. {
  599. const AZ::Aabb cullingBoxAabb = AZ::Aabb::CreateFromMinMax(PxMathConvert(min), PxMathConvert(max));
  600. DrawDebugCullingBox(cullingBoxAabb);
  601. }
  602. if (physx::PxScene* physxScene = GetCurrentPxScene())
  603. {
  604. PHYSX_SCENE_WRITE_LOCK(physxScene);
  605. physxScene->setVisualizationCullingBox(m_cullingBox);
  606. }
  607. }
  608. }
  609. void SystemComponent::GatherTriangles(const physx::PxRenderBuffer& rb)
  610. {
  611. AZ_PROFILE_FUNCTION(Physics);
  612. if (!m_settings.m_visualizationEnabled)
  613. {
  614. return;
  615. }
  616. if (GetCurrentPxScene())
  617. {
  618. // Reserve vector capacity
  619. const physx::PxU32 numTriangles = static_cast<physx::PxU32>(rb.getNbTriangles());
  620. m_trianglePoints.reserve(numTriangles * 3);
  621. m_triangleColors.reserve(numTriangles * 3);
  622. for (physx::PxU32 triangleIndex = 0; triangleIndex < numTriangles; ++triangleIndex)
  623. {
  624. const physx::PxDebugTriangle& triangle = rb.getTriangles()[triangleIndex];
  625. if (!m_culling.m_enabled ||
  626. (m_cullingBox.contains(triangle.pos0) && m_cullingBox.contains(triangle.pos1) && m_cullingBox.contains(triangle.pos2)))
  627. {
  628. m_trianglePoints.emplace_back(PxMathConvert(triangle.pos0));
  629. m_trianglePoints.emplace_back(PxMathConvert(triangle.pos1));
  630. m_trianglePoints.emplace_back(PxMathConvert(triangle.pos2));
  631. m_triangleColors.emplace_back(MapOriginalPhysXColorToUserDefinedValues(triangle.color0));
  632. m_triangleColors.emplace_back(MapOriginalPhysXColorToUserDefinedValues(triangle.color1));
  633. m_triangleColors.emplace_back(MapOriginalPhysXColorToUserDefinedValues(triangle.color2));
  634. }
  635. }
  636. }
  637. }
  638. void SystemComponent::GatherLines(const physx::PxRenderBuffer& rb)
  639. {
  640. AZ_PROFILE_FUNCTION(Physics);
  641. if (!m_settings.m_visualizationEnabled)
  642. {
  643. return;
  644. }
  645. if (GetCurrentPxScene())
  646. {
  647. const physx::PxU32 numLines = static_cast<physx::PxU32>(rb.getNbLines());
  648. // Reserve vector capacity
  649. m_linePoints.reserve(numLines * 2);
  650. m_lineColors.reserve(numLines * 2);
  651. for (physx::PxU32 lineIndex = 0; lineIndex < numLines; ++lineIndex)
  652. {
  653. const physx::PxDebugLine& line = rb.getLines()[lineIndex];
  654. // Bespoke culling of lines on top of the provided PhysX 3.4 box culling.
  655. // if culling is enabled we will perform additional culling as required.
  656. if (!m_culling.m_enabled || (m_cullingBox.contains(line.pos0) && m_cullingBox.contains(line.pos1)))
  657. {
  658. m_linePoints.emplace_back(PxMathConvert(line.pos0));
  659. m_linePoints.emplace_back(PxMathConvert(line.pos1));
  660. m_lineColors.emplace_back(MapOriginalPhysXColorToUserDefinedValues(line.color0));
  661. m_lineColors.emplace_back(MapOriginalPhysXColorToUserDefinedValues(line.color0));
  662. }
  663. }
  664. }
  665. }
  666. void SystemComponent::GatherJointLimits()
  667. {
  668. AZ_PROFILE_FUNCTION(Physics);
  669. physx::PxScene* scene = GetCurrentPxScene();
  670. // The PhysX debug render buffer does not seem to include joint limits, even when
  671. // PxVisualizationParameter::eJOINT_LIMITS is set, so they are separately added to the line buffer here.
  672. if (m_settings.m_jointLimits && scene)
  673. {
  674. const physx::PxU32 numConstraints = scene->getNbConstraints();
  675. for (physx::PxU32 constraintIndex = 0; constraintIndex < numConstraints; constraintIndex++)
  676. {
  677. physx::PxConstraint* constraint;
  678. scene->getConstraints(&constraint, 1, constraintIndex);
  679. physx::PxRigidActor* actor0;
  680. physx::PxRigidActor* actor1;
  681. constraint->getActors(actor0, actor1);
  682. PhysX::ActorData* actorData = PhysX::Utils::GetUserData(actor1);
  683. if (actorData)
  684. {
  685. Physics::RagdollNode* ragdollNode = actorData->GetRagdollNode();
  686. if (ragdollNode)
  687. {
  688. AzPhysics::Joint* joint = ragdollNode->GetJoint();
  689. physx::PxJoint* pxJoint = static_cast<physx::PxJoint*>(joint->GetNativePointer());
  690. physx::PxTransform jointPose = actor1->getGlobalPose() * pxJoint->getLocalPose(physx::PxJointActorIndex::eACTOR1);
  691. if (!m_culling.m_enabled || m_cullingBox.contains(jointPose.p))
  692. {
  693. m_jointVertexBuffer.clear();
  694. m_jointIndexBuffer.clear();
  695. m_jointLineBuffer.clear();
  696. m_jointLineValidityBuffer.clear();
  697. joint->GenerateJointLimitVisualizationData(0.1f, 32, 2, m_jointVertexBuffer,
  698. m_jointIndexBuffer, m_jointLineBuffer, m_jointLineValidityBuffer);
  699. physx::PxTransform jointWorldTransformPx = actor0->getGlobalPose();
  700. jointWorldTransformPx.p = jointPose.p;
  701. AZ::Transform jointWorldTransform = PxMathConvert(jointWorldTransformPx);
  702. const size_t jointLineBufferSize = m_jointLineBuffer.size();
  703. m_linePoints.reserve((m_linePoints.size() + jointLineBufferSize));
  704. m_lineColors.reserve((m_lineColors.size() + jointLineBufferSize));
  705. for (size_t lineIndex = 0; lineIndex < jointLineBufferSize / 2; lineIndex++)
  706. {
  707. m_linePoints.emplace_back(jointWorldTransform.TransformPoint(m_jointLineBuffer[2 * lineIndex]));
  708. m_linePoints.emplace_back(jointWorldTransform.TransformPoint(m_jointLineBuffer[2 * lineIndex + 1]));
  709. m_lineColors.emplace_back(m_colorMappings.m_green);
  710. m_lineColors.emplace_back(m_colorMappings.m_green);
  711. }
  712. }
  713. }
  714. }
  715. }
  716. }
  717. }
  718. void SystemComponent::DrawDebugCullingBox(const AZ::Aabb& cullingBoxAabb)
  719. {
  720. AZ_PROFILE_FUNCTION(Physics);
  721. if (m_settings.m_visualizationEnabled && m_culling.m_boxWireframe)
  722. {
  723. AzFramework::DebugDisplayRequestBus::BusPtr debugDisplayBus;
  724. AzFramework::DebugDisplayRequestBus::Bind(debugDisplayBus, Internal::VewportId);
  725. AZ_Assert(debugDisplayBus, "Invalid DebugDisplayRequestBus.");
  726. if (AzFramework::DebugDisplayRequests* debugDisplay = AzFramework::DebugDisplayRequestBus::FindFirstHandler(debugDisplayBus))
  727. {
  728. const AZ::Color wireframeColor = MapOriginalPhysXColorToUserDefinedValues(1);
  729. debugDisplay->SetColor(wireframeColor);
  730. debugDisplay->DrawWireBox(cullingBoxAabb.GetMin(), cullingBoxAabb.GetMax());
  731. }
  732. }
  733. }
  734. AZ::Color SystemComponent::MapOriginalPhysXColorToUserDefinedValues(const physx::PxU32& originalColor)
  735. {
  736. AZ_PROFILE_FUNCTION(Physics);
  737. // color mapping from PhysX to LY user preference: \PhysX_3.4\Include\common\PxRenderBuffer.h
  738. switch (static_cast<physx::PxDebugColor::Enum>(originalColor))
  739. {
  740. case physx::PxDebugColor::eARGB_BLACK:
  741. return m_colorMappings.m_black;
  742. case physx::PxDebugColor::eARGB_RED:
  743. return m_colorMappings.m_red;
  744. case physx::PxDebugColor::eARGB_GREEN:
  745. return m_colorMappings.m_green;
  746. case physx::PxDebugColor::eARGB_BLUE:
  747. return m_colorMappings.m_blue;
  748. case physx::PxDebugColor::eARGB_YELLOW:
  749. return m_colorMappings.m_yellow;
  750. case physx::PxDebugColor::eARGB_MAGENTA:
  751. return m_colorMappings.m_magenta;
  752. case physx::PxDebugColor::eARGB_CYAN:
  753. return m_colorMappings.m_cyan;
  754. case physx::PxDebugColor::eARGB_WHITE:
  755. return m_colorMappings.m_white;
  756. case physx::PxDebugColor::eARGB_GREY:
  757. return m_colorMappings.m_grey;
  758. case physx::PxDebugColor::eARGB_DARKRED:
  759. return m_colorMappings.m_darkRed;
  760. case physx::PxDebugColor::eARGB_DARKGREEN:
  761. return m_colorMappings.m_darkGreen;
  762. case physx::PxDebugColor::eARGB_DARKBLUE:
  763. return m_colorMappings.m_darkBlue;
  764. default:
  765. return m_colorMappings.m_defaultColor;
  766. }
  767. }
  768. void SystemComponent::InitPhysXColorMappings()
  769. {
  770. AZ_PROFILE_FUNCTION(Physics);
  771. m_colorMappings.m_defaultColor.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_GREEN));
  772. m_colorMappings.m_black.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_BLACK));
  773. m_colorMappings.m_red.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_RED));
  774. m_colorMappings.m_green.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_GREEN));
  775. m_colorMappings.m_blue.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_BLUE));
  776. m_colorMappings.m_yellow.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_YELLOW));
  777. m_colorMappings.m_magenta.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_MAGENTA));
  778. m_colorMappings.m_cyan.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_CYAN));
  779. m_colorMappings.m_white.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_WHITE));
  780. m_colorMappings.m_grey.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_GREY));
  781. m_colorMappings.m_darkRed.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_DARKRED));
  782. m_colorMappings.m_darkGreen.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_DARKGREEN));
  783. m_colorMappings.m_darkBlue.FromU32(static_cast<AZ::u32>(physx::PxDebugColor::eARGB_DARKBLUE));
  784. }
  785. }