Browse Source

Add some ray casting tests

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
849a70b51e

+ 27 - 0
samples/physics_playground/Main.cpp

@@ -8,6 +8,22 @@
 
 using namespace anki;
 
+class RayCast : public PhysicsWorldRayCastCallback
+{
+public:
+	RayCast(Vec3 from, Vec3 to, PhysicsMaterialBit mtl)
+		: PhysicsWorldRayCastCallback(from, to, mtl)
+	{
+	}
+
+	void processResult(PhysicsFilteredObject& obj, const Vec3& worldNormal, const Vec3& worldPosition)
+	{
+		SceneNode* node = static_cast<SceneNode*>(obj.getUserData());
+		ANKI_ASSERT(node);
+		ANKI_LOGI("Ray hits %s", node->getName().cstr());
+	}
+};
+
 class MyApp : public SampleApp
 {
 public:
@@ -159,6 +175,17 @@ Error MyApp::userMainLoop(Bool& quit)
 		body->addChild(monkey);
 	}
 
+	if(getInput().getMouseButton(MouseButton::RIGHT) == 1)
+	{
+		Transform camTrf = getSceneGraph().getActiveCameraNode().getComponent<MoveComponent>().getWorldTransform();
+		Vec3 from = camTrf.getOrigin().xyz();
+		Vec3 to = from + -camTrf.getRotation().getZAxis() * 10.0f;
+
+		RayCast ray(from, to, PhysicsMaterialBit::ALL);
+
+		getPhysicsWorld().rayCast(ray);
+	}
+
 	return Error::NONE;
 }
 

+ 4 - 5
src/anki/physics/PhysicsWorld.cpp

@@ -222,14 +222,13 @@ void PhysicsWorld::destroyObject(PhysicsObject* obj)
 	m_alloc.getMemoryPool().free(obj);
 }
 
-void PhysicsWorld::rayCast(WeakArray<PhysicsWorldRayCastCallback> rayCasts)
+void PhysicsWorld::rayCast(WeakArray<PhysicsWorldRayCastCallback*> rayCasts)
 {
 	MyRaycastCallback callback;
-	for(PhysicsWorldRayCastCallback& cb : rayCasts)
+	for(PhysicsWorldRayCastCallback* cb : rayCasts)
 	{
-		callback.m_raycast = &cb;
-
-		m_world->rayTest(toBt(cb.m_from), toBt(cb.m_to), callback);
+		callback.m_raycast = cb;
+		m_world->rayTest(toBt(cb->m_from), toBt(cb->m_to), callback);
 	}
 }
 

+ 9 - 2
src/anki/physics/PhysicsWorld.h

@@ -33,7 +33,7 @@ public:
 	}
 
 	/// Process a raycast result.
-	virtual Bool processResult(PhysicsFilteredObject& obj, const Vec3& worldNormal, const Vec3& worldPosition) = 0;
+	virtual void processResult(PhysicsFilteredObject& obj, const Vec3& worldNormal, const Vec3& worldPosition) = 0;
 };
 
 /// The master container for all physics related stuff.
@@ -71,7 +71,14 @@ public:
 		return m_alloc;
 	}
 
-	void rayCast(WeakArray<PhysicsWorldRayCastCallback> rayCasts);
+	void rayCast(WeakArray<PhysicsWorldRayCastCallback*> rayCasts);
+
+	void rayCast(PhysicsWorldRayCastCallback& raycast)
+	{
+		PhysicsWorldRayCastCallback* ptr = &raycast;
+		WeakArray<PhysicsWorldRayCastCallback*> arr(&ptr, 1);
+		rayCast(arr);
+	}
 
 anki_internal:
 	btDynamicsWorld* getBtWorld() const

+ 2 - 1
src/anki/scene/BodyNode.cpp

@@ -55,9 +55,10 @@ Error BodyNode::init(const CString& resourceFname)
 
 	// Create body
 	PhysicsBodyInitInfo init;
-	init.m_mass = 1.0;
+	init.m_mass = 1.0f;
 	init.m_shape = m_rsrc->getShape();
 	m_body = getSceneGraph().getPhysicsWorld().newInstance<PhysicsBody>(init);
+	m_body->setUserData(this);
 
 	// Joint component
 	newComponent<JointComponent>(this);

+ 0 - 5
src/anki/scene/BodyNode.h

@@ -24,11 +24,6 @@ public:
 
 	ANKI_USE_RESULT Error init(const CString& resourceFname);
 
-	PhysicsBodyPtr getPhysicsBody() const
-	{
-		return m_body;
-	}
-
 private:
 	CollisionResourcePtr m_rsrc;
 	PhysicsBodyPtr m_body;

+ 1 - 0
src/anki/scene/PlayerNode.cpp

@@ -125,6 +125,7 @@ Error PlayerNode::init(const Vec4& position)
 	PhysicsPlayerControllerInitInfo init;
 	init.m_position = position;
 	m_player = getSceneGraph().getPhysicsWorld().newInstance<PhysicsPlayerController>(init);
+	m_player->setUserData(this);
 
 	// Player controller component
 	newComponent<PlayerControllerComponent>(this, m_player);