Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Body/BodyCreationSettings.cpp
9912 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/BodyCreationSettings.h>7#include <Jolt/ObjectStream/TypeDeclarations.h>8#include <Jolt/Core/StreamIn.h>9#include <Jolt/Core/StreamOut.h>1011JPH_NAMESPACE_BEGIN1213JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(BodyCreationSettings)14{15JPH_ADD_ATTRIBUTE(BodyCreationSettings, mPosition)16JPH_ADD_ATTRIBUTE(BodyCreationSettings, mRotation)17JPH_ADD_ATTRIBUTE(BodyCreationSettings, mLinearVelocity)18JPH_ADD_ATTRIBUTE(BodyCreationSettings, mAngularVelocity)19JPH_ADD_ATTRIBUTE(BodyCreationSettings, mUserData)20JPH_ADD_ATTRIBUTE(BodyCreationSettings, mShape)21JPH_ADD_ATTRIBUTE(BodyCreationSettings, mCollisionGroup)22JPH_ADD_ENUM_ATTRIBUTE(BodyCreationSettings, mObjectLayer)23JPH_ADD_ENUM_ATTRIBUTE(BodyCreationSettings, mMotionType)24JPH_ADD_ENUM_ATTRIBUTE(BodyCreationSettings, mAllowedDOFs)25JPH_ADD_ATTRIBUTE(BodyCreationSettings, mAllowDynamicOrKinematic)26JPH_ADD_ATTRIBUTE(BodyCreationSettings, mIsSensor)27JPH_ADD_ATTRIBUTE_WITH_ALIAS(BodyCreationSettings, mCollideKinematicVsNonDynamic, "mSensorDetectsStatic") // This is the old name to keep backwards compatibility28JPH_ADD_ATTRIBUTE(BodyCreationSettings, mUseManifoldReduction)29JPH_ADD_ATTRIBUTE(BodyCreationSettings, mApplyGyroscopicForce)30JPH_ADD_ENUM_ATTRIBUTE(BodyCreationSettings, mMotionQuality)31JPH_ADD_ATTRIBUTE(BodyCreationSettings, mEnhancedInternalEdgeRemoval)32JPH_ADD_ATTRIBUTE(BodyCreationSettings, mAllowSleeping)33JPH_ADD_ATTRIBUTE(BodyCreationSettings, mFriction)34JPH_ADD_ATTRIBUTE(BodyCreationSettings, mRestitution)35JPH_ADD_ATTRIBUTE(BodyCreationSettings, mLinearDamping)36JPH_ADD_ATTRIBUTE(BodyCreationSettings, mAngularDamping)37JPH_ADD_ATTRIBUTE(BodyCreationSettings, mMaxLinearVelocity)38JPH_ADD_ATTRIBUTE(BodyCreationSettings, mMaxAngularVelocity)39JPH_ADD_ATTRIBUTE(BodyCreationSettings, mGravityFactor)40JPH_ADD_ATTRIBUTE(BodyCreationSettings, mNumVelocityStepsOverride)41JPH_ADD_ATTRIBUTE(BodyCreationSettings, mNumPositionStepsOverride)42JPH_ADD_ENUM_ATTRIBUTE(BodyCreationSettings, mOverrideMassProperties)43JPH_ADD_ATTRIBUTE(BodyCreationSettings, mInertiaMultiplier)44JPH_ADD_ATTRIBUTE(BodyCreationSettings, mMassPropertiesOverride)45}4647void BodyCreationSettings::SaveBinaryState(StreamOut &inStream) const48{49inStream.Write(mPosition);50inStream.Write(mRotation);51inStream.Write(mLinearVelocity);52inStream.Write(mAngularVelocity);53mCollisionGroup.SaveBinaryState(inStream);54inStream.Write(mObjectLayer);55inStream.Write(mMotionType);56inStream.Write(mAllowedDOFs);57inStream.Write(mAllowDynamicOrKinematic);58inStream.Write(mIsSensor);59inStream.Write(mCollideKinematicVsNonDynamic);60inStream.Write(mUseManifoldReduction);61inStream.Write(mApplyGyroscopicForce);62inStream.Write(mMotionQuality);63inStream.Write(mEnhancedInternalEdgeRemoval);64inStream.Write(mAllowSleeping);65inStream.Write(mFriction);66inStream.Write(mRestitution);67inStream.Write(mLinearDamping);68inStream.Write(mAngularDamping);69inStream.Write(mMaxLinearVelocity);70inStream.Write(mMaxAngularVelocity);71inStream.Write(mGravityFactor);72inStream.Write(mNumVelocityStepsOverride);73inStream.Write(mNumPositionStepsOverride);74inStream.Write(mOverrideMassProperties);75inStream.Write(mInertiaMultiplier);76mMassPropertiesOverride.SaveBinaryState(inStream);77}7879void BodyCreationSettings::RestoreBinaryState(StreamIn &inStream)80{81inStream.Read(mPosition);82inStream.Read(mRotation);83inStream.Read(mLinearVelocity);84inStream.Read(mAngularVelocity);85mCollisionGroup.RestoreBinaryState(inStream);86inStream.Read(mObjectLayer);87inStream.Read(mMotionType);88inStream.Read(mAllowedDOFs);89inStream.Read(mAllowDynamicOrKinematic);90inStream.Read(mIsSensor);91inStream.Read(mCollideKinematicVsNonDynamic);92inStream.Read(mUseManifoldReduction);93inStream.Read(mApplyGyroscopicForce);94inStream.Read(mMotionQuality);95inStream.Read(mEnhancedInternalEdgeRemoval);96inStream.Read(mAllowSleeping);97inStream.Read(mFriction);98inStream.Read(mRestitution);99inStream.Read(mLinearDamping);100inStream.Read(mAngularDamping);101inStream.Read(mMaxLinearVelocity);102inStream.Read(mMaxAngularVelocity);103inStream.Read(mGravityFactor);104inStream.Read(mNumVelocityStepsOverride);105inStream.Read(mNumPositionStepsOverride);106inStream.Read(mOverrideMassProperties);107inStream.Read(mInertiaMultiplier);108mMassPropertiesOverride.RestoreBinaryState(inStream);109}110111Shape::ShapeResult BodyCreationSettings::ConvertShapeSettings()112{113// If we already have a shape, return it114if (mShapePtr != nullptr)115{116mShape = nullptr;117118Shape::ShapeResult result;119result.Set(const_cast<Shape *>(mShapePtr.GetPtr()));120return result;121}122123// Check if we have shape settings124if (mShape == nullptr)125{126Shape::ShapeResult result;127result.SetError("No shape present!");128return result;129}130131// Create the shape132Shape::ShapeResult result = mShape->Create();133if (result.IsValid())134mShapePtr = result.Get();135mShape = nullptr;136return result;137}138139const Shape *BodyCreationSettings::GetShape() const140{141// If we already have a shape, return it142if (mShapePtr != nullptr)143return mShapePtr;144145// Check if we have shape settings146if (mShape == nullptr)147return nullptr;148149// Create the shape150Shape::ShapeResult result = mShape->Create();151if (result.IsValid())152return result.Get();153154Trace("Error: %s", result.GetError().c_str());155JPH_ASSERT(false, "An error occurred during shape creation. Use ConvertShapeSettings() to convert the shape and get the error!");156return nullptr;157}158159MassProperties BodyCreationSettings::GetMassProperties() const160{161// Calculate mass properties162MassProperties mass_properties;163switch (mOverrideMassProperties)164{165case EOverrideMassProperties::CalculateMassAndInertia:166mass_properties = GetShape()->GetMassProperties();167mass_properties.mInertia *= mInertiaMultiplier;168mass_properties.mInertia(3, 3) = 1.0f;169break;170case EOverrideMassProperties::CalculateInertia:171mass_properties = GetShape()->GetMassProperties();172mass_properties.ScaleToMass(mMassPropertiesOverride.mMass);173mass_properties.mInertia *= mInertiaMultiplier;174mass_properties.mInertia(3, 3) = 1.0f;175break;176case EOverrideMassProperties::MassAndInertiaProvided:177mass_properties = mMassPropertiesOverride;178break;179}180return mass_properties;181}182183void BodyCreationSettings::SaveWithChildren(StreamOut &inStream, ShapeToIDMap *ioShapeMap, MaterialToIDMap *ioMaterialMap, GroupFilterToIDMap *ioGroupFilterMap) const184{185// Save creation settings186SaveBinaryState(inStream);187188// Save shape189if (ioShapeMap != nullptr && ioMaterialMap != nullptr)190GetShape()->SaveWithChildren(inStream, *ioShapeMap, *ioMaterialMap);191else192inStream.Write(~uint32(0));193194// Save group filter195StreamUtils::SaveObjectReference(inStream, mCollisionGroup.GetGroupFilter(), ioGroupFilterMap);196}197198BodyCreationSettings::BCSResult BodyCreationSettings::sRestoreWithChildren(StreamIn &inStream, IDToShapeMap &ioShapeMap, IDToMaterialMap &ioMaterialMap, IDToGroupFilterMap &ioGroupFilterMap)199{200BCSResult result;201202// Read creation settings203BodyCreationSettings settings;204settings.RestoreBinaryState(inStream);205if (inStream.IsEOF() || inStream.IsFailed())206{207result.SetError("Error reading body creation settings");208return result;209}210211// Read shape212Shape::ShapeResult shape_result = Shape::sRestoreWithChildren(inStream, ioShapeMap, ioMaterialMap);213if (shape_result.HasError())214{215result.SetError(shape_result.GetError());216return result;217}218settings.SetShape(shape_result.Get());219220// Read group filter221Result gfresult = StreamUtils::RestoreObjectReference(inStream, ioGroupFilterMap);222if (gfresult.HasError())223{224result.SetError(gfresult.GetError());225return result;226}227settings.mCollisionGroup.SetGroupFilter(gfresult.Get());228229result.Set(settings);230return result;231}232233JPH_NAMESPACE_END234235236