From: Peter Schaefer Date: Wed, 20 May 2015 11:00:04 +0000 (+0200) Subject: triangle check (not working) X-Git-Url: https://git.leopard-lacewing.eu/?a=commitdiff_plain;h=39b5bb8c74c853d0c5dbe2c5f767a73bfefd69ff;p=cgue_weave.git triangle check (not working) colDetect to slow --- diff --git a/Weave/Graphix/Model/IMesh.cpp b/Weave/Graphix/Model/IMesh.cpp index 14170f7..b6d13a3 100644 --- a/Weave/Graphix/Model/IMesh.cpp +++ b/Weave/Graphix/Model/IMesh.cpp @@ -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 diff --git a/Weave/Graphix/Model/IMesh.h b/Weave/Graphix/Model/IMesh.h index dfacaf0..ca64bb8 100644 --- a/Weave/Graphix/Model/IMesh.h +++ b/Weave/Graphix/Model/IMesh.h @@ -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; diff --git a/Weave/Graphix/Model/Model.cpp b/Weave/Graphix/Model/Model.cpp index d5c058e..66ca197 100644 --- a/Weave/Graphix/Model/Model.cpp +++ b/Weave/Graphix/Model/Model.cpp @@ -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; +} diff --git a/Weave/Graphix/Model/Model.h b/Weave/Graphix/Model/Model.h index 50068f8..39e0990 100644 --- a/Weave/Graphix/Model/Model.h +++ b/Weave/Graphix/Model/Model.h @@ -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 IMetaModel; static std::unordered_map 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); diff --git a/Weave/Scene/Scene.cpp b/Weave/Scene/Scene.cpp index 62fb940..3db42e3 100644 --- a/Weave/Scene/Scene.cpp +++ b/Weave/Scene/Scene.cpp @@ -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)