Quellcode durchsuchen

- Removed some libraries. SDL_image and SDL will be dynamic
- Physics WIP

Panagiotis Christopoulos Charitos vor 15 Jahren
Ursprung
Commit
a6268eee2d

Datei-Diff unterdrückt, da er zu groß ist
+ 396 - 363
build/debug/Makefile


+ 1 - 1
build/debug/gen.cfg.py

@@ -18,4 +18,4 @@ precompiledHeadersFlags = defines__ + " -c -pedantic-errors -pedantic -ansi -Wal
 
 compilerFlags = precompiledHeadersFlags + " -fsingle-precision-constant"
 
-linkerFlags = "-rdynamic -L../../extern/lib-x86-64-linux -Wl,-Bstatic -lBulletSoftBody -lBulletDynamics -lBulletCollision -lLinearMath -lGLEW -lGLU -lSDL -lboost_system -lboost_filesystem -Wl,-Bdynamic -lGL -ljpeg -lpng -ltiff -lSDL_image -pg"
+linkerFlags = "-rdynamic -L../../extern/lib-x86-64-linux -Wl,-Bstatic -lBulletSoftBody -lBulletDynamics -lBulletCollision -lLinearMath -lGLEW -lGLU -lboost_system -lboost_filesystem -Wl,-Bdynamic -lGL -ljpeg -lSDL_image -lSDL -pg"

+ 0 - 1
extern/lib-x86-64-linux/libGLEW.so

@@ -1 +0,0 @@
-libGLEW.so.1.5.5

+ 0 - 1
extern/lib-x86-64-linux/libGLEW.so.1.5

@@ -1 +0,0 @@
-libGLEW.so.1.5.5

BIN
extern/lib-x86-64-linux/libGLEW.so.1.5.5


BIN
extern/lib-x86-64-linux/libSDL.a


+ 0 - 41
extern/lib-x86-64-linux/libSDL.la

@@ -1,41 +0,0 @@
-# libSDL.la - a libtool library file
-# Generated by ltmain.sh (GNU libtool) 2.2.6
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='libSDL-1.3.so.0'
-
-# Names of this library.
-library_names='libSDL-1.3.so.0.0.0 libSDL-1.3.so.0 libSDL.so'
-
-# The name of the static archive.
-old_library='libSDL.a'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags=''
-
-# Libraries that this one depends upon.
-dependency_libs=' -lm -ldl -lpthread'
-
-# Names of additional weak libraries provided by this library
-weak_library_names=''
-
-# Version information for libSDL.
-current=0
-age=0
-revision=0
-
-# Is this an already installed library?
-installed=yes
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=no
-
-# Files to dlopen/dlpreopen
-dlopen=''
-dlpreopen=''
-
-# Directory that this library needs to be installed in:
-libdir='/home/godlike/src/SDL/install/lib'

BIN
extern/lib-x86-64-linux/libSDL_image.a


+ 0 - 41
extern/lib-x86-64-linux/libSDL_image.la

@@ -1,41 +0,0 @@
-# libSDL_image.la - a libtool library file
-# Generated by ltmain.sh (GNU libtool) 2.2.6
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='libSDL_image-1.2.so.0'
-
-# Names of this library.
-library_names='libSDL_image-1.2.so.0.8.2 libSDL_image-1.2.so.0 libSDL_image.so'
-
-# The name of the static archive.
-old_library='libSDL_image.a'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags=''
-
-# Libraries that this one depends upon.
-dependency_libs=' /usr/lib/libSDL.la'
-
-# Names of additional weak libraries provided by this library
-weak_library_names=''
-
-# Version information for libSDL_image.
-current=8
-age=8
-revision=2
-
-# Is this an already installed library?
-installed=yes
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=no
-
-# Files to dlopen/dlpreopen
-dlopen=''
-dlpreopen=''
-
-# Directory that this library needs to be installed in:
-libdir='/users/panoscc/src/SDL_image/install/lib'

BIN
extern/lib-x86-64-linux/libSDLmain.a


+ 7 - 4
src/Main.cpp

@@ -26,7 +26,6 @@
 #include "SkelAnimCtrl.h"
 #include "SkelNode.h"
 #include "LightProps.h"
-#include "PhyCommon.h"
 #include "Parser.h"
 #include "ParticleEmitter.h"
 #include "PhyCharacter.h"
@@ -35,6 +34,8 @@
 #include "MainRenderer.h"
 #include "DebugDrawer.h"
 #include "PhyCharacter.h"
+#include "RigidBody.h"
+
 
 App* app = NULL; ///< The only global var. App constructor sets it
 
@@ -64,15 +65,17 @@ Vec<btRigidBody*> boxes;
 
 void initPhysics()
 {
-	btDiscreteDynamicsWorld* dynamicsWorld = app->getScene()->getPhysics()->getDynamicsWorld();
-
 	btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.)));
 
 	Transform groundTransform;
 	groundTransform.setIdentity();
 	groundTransform.setOrigin(Vec3(0,-50, 0));
 
-	new RigidBody(0.0, groundTransform, groundShape, NULL/*, Physics::CG_MAP, Physics::CG_ALL*/);
+	RigidBody::Initializer init;
+	init.mass = 0.0;
+	init.shape = groundShape;
+
+	new RigidBody(*app->getScene()->getPhysics(), init);
 
 
 	/*{

+ 5 - 0
src/Physics/BtAndAnkiConvertors.h

@@ -1,6 +1,11 @@
 #ifndef PHYCONVERTORS_H
 #define PHYCONVERTORS_H
 
+#include <btBulletCollisionCommon.h>
+#include <btBulletDynamicsCommon.h>
+#include "Common.h"
+#include "Math.h"
+
 
 inline Vec3 toAnki(const btVector3& v)
 {

+ 1 - 1
src/Physics/MotionState.h

@@ -1,8 +1,8 @@
 #ifndef MOTIONSTATE_H
 #define MOTIONSTATE_H
 
+#include <LinearMath/btMotionState.h>
 #include "Common.h"
-#include "PhyCommon.h"
 #include "SceneNode.h"
 
 

+ 1 - 0
src/Physics/PhyCharacter.cpp

@@ -5,6 +5,7 @@
 #include "PhyCharacter.h"
 #include "Physics.h"
 #include "MotionState.h"
+#include "RigidBody.h"
 
 
 //======================================================================================================================

+ 0 - 15
src/Physics/PhyCommon.h

@@ -1,15 +0,0 @@
-#ifndef _PHYCOMMON_H_
-#define _PHYCOMMON_H_
-
-#include <btBulletCollisionCommon.h>
-#include <btBulletDynamicsCommon.h>
-#include <BulletDynamics/Character/btKinematicCharacterController.h>
-#include <BulletCollision/CollisionDispatch/btGhostObject.h>
-
-#include "Common.h"
-#include "Math.h"
-#include "BtAndAnkiConvertors.h"
-#include "MotionState.h"
-#include "Physics.h"
-
-#endif

+ 2 - 1
src/Physics/Physics.cpp

@@ -1,6 +1,7 @@
+#include <BulletCollision/CollisionDispatch/btGhostObject.h>
 #include "Physics.h"
 #include "PhyCharacter.h"
-
+#include "MotionState.h"
 
 
 //======================================================================================================================

+ 17 - 9
src/Physics/Physics.h

@@ -1,13 +1,15 @@
 #ifndef PHYSICS_H
 #define PHYSICS_H
 
+#include <btBulletCollisionCommon.h>
+#include <btBulletDynamicsCommon.h>
 #include "Common.h"
-#include "PhyCommon.h"
 #include "BtAndAnkiConvertors.h"
 #include "DebugDrawer.h"
 
 
 class PhyCharacter;
+class RigidBody;
 
 
 /**
@@ -16,6 +18,7 @@ class PhyCharacter;
 class Physics
 {
 	friend class PhyCharacter; ///< For registering and unregistering
+	friend class RigidBody;  ///< For registering and unregistering
 
 	public:
 		/**
@@ -29,22 +32,27 @@ class Physics
 			CG_ALL = CG_MAP | CG_PARTICLE
 		};
 
-	PROPERTY_R(btDiscreteDynamicsWorld*, dynamicsWorld, getDynamicsWorld)
-	PROPERTY_R(float, defaultContactProcessingThreshold, getDefaultContactProcessingThreshold)
-
 	public:
+		Physics();
+		void update(float crntTime);
+		void debugDraw();
+
+	private:
+		btDiscreteDynamicsWorld* dynamicsWorld;
 		btDefaultCollisionConfiguration* collisionConfiguration;
 		btCollisionDispatcher* dispatcher;
 		btBroadphaseInterface* broadphase;
 		btSequentialImpulseConstraintSolver* sol;
 		DebugDrawer* debugDrawer;
-
-		Physics();
-		void update(float crntTime);
-
-	private:
+		float defaultContactProcessingThreshold;
 		Vec<PhyCharacter*> characters;
 		float time; ///< Time of prev update
 };
 
+
+inline void Physics::debugDraw()
+{
+	dynamicsWorld->debugDrawWorld();
+}
+
 #endif

+ 16 - 38
src/Physics/RigidBody.cpp

@@ -1,38 +1,40 @@
 #include "RigidBody.h"
-#include "App.h"
 #include "Physics.h"
 #include "Scene.h"
+#include "MotionState.h"
 
 
 //======================================================================================================================
 // Constructor                                                                                                         =
 //======================================================================================================================
-RigidBody::RigidBody(float mass, const Transform& startTransform, btCollisionShape* shape, SceneNode* node,
-                     int group, int mask):
-  btRigidBody(btRigidBody::btRigidBodyConstructionInfo(0.0, NULL, NULL, btVector3(0.0, 0.0, 0.0))) // dummy init
+RigidBody::RigidBody(Physics& physics_, const Initializer& init):
+  btRigidBody(btRigidBody::btRigidBodyConstructionInfo(0.0, NULL, NULL, btVector3(0.0, 0.0, 0.0))), // dummy init
+  physics(physics_)
 {
-	DEBUG_ERR(shape==NULL || shape->getShapeType()==INVALID_SHAPE_PROXYTYPE);
+	DEBUG_ERR(init.shape==NULL || init.shape->getShapeType()==INVALID_SHAPE_PROXYTYPE);
 
-	bool isDynamic = (mass != 0.0);
+	bool isDynamic = (init.mass != 0.0);
 
 	btVector3 localInertia;
 	if(isDynamic)
-		shape->calculateLocalInertia(mass, localInertia);
+		init.shape->calculateLocalInertia(init.mass, localInertia);
 	else
 		localInertia = btVector3(0.0, 0.0, 0.0);
 
-	motionState.reset(new MotionState(toBt(startTransform), node));
+	motionState.reset(new MotionState(toBt(init.startTrf), init.sceneNode));
 
-	btRigidBody::btRigidBodyConstructionInfo cInfo(mass, motionState.get(), shape, localInertia);
+	btRigidBody::btRigidBodyConstructionInfo cInfo(init.mass, motionState.get(), init.shape, localInertia);
 
 	setupRigidBody(cInfo);
 
-	setContactProcessingThreshold(app->getScene()->getPhysics()->getDefaultContactProcessingThreshold());
+	setContactProcessingThreshold(physics.defaultContactProcessingThreshold);
 
-	if(mask==-1 || group==-1)
-		app->getScene()->getPhysics()->getDynamicsWorld()->addRigidBody(this);
+	forceActivationState(ISLAND_SLEEPING);
+
+	if(init.mask==-1 || init.group==-1)
+		physics.dynamicsWorld->addRigidBody(this);
 	else
-		app->getScene()->getPhysics()->getDynamicsWorld()->addRigidBody(this, group, mask);
+		physics.dynamicsWorld->addRigidBody(this, init.group, init.mask);
 }
 
 
@@ -41,29 +43,5 @@ RigidBody::RigidBody(float mass, const Transform& startTransform, btCollisionSha
 //======================================================================================================================
 RigidBody::~RigidBody()
 {
-	// find the body
-	RigidBody* body = NULL;
-	btCollisionObject* obj;
-	int i;
-	for(i=0; i<app->getScene()->getPhysics()->getDynamicsWorld()->getNumCollisionObjects(); i++)
-	{
-		obj = app->getScene()->getPhysics()->getDynamicsWorld()->getCollisionObjectArray()[i];
-		RigidBody* body1 = static_cast<RigidBody*>(btRigidBody::upcast(obj)); // from btCollisionShapt to RigidBody
-
-		if(body1 == this)
-		{
-			body = body1;
-			break;
-		}
-	}
-
-	// check
-	if(body == NULL)
-	{
-		ERROR("Cannot find body 0x" << hex << body);
-		return;
-	}
-
-	// remove it from world
-	app->getScene()->getPhysics()->getDynamicsWorld()->removeCollisionObject(obj);
+	physics.dynamicsWorld->removeRigidBody(this);
 }

+ 28 - 9
src/Physics/RigidBody.h

@@ -10,6 +10,7 @@
 
 class SceneNode;
 class MotionState;
+class Physics;
 
 
 /**
@@ -18,26 +19,44 @@ class MotionState;
 class RigidBody: public btRigidBody
 {
 	public:
+		/**
+		 * Initializer class
+		 */
+		struct Initializer
+		{
+			float mass;
+			Transform startTrf;
+			btCollisionShape* shape;
+			SceneNode* sceneNode;
+		  int group;
+		  int mask;
+
+		  Initializer();
+		};
+
 		/**
 		 * Init and register
-		 * @param mass S/E
-		 * @param startTransform Initial pos
-		 * @param shape Collision shape
-		 * @param node SceneNode to move
-		 * @param group -1 if not used
-		 * @param mask -1 if not used
 		 */
-		RigidBody(float mass, const Transform& startTransform, btCollisionShape* shape, SceneNode* node,
-		          int group = -1, int mask = -1);
+		RigidBody(Physics& physics, const Initializer& init);
 
 		/**
-		 * Unregister it
+		 * Unregister
 		 */
 		~RigidBody();
 
 	private:
+		Physics& physics; ///< Know your father
 		auto_ptr<MotionState> motionState; ///< Keep it here as well for garbage collection
 };
 
 
+inline RigidBody::Initializer::Initializer():
+	mass(0.0),
+	startTrf(Transform::getIdentity()),
+	shape(NULL),
+	sceneNode(NULL),
+	group(-1),
+	mask(-1)
+{}
+
 #endif

+ 1 - 1
src/Renderer/Dbg.cpp

@@ -277,7 +277,7 @@ void Renderer::Dbg::run()
 	// Physics
 	glPolygonMode(GL_FRONT, GL_LINE);
 	setModelMat(Mat4::getIdentity());
-	app->getScene()->getPhysics()->getDynamicsWorld()->debugDrawWorld();
+	app->getScene()->getPhysics()->debugDraw();
 	glPolygonMode(GL_FRONT, GL_FILL);
 }
 

+ 0 - 1
src/Resources/Helpers/Image.h

@@ -1,7 +1,6 @@
 #ifndef IMAGE_H
 #define IMAGE_H
 
-#include <boost/ptr_container/ptr_vector.hpp>
 #include "Common.h"
 #include "Vec.h"
 

+ 12 - 3
src/Scene/ParticleEmitter.cpp

@@ -1,6 +1,8 @@
+#include <btBulletCollisionCommon.h>
+#include <btBulletDynamicsCommon.h>
 #include "ParticleEmitter.h"
+#include "RigidBody.h"
 #include "MainRenderer.h"
-#include "PhyCommon.h"
 #include "App.h"
 #include "Scene.h"
 #include "Util.h"
@@ -49,8 +51,15 @@ void ParticleEmitter::init(const char* filename)
 
 		float mass = particleMass + Util::randFloat(particleMassMargin) * 2.0 - particleMassMargin;
 
-		RigidBody* body = new RigidBody(mass, toAnki(startingTrf), collShape.get(), particle, Physics::CG_PARTICLE,
-		                                Physics::CG_ALL ^ Physics::CG_PARTICLE); ///@todo add parent
+		RigidBody::Initializer init;
+		init.mass = mass;
+		init.startTrf = toAnki(startingTrf);
+		init.shape = collShape.get();
+		init.sceneNode = particle;
+		init.group = Physics::CG_PARTICLE;
+		init.mask = Physics::CG_ALL ^ Physics::CG_PARTICLE;
+		RigidBody* body = new RigidBody(*app->getScene()->getPhysics(), init);
+
 		body->forceActivationState(DISABLE_SIMULATION);
 
 		particle->body.reset(body);

+ 3 - 1
src/Scene/ParticleEmitter.h

@@ -7,7 +7,9 @@
 #include "MeshNode.h"
 #include "GhostNode.h"
 #include "ParticleEmitterProps.h"
-#include "RigidBody.h"
+
+
+class RigidBody;
 
 
 /**

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.