]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
fixed BBox Kollision (real BBox distance!)
authorPeter Schaefer <schaeferpm@gmail.com>
Sat, 2 May 2015 08:29:02 +0000 (10:29 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Sat, 2 May 2015 08:29:02 +0000 (10:29 +0200)
Weave/Graphix/Model/Model.cpp

index 7faa65187cbd7fa5a882627a852b840af5393d2a..d13f0dd1858f7a51b40e59c44f316adb9eba6f85 100644 (file)
@@ -256,24 +256,30 @@ void Model::useMaterial(const vec4& _material, Shader* _shader) const
 void Model::isColliding(float& _overlap, float& _inside, const Model* _model, const mat4& _modelMatThis, const mat4& _modelMatOther) const
 {
        vec3 posA, sizeA, posB, sizeB;
+       float overlap, inside;
 
        getBBsp(sizeA, posA);
        _model->getBBsp(sizeB, posB);
 
-       posA = posA + (vec3)(_modelMatThis[3]); //transpose sollte eigentlich reichen
-       posB = posB + (vec3)(_modelMatOther[3]);
+       mat4 modelAR = glm::inverse(_modelMatOther)*_modelMatThis;
+       mat4 modelBR = glm::inverse(_modelMatThis)*_modelMatOther;
+
+       vec3 posAR = (vec3)(modelAR*vec4(posA, 1.f));
+       vec3 posBR = (vec3)(modelBR*vec4(posB, 1.f));
 
        sizeA /= 2;
        sizeB /= 2;
 
-       vec3 sizeAR = rotateSize(sizeA, glm::inverse(_modelMatOther)*_modelMatThis);
-       vec3 sizeBR = rotateSize(sizeB, glm::inverse(_modelMatThis)*_modelMatOther);
-
-       sizeA = rotateSize(sizeA,_modelMatThis);
-       sizeB = rotateSize(sizeB,_modelMatOther);
-
+       vec3 sizeAR = rotateSize(sizeA, modelAR);
+       vec3 sizeBR = rotateSize(sizeB, modelBR);
 
-       checkCollideByAxis(_overlap, _inside, 3, value_ptr(posA), value_ptr(posB), value_ptr(sizeA), value_ptr(sizeB));
+       checkCollideByAxis(_overlap, _inside, 3, value_ptr(posAR), value_ptr(posB), value_ptr(sizeAR), value_ptr(sizeB));
+       if (_overlap >= 0)
+       {
+               checkCollideByAxis(overlap, inside, 3, value_ptr(posA), value_ptr(posBR), value_ptr(sizeA), value_ptr(sizeBR));
+               _overlap = min(overlap, _overlap);
+               _inside = min(overlap, _inside);
+       }
 
 }