Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Body/MotionProperties.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/Body/MotionProperties.h>7#include <Jolt/Physics/StateRecorder.h>89JPH_NAMESPACE_BEGIN1011void MotionProperties::SetMassProperties(EAllowedDOFs inAllowedDOFs, const MassProperties &inMassProperties)12{13// Store allowed DOFs14mAllowedDOFs = inAllowedDOFs;1516// Decompose DOFs17uint allowed_translation_axis = uint(inAllowedDOFs) & 0b111;18uint allowed_rotation_axis = (uint(inAllowedDOFs) >> 3) & 0b111;1920// Set inverse mass21if (allowed_translation_axis == 0)22{23// No translation possible24mInvMass = 0.0f;25}26else27{28JPH_ASSERT(inMassProperties.mMass > 0.0f, "Invalid mass. "29"Some shapes like MeshShape or TriangleShape cannot calculate mass automatically, "30"in this case you need to provide it by setting BodyCreationSettings::mOverrideMassProperties and mMassPropertiesOverride.");31mInvMass = 1.0f / inMassProperties.mMass;32}3334if (allowed_rotation_axis == 0)35{36// No rotation possible37mInvInertiaDiagonal = Vec3::sZero();38mInertiaRotation = Quat::sIdentity();39}40else41{42// Set inverse inertia43Mat44 rotation;44Vec3 diagonal;45if (inMassProperties.DecomposePrincipalMomentsOfInertia(rotation, diagonal)46&& !diagonal.IsNearZero())47{48mInvInertiaDiagonal = diagonal.Reciprocal();49mInertiaRotation = rotation.GetQuaternion();50}51else52{53// Failed! Fall back to inertia tensor of sphere with radius 1.54mInvInertiaDiagonal = Vec3::sReplicate(2.5f * mInvMass);55mInertiaRotation = Quat::sIdentity();56}57}5859JPH_ASSERT(mInvMass != 0.0f || mInvInertiaDiagonal != Vec3::sZero(), "Can't lock all axes, use a static body for this. This will crash with a division by zero later!");60}6162void MotionProperties::SaveState(StateRecorder &inStream) const63{64// Only write properties that can change at runtime65inStream.Write(mLinearVelocity);66inStream.Write(mAngularVelocity);67inStream.Write(mForce);68inStream.Write(mTorque);69#ifdef JPH_DOUBLE_PRECISION70inStream.Write(mSleepTestOffset);71#endif // JPH_DOUBLE_PRECISION72inStream.Write(mSleepTestSpheres);73inStream.Write(mSleepTestTimer);74inStream.Write(mAllowSleeping);75}7677void MotionProperties::RestoreState(StateRecorder &inStream)78{79inStream.Read(mLinearVelocity);80inStream.Read(mAngularVelocity);81inStream.Read(mForce);82inStream.Read(mTorque);83#ifdef JPH_DOUBLE_PRECISION84inStream.Read(mSleepTestOffset);85#endif // JPH_DOUBLE_PRECISION86inStream.Read(mSleepTestSpheres);87inStream.Read(mSleepTestTimer);88inStream.Read(mAllowSleeping);89}9091JPH_NAMESPACE_END929394