Browse Source

Newton scene collision doesn't work as expected

Panagiotis Christopoulos Charitos 10 years ago
parent
commit
c45d7bb97e

+ 7 - 6
include/anki/physics/PhysicsWorld.h

@@ -44,7 +44,7 @@ public:
 
 	NewtonCollision* getNewtonScene() const
 	{
-		return m_scene;
+		return m_sceneCollision;
 	}
 
 	const Vec4& getGravity() const
@@ -67,7 +67,8 @@ public:
 private:
 	HeapAllocator<U8> m_alloc;
 	mutable NewtonWorld* m_world = nullptr;
-	NewtonCollision* m_scene = nullptr;
+	NewtonCollision* m_sceneCollision = nullptr;
+	NewtonBody* m_sceneBody = nullptr;
 	Vec4 m_gravity = Vec4(0.0, -9.8, 0.0, 0.0);
 	F32 m_dt = 0.0;
 
@@ -83,7 +84,7 @@ private:
 
 	/// Custom update
 	static void postUpdateCallback(
-		const NewtonWorld* const world, 
+		const NewtonWorld* const world,
 		void* const listenerUserData, F32 dt)
 	{
 		static_cast<PhysicsWorld*>(listenerUserData)->postUpdate(dt);
@@ -92,7 +93,7 @@ private:
 	void postUpdate(F32 dt);
 
 	static void destroyCallback(
-		const NewtonWorld* const world, 
+		const NewtonWorld* const world,
 		void* const listenerUserData)
 	{}
 
@@ -105,10 +106,10 @@ inline PhysicsPtr<T> PhysicsWorld::newInstance(TArgs&&... args)
 {
 	Error err = ErrorCode::NONE;
 	PhysicsPtr<T> out;
-		
+
 	T* ptr = m_alloc.template newInstance<T>(this);
 	err = ptr->create(std::forward<TArgs>(args)...);
-	
+
 	if(!err)
 	{
 		registerObject(ptr);

+ 2 - 2
src/physics/PhysicsBody.cpp

@@ -39,7 +39,7 @@ Error PhysicsBody::create(const Initializer& init)
 	// Create
 	Mat4 trf = toNewton(Mat4(init.m_startTrf));
 	
-	if(init.m_static)
+	/*if(init.m_static)
 	{
 		// Create static collision
 		NewtonCollision* scene = m_world->getNewtonScene();
@@ -54,7 +54,7 @@ Error PhysicsBody::create(const Initializer& init)
 
 		return ErrorCode::NONE;
 	}
-	else if(init.m_kinematic)
+	else*/ if(init.m_kinematic)
 	{
 		// TODO
 	}

+ 20 - 5
src/physics/PhysicsWorld.cpp

@@ -30,9 +30,22 @@ PhysicsWorld::PhysicsWorld()
 //==============================================================================
 PhysicsWorld::~PhysicsWorld()
 {
+	if(m_sceneBody)
+	{
+		NewtonDestroyBody(m_sceneBody);
+		m_sceneBody = nullptr;
+	}
+
+	if(m_sceneCollision)
+	{
+		NewtonDestroyCollision(m_sceneCollision);
+		m_sceneCollision = nullptr;
+	}
+
 	if(m_world)
 	{
 		NewtonDestroy(m_world);
+		m_world = nullptr;
 	}
 
 	gAlloc = nullptr;
@@ -44,7 +57,7 @@ Error PhysicsWorld::create(AllocAlignedCallback allocCb, void* allocCbData)
 	Error err = ErrorCode::NONE;
 
 	m_alloc = HeapAllocator<U8>(allocCb, allocCbData);
-	
+
 	// Set allocators
 	gAlloc = &m_alloc;
 	NewtonSetMemorySystem(newtonAlloc, newtonFree);
@@ -61,10 +74,12 @@ Error PhysicsWorld::create(AllocAlignedCallback allocCb, void* allocCbData)
 	NewtonSetSolverModel(m_world, 1);
 
 	// Create scene collision
-	m_scene = NewtonCreateSceneCollision(m_world, 0);
+	m_sceneCollision = NewtonCreateSceneCollision(m_world, 0);
+	Mat4 trf = Mat4::getIdentity();
+	m_sceneBody = NewtonCreateDynamicBody(m_world, m_sceneCollision, &trf[0]);
 
 	// Set the post update listener
-	NewtonWorldAddPostListener(m_world, "world", this, postUpdateCallback, 
+	NewtonWorldAddPostListener(m_world, "world", this, postUpdateCallback,
 		destroyCallback);
 
 	return err;
@@ -106,7 +121,7 @@ void PhysicsWorld::cleanupMarkedForDeletion()
 		// Remove from player controllers
 		if(obj->getType() == PhysicsObject::Type::PLAYER_CONTROLLER)
 		{
-		
+
 			auto it2 = m_playerControllers.getBegin();
 			for(; it2 != m_playerControllers.getEnd(); ++it2)
 			{
@@ -131,7 +146,7 @@ void PhysicsWorld::postUpdate(F32 dt)
 {
 	for(PhysicsPlayerController* player : m_playerControllers)
 	{
-		NewtonDispachThreadJob(m_world, 
+		NewtonDispachThreadJob(m_world,
 			PhysicsPlayerController::postUpdateKernelCallback, player);
 	}
 }

+ 3 - 2
testapp/Main.cpp

@@ -41,7 +41,7 @@ App* app;
 ModelNode* horse;
 PerspectiveCamera* cam;
 
-#define NO_PLAYER 1
+#define NO_PLAYER 0
 
 
 //==============================================================================
@@ -282,7 +282,8 @@ Error init()
 		scene.newSceneNode<ModelNode>("fog", fog, 
 			"models/fog/volumetric_fog_box.ankimdl");
 		MoveComponent& move = fog->getComponent<MoveComponent>();
-		move.setLocalOrigin(Vec4(10.0, -19.0, 0.0, 0.0));
+		//move.setLocalOrigin(Vec4(10.0, -19.0, 0.0, 0.0));
+		move.setLocalOrigin(Vec4(10.0, -16.5, 0.0, 0.0));
 		move.setLocalScale(20.0);
 	}
 #endif