Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Constraints/PointConstraint.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/Constraints/PointConstraint.h>7#include <Jolt/Physics/Body/Body.h>8#include <Jolt/ObjectStream/TypeDeclarations.h>9#include <Jolt/Core/StreamIn.h>10#include <Jolt/Core/StreamOut.h>11#ifdef JPH_DEBUG_RENDERER12#include <Jolt/Renderer/DebugRenderer.h>13#endif // JPH_DEBUG_RENDERER1415JPH_NAMESPACE_BEGIN1617JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(PointConstraintSettings)18{19JPH_ADD_BASE_CLASS(PointConstraintSettings, TwoBodyConstraintSettings)2021JPH_ADD_ENUM_ATTRIBUTE(PointConstraintSettings, mSpace)22JPH_ADD_ATTRIBUTE(PointConstraintSettings, mPoint1)23JPH_ADD_ATTRIBUTE(PointConstraintSettings, mPoint2)24}2526void PointConstraintSettings::SaveBinaryState(StreamOut &inStream) const27{28ConstraintSettings::SaveBinaryState(inStream);2930inStream.Write(mSpace);31inStream.Write(mPoint1);32inStream.Write(mPoint2);33}3435void PointConstraintSettings::RestoreBinaryState(StreamIn &inStream)36{37ConstraintSettings::RestoreBinaryState(inStream);3839inStream.Read(mSpace);40inStream.Read(mPoint1);41inStream.Read(mPoint2);42}4344TwoBodyConstraint *PointConstraintSettings::Create(Body &inBody1, Body &inBody2) const45{46return new PointConstraint(inBody1, inBody2, *this);47}4849PointConstraint::PointConstraint(Body &inBody1, Body &inBody2, const PointConstraintSettings &inSettings) :50TwoBodyConstraint(inBody1, inBody2, inSettings)51{52if (inSettings.mSpace == EConstraintSpace::WorldSpace)53{54// If all properties were specified in world space, take them to local space now55mLocalSpacePosition1 = Vec3(inBody1.GetInverseCenterOfMassTransform() * inSettings.mPoint1);56mLocalSpacePosition2 = Vec3(inBody2.GetInverseCenterOfMassTransform() * inSettings.mPoint2);57}58else59{60mLocalSpacePosition1 = Vec3(inSettings.mPoint1);61mLocalSpacePosition2 = Vec3(inSettings.mPoint2);62}63}6465void PointConstraint::NotifyShapeChanged(const BodyID &inBodyID, Vec3Arg inDeltaCOM)66{67if (mBody1->GetID() == inBodyID)68mLocalSpacePosition1 -= inDeltaCOM;69else if (mBody2->GetID() == inBodyID)70mLocalSpacePosition2 -= inDeltaCOM;71}7273void PointConstraint::SetPoint1(EConstraintSpace inSpace, RVec3Arg inPoint1)74{75if (inSpace == EConstraintSpace::WorldSpace)76mLocalSpacePosition1 = Vec3(mBody1->GetInverseCenterOfMassTransform() * inPoint1);77else78mLocalSpacePosition1 = Vec3(inPoint1);79}8081void PointConstraint::SetPoint2(EConstraintSpace inSpace, RVec3Arg inPoint2)82{83if (inSpace == EConstraintSpace::WorldSpace)84mLocalSpacePosition2 = Vec3(mBody2->GetInverseCenterOfMassTransform() * inPoint2);85else86mLocalSpacePosition2 = Vec3(inPoint2);87}8889void PointConstraint::CalculateConstraintProperties()90{91mPointConstraintPart.CalculateConstraintProperties(*mBody1, Mat44::sRotation(mBody1->GetRotation()), mLocalSpacePosition1, *mBody2, Mat44::sRotation(mBody2->GetRotation()), mLocalSpacePosition2);92}9394void PointConstraint::SetupVelocityConstraint(float inDeltaTime)95{96CalculateConstraintProperties();97}9899void PointConstraint::ResetWarmStart()100{101mPointConstraintPart.Deactivate();102}103104void PointConstraint::WarmStartVelocityConstraint(float inWarmStartImpulseRatio)105{106// Warm starting: Apply previous frame impulse107mPointConstraintPart.WarmStart(*mBody1, *mBody2, inWarmStartImpulseRatio);108}109110bool PointConstraint::SolveVelocityConstraint(float inDeltaTime)111{112return mPointConstraintPart.SolveVelocityConstraint(*mBody1, *mBody2);113}114115bool PointConstraint::SolvePositionConstraint(float inDeltaTime, float inBaumgarte)116{117// Update constraint properties (bodies may have moved)118CalculateConstraintProperties();119120return mPointConstraintPart.SolvePositionConstraint(*mBody1, *mBody2, inBaumgarte);121}122123#ifdef JPH_DEBUG_RENDERER124void PointConstraint::DrawConstraint(DebugRenderer *inRenderer) const125{126// Draw constraint127inRenderer->DrawMarker(mBody1->GetCenterOfMassTransform() * mLocalSpacePosition1, Color::sRed, 0.1f);128inRenderer->DrawMarker(mBody2->GetCenterOfMassTransform() * mLocalSpacePosition2, Color::sGreen, 0.1f);129}130#endif // JPH_DEBUG_RENDERER131132void PointConstraint::SaveState(StateRecorder &inStream) const133{134TwoBodyConstraint::SaveState(inStream);135136mPointConstraintPart.SaveState(inStream);137}138139void PointConstraint::RestoreState(StateRecorder &inStream)140{141TwoBodyConstraint::RestoreState(inStream);142143mPointConstraintPart.RestoreState(inStream);144}145146Ref<ConstraintSettings> PointConstraint::GetConstraintSettings() const147{148PointConstraintSettings *settings = new PointConstraintSettings;149ToConstraintSettings(*settings);150settings->mSpace = EConstraintSpace::LocalToBodyCOM;151settings->mPoint1 = RVec3(mLocalSpacePosition1);152settings->mPoint2 = RVec3(mLocalSpacePosition2);153return settings;154}155156JPH_NAMESPACE_END157158159