1//
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions
4// are met:
5// * Redistributions of source code must retain the above copyright
6// notice, this list of conditions and the following disclaimer.
7// * Redistributions in binary form must reproduce the above copyright
8// notice, this list of conditions and the following disclaimer in the
9// documentation and/or other materials provided with the distribution.
10// * Neither the name of NVIDIA CORPORATION nor the names of its
11// contributors may be used to endorse or promote products derived
12// from this software without specific prior written permission.
13//
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
15// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25//
26// Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved.
27// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
28// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
29
30#ifndef PX_VEHICLE_UTILSTELEMETRY_H
31#define PX_VEHICLE_UTILSTELEMETRY_H
32/** \addtogroup vehicle
33 @{
34*/
35
36#include "vehicle/PxVehicleSDK.h"
37#include "foundation/PxSimpleTypes.h"
38#include "foundation/PxVec3.h"
39
40#if !PX_DOXYGEN
41namespace physx
42{
43#endif
44
45#if PX_DEBUG_VEHICLE_ON
46
47class PxVehicleGraphDesc
48{
49
50 friend class PxVehicleGraph;
51
52 PxVehicleGraphDesc();
53
54 /**
55 \brief x-coord of graph centre.
56 <b>Range:</b> (0,1)<br>
57 */
58 PxReal mPosX;
59
60 /**
61 \brief y-coord of graph centre.
62 <b>Range:</b> (0,1)<br>
63 */
64 PxReal mPosY;
65
66 /**
67 \brief x-extents of graph (from mPosX-0.5f*mSizeX to mPosX+0.5f*mSizeX).
68 <b>Range:</b> (0,1)<br>
69 */
70 PxReal mSizeX;
71
72 /**
73 \brief y-extents of graph (from mPosY-0.5f*mSizeY to mPosY+0.5f*mSizeY).
74 <b>Range:</b> (0,1)<br>
75 */
76 PxReal mSizeY;
77
78 /**
79 \brief Background color of graph.
80 */
81 PxVec3 mBackgroundColor;
82
83 /**
84 \brief Alpha value of background color.
85 */
86 PxReal mAlpha;
87
88private:
89
90 bool isValid() const;
91};
92
93struct PxVehicleGraphChannelDesc
94{
95public:
96
97 friend class PxVehicleGraph;
98
99 PxVehicleGraphChannelDesc();
100
101 /**
102 \brief Data values less than mMinY will be clamped at mMinY.
103 */
104 PxReal mMinY;
105
106 /**
107 \brief Data values greater than mMaxY will be clamped at mMaxY.
108 */
109 PxReal mMaxY;
110
111 /**
112 \brief Data values greater than mMidY will be drawn with color mColorHigh.
113 Data values less than mMidY will be drawn with color mColorLow.
114 */
115 PxReal mMidY;
116
117 /**
118 \brief Color used to render data values lower than mMidY.
119 */
120 PxVec3 mColorLow;
121
122 /**
123 \brief Color used to render data values greater than mMidY.
124 */
125 PxVec3 mColorHigh;
126
127 /**
128 \brief String to describe data channel.
129 */
130 char* mTitle;
131
132private:
133
134 bool isValid() const;
135};
136
137struct PxVehicleWheelGraphChannel
138{
139 enum Enum
140 {
141 eJOUNCE=0,
142 eSUSPFORCE,
143 eTIRELOAD,
144 eNORMALIZED_TIRELOAD,
145 eWHEEL_OMEGA,
146 eTIRE_FRICTION,
147 eTIRE_LONG_SLIP,
148 eNORM_TIRE_LONG_FORCE,
149 eTIRE_LAT_SLIP,
150 eNORM_TIRE_LAT_FORCE,
151 eNORM_TIRE_ALIGNING_MOMENT,
152 eMAX_NB_WHEEL_CHANNELS
153 };
154};
155
156struct PxVehicleDriveGraphChannel
157{
158 enum Enum
159 {
160 eENGINE_REVS=0,
161 eENGINE_DRIVE_TORQUE,
162 eCLUTCH_SLIP,
163 eACCEL_CONTROL, //TANK_ACCEL
164 eBRAKE_CONTROL, //TANK_BRAKE_LEFT
165 eHANDBRAKE_CONTROL, //TANK_BRAKE_RIGHT
166 eSTEER_LEFT_CONTROL, //TANK_THRUST_LEFT
167 eSTEER_RIGHT_CONTROL, //TANK_THRUST_RIGHT
168 eGEAR_RATIO,
169 eMAX_NB_DRIVE_CHANNELS
170 };
171};
172
173struct PxVehicleGraphType
174{
175 enum Enum
176 {
177 eWHEEL=0,
178 eDRIVE
179 };
180};
181
182
183class PxVehicleGraph
184{
185public:
186
187 friend class PxVehicleTelemetryData;
188 friend class PxVehicleUpdate;
189
190 enum
191 {
192 eMAX_NB_SAMPLES=256
193 };
194
195 enum
196 {
197 eMAX_NB_TITLE_CHARS=256
198 };
199
200 enum
201 {
202 eMAX_NB_CHANNELS=12
203 };
204
205 /**
206 \brief Setup a graph from a descriptor.
207 */
208 void setup(const PxVehicleGraphDesc& desc, const PxVehicleGraphType::Enum graphType);
209
210 /**
211 \brief Clear all data recorded in a graph.
212 */
213 void clearRecordedChannelData();
214
215 /**
216 \brief Get the color of the graph background. Used for rendering a graph.
217 */
218 const PxVec3& getBackgroundColor() const {return mBackgroundColor;}
219
220 /**
221 \brief Get the alpha transparency of the color of the graph background. Used for rendering a graph.
222 */
223 PxReal getBackgroundAlpha() const {return mBackgroundAlpha;}
224
225 /**
226 \brief Get the coordinates of the graph background. Used for rendering a graph
227
228 \param[out] xMin is the x-coord of the lower-left corner
229 \param[out] yMin is the y-coord of the lower-left corner
230 \param[out] xMax is the x-coord of the upper-right corner
231 \param[out] yMax is the y-coord of the upper-right corner
232 */
233 void getBackgroundCoords(PxReal& xMin, PxReal& yMin, PxReal& xMax, PxReal& yMax) const {xMin = mBackgroundMinX;xMax = mBackgroundMaxX;yMin = mBackgroundMinY;yMax = mBackgroundMaxY;}
234
235 /**
236 \brief Compute the coordinates of the graph data of a specific graph channel.
237
238 \param[out] xy is an array of graph sample coordinates stored in order x0,y0,x1,y1,x2,y2...xn,yn.
239 \param[out] colors stores the color of each point on the graph.
240 \param[out] title is the title of the graph.
241 */
242 void computeGraphChannel(const PxU32 channel, PxReal* xy, PxVec3* colors, char* title) const;
243
244 /**
245 \brief Return the latest value stored in the specified graph channel
246 */
247 PxF32 getLatestValue(const PxU32 channel) const ;
248
249 /**
250 \brief Get the raw data of a specific graph channel.
251
252 \param[in] channel is the ID of the graph channel to get data from.
253 \param[out] values is the buffer to write the data to. Minimum required size is eMAX_NB_SAMPLES.
254 */
255 void getRawData(const PxU32 channel, PxReal* values) const;
256
257private:
258
259 //Min and max of each sample.
260 PxReal mChannelMinY[eMAX_NB_CHANNELS];
261 PxReal mChannelMaxY[eMAX_NB_CHANNELS];
262 //Discriminate between high and low values with different colors.
263 PxReal mChannelMidY[eMAX_NB_CHANNELS];
264 //Different colors for values than midY and less than midY.
265 PxVec3 mChannelColorLow[eMAX_NB_CHANNELS];
266 PxVec3 mChannelColorHigh[eMAX_NB_CHANNELS];
267 //Title of graph
268 char mChannelTitle[eMAX_NB_CHANNELS][eMAX_NB_TITLE_CHARS];
269 //Graph data.
270 PxReal mChannelSamples[eMAX_NB_CHANNELS][eMAX_NB_SAMPLES];
271
272 //Background color,alpha,coords
273 PxVec3 mBackgroundColor;
274 PxReal mBackgroundAlpha;
275 PxReal mBackgroundMinX;
276 PxReal mBackgroundMaxX;
277 PxReal mBackgroundMinY;
278 PxReal mBackgroundMaxY;
279
280 PxU32 mSampleTide;
281
282 PxU32 mNbChannels;
283
284 PxU32 mPad[2];
285
286
287 void setup
288 (const PxF32 graphSizeX, const PxF32 graphSizeY,
289 const PxF32 engineGraphPosX, const PxF32 engineGraphPosY,
290 const PxF32* const wheelGraphPosX, const PxF32* const wheelGraphPosY,
291 const PxVec3& backgroundColor, const PxVec3& lineColorHigh, const PxVec3& lineColorLow);
292
293 void updateTimeSlice(const PxReal* const samples);
294
295 void setChannel(PxVehicleGraphChannelDesc& desc, const PxU32 channel);
296
297 void setupEngineGraph
298 (const PxF32 sizeX, const PxF32 sizeY, const PxF32 posX, const PxF32 posY,
299 const PxVec3& backgoundColor, const PxVec3& lineColorHigh, const PxVec3& lineColorLow);
300
301 void setupWheelGraph
302 (const PxF32 sizeX, const PxF32 sizeY, const PxF32 posX, const PxF32 posY,
303 const PxVec3& backgoundColor, const PxVec3& lineColorHigh, const PxVec3& lineColorLow);
304
305 PxVehicleGraph();
306 ~PxVehicleGraph();
307};
308PX_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));
309PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleGraph) & 15));
310
311class PxVehicleTelemetryData
312{
313public:
314
315 friend class PxVehicleUpdate;
316
317 /**
318 \brief Allocate a PxVehicleNWTelemetryData instance for a vehicle with nbWheels
319 @see PxVehicleNWTelemetryDataFree
320 */
321 static PxVehicleTelemetryData* allocate(const PxU32 nbWheels);
322
323 /**
324 \brief Free a PxVehicleNWTelemetryData instance for a vehicle.
325 @see PxVehicleNWTelemetryDataAllocate
326 */
327 void free();
328
329 /**
330 \brief Set up all the graphs so that they are ready to record data.
331 */
332 void setup
333 (const PxReal graphSizeX, const PxReal graphSizeY,
334 const PxReal engineGraphPosX, const PxReal engineGraphPosY,
335 const PxReal* const wheelGraphPosX, const PxReal* const wheelGraphPosY,
336 const PxVec3& backGroundColor, const PxVec3& lineColorHigh, const PxVec3& lineColorLow);
337
338 /**
339 \brief Clear the graphs of recorded data.
340 */
341 void clear();
342
343 /**
344 \brief Get the graph data for the engine
345 */
346 const PxVehicleGraph& getEngineGraph() const {return *mEngineGraph;}
347
348 /**
349 \brief Get the number of wheel graphs
350 */
351 PxU32 getNbWheelGraphs() const {return mNbActiveWheels;}
352
353 /**
354 \brief Get the graph data for the kth wheel
355 */
356 const PxVehicleGraph& getWheelGraph(const PxU32 k) const {return mWheelGraphs[k];}
357
358 /**
359 \brief Get the array of tire force application points so they can be rendered
360 */
361 const PxVec3* getTireforceAppPoints() const {return mTireforceAppPoints;}
362
363 /**
364 \brief Get the array of susp force application points so they can be rendered
365 */
366 const PxVec3* getSuspforceAppPoints() const {return mSuspforceAppPoints;}
367
368private:
369
370 /**
371 \brief Graph data for engine.
372 Used for storing single timeslices of debug data for engine graph.
373 @see PxVehicleGraph
374 */
375 PxVehicleGraph* mEngineGraph;
376
377 /**
378 \brief Graph data for each wheel.
379 Used for storing single timeslices of debug data for wheel graphs.
380 @see PxVehicleGraph
381 */
382 PxVehicleGraph* mWheelGraphs;
383
384 /**
385 \brief Application point of tire forces.
386 */
387 PxVec3* mTireforceAppPoints;
388
389 /**
390 \brief Application point of susp forces.
391 */
392 PxVec3* mSuspforceAppPoints;
393
394 /**
395 \brief Total number of active wheels
396 */
397 PxU32 mNbActiveWheels;
398
399 PxU32 mPad[3];
400
401private:
402
403 PxVehicleTelemetryData(){}
404 ~PxVehicleTelemetryData(){}
405};
406
407PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleTelemetryData) & 15));
408
409#endif //PX_DEBUG_VEHICLE_ON
410
411//#endif // PX_DEBUG_VEHICLE_ON
412
413#if !PX_DOXYGEN
414} // namespace physx
415#endif
416
417/** @} */
418#endif //PX_VEHICLE_UTILSTELEMETRY_H
419

source code of qtquick3dphysics/src/3rdparty/PhysX/include/vehicle/PxVehicleUtilTelemetry.h