// Vergleiche Unterbaum
-//#define COMPARE_MTREE
+#define COMPARE_MTREE
//draw BBox of MTREE deep LVL -1 means all lvl's
#define BBOX_MTREE 5
}
-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);
//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);
}
-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);
}
-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
//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
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;
}
}
-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);
}
-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);
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;
typedef Model::Triangle Triangle;
typedef Model::Box Box;
+typedef Model::SplitMat SplitMat;
Model::Model() :
numfaces(0),
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)
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;
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))
public:
class Triangle;
class Box;
+ class SplitMat;
/* Binds Model to the Model*/
virtual void bindShader(Shader* shader);
/* 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();
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:
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:
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;