コード例 #1
0
        private void raycastEntity(Engine.WorldRendering.Entity ent, Ray ray, RaycastResult newResult)
        {
            bool abort = ent.Mesh == null;

            if (abort)
            {
                newResult.Set(null, ent);
                return;
            }

            var transformed = ray.Transform(Matrix.Invert(ent.WorldMatrix));


            //TODO: do course boundingbox check
            var bb = TW.Assets.GetBoundingBox(ent.Mesh);

            if (!transformed.xna().Intersects(bb.xna()).HasValue)
            {
                newResult.Set(null, ent);
                return;
            }



            Vector3 v1, v2, v3;
            var     distance = MeshRaycaster.RaycastMesh(ent.Mesh, transformed, out v1, out v2, out v3);


            newResult.Set(distance, ent);
            newResult.V1 = Vector3.TransformCoordinate(v1, ent.WorldMatrix);
            newResult.V2 = Vector3.TransformCoordinate(v2, ent.WorldMatrix);
            newResult.V3 = Vector3.TransformCoordinate(v3, ent.WorldMatrix);
        }
コード例 #2
0
        public void AddIntersection(Ray ray, Vector3[] vertices, Matrix world, object obj)
        {
            var localRay = ray.Transform(Matrix.Invert(world));

            SlimDX.Vector3 v0;
            SlimDX.Vector3 v1;
            SlimDX.Vector3 v2;
            SlimDX.Vector3 normal;
            var            dist = MeshRaycaster.RaycastMeshPart(vertices.Select(v => v.dx()).ToArray(), localRay.dx(), out v0, out v1, out v2, out normal);

            if (!dist.HasValue)
            {
                return;
            }
            var point = Vector3.TransformCoordinate(localRay.GetPoint(dist.Value), world);

            cache.Set(Vector3.Distance(ray.Position, point), obj);
            if (!cache.IsCloser(closest))
            {
                return;
            }
            closest.Set(cache.Distance, cache.Object);
            closest.V1        = Vector3.TransformCoordinate(v0, world).dx();
            closest.V2        = Vector3.TransformCoordinate(v1, world).dx();
            closest.V3        = Vector3.TransformCoordinate(v2, world).dx();
            closest.HitNormal = Vector3.TransformNormal(normal, world);
        }
コード例 #3
0
        public static RaycastResult Raycast <T>(this IEnumerable <T> e, Func <T, Bounds> getLocalBoundingbox, Func <T, Matrix4x4> getTransform, Ray ray) where T : class
        {
            var closest   = new RaycastResult();
            var newResult = new RaycastResult();

            //IWorldSelectableProvider closestProvider = null;
            //Selectable closestSelectable = null;

            foreach (var s in e)
            {
                var   transformation = getTransform(s);
                var   localRay       = ray.Transform(Matrix4x4.Inverse(transformation));
                float dist;
                if (getLocalBoundingbox(s).IntersectRay(localRay, out dist))
                {
                    var localPoint = localRay.GetPoint(dist);
                    var point      = transformation.MultiplyPoint3x4(localPoint);
                    dist = Vector3.Distance(ray.origin, point);
                }

                newResult.Set(dist, s);

                if (newResult.IsCloser(closest))
                {
                    newResult.CopyTo(closest);
                }
            }

            return(closest);
        }
コード例 #4
0
        public static RaycastResult Raycast <T>(this IEnumerable <T> e, Func <T, BoundingBox> getLocalBoundingbox, Func <T, Matrix> getTransform, Ray ray) where T : class
        {
            var closest   = new RaycastResult();
            var newResult = new RaycastResult();

            //IWorldSelectableProvider closestProvider = null;
            //Selectable closestSelectable = null;

            foreach (var s in e)
            {
                var transformation = getTransform(s);
                var localRay       = ray.Transform(Matrix.Invert(transformation));
                var dist           = localRay.xna().Intersects(getLocalBoundingbox(s).xna());
                if (dist != null)
                {
                    var localPoint = localRay.GetPoint(dist.Value);
                    var point      = Vector3.TransformCoordinate(localPoint, transformation);
                    dist = Vector3.Distance(ray.Position, point);
                }

                newResult.Set(dist, s);

                if (newResult.IsCloser(closest))
                {
                    newResult.CopyTo(closest);
                }
            }

            return(closest);
        }
コード例 #5
0
        private RaycastResult checkIntersects(object o, Ray ray)
        {
            var bb = getBoundingBox(o);
            var dist = ray.xna().Intersects(bb.xna());

            var res = new RaycastResult();
            res.Set(dist, o);

            return res;
        }
コード例 #6
0
        public static RaycastResult RaycastDetail <T>(this IEnumerable <T> e, Func <T, Ray, float?> intersect, Ray ray) where T : class
        {
            var closest   = new RaycastResult();
            var newResult = new RaycastResult();

            //IWorldSelectableProvider closestProvider = null;
            //Selectable closestSelectable = null;

            foreach (var s in e)
            {
                var dist = intersect(s, ray);

                newResult.Set(dist, s);

                if (newResult.IsCloser(closest))
                {
                    newResult.CopyTo(closest);
                }
            }

            return(closest);
        }