]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
finished Box class
authorPeter Schaefer <schaeferpm@gmail.com>
Tue, 19 May 2015 23:11:09 +0000 (01:11 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Tue, 19 May 2015 23:11:09 +0000 (01:11 +0200)
marked old centerSize as deprecated

Weave/Graphix/Model/IMesh.cpp
Weave/Graphix/Model/IMesh.h
Weave/Graphix/Model/IMetaMesh.cpp
Weave/Graphix/Model/IMetaMesh.h
Weave/Graphix/Model/Model.cpp
Weave/Graphix/Model/Model.h
Weave/Overlap.cpp
Weave/Overlap.h

index c76ae16b50ce50d76d92ac016d472a121e374e2e..93784d987ca9766e4a9fa576e1082d44a1ce34bd 100644 (file)
@@ -256,16 +256,34 @@ Overlap IMesh::checkColO2SBox(const mat4& _mMat, const vec3& _pos, const vec3& _
 
 }
 
-Overlap IMesh::checkColO2STriangle(const mat4& _mMat, const vec3& _posB, const mat3& _directionsB) const
+Overlap IMesh::checkColO2SBox(const mat4& _mMat, const Box& _boxB, const mat4& _modelMat) const
 {
-       Overlap firstBB = Model::checkColO2STriangle(_mMat, _posB, _directionsB);
+       //Outer Mesh
+       //#ifdef COMPARE_MTREE
+       //      vec3 scale = getScale(_mMat);
+       //      Overlap firstBB = checkColO2NodeBox(root, scale, removeScale(_mMat), _pos, _size, _modelMat);
+       //#else
+       Overlap firstBB = Model::checkColO2SBox(_mMat, _boxB, _modelMat);
+       //#endif
+
        //if (!firstBB)
        return firstBB;
 
        //Inner Mesh
+       //call checkColO2STriangle
 
 }
 
+//Overlap IMesh::checkColO2STriangle(const mat4& _mMat, const vec3& _posB, const mat3& _directionsB) const
+//{
+//     Overlap firstBB = Model::checkColO2STriangle(_mMat, _posB, _directionsB);
+//     //if (!firstBB)
+//     return firstBB;
+//
+//     //Inner Mesh
+//
+//}
+
 IMesh::operator string() const
 {
        return "IMesh";
index 4960e5b343dc171a104970a39e55bd2956bec957..36cbce22d9644db89712532749191776973a565f 100644 (file)
@@ -30,7 +30,8 @@ public:
 
        Overlap checkColS2O(const mat4& mMat, const Model* model, const mat4& modelMat) const override;
        Overlap checkColO2SBox(const mat4& mMat, const vec3& pos, const vec3& size, const mat4& modelMat) const override;
-       Overlap checkColO2STriangle(const mat4& mMat, const vec3& pos, const mat3& directions) const override;
+       Overlap checkColO2SBox(const mat4& mMat, const Model::Box& boxB, const mat4& modelMat) const override;
+       //Overlap checkColO2STriangle(const mat4& mMat, const vec3& pos, const mat3& directions) const override;
 
        Overlap checkColNode2O(const Node* node, const vec3& scale, const mat4& mOSMat, const Model* model, const mat4& modelMat) const;
        Overlap checkColO2NodeBox(const Node* node, const vec3& scale, const mat4& mOSMat, const vec3& pos, const vec3& size, const mat4& modelMat) const;
index f7f40181b591e95ae2b971b8531544f864ce4bb5..81244802d2dd57a420f728e74bf7349233b5db1f 100644 (file)
@@ -156,6 +156,28 @@ Overlap IMetaMesh::checkColO2SBox(const mat4& _mMat, const vec3& _pos, const vec
                return secondSubBB;
 }
 
+Overlap IMetaMesh::checkColO2SBox(const mat4& _mMat, const Box& _boxB, const mat4& _modelMat) const
+{
+       //Outer BBox
+       Overlap firstBB = Model::checkColO2SBox(_mMat, _boxB, _modelMat);
+       if (!firstBB)
+               return firstBB;
+
+       //Inner BBox
+       Overlap tmp, secondSubBB;
+       for (auto i = models.begin(); i != models.end(); ++i)
+       {
+               tmp = (*i)->checkColO2SBox(_mMat, _boxB, _modelMat);
+               if (tmp)
+               {
+                       secondSubBB.update(tmp);
+               }
+
+       }
+       //if (!secondSubBB)
+               return secondSubBB;
+}
+
 IMetaMesh::operator string() const
 {
        return modelpath;
index ac9987b3128fe25f337783eac7698ff43d39ed37..d5bf97d69ec3a7d8793ab69a9cd95945220507ac 100644 (file)
@@ -25,6 +25,7 @@ public:
 
        Overlap checkColS2O(const mat4& mMat, const Model* model, const mat4& modelMat) const override;
        Overlap checkColO2SBox(const mat4& mMat, const vec3& pos, const vec3& size, const mat4& modelMat) const override;
+       Overlap checkColO2SBox(const mat4& mMat, const Model::Box& boxB, const mat4& modelMat) const override;
 
        operator std::string() const override;
 
index 1aaf5db86fed0613f5dc3c635d8b2fe88208f414..4b03b4f6ce9409f141a5ef8c3fc24a2c7cc3a2b6 100644 (file)
@@ -298,7 +298,12 @@ Overlap Model::checkColS2O(const mat4& _mMat, const Model* _model, const mat4& _
        scaleVec3(pos, scale);
        scaleVec3(size, scale);
 
-       Overlap stepBB = _model->checkColO2SBox(_modelMat, pos, size, removeScale(_mMat));
+       Box boxA(box);
+       boxA.scale(scale);
+
+//     Overlap stepBB = _model->checkColO2SBox(_modelMat, pos, size, removeScale(_mMat));
+
+       Overlap stepBB = _model->checkColO2SBox(_modelMat, boxA, removeScale(_mMat));
 
        return stepBB;
 }
@@ -335,64 +340,87 @@ Overlap Model::checkColO2SBox(const mat4& _mMat, const vec3& _posB, const vec3&
        return ret;
 }
 
-Overlap Model::checkColO2STriangle(const mat4& _mMat, const vec3& _posB, const mat3& _directionsB) const
+Overlap Model::checkColO2SBox(const mat4& _mMat, const Box& _boxB, const mat4& _modelMatB) const
 {
-
-       vec3 posA = box.center();
-       vec3 sizeA = box.size();
-
+       //split _mMat to scale and mMat
        vec3 scale = getScale(_mMat);
-       scaleVec3(posA, scale);
-       scaleVec3(sizeA, scale);
-
-       mat4 invmMat = glm::inverse(removeScale(_mMat));
-
-       vec3 posBR = (vec3)(invmMat*vec4(_posB, 1.f));
-       mat3 directionsBR = (mat3)invmMat*_directionsB;
-
+       mat4 mMat = removeScale(_mMat);
 
-       //Triangle Face Distance
-       float nDist = (posA-posBR).length();
-       float nSize = directSize(sizeA,_directionsB[0]);
-       float overlap = nSize - nDist;
-       Overlap ret(overlap,overlap);
-       if (!ret)
-               return ret;
+       Box boxA(box);
 
+       //scale BoxA
+       boxA.scale(scale);
 
-       //Box to Triangle Distance
-       vec3 sizeBRP(0.f), sizeBRM(0.f);
-       for (int i = 0; i < 3; ++i)
-       {
-               sizeBRP[i] = max(-directionsBR[i][1],-directionsBR[i][2]);
-               sizeBRM[i] = max(directionsBR[i][1], directionsBR[i][2]);
-               if (sizeBRP[i] < 0)
-                       sizeBRP[i] = 0;
-               if (sizeBRM[i] < 0)
-                       sizeBRM[i] = 0;
-       }
-       overlap = sizeBRM[0] + sizeA[0] + sizeBRP[0];
-       for (int i = 0; i < 3; ++i)
-       {
-               if (posBR[i]>=0)
-               {
-                       overlap = min(sizeBRP[i] + sizeA[i] - posBR[i],overlap);
-               }
-               else
-               {
-                       overlap = min(sizeBRM[i] + sizeA[i] + posBR[i],overlap);
-               }
-               if (overlap < 0)
-               {
-                       overlap = -1;
-                       break;
-               }
-       }
+       //RotateBox to other
+       Box boxAR(boxA), boxBR(_boxB);
+       boxAR.rotate(glm::inverse(_modelMatB)*mMat);
+       boxBR.rotate(glm::inverse(mMat)*_modelMatB);
 
-       return Overlap(overlap, overlap);
+       Overlap ret = checkCollideByAxis(boxAR,_boxB);
+       if (ret)
+               ret.update(checkCollideByAxis(boxA, boxBR));
 
+       return ret;
 }
 
+//Overlap Model::checkColO2STriangle(const mat4& _mMat, const Triangle& _tri) const
+//{
+//
+//     vec3 posA = box.center();
+//     vec3 sizeA = box.size();
+//
+//     vec3 scale = getScale(_mMat);
+//     scaleVec3(posA, scale);
+//     scaleVec3(sizeA, scale);
+//
+//     mat4 invmMat = glm::inverse(removeScale(_mMat));
+//
+//     vec3 posBR = (vec3)(invmMat*vec4(_posB, 1.f));
+//     mat3 directionsBR = (mat3)invmMat*_directionsB;
+//
+//
+//     //Triangle Face Distance
+//     float nDist = (posA-posBR).length();
+//     float nSize = directSize(sizeA,_directionsB[0]);
+//     float overlap = nSize - nDist;
+//     Overlap ret(overlap,overlap);
+//     if (!ret)
+//             return ret;
+//
+//
+//     //Box to Triangle Distance
+//     vec3 sizeBRP(0.f), sizeBRM(0.f);
+//     for (int i = 0; i < 3; ++i)
+//     {
+//             sizeBRP[i] = max(-directionsBR[i][1],-directionsBR[i][2]);
+//             sizeBRM[i] = max(directionsBR[i][1], directionsBR[i][2]);
+//             if (sizeBRP[i] < 0)
+//                     sizeBRP[i] = 0;
+//             if (sizeBRM[i] < 0)
+//                     sizeBRM[i] = 0;
+//     }
+//     overlap = sizeBRM[0] + sizeA[0] + sizeBRP[0];
+//     for (int i = 0; i < 3; ++i)
+//     {
+//             if (posBR[i]>=0)
+//             {
+//                     overlap = min(sizeBRP[i] + sizeA[i] - posBR[i],overlap);
+//             }
+//             else
+//             {
+//                     overlap = min(sizeBRM[i] + sizeA[i] + posBR[i],overlap);
+//             }
+//             if (overlap < 0)
+//             {
+//                     overlap = -1;
+//                     break;
+//             }
+//     }
+//
+//     return Overlap(overlap, overlap);
+//
+//}
+
 void Model::checkCollideByAxis(float& _overlap, float& _inside, uint dim, const float* posA, const float* posB, const float* sizeA, const float* sizeB)
 {
        _overlap = sizeA[0] + sizeB[0];
@@ -416,18 +444,30 @@ void Model::checkCollideByAxis(float& _overlap, float& _inside, uint dim, const
                _inside = -1;
 }
 
+Overlap Model::checkCollideByAxis(const Box& _boxA, const Box& _boxB)
+{
+       Overlap ret;
+
+       for (uint i = 0; i < 3; ++i)
+       {
+
+               ret.update(_boxA.size()[i] + _boxB.size()[i] - abs(_boxA.center()[i] - _boxB.center()[i]),
+                       abs(_boxA.size()[i] - _boxB.size()[i]) - abs(_boxA.center()[i] - _boxB.center()[i]));
+
+               if (!ret)
+                       break;
+       }
+       return ret;
+}
+
 
 vec3 Model::rotateSize(const vec3& _size, const mat4& _modelMat)
 {
-       vec3 Size = vec3(0.f);
-       vec4 tmp;
+       vec3 newSize(0.f);
+       mat3 tmpModelMat(_modelMat);
        for (auto i = 0; i < 3; ++i)
-       {
-               tmp = vec4(0.f);
-               tmp[i] = _size[i];
-               Size += abs((vec3)(_modelMat* tmp));
-       }
-       return Size;
+               newSize += abs(tmpModelMat[i]) * _size[i];
+       return newSize;
 }
 
 float Model::directSize(const vec3& _size, const vec3& _direction)
@@ -661,6 +701,28 @@ void Box::getBBcs(vec3& _center, vec3& _size) const
        _size = siz;
 }
 
+void Box::rotate(const mat4& _modelMat)
+{
+       //Rotate Center
+       cen = (vec3)(_modelMat*vec4(cen, 1.f));
+
+       //Rotate Size
+       vec3 newSize(0.f);
+       mat3 tmpModelMat(_modelMat);
+       for (auto i = 0; i < 3; ++i)
+               newSize += abs(tmpModelMat[i]) * siz[i];
+       siz = newSize;
+}
+
+void Box::scale(const vec3& _scale)
+{
+       for (uint i = 0; i < 3; ++i)
+       {
+               cen[i] *= _scale[i];
+               siz[i] *= _scale[i];
+       }
+}
+
 vec3 Box::center() const
 {
        return cen;
index d8aa9f49198a19842d04a04440020a3d50d3d033..4ca458eb2988cf7b1fc16d29ca2b79be4b6f4848 100644 (file)
@@ -31,8 +31,9 @@ public:
        /* Get min&max from BBox */
 //     virtual void getBBmm(vec3& min, vec3& max) const;
        /* Get size&position from BBox */
-       virtual void getBBcs(vec3& center, vec3& size) const;
+       void getBBcs(vec3& center, vec3& size) const;
 
+       /* Get center&size (BOX) */
        Box getBBox() const;
 
        /* calls Colliding to check if self collides with model*/
@@ -42,8 +43,12 @@ public:
        /* test self against other*/
        class Triangle;
        virtual Overlap checkColS2O(const mat4& mMat, const Model* model, const mat4& modelMat) const;
+
+       __declspec(deprecated)
        virtual Overlap checkColO2SBox(const mat4& mMat, const vec3& pos, const vec3& size, const mat4& modelMat) const;
-       virtual Overlap checkColO2STriangle(const mat4& mMat, const vec3& pos, const mat3& directions) const;
+
+       virtual Overlap checkColO2SBox(const mat4& mMat, const Box& box, const mat4& modelMat) const;
+       //virtual Overlap checkColO2STriangle(const mat4& mMat, const Triangle& tri) const;
 
        static Model* getBBoxModel();
        static Model* getSkyBoxModel();
@@ -90,6 +95,9 @@ public:
 
                void getBBcs(vec3& center, vec3& size) const;
 
+               void rotate(const mat4& modelMat);
+               void scale(const vec3& scale);
+
                static Box merge(const Box& boxA, const Box& boxB);
                vec3 center() const;
                vec3 size() const;
@@ -132,7 +140,10 @@ protected:
        static std::unordered_map<std::string, uint> IMetaModel_count;
 
        
+       __declspec(deprecated)
        static void checkCollideByAxis(float& overlap, float& inside, uint dim, const float* posA, const float* posB, const float* sizeA, const float* sizeB);
+       static Overlap checkCollideByAxis(const Box& boxA, const Box& boxB);
+
        static vec3 rotateSize(const vec3& size, const mat4& modelMat);
        static float directSize(const vec3& size, const vec3& direction);
 
index 4c4f77207df2d7232be06f2b4ddd7a0cea1ef444..c237d0a8fc35899d581d955485905376ac3a1fa1 100644 (file)
@@ -5,6 +5,10 @@ Overlap::Overlap() : unset(true)
 {
 }
 
+Overlap::Overlap(const Overlap& _over) : unset(_over.unset), in(_over.in), over(_over.over)
+{
+}
+
 Overlap::Overlap(float _over, float _in) : in(_in), over(_over), unset(false)
 {
 }
@@ -43,7 +47,7 @@ void Overlap::update(float _over, float _in)
        {
                over = _over;
                in = _in;
-               unset = true;
+               unset = false;
                return;
        }
 
@@ -73,6 +77,7 @@ void Overlap::update(const Overlap& _other)
 
        //sync inside
        in = min(in, _other.in);
+
 }
 
 Overlap Overlap::merge(const Overlap& _first, const Overlap& _second)
index 079e7e9962ca6c8f7805195b3d69c571c03c79c8..79b7833ef47d2be43450791983539e9f5c4fcb13 100644 (file)
@@ -6,6 +6,7 @@ class Overlap
 {
 public:
        Overlap();
+       Overlap(const Overlap& over);
        Overlap(float over, float in);
        ~Overlap();