Beispiel #1
0
        private MeshCollisionResult CollideInParallel(IEnumerable<MeshTriangle> triangles, Vector3 point, Vector3 direction)
        {
            var data = new MeshCollisionData();
            var lockingObject = new Mutex();

            Parallel.ForEach(triangles, triangle =>
            {
                var result = CollideTriangleWithRay(triangle, point, direction);
                if (!result.HasCollided)
                    return;

                var distance = result.CollisionPoint.Distance(point);
                var realTriangle = triangle.Translate(_mesh.Translation);
                result.CollisionPoint += _mesh.Translation;
                lock (lockingObject)
                {
                    UpdateCollisionData(data, distance, result, realTriangle);
                }
            });

            return data.GetCollisionResult();
        }
Beispiel #2
0
        private MeshCollisionResult CollideInSeries(IEnumerable<MeshTriangle> triangles, Vector3 point, Vector3 direction)
        {
            var data = new MeshCollisionData();

            foreach (var triangle in triangles)
            {
                var result = CollideTriangleWithRay(triangle, point, direction);
                if (!result.HasCollided)
                    continue;

                var realTriangle = triangle.Translate(_mesh.Translation);
                var distance = result.CollisionPoint.Distance(point);
                result.CollisionPoint += _mesh.Translation;
                result.CollisionMesh = _mesh;

                UpdateCollisionData(data, distance, result, realTriangle);
            }

            return data.GetCollisionResult();
        }