Projekt_Grafika/dependencies/physx-4.1/source/physxvehicle/src/PxVehicleSuspWheelTire4.h

395 lines
13 KiB
C++

//
// 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_SUSPWHEELTIRE_H
#define PX_VEHICLE_SUSPWHEELTIRE_H
/** \addtogroup vehicle
@{
*/
#include "foundation/PxSimpleTypes.h"
#include "foundation/PxVec3.h"
#include "foundation/PxVec4.h"
#include "foundation/PxTransform.h"
#include "foundation/PxIO.h"
#include "geometry/PxGeometryHelpers.h"
#include "vehicle/PxVehicleComponents.h"
#include "PxBatchQueryDesc.h"
#include "PxVehicleSuspLimitConstraintShader.h"
#if !PX_DOXYGEN
namespace physx
{
#endif
class PxMaterial;
class PxShape;
class PxVehicleWheels4SimData
{
//= ATTENTION! =====================================================================================
// Changing the data layout of this class breaks the binary serialization format. See comments for
// PX_BINARY_SERIAL_VERSION. If a modification is required, please adjust the getBinaryMetaData
// function. If the modification is made on a custom branch, please change PX_BINARY_SERIAL_VERSION
// accordingly.
//==================================================================================================
public:
friend class PxVehicleUpdate;
PxVehicleWheels4SimData();
bool isValid(const PxU32 id) const;
static void getBinaryMetaData(PxOutputStream& stream);
public:
PX_FORCE_INLINE const PxVehicleSuspensionData& getSuspensionData(const PxU32 id) const {return mSuspensions[id];}
PX_FORCE_INLINE const PxVehicleWheelData& getWheelData(const PxU32 id) const {return mWheels[id];}
PX_FORCE_INLINE const PxVehicleTireData& getTireData(const PxU32 id) const {return mTires[id];}
PX_FORCE_INLINE const PxVec3& getSuspTravelDirection(const PxU32 id) const {return mSuspDownwardTravelDirections[id];}
PX_FORCE_INLINE const PxVec3& getSuspForceAppPointOffset(const PxU32 id) const {return mSuspForceAppPointOffsets[id];}
PX_FORCE_INLINE const PxVec3& getTireForceAppPointOffset(const PxU32 id) const {return mTireForceAppPointOffsets[id];}
PX_FORCE_INLINE const PxVec3& getWheelCentreOffset(const PxU32 id) const {return mWheelCentreOffsets[id];}
PX_FORCE_INLINE PxI32 getWheelShapeMapping(const PxU32 id) const {return (PX_MAX_U8 != mWheelShapeMap[id]) ? mWheelShapeMap[id] : -1;}
PX_FORCE_INLINE const PxFilterData& getSceneQueryFilterData(const PxU32 id) const {return mSqFilterData[id];}
PX_FORCE_INLINE const PxReal* getTireRestLoadsArray() const {return mTireRestLoads;}
PX_FORCE_INLINE const PxReal* getRecipTireRestLoadsArray() const {return mRecipTireRestLoads;}
void setSuspensionData (const PxU32 id, const PxVehicleSuspensionData& susp);
void setWheelData (const PxU32 id, const PxVehicleWheelData& susp);
void setTireData (const PxU32 id, const PxVehicleTireData& tire);
void setSuspTravelDirection (const PxU32 id, const PxVec3& dir);
void setSuspForceAppPointOffset (const PxU32 id, const PxVec3& offset);
void setTireForceAppPointOffset (const PxU32 id, const PxVec3& offset);
void setWheelCentreOffset (const PxU32 id, const PxVec3& offset);
void setWheelShapeMapping (const PxU32 id, const PxI32 shapeId);
void setSceneQueryFilterData (const PxU32 id, const PxFilterData& sqFilterData);
private:
/**
\brief Suspension simulation data
@see setSuspensionData, getSuspensionData
*/
PxVehicleSuspensionData mSuspensions[4];
/**
\brief Wheel simulation data
@see setWheelData, getWheelData
*/
PxVehicleWheelData mWheels[4];
/**
\brief Tire simulation data
@see setTireData, getTireData
*/
PxVehicleTireData mTires[4];
/**
\brief Direction of suspension travel, pointing downwards.
*/
PxVec3 mSuspDownwardTravelDirections[4];
/**
\brief Application point of suspension force specified as an offset from the rigid body centre of mass.
*/
PxVec3 mSuspForceAppPointOffsets[4]; //Offset from cm
/**
\brief Application point of tire forces specified as an offset from the rigid body centre of mass.
*/
PxVec3 mTireForceAppPointOffsets[4]; //Offset from cm
/**
\brief Position of wheel center specified as an offset from the rigid body centre of mass.
*/
PxVec3 mWheelCentreOffsets[4]; //Offset from cm
/**
\brief Normalized tire load on each tire (load/rest load) at zero suspension jounce under gravity.
*/
PxReal mTireRestLoads[4];
/**
\brief Reciprocal normalized tire load on each tire at zero suspension jounce under gravity.
*/
PxReal mRecipTireRestLoads[4];
/**
\brief Scene query filter data used by each suspension line.
Anything relating to the actor belongs in PxVehicleWheels.
*/
PxFilterData mSqFilterData[4];
/**
\brief Mapping between wheel id and shape id.
The PxShape that corresponds to the ith wheel can be found with
If mWheelShapeMap[i]<0 then the wheel has no corresponding shape.
Otherwise, the shape corresponds to:
PxShape* shapeBuffer[1];
mActor->getShapes(shapeBuffer,1,mWheelShapeMap[i]);
Anything relating to the actor belongs in PxVehicleWheels.
*/
PxU8 mWheelShapeMap[4];
PxU32 mPad[3];
};
PX_COMPILE_TIME_ASSERT(0 == (sizeof(PxVehicleWheels4SimData) & 15));
class PxVehicleWheels4DynData
{
//= ATTENTION! =====================================================================================
// Changing the data layout of this class breaks the binary serialization format. See comments for
// PX_BINARY_SERIAL_VERSION. If a modification is required, please adjust the getBinaryMetaData
// function. If the modification is made on a custom branch, please change PX_BINARY_SERIAL_VERSION
// accordingly.
//==================================================================================================
public:
friend class PxVehicleUpdate;
PxVehicleWheels4DynData()
: mRaycastResults(NULL),
mSweepResults(NULL)
{
setToRestState();
}
~PxVehicleWheels4DynData()
{
}
bool isValid() const {return true;}
static void getBinaryMetaData(PxOutputStream& stream);
void setToRestState()
{
for(PxU32 i=0;i<4;i++)
{
mWheelSpeeds[i] = 0.0f;
mCorrectedWheelSpeeds[i] = 0.0f;
mWheelRotationAngles[i] = 0.0f;
mTireLowForwardSpeedTimers[i] = 0.0f;
mTireLowSideSpeedTimers[i] = 0.0f;
mJounces[i] = PX_MAX_F32;
mVehicleConstraints->mData.mStickyTireForwardData.mActiveFlags[i] = false;
mVehicleConstraints->mData.mStickyTireSideData.mActiveFlags[i] = false;
mVehicleConstraints->mData.mSuspLimitData.mActiveFlags[i] = false;
}
PxMemZero(mQueryOrCachedHitResults, sizeof(SuspLineSweep));
mRaycastResults = NULL;
mSweepResults = NULL;
mHasCachedRaycastHitPlane = false;
}
void setInternalDynamicsToZero()
{
for(PxU32 i=0;i<4;i++)
{
mWheelSpeeds[i] = 0.0f;
mCorrectedWheelSpeeds[i] = 0.0f;
mJounces[i] = PX_MAX_F32; //Ensure that the jounce speed is zero when the car wakes up again.
}
}
/**
\brief Rotation speeds of wheels
@see PxVehicle4WSetToRestState, PxVehicle4WGetWheelRotationSpeed, PxVehicle4WGetEngineRotationSpeed
*/
PxReal mWheelSpeeds[4];
/**
\brief Rotation speeds of wheels used to update the wheel rotation angles.
*/
PxReal mCorrectedWheelSpeeds[4];
/**
\brief Reported rotation angle about rolling axis.
@see PxVehicle4WSetToRestState, PxVehicle4WGetWheelRotationAngle
*/
PxReal mWheelRotationAngles[4];
/**
\brief Timers used to trigger sticky friction to hold the car perfectly at rest.
\note Used only internally.
*/
PxReal mTireLowForwardSpeedTimers[4];
/**
\brief Timers used to trigger sticky friction to hold the car perfectly at rest.
\note Used only internally.
*/
PxReal mTireLowSideSpeedTimers[4];
/**
\brief Previous suspension jounce.
\note Used only internally to compute the jounce speed by comparing cached jounce and latest jounce.
*/
PxReal mJounces[4];
struct SuspLineSweep
{
/**
\brief Geometry suspension line sweep used in most recent scene query.
@see PxVehicleSuspensionSweeps
*/
PxGeometryHolder mGometries[4];
/**
\brief Start poses of suspension line sweep used in most recent scene query.
@see PxVehicleSuspensionSweeps
*/
PxTransform mStartPose[4];
/**
\brief Directions of suspension line sweeps used in most recent scene query.
@see PxVehicleSuspensionSweeps
*/
PxVec3 mDirs[4];
/**
\brief Lengths of suspension line sweeps used in most recent scene query.
@see PxVehicleSuspensionSweeps
*/
PxReal mLengths[4];
};
struct SuspLineRaycast
{
/**
\brief Start point of suspension line raycasts used in most recent scene query.
@see PxVehicleSuspensionRaycasts
*/
PxVec3 mStarts[4];
/**
\brief Directions of suspension line raycasts used in most recent scene query.
@see PxVehicleSuspensionRaycasts
*/
PxVec3 mDirs[4];
/**
\brief Lengths of suspension line raycasts used in most recent scene query.
@see PxVehicleSuspensionRaycasts
*/
PxReal mLengths[4];
PxU32 mPad[16];
};
struct CachedSuspLineSceneQuerytHitResult
{
/**
\brief Cached raycast hit planes. These are the planes found from the last scene queries.
@see PxVehicleSuspensionRaycasts, PxVehicleSuspensionSweeps
*/
PxVec4 mPlanes[4];
/**
\brief Cached friction.
@see PxVehicleSuspensionRaycasts, PxVehicleSuspensionSweeps
*/
PxF32 mFrictionMultipliers[4];
/**
\brief Cached raycast hit distance. These are the hit distances found from the last scene queries.
*/
PxF32 mDistances[4];
/**
\brief Cached raycast hit counts. These are the hit counts found from the last scene queries.
@see PxVehicleSuspensionRaycasts, , PxVehicleSuspensionSweeps
*/
PxU16 mCounts[4];
/**
\brief Store 0 if cached results are from raycasts, store 1 if cached results are from sweeps.
*/
PxU16 mQueryTypes[4];
PxU32 mPad1[16];
};
/**
\brief We either have a fresh raycast that was just performed or a cached raycast result that will be used if no raycast was just performed.
*/
PxU8 mQueryOrCachedHitResults[sizeof(SuspLineSweep)];
/**
\brief Used only internally.
*/
void setVehicleConstraintShader(PxVehicleConstraintShader* shader) {mVehicleConstraints=shader;}
PxVehicleConstraintShader& getVehicletConstraintShader() const {return *mVehicleConstraints;}
private:
//Susp limits and sticky tire friction for all wheels.
PxVehicleConstraintShader* mVehicleConstraints;
public:
/**
\brief Set by PxVehicleSuspensionRaycasts
@see PxVehicleSuspensionRaycasts
*/
const PxRaycastQueryResult* mRaycastResults;
/**
\brief Set by PxVehicleSuspensionSweeps
@see PxVehicleSuspensionSweeps
*/
const PxSweepQueryResult* mSweepResults;
/**
\brief Set true if a raycast hit plane has been recorded and cached.
This requires a raycast to be performed and then followed by PxVehicleUpdates
at least once. Reset to false in setToRestState.
*/
bool mHasCachedRaycastHitPlane;
#if PX_P64_FAMILY
PxU32 mPad[12];
#endif
};
PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleWheels4DynData) & 15));
PX_COMPILE_TIME_ASSERT((0 == (sizeof(PxVehicleWheels4DynData::SuspLineSweep) & 0x0f)));
PX_COMPILE_TIME_ASSERT(sizeof(PxVehicleWheels4DynData::SuspLineRaycast) <= sizeof(PxVehicleWheels4DynData::SuspLineSweep));
PX_COMPILE_TIME_ASSERT(sizeof(PxVehicleWheels4DynData::CachedSuspLineSceneQuerytHitResult) <= sizeof(PxVehicleWheels4DynData::SuspLineSweep));
#if !PX_DOXYGEN
} // namespace physx
#endif
/** @} */
#endif //PX_VEHICLE_SUSPWHEELTIRE_H