Browse Source

Support for setting velocity through BodyCreationSettings (#164)

Jorrit Rouwe 3 years ago
parent
commit
6847760fc8

+ 2 - 0
Jolt/Physics/Body/Body.cpp

@@ -297,6 +297,8 @@ BodyCreationSettings Body::GetBodyCreationSettings() const
 
 	result.mPosition = GetPosition();
 	result.mRotation = GetRotation();
+	result.mLinearVelocity = mMotionProperties != nullptr? mMotionProperties->GetLinearVelocity() : Vec3::sZero();
+	result.mAngularVelocity = mMotionProperties != nullptr? mMotionProperties->GetAngularVelocity() : Vec3::sZero();
 	result.mObjectLayer = GetObjectLayer();
 	result.mCollisionGroup = GetCollisionGroup();
 	result.mMotionType = GetMotionType();

+ 6 - 0
Jolt/Physics/Body/BodyCreationSettings.cpp

@@ -14,6 +14,8 @@ JPH_IMPLEMENT_SERIALIZABLE_NON_VIRTUAL(BodyCreationSettings)
 {
 	JPH_ADD_ATTRIBUTE(BodyCreationSettings, mPosition)
 	JPH_ADD_ATTRIBUTE(BodyCreationSettings, mRotation)
+	JPH_ADD_ATTRIBUTE(BodyCreationSettings, mLinearVelocity)
+	JPH_ADD_ATTRIBUTE(BodyCreationSettings, mAngularVelocity)
 	JPH_ADD_ATTRIBUTE(BodyCreationSettings, mUserData)
 	JPH_ADD_ATTRIBUTE(BodyCreationSettings, mShape)
 	JPH_ADD_ATTRIBUTE(BodyCreationSettings, mCollisionGroup)
@@ -38,6 +40,8 @@ void BodyCreationSettings::SaveBinaryState(StreamOut &inStream) const
 {
 	inStream.Write(mPosition);
 	inStream.Write(mRotation);
+	inStream.Write(mLinearVelocity);
+	inStream.Write(mAngularVelocity);
 	mCollisionGroup.SaveBinaryState(inStream);
 	inStream.Write(mObjectLayer);
 	inStream.Write(mMotionType);
@@ -60,6 +64,8 @@ void BodyCreationSettings::RestoreBinaryState(StreamIn &inStream)
 {
 	inStream.Read(mPosition);
 	inStream.Read(mRotation);
+	inStream.Read(mLinearVelocity);
+	inStream.Read(mAngularVelocity);
 	mCollisionGroup.RestoreBinaryState(inStream);
 	inStream.Read(mObjectLayer);
 	inStream.Read(mMotionType);

+ 4 - 5
Jolt/Physics/Body/BodyCreationSettings.h

@@ -74,11 +74,10 @@ public:
 	/// Restore a shape, all its children and materials. Pass in an empty map in ioShapeMap / ioMaterialMap / ioGroupFilterMap or reuse the same map while reading multiple shapes from the same stream in order to restore duplicates.
 	static BCSResult		sRestoreWithChildren(StreamIn &inStream, IDToShapeMap &ioShapeMap, IDToMaterialMap &ioMaterialMap, IDToGroupFilterMap &ioGroupFilterMap);
 
-	/// Position of the body (not of the center of mass)
-	Vec3					mPosition = Vec3::sZero();
-
-	/// Rotation of the body
-	Quat					mRotation = Quat::sIdentity();
+	Vec3					mPosition = Vec3::sZero();										///< Position of the body (not of the center of mass)
+	Quat					mRotation = Quat::sIdentity();									///< Rotation of the body
+	Vec3					mLinearVelocity = Vec3::sZero();								///< World space linear velocity of the center of mass (m/s)
+	Vec3					mAngularVelocity = Vec3::sZero();								///< World space angular velocity (rad/s)
 
 	/// User data value (can be used by application)
 	uint64					mUserData = 0;

+ 2 - 0
Jolt/Physics/Body/BodyManager.cpp

@@ -184,6 +184,8 @@ Body *BodyManager::CreateBody(const BodyCreationSettings &inBodyCreationSettings
 		mp->SetAngularDamping(inBodyCreationSettings.mAngularDamping);
 		mp->SetMaxLinearVelocity(inBodyCreationSettings.mMaxLinearVelocity);
 		mp->SetMaxAngularVelocity(inBodyCreationSettings.mMaxAngularVelocity);
+		mp->SetLinearVelocity(inBodyCreationSettings.mLinearVelocity); // Needs to happen after setting the max linear/angular velocity
+		mp->SetAngularVelocity(inBodyCreationSettings.mAngularVelocity);
 		mp->SetGravityFactor(inBodyCreationSettings.mGravityFactor);
 		mp->SetMotionQuality(inBodyCreationSettings.mMotionQuality);
 		mp->mAllowSleeping = inBodyCreationSettings.mAllowSleeping;

+ 2 - 4
Samples/SamplesApp.cpp

@@ -806,12 +806,10 @@ void SamplesApp::ShootObject()
 	creation_settings.mMotionQuality = mShootObjectMotionQuality;
 	creation_settings.mFriction = mShootObjectFriction;
 	creation_settings.mRestitution = mShootObjectRestitution;
+	creation_settings.mLinearVelocity = mShootObjectVelocity * GetCamera().mForward;
 
 	// Create body
-	BodyInterface &body_interface = mPhysicsSystem->GetBodyInterface();
-	Body &body = *body_interface.CreateBody(creation_settings);
-	body.SetLinearVelocity(mShootObjectVelocity * GetCamera().mForward);
-	body_interface.AddBody(body.GetID(), EActivation::Activate);
+	mPhysicsSystem->GetBodyInterface().CreateAndAddBody(creation_settings, EActivation::Activate);
 }
 
 bool SamplesApp::CastProbe(float inProbeLength, float &outFraction, Vec3 &outPosition, BodyID &outID)