]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
moved collision to Model
authorPeter Schaefer <schaeferpm@gmail.com>
Wed, 29 Apr 2015 10:22:13 +0000 (12:22 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Wed, 29 Apr 2015 10:22:13 +0000 (12:22 +0200)
Weave/Graphix/GLM.h
Weave/Graphix/Model/IMetaMesh.cpp
Weave/Graphix/Model/IMetaMesh.h
Weave/Graphix/Model/Model.cpp
Weave/Graphix/Model/Model.h
Weave/Scene/SceneObject.cpp

index 34f0073680f6e1802f79b8319d93e75ef3da683f..a85ce78ea1e7014d0762cf02721100f959af46a8 100644 (file)
@@ -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 */
index d9a05d4ee2d0b6420fa14bb6af2d51436a86baed..4adff5f577117378b6350d0ad3270178ce1a1631 100644 (file)
@@ -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
index 864130632e3f804a37c348ad514c6bb9b76bca67..83d18a8f338687cec7b5189a635e4b16face28b2 100644 (file)
@@ -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<IMesh*> models;
 };
index f12b67d6af7534cef426e8a482ebd96611df6ef8..c2dd0fa4427f41a667f2330104e7d4c2605b93c7 100644 (file)
@@ -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
index 9336b8c67d66cb7291718d0e61ce3bd727c515b5..0ee7fb02830c7dedfdbc0f71683edd960f567afd 100644 (file)
@@ -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;
index 8b4c5d93043e6a0d2a26d88768ec241c101ac34e..462b87eb1e62d4b67e4d76eaa5cfb55a0d71e9d8 100644 (file)
@@ -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