From: Peter Schaefer Date: Mon, 25 May 2015 19:43:08 +0000 (+0200) Subject: added SplitMat to reduce inversions and splitting X-Git-Url: https://git.leopard-lacewing.eu/?a=commitdiff_plain;h=7f3ca4357183d9077ef424dd1400cfd1b92b95f5;p=cgue_weave.git added SplitMat to reduce inversions and splitting --- diff --git a/Weave/Graphix/Model/IMesh.cpp b/Weave/Graphix/Model/IMesh.cpp index b6d13a3..5a033aa 100644 --- a/Weave/Graphix/Model/IMesh.cpp +++ b/Weave/Graphix/Model/IMesh.cpp @@ -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 diff --git a/Weave/Graphix/Model/IMesh.h b/Weave/Graphix/Model/IMesh.h index ca64bb8..a713c8d 100644 --- a/Weave/Graphix/Model/IMesh.h +++ b/Weave/Graphix/Model/IMesh.h @@ -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; diff --git a/Weave/Graphix/Model/IMetaMesh.cpp b/Weave/Graphix/Model/IMetaMesh.cpp index 185d1ff..9ede5ac 100644 --- a/Weave/Graphix/Model/IMetaMesh.cpp +++ b/Weave/Graphix/Model/IMetaMesh.cpp @@ -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); diff --git a/Weave/Graphix/Model/IMetaMesh.h b/Weave/Graphix/Model/IMetaMesh.h index eb94eb9..6bac683 100644 --- a/Weave/Graphix/Model/IMetaMesh.h +++ b/Weave/Graphix/Model/IMetaMesh.h @@ -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; diff --git a/Weave/Graphix/Model/Model.cpp b/Weave/Graphix/Model/Model.cpp index 66ca197..9f5f514 100644 --- a/Weave/Graphix/Model/Model.cpp +++ b/Weave/Graphix/Model/Model.cpp @@ -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 Model::IMetaModel; std::unordered_map 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)) diff --git a/Weave/Graphix/Model/Model.h b/Weave/Graphix/Model/Model.h index 39e0990..bc2f72f 100644 --- a/Weave/Graphix/Model/Model.h +++ b/Weave/Graphix/Model/Model.h @@ -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;