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);
+ }
}