aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Source/PhysXVehicle/src/VehicleUtilTelemetry.cpp
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /PhysX_3.4/Source/PhysXVehicle/src/VehicleUtilTelemetry.cpp
downloadphysx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz
physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip
Initial commit:
PhysX 3.4.0 Update @ 21294896 APEX 1.4.0 Update @ 21275617 [CL 21300167]
Diffstat (limited to 'PhysX_3.4/Source/PhysXVehicle/src/VehicleUtilTelemetry.cpp')
-rw-r--r--PhysX_3.4/Source/PhysXVehicle/src/VehicleUtilTelemetry.cpp577
1 files changed, 577 insertions, 0 deletions
diff --git a/PhysX_3.4/Source/PhysXVehicle/src/VehicleUtilTelemetry.cpp b/PhysX_3.4/Source/PhysXVehicle/src/VehicleUtilTelemetry.cpp
new file mode 100644
index 00000000..9e9539ac
--- /dev/null
+++ b/PhysX_3.4/Source/PhysXVehicle/src/VehicleUtilTelemetry.cpp
@@ -0,0 +1,577 @@
+// This code contains NVIDIA Confidential Information and is disclosed to you
+// under a form of NVIDIA software license agreement provided separately to you.
+//
+// Notice
+// NVIDIA Corporation and its licensors retain all intellectual property and
+// proprietary rights in and to this software and related documentation and
+// any modifications thereto. Any use, reproduction, disclosure, or
+// distribution of this software and related documentation without an express
+// license agreement from NVIDIA Corporation is strictly prohibited.
+//
+// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
+// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Information and code furnished is believed to be accurate and reliable.
+// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise under any patent
+// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright (c) 2008-2016 NVIDIA Corporation. All rights reserved.
+// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
+// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
+
+#include "PxVehicleUtilTelemetry.h"
+#include "PsFoundation.h"
+#include "PsUtilities.h"
+#include "stdio.h"
+#include "CmPhysXCommon.h"
+
+namespace physx
+{
+
+#if PX_DEBUG_VEHICLE_ON
+
+PxVehicleGraphDesc::PxVehicleGraphDesc()
+: mPosX(PX_MAX_F32),
+ mPosY(PX_MAX_F32),
+ mSizeX(PX_MAX_F32),
+ mSizeY(PX_MAX_F32),
+ mBackgroundColor(PxVec3(PX_MAX_F32,PX_MAX_F32,PX_MAX_F32)),
+ mAlpha(PX_MAX_F32)
+{
+}
+
+bool PxVehicleGraphDesc::isValid() const
+{
+ PX_CHECK_AND_RETURN_VAL(mPosX != PX_MAX_F32, "PxVehicleGraphDesc.mPosX must be initialised", false);
+ PX_CHECK_AND_RETURN_VAL(mPosY != PX_MAX_F32, "PxVehicleGraphDesc.mPosY must be initialised", false);
+ PX_CHECK_AND_RETURN_VAL(mSizeX != PX_MAX_F32, "PxVehicleGraphDesc.mSizeX must be initialised", false);
+ PX_CHECK_AND_RETURN_VAL(mSizeY != PX_MAX_F32, "PxVehicleGraphDesc.mSizeY must be initialised", false);
+ PX_CHECK_AND_RETURN_VAL(mBackgroundColor.x != PX_MAX_F32 && mBackgroundColor.y != PX_MAX_F32 && mBackgroundColor.z != PX_MAX_F32, "PxVehicleGraphDesc.mBackgroundColor must be initialised", false);
+ PX_CHECK_AND_RETURN_VAL(mAlpha != PX_MAX_F32, "PxVehicleGraphDesc.mAlpha must be initialised", false);
+ return true;
+}
+
+PxVehicleGraphChannelDesc::PxVehicleGraphChannelDesc()
+: mMinY(PX_MAX_F32),
+ mMaxY(PX_MAX_F32),
+ mMidY(PX_MAX_F32),
+ mColorLow(PxVec3(PX_MAX_F32,PX_MAX_F32,PX_MAX_F32)),
+ mColorHigh(PxVec3(PX_MAX_F32,PX_MAX_F32,PX_MAX_F32)),
+ mTitle(NULL)
+{
+}
+
+bool PxVehicleGraphChannelDesc::isValid() const
+{
+ PX_CHECK_AND_RETURN_VAL(mMinY != PX_MAX_F32, "PxVehicleGraphChannelDesc.mMinY must be initialised", false);
+ PX_CHECK_AND_RETURN_VAL(mMaxY != PX_MAX_F32, "PxVehicleGraphChannelDesc.mMaxY must be initialised", false);
+ PX_CHECK_AND_RETURN_VAL(mMidY != PX_MAX_F32, "PxVehicleGraphChannelDesc.mMidY must be initialised", false);
+ PX_CHECK_AND_RETURN_VAL(mColorLow.x != PX_MAX_F32 && mColorLow.y != PX_MAX_F32 && mColorLow.z != PX_MAX_F32, "PxVehicleGraphChannelDesc.mColorLow must be initialised", false);
+ PX_CHECK_AND_RETURN_VAL(mColorHigh.x != PX_MAX_F32 && mColorHigh.y != PX_MAX_F32 && mColorHigh.z != PX_MAX_F32, "PxVehicleGraphChannelDesc.mColorHigh must be initialised", false);
+ PX_CHECK_AND_RETURN_VAL(mTitle, "PxVehicleGraphChannelDesc.mTitle must be initialised", false);
+ return true;
+}
+
+PxVehicleGraph::PxVehicleGraph()
+{
+ mBackgroundMinX=0;
+ mBackgroundMaxX=0;
+ mBackgroundMinY=0;
+ mBackgroundMaxY=0;
+ mSampleTide=0;
+ mBackgroundColor=PxVec3(255.f,255.f,255.f);
+ mBackgroundAlpha=1.0f;
+ for(PxU32 i=0;i<eMAX_NB_CHANNELS;i++)
+ {
+ mChannelMinY[i]=0;
+ mChannelMaxY[i]=0;
+ mChannelMidY[i]=0;
+ mChannelColorLow[i]=PxVec3(0,0,255.f);
+ mChannelColorHigh[i]=PxVec3(255.f,0,0);
+ memset(mChannelSamples[i], 0, sizeof(PxReal)*eMAX_NB_SAMPLES);
+ }
+ mNbChannels = 0;
+ PX_COMPILE_TIME_ASSERT(size_t(PxVehicleGraph::eMAX_NB_CHANNELS) >= size_t(PxVehicleDriveGraphChannel::eMAX_NB_DRIVE_CHANNELS) && size_t(PxVehicleGraph::eMAX_NB_CHANNELS) >= size_t(PxVehicleWheelGraphChannel::eMAX_NB_WHEEL_CHANNELS));
+}
+
+PxVehicleGraph::~PxVehicleGraph()
+{
+}
+
+void PxVehicleGraph::setup(const PxVehicleGraphDesc& desc, const PxVehicleGraphType::Enum graphType)
+{
+ mBackgroundMinX = (desc.mPosX - 0.5f*desc.mSizeX);
+ mBackgroundMaxX = (desc.mPosX + 0.5f*desc.mSizeX);
+ mBackgroundMinY = (desc.mPosY - 0.5f*desc.mSizeY);
+ mBackgroundMaxY = (desc.mPosY + 0.5f*desc.mSizeY);
+
+ mBackgroundColor=desc.mBackgroundColor;
+ mBackgroundAlpha=desc.mAlpha;
+
+ mNbChannels = (PxVehicleGraphType::eWHEEL==graphType) ? PxU32(PxVehicleWheelGraphChannel::eMAX_NB_WHEEL_CHANNELS) : PxU32(PxVehicleDriveGraphChannel::eMAX_NB_DRIVE_CHANNELS);
+}
+
+void PxVehicleGraph::setChannel(PxVehicleGraphChannelDesc& desc, const PxU32 channel)
+{
+ PX_ASSERT(channel<eMAX_NB_CHANNELS);
+
+ mChannelMinY[channel]=desc.mMinY;
+ mChannelMaxY[channel]=desc.mMaxY;
+ mChannelMidY[channel]=desc.mMidY;
+ PX_CHECK_MSG(mChannelMinY[channel]<=mChannelMidY[channel], "mChannelMinY must be less than or equal to mChannelMidY");
+ PX_CHECK_MSG(mChannelMidY[channel]<=mChannelMaxY[channel], "mChannelMidY must be less than or equal to mChannelMaxY");
+
+ mChannelColorLow[channel]=desc.mColorLow;
+ mChannelColorHigh[channel]=desc.mColorHigh;
+
+ strcpy(mChannelTitle[channel], desc.mTitle);
+}
+
+void PxVehicleGraph::clearRecordedChannelData()
+{
+ mSampleTide=0;
+ for(PxU32 i=0;i<eMAX_NB_CHANNELS;i++)
+ {
+ memset(mChannelSamples[i], 0, sizeof(PxReal)*eMAX_NB_SAMPLES);
+ }
+}
+
+void PxVehicleGraph::updateTimeSlice(const PxReal* const samples)
+{
+ mSampleTide++;
+ mSampleTide=mSampleTide%eMAX_NB_SAMPLES;
+
+ for(PxU32 i=0;i<mNbChannels;i++)
+ {
+ mChannelSamples[i][mSampleTide]=samples[i];
+ }
+}
+
+void PxVehicleGraph::computeGraphChannel(const PxU32 channel, PxReal* xy, PxVec3* colors, char* title) const
+{
+ PX_ASSERT(channel<mNbChannels);
+ const PxReal sizeX=mBackgroundMaxX-mBackgroundMinX;
+ const PxReal sizeY=mBackgroundMaxY-mBackgroundMinY;
+ const PxF32 minVal=mChannelMinY[channel];
+ const PxF32 maxVal=mChannelMaxY[channel];
+ const PxF32 midVal=mChannelMidY[channel];
+ const PxVec3 colorLow=mChannelColorLow[channel];
+ const PxVec3 colorHigh=mChannelColorHigh[channel];
+ for(PxU32 i=0;i<PxVehicleGraph::eMAX_NB_SAMPLES;i++)
+ {
+ const PxU32 index = (mSampleTide+1+i)%PxVehicleGraph::eMAX_NB_SAMPLES;
+ xy[2*i+0] = mBackgroundMinX+sizeX*i/(1.0f * PxVehicleGraph::eMAX_NB_SAMPLES);
+ const PxF32 sampleVal = PxClamp(mChannelSamples[channel][index],minVal,maxVal);
+ const PxReal y = (sampleVal-minVal)/(maxVal-minVal);
+ xy[2*i+1] = mBackgroundMinY+sizeY*y;
+ colors[i] = sampleVal < midVal ? colorLow : colorHigh;
+ }
+
+ strcpy(title,mChannelTitle[channel]);
+}
+
+PxF32 PxVehicleGraph::getLatestValue(const PxU32 channel) const
+{
+ PX_CHECK_AND_RETURN_VAL(channel < mNbChannels, "PxVehicleGraph::getLatestValue: Illegal channel", 0.0f);
+ return mChannelSamples[channel][mSampleTide];
+}
+
+void PxVehicleGraph::setupEngineGraph
+(const PxF32 sizeX, const PxF32 sizeY, const PxF32 posX, const PxF32 posY,
+ const PxVec3& backgoundColor, const PxVec3& lineColorHigh, const PxVec3& lineColorLow)
+{
+ PxVehicleGraphDesc desc;
+ desc.mSizeX=sizeX;
+ desc.mSizeY=sizeY;
+ desc.mPosX=posX;
+ desc.mPosY=posY;
+ desc.mBackgroundColor=backgoundColor;
+ desc.mAlpha=0.5f;
+ setup(desc,PxVehicleGraphType::eDRIVE);
+
+ //Engine revs
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=800.0f;
+ desc2.mMidY=400.0f;
+ char title[64];
+ sprintf(title, "engineRevs");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleDriveGraphChannel::eENGINE_REVS);
+ }
+
+ //Engine torque
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=1000.0f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "engineDriveTorque");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleDriveGraphChannel::eENGINE_DRIVE_TORQUE);
+ }
+
+ //Clutch slip
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=-200.0f;
+ desc2.mMaxY=200.0f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "clutchSlip");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleDriveGraphChannel::eCLUTCH_SLIP);
+ }
+
+ //Accel control
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=1.1f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "accel");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleDriveGraphChannel::eACCEL_CONTROL);
+ }
+
+ //Brake control
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=1.1f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "brake/tank brake left");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleDriveGraphChannel::eBRAKE_CONTROL);
+ }
+
+ //HandBrake control
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=1.1f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "handbrake/tank brake right");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleDriveGraphChannel::eHANDBRAKE_CONTROL);
+ }
+
+ //Steer control
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=-1.1f;
+ desc2.mMaxY=1.1f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "steerLeft/tank thrust left");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleDriveGraphChannel::eSTEER_LEFT_CONTROL);
+ }
+
+ //Steer control
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=-1.1f;
+ desc2.mMaxY=1.1f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "steerRight/tank thrust right");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleDriveGraphChannel::eSTEER_RIGHT_CONTROL);
+ }
+
+ //Gear
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=-4.f;
+ desc2.mMaxY=20.f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "gearRatio");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleDriveGraphChannel::eGEAR_RATIO);
+ }
+}
+
+void PxVehicleGraph::setupWheelGraph
+ (const PxF32 sizeX, const PxF32 sizeY, const PxF32 posX, const PxF32 posY,
+ const PxVec3& backgoundColor, const PxVec3& lineColorHigh, const PxVec3& lineColorLow)
+{
+ PxVehicleGraphDesc desc;
+ desc.mSizeX=sizeX;
+ desc.mSizeY=sizeY;
+ desc.mPosX=posX;
+ desc.mPosY=posY;
+ desc.mBackgroundColor=backgoundColor;
+ desc.mAlpha=0.5f;
+ setup(desc,PxVehicleGraphType::eWHEEL);
+
+ //Jounce data channel
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=-0.2f;
+ desc2.mMaxY=0.4f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "suspJounce");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleWheelGraphChannel::eJOUNCE);
+ }
+
+ //Jounce susp force channel
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=20000.0f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "suspForce");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleWheelGraphChannel::eSUSPFORCE);
+ }
+
+ //Tire load channel.
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=20000.0f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "tireLoad");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleWheelGraphChannel::eTIRELOAD);
+ }
+
+ //Normalised tire load channel.
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=3.0f;
+ desc2.mMidY=1.0f;
+ char title[64];
+ sprintf(title, "normTireLoad");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleWheelGraphChannel::eNORMALIZED_TIRELOAD);
+ }
+
+ //Wheel omega channel
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=-50.0f;
+ desc2.mMaxY=250.0f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "wheelOmega");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleWheelGraphChannel::eWHEEL_OMEGA);
+ }
+
+ //Tire friction
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=1.1f;
+ desc2.mMidY=1.0f;
+ char title[64];
+ sprintf(title, "friction");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleWheelGraphChannel::eTIRE_FRICTION);
+ }
+
+
+ //Tire long slip
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=-0.2f;
+ desc2.mMaxY=0.2f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "tireLongSlip");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleWheelGraphChannel::eTIRE_LONG_SLIP);
+ }
+
+ //Normalised tire long force
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=2.0f;
+ desc2.mMidY=1.0f;
+ char title[64];
+ sprintf(title, "normTireLongForce");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleWheelGraphChannel::eNORM_TIRE_LONG_FORCE);
+ }
+
+ //Tire lat slip
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=-1.0f;
+ desc2.mMaxY=1.0f;
+ desc2.mMidY=0.0f;
+ char title[64];
+ sprintf(title, "tireLatSlip");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleWheelGraphChannel::eTIRE_LAT_SLIP);
+ }
+
+ //Normalised tire lat force
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=2.0f;
+ desc2.mMidY=1.0f;
+ char title[64];
+ sprintf(title, "normTireLatForce");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleWheelGraphChannel::eNORM_TIRE_LAT_FORCE);
+ }
+
+ //Normalized aligning moment
+ {
+ PxVehicleGraphChannelDesc desc2;
+ desc2.mColorHigh=lineColorHigh;
+ desc2.mColorLow=lineColorLow;
+ desc2.mMinY=0.0f;
+ desc2.mMaxY=2.0f;
+ desc2.mMidY=1.0f;
+ char title[64];
+ sprintf(title, "normTireAlignMoment");
+ desc2.mTitle=title;
+ setChannel(desc2,PxVehicleWheelGraphChannel::eNORM_TIRE_ALIGNING_MOMENT);
+ }
+}
+
+PxVehicleTelemetryData* physx::PxVehicleTelemetryData::allocate(const PxU32 numWheels)
+{
+ //Work out the byte size required.
+ PxU32 size = sizeof(PxVehicleTelemetryData);
+ size += sizeof(PxVehicleGraph); //engine graph
+ size += sizeof(PxVehicleGraph)*numWheels; //wheel graphs
+ size += sizeof(PxVec3)*numWheels; //tire force app points
+ size += sizeof(PxVec3)*numWheels; //susp force app points
+
+ //Allocate the memory.
+ PxVehicleTelemetryData* vehTelData=static_cast<PxVehicleTelemetryData*>(PX_ALLOC(size, "PxVehicleNWTelemetryData"));
+
+ //Patch up the pointers.
+ PxU8* ptr = reinterpret_cast<PxU8*>(vehTelData) + sizeof(PxVehicleTelemetryData);
+ vehTelData->mEngineGraph = reinterpret_cast<PxVehicleGraph*>(ptr);
+ new(vehTelData->mEngineGraph) PxVehicleGraph();
+ ptr += sizeof(PxVehicleGraph);
+ vehTelData->mWheelGraphs = reinterpret_cast<PxVehicleGraph*>(ptr);
+ for(PxU32 i=0;i<numWheels;i++)
+ {
+ new(&vehTelData->mWheelGraphs[i]) PxVehicleGraph();
+ }
+ ptr += sizeof(PxVehicleGraph)*numWheels;
+ vehTelData->mSuspforceAppPoints = reinterpret_cast<PxVec3*>(ptr);
+ ptr += sizeof(PxVec3)*numWheels;
+ vehTelData->mTireforceAppPoints = reinterpret_cast<PxVec3*>(ptr);
+ ptr += sizeof(PxVec3)*numWheels;
+
+ //Set the number of wheels in each structure that needs it.
+ vehTelData->mNbActiveWheels=numWheels;
+
+ //Finished.
+ return vehTelData;
+}
+
+void PxVehicleTelemetryData::free()
+{
+ PX_FREE(this);
+}
+
+void physx::PxVehicleTelemetryData::setup
+(const PxF32 graphSizeX, const PxF32 graphSizeY,
+const PxF32 engineGraphPosX, const PxF32 engineGraphPosY,
+const PxF32* const wheelGraphPosX, const PxF32* const wheelGraphPosY,
+const PxVec3& backgroundColor, const PxVec3& lineColorHigh, const PxVec3& lineColorLow)
+{
+ mEngineGraph->setupEngineGraph
+ (graphSizeX, graphSizeY, engineGraphPosX, engineGraphPosY,
+ backgroundColor, lineColorHigh, lineColorLow);
+
+ const PxU32 numActiveWheels=mNbActiveWheels;
+ for(PxU32 k=0;k<numActiveWheels;k++)
+ {
+ mWheelGraphs[k].setupWheelGraph
+ (graphSizeX, graphSizeY, wheelGraphPosX[k], wheelGraphPosY[k],
+ backgroundColor, lineColorHigh, lineColorLow);
+
+ mTireforceAppPoints[k]=PxVec3(0,0,0);
+ mSuspforceAppPoints[k]=PxVec3(0,0,0);
+ }
+}
+
+void physx::PxVehicleTelemetryData::clear()
+{
+ mEngineGraph->clearRecordedChannelData();
+
+ const PxU32 numActiveWheels=mNbActiveWheels;
+ for(PxU32 k=0;k<numActiveWheels;k++)
+ {
+ mWheelGraphs[k].clearRecordedChannelData();
+ mTireforceAppPoints[k]=PxVec3(0,0,0);
+ mSuspforceAppPoints[k]=PxVec3(0,0,0);
+ }
+}
+
+#endif //PX_DEBUG_VEHICLE_ON
+
+} //physx
+
+
+
+