typedef unsigned int uint;
-
-
-
Game::Game() : playing(true)
{
srand((int)time(NULL));
return true;
}
-void IMesh::isColliding(float& _overlap, float& _inside, const Model* _model, const mat4& _modelMatThis, const mat4& _modelMatOther) const
+void IMesh::checkColliding(float& _overlap, float& _inside, const Model* _model, const mat4& _modelMatThis, const mat4& _modelMatOther) const
{
- Model::isColliding(_overlap, _inside, _model, _modelMatThis*modelMat, _modelMatOther);
+ Model::checkColliding(_overlap, _inside, _model, _modelMatThis*modelMat, _modelMatOther);
/* nicht überschneidend also keine weiteren Tests nötig */
if (_overlap < 0)
return;
//void bindShader(Shader* shader);
/* calls Colliding to check if self collides with model*/
- virtual void isColliding(float& overlap, float& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
+ virtual void checkColliding(float& overlap, float& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
protected:
+
mat4 modelMat;
// Mesh Speichern?
}
-void IMetaMesh::isColliding(float& _overlap, float& _inside, const Model* _model, const mat4& _modelMatThis, const mat4& _modelMatOther) const
+void IMetaMesh::checkColliding(float& _overlap, float& _inside, const Model* _model, const mat4& _modelMatThis, const mat4& _modelMatOther) const
{
- Model::isColliding(_overlap, _inside, _model, _modelMatThis, _modelMatOther);
+ Model::checkColliding(_overlap, _inside, _model, _modelMatThis, _modelMatOther);
if (min(_overlap, _inside) >= 0)
{
float subOverlap = -1, subInside = -1;
for (auto i = models.begin(); i != models.end(); ++i)
{
- _model->isColliding(subOverlap, subInside, *i, _modelMatThis, _modelMatOther);
+ _model->checkColliding(subOverlap, subInside, *i, _modelMatThis, _modelMatOther);
if (subOverlap > _overlap)
_overlap = subOverlap;
if (subInside > _inside)
void drawBBox(Shader* shader, const mat4& modelMat) const;
/* calls Colliding to check if self collides with model*/
- void isColliding(float& overlap, float& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
+ void checkColliding(float& overlap, float& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
protected:
+
std::list<IMesh*> models;
};
glUniformMatrix4fv(tmp, 1, GL_FALSE, value_ptr(_model));
}
-void Model::isColliding(float& _overlap, float& _inside, const Model* _model, const mat4& _modelMatThis, const mat4& _modelMatOther) const
+void Model::isColliding(float& _overlap, float& _inside, const Model* _modelThis, const Model* _modelOther, const mat4& _modelMatThis, const mat4& _modelMatOther)
+{
+ vec3 posA, sizeA, posB, sizeB;
+ float overlap, inside;
+
+ _modelThis->getBBsp(sizeA, posA);
+ _modelOther->getBBsp(sizeB, posB);
+
+ mat4 modelAR = glm::inverse(removeScale(_modelMatOther))*_modelMatThis;
+ mat4 modelBR = glm::inverse(removeScale(_modelMatThis))*_modelMatOther;
+
+ vec3 posAR = (vec3)(modelAR*vec4(posA, 1.f));
+ vec3 posBR = (vec3)(modelBR*vec4(posB, 1.f));
+
+ sizeA /= 2;
+ sizeB /= 2;
+
+ vec3 sizeAR = rotateSize(sizeA, modelAR);
+ vec3 sizeBR = rotateSize(sizeB, modelBR);
+
+ checkCollideByAxis(_overlap, _inside, 3, value_ptr(posAR), value_ptr(posB), value_ptr(sizeAR), value_ptr(sizeB));
+ if (_overlap >= 0)
+ {
+ checkCollideByAxis(overlap, inside, 3, value_ptr(posA), value_ptr(posBR), value_ptr(sizeA), value_ptr(sizeBR));
+ _overlap = min(overlap, _overlap);
+ _inside = min(overlap, _inside);
+ }
+
+}
+
+void Model::checkColliding(float& _overlap, float& _inside, const Model* _model, const mat4& _modelMatThis, const mat4& _modelMatOther) const
{
vec3 posA, sizeA, posB, sizeB;
float overlap, inside;
virtual void getBBsp(vec3& size, vec3& pos) const;
/* calls Colliding to check if self collides with model*/
- virtual void isColliding(float& overlap, float& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
+ static void isColliding(float& overlap, float& inside, const Model* modelThis, const Model* modelOther, const mat4& modelMatThis, const mat4& modelMatOther);
+ void checkColliding(float& overlap, float& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
static Model* getBBoxModel();
static Shader* BBoxShader;
static bool exBBox;
+
+
static vec3 rotateSize(const vec3& size, const mat4& modelMat);
static void checkCollideByAxis(float& overlap, float& inside, uint dim, const float* posA, const float* posB, const float* sizeA, const float* sizeB);
static void scaleVec3(vec3& vec, const vec3& scale);
#include "../Graphix/Model.h"
#include "../Events.h"
+#include "../Graphix/Texture.h"
+#include "../Message.h"
-EventBox::EventBox(const mat4& _modelMat) : SceneObject(Graphix::shader_BBox,_modelMat,vec4(0.f),Model::getBBoxModel(),"")
-{
+EventBox::EventBox(const mat4& _modelMat, uint _EB_TYPE) :
+ SceneObject(Graphix::shader_BBox, _modelMat, vec4(0.f), Model::getBBoxModel(), ""),
+ eb_type(_EB_TYPE)
+{
}
{
if (Events::isKToggleActive(SDLK_F6))
model->drawBBox(shader, modelMat);
+}
+
+void EventBox::collides(SceneObject* _other)
+{
+ if ((texture != nullptr && texture->operator std::string() == "model_player_2D.png") || _other->getTexture() != nullptr && (_other->getTexture()->operator std::string() == "model_player_2D.png"))
+ {
+ if (!ignore && !_other->ignore)
+ Message::info("EB Kollision!" + eb_type);
+ }
}
\ No newline at end of file
#include "SceneObject.h"
-#define EB_WINZONE 1;
-#define EB_LOSTZONE 0;
+#define EB_WINZONE 1
+#define EB_LOSTZONE 2
+
+typedef unsigned int uint;
class EventBox :
public SceneObject
{
public:
- EventBox(const mat4& modelMat);
+ EventBox(const mat4& modelMat, uint EB_TYPE=0);
~EventBox();
virtual void update(float);
virtual void draw() const;
+ virtual void collides(SceneObject* other);
+
+protected:
+ uint eb_type;
+
};
auto j = i;
for (j++; j != SceneObjects.end(); ++j)
{
- (*i)->collisions(*j);
+ SceneObject::checkCollision(*i, *j);
}
}
model->drawBBox(shader, modelMat);
}
-void SceneObject::collisions(SceneObject* _other)
+void SceneObject::checkCollision(SceneObject* _first, SceneObject* _second)
{
- if (collision_ignore || _other->collision_ignore)
+ if (_first->collision_ignore || _second->collision_ignore)
return;
float isOverlaping, isInside;
- model->isColliding(isOverlaping,isInside,_other->model,modelMat,_other->modelMat);
+ Model::isColliding(isOverlaping, isInside, _first->model,_second->model, _first->modelMat, _second->modelMat);
/* overlapping 1 yes, 0 touch, -1 no*/
/* inside 1 yes, 0 touch, -1 no*/
+ if (isOverlaping >= 0)
+ {
+ _first->collides(_second);
+ _second->collides(_first);
+ }
+
+}
+
+void SceneObject::collides(SceneObject* _other)
+{
if ((texture != nullptr && texture->operator std::string() == "model_player_2D.png") || _other->texture != nullptr && (_other->texture->operator std::string() == "model_player_2D.png"))
{
- if (isOverlaping >= 0 && (!ignore && !_other->ignore))
+ if (!ignore && !_other->ignore)
Message::info("Kollision");
}
}
{
return shader;
}
+
+Texture* SceneObject::getTexture() const
+{
+ return texture;
+}
virtual void update(float);
virtual void draw() const;
- virtual void collisions(SceneObject*);
+ static void checkCollision(SceneObject* first, SceneObject* second);
+
+ virtual void collides(SceneObject* other);
virtual vec3 getPosition() const;
Shader* getShader() const;
+ Texture* getTexture() const;
+
__declspec(deprecated)
void setEnemy(bool isenemy);
__declspec(deprecated)