using glm::value_ptr;
using glm::sign;
+using glm::min;
+using glm::max;
#define M_PI 3.14159265358979323846264338327950288 /* pi */
#define M_PI_2 1.57079632679489661923132169163975144 /* pi/2 */
}
}
+}
+
+
+void IMetaMesh::isColliding(int& _overlap, int& _inside, const Model* _model) const
+{
+ Model::isColliding(_overlap, _inside, _model);
+
+ if (min(_overlap, _inside)>=0)
+ {
+ _overlap = -1; _inside = -1;
+ int subOverlap=-1, subInside=-1;
+ for (auto i = models.begin(); i != models.end(); ++i)
+ {
+ _model->isColliding(subOverlap, subInside, *i);
+ if (subOverlap > _overlap)
+ _overlap = subOverlap;
+ if (subInside > _inside)
+ _inside = subInside;
+ }
+ }
}
\ No newline at end of file
void drawBBox(Shader* shader, const mat4& modelMat) const;
+ /* calls Colliding to check if self collides with model*/
+ void isColliding(int& overlap, int& inside, const Model* model) const;
+
protected:
std::list<IMesh*> models;
};
glUniform4fv(tmp, 1, value_ptr(_material));
}
+
+void Model::isColliding(int& _overlap, int& _inside, const Model* _model) const
+{
+ vec3 posA, sizeA, posB, sizeB;
+
+ getBBsp(sizeA, posA);
+ _model->getBBsp(sizeB, posB);
+
+ vec3 pDist, sDist;
+ vec3 overlap, inside;
+ int isOverlaping, isInside;
+
+ sizeA /= 2;
+ sizeB /= 2;
+
+ pDist = posB - posA;
+ pDist *= sign(pDist);
+
+ sDist = sizeB - sizeA;
+ sDist *= sign(sDist);
+
+ overlap = (sizeA + sizeB) - pDist;
+ inside = sDist - pDist;
+
+
+ /* overlapping 1 yes, 0 touch, -1 no*/
+ _overlap = sign(glm::min(glm::min(overlap.x, overlap.y), overlap.z));
+ /* inside 1 yes, 0 touch, -1 no*/
+ _inside = sign(glm::min(glm::min(inside.x, inside.y), inside.z));
+}
+
+
Model* Model::BoundingBox = nullptr;
Shader* Model::BBoxShader = nullptr;
bool Model::exBBox = false;
\ No newline at end of file
/* Get size&position from BBox */
void getBBsp(vec3& size, vec3& pos) const;
+ /* calls Colliding to check if self collides with model*/
+ virtual void isColliding(int& overlap, int& inside, const Model* model) const;
+
protected:
uint numvertices, numfaces;
uint vertexBuffer, indexBuffer, normalBuffer, uvBuffer;
virtual void useMaterial(const vec4& material, Shader* shader) const;
virtual void drawModel() const;
-
static Model* BoundingBox;
static Shader* BBoxShader;
static bool exBBox;
if (collision_ignore || _other->collision_ignore)
return;
- vec3 posA, sizeA, posB, sizeB;
-
- model->getBBsp(sizeA, posA);
- _other->model->getBBsp(sizeB, posB);
-
- vec3 pDist, sDist;
- vec3 overlap, inside;
int isOverlaping, isInside;
-
- sizeA /= 2;
- sizeB /= 2;
-
- pDist = posB - posA;
- pDist *= sign(pDist);
-
- sDist = sizeB - sizeA;
- sDist *= sign(sDist);
-
- overlap =(sizeA + sizeB) - pDist;
- inside = sDist - pDist;
-
-
+ model->isColliding(isOverlaping,isInside,_other->model);
/* overlapping 1 yes, 0 touch, -1 no*/
- isOverlaping = sign(glm::min(glm::min(overlap.x, overlap.y), overlap.z));
/* inside 1 yes, 0 touch, -1 no*/
- isInside = sign(glm::min(glm::min(inside.x, inside.y), inside.z));
-
-
-
+ //if (isOverlaping >= 0)
+ // Message::info("Kollision");
}
bool SceneObject::floorBound() const