Files
o3de/Gems/PhysX/Code/Source/Debug/PhysXDebug.cpp
T
Esteban Papp 1f9b284de2 Merge branch 'development' into cmake/SPEC-7179
Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com>

# Conflicts:
#	Code/Editor/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin_precompiled.h
#	Code/Editor/Plugins/EditorCommon/EditorCommon_precompiled.h
#	Code/Editor/Plugins/EditorCommon/stdafx.cpp
#	Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin_precompiled.h
#	Code/Editor/Plugins/PerforcePlugin/PerforcePlugin_precompiled.h
#	Code/Editor/Plugins/ProjectSettingsTool/ProjectSettingsTool_precompiled.h
#	Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFramework_precompiled.h
#	Code/Tools/AssetProcessor/native/precompiled.h
#	Code/Tools/Standalone/StandaloneTools_precompiled.h
#	Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzer_precompiled.h
#	Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageProcessing_precompiled.h
#	Gems/Atom/RHI/DX12/Code/Source/RHI/Atom_RHI_DX12_precompiled.h
#	Gems/Atom/RHI/Metal/Code/Include/Platform/Mac/Atom_RHI_Metal_precompiled_Platform.h
#	Gems/Atom/RHI/Metal/Code/Include/Platform/iOS/Atom_RHI_Metal_precompiled_Platform.h
#	Gems/Atom/RHI/Metal/Code/Source/Atom_RHI_Metal_precompiled.h
#	Gems/Atom/RHI/Metal/Code/atom_rhi_metal_common_files.cmake
#	Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.h
#	Gems/Atom/RHI/Null/Code/atom_rhi_null_common_files.cmake
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Android/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Mac/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Windows/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Source/Atom_RHI_Vulkan_precompiled.h
#	Gems/Atom/RHI/Vulkan/Code/Source/RHI/SwapChain.cpp
#	Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_common_files.cmake
#	Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont_precompiled.h
#	Gems/Blast/Code/Source/StdAfx.cpp
#	Gems/Camera/Code/Source/Camera_precompiled.h
#	Gems/EMotionFX/Code/Source/EMotionFX_precompiled.h
#	Gems/FastNoise/Code/Source/FastNoise_precompiled.h
#	Gems/Gestures/Code/Source/Gestures_precompiled.h
#	Gems/GradientSignal/Code/Source/GradientSignal_precompiled.h
#	Gems/GraphCanvas/Code/precompiled.h
#	Gems/ImGui/Code/Source/ImGui_precompiled.h
#	Gems/InAppPurchases/Code/Source/InAppPurchases_precompiled.h
#	Gems/LmbrCentral/Code/Source/LmbrCentral_precompiled.h
#	Gems/LmbrCentral/Code/Tests/ShapeGeometryUtilTest.cpp
#	Gems/LyShine/Code/Editor/UiCanvasEditor_precompiled.h
#	Gems/LyShine/Code/Source/Animation/LyShine_precompiled.h
#	Gems/LyShine/Code/Source/LyShine_precompiled.h
#	Gems/LyShineExamples/Code/Source/LyShineExamples_precompiled.h
#	Gems/Maestro/Code/Source/Cinematics/Maestro_precompiled.h
#	Gems/Maestro/Code/Source/Maestro_precompiled.h
#	Gems/MessagePopup/Code/Source/MessagePopup_precompiled.h
#	Gems/Metastream/Code/Source/Metastream_precompiled.h
#	Gems/Microphone/Code/Source/Microphone_precompiled.h
#	Gems/Multiplayer/Code/Source/Multiplayer_precompiled.h
#	Gems/PhysX/Code/NumericalMethods/Source/NumericalMethods_precompiled.h
#	Gems/PhysX/Code/Source/PhysXUnsupported_precompiled.h
#	Gems/PhysX/Code/Source/PhysX_precompiled.h
#	Gems/PhysX/Code/physx_unsupported_files.cmake
#	Gems/PhysXDebug/Code/Source/PhysXDebugUnsupported_precompiled.h
#	Gems/PhysXDebug/Code/Source/PhysXDebug_precompiled.h
#	Gems/ScriptCanvas/Code/Editor/precompiled.h
#	Gems/ScriptCanvas/Code/Source/precompiled.h
#	Gems/ScriptCanvasDeveloper/Code/Source/precompiled.h
#	Gems/ScriptCanvasPhysics/Code/Source/ScriptCanvasPhysics_precompiled.h
#	Gems/ScriptEvents/Code/Source/precompiled.h
#	Gems/ScriptEvents/Code/Tests/Editor/EditorTests.cpp
#	Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweener_precompiled.h
#	Gems/SliceFavorites/Code/Source/SliceFavorites_precompiled.h
#	Gems/StartingPointCamera/Code/Source/StartingPointCamera_precompiled.h
#	Gems/StartingPointInput/Code/Source/StartingPointInput_precompiled.h
#	Gems/StartingPointMovement/Code/Source/StartingPointMovement_precompiled.h
#	Gems/SurfaceData/Code/Source/SurfaceData_precompiled.h
#	Gems/TextureAtlas/Code/Source/TextureAtlas_precompiled.h
#	Gems/TickBusOrderViewer/Code/Source/TickBusOrderViewer_precompiled.h
#	Gems/Twitch/Code/Source/Twitch_precompiled.h
#	Gems/VirtualGamepad/Code/Source/VirtualGamepad_precompiled.h
#	Gems/WhiteBox/Code/Source/WhiteBoxUnsupported_precompiled.h
#	Gems/WhiteBox/Code/Source/WhiteBox_precompiled.h
2021-07-16 15:42:37 -07:00

182 lines
6.3 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <AzCore/std/functional.h>
#include <Debug/PhysXDebug.h>
#include <AzFramework/API/ApplicationAPI.h>
#include <AzFramework/StringFunc/StringFunc.h>
#include <AzCore/std/string/conversions.h>
#include <PxPhysicsAPI.h>
#include <AzCore/Component/ComponentApplicationBus.h>
namespace PhysX
{
namespace Debug
{
physx::PxPvd* PhysXDebug::InitializePhysXPvd([[maybe_unused]] physx::PxFoundation* foundation)
{
#ifdef AZ_PHYSICS_DEBUG_ENABLED
m_pvd = PxCreatePvd(*foundation);
return m_pvd;
#else
return nullptr;
#endif
}
void PhysXDebug::ShutdownPhysXPvd()
{
DisconnectFromPvd();
if (m_pvd)
{
m_pvd->release();
m_pvd = nullptr;
}
}
void PhysXDebug::Initialize(const DebugConfiguration& config)
{
m_config = config;
}
void PhysXDebug::UpdateDebugConfiguration(const DebugConfiguration& config)
{
const bool signalDebugDataChanged = m_config.m_debugDisplayData != config.m_debugDisplayData;
const bool signalPvdConfigChanged = m_config.m_pvdConfigurationData != config.m_pvdConfigurationData;
if (signalDebugDataChanged || signalPvdConfigChanged)
{
m_config = config;
if (signalDebugDataChanged)
{
m_debugDisplayDataChangedEvent.Signal(config.m_debugDisplayData);
}
if (signalPvdConfigChanged)
{
m_pvdConfigurationChangedEvent.Signal(config.m_pvdConfigurationData);
}
}
}
const DebugConfiguration& PhysXDebug::GetDebugConfiguration() const
{
return m_config;
}
const PvdConfiguration& PhysXDebug::GetPhysXPvdConfiguration() const
{
return m_config.m_pvdConfigurationData;
}
const DebugDisplayData& PhysXDebug::GetDebugDisplayData() const
{
return m_config.m_debugDisplayData;
}
void PhysXDebug::UpdateColliderProximityVisualization(const ColliderProximityVisualization& data)
{
if (m_config.m_debugDisplayData.m_colliderProximityVisualization != data)
{
m_config.m_debugDisplayData.m_colliderProximityVisualization = data;
m_colliderProximityVisualizationChangedEvent.Signal(data);
}
}
bool PhysXDebug::ConnectToPvd()
{
#ifdef AZ_PHYSICS_DEBUG_ENABLED
DisconnectFromPvd();
// Select current PhysX Pvd debug type
switch (m_config.m_pvdConfigurationData.m_transportType)
{
case PhysX::Debug::PvdTransportType::File:
{
// Use current timestamp in the filename.
AZ::u64 currentTimeStamp = AZStd::GetTimeUTCMilliSecond() / 1000;
// Strip any filename used as .pxd2 forced (only .pvd or .px2 valid for PVD version 3.2016.12.21494747)
AzFramework::StringFunc::Path::StripExtension(m_config.m_pvdConfigurationData.m_fileName);
// Create output filename (format: <TimeStamp>-<FileName>.pxd2)
AZStd::string filename = AZStd::to_string(currentTimeStamp);
AzFramework::StringFunc::Append(filename, "-");
AzFramework::StringFunc::Append(filename, m_config.m_pvdConfigurationData.m_fileName.c_str());
AzFramework::StringFunc::Append(filename, ".pxd2");
AZStd::string rootDirectory;
AZ::ComponentApplicationBus::BroadcastResult(rootDirectory, &AZ::ComponentApplicationRequests::GetAppRoot);
// Create the full filepath.
AZStd::string safeFilePath;
AzFramework::StringFunc::Path::Join
(
rootDirectory.c_str(),
filename.c_str(),
safeFilePath
);
m_pvdTransport = physx::PxDefaultPvdFileTransportCreate(safeFilePath.c_str());
break;
}
case PhysX::Debug::PvdTransportType::Network:
{
m_pvdTransport = physx::PxDefaultPvdSocketTransportCreate
(
m_config.m_pvdConfigurationData.m_host.c_str(),
m_config.m_pvdConfigurationData.m_port,
m_config.m_pvdConfigurationData.m_timeoutInMilliseconds
);
break;
}
default:
{
AZ_Error("PhysX", false, "Invalid PhysX Visual Debugger (PVD) Debug Type used %d.", m_config.m_pvdConfigurationData.m_transportType);
break;
}
}
bool pvdConnectionSuccessful = false;
if (m_pvd && m_pvdTransport)
{
pvdConnectionSuccessful = m_pvd->connect(*m_pvdTransport, physx::PxPvdInstrumentationFlag::eALL);
if (pvdConnectionSuccessful)
{
AZ_Printf("PhysX", "Successfully connected to the PhysX Visual Debugger (PVD).\n");
}
else
{
AZ_Printf("PhysX", "Failed to connect to the PhysX Visual Debugger (PVD).\n");
}
}
return pvdConnectionSuccessful;
#else
return false;
#endif // AZ_PHYSICS_DEBUG_ENABLED
}
void PhysXDebug::DisconnectFromPvd()
{
#ifdef AZ_PHYSICS_DEBUG_ENABLED
if (m_pvd)
{
m_pvd->disconnect();
}
if (m_pvdTransport)
{
m_pvdTransport->release();
m_pvdTransport = nullptr;
AZ_Printf("PhysX", "Successfully disconnected from the PhysX Visual Debugger (PVD).\n");
}
#endif
}
}// namespace Debug
}// namespace PhysX