public MeshCollisionTester(Mesh mesh) { _mesh = mesh; if (_mesh == null) { throw new Exception("Mesh cannot be null"); } }
public virtual Mesh CopyMesh() { var ret = new Mesh(); CopyDataFrom(ret); return ret; }
public virtual void CopyDataFrom(Mesh target) { foreach (var meshTriangle in target.Triangles) AddTriangle(meshTriangle); Translation = target.Translation; Rotation = target.Rotation; }
private MeshCollisionResult CollideWithRay(Mesh target, Vector3 point, Vector3 direction) { var translatedPoint = point - target.Translation; int triangleCount; var triangles = target.GetAllTriangles(out triangleCount); if (triangleCount > 50) return CollideInParallel(triangles, translatedPoint, direction); return CollideInSeries(triangles, translatedPoint, direction); }
private MeshCollisionResult CollideWithLineSegment(Mesh target, Vector3 point, Vector3 direction, float distanceSquared) { var result = CollideWithRay(target, point, direction); if (result.RayCollisionResult.HasCollided) { var colDistanceSqr = result.RayCollisionResult.CollisionPoint.DistanceSquared(point); if (colDistanceSqr < distanceSquared) return result; } return new MeshCollisionResult(new CollisionResult { HasCollided = false }, 0); }