From 596b197120fbf3fc625125b3dcfb534b675e704c Mon Sep 17 00:00:00 2001 From: Peter Schaefer Date: Wed, 29 Apr 2015 21:44:42 +0200 Subject: [PATCH] fixed missing modelMat in Collision --- Weave/Graphix/GLM.h | 1 + Weave/Graphix/Model/IMetaMesh.cpp | 6 +++--- Weave/Graphix/Model/IMetaMesh.h | 2 +- Weave/Graphix/Model/Model.cpp | 13 +++++++++---- Weave/Graphix/Model/Model.h | 2 +- Weave/Scene/SceneObject.cpp | 2 +- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Weave/Graphix/GLM.h b/Weave/Graphix/GLM.h index a85ce78..46799a9 100644 --- a/Weave/Graphix/GLM.h +++ b/Weave/Graphix/GLM.h @@ -6,6 +6,7 @@ #include "glm\gtx\rotate_vector.hpp" #include "glm\gtx\vector_angle.hpp" +using glm::mat3; using glm::vec3; using glm::mat4; using glm::vec4; diff --git a/Weave/Graphix/Model/IMetaMesh.cpp b/Weave/Graphix/Model/IMetaMesh.cpp index 4adff5f..552cc76 100644 --- a/Weave/Graphix/Model/IMetaMesh.cpp +++ b/Weave/Graphix/Model/IMetaMesh.cpp @@ -99,9 +99,9 @@ void IMetaMesh::drawBBox(Shader* _shader, const mat4& _modelMat) const } -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) { @@ -109,7 +109,7 @@ void IMetaMesh::isColliding(int& _overlap, int& _inside, const Model* _model) co 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) diff --git a/Weave/Graphix/Model/IMetaMesh.h b/Weave/Graphix/Model/IMetaMesh.h index 83d18a8..cdfa182 100644 --- a/Weave/Graphix/Model/IMetaMesh.h +++ b/Weave/Graphix/Model/IMetaMesh.h @@ -25,7 +25,7 @@ public: 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 models; diff --git a/Weave/Graphix/Model/Model.cpp b/Weave/Graphix/Model/Model.cpp index c2dd0fa..b454685 100644 --- a/Weave/Graphix/Model/Model.cpp +++ b/Weave/Graphix/Model/Model.cpp @@ -244,16 +244,21 @@ void Model::useMaterial(const vec4& _material, Shader* _shader) const } -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; @@ -269,9 +274,9 @@ void Model::isColliding(int& _overlap, int& _inside, const Model* _model) const /* 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)); } diff --git a/Weave/Graphix/Model/Model.h b/Weave/Graphix/Model/Model.h index 0ee7fb0..da68854 100644 --- a/Weave/Graphix/Model/Model.h +++ b/Weave/Graphix/Model/Model.h @@ -29,7 +29,7 @@ public: 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; diff --git a/Weave/Scene/SceneObject.cpp b/Weave/Scene/SceneObject.cpp index 462b87e..2bac599 100644 --- a/Weave/Scene/SceneObject.cpp +++ b/Weave/Scene/SceneObject.cpp @@ -156,7 +156,7 @@ void SceneObject::collisions(SceneObject* _other) 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) -- 2.47.3