]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
fixed missing modelMat in Collision
authorPeter Schaefer <schaeferpm@gmail.com>
Wed, 29 Apr 2015 19:44:42 +0000 (21:44 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Wed, 29 Apr 2015 19:44:42 +0000 (21:44 +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 a85ce78ea1e7014d0762cf02721100f959af46a8..46799a9297b478350069b7c292ee67e420c36aeb 100644 (file)
@@ -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;
index 4adff5f577117378b6350d0ad3270178ce1a1631..552cc76830dfbfcb6f00675e5b9df7669fd51f20 100644 (file)
@@ -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)
index 83d18a8f338687cec7b5189a635e4b16face28b2..cdfa1822e5f9201eed757aa9f19780bbb0cae967 100644 (file)
@@ -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<IMesh*> models;
index c2dd0fa4427f41a667f2330104e7d4c2605b93c7..b454685d67ad8ecd0f2ee0304ae6e25efa566cb7 100644 (file)
@@ -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));
 }
 
 
index 0ee7fb02830c7dedfdbc0f71683edd960f567afd..da6885453c7bb8c5d025d32e37049f2236ec34e6 100644 (file)
@@ -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;
index 462b87eb1e62d4b67e4d76eaa5cfb55a0d71e9d8..2bac5998a109ca5e1598afbad96d9573f8f9b595 100644 (file)
@@ -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)