From c950f6c009bd3d604c95d0c22ae41e4b47bca7f0 Mon Sep 17 00:00:00 2001 From: Peter Schaefer Date: Wed, 20 May 2015 01:11:09 +0200 Subject: [PATCH] finished Box class marked old centerSize as deprecated --- Weave/Graphix/Model/IMesh.cpp | 22 +++- Weave/Graphix/Model/IMesh.h | 3 +- Weave/Graphix/Model/IMetaMesh.cpp | 22 ++++ Weave/Graphix/Model/IMetaMesh.h | 1 + Weave/Graphix/Model/Model.cpp | 178 ++++++++++++++++++++---------- Weave/Graphix/Model/Model.h | 15 ++- Weave/Overlap.cpp | 7 +- Weave/Overlap.h | 1 + 8 files changed, 185 insertions(+), 64 deletions(-) diff --git a/Weave/Graphix/Model/IMesh.cpp b/Weave/Graphix/Model/IMesh.cpp index c76ae16..93784d9 100644 --- a/Weave/Graphix/Model/IMesh.cpp +++ b/Weave/Graphix/Model/IMesh.cpp @@ -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"; diff --git a/Weave/Graphix/Model/IMesh.h b/Weave/Graphix/Model/IMesh.h index 4960e5b..36cbce2 100644 --- a/Weave/Graphix/Model/IMesh.h +++ b/Weave/Graphix/Model/IMesh.h @@ -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; diff --git a/Weave/Graphix/Model/IMetaMesh.cpp b/Weave/Graphix/Model/IMetaMesh.cpp index f7f4018..8124480 100644 --- a/Weave/Graphix/Model/IMetaMesh.cpp +++ b/Weave/Graphix/Model/IMetaMesh.cpp @@ -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; diff --git a/Weave/Graphix/Model/IMetaMesh.h b/Weave/Graphix/Model/IMetaMesh.h index ac9987b..d5bf97d 100644 --- a/Weave/Graphix/Model/IMetaMesh.h +++ b/Weave/Graphix/Model/IMetaMesh.h @@ -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; diff --git a/Weave/Graphix/Model/Model.cpp b/Weave/Graphix/Model/Model.cpp index 1aaf5db..4b03b4f 100644 --- a/Weave/Graphix/Model/Model.cpp +++ b/Weave/Graphix/Model/Model.cpp @@ -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; diff --git a/Weave/Graphix/Model/Model.h b/Weave/Graphix/Model/Model.h index d8aa9f4..4ca458e 100644 --- a/Weave/Graphix/Model/Model.h +++ b/Weave/Graphix/Model/Model.h @@ -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 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); diff --git a/Weave/Overlap.cpp b/Weave/Overlap.cpp index 4c4f772..c237d0a 100644 --- a/Weave/Overlap.cpp +++ b/Weave/Overlap.cpp @@ -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) diff --git a/Weave/Overlap.h b/Weave/Overlap.h index 079e7e9..79b7833 100644 --- a/Weave/Overlap.h +++ b/Weave/Overlap.h @@ -6,6 +6,7 @@ class Overlap { public: Overlap(); + Overlap(const Overlap& over); Overlap(float over, float in); ~Overlap(); -- 2.47.3