89 lines
3.1 KiB
C++
89 lines
3.1 KiB
C++
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
|
|
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#include <Jolt/Jolt.h>
|
|
|
|
#include <Jolt/Physics/Vehicle/Wheel.h>
|
|
#include <Jolt/Physics/Vehicle/VehicleConstraint.h>
|
|
#include <Jolt/ObjectStream/TypeDeclarations.h>
|
|
|
|
JPH_NAMESPACE_BEGIN
|
|
|
|
JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(WheelSettings)
|
|
{
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mPosition)
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionDirection)
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mSteeringAxis)
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mWheelForward)
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mWheelUp)
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionMinLength)
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionMaxLength)
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionPreloadLength)
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionFrequency)
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionDamping)
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mRadius)
|
|
JPH_ADD_ATTRIBUTE(WheelSettings, mWidth)
|
|
}
|
|
|
|
void WheelSettings::SaveBinaryState(StreamOut &inStream) const
|
|
{
|
|
inStream.Write(mPosition);
|
|
inStream.Write(mSuspensionDirection);
|
|
inStream.Write(mSteeringAxis);
|
|
inStream.Write(mWheelForward);
|
|
inStream.Write(mWheelUp);
|
|
inStream.Write(mSuspensionMinLength);
|
|
inStream.Write(mSuspensionMaxLength);
|
|
inStream.Write(mSuspensionPreloadLength);
|
|
inStream.Write(mSuspensionFrequency);
|
|
inStream.Write(mSuspensionDamping);
|
|
inStream.Write(mRadius);
|
|
inStream.Write(mWidth);
|
|
}
|
|
|
|
void WheelSettings::RestoreBinaryState(StreamIn &inStream)
|
|
{
|
|
inStream.Read(mPosition);
|
|
inStream.Read(mSuspensionDirection);
|
|
inStream.Read(mSteeringAxis);
|
|
inStream.Read(mWheelForward);
|
|
inStream.Read(mWheelUp);
|
|
inStream.Read(mSuspensionMinLength);
|
|
inStream.Read(mSuspensionMaxLength);
|
|
inStream.Read(mSuspensionPreloadLength);
|
|
inStream.Read(mSuspensionFrequency);
|
|
inStream.Read(mSuspensionDamping);
|
|
inStream.Read(mRadius);
|
|
inStream.Read(mWidth);
|
|
}
|
|
|
|
Wheel::Wheel(const WheelSettings &inSettings) :
|
|
mSettings(&inSettings),
|
|
mSuspensionLength(inSettings.mSuspensionMaxLength)
|
|
{
|
|
JPH_ASSERT(inSettings.mSuspensionDirection.IsNormalized());
|
|
JPH_ASSERT(inSettings.mSteeringAxis.IsNormalized());
|
|
JPH_ASSERT(inSettings.mWheelForward.IsNormalized());
|
|
JPH_ASSERT(inSettings.mWheelUp.IsNormalized());
|
|
JPH_ASSERT(inSettings.mSuspensionMinLength >= 0.0f);
|
|
JPH_ASSERT(inSettings.mSuspensionMaxLength >= inSettings.mSuspensionMinLength);
|
|
JPH_ASSERT(inSettings.mSuspensionPreloadLength >= 0.0f);
|
|
JPH_ASSERT(inSettings.mSuspensionFrequency > 0.0f);
|
|
JPH_ASSERT(inSettings.mSuspensionDamping >= 0.0f);
|
|
JPH_ASSERT(inSettings.mRadius > 0.0f);
|
|
JPH_ASSERT(inSettings.mWidth >= 0.0f);
|
|
}
|
|
|
|
bool Wheel::SolveLongitudinalConstraintPart(const VehicleConstraint &inConstraint, float inMinImpulse, float inMaxImpulse)
|
|
{
|
|
return mLongitudinalPart.SolveVelocityConstraint(*inConstraint.GetVehicleBody(), *mContactBody, -mContactLongitudinal, inMinImpulse, inMaxImpulse);
|
|
}
|
|
|
|
bool Wheel::SolveLateralConstraintPart(const VehicleConstraint &inConstraint, float inMinImpulse, float inMaxImpulse)
|
|
{
|
|
return mLateralPart.SolveVelocityConstraint(*inConstraint.GetVehicleBody(), *mContactBody, -mContactLateral, inMinImpulse, inMaxImpulse);
|
|
}
|
|
|
|
JPH_NAMESPACE_END
|