Browse Source

Fixed bug in SixDOFConstraint::RestoreState that would cause motors to not properly turn on (#797)

Jorrit Rouwe 1 year ago
parent
commit
f53b8093d8

+ 13 - 5
Jolt/Physics/Constraints/SixDOFConstraint.cpp

@@ -247,6 +247,14 @@ void SixDOFConstraint::CacheRotationMotorActive()
 		|| HasFriction(EAxis::RotationZ);
 		|| HasFriction(EAxis::RotationZ);
 }
 }
 
 
+void SixDOFConstraint::CacheRotationPositionMotorActive()
+{
+	mRotationPositionMotorActive = 0;
+	for (int i = 0; i < 3; ++i)
+		if (mMotorState[EAxis::RotationX + i] == EMotorState::Position)
+			mRotationPositionMotorActive |= 1 << i;
+}
+
 void SixDOFConstraint::CacheHasSpringLimits()
 void SixDOFConstraint::CacheHasSpringLimits()
 {
 {
 	mHasSpringLimits = mLimitsSpringSettings[EAxis::TranslationX].mFrequency > 0.0f
 	mHasSpringLimits = mLimitsSpringSettings[EAxis::TranslationX].mFrequency > 0.0f
@@ -276,11 +284,7 @@ void SixDOFConstraint::SetMotorState(EAxis inAxis, EMotorState inState)
 			mMotorRotationConstraintPart[inAxis - EAxis::RotationX].Deactivate();
 			mMotorRotationConstraintPart[inAxis - EAxis::RotationX].Deactivate();
 
 
 			CacheRotationMotorActive();
 			CacheRotationMotorActive();
-
-			mRotationPositionMotorActive = 0;
-			for (int i = 0; i < 3; ++i)
-				if (mMotorState[EAxis::RotationX + i] == EMotorState::Position)
-					mRotationPositionMotorActive |= 1 << i;
+			CacheRotationPositionMotorActive();
 		}
 		}
 	}
 	}
 }
 }
@@ -804,6 +808,10 @@ void SixDOFConstraint::RestoreState(StateRecorder &inStream)
 	inStream.Read(mTargetAngularVelocity);
 	inStream.Read(mTargetAngularVelocity);
 	inStream.Read(mTargetPosition);
 	inStream.Read(mTargetPosition);
 	inStream.Read(mTargetOrientation);
 	inStream.Read(mTargetOrientation);
+
+	CacheTranslationMotorActive();
+	CacheRotationMotorActive();
+	CacheRotationPositionMotorActive();
 }
 }
 
 
 Ref<ConstraintSettings> SixDOFConstraint::GetConstraintSettings() const
 Ref<ConstraintSettings> SixDOFConstraint::GetConstraintSettings() const

+ 3 - 0
Jolt/Physics/Constraints/SixDOFConstraint.h

@@ -196,6 +196,9 @@ private:
 	// Cache the state of mRotationMotorActive
 	// Cache the state of mRotationMotorActive
 	void						CacheRotationMotorActive();
 	void						CacheRotationMotorActive();
 
 
+	// Cache the state of mRotationPositionMotorActive
+	void						CacheRotationPositionMotorActive();
+
 	/// Cache the state of mHasSpringLimits
 	/// Cache the state of mHasSpringLimits
 	void						CacheHasSpringLimits();
 	void						CacheHasSpringLimits();