From 402753a6f251a8f4c8447a01f240cedc4ee7f59f Mon Sep 17 00:00:00 2001 From: Peter Schaefer Date: Wed, 29 Apr 2015 12:22:13 +0200 Subject: [PATCH] moved collision to Model --- Weave/Graphix/GLM.h | 2 ++ Weave/Graphix/Model/IMetaMesh.cpp | 20 +++++++++++++++++++ Weave/Graphix/Model/IMetaMesh.h | 3 +++ Weave/Graphix/Model/Model.cpp | 32 +++++++++++++++++++++++++++++++ Weave/Graphix/Model/Model.h | 4 +++- Weave/Scene/SceneObject.cpp | 29 +++------------------------- 6 files changed, 63 insertions(+), 27 deletions(-) diff --git a/Weave/Graphix/GLM.h b/Weave/Graphix/GLM.h index 34f0073..a85ce78 100644 --- a/Weave/Graphix/GLM.h +++ b/Weave/Graphix/GLM.h @@ -24,6 +24,8 @@ using glm::orientedAngle; using glm::value_ptr; using glm::sign; +using glm::min; +using glm::max; #define M_PI 3.14159265358979323846264338327950288 /* pi */ #define M_PI_2 1.57079632679489661923132169163975144 /* pi/2 */ diff --git a/Weave/Graphix/Model/IMetaMesh.cpp b/Weave/Graphix/Model/IMetaMesh.cpp index d9a05d4..4adff5f 100644 --- a/Weave/Graphix/Model/IMetaMesh.cpp +++ b/Weave/Graphix/Model/IMetaMesh.cpp @@ -96,4 +96,24 @@ void IMetaMesh::drawBBox(Shader* _shader, const mat4& _modelMat) const } } +} + + +void IMetaMesh::isColliding(int& _overlap, int& _inside, const Model* _model) const +{ + Model::isColliding(_overlap, _inside, _model); + + if (min(_overlap, _inside)>=0) + { + _overlap = -1; _inside = -1; + int subOverlap=-1, subInside=-1; + for (auto i = models.begin(); i != models.end(); ++i) + { + _model->isColliding(subOverlap, subInside, *i); + if (subOverlap > _overlap) + _overlap = subOverlap; + if (subInside > _inside) + _inside = subInside; + } + } } \ No newline at end of file diff --git a/Weave/Graphix/Model/IMetaMesh.h b/Weave/Graphix/Model/IMetaMesh.h index 8641306..83d18a8 100644 --- a/Weave/Graphix/Model/IMetaMesh.h +++ b/Weave/Graphix/Model/IMetaMesh.h @@ -24,6 +24,9 @@ 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; + protected: std::list models; }; diff --git a/Weave/Graphix/Model/Model.cpp b/Weave/Graphix/Model/Model.cpp index f12b67d..c2dd0fa 100644 --- a/Weave/Graphix/Model/Model.cpp +++ b/Weave/Graphix/Model/Model.cpp @@ -243,6 +243,38 @@ void Model::useMaterial(const vec4& _material, Shader* _shader) const glUniform4fv(tmp, 1, value_ptr(_material)); } + +void Model::isColliding(int& _overlap, int& _inside, const Model* _model) const +{ + vec3 posA, sizeA, posB, sizeB; + + getBBsp(sizeA, posA); + _model->getBBsp(sizeB, posB); + + vec3 pDist, sDist; + vec3 overlap, inside; + int isOverlaping, isInside; + + sizeA /= 2; + sizeB /= 2; + + pDist = posB - posA; + pDist *= sign(pDist); + + sDist = sizeB - sizeA; + sDist *= sign(sDist); + + overlap = (sizeA + sizeB) - pDist; + inside = sDist - pDist; + + + /* overlapping 1 yes, 0 touch, -1 no*/ + _overlap = 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)); +} + + Model* Model::BoundingBox = nullptr; Shader* Model::BBoxShader = nullptr; bool Model::exBBox = false; \ No newline at end of file diff --git a/Weave/Graphix/Model/Model.h b/Weave/Graphix/Model/Model.h index 9336b8c..0ee7fb0 100644 --- a/Weave/Graphix/Model/Model.h +++ b/Weave/Graphix/Model/Model.h @@ -28,6 +28,9 @@ public: /* Get size&position from BBox */ 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; + protected: uint numvertices, numfaces; uint vertexBuffer, indexBuffer, normalBuffer, uvBuffer; @@ -47,7 +50,6 @@ protected: virtual void useMaterial(const vec4& material, Shader* shader) const; virtual void drawModel() const; - static Model* BoundingBox; static Shader* BBoxShader; static bool exBBox; diff --git a/Weave/Scene/SceneObject.cpp b/Weave/Scene/SceneObject.cpp index 8b4c5d9..462b87e 100644 --- a/Weave/Scene/SceneObject.cpp +++ b/Weave/Scene/SceneObject.cpp @@ -155,35 +155,12 @@ void SceneObject::collisions(SceneObject* _other) if (collision_ignore || _other->collision_ignore) return; - vec3 posA, sizeA, posB, sizeB; - - model->getBBsp(sizeA, posA); - _other->model->getBBsp(sizeB, posB); - - vec3 pDist, sDist; - vec3 overlap, inside; int isOverlaping, isInside; - - sizeA /= 2; - sizeB /= 2; - - pDist = posB - posA; - pDist *= sign(pDist); - - sDist = sizeB - sizeA; - sDist *= sign(sDist); - - overlap =(sizeA + sizeB) - pDist; - inside = sDist - pDist; - - + model->isColliding(isOverlaping,isInside,_other->model); /* overlapping 1 yes, 0 touch, -1 no*/ - isOverlaping = sign(glm::min(glm::min(overlap.x, overlap.y), overlap.z)); /* inside 1 yes, 0 touch, -1 no*/ - isInside = sign(glm::min(glm::min(inside.x, inside.y), inside.z)); - - - + //if (isOverlaping >= 0) + // Message::info("Kollision"); } bool SceneObject::floorBound() const -- 2.47.3