Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Vehicle/Wheel.cpp
9913 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#include <Jolt/Jolt.h>56#include <Jolt/Physics/Vehicle/Wheel.h>7#include <Jolt/Physics/Vehicle/VehicleConstraint.h>8#include <Jolt/ObjectStream/TypeDeclarations.h>910JPH_NAMESPACE_BEGIN1112JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(WheelSettings)13{14JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionForcePoint)15JPH_ADD_ATTRIBUTE(WheelSettings, mPosition)16JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionDirection)17JPH_ADD_ATTRIBUTE(WheelSettings, mSteeringAxis)18JPH_ADD_ATTRIBUTE(WheelSettings, mWheelForward)19JPH_ADD_ATTRIBUTE(WheelSettings, mWheelUp)20JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionMinLength)21JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionMaxLength)22JPH_ADD_ATTRIBUTE(WheelSettings, mSuspensionPreloadLength)23JPH_ADD_ENUM_ATTRIBUTE_WITH_ALIAS(WheelSettings, mSuspensionSpring.mMode, "mSuspensionSpringMode")24JPH_ADD_ATTRIBUTE_WITH_ALIAS(WheelSettings, mSuspensionSpring.mFrequency, "mSuspensionFrequency") // Renaming attributes to stay compatible with old versions of the library25JPH_ADD_ATTRIBUTE_WITH_ALIAS(WheelSettings, mSuspensionSpring.mDamping, "mSuspensionDamping")26JPH_ADD_ATTRIBUTE(WheelSettings, mRadius)27JPH_ADD_ATTRIBUTE(WheelSettings, mWidth)28JPH_ADD_ATTRIBUTE(WheelSettings, mEnableSuspensionForcePoint)29}3031void WheelSettings::SaveBinaryState(StreamOut &inStream) const32{33inStream.Write(mSuspensionForcePoint);34inStream.Write(mPosition);35inStream.Write(mSuspensionDirection);36inStream.Write(mSteeringAxis);37inStream.Write(mWheelForward);38inStream.Write(mWheelUp);39inStream.Write(mSuspensionMinLength);40inStream.Write(mSuspensionMaxLength);41inStream.Write(mSuspensionPreloadLength);42mSuspensionSpring.SaveBinaryState(inStream);43inStream.Write(mRadius);44inStream.Write(mWidth);45inStream.Write(mEnableSuspensionForcePoint);46}4748void WheelSettings::RestoreBinaryState(StreamIn &inStream)49{50inStream.Read(mSuspensionForcePoint);51inStream.Read(mPosition);52inStream.Read(mSuspensionDirection);53inStream.Read(mSteeringAxis);54inStream.Read(mWheelForward);55inStream.Read(mWheelUp);56inStream.Read(mSuspensionMinLength);57inStream.Read(mSuspensionMaxLength);58inStream.Read(mSuspensionPreloadLength);59mSuspensionSpring.RestoreBinaryState(inStream);60inStream.Read(mRadius);61inStream.Read(mWidth);62inStream.Read(mEnableSuspensionForcePoint);63}6465Wheel::Wheel(const WheelSettings &inSettings) :66mSettings(&inSettings),67mSuspensionLength(inSettings.mSuspensionMaxLength)68{69JPH_ASSERT(inSettings.mSuspensionDirection.IsNormalized());70JPH_ASSERT(inSettings.mSteeringAxis.IsNormalized());71JPH_ASSERT(inSettings.mWheelForward.IsNormalized());72JPH_ASSERT(inSettings.mWheelUp.IsNormalized());73JPH_ASSERT(inSettings.mSuspensionMinLength >= 0.0f);74JPH_ASSERT(inSettings.mSuspensionMaxLength >= inSettings.mSuspensionMinLength);75JPH_ASSERT(inSettings.mSuspensionPreloadLength >= 0.0f);76JPH_ASSERT(inSettings.mSuspensionSpring.mFrequency > 0.0f);77JPH_ASSERT(inSettings.mSuspensionSpring.mDamping >= 0.0f);78JPH_ASSERT(inSettings.mRadius > 0.0f);79JPH_ASSERT(inSettings.mWidth >= 0.0f);80}8182bool Wheel::SolveLongitudinalConstraintPart(const VehicleConstraint &inConstraint, float inMinImpulse, float inMaxImpulse)83{84return mLongitudinalPart.SolveVelocityConstraint(*inConstraint.GetVehicleBody(), *mContactBody, -mContactLongitudinal, inMinImpulse, inMaxImpulse);85}8687bool Wheel::SolveLateralConstraintPart(const VehicleConstraint &inConstraint, float inMinImpulse, float inMaxImpulse)88{89return mLateralPart.SolveVelocityConstraint(*inConstraint.GetVehicleBody(), *mContactBody, -mContactLateral, inMinImpulse, inMaxImpulse);90}9192JPH_NAMESPACE_END939495