mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-09 16:52:28 +02:00
Fix algorithm + add comments
This commit is contained in:
parent
955723acf1
commit
f3fcb749df
1 changed files with 17 additions and 5 deletions
|
@ -416,34 +416,46 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& info) {
|
|||
}
|
||||
|
||||
bool RenderableModelEntityItem::contains(const glm::vec3& point) const {
|
||||
bool result = EntityItem::contains(point);
|
||||
|
||||
if (result && _model && _model->getCollisionGeometry()) {
|
||||
if (EntityItem::contains(point) && _model && _model->getCollisionGeometry()) {
|
||||
const QSharedPointer<NetworkGeometry> collisionNetworkGeometry = _model->getCollisionGeometry();
|
||||
const FBXGeometry& collisionGeometry = collisionNetworkGeometry->getFBXGeometry();
|
||||
|
||||
auto checkEachPrimitive = [=](FBXMesh& mesh, QVector<int> indices, int primitiveSize) -> bool {
|
||||
// Check whether the point is "behind" all the primitives.
|
||||
for (unsigned int j = 0; j < indices.size(); j += primitiveSize) {
|
||||
if (!isPointBehindTrianglesPlane(point,
|
||||
mesh.vertices[indices[j]],
|
||||
mesh.vertices[indices[j + 1]],
|
||||
mesh.vertices[indices[j + 2]])) {
|
||||
// it's not behind at least one so we bail
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
// Check that the point is contained in at least one convex mesh.
|
||||
for (auto mesh : collisionGeometry.meshes) {
|
||||
bool insideMesh = true;
|
||||
|
||||
// To be considered inside a convex mesh,
|
||||
// the point needs to be "behind" all the primitives respective planes.
|
||||
for (auto part : mesh.parts) {
|
||||
// run through all the triangles and quads
|
||||
if (!checkEachPrimitive(mesh, part.triangleIndices, 3) ||
|
||||
!checkEachPrimitive(mesh, part.quadIndices, 4)) {
|
||||
return false;
|
||||
// If not, the point is outside, bail for this mesh
|
||||
insideMesh = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (insideMesh) {
|
||||
// It's inside this mesh, return true.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
// It wasn't in any mesh, return false.
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue