scaleVec3(pos, scale);
scaleVec3(size, scale);
- Overlap stepBB = _model->checkColO2SBox(_modelMat, pos, size, removeScale(_mMat));
+ Box boxA(box);
+ boxA.scale(scale);
+
+// Overlap stepBB = _model->checkColO2SBox(_modelMat, pos, size, removeScale(_mMat));
+
+ Overlap stepBB = _model->checkColO2SBox(_modelMat, boxA, removeScale(_mMat));
return stepBB;
}
return ret;
}
-Overlap Model::checkColO2STriangle(const mat4& _mMat, const vec3& _posB, const mat3& _directionsB) const
+Overlap Model::checkColO2SBox(const mat4& _mMat, const Box& _boxB, const mat4& _modelMatB) const
{
-
- vec3 posA = box.center();
- vec3 sizeA = box.size();
-
+ //split _mMat to scale and mMat
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;
-
+ mat4 mMat = removeScale(_mMat);
- //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 boxA(box);
+ //scale BoxA
+ boxA.scale(scale);
- //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;
- }
- }
+ //RotateBox to other
+ Box boxAR(boxA), boxBR(_boxB);
+ boxAR.rotate(glm::inverse(_modelMatB)*mMat);
+ boxBR.rotate(glm::inverse(mMat)*_modelMatB);
- return Overlap(overlap, overlap);
+ Overlap ret = checkCollideByAxis(boxAR,_boxB);
+ if (ret)
+ ret.update(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);
+//
+//}
+
void Model::checkCollideByAxis(float& _overlap, float& _inside, uint dim, const float* posA, const float* posB, const float* sizeA, const float* sizeB)
{
_overlap = sizeA[0] + sizeB[0];
_inside = -1;
}
+Overlap Model::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;
+}
+
vec3 Model::rotateSize(const vec3& _size, const mat4& _modelMat)
{
- vec3 Size = vec3(0.f);
- vec4 tmp;
+ vec3 newSize(0.f);
+ mat3 tmpModelMat(_modelMat);
for (auto i = 0; i < 3; ++i)
- {
- tmp = vec4(0.f);
- tmp[i] = _size[i];
- Size += abs((vec3)(_modelMat* tmp));
- }
- return Size;
+ newSize += abs(tmpModelMat[i]) * _size[i];
+ return newSize;
}
float Model::directSize(const vec3& _size, const vec3& _direction)
_size = siz;
}
+void Box::rotate(const mat4& _modelMat)
+{
+ //Rotate Center
+ cen = (vec3)(_modelMat*vec4(cen, 1.f));
+
+ //Rotate Size
+ vec3 newSize(0.f);
+ mat3 tmpModelMat(_modelMat);
+ for (auto i = 0; i < 3; ++i)
+ newSize += abs(tmpModelMat[i]) * siz[i];
+ siz = newSize;
+}
+
+void Box::scale(const vec3& _scale)
+{
+ for (uint i = 0; i < 3; ++i)
+ {
+ cen[i] *= _scale[i];
+ siz[i] *= _scale[i];
+ }
+}
+
vec3 Box::center() const
{
return cen;
/* Get min&max from BBox */
// virtual void getBBmm(vec3& min, vec3& max) const;
/* Get size&position from BBox */
- virtual void getBBcs(vec3& center, vec3& size) const;
+ void getBBcs(vec3& center, vec3& size) const;
+ /* Get center&size (BOX) */
Box getBBox() const;
/* calls Colliding to check if self collides with model*/
/* test self against other*/
class Triangle;
virtual Overlap checkColS2O(const mat4& mMat, const Model* model, const mat4& modelMat) const;
+
+ __declspec(deprecated)
virtual Overlap checkColO2SBox(const mat4& mMat, const vec3& pos, const vec3& size, const mat4& modelMat) const;
- virtual Overlap checkColO2STriangle(const mat4& mMat, const vec3& pos, const mat3& directions) const;
+
+ virtual Overlap checkColO2SBox(const mat4& mMat, const Box& box, const mat4& modelMat) const;
+ //virtual Overlap checkColO2STriangle(const mat4& mMat, const Triangle& tri) const;
static Model* getBBoxModel();
static Model* getSkyBoxModel();
void getBBcs(vec3& center, vec3& size) const;
+ void rotate(const mat4& modelMat);
+ void scale(const vec3& scale);
+
static Box merge(const Box& boxA, const Box& boxB);
vec3 center() const;
vec3 size() const;
static std::unordered_map<std::string, uint> IMetaModel_count;
+ __declspec(deprecated)
static void checkCollideByAxis(float& overlap, float& inside, uint dim, const float* posA, const float* posB, const float* sizeA, const float* sizeB);
+ 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);