bt_collision_shape = tmp_shape;
+ btVector3 min,max;
+ btTransform t;
+
+ bt_collision_shape->getAabb(t,min,max);
+
#ifdef COMPARE_MTREE
root = buildMeshTree(_transformation, numvertices, numfaces, vertex, normals, index);
#include "../GLM.h"
-Marvin::Marvin(Shader* _shader, const mat4& _modelMat) : SceneObject(_shader, _modelMat, vec4(7.0f, 0.7f, 1.0f, 3.0f), "Player.dae", "model_player_2D.png")
+Marvin::Marvin(Shader* _shader, const mat4& _modelMat) :
+SceneObject(_shader, _modelMat, vec4(7.0f, 0.7f, 1.0f, 3.0f), "Player.dae", "model_player_2D.png")
{
-
+ collide_group = COL_MARVIN;
+ collide_with = COL_LEVEL | COL_ENEMY;
}
Scene::~Scene()
{
- for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i)
- {
- delete (*i);
- }
+ //for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i)
+ //{
+ // delete (*i);
+ //}
//Bullet
delete bt_collision_world;
(*i)->update(deltaT);
}
+ bt_collision_world->performDiscreteCollisionDetection();
+
+
+ int numManifolds = bt_collision_world->getDispatcher()->getNumManifolds();
+ //For each contact manifold
+ for (int i = 0; i < numManifolds; i++) {
+ btPersistentManifold* contactManifold = bt_collision_world->getDispatcher()->getManifoldByIndexInternal(i);
+ btCollisionObject* obA = const_cast<btCollisionObject*>(contactManifold->getBody0());
+ btCollisionObject* obB = const_cast<btCollisionObject*>(contactManifold->getBody1());
+
+ ((SceneObject*)obA->getUserPointer())->collides((SceneObject*)obB->getUserPointer(), contactManifold);
- for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i)
- {
- auto j = i;
- for (j++; j != SceneObjects.end(); ++j)
- {
- SceneObject::checkCollision(*i, *j);
- }
}
+ //for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i)
+ //{
+ // auto j = i;
+ // for (j++; j != SceneObjects.end(); ++j)
+ // {
+ // SceneObject::checkCollision(*i, *j);
+ // }
+ //}
+
}
else
{
{
SceneObjects.push_back(_add);
ShaderSet.insert(_add->getShader());
+
+ bt_collision_world->addCollisionObject(*_add,_add->getCollideGroup(),_add->getCollideWith());
+
// _add->setMainScene(this);
}
#define YFALL_SPEED 9.8f
-#define BIT(x) 1<<(X)
-
SceneObject::SceneObject(Shader* _shader, const mat4& _modelMat, const vec4& _material, string _modelpath, string texturepath) :
model(nullptr),
modelMat(_modelMat),
yStatic(true),
ignore(false),
newModel(true),
+collide_group(0),
+collide_with(0),
bt_collision_object(new btCollisionObject())
{
//Message::info("Error from befor?");
{
model = Model::newIMetaModel(_modelpath);
model->bindShader(shader);
+
}
if (texturepath != "")
texture = Texture::newTexture(texturepath, _material);
+
+ if (_modelpath == "model_duck_2D.png")
+ {
+ collide_group = COL_ENEMY;
+ }
//Message::info("Creating SkyBox Shader");
//Graphix::getGlError();
//Message::info("Done");
bt_collision_object->setCollisionShape(*model);
+ bt_collision_object->setUserPointer(this);
}
SceneObject::SceneObject(Shader* _shader, const mat4& _modelMat, const vec4& _material, Model* _model, string texturepath) :
yStatic(true),
ignore(false),
newModel(false),
+collide_group(0),
+collide_with(0),
bt_collision_object(new btCollisionObject())
{
//Message::info("Error from befor?");
//TypeCast btCollisionShape
bt_collision_object->setCollisionShape(*model);
+ bt_collision_object->setUserPointer(this);
}
SceneObject::~SceneObject()
if (newModel)
Model::deleteIMetaModel(*model);
- delete bt_collision_object;
}
float SceneObject::getFloor() const
//modelMat = scale(modelMat, vec3(matter));
//modelMat = (deltaT * spin) * modelMat; //TODO drehen scheint nicht zu funktionieren
+ btTransform tmp;
+ tmp.setFromOpenGLMatrix(value_ptr(modelMat));
+ bt_collision_object->setWorldTransform(tmp);
+
}
void SceneObject::draw() const
}
-void SceneObject::collides(SceneObject* _other)
+void SceneObject::collides(SceneObject* _other, btPersistentManifold* _contactManifold)
{
+ _contactManifold->refreshContactPoints(this->operator btCollisionObject *()->getWorldTransform(), _other->operator btCollisionObject *()->getWorldTransform());
+ int numContacts = _contactManifold->getNumContacts();
+ //For each contact point in that manifold
+ for (int j = 0; j < numContacts; j++) {
+ //Get the contact information
+ btManifoldPoint& pt = _contactManifold->getContactPoint(j);
+ btVector3 ptA = pt.getPositionWorldOnA();
+ btVector3 ptB = pt.getPositionWorldOnB();
+ double ptdist = pt.getDistance();
+ }
+ Message::info("Kollision!");
+
if ((texture != nullptr && texture->operator std::string() == "model_player_2D.png") || _other->texture != nullptr && (_other->texture->operator std::string() == "model_player_2D.png"))
{
if (!ignore && !_other->ignore)
Model* SceneObject::getModel() const
{
return model;
+}
+
+SceneObject::operator btCollisionObject *() const
+{
+ return bt_collision_object;
+}
+
+short SceneObject::getCollideGroup() const
+{
+ return collide_group;
+}
+
+short SceneObject::getCollideWith() const
+{
+ return collide_with;
}
\ No newline at end of file
class Shader;
class Model;
+#define BIT(x) (1<<(x))
+enum collisiontypes {
+ COL_NOTHING = 0, //<Collide with nothing
+ COL_LEVEL = BIT(0), //<Collide with LEVEL
+ COL_MARVIN = BIT(1), //<Collide with Marvin
+ COL_ENEMY = BIT(2), //<Collide with Enemies
+ COL_KEY = BIT(3) //<Collide with Key's
+};
+
//class string;
class SceneObject
static void checkCollision(SceneObject* first, SceneObject* second);
- virtual void collides(SceneObject* other);
+ virtual void collides(SceneObject* other, btPersistentManifold* contactManifold = nullptr);
virtual vec3 getPosition() const;
bool floorBound() const;
float getFloor() const;
+
+ operator btCollisionObject*() const;
+ short getCollideGroup() const;
+ short getCollideWith() const;
+
//Falling
bool yStatic;
float ySpeed;
bool collision_ignore;
+ short collide_group, collide_with;
+
//Bullet
btCollisionObject* bt_collision_object;