| 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_UPDATE_H | 
| 31 | #define PX_VEHICLE_UPDATE_H | 
| 32 | /** \addtogroup vehicle | 
| 33 |   @{ | 
| 34 | */ | 
| 35 |  | 
| 36 | #include "vehicle/PxVehicleSDK.h" | 
| 37 | #include "vehicle/PxVehicleTireFriction.h" | 
| 38 | #include "foundation/PxSimpleTypes.h" | 
| 39 | #include "foundation/PxMemory.h" | 
| 40 | #include "foundation/PxTransform.h" | 
| 41 | #include "PxBatchQueryDesc.h" | 
| 42 |  | 
| 43 | #if !PX_DOXYGEN | 
| 44 | namespace physx | 
| 45 | { | 
| 46 | #endif | 
| 47 |  | 
| 48 | 	class PxBatchQuery; | 
| 49 | 	class PxContactModifyPair; | 
| 50 | 	class PxVehicleWheels; | 
| 51 | 	class PxVehicleDrivableSurfaceToTireFrictionPairs; | 
| 52 | 	class PxVehicleTelemetryData; | 
| 53 |  | 
| 54 | 	/** | 
| 55 | 	\brief Structure containing data describing the non-persistent state of each suspension/wheel/tire unit. | 
| 56 | 	This structure is filled out in PxVehicleUpdates and PxVehicleUpdateSingleVehicleAndStoreTelemetryData | 
| 57 | 	@see PxVehicleUpdates, PxVehicleUpdateSingleVehicleAndStoreTelemetryData | 
| 58 | 	*/ | 
| 59 | 	struct PxWheelQueryResult | 
| 60 | 	{ | 
| 61 | 		PxWheelQueryResult() | 
| 62 | 		{ | 
| 63 | 			PxMemZero(dest: this, count: sizeof(PxWheelQueryResult)); | 
| 64 | 			isInAir=true; | 
| 65 | 			tireSurfaceType = PxU32(PxVehicleDrivableSurfaceType::eSURFACE_TYPE_UNKNOWN); | 
| 66 | 			localPose = PxTransform(PxIdentity); | 
| 67 | 		} | 
| 68 |  | 
| 69 | 		/** | 
| 70 | 		\brief Start point of suspension line raycast/sweep used in the raycast/sweep completed immediately before PxVehicleUpdates. | 
| 71 | 		\note If no raycast/sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then (0,0,0) is stored. | 
| 72 | 		@see PxVehicleSuspensionRaycasts, PxVehicleSuspensionRaycasts | 
| 73 | 		*/ | 
| 74 | 		PxVec3 suspLineStart; | 
| 75 |  | 
| 76 | 		/** | 
| 77 | 		\brief Directions of suspension line raycast/sweep used in the raycast/sweep completed immediately before PxVehicleUpdates. | 
| 78 | 		\note If no raycast/sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then (0,0,0) is stored. | 
| 79 | 		@see PxVehicleSuspensionRaycasts, PxVehicleSuspensionRaycasts | 
| 80 | 		*/ | 
| 81 | 		PxVec3 suspLineDir; | 
| 82 |  | 
| 83 | 		/** | 
| 84 | 		\brief Lengths of suspension line raycast/sweep used in raycast/sweep completed immediately before PxVehicleUpdates. | 
| 85 | 		\note If no raycast/sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then 0 is stored. | 
| 86 | 		@see PxVehicleSuspensionRaycasts, PxVehicleSuspensionRaycasts | 
| 87 | 		*/ | 
| 88 | 		PxReal suspLineLength; | 
| 89 |  | 
| 90 | 		/** | 
| 91 | 		\brief If suspension travel limits forbid the wheel from touching the drivable surface then isInAir is true. | 
| 92 | 		\note If the wheel can be placed on the contact plane of the most recent suspension line raycast/sweep then isInAir is false. | 
| 93 | 		\note If #PxVehicleWheelsSimFlag::eLIMIT_SUSPENSION_EXPANSION_VELOCITY is set, then isInAir will also be true if the suspension | 
| 94 | 		force is not large enough to expand to the target length in the given simulation time step. | 
| 95 | 		\note If no raycast/sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then isInAir | 
| 96 | 		is computed using the contact plane that was hit by the most recent suspension line raycast/sweep. | 
| 97 | 		*/ | 
| 98 | 		bool isInAir; | 
| 99 |  | 
| 100 | 		/** | 
| 101 | 		\brief PxActor instance of the driving surface under the corresponding vehicle wheel. | 
| 102 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then tireContactActor is NULL. | 
| 103 | 		\note If no raycast/sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then NULL is stored. | 
| 104 | 		*/ | 
| 105 | 		PxActor* tireContactActor; | 
| 106 |  | 
| 107 | 		/** | 
| 108 | 		\brief PxShape instance of the driving surface under the corresponding vehicle wheel. | 
| 109 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then tireContactShape is NULL. | 
| 110 | 		\note If no raycast/sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then NULL is stored. | 
| 111 | 		*/ | 
| 112 | 		PxShape* tireContactShape; | 
| 113 |  | 
| 114 | 		/** | 
| 115 | 		\brief PxMaterial instance of the driving surface under the corresponding vehicle wheel. | 
| 116 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then tireSurfaceMaterial is NULL. | 
| 117 | 		\note If no raycast/sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then NULL is stored. | 
| 118 | 		*/	 | 
| 119 | 		const PxMaterial* tireSurfaceMaterial; | 
| 120 |  | 
| 121 | 		/** | 
| 122 | 		\brief Surface type integer that corresponds to the mapping between tireSurfaceMaterial and integer as | 
| 123 | 		described in PxVehicleDrivableSurfaceToTireFrictionPairs. | 
| 124 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then tireSurfaceType is  | 
| 125 | 		PxVehicleDrivableSurfaceType::eSURFACE_TYPE_UNKNOWN. | 
| 126 | 		\note If no raycast/sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then  | 
| 127 | 		PxVehicleDrivableSurfaceType::eSURFACE_TYPE_UNKNOWN is stored. | 
| 128 | 		@see PxVehicleDrivableSurfaceToTireFrictionPairs | 
| 129 | 		*/	 | 
| 130 | 		PxU32 tireSurfaceType; | 
| 131 |  | 
| 132 | 		/** | 
| 133 | 		\brief Point on the drivable surface hit by the most recent suspension raycast or sweep. | 
| 134 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then the contact point is (0,0,0). | 
| 135 | 		\note If no raycast or sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then (0,0,0) is stored. | 
| 136 | 		*/ | 
| 137 | 		PxVec3 tireContactPoint; | 
| 138 |  | 
| 139 | 		/** | 
| 140 | 		\brief Normal on the drivable surface at the hit point of the most recent suspension raycast or sweep. | 
| 141 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then the contact normal is (0,0,0). | 
| 142 | 		\note If no raycast or sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then (0,0,0) is stored. | 
| 143 | 		*/ | 
| 144 | 		PxVec3 tireContactNormal; | 
| 145 |  | 
| 146 | 		/** | 
| 147 | 		\brief Friction experienced by the tire for the combination of tire type and surface type after accounting  | 
| 148 | 		for the friction vs slip graph. | 
| 149 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then the tire friction is 0. | 
| 150 | 		\note If no raycast or sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the  | 
| 151 | 		stored tire friction is the value computed in PxVehicleUpdates that immediately followed the last raycast or sweep. | 
| 152 | 		@see PxVehicleDrivableSurfaceToTireFrictionPairs, PxVehicleTireData | 
| 153 | 		*/	 | 
| 154 | 		PxReal tireFriction; | 
| 155 |  | 
| 156 | 		/** | 
| 157 | 		\brief Compression of the suspension spring. | 
| 158 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then the jounce is -PxVehicleSuspensionData.mMaxDroop | 
| 159 | 		The jounce can never exceed PxVehicleSuspensionData.mMaxCompression. Positive values result when the suspension is compressed from  | 
| 160 | 		the rest position, while negative values mean the suspension is elongated from the rest position. | 
| 161 | 		\note If no raycast or sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the  | 
| 162 | 		suspension compression is computed using the contact plane that was hit by the most recent suspension line raycast or sweep. | 
| 163 | 		*/	 | 
| 164 | 		PxReal suspJounce; | 
| 165 |  | 
| 166 | 		/** | 
| 167 | 		\brief Magnitude of force applied by the suspension spring along the direction of suspension travel. | 
| 168 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then the force is 0 | 
| 169 | 		\note If no raycast or sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the  | 
| 170 | 		suspension spring force is computed using the contact plane that was hit by the most recent suspension line raycast or sweep. | 
| 171 | 		@see PxVehicleWheelsSimData::getSuspTravelDirection | 
| 172 | 		*/ | 
| 173 | 		PxReal suspSpringForce; | 
| 174 |  | 
| 175 | 		/** | 
| 176 | 		\brief Forward direction of the wheel/tire accounting for steer/toe/camber angle projected on to the contact plane of the drivable surface. | 
| 177 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then tireLongitudinalDir is (0,0,0) | 
| 178 | 		\note If no raycast or sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the  | 
| 179 | 		tire longitudinal direction is computed using the contact plane that was hit by the most recent suspension line raycast or sweep. | 
| 180 | 		*/ | 
| 181 | 		PxVec3 tireLongitudinalDir; | 
| 182 |  | 
| 183 | 		/** | 
| 184 | 		\brief Lateral direction of the wheel/tire accounting for steer/toe/camber angle projected on to the contact plan of the drivable surface. | 
| 185 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then tireLateralDir is (0,0,0) | 
| 186 | 		\note If no raycast or sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the  | 
| 187 | 		tire lateral direction is computed using the contact plane that was hit by the most recent suspension line raycast or sweep. | 
| 188 | 		*/ | 
| 189 | 		PxVec3 tireLateralDir; | 
| 190 |  | 
| 191 | 		/** | 
| 192 | 		\brief Longitudinal slip of the tire. | 
| 193 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then longitudinalSlip is 0.0 | 
| 194 | 		\note The longitudinal slip is approximately (w*r - vz) / PxAbs(vz) where w is the angular speed of the wheel, r is the radius of the wheel, and  | 
| 195 | 		vz component of rigid body velocity computed at the wheel base along the longitudinal direction of the tire. | 
| 196 | 		\note If no raycast or sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the  | 
| 197 | 		tire longitudinal slip is computed using the contact plane that was hit by the most recent suspension line raycast or sweep. | 
| 198 | 		*/	 | 
| 199 | 		PxReal longitudinalSlip; | 
| 200 |  | 
| 201 | 		/** | 
| 202 | 		\brief Lateral slip of the tire. | 
| 203 | 		\note If suspension travel limits forbid the wheel from touching the drivable surface then lateralSlip is 0.0 | 
| 204 | 		\note The lateral slip angle is approximately PxAtan(vx / PxAbs(vz)) where vx and vz are the components of rigid body velocity at the wheel base  | 
| 205 | 		along the wheel's lateral and longitudinal directions, respectively. | 
| 206 | 		\note If no raycast or sweep for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the  | 
| 207 | 		tire lateral slip is computed using the contact plane that was hit by the most recent suspension line raycast or sweep. | 
| 208 | 		*/	 | 
| 209 | 		PxReal lateralSlip; | 
| 210 |  | 
| 211 | 		/** | 
| 212 | 		\brief Steer angle of the wheel about the "up" vector accounting for input steer and toe and, if applicable, Ackermann steer correction. | 
| 213 | 		@see PxVehicleWheelData::mToeAngle | 
| 214 | 		*/	 | 
| 215 | 		PxReal steerAngle; | 
| 216 |  | 
| 217 | 		/** | 
| 218 | 		\brief Local pose of the wheel. | 
| 219 | 		*/ | 
| 220 | 		PxTransform localPose; | 
| 221 | 	}; | 
| 222 |  | 
| 223 | 	struct PxVehicleWheelQueryResult | 
| 224 | 	{ | 
| 225 | 		/** | 
| 226 | 		\brief Pointer to an PxWheelQueryResult buffer of length nbWheelQueryResults | 
| 227 | 		The wheelQueryResults buffer must persist until the end of PxVehicleUpdates | 
| 228 | 		A NULL pointer is permitted. | 
| 229 | 		The wheelQueryResults buffer is left unmodified in PxVehicleUpdates for vehicles with sleeping rigid bodies  | 
| 230 | 		whose control inputs indicate they should remain inert. | 
| 231 | 		@see PxVehicleUpdates | 
| 232 | 		*/ | 
| 233 | 		PxWheelQueryResult* wheelQueryResults; | 
| 234 |  | 
| 235 | 		/** | 
| 236 | 		\brief The length of the wheelQueryResults buffer.  This value corresponds to the  | 
| 237 | 		number of wheels in the associated vehicle in PxVehicleUpdates. | 
| 238 | 		*/ | 
| 239 | 		PxU32 nbWheelQueryResults; | 
| 240 | 	}; | 
| 241 |  | 
| 242 | 	/** | 
| 243 | 	\brief Structure containing data that is computed for a wheel during concurrent calls to PxVehicleUpdates or  | 
| 244 | 	PxVehicleUpdateSingleVehicleAndStoreTelemetryData but which cannot be safely concurrently applied.  | 
| 245 |  | 
| 246 | 	@see PxVehicleUpdates, PxVehicleUpdateSingleVehicleAndStoreTelemetryData, PxVehiclePostUpdates, PxVehicleConcurrentUpdate | 
| 247 | 	*/ | 
| 248 | 	struct PxVehicleWheelConcurrentUpdateData | 
| 249 | 	{ | 
| 250 | 		friend class PxVehicleUpdate; | 
| 251 |  | 
| 252 | 		PxVehicleWheelConcurrentUpdateData() | 
| 253 | 			: localPose(PxTransform(PxIdentity)), | 
| 254 | 			  hitActor(NULL), | 
| 255 | 			  hitActorForce(PxVec3(0,0,0)), | 
| 256 | 			  hitActorForcePosition(PxVec3(0,0,0)) | 
| 257 | 		{ | 
| 258 | 		} | 
| 259 |  | 
| 260 | 	private: | 
| 261 |  | 
| 262 | 		PxTransform localPose; | 
| 263 | 		PxRigidDynamic* hitActor; | 
| 264 | 		PxVec3 hitActorForce; | 
| 265 | 		PxVec3 hitActorForcePosition; | 
| 266 | 	}; | 
| 267 |  | 
| 268 | 	/** | 
| 269 | 	\brief Structure containing data that is computed for a vehicle and its wheels during concurrent calls to PxVehicleUpdates or | 
| 270 | 	PxVehicleUpdateSingleVehicleAndStoreTelemetryData but which cannot be safely concurrently applied.  | 
| 271 |  | 
| 272 | 	@see PxVehicleUpdates, PxVehicleUpdateSingleVehicleAndStoreTelemetryData, PxVehiclePostUpdates, PxVehicleWheelConcurrentUpdateData | 
| 273 | 	*/ | 
| 274 |  | 
| 275 | 	struct PxVehicleConcurrentUpdateData | 
| 276 | 	{ | 
| 277 | 		friend class PxVehicleUpdate; | 
| 278 |  | 
| 279 | 		PxVehicleConcurrentUpdateData() | 
| 280 | 			: concurrentWheelUpdates(NULL), | 
| 281 | 			  nbConcurrentWheelUpdates(0), | 
| 282 | 			  linearMomentumChange(PxVec3(0,0,0)), | 
| 283 | 			  angularMomentumChange(PxVec3(0,0,0)), | 
| 284 | 			  staySleeping(false), | 
| 285 | 			  wakeup(false) | 
| 286 | 		{ | 
| 287 | 		} | 
| 288 |  | 
| 289 | 		/** | 
| 290 | 		\brief Pointer to an PxVehicleWheelConcurrentUpdate buffer of length nbConcurrentWheelUpdates | 
| 291 | 		The concurrentWheelUpdates buffer must persist until the end of PxVehiclePostUpdates | 
| 292 | 		A NULL pointer is not permitted. | 
| 293 | 		@see PxVehicleUpdates, PxVehiclePostUpdates | 
| 294 | 		*/ | 
| 295 | 		PxVehicleWheelConcurrentUpdateData* concurrentWheelUpdates; | 
| 296 |  | 
| 297 | 		/** | 
| 298 | 		\brief The length of the concurrentWheelUpdates buffer.  This value corresponds to the  | 
| 299 | 		number of wheels in the associated vehicle passed to PxVehicleUpdates. | 
| 300 | 		*/ | 
| 301 | 		PxU32 nbConcurrentWheelUpdates; | 
| 302 |  | 
| 303 | 	private: | 
| 304 |  | 
| 305 | 		PxVec3 linearMomentumChange; | 
| 306 | 		PxVec3 angularMomentumChange; | 
| 307 | 		bool staySleeping; | 
| 308 | 		bool wakeup; | 
| 309 | 	}; | 
| 310 |  | 
| 311 | 	/** | 
| 312 | 	\brief Perform raycasts for all suspension lines for all vehicles. | 
| 313 |  | 
| 314 | 	\param[in] batchQuery is a PxBatchQuery instance used to specify shader data and functions for the raycast scene queries. | 
| 315 |  | 
| 316 | 	\param[in] nbVehicles is the number of vehicles in the vehicles array. | 
| 317 |  | 
| 318 | 	\param[in] vehicles is an array of all vehicles that are to have a raycast issued from each wheel.  | 
| 319 |  | 
| 320 | 	\param[in] nbSceneQueryResults must be greater than or equal to the total number of wheels of all the vehicles in the vehicles array; that is, | 
| 321 | 	sceneQueryResults must have dimensions large enough for one raycast hit result per wheel for all the vehicles in the vehicles array. | 
| 322 |  | 
| 323 | 	\param[in] sceneQueryResults must persist without being overwritten until the end of the next PxVehicleUpdates call.  | 
| 324 |  | 
| 325 | 	\param[in] vehiclesToRaycast is an array of bools of length nbVehicles that is used to decide if raycasts will be performed for the corresponding vehicle | 
| 326 | 	in the vehicles array. If vehiclesToRaycast[i] is true then suspension line raycasts will be performed for  vehicles[i].  If vehiclesToRaycast[i] is  | 
| 327 | 	false then suspension line raycasts will not be performed for vehicles[i].   | 
| 328 |  | 
| 329 | 	\note If vehiclesToRaycast is NULL then raycasts are performed for all vehicles in the vehicles array. | 
| 330 |  | 
| 331 | 	\note If vehiclesToRaycast[i] is false then the vehicle stored in vehicles[i] will automatically use the raycast or sweep hit planes recorded by the most recent | 
| 332 | 	suspension sweeps or raycasts for that vehicle.  For vehicles far from the camera or not visible on the screen it can be  | 
| 333 | 	optimal to only perform suspension line raycasts every Nth update rather than every single update.  The accuracy of the cached contact plane | 
| 334 | 	naturally diminishes as N increase, meaning that wheels might start to hover or intersect the ground for large values of N or even with values close to 1 in | 
| 335 | 	conjunction with large vehicle speeds and/or geometry that has low spatial coherence. | 
| 336 |  | 
| 337 | 	\note Calling setToRestState invalidates any cached hit planes. Prior to calling PxVehicleUpdates each vehicle needs to perform suspension line raycasts  | 
| 338 | 	or sweeps at least once after instantiation and at least once after calling setToRestState. | 
| 339 |  | 
| 340 | 	\note Each raycast casts along the suspension travel direction from the position of the top of the wheel at maximum suspension compression | 
| 341 | 	to the position of the base of the wheel at maximum droop.  Raycasts that start inside a PxShape are subsequently ignored by the | 
| 342 | 	corresponding vehicle. | 
| 343 |  | 
| 344 | 	\note Only blocking hits are supported (PxQueryHitType::eBLOCK). | 
| 345 |  | 
| 346 | 	@see PxVehicleDrive4W::setToRestState, PxVehicleDriveNW::setToRestState, PxVehicleDriveTank::setToRestState, PxVehicleNoDrive::setToRestState | 
| 347 | 	*/ | 
| 348 | 	void PxVehicleSuspensionRaycasts | 
| 349 | 		(PxBatchQuery* batchQuery,  | 
| 350 | 		 const PxU32 nbVehicles, PxVehicleWheels** vehicles, | 
| 351 | 		 const PxU32 nbSceneQueryResults, PxRaycastQueryResult* sceneQueryResults,  | 
| 352 | 		 const bool* vehiclesToRaycast = NULL); | 
| 353 |  | 
| 354 |  | 
| 355 | 	/** | 
| 356 | 	\brief Perform sweeps for all suspension lines for all vehicles.   | 
| 357 |  | 
| 358 | 	\param[in] batchQuery is a PxBatchQuery instance used to specify shader data and functions for the sweep scene queries. | 
| 359 |  | 
| 360 | 	\param[in] nbVehicles is the number of vehicles in the vehicles array. | 
| 361 |  | 
| 362 | 	\param[in] vehicles is an array of all vehicles that are to have a sweep issued from each wheel.  | 
| 363 |  | 
| 364 | 	\param[in] nbSceneQueryResults must be greater than or equal to the total number of wheels of all the vehicles in the vehicles array; that is, | 
| 365 | 	sceneQueryResults must have dimensions large enough for one sweep hit result per wheel for all the vehicles in the vehicles array. | 
| 366 |  | 
| 367 | 	\param[in] sceneQueryResults must persist without being overwritten until the end of the next PxVehicleUpdates call.  | 
| 368 |  | 
| 369 | 	\param[in] nbHitsPerQuery is the maximum numbers of hits that will be returned for each query.   | 
| 370 |  | 
| 371 | 	\param[in] vehiclesToSweep is an array of bools of length nbVehicles that is used to decide if sweeps will be performed for the corresponding vehicle | 
| 372 | 	in the vehicles array. If vehiclesToSweep[i] is true then suspension sweeps will be performed for vehicles[i].  If vehiclesToSweep[i] is  | 
| 373 | 	false then suspension sweeps will not be performed for vehicles[i].   | 
| 374 |  | 
| 375 | 	\param[in] sweepWidthScale scales the geometry of the wheel used in the sweep.  Values < 1 result in a thinner swept wheel, while values > 1 result in a fatter swept wheel. | 
| 376 |  | 
| 377 | 	\param[in] sweepRadiusScale scales the geometry of the wheel used in the sweep.  Values < 1 result in a larger swept wheel, while values > 1 result in a smaller swept wheel. | 
| 378 |  | 
| 379 | 	\param[in] sweepInflation	Inflation parameter for sweeps. This is the inflation parameter from PxScene::sweep(). It inflates the shape and makes it rounder, | 
| 380 | 	which gives smoother and more reliable normals. | 
| 381 |  | 
| 382 | 	\note If vehiclesToSweep is NULL then sweeps are performed for all vehicles in the vehicles array. | 
| 383 |  | 
| 384 | 	\note If vehiclesToSweep[i] is false then the vehicle stored in vehicles[i] will automatically use the most recent sweep or raycast hit planes  | 
| 385 | 	recorded by the most recent suspension sweeps or raycasts for that vehicle.  For vehicles far from the camera or not visible on the screen it can be  | 
| 386 | 	optimal to only perform suspension queries every Nth update rather than every single update.  The accuracy of the cached contact plane | 
| 387 | 	naturally diminishes as N increase, meaning that wheels might start to hover or intersect the ground for large values of N or even with values close to 1 in | 
| 388 | 	conjunction with large vehicle speeds and/or geometry that has low spatial coherence. | 
| 389 |  | 
| 390 | 	\note Calling setToRestState invalidates any cached hit planes. Prior to calling PxVehicleUpdates each vehicle needs to perform suspension raycasts  | 
| 391 | 	or sweeps at least once after instantiation and at least once after calling setToRestState. | 
| 392 |  | 
| 393 | 	\note Each sweep casts the wheel's shape along the suspension travel direction from the position of the top of the wheel at maximum suspension compression | 
| 394 | 	to the position of the base of the wheel at maximum droop.  Sweeps that start inside a PxShape are subsequently ignored by the | 
| 395 | 	corresponding vehicle.  | 
| 396 | 	 | 
| 397 | 	\note A scale can be applied to the shape so that a modified shape is swept through the scene.  The parameters sweepWidthScale and sweepRadiusScale scale the  | 
| 398 | 	swept wheel shape in the width and radial directions.  It is sometimes a good idea to sweep a thinner wheel to allow contact with other dynamic actors to be resolved  | 
| 399 | 	first before attempting to drive on them.  | 
| 400 |  | 
| 401 | 	\note Blocking hits (PxQueryHitType::eBLOCK) and non-blocking hits (PxQueryHitType::TOUCH) are supported.  If the pre-and post-filter functions of the PxBatchQuery  | 
| 402 | 	instance are set up to return blocking hits it is recommended to set nbHitsPerQuery = 1.  If the filter functions returns touch hits then it is recommended to  | 
| 403 | 	set nbHitsPerQuery > 1.  The exact value depends on the expected complexity of the geometry that lies under the wheel.  For complex geometry, especially with dynamic  | 
| 404 | 	objects, it is recommended to use non-blocking hits.  The vehicle update function will analyze all returned hits and choose the most appropriate using the thresholds  | 
| 405 | 	set in PxVehicleSetSweepHitRejectionAngles. | 
| 406 |  | 
| 407 | 	@see PxVehicleDrive4W::setToRestState, PxVehicleDriveNW::setToRestState, PxVehicleDriveTank::setToRestState, PxVehicleNoDrive::setToRestState | 
| 408 |  | 
| 409 | 	@see PxBatchQuery::sweep PxScene::sweep() | 
| 410 |  | 
| 411 | 	@see PxVehicleSetSweepHitRejectionAngles | 
| 412 | 	*/ | 
| 413 | 	void PxVehicleSuspensionSweeps | 
| 414 | 		(PxBatchQuery* batchQuery,  | 
| 415 | 		 const PxU32 nbVehicles, PxVehicleWheels** vehicles,  | 
| 416 | 		 const PxU32 nbSceneQueryResults, PxSweepQueryResult* sceneQueryResults,  const PxU16 nbHitsPerQuery,  | 
| 417 | 		 const bool* vehiclesToSweep = NULL, | 
| 418 | 		 const PxF32 sweepWidthScale = 1.0f, const PxF32 sweepRadiusScale = 1.0f, const PxF32 sweepInflation = 0.0f); | 
| 419 |  | 
| 420 | 	/** | 
| 421 | 	\brief A function called from PxContactModifyCallback::onContactModify.  The function determines if rigid body contact points | 
| 422 | 	recorded for the wheel's PxShape are likely to be duplicated and resolved by the wheel's suspension raycast.   Contact points that will be | 
| 423 | 	resolved by the suspension are ignored.  Contact points that are accepted (rather than ignored) are modified to account for the effect of the | 
| 424 | 	suspension geometry and the angular speed of the wheel. | 
| 425 |  | 
| 426 | 	\param[in] vehicle is a reference to the PxVehicleWheels instance that owns the wheel | 
| 427 |  | 
| 428 | 	\param[in] wheelId is the id of the wheel | 
| 429 |  | 
| 430 | 	\param[in] wheelTangentVelocityMultiplier determines the amount of wheel angular velocity that is used to modify the target relative velocity of the contact. | 
| 431 | 	The target relative velocity is modified by adding a vector equal to the tangent velocity of the rotating wheel at the contact point and scaled by | 
| 432 | 	wheelTangentVelocityMultiplier.  The value of wheelTangentVelocityMultiplier is limited to the range (0,1).  Higher values mimic higher values of friction | 
| 433 | 	and tire load, while lower values mimic lower values of friction and tire load. | 
| 434 |  | 
| 435 | 	\param[in] maxImpulse determines the maximum impulse strength that the contacts can apply when a wheel is in contact with a PxRigidDynamic.  This value is ignored for | 
| 436 | 	contacts with PxRigidStatic instances. | 
| 437 |  | 
| 438 | 	\param[in,out] contactModifyPair describes the set of contacts involving the PxShape of the specified wheel and one other shape.  The contacts in the contact set are | 
| 439 | 	ignored or modified as required. | 
| 440 |  | 
| 441 | 	\note[in] Contact points are accepted or rejected using the threshold angles specified in the function PxVehicleSetSweepHitRejectionAngles. | 
| 442 |  | 
| 443 | 	\note If a contact point is not rejected it is modified to account for the wheel rotation speed. | 
| 444 |  | 
| 445 | 	\note Set maxImpulse to PX_MAX_F32 to allow any impulse value to be applied. | 
| 446 |  | 
| 447 | 	\note Reduce maxImpulse if the wheels are frequently colliding with light objects with mass much less than the vehicle's mass. | 
| 448 | 	Reducing this value encourages numerical stability. | 
| 449 |  | 
| 450 | 	@see PxContactModifyCallback::onContactModify, PxVehicleSetSweepHitRejectionAngles | 
| 451 | 	*/ | 
| 452 | 	PxU32 PxVehicleModifyWheelContacts | 
| 453 | 		(const PxVehicleWheels& vehicle, const PxU32 wheelId, | 
| 454 | 		const PxF32 wheelTangentVelocityMultiplier, const PxReal maxImpulse, | 
| 455 | 		PxContactModifyPair& contactModifyPair); | 
| 456 |  | 
| 457 |  | 
| 458 | 	/** | 
| 459 | 	\brief Update an array of vehicles by either applying an acceleration to the rigid body actor associated with  | 
| 460 | 	each vehicle or by an immediate update of the velocity of the actor. | 
| 461 | 	 | 
| 462 | 	\note The update mode (acceleration or velocity change) can be selected with PxVehicleSetUpdateMode. | 
| 463 |  | 
| 464 | 	\param[in] timestep is the timestep of the update | 
| 465 |  | 
| 466 | 	\param[in] gravity is the value of gravitational acceleration | 
| 467 |  | 
| 468 | 	\param[in] vehicleDrivableSurfaceToTireFrictionPairs describes the mapping between each PxMaterial ptr and an integer representing a  | 
| 469 | 	surface type. It also stores the friction value for each combination of surface and tire type. | 
| 470 |  | 
| 471 | 	\param[in] nbVehicles is the number of vehicles pointers in the vehicles array | 
| 472 |  | 
| 473 | 	\param[in,out] vehicles is an array of length nbVehicles containing all vehicles to be updated by the specified timestep | 
| 474 |  | 
| 475 | 	\param[out] vehicleWheelQueryResults is an array of length nbVehicles storing the wheel query results of each corresponding vehicle and wheel in the  | 
| 476 | 	vehicles array.  A NULL pointer is permitted.   | 
| 477 |  | 
| 478 | 	\param[out] vehicleConcurrentUpdates is an array of length nbVehicles. It is only necessary to specify vehicleConcurrentUpdates if PxVehicleUpdates is  | 
| 479 | 	called concurrently (also concurrently with PxVehicleUpdateSingleVehicleAndStoreTelemetryData). The element vehicleConcurrentUpdates[i] of the array  | 
| 480 | 	stores data that is computed for vehicle[i] during PxVehicleUpdates but which cannot be safely written when concurrently called. The data computed and  | 
| 481 | 	stored in vehicleConcurrentUpdates must be passed to PxVehiclePostUpdates, where it is applied to all relevant actors in sequence. A NULL pointer is permitted. | 
| 482 | 	 | 
| 483 | 	\note The vehicleWheelQueryResults buffer must persist until the end of PxVehicleUpdates. | 
| 484 | 	 | 
| 485 | 	\note The vehicleWheelQueryResults buffer is left unmodified for vehicles with sleeping rigid bodies whose control inputs indicate they should remain inert. | 
| 486 |  | 
| 487 | 	\note If PxVehicleUpdates is called concurrently then vehicleConcurrentUpdates must be specified.  Do not specify vehicleConcurrentUpdates if PxVehicleUpdates | 
| 488 | 	is not called concurrently. | 
| 489 |  | 
| 490 | 	\note The vehicleConcurrentUpdates buffer must persist until the end of PxVehiclePostUpdate. | 
| 491 |  | 
| 492 | 	\note If any vehicle has one or more disabled wheels (PxVehicleWheelsSimData::disableWheel) then the disabled wheels must not be associated  | 
| 493 | 	with a PxShape (PxVehicleWheelsSimData::setWheelShapeMapping); the differential of the vehicle must be configured so that no drive torque  | 
| 494 | 	is delivered to a disabled wheel; and the wheel must have zero rotation speed (PxVehicleWheelsDynData::setWheelRotationSpeed) | 
| 495 |  | 
| 496 | 	\note Concurrent calls to PxVehicleUpdates and PxVehicleUpdateSingleVehicleAndStoreTelemetryData are permitted if the parameter | 
| 497 | 	vehicleConcurrentUpdates is used. | 
| 498 |  | 
| 499 | 	@see PxVehicleSetUpdateMode, PxVehicleWheelsSimData::disableWheel, PxVehicleWheelsSimData::setWheelShapeMapping, PxVehicleWheelsDynData::setWheelRotationSpeed, | 
| 500 | 	PxVehiclePostUpdates | 
| 501 | 	*/ | 
| 502 | 	void PxVehicleUpdates( | 
| 503 | 		const PxReal timestep, const PxVec3& gravity,  | 
| 504 | 		const PxVehicleDrivableSurfaceToTireFrictionPairs& vehicleDrivableSurfaceToTireFrictionPairs,  | 
| 505 | 		const PxU32 nbVehicles, PxVehicleWheels** vehicles, PxVehicleWheelQueryResult* vehicleWheelQueryResults, PxVehicleConcurrentUpdateData* vehicleConcurrentUpdates = NULL); | 
| 506 |  | 
| 507 |  | 
| 508 | 	/** | 
| 509 | 	\brief Apply actor changes that were computed in concurrent calls to PxVehicleUpdates or PxVehicleUpdateSingleVehicleAndStoreTelemetryData but  | 
| 510 | 	which could not be safely applied due to the concurrency. | 
| 511 |  | 
| 512 | 	\param[in] vehicleConcurrentUpdates is an array of length nbVehicles where vehicleConcurrentUpdates[i] contains data describing actor changes that  | 
| 513 | 	were computed for vehicles[i] during concurrent calls to PxVehicleUpdates or PxVehicleUpdateSingleVehicleAndStoreTelemetryData. | 
| 514 |  | 
| 515 | 	\param[in] nbVehicles is the number of vehicles pointers in the vehicles array | 
| 516 |  | 
| 517 | 	\param[in,out] vehicles is an array of length nbVehicles containing all vehicles that were partially updated in concurrent calls to PxVehicleUpdates or | 
| 518 | 	PxVehicleUpdateSingleVehicleAndStoreTelemetryData. | 
| 519 |  | 
| 520 | 	@see PxVehicleUpdates, PxVehicleUpdateSingleVehicleAndStoreTelemetryData | 
| 521 | 	*/ | 
| 522 | 	void PxVehiclePostUpdates( | 
| 523 | 		const PxVehicleConcurrentUpdateData* vehicleConcurrentUpdates, const PxU32 nbVehicles, PxVehicleWheels** vehicles); | 
| 524 |  | 
| 525 |  | 
| 526 | 	/** | 
| 527 | 	\brief Shift the origin of vehicles by the specified vector. | 
| 528 |  | 
| 529 | 	Call this method to adjust the internal data structures of vehicles to reflect the shifted origin location | 
| 530 | 	(the shift vector will get subtracted from all world space spatial data). | 
| 531 |  | 
| 532 | 	\note It is the user's responsibility to keep track of the summed total origin shift and adjust all input/output to/from PhysXVehicle accordingly. | 
| 533 |  | 
| 534 | 	\note This call will not automatically shift the PhysX scene and its objects. You need to call PxScene::shiftOrigin() seperately to keep the systems in sync. | 
| 535 |  | 
| 536 | 	\param[in] shift is the translation vector to shift the origin by. | 
| 537 |  | 
| 538 | 	\param[in] nbVehicles is the number of vehicles in the vehicles array. | 
| 539 |  | 
| 540 | 	\param[in,out] vehicles is an array of all vehicles that should be updated to map to the new scene origin. | 
| 541 | 	*/ | 
| 542 | 	void PxVehicleShiftOrigin(const PxVec3& shift, const PxU32 nbVehicles, PxVehicleWheels** vehicles); | 
| 543 |  | 
| 544 | #if PX_DEBUG_VEHICLE_ON | 
| 545 | 	/** | 
| 546 | 	\brief Update an single vehicle by either applying an acceleration to the rigid body actor associated with  | 
| 547 | 	each vehicle or by an immediate update of the velocity of the actor. Also record telemetry data from the  | 
| 548 | 	vehicle so that it may be visualized or queried. | 
| 549 | 	 | 
| 550 | 	\note The update mode (acceleration or velocity change) can be selected with PxVehicleSetUpdateMode. | 
| 551 |  | 
| 552 | 	\param[in] timestep is the timestep of the update | 
| 553 |  | 
| 554 | 	\param[in] gravity is the value of gravitational acceleration | 
| 555 |  | 
| 556 | 	\param[in] vehicleDrivableSurfaceToTireFrictionPairs describes the mapping between each PxMaterial ptr and an integer representing a  | 
| 557 | 	surface type. It also stores the friction value for each combination of surface and tire type. | 
| 558 |  | 
| 559 | 	\param[in,out] focusVehicle is the vehicle to be updated and have its telemetry data recorded | 
| 560 |  | 
| 561 | 	\param[out] vehicleWheelQueryResults is an array of length 1 storing the wheel query results of each wheel of the vehicle/  | 
| 562 | 	A NULL pointer is permitted.   | 
| 563 |  | 
| 564 | 	\param[out] telemetryData is the data structure used to record telemetry data during the update for later query or visualization | 
| 565 |  | 
| 566 | 	\param[out] vehicleConcurrentUpdates is an array of length 1. It is only necessary to specify vehicleConcurrentUpdates if | 
| 567 | 	PxVehicleUpdateSingleVehicleAndStoreTelemetryData is called concurrently (also concurrently with PxVehicleUpdates). The  | 
| 568 | 	PxVehicleConcurrentUpdateData struct stores data that cannot be safely written when concurrently called. The data computed and  | 
| 569 | 	stored in vehicleConcurrentUpdates must be passed to PxVehiclePostUpdates, where it is applied to the vehicle actor. A NULL  | 
| 570 | 	pointer is permitted. | 
| 571 |  | 
| 572 | 	\note The vehicleWheelQueryResults buffer must persist until the end of PxVehicleUpdateSingleVehicleAndStoreTelemetryData | 
| 573 |  | 
| 574 | 	\note The vehicleWheelQueryResults buffer is left unmodified for vehicles with sleeping rigid bodies whose control inputs indicate they should remain inert. | 
| 575 |  | 
| 576 | 	\note Concurrent calls to PxVehicleUpdateSingleVehicleAndStoreTelemetryData and PxVehicleUpdates are permitted if the parameter | 
| 577 | 	vehicleConcurrentUpdates is used. | 
| 578 |  | 
| 579 | 	@see PxVehiclePostUpdates, PxVehicleSetUpdateMode, PxVehicleTelemetryData | 
| 580 | 	*/ | 
| 581 | 	void PxVehicleUpdateSingleVehicleAndStoreTelemetryData | 
| 582 | 		(const PxReal timestep, const PxVec3& gravity,  | 
| 583 | 		 const PxVehicleDrivableSurfaceToTireFrictionPairs& vehicleDrivableSurfaceToTireFrictionPairs,  | 
| 584 | 		 PxVehicleWheels* focusVehicle, PxVehicleWheelQueryResult* vehicleWheelQueryResults,  | 
| 585 | 		 PxVehicleTelemetryData& telemetryData, | 
| 586 | 		 PxVehicleConcurrentUpdateData* vehicleConcurrentUpdates = NULL); | 
| 587 | #endif | 
| 588 |  | 
| 589 | #if !PX_DOXYGEN | 
| 590 | } // namespace physx | 
| 591 | #endif | 
| 592 |  | 
| 593 | /** @} */ | 
| 594 | #endif //PX_VEHICLE_UPDATE_H | 
| 595 |  |