]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
triangle check (not working)
authorPeter Schaefer <schaeferpm@gmail.com>
Wed, 20 May 2015 11:00:04 +0000 (13:00 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Wed, 20 May 2015 11:00:04 +0000 (13:00 +0200)
colDetect to slow

Weave/Graphix/Model/IMesh.cpp
Weave/Graphix/Model/IMesh.h
Weave/Graphix/Model/Model.cpp
Weave/Graphix/Model/Model.h
Weave/Scene/Scene.cpp

index 14170f7a7b807de6a81838359f8879ce3ae19e7b..b6d13a3b7df1a33732f27df33345dc47392e4998 100644 (file)
@@ -128,14 +128,11 @@ void IMesh::drawBBox(const mat4& _modelMat, const vec4& _color) const
 
 Overlap IMesh::checkColNode2O(const Node* _node, const vec3& _scale, const mat4& _mOSMat, const Model* _model, const mat4& _modelMat) const
 {
-       vec3 pos;
-       vec3 size;
-       _node->getBBcs(pos, size);
+       Box box(*_node);
+       //scale BoxA
+       box.scale(_scale);
 
-       scaleVec3(pos, _scale);
-       scaleVec3(size, _scale);
-
-       Overlap stepNode = _model->checkColO2SBox(_modelMat, Box(pos, size),_mOSMat);
+       Overlap stepNode = _model->checkColO2SBox(_modelMat, box,_mOSMat);
 
        //Falls _node nicht overlap
        if (!stepNode)
@@ -162,42 +159,48 @@ Overlap IMesh::checkColNode2O(const Node* _node, const vec3& _scale, const mat4&
 
 }
 
-Overlap IMesh::checkColO2NodeBox(const Node* _node, const vec3& _scale, const mat4& _mOSMat, const vec3& _pos, const vec3& _size, const mat4& _modelMat) const
+Overlap IMesh::checkColO2NodeBox(const Node* _node, const vec3& _scale, const mat4& _mOSMat, const Box& _boxB, const mat4& _modelMat) const
 {
-       //vec3 pos;
-       //vec3 size;
-       //_node->getBBcs(pos, size);
+       Box boxA(*_node);
 
-       //scaleVec3(pos, _scale);
-       //scaleVec3(size, _scale);
+       //scale BoxA
+       boxA.scale(_scale);
 
-       //Overlap stepNode = checkColO2SBox(_modelMat, pos, size, _mOSMat);
+       //RotateBox to other
+       Box boxAR(boxA), boxBR(_boxB);
+       boxAR.rotate(glm::inverse(_modelMat)*_mOSMat);
+       boxBR.rotate(glm::inverse(_mOSMat)*_modelMat);
 
-       ////Falls _node nicht overlap
-       //if (!stepNode)
-       //      return stepNode;
+       Overlap stepNode = Box::checkCollideByAxis(boxAR, _boxB);
+       if (stepNode)
+               stepNode.update(Box::checkCollideByAxis(boxA, boxBR));
+
+       //Falls _node nicht overlap
+//     if (!stepNode)
+               return stepNode;
+
+       //check sub _nodes
+       if (_node->getElement() == nullptr)
+       {
+               Overlap left = checkColO2NodeBox(_node->getLNode(), _scale, _mOSMat, _boxB, _modelMat);
+               Overlap right = checkColO2NodeBox(_node->getUNode(), _scale, _mOSMat, _boxB, _modelMat);
+               Overlap stepSub;
+               if (left)
+                       stepSub.update(left);
+               if (right)
+                       stepSub.update(right);
+
+               return stepSub;
+       }
+       else
+       {
+               //TODO ELEMENT CHECK
+               return stepNode;
+       }
 
-       ////check sub _nodes
-       //if (_node->getElement() == nullptr)
-       //{
-       //      Overlap left = checkColNode2O(_node->getLNode(), _scale, _mOSMat, _model, _modelMat);
-       //      Overlap right = checkColNode2O(_node->getUNode(), _scale, _mOSMat, _model, _modelMat);
-       //      Overlap stepSub;
-       //      if (left)
-       //              stepSub.update(left);
-       //      if (right)
-       //              stepSub.update(right);
-
-       //      return stepSub;
-       //}
-       //else
-       //{
-       //      //TODO ELEMENT CHECK
-       //      return stepNode;
-       //}
-       return Overlap();
 }
 
+
 Overlap IMesh::checkColS2O(const mat4& _mMat, const Model* _model, const mat4& _modelMat) const
 {
        //Outer BBoxes
@@ -232,15 +235,15 @@ Overlap IMesh::checkColS2O(const mat4& _mMat, const Model* _model, const mat4& _
 Overlap IMesh::checkColO2SBox(const mat4& _mMat, const Box& _boxB, const mat4& _modelMat) const
 {
        //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
+       #ifdef COMPARE_MTREE
+               vec3 scale = getScale(_mMat);
+               Overlap firstBB = checkColO2NodeBox(root, scale, removeScale(_mMat), _boxB, _modelMat);
+       #else
+               Overlap firstBB = Model::checkColO2SBox(_mMat, _boxB, _modelMat);
+       #endif
 
        //if (!firstBB)
-       return firstBB;
+               return firstBB;
 
        //Inner Mesh
        //call checkColO2STriangle
index dfacaf0b3712e13afac2259a1397aacbb4eeeb46..ca64bb874f4bc30e9742ef92295d19765f49e188 100644 (file)
@@ -29,7 +29,7 @@ public:
        //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;
+       Overlap checkColO2NodeBox(const Node* node, const vec3& scale, const mat4& mOSMat, const Model::Box& boxB, const mat4& modelMat) const;
 
        operator std::string() const override;
 
index d5c058e6eee1a93309c61ce33e6447c33e00255b..66ca197bdfea2257a0a60ed9aa2831242416cb25 100644 (file)
@@ -292,11 +292,6 @@ Overlap Model::isColliding(const Model* _modelThis, const Model* _modelOther, co
 Overlap Model::checkColS2O(const mat4& _mMat, const Model* _model, const mat4& _modelMat) const
 {
        vec3 scale = getScale(_mMat);
-       vec3 pos = box.center();
-       vec3 size = box.size();
-
-       scaleVec3(pos, scale);
-       scaleVec3(size, scale);
 
        Box boxA(box);
        boxA.scale(scale);
@@ -322,89 +317,72 @@ Overlap Model::checkColO2SBox(const mat4& _mMat, const Box& _boxB, const mat4& _
        boxAR.rotate(glm::inverse(_modelMatB)*mMat);
        boxBR.rotate(glm::inverse(mMat)*_modelMatB);
 
-       Overlap ret = checkCollideByAxis(boxAR,_boxB);
+       Overlap ret = Box::checkCollideByAxis(boxAR,_boxB);
        if (ret)
-               ret.update(checkCollideByAxis(boxA, boxBR));
+               ret.update(Box::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);
-//
-//}
+Overlap Model::checkColO2STriangle(const mat4& _mMat, const Triangle& _tri) const
+{
+       vec3 scale = getScale(_mMat);
 
+       Box boxA(box);
+       boxA.scale(scale);
 
-Overlap Model::checkCollideByAxis(const Box& _boxA, const Box& _boxB)
-{
-       Overlap ret;
+       mat4 invmMat = glm::inverse(removeScale(_mMat));
 
-       for (uint i = 0; i < 3; ++i)
-       {
+       //vec3 posBR = (vec3)(invmMat*vec4(_posB, 1.f));
+       //mat3 directionsBR = (mat3)invmMat*_directionsB;
 
-               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;
+       ////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();
+
 }
 
 
+
+
+
 vec3 Model::rotateSize(const vec3& _size, const mat4& _modelMat)
 {
        vec3 newSize(0.f);
@@ -653,6 +631,31 @@ Box::~Box()
 {
 }
 
+void Box::update(const Box& _box)
+{
+       vec3 diff = _box.cen - cen;
+       float size;
+
+       for (int i = 0; i<3; ++i)
+       {
+               if (abs(siz[i] - _box.siz[i]) - abs(diff[i]) >= 0)
+               {
+                       if (siz[i] < _box.siz[i])
+                       {
+                               siz[i] = _box.siz[i];
+                               cen[i] = _box.cen[i];
+                       }
+               }
+               else
+               {
+                       size = (siz[i] + _box.siz[i] + abs(diff[i])) * .5f;
+                       cen[i] = cen[i] - sign(diff[i]) * (siz[i] - size);
+                       siz[i] = size;
+               }
+
+       }
+}
+
 
 void Box::getBBcs(vec3& _center, vec3& _size) const
 {
@@ -660,6 +663,15 @@ void Box::getBBcs(vec3& _center, vec3& _size) const
        _size = siz;
 }
 
+vec3 Box::center() const
+{
+       return cen;
+}
+
+vec3 Box::size() const
+{
+       return siz;
+}
 
 void Box::rotate(const mat4& _modelMat)
 {
@@ -683,39 +695,25 @@ void Box::scale(const vec3& _scale)
        }
 }
 
-vec3 Box::center() const
+float Box::getDist(const vec3& _pos) const
 {
-       return cen;
-}
+       vec3 diff = _pos - cen;
+       vec3 direc = normalize(diff);
 
-vec3 Box::size() const
-{
-       return siz;
+       float size(0.f);
+       for (auto i = 0; i < 3; ++i)
+               size += abs(siz[i] * direc[i]);
+       return diff.length()-size;
 }
 
-void Box::update(const Box& _box)
+float Box::getDist(const vec3& _pos, const vec3& _direc) const
 {
-       vec3 diff = _box.cen - cen;
-       float size;
+       vec3 diff = _pos - cen;
 
-       for (int i = 0; i<3; ++i)
-       {
-               if (abs(siz[i] - _box.siz[i]) - abs(diff[i]) >= 0)
-               {
-                       if (siz[i] < _box.siz[i])
-                       {
-                               siz[i] = _box.siz[i];
-                               cen[i] = _box.cen[i];
-                       }
-               }
-               else
-               {
-                       size = (siz[i] + _box.siz[i] + abs(diff[i])) * .5f;
-                       cen[i] = cen[i] - sign(diff[i]) * (siz[i] - size);
-                       siz[i] = size;
-               }
-
-       }
+       float size(0.f);
+       for (auto i = 0; i < 3; ++i)
+               size += abs(siz[i] * _direc[i]);
+       return dot(diff,_direc) - size;
 }
 
 
@@ -748,4 +746,20 @@ Box Box::merge(const Box& _boxA, const Box& _boxB)
 
        }
        return Box(center,size);
-}
\ No newline at end of file
+}
+
+Overlap Box::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;
+}
index 50068f8b6cdccc7d2acea68bc9927e4a24d4b3ce..39e09903a3cd435a7e2322881ed99abcb80ada7b 100644 (file)
@@ -44,7 +44,7 @@ public:
        class Triangle;
        virtual Overlap checkColS2O(const mat4& mMat, const Model* model, const mat4& modelMat) const;
        virtual Overlap checkColO2SBox(const mat4& mMat, const Box& box, const mat4& modelMat) const;
-       //virtual Overlap checkColO2STriangle(const mat4& mMat, const Triangle& tri) const;
+       virtual Overlap checkColO2STriangle(const mat4& mMat, const Triangle& tri) const;
 
        static Model* getBBoxModel();
        static Model* getSkyBoxModel();
@@ -88,16 +88,27 @@ public:
                Box(const vec3& center, const vec3& size);
                ~Box();
 
+               void update(const Box& box);
+
                void getBBcs(vec3& center, vec3& size) const;
 
+               vec3 center() const;
+               vec3 size() const;
+
                void rotate(const mat4& modelMat);
                void scale(const vec3& scale);
 
-               static Box merge(const Box& boxA, const Box& boxB);
-               void update(const Box& box);
+               float getDist(const vec3& pos) const;
+               float getDist(const vec3& pos, const vec3& direc) const;
 
-               vec3 center() const;
-               vec3 size() const;
+
+
+
+
+
+
+               static Box merge(const Box& boxA, const Box& boxB);
+               static Overlap checkCollideByAxis(const Box& boxA, const Box& boxB);
        protected:
                vec3 cen;
                vec3 siz;
@@ -136,8 +147,6 @@ protected:
        static std::unordered_map<std::string, Model*> IMetaModel;
        static std::unordered_map<std::string, uint> IMetaModel_count;
 
-       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 62fb940a4c50047b8fc5c5032d2701cb25d5d2fb..3db42e3b23867f21bde2a40a9e4303a2d147c963 100644 (file)
@@ -136,6 +136,7 @@ void Scene::update(float deltaT)
 
 }
 
+
 void Scene::draw() const
 {
        viewPort.useViewPort();
@@ -148,6 +149,7 @@ void Scene::draw() const
        for (auto i = ShaderSet.cbegin(); i != ShaderSet.cend(); ++i)
        {
                viewPort.bindView(*i, lookat->getPosition() + vec3(0.0f, 1.0f, 0.0f));
+               //bind Lighting
        }
 
        for (auto i = SceneObjects.cbegin(); i != SceneObjects.cend(); ++i)