]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
added SplitMat to reduce inversions and splitting
authorPeter Schaefer <schaeferpm@gmail.com>
Mon, 25 May 2015 19:43:08 +0000 (21:43 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Mon, 25 May 2015 19:43:08 +0000 (21:43 +0200)
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

index b6d13a3b7df1a33732f27df33345dc47392e4998..5a033aac363579e88e931fc75be495e6d02553ff 100644 (file)
@@ -23,7 +23,7 @@ typedef IMesh::Node Node;
 
 
 // Vergleiche Unterbaum
-//#define COMPARE_MTREE
+#define COMPARE_MTREE
 //draw BBox of MTREE deep LVL -1 means all lvl's
 #define BBOX_MTREE 5
 
@@ -126,11 +126,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
+Overlap IMesh::checkColNode2O(const Node* _node, const SplitMat& _mOSMat, const Model* _model, const SplitMat& _modelMat) const
 {
        Box box(*_node);
        //scale BoxA
-       box.scale(_scale);
+       box.scale(_mOSMat.scale);
 
        Overlap stepNode = _model->checkColO2SBox(_modelMat, box,_mOSMat);
 
@@ -141,8 +141,8 @@ Overlap IMesh::checkColNode2O(const Node* _node, const vec3& _scale, const mat4&
        //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 left = checkColNode2O(_node->getLNode(), _mOSMat, _model, _modelMat);
+               Overlap right = checkColNode2O(_node->getUNode(), _mOSMat, _model, _modelMat);
                Overlap stepSub;
                if (left)
                        stepSub.update(left);
@@ -159,31 +159,31 @@ Overlap IMesh::checkColNode2O(const Node* _node, const vec3& _scale, const mat4&
 
 }
 
-Overlap IMesh::checkColO2NodeBox(const Node* _node, const vec3& _scale, const mat4& _mOSMat, const Box& _boxB, const mat4& _modelMat) const
+Overlap IMesh::checkColO2NodeBox(const Node* _node, const SplitMat& _mOSMat, const Box& _boxB, const SplitMat& _modelMat) const
 {
        Box boxA(*_node);
 
        //scale BoxA
-       boxA.scale(_scale);
+       boxA.scale(_mOSMat.scale);
 
        //RotateBox to other
        Box boxAR(boxA), boxBR(_boxB);
-       boxAR.rotate(glm::inverse(_modelMat)*_mOSMat);
-       boxBR.rotate(glm::inverse(_mOSMat)*_modelMat);
+       boxAR.rotate(_modelMat.modelInv*_mOSMat.model);
+       boxBR.rotate(_mOSMat.modelInv*_modelMat.model);
 
        Overlap stepNode = Box::checkCollideByAxis(boxAR, _boxB);
        if (stepNode)
                stepNode.update(Box::checkCollideByAxis(boxA, boxBR));
 
        //Falls _node nicht overlap
-//     if (!stepNode)
+       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 left = checkColO2NodeBox(_node->getLNode(), _mOSMat, _boxB, _modelMat);
+               Overlap right = checkColO2NodeBox(_node->getUNode(), _mOSMat, _boxB, _modelMat);
                Overlap stepSub;
                if (left)
                        stepSub.update(left);
@@ -201,12 +201,12 @@ Overlap IMesh::checkColO2NodeBox(const Node* _node, const vec3& _scale, const ma
 }
 
 
-Overlap IMesh::checkColS2O(const mat4& _mMat, const Model* _model, const mat4& _modelMat) const
+Overlap IMesh::checkColS2O(const SplitMat& _mMat, const Model* _model, const SplitMat& _modelMat) const
 {
        //Outer BBoxes
 #ifdef COMPARE_MTREE
-       vec3 scale = getScale(_mMat);
-       Overlap firstBB = checkColNode2O(root, scale, removeScale(_mMat), _model, _modelMat);
+//     vec3 scale = getScale(_mMat);
+       Overlap firstBB = checkColNode2O(root, _mMat, _model, _modelMat);
 #else
        Overlap firstBB = Model::checkColS2O(_mMat, _model, _modelMat);
 #endif
@@ -232,12 +232,12 @@ Overlap IMesh::checkColS2O(const mat4& _mMat, const Model* _model, const mat4& _
        //return secondT;
 }
 
-Overlap IMesh::checkColO2SBox(const mat4& _mMat, const Box& _boxB, const mat4& _modelMat) const
+Overlap IMesh::checkColO2SBox(const SplitMat& _mMat, const Box& _boxB, const SplitMat& _modelMat) const
 {
        //Outer Mesh
        #ifdef COMPARE_MTREE
-               vec3 scale = getScale(_mMat);
-               Overlap firstBB = checkColO2NodeBox(root, scale, removeScale(_mMat), _boxB, _modelMat);
+               //vec3 scale = getScale(_mMat);
+               Overlap firstBB = checkColO2NodeBox(root, _mMat, _boxB, _modelMat);
        #else
                Overlap firstBB = Model::checkColO2SBox(_mMat, _boxB, _modelMat);
        #endif
index ca64bb874f4bc30e9742ef92295d19765f49e188..a713c8d90a152a1e518eba214321321f6d58da70 100644 (file)
@@ -24,12 +24,12 @@ public:
 
        void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const override;
 
-       Overlap checkColS2O(const mat4& mMat, const Model* model, const mat4& modelMat) const override;
-       Overlap checkColO2SBox(const mat4& mMat, const Model::Box& boxB, const mat4& modelMat) const override;
+       Overlap checkColS2O(const SplitMat& mMat, const Model* model, const SplitMat& modelMat) const override;
+       Overlap checkColO2SBox(const SplitMat& mMat, const Model::Box& boxB, const SplitMat& 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 Model::Box& boxB, const mat4& modelMat) const;
+       Overlap checkColNode2O(const Node* node, const SplitMat& mOSMat, const Model* model, const SplitMat& modelMat) const;
+       Overlap checkColO2NodeBox(const Node* node, const SplitMat& mOSMat, const Model::Box& boxB, const SplitMat& modelMat) const;
 
        operator std::string() const override;
 
index 185d1ff39d94fb82c0c67a1db14e6182b133d834..9ede5acf0fda35be96871e1f85b97a6bda8c7740 100644 (file)
@@ -111,7 +111,7 @@ void IMetaMesh::drawBBox(const mat4& _modelMat,const vec4& _color) const
        }
 }
 
-Overlap IMetaMesh::checkColS2O(const mat4& _mMat, const Model* _model, const mat4& _modelMat) const
+Overlap IMetaMesh::checkColS2O(const SplitMat& _mMat, const Model* _model, const SplitMat& _modelMat) const
 {
        //Outer BBox
        Overlap firstBB = Model::checkColS2O(_mMat, _model, _modelMat);
@@ -134,7 +134,7 @@ Overlap IMetaMesh::checkColS2O(const mat4& _mMat, const Model* _model, const mat
        
 }
 
-Overlap IMetaMesh::checkColO2SBox(const mat4& _mMat, const Box& _boxB, const mat4& _modelMat) const
+Overlap IMetaMesh::checkColO2SBox(const SplitMat& _mMat, const Box& _boxB, const SplitMat& _modelMat) const
 {
        //Outer BBox
        Overlap firstBB = Model::checkColO2SBox(_mMat, _boxB, _modelMat);
index eb94eb9b4ed2e3b4c08fdd07318ad76b46d39047..6bac683006d75f074c9cb736f3795810436e4da5 100644 (file)
@@ -23,8 +23,8 @@ public:
 
        void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const override;
 
-       Overlap checkColS2O(const mat4& mMat, const Model* model, const mat4& modelMat) const override;
-       Overlap checkColO2SBox(const mat4& mMat, const Model::Box& boxB, const mat4& modelMat) const override;
+       Overlap checkColS2O(const SplitMat& mMat, const Model* model, const SplitMat& modelMat) const override;
+       Overlap checkColO2SBox(const SplitMat& mMat, const Model::Box& boxB, const SplitMat& modelMat) const override;
 
        operator std::string() const override;
 
index 66ca197bdfea2257a0a60ed9aa2831242416cb25..9f5f5149592e5d1df599af5409c40ea3c08eac7f 100644 (file)
@@ -20,6 +20,7 @@
 
 typedef Model::Triangle Triangle;
 typedef Model::Box Box;
+typedef Model::SplitMat SplitMat;
 
 Model::Model() :
 numfaces(0),
@@ -254,68 +255,35 @@ void Model::useModelMat(const mat4& _model, Shader* _shader) const
 Overlap Model::isColliding(const Model* _modelThis, const Model* _modelOther, const mat4& _modelMatThis, const mat4& _modelMatOther)
 {
        return _modelThis->checkColS2O(_modelMatThis, _modelOther, _modelMatOther);
-
-       //vec3 posA, sizeA, posB, sizeB;
-       //float overlap, inside;
-
-       //_modelThis->getBBsp(sizeA, posA);
-       //_modelOther->getBBsp(sizeB, posB);
-
-       //mat4 modelAR = glm::inverse(removeScale(_modelMatOther))*_modelMatThis;
-       //mat4 modelBR = glm::inverse(removeScale(_modelMatThis))*_modelMatOther;
-
-       //vec3 posAR = (vec3)(modelAR*vec4(posA, 1.f));
-       //vec3 posBR = (vec3)(modelBR*vec4(posB, 1.f));
-
-       //vec3 sizeAR = rotateSize(sizeA, modelAR);
-       //vec3 sizeBR = rotateSize(sizeB, modelBR);
-
-       //vec3 scaleA = getScale(_modelMatThis);
-       //vec3 scaleB = getScale(_modelMatOther);
-
-       //scaleVec3(posA, scaleA);
-       //scaleVec3(posB, scaleB);
-
-       //scaleVec3(sizeA, scaleA);
-       //scaleVec3(sizeB, scaleB);
-
-       //checkCollideByAxis(overlap,inside, 3, value_ptr(posAR), value_ptr(posB), value_ptr(sizeAR), value_ptr(sizeB));
-       //Overlap ret(overlap, inside);
-       //if (ret.overlap() >= 0)
-       //{
-       //      checkCollideByAxis(overlap, inside, 3, value_ptr(posA), value_ptr(posBR), value_ptr(sizeA), value_ptr(sizeBR));
-       //      ret.update(overlap, inside);
-       //}
-       //return ret;
 }
 
-Overlap Model::checkColS2O(const mat4& _mMat, const Model* _model, const mat4& _modelMat) const
+Overlap Model::checkColS2O(const SplitMat& _mMat, const Model* _model, const SplitMat& _modelMat) const
 {
-       vec3 scale = getScale(_mMat);
+//     vec3 scale = getScale(_mMat);
 
        Box boxA(box);
-       boxA.scale(scale);
+       boxA.scale(_mMat.scale);
 
-       Overlap stepBB = _model->checkColO2SBox(_modelMat, boxA, removeScale(_mMat));
+       Overlap stepBB = _model->checkColO2SBox(_modelMat, boxA, _mMat);
 
        return stepBB;
 }
 
-Overlap Model::checkColO2SBox(const mat4& _mMat, const Box& _boxB, const mat4& _modelMatB) const
+Overlap Model::checkColO2SBox(const SplitMat& _mMat, const Box& _boxB, const SplitMat& _modelMatB) const
 {
        //split _mMat to scale and mMat
-       vec3 scale = getScale(_mMat);
-       mat4 mMat = removeScale(_mMat);
+//     vec3 scale = getScale(_mMat);
+//     mat4 mMat = removeScale(_mMat);
 
        Box boxA(box);
 
        //scale BoxA
-       boxA.scale(scale);
+       boxA.scale(_mMat.scale);
 
        //RotateBox to other
        Box boxAR(boxA), boxBR(_boxB);
-       boxAR.rotate(glm::inverse(_modelMatB)*mMat);
-       boxBR.rotate(glm::inverse(mMat)*_modelMatB);
+       boxAR.rotate(_modelMatB.modelInv*_mMat.model);
+       boxBR.rotate(_mMat.modelInv*_modelMatB.model);
 
        Overlap ret = Box::checkCollideByAxis(boxAR,_boxB);
        if (ret)
@@ -324,14 +292,14 @@ Overlap Model::checkColO2SBox(const mat4& _mMat, const Box& _boxB, const mat4& _
        return ret;
 }
 
-Overlap Model::checkColO2STriangle(const mat4& _mMat, const Triangle& _tri) const
+Overlap Model::checkColO2STriangle(const SplitMat& _mMat, const Triangle& _tri) const
 {
-       vec3 scale = getScale(_mMat);
+//     vec3 scale = getScale(_mMat);
 
        Box boxA(box);
-       boxA.scale(scale);
+       boxA.scale(_mMat.scale);
 
-       mat4 invmMat = glm::inverse(removeScale(_mMat));
+//     mat4 invmMat = glm::inverse(_mMat.model);
 
        //vec3 posBR = (vec3)(invmMat*vec4(_posB, 1.f));
        //mat3 directionsBR = (mat3)invmMat*_directionsB;
@@ -554,6 +522,16 @@ Model* Model::SkyBoxModel = nullptr;
 std::unordered_map<string, Model*> Model::IMetaModel;
 std::unordered_map<string, uint> Model::IMetaModel_count;
 
+// CLASS SPLITMAT
+
+SplitMat::SplitMat(const mat4& _model) : scale(getScale(_model)), model(removeScale(_model)), modelInv(inverse(model)), modelOrig(_model)
+{
+}
+
+SplitMat::~SplitMat()
+{
+}
+
 // CLASS TRIANGLE
 
 Triangle::Triangle(const mat3& _vertex, const vec3& _normal) : vertex(_vertex), normal(normalize(_normal))
index 39e09903a3cd435a7e2322881ed99abcb80ada7b..bc2f72f553187851d31dc81d90fd1825c178c8fb 100644 (file)
@@ -18,6 +18,7 @@ class Model
 public:
        class Triangle;
        class Box;
+       class SplitMat;
 
        /* Binds Model to the Model*/
        virtual void bindShader(Shader* shader);
@@ -42,9 +43,9 @@ public:
 
        /* test self against other*/
        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 checkColS2O(const SplitMat& mMat, const Model* model, const SplitMat& modelMat) const;
+       virtual Overlap checkColO2SBox(const SplitMat& mMat, const Box& box, const SplitMat& modelMat) const;
+       virtual Overlap checkColO2STriangle(const SplitMat& mMat, const Triangle& tri) const;
 
        static Model* getBBoxModel();
        static Model* getSkyBoxModel();
@@ -58,6 +59,22 @@ public:
 
        virtual operator std::string() const = 0;
 
+       class SplitMat
+       {
+       public:
+               SplitMat(const mat4& model);
+               ~SplitMat();
+
+               mat4& getModelMat();
+
+       //protected:
+               const vec3 scale;
+               const mat4 model;
+               const mat4 modelInv;
+               const mat4 modelOrig;
+       };
+
+
        class Triangle
        {
        public:
@@ -101,12 +118,6 @@ public:
                float getDist(const vec3& pos) const;
                float getDist(const vec3& pos, const vec3& direc) const;
 
-
-
-
-
-
-
                static Box merge(const Box& boxA, const Box& boxB);
                static Overlap checkCollideByAxis(const Box& boxA, const Box& boxB);
        protected:
@@ -138,7 +149,7 @@ protected:
        void bindBuffer(const uint &buffer, const uint index, const uint dim = 3);
 
        virtual void useModel(Shader* shader) const;
-       virtual void useTexture(Texture* texture, Shader* shader) const;
+       virtual void useTexture(Texture* texture, Shader* shader) const; 
        virtual void useModelMat(const mat4& model, Shader* shader) const;
        virtual void drawModel() const;