瀏覽代碼

More changes to prepare for Jolt integration

Panagiotis Christopoulos Charitos 10 月之前
父節點
當前提交
695f1a378a

+ 10 - 0
AnKi/Physics/PhysicsJoint.cpp

@@ -57,6 +57,16 @@ PhysicsHingeJoint::PhysicsHingeJoint(PhysicsBodyPtr bodyA, const Vec3& relPos, c
 	getJoint()->setUserConstraintPtr(static_cast<PhysicsObject*>(this));
 }
 
+PhysicsHingeJoint::PhysicsHingeJoint(PhysicsBodyPtr bodyA, const Vec3& relPosA, const Vec3& axisA, PhysicsBodyPtr bodyB, const Vec3& relPosB,
+									 const Vec3& axisB)
+	: PhysicsJoint(JointType::kHinge)
+{
+	m_bodyA = std::move(bodyA);
+	m_bodyB = std::move(bodyB);
+	m_hinge.construct(*m_bodyA->getBtBody(), *m_bodyB->getBtBody(), toBt(relPosA), toBt(relPosB), toBt(axisA), toBt(axisB));
+	getJoint()->setUserConstraintPtr(static_cast<PhysicsObject*>(this));
+}
+
 PhysicsHingeJoint::~PhysicsHingeJoint()
 {
 	m_hinge.destroy();

+ 45 - 8
AnKi/Scene/Components/BodyComponent.cpp

@@ -25,6 +25,16 @@ BodyComponent::~BodyComponent()
 {
 }
 
+void BodyComponent::removeBody()
+{
+	m_shapeType = ShapeType::kCount;
+	m_body.reset(nullptr);
+	m_teleported = false;
+	m_force = Vec3(0.0f);
+	m_mesh.reset(nullptr);
+	m_collisionShape.reset(nullptr);
+}
+
 void BodyComponent::loadMeshResource(CString meshFilename)
 {
 	CpuMeshResourcePtr rsrc;
@@ -34,8 +44,9 @@ void BodyComponent::loadMeshResource(CString meshFilename)
 		return;
 	}
 
+	removeBody();
+	m_shapeType = ShapeType::kMesh;
 	m_mesh = std::move(rsrc);
-	m_shapeDirty = true;
 }
 
 void BodyComponent::setMeshFromModelComponent(U32 patchIndex)
@@ -58,6 +69,17 @@ CString BodyComponent::getMeshResourceFilename() const
 	return (m_mesh.isCreated()) ? m_mesh->getFilename() : CString();
 }
 
+void BodyComponent::setBoxCollisionShape(const Vec3& extend)
+{
+	if(ANKI_SCENE_ASSERT(extend > 0.0f))
+	{
+		removeBody();
+		m_shapeType = ShapeType::kAabb;
+		m_boxExtend = extend;
+		m_collisionShape = PhysicsWorld::getSingleton().newInstance<PhysicsBox>(extend);
+	}
+}
+
 void BodyComponent::setMass(F32 mass)
 {
 	if(!ANKI_SCENE_ASSERT(mass >= 0.0f))
@@ -65,8 +87,11 @@ void BodyComponent::setMass(F32 mass)
 		return;
 	}
 
-	m_mass = mass;
-	m_shapeDirty = true;
+	if(m_mass != mass)
+	{
+		m_mass = mass;
+		m_body.reset(nullptr);
+	}
 }
 
 void BodyComponent::teleportTo(const Transform& trf)
@@ -79,17 +104,29 @@ void BodyComponent::teleportTo(const Transform& trf)
 
 Error BodyComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
 {
-	if(m_shapeDirty)
+	if(m_shapeType == ShapeType::kCount)
 	{
-		updated = true;
-		m_shapeDirty = false;
+		return Error::kNone;
+	}
 
-		m_body.reset(nullptr);
+	const Bool shapeDirty = !m_body.isCreated();
+	if(shapeDirty)
+	{
+		updated = true;
 
 		PhysicsBodyInitInfo init;
 		init.m_mass = m_mass;
 		init.m_transform = (m_teleported) ? m_teleportTrf : m_node->getWorldTransform();
-		init.m_shape = m_mesh->getOrCreateCollisionShape(m_mass == 0.0f);
+
+		if(m_shapeType == ShapeType::kMesh)
+		{
+			init.m_shape = m_mesh->getOrCreateCollisionShape(m_mass == 0.0f);
+		}
+		else
+		{
+			init.m_shape = m_collisionShape;
+		}
+
 		m_body = PhysicsWorld::getSingleton().newInstance<PhysicsBody>(init);
 		m_body->setUserData(this);
 

+ 6 - 8
AnKi/Scene/Components/BodyComponent.h

@@ -30,12 +30,9 @@ public:
 
 	CString getMeshResourceFilename() const;
 
-	void removeBody()
-	{
-		m_body.reset(nullptr);
-		m_teleported = false;
-		m_force = Vec3(0.0f);
-	}
+	void setBoxCollisionShape(const Vec3& extend);
+
+	void removeBody();
 
 	void setMass(F32 mass);
 
@@ -72,9 +69,11 @@ private:
 	ModelComponent* m_modelc = nullptr;
 	CpuMeshResourcePtr m_mesh;
 
+	PhysicsCollisionShapePtr m_collisionShape;
+
 	union
 	{
-		Vec3 m_aabbExtend = Vec3(0.0f);
+		Vec3 m_boxExtend = Vec3(0.0f);
 		F32 m_sphereRadius;
 	};
 
@@ -85,7 +84,6 @@ private:
 	Vec3 m_force = Vec3(0.0f);
 	Vec3 m_forcePosition = Vec3(0.0f);
 
-	Bool m_shapeDirty = true;
 	Bool m_teleported = false;
 
 	ShapeType m_shapeType = ShapeType::kCount;

+ 17 - 1
AnKi/Scene/Components/JointComponent.cpp

@@ -109,6 +109,19 @@ void JointComponent::newHingeJoint(const Vec3& relPosFactor, const Vec3& axis, F
 	m_jointList.pushBack(newNode);
 }
 
+void JointComponent::newHingeJoint(const Vec3& relPosFactorA, const Vec3& relPosFactorB, const Vec3& axis, F32 breakingImpulse)
+{
+	JointNode* newNode = newInstance<JointNode>(SceneMemoryPool::getSingleton());
+
+	newNode->m_type = JointType::kHinge;
+	newNode->m_hinge.m_relPosBody1 = relPosFactorA;
+	newNode->m_hinge.m_relPosBody2 = relPosFactorB;
+	newNode->m_hinge.m_axis = axis;
+	newNode->m_breakingImpulse = breakingImpulse;
+
+	m_jointList.pushBack(newNode);
+}
+
 Error JointComponent::update([[maybe_unused]] SceneComponentUpdateInfo& info, Bool& updated)
 {
 	SceneNode* parent = m_node->getParent();
@@ -207,7 +220,10 @@ Error JointComponent::update([[maybe_unused]] SceneComponentUpdateInfo& info, Bo
 
 			if(node.m_hinge.m_relPosBody2 != Vec3(kMaxF32) && bodyc2)
 			{
-				ANKI_ASSERT(!"TODO");
+				const Vec3 relPos2 = computeLocalPivotFromFactors(bodyc2->getPhysicsBody(), node.m_hinge.m_relPosBody2);
+
+				node.m_joint = PhysicsWorld::getSingleton().newInstance<PhysicsHingeJoint>(bodyc1->getPhysicsBody(), relPos1, node.m_hinge.m_axis,
+																						   bodyc2->getPhysicsBody(), relPos2, node.m_hinge.m_axis);
 			}
 			else
 			{

+ 3 - 0
AnKi/Scene/Components/JointComponent.h

@@ -36,6 +36,9 @@ public:
 	/// Create a hinge joint on the BodyComponent of the SceneNode.
 	void newHingeJoint(const Vec3& relPosFactor, const Vec3& axis, F32 brakingImpulse = kMaxF32);
 
+	/// Create a hinge joint on the BodyComponent of the SceneNode.
+	void newHingeJoint(const Vec3& relPosFactorA, const Vec3& relPosFactorB, const Vec3& axis, F32 brakingImpulse = kMaxF32);
+
 private:
 	class JointNode;
 

+ 20 - 6
Samples/PhysicsPlayground/Main.cpp

@@ -129,24 +129,39 @@ Error MyApp::sampleExtraInit()
 
 	// Create a body component with joint
 	{
+		SceneNode* base;
+		ANKI_CHECK(SceneGraph::getSingleton().newSceneNode("hingeBase", base));
+		BodyComponent* bodyc = base->newComponent<BodyComponent>();
+		bodyc->setBoxCollisionShape(Vec3(0.1f));
+		bodyc->teleportTo(Transform(Vec4(-0.0f, 5.0f, -3.0f, 0.0f), Mat3x4::getIdentity(), Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
+
 		SceneNode* monkey;
 		ANKI_CHECK(SceneGraph::getSingleton().newSceneNode("monkey_p2p", monkey));
+		base->addChild(monkey);
 		ModelComponent* modelc = monkey->newComponent<ModelComponent>();
 		modelc->loadModelResource("Assets/Suzanne_dynamic_36043dae41fe12d5.ankimdl");
 
-		BodyComponent* bodyc = monkey->newComponent<BodyComponent>();
+		bodyc = monkey->newComponent<BodyComponent>();
 		bodyc->loadMeshResource("Assets/Suzanne_e3526e1428c0763c.ankimesh");
 		bodyc->teleportTo(Transform(Vec4(-0.0f, 4.0f, -3.0f, 0.0f), Mat3x4::getIdentity(), Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
 		bodyc->setMass(2.0f);
 
 		JointComponent* jointc = monkey->newComponent<JointComponent>();
-		jointc->newHingeJoint(Vec3(0.2f, 1.0f, 0.0f), Vec3(1, 0, 0));
+		jointc->newHingeJoint(Vec3(0.2f, 1.0f, 0.0f), Vec3(0.0f, -1.3f, 0.0f), Vec3(1, 0, 0));
 	}
 
 	// Create a chain
 	{
 		const U LINKS = 5;
 
+		Transform trf(Vec4(-4.3f, 12.0f, -3.0f, 0.0f), Mat3x4::getIdentity(), Vec4(1.0, 1.0, 1.0, 0.0));
+
+		SceneNode* base;
+		ANKI_CHECK(SceneGraph::getSingleton().newSceneNode("p2pBase", base));
+		BodyComponent* bodyc = base->newComponent<BodyComponent>();
+		bodyc->setBoxCollisionShape(Vec3(0.1f));
+		bodyc->teleportTo(trf);
+
 		SceneNode* prevBody = nullptr;
 		for(U32 i = 0; i < LINKS; ++i)
 		{
@@ -154,8 +169,7 @@ Error MyApp::sampleExtraInit()
 			ANKI_CHECK(SceneGraph::getSingleton().newSceneNode(String().sprintf("monkey_chain%u", i).toCString(), monkey));
 			monkey->newComponent<ModelComponent>()->loadModelResource("Assets/Suzanne_dynamic_36043dae41fe12d5.ankimdl");
 
-			Transform trf(Vec4(-4.3f, 12.0f, -3.0f, 0.0f), Mat3x4::getIdentity(), Vec4(1.0, 1.0, 1.0, 0.0));
-			trf.setOrigin(trf.getOrigin() - Vec4(0.0f, F32(i) * 1.25f, 0.0f, 0.0f));
+			trf.setOrigin(trf.getOrigin() - Vec4(0.0f, F32(i * 1) * 1.25f, 0.0f, 0.0f));
 			// trf.getOrigin().x() -= i * 0.25f;
 
 			// monkey->getFirstComponentOfType<MoveComponent>().setLocalTransform(trf);
@@ -169,13 +183,13 @@ Error MyApp::sampleExtraInit()
 			JointComponent* jointc = monkey->newComponent<JointComponent>();
 			if(prevBody == nullptr)
 			{
-				jointc->newPoint2PointJoint(Vec3(0, 1, 0));
+				base->addChild(monkey);
 			}
 			else
 			{
 				prevBody->addChild(monkey);
-				jointc->newPoint2PointJoint2(Vec3(0, 1.0, 0), Vec3(0, -1.0, 0));
 			}
+			jointc->newPoint2PointJoint2(Vec3(0, 1.0, 0), Vec3(0, -1.0, 0));
 
 			prevBody = monkey;
 		}