//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of NVIDIA CORPORATION nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved.
// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
#ifndef PX_VEHICLE_UTILSTELEMETRY_H
#define PX_VEHICLE_UTILSTELEMETRY_H
/** \addtogroup vehicle
@{
*/
#include "vehicle/PxVehicleSDK.h"
#include "foundation/PxSimpleTypes.h"
#include "foundation/PxVec3.h"
#if !PX_DOXYGEN
namespace physx
{
#endif
#if PX_DEBUG_VEHICLE_ON
class PxVehicleGraphDesc
{
friend class PxVehicleGraph;
PxVehicleGraphDesc();
/**
\brief x-coord of graph centre.
Range: (0,1)
*/
PxReal mPosX;
/**
\brief y-coord of graph centre.
Range: (0,1)
*/
PxReal mPosY;
/**
\brief x-extents of graph (from mPosX-0.5f*mSizeX to mPosX+0.5f*mSizeX).
Range: (0,1)
*/
PxReal mSizeX;
/**
\brief y-extents of graph (from mPosY-0.5f*mSizeY to mPosY+0.5f*mSizeY).
Range: (0,1)
*/
PxReal mSizeY;
/**
\brief Background color of graph.
*/
PxVec3 mBackgroundColor;
/**
\brief Alpha value of background color.
*/
PxReal mAlpha;
private:
bool isValid() const;
};
struct PxVehicleGraphChannelDesc
{
public:
friend class PxVehicleGraph;
PxVehicleGraphChannelDesc();
/**
\brief Data values less than mMinY will be clamped at mMinY.
*/
PxReal mMinY;
/**
\brief Data values greater than mMaxY will be clamped at mMaxY.
*/
PxReal mMaxY;
/**
\brief Data values greater than mMidY will be drawn with color mColorHigh.
Data values less than mMidY will be drawn with color mColorLow.
*/
PxReal mMidY;
/**
\brief Color used to render data values lower than mMidY.
*/
PxVec3 mColorLow;
/**
\brief Color used to render data values greater than mMidY.
*/
PxVec3 mColorHigh;
/**
\brief String to describe data channel.
*/
char* mTitle;
private:
bool isValid() const;
};
struct PxVehicleWheelGraphChannel
{
enum Enum
{
eJOUNCE=0,
eSUSPFORCE,
eTIRELOAD,
eNORMALIZED_TIRELOAD,
eWHEEL_OMEGA,
eTIRE_FRICTION,
eTIRE_LONG_SLIP,
eNORM_TIRE_LONG_FORCE,
eTIRE_LAT_SLIP,
eNORM_TIRE_LAT_FORCE,
eNORM_TIRE_ALIGNING_MOMENT,
eMAX_NB_WHEEL_CHANNELS
};
};
struct PxVehicleDriveGraphChannel
{
enum Enum
{
eENGINE_REVS=0,
eENGINE_DRIVE_TORQUE,
eCLUTCH_SLIP,
eACCEL_CONTROL, //TANK_ACCEL
eBRAKE_CONTROL, //TANK_BRAKE_LEFT
eHANDBRAKE_CONTROL, //TANK_BRAKE_RIGHT
eSTEER_LEFT_CONTROL, //TANK_THRUST_LEFT
eSTEER_RIGHT_CONTROL, //TANK_THRUST_RIGHT
eGEAR_RATIO,
eMAX_NB_DRIVE_CHANNELS
};
};
struct PxVehicleGraphType
{
enum Enum
{
eWHEEL=0,
eDRIVE
};
};
class PxVehicleGraph
{
public:
friend class PxVehicleTelemetryData;
friend class PxVehicleUpdate;
enum
{
eMAX_NB_SAMPLES=256
};
enum
{
eMAX_NB_TITLE_CHARS=256
};
enum
{
eMAX_NB_CHANNELS=12
};
/**
\brief Setup a graph from a descriptor.
*/
void setup(const PxVehicleGraphDesc& desc, const PxVehicleGraphType::Enum graphType);
/**
\brief Clear all data recorded in a graph.
*/
void clearRecordedChannelData();
/**
\brief Get the color of the graph background. Used for rendering a graph.
*/
const PxVec3& getBackgroundColor() const {return mBackgroundColor;}
/**
\brief Get the alpha transparency of the color of the graph background. Used for rendering a graph.
*/
PxReal getBackgroundAlpha() const {return mBackgroundAlpha;}
/**
\brief Get the coordinates of the graph background. Used for rendering a graph
\param[out] xMin is the x-coord of the lower-left corner
\param[out] yMin is the y-coord of the lower-left corner
\param[out] xMax is the x-coord of the upper-right corner
\param[out] yMax is the y-coord of the upper-right corner
*/
void getBackgroundCoords(PxReal& xMin, PxReal& yMin, PxReal& xMax, PxReal& yMax) const {xMin = mBackgroundMinX;xMax = mBackgroundMaxX;yMin = mBackgroundMinY;yMax = mBackgroundMaxY;}
/**
\brief Compute the coordinates of the graph data of a specific graph channel.
\param[out] xy is an array of graph sample coordinates stored in order x0,y0,x1,y1,x2,y2...xn,yn.
\param[out] colors stores the color of each point on the graph.
\param[out] title is the title of the graph.
*/
void computeGraphChannel(const PxU32 channel, PxReal* xy, PxVec3* colors, char* title) const;
/**
\brief Return the latest value stored in the specified graph channel
*/
PxF32 getLatestValue(const PxU32 channel) const ;
private:
//Min and max of each sample.
PxReal mChannelMinY[eMAX_NB_CHANNELS];
PxReal mChannelMaxY[eMAX_NB_CHANNELS];
//Discriminate between high and low values with different colors.
PxReal mChannelMidY[eMAX_NB_CHANNELS];
//Different colors for values than midY and less than midY.
PxVec3 mChannelColorLow[eMAX_NB_CHANNELS];
PxVec3 mChannelColorHigh[eMAX_NB_CHANNELS];
//Title of graph
char mChannelTitle[eMAX_NB_CHANNELS][eMAX_NB_TITLE_CHARS];
//Graph data.
PxReal mChannelSamples[eMAX_NB_CHANNELS][eMAX_NB_SAMPLES];
//Background color,alpha,coords
PxVec3 mBackgroundColor;
PxReal mBackgroundAlpha;
PxReal mBackgroundMinX;
PxReal mBackgroundMaxX;
PxReal mBackgroundMinY;
PxReal mBackgroundMaxY;
PxU32 mSampleTide;
PxU32 mNbChannels;
PxU32 mPad[2];
void 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);
void updateTimeSlice(const PxReal* const samples);
void setChannel(PxVehicleGraphChannelDesc& desc, const PxU32 channel);
void setupEngineGraph
(const PxF32 sizeX, const PxF32 sizeY, const PxF32 posX, const PxF32 posY,
const PxVec3& backgoundColor, const PxVec3& lineColorHigh, const PxVec3& lineColorLow);
void setupWheelGraph
(const PxF32 sizeX, const PxF32 sizeY, const PxF32 posX, const PxF32 posY,
const PxVec3& backgoundColor, const PxVec3& lineColorHigh, const PxVec3& lineColorLow);
PxVehicleGraph();
~PxVehicleGraph();
};
PX_COMPILE_TIME_ASSERT(PxU32(PxVehicleGraph::eMAX_NB_CHANNELS) >= PxU32(PxVehicleWheelGraphChannel::eMAX_NB_WHEEL_CHANNELS) && PxU32(PxVehicleGraph::eMAX_NB_CHANNELS) >= PxU32(PxVehicleDriveGraphChannel::eMAX_NB_DRIVE_CHANNELS));
PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleGraph) & 15));
class PxVehicleTelemetryData
{
public:
friend class PxVehicleUpdate;
/**
\brief Allocate a PxVehicleNWTelemetryData instance for a vehicle with nbWheels
@see PxVehicleNWTelemetryDataFree
*/
static PxVehicleTelemetryData* allocate(const PxU32 nbWheels);
/**
\brief Free a PxVehicleNWTelemetryData instance for a vehicle.
@see PxVehicleNWTelemetryDataAllocate
*/
void free();
/**
\brief Set up all the graphs so that they are ready to record data.
*/
void setup
(const PxReal graphSizeX, const PxReal graphSizeY,
const PxReal engineGraphPosX, const PxReal engineGraphPosY,
const PxReal* const wheelGraphPosX, const PxReal* const wheelGraphPosY,
const PxVec3& backGroundColor, const PxVec3& lineColorHigh, const PxVec3& lineColorLow);
/**
\brief Clear the graphs of recorded data.
*/
void clear();
/**
\brief Get the graph data for the engine
*/
const PxVehicleGraph& getEngineGraph() const {return *mEngineGraph;}
/**
\brief Get the number of wheel graphs
*/
PxU32 getNbWheelGraphs() const {return mNbActiveWheels;}
/**
\brief Get the graph data for the kth wheel
*/
const PxVehicleGraph& getWheelGraph(const PxU32 k) const {return mWheelGraphs[k];}
/**
\brief Get the array of tire force application points so they can be rendered
*/
const PxVec3* getTireforceAppPoints() const {return mTireforceAppPoints;}
/**
\brief Get the array of susp force application points so they can be rendered
*/
const PxVec3* getSuspforceAppPoints() const {return mSuspforceAppPoints;}
private:
/**
\brief Graph data for engine.
Used for storing single timeslices of debug data for engine graph.
@see PxVehicleGraph
*/
PxVehicleGraph* mEngineGraph;
/**
\brief Graph data for each wheel.
Used for storing single timeslices of debug data for wheel graphs.
@see PxVehicleGraph
*/
PxVehicleGraph* mWheelGraphs;
/**
\brief Application point of tire forces.
*/
PxVec3* mTireforceAppPoints;
/**
\brief Application point of susp forces.
*/
PxVec3* mSuspforceAppPoints;
/**
\brief Total number of active wheels
*/
PxU32 mNbActiveWheels;
PxU32 mPad[3];
private:
PxVehicleTelemetryData(){}
~PxVehicleTelemetryData(){}
};
PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleTelemetryData) & 15));
#endif //PX_DEBUG_VEHICLE_ON
//#endif // PX_DEBUG_VEHICLE_ON
#if !PX_DOXYGEN
} // namespace physx
#endif
/** @} */
#endif //PX_VEHICLE_UTILSTELEMETRY_H