#include "glm\gtx\rotate_vector.hpp"
#include "glm\gtx\vector_angle.hpp"
+using glm::mat3;
using glm::vec3;
using glm::mat4;
using glm::vec4;
}
-void IMetaMesh::isColliding(int& _overlap, int& _inside, const Model* _model) const
+void IMetaMesh::isColliding(int& _overlap, int& _inside, const Model* _model, const mat4& _modelMatThis, const mat4& _modelMatOther) const
{
- Model::isColliding(_overlap, _inside, _model);
+ Model::isColliding(_overlap, _inside, _model, _modelMatThis, _modelMatOther);
if (min(_overlap, _inside)>=0)
{
int subOverlap=-1, subInside=-1;
for (auto i = models.begin(); i != models.end(); ++i)
{
- _model->isColliding(subOverlap, subInside, *i);
+ _model->isColliding(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(int& overlap, int& inside, const Model* model) const;
+ void isColliding(int& overlap, int& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
protected:
std::list<IMesh*> models;
}
-void Model::isColliding(int& _overlap, int& _inside, const Model* _model) const
+void Model::isColliding(int& _overlap, int& _inside, const Model* _model,const mat4& _modelMatThis, const mat4& _modelMatOther) const
{
vec3 posA, sizeA, posB, sizeB;
getBBsp(sizeA, posA);
_model->getBBsp(sizeB, posB);
+ posA = (vec3)(_modelMatThis*vec4(posA, 1.f));
+ posB = (vec3)(_modelMatOther*vec4(posB, 1.f));
+
+ sizeA = (mat3)_modelMatThis * sizeA;
+ sizeB = (mat3)_modelMatOther * sizeB;
+
vec3 pDist, sDist;
vec3 overlap, inside;
- int isOverlaping, isInside;
sizeA /= 2;
sizeB /= 2;
/* overlapping 1 yes, 0 touch, -1 no*/
- _overlap = sign(glm::min(glm::min(overlap.x, overlap.y), overlap.z));
+ _overlap = (int)sign(glm::min(glm::min(overlap.x, overlap.y), overlap.z));
/* inside 1 yes, 0 touch, -1 no*/
- _inside = sign(glm::min(glm::min(inside.x, inside.y), inside.z));
+ _inside = (int)sign(glm::min(glm::min(inside.x, inside.y), inside.z));
}
void getBBsp(vec3& size, vec3& pos) const;
/* calls Colliding to check if self collides with model*/
- virtual void isColliding(int& overlap, int& inside, const Model* model) const;
+ virtual void isColliding(int& overlap, int& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
protected:
uint numvertices, numfaces;
return;
int isOverlaping, isInside;
- model->isColliding(isOverlaping,isInside,_other->model);
+ model->isColliding(isOverlaping,isInside,_other->model,modelMat,_other->modelMat);
/* overlapping 1 yes, 0 touch, -1 no*/
/* inside 1 yes, 0 touch, -1 no*/
//if (isOverlaping >= 0)