]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
heights working
authorPeter Schaefer <schaeferpm@gmail.com>
Mon, 22 Jun 2015 11:48:28 +0000 (13:48 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Mon, 22 Jun 2015 11:48:28 +0000 (13:48 +0200)
Weave/Scene/EventBox.cpp
Weave/Scene/EventBox.h
Weave/Scene/Level.cpp
Weave/Scene/Level.h
Weave/Scene/Marvin.cpp
Weave/Scene/Scene.cpp
Weave/Scene/Scene.h
Weave/Scene/SceneObject.cpp
Weave/Scene/SceneObject.h

index ceeed9cb2c5166ffe662ac7d3c115e22ab484423..196072bcdf583991758ba962af2c5be0514fc3a8 100644 (file)
@@ -32,7 +32,7 @@ void EventBox::draw() const
                model->drawBBox(modelMat,vec4(.3f,.9f,.9f,1.f));
 }
 
-void EventBox::collides(SceneObject* _other)
+void EventBox::collides(SceneObject* _other, btPersistentManifold* _contactManifold, float _deltaT)
 {
        if ((texture != nullptr && texture->operator std::string() == "model_player_2D.png") || _other->getTexture() != nullptr && (_other->getTexture()->operator std::string() == "model_player_2D.png"))
        {
index dd8fc497fdc98dd4de3e357d8cd14155febcd3fb..68d0ead32bcd7300b869f461d30b1842bedf75a2 100644 (file)
@@ -18,7 +18,7 @@ public:
 
        virtual void update(float);
        virtual void draw() const;
-       virtual void collides(SceneObject* other);
+       virtual void collides(SceneObject* other, btPersistentManifold* contactManifold, float deltaT = 1.f) override;
 
 protected:
        uint eb_type;
index e58d2a0ec07df6aaf33bc833b470843d9092523a..401ad73089a0d1617c8ba21f02b69c7f213397b1 100644 (file)
@@ -11,6 +11,16 @@ Level::Level(Shader* _shader, std::string _modelpath, std::string _texturepath)
 {
        collide_group = COL_LEVEL;
        collide_with = COL_MARVIN | COL_ENEMY;
+
+
+       btTransform btModelMat;
+       btModelMat.setFromOpenGLMatrix(value_ptr(modelMat));
+
+       btDefaultMotionState* MotionState =
+               new btDefaultMotionState(btModelMat);
+       btRigidBody::btRigidBodyConstructionInfo RigidBodyCI(0, MotionState, *model, btVector3(0, 0, 0));
+
+       bt_rigid_body = new btRigidBody(RigidBodyCI);
 }
 
 
@@ -18,33 +28,45 @@ Level::~Level()
 {
 }
 
-void Level::collides(SceneObject* _other, btPersistentManifold* _contactManifold)
+void Level::collides(SceneObject* _other, btPersistentManifold* _contactManifold, float _deltaT)
 {
        int numContacts = _contactManifold->getNumContacts();
        //For each contact point in that manifold
        float pdist = _contactManifold->getContactPoint(0).getDistance();
+       vec3 normal;
        for (int j = 0; j < numContacts; j++) 
        {
                //Get the contact information
                btManifoldPoint& pt = _contactManifold->getContactPoint(j);
                btVector3 ptA = pt.getPositionWorldOnA();
                btVector3 ptB = pt.getPositionWorldOnB();
+
                vec3 ptAg(ptA.getX(), ptA.getY(), ptA.getZ());
                vec3 ptBg(ptB.getX(), ptB.getY(), ptB.getZ());
-               vec3 normal = normalize(ptAg - ptBg);
-               pdist = pt.getDistance();
+               //normal = normalize(ptAg - ptBg);
+               //pdist = pt.getDistance();
 
-               //btVector3 ptN = pt.m_normalWorldOnB;
-               //vec3 normal = vec3(ptN.getX(), ptN.getY(), ptN.getZ());
+               btVector3 ptN = pt.m_normalWorldOnB;
+               normal = vec3(ptN.getX(), ptN.getY(), ptN.getZ());
                _other->yFloorDist = pdist * normal[1];
 
-               if (normal[1] <= .6f && pdist<0)
-                       _other->move(-pdist * vec3(normal[0], 0.f, normal[2]));
 
-       }
+               //Height
+               if (_other->yFloorDist < 0 && _other->ySpeed < 0)
+               {
+                       _other->move(-pdist * vec3(0.f, normal[1], 0.f)); 
+               }
+
+               if (normal[1] >= .6f && _other->ySpeed < 0)
+               {
+                       _other->ySpeed = 0;
+               }
+                       
 
-       if (_other->yFloorDist <= 0 && _other->ySpeed<0)
-               _other->ySpeed = 0;
+               //if (normal[1] <= .6f && pdist<0 && pdist > -1)
+               //      _other->move(-pdist * vec3(normal[0], 0.f, normal[2]));
+
+       }
 
        //Message::info((std::string)"Kollision! " + std::to_string(_other->yFloorDist) + " (LVL with " + (std::string)*_other->getModel() + ")");
 
index 8caae54adf925fa33c76f29af312c0320d8943b2..ffe7690e43baa9158a37521398f9b50115a2dcbc 100644 (file)
@@ -12,6 +12,6 @@ public:
        Level(Shader* shader,std::string modelpath, std::string texturepath);
        ~Level();
 
-       virtual void collides(SceneObject* other, btPersistentManifold* contactManifold) override;
+       virtual void collides(SceneObject* other, btPersistentManifold* contactManifold, float deltaT=1.f) override;
 };
 
index ed1f5b69927ca6b5258400d19b31db7886e384d9..75f4e8ccdaf05878c1bfa757ddf49111a74f5e3e 100644 (file)
@@ -33,7 +33,7 @@ void Marvin::update(float deltaT)
 
 
        //Jump
-       if (Events::getJump() && yFloorDist<=0)
+       if (Events::getJump() && abs(yFloorDist)<.5)
                ySpeed += 5.5;
 
        int move_x = Events::getMoveX();
index 9a349027445c35f1a35b152ef4596ab4c73afd3b..b88d247c535eeba3b737c3d35b3d1ff2b289d4dc 100644 (file)
 
 #include <btBulletDynamicsCommon.h>
 
+
 using std::list;
 using std::set;
 using std::stack;
 
 #define timestep 0.01f
 
-#define SCENE_SIZE 500.0
-#define MAX_OBJECTS 16000
-
+//#define SCENE_SIZE 500.0
+//#define MAX_OBJECTS 16000
 
+#define YFALL_SPEED 9.8f
 
 Scene::Scene(unsigned int x, unsigned int y, unsigned int width, unsigned int height, float fovy, float zNear, float zFar, vec3 pos, SceneObject* _lookat) :
 viewPort(x, y, width, height, fovy, zNear, zFar),
@@ -40,13 +41,21 @@ lookat(_lookat)
        bt_collision_configuration = new btDefaultCollisionConfiguration();
        bt_dispatcher = new btCollisionDispatcher(bt_collision_configuration);
 
-       btScalar sscene_size = (btScalar)SCENE_SIZE;
-       btVector3 worldAabbMin(-sscene_size, -sscene_size, -sscene_size);
-       btVector3 worldAabbMax(sscene_size, sscene_size, sscene_size);
+       //btScalar sscene_size = (btScalar)SCENE_SIZE;
+       //btVector3 worldAabbMin(-sscene_size, -sscene_size, -sscene_size);
+       //btVector3 worldAabbMax(sscene_size, sscene_size, sscene_size);
+       //bt_broadphase = new bt32BitAxisSweep3(worldAabbMin, worldAabbMax, MAX_OBJECTS, 0, true);
+
+       bt_broadphase = new btDbvtBroadphase();
+
+       bt_solver = new btSequentialImpulseConstraintSolver;
+
+       bt_dynamics_world = new btDiscreteDynamicsWorld(bt_dispatcher, bt_broadphase, bt_solver, bt_collision_configuration);
 
-       bt_broadphase = new bt32BitAxisSweep3(worldAabbMin, worldAabbMax, MAX_OBJECTS, 0, true);
+       //bt_collision_world = new btCollisionWorld(bt_dispatcher, bt_broadphase, bt_collision_configuration);
 
-       bt_collision_world = new btCollisionWorld(bt_dispatcher, bt_broadphase, bt_collision_configuration);
+
+       bt_dynamics_world->setGravity(btVector3(0, YFALL_SPEED, 0));
 }
 
 
@@ -60,7 +69,9 @@ Scene::~Scene()
        timestamps.empty();
 
        //Bullet
-       delete bt_collision_world;
+       //delete bt_collision_world;
+       delete bt_dynamics_world;
+       delete bt_solver;
        delete bt_broadphase;
        delete bt_dispatcher;
        delete bt_collision_configuration;
@@ -97,21 +108,21 @@ void Scene::update(float deltaT)
                {
                        (*i)->update(deltaT);
                }
+               bt_dynamics_world->stepSimulation(deltaT, 2);
+               //bt_collision_world->performDiscreteCollisionDetection();
 
-               bt_collision_world->performDiscreteCollisionDetection();
-
-               int numManifolds = bt_collision_world->getDispatcher()->getNumManifolds();
+               int numManifolds = bt_dynamics_world->getDispatcher()->getNumManifolds();
                //For each contact manifold
                for (int i = 0; i < numManifolds; i++) {
-                       btPersistentManifold* contactManifold = bt_collision_world->getDispatcher()->getManifoldByIndexInternal(i);
+                       btPersistentManifold* contactManifold = bt_dynamics_world->getDispatcher()->getManifoldByIndexInternal(i);
                        btCollisionObject* obA = const_cast<btCollisionObject*>(contactManifold->getBody0());
                        btCollisionObject* obB = const_cast<btCollisionObject*>(contactManifold->getBody1());
                        contactManifold->refreshContactPoints(obA->getWorldTransform(), obB->getWorldTransform());
 
                        if (contactManifold->getNumContacts()>0)
                        {
-                               ((SceneObject*)obA->getUserPointer())->collides((SceneObject*)obB->getUserPointer(), contactManifold);
-                               ((SceneObject*)obB->getUserPointer())->collides((SceneObject*)obA->getUserPointer(), contactManifold);
+                               ((SceneObject*)obA->getUserPointer())->collides((SceneObject*)obB->getUserPointer(), contactManifold, deltaT);
+                               ((SceneObject*)obB->getUserPointer())->collides((SceneObject*)obA->getUserPointer(), contactManifold, deltaT);
                        }
 
 
@@ -140,10 +151,10 @@ void Scene::update(float deltaT)
                lookat->ySpeed = prev_ySpeed;
 
 
-               for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i)
-               {
-                       //(*i)->update(-max(0.0f, currenttime - deltaT));
-               }
+               //for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i)
+               //{
+               //      //(*i)->update(-max(0.0f, currenttime - deltaT));
+               //}
 
 
                currenttime = max(0.0f, currenttime - deltaT);
@@ -182,7 +193,7 @@ void Scene::addObject(SceneObject* _add)
        ShaderSet.insert(_add->getShader());
 
        //bt_collision_world->addCollisionObject(*_add);
-       bt_collision_world->addCollisionObject(*_add,_add->getCollideGroup(),_add->getCollideWith());
+       bt_dynamics_world->addCollisionObject(*_add,_add->getCollideGroup(),_add->getCollideWith());
 
        _add->setMainScene(this);
 }
index 3a5904eaa1b1478c79c8d898e9aa06cc84e6ed62..e6495f9d08dd1118127616f5668ccf7c232d8089 100644 (file)
@@ -58,5 +58,7 @@ protected:
        btCollisionConfiguration* bt_collision_configuration;
        btCollisionDispatcher* bt_dispatcher;
        btBroadphaseInterface* bt_broadphase;
-       btCollisionWorld* bt_collision_world;
+       btSequentialImpulseConstraintSolver* bt_solver;
+       //btCollisionWorld* bt_collision_world;
+       btDiscreteDynamicsWorld* bt_dynamics_world;
 };
index 3ff94547dad551e9b13ffc974fab8e845be3df41..e6a32fa315ce085b9fe0e59d6763240aa26c24a5 100644 (file)
@@ -66,8 +66,23 @@ bt_collision_object(new btCollisionObject())
        //Graphix::getGlError();
        //Message::info("Done");
 
+       btTransform btModelMat;
+       btModelMat.setFromOpenGLMatrix(value_ptr(modelMat));
+
+       btDefaultMotionState* MotionState =
+               new btDefaultMotionState(btModelMat);
+       btScalar mass = 1;
+       btVector3 fallInertia(0, 0, 0);
+       model->operator btCollisionShape *()->calculateLocalInertia(mass, fallInertia);
+       btRigidBody::btRigidBodyConstructionInfo RigidBodyCI(mass, MotionState, *model, fallInertia);
+
+
+       bt_rigid_body = new btRigidBody(RigidBodyCI);
+
        bt_collision_object->setCollisionShape(*model);
        bt_collision_object->setUserPointer(this);
+
+//     bt_rigid_body
 }
 
 SceneObject::SceneObject(Shader* _shader, const mat4& _modelMat, const vec4& _material, Model* _model, string texturepath) :
@@ -84,7 +99,8 @@ ignore(false),
 newModel(false),
 collide_group(0),
 collide_with(0),
-bt_collision_object(new btCollisionObject())
+bt_collision_object(new btCollisionObject()),
+bt_rigid_body(nullptr)
 {
        //Message::info("Error from befor?");
        //Graphix::getGlError();
@@ -114,11 +130,18 @@ bt_collision_object(new btCollisionObject())
 
 SceneObject::~SceneObject()
 {
+
+       if (bt_rigid_body != nullptr)
+       {
+               delete bt_rigid_body->getMotionState();
+               delete bt_rigid_body;
+       }
+
+
        if (texture!=nullptr)
                Texture::deleteTexture(*texture);
        if (newModel)
                Model::deleteIMetaModel(*model);
-
 }
 
 
@@ -167,7 +190,7 @@ void SceneObject::draw() const
 }
 
 
-void SceneObject::collides(SceneObject* _other, btPersistentManifold* _contactManifold)
+void SceneObject::collides(SceneObject* _other, btPersistentManifold* _contactManifold, float _deltaT)
 {
        int numContacts = _contactManifold->getNumContacts();
        //For each contact point in that manifold
@@ -269,6 +292,12 @@ SceneObject::operator btCollisionObject *() const
        return bt_collision_object;
 }
 
+SceneObject::operator btRigidBody *() const
+{
+       return bt_rigid_body;
+}
+
+
 short SceneObject::getCollideGroup() const
 {
        return collide_group;
index 8642b1a8bcf8b8dd736efb5c28d4dd6665958474..ddf6476b73c0ccfcd921375334717c479e09f806 100644 (file)
@@ -36,7 +36,7 @@ public:
        virtual void update(float);
        virtual void draw() const;
 
-       virtual void collides(SceneObject* other, btPersistentManifold* contactManifold);
+       virtual void collides(SceneObject* other, btPersistentManifold* contactManifold, float deltaT=1.f);
 
        virtual vec3 getPosition() const;
 
@@ -67,6 +67,7 @@ public:
        bool isEnemy();
 
        operator btCollisionObject*() const;
+       operator btRigidBody*() const;
        short getCollideGroup() const;
        short getCollideWith() const;
 
@@ -94,6 +95,7 @@ protected:
 
        //Bullet
        btCollisionObject* bt_collision_object;
+       btRigidBody* bt_rigid_body;
 
 };