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)
}
-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
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
//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;
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);
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);
{
}
+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
{
_size = siz;
}
+vec3 Box::center() const
+{
+ return cen;
+}
+
+vec3 Box::size() const
+{
+ return siz;
+}
void Box::rotate(const mat4& _modelMat)
{
}
}
-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;
}
}
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;
+}
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();
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;
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);
}
+
void Scene::draw() const
{
viewPort.useViewPort();
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)