Beispiel #1
0
        public static bool WorldToScreenRel(Vector3 entityPosition, out Vector2 screenCoords)
        {
            var mView = Util.GetCameraMatrix();

            mView.Transpose();

            var vForward = mView.Row4;
            var vRight   = mView.Row2;
            var vUpward  = mView.Row3;

            var result = new SharpDX.Vector3(0, 0, 0);

            result.Z = (vForward.X * entityPosition.X) + (vForward.Y * entityPosition.Y) + (vForward.Z * entityPosition.Z) + vForward.W;
            result.X = (vRight.X * entityPosition.X) + (vRight.Y * entityPosition.Y) + (vRight.Z * entityPosition.Z) + vRight.W;
            result.Y = (vUpward.X * entityPosition.X) + (vUpward.Y * entityPosition.Y) + (vUpward.Z * entityPosition.Z) + vUpward.W;

            if (result.Z < 0.001f)
            {
                screenCoords = new Vector2(0, 0);
                return(false);
            }

            float invw = 1.0f / result.Z;

            result.X    *= invw;
            result.Y    *= invw;
            screenCoords = new Vector2(result.X, -result.Y);
            return(true);
        }
Beispiel #2
0
        public static void ScreenRelToWorld(Vector2 screenCoordsRel, out Vector3 camPoint, out Vector3 farPoint)
        {
            var mView = CameraHelper.GetCameraMatrix();

            camPoint = ViewMatrixToCameraPosition(mView);
            farPoint = ScreenRelToWorld(mView, screenCoordsRel);
        }
Beispiel #3
0
        public static Vector3 ConecastPedsAndVehicles(Vector2 screenCoords, out  Entity hitEntity)
        {
            var numPoints = 5;
            var angleStep = Math.PI * 0.2;
            var distStep = 0.05 / 5;
            var resultCoord = new Vector3();
            hitEntity = null;
            for (var i = 0; i < numPoints; i++)
            {
                var angle = i * angleStep;
                var dist = i * distStep;
                var offsetX = Math.Sin(angle) * dist;
                var offsetY = Math.Cos(angle) * dist;
                var coord = screenCoords + new Vector2((float)offsetX, (float)offsetY);
                Entity entity;
                var hitcoord = RaycastEverything(coord, out entity, i!=0);
                if (i == 0)
                {
                    resultCoord = hitcoord;
                }

                if ((entity != null)
                    && ((ScriptHookExtensions.IsEntityAPed(entity)
                            && entity.Handle != Game.Player.Character.Handle)
                        || (ScriptHookExtensions.IsEntityAVehicle(entity)
                            && !(Game.Player.Character.IsInVehicle()
                                && entity.Handle == Game.Player.Character.CurrentVehicle.Handle))))
                {
                    hitEntity = entity;
                    resultCoord = hitcoord;
                    break;
                }
            }
            return resultCoord;
        }
Beispiel #4
0
        public GTABoundingBox2 To2D()
        {
            float x_min = float.MaxValue, x_max = 0, y_min = float.MaxValue, y_max = 0;

            foreach (GTAVector v in CornerPoints)
            {
                Vector2 temp = HashFunctions.Convert3dTo2d(v, out bool success);
                if (success)
                {
                    x_max = Math.Max(x_max, temp.X);
                    x_min = Math.Min(x_min, temp.X);

                    y_max = Math.Max(y_max, temp.Y);
                    y_min = Math.Min(y_min, temp.Y);
                }
                else
                {
                    //System.IO.File.AppendAllText("F:/datasets/GTA_V_anomaly/log.txt", "Coord failed: " + temp.ToString() + "\n");
                }
            }

            x_max = Math.Min(x_max, 1f);
            x_min = Math.Max(x_min, 0f);

            y_max = Math.Min(y_max, 1f);
            y_min = Math.Max(y_min, 0f);

            var result = new GTABoundingBox2
            {
                Min = new GTAVector2(x_min, y_min),
                Max = new GTAVector2(x_max, y_max)
            };

            return(result);
        }
Beispiel #5
0
        public static Vector3 RaycastEverything(Vector2 screenCoord, out Entity hitEntity, float radius)
        {
            Vector3 source3D;
            Vector3 target3D;

            ScreenRelToWorld(screenCoord, out source3D, out target3D);

            return(RaycastEverything(out hitEntity, target3D, source3D, radius));
        }
Beispiel #6
0
        /// <summary>
        /// Cause the vehicle to levitate.
        /// </summary>
        public static LevitateController Levitate(this Vehicle vehicle, Random rnd, Timer timer)
        {
            var   extraHeight = 10f + (float)(rnd.NextDouble() * 5f);
            float?jitter      = null;

            var position = new GTA.Math.Vector2(vehicle.Position.X, vehicle.Position.Y);
            var height   = World.GetGroundHeight(position) + extraHeight;

            return(new LevitateController(timer, vehicle, height, rnd, jitter));
        }
Beispiel #7
0
        /// <summary>
        /// Cause the pedestrian to levitate.
        /// </summary>
        public static LevitateController Levitate(this Ped ped, Random rnd, Timer timer)
        {
            var   extraHeight = 4f + (float)(rnd.NextDouble() * 2f);
            float?jitter      = 0.05f;

            ped.Euphoria.HighFall.Start(10_000);

            var position = new GTA.Math.Vector2(ped.Position.X, ped.Position.Y);
            var height   = World.GetGroundHeight(position) + extraHeight;

            return(new LevitateController(timer, ped, height, rnd, jitter));
        }
Beispiel #8
0
        public static bool WorldToScreenRel(GTA.Math.Vector3 worldCoords, out GTA.Math.Vector2 screenCoords)
        {
            bool success;

            screenCoords = HashFunctions.Convert3dTo2d(worldCoords, out success);
            if (!success)
            {
                return(false);
            }
            screenCoords.X = (screenCoords.X - 0.5f) * 2.0f;
            screenCoords.Y = (screenCoords.Y - 0.5f) * 2.0f;
            return(success);
        }
Beispiel #9
0
        public static bool WorldToScreenRel_Native(Vector3 worldCoords, out Vector2 screenCoords)
        {
            var num1 = new OutputArgument();
            var num2 = new OutputArgument();

            if (!Function.Call <bool>(Hash._WORLD3D_TO_SCREEN2D, worldCoords.X, worldCoords.Y, worldCoords.Z, num1, num2))
            {
                screenCoords = new Vector2();
                return(false);
            }
            screenCoords = new Vector2((num1.GetResult <float>() - 0.5f) * 2, (num2.GetResult <float>() - 0.5f) * 2);
            return(true);
        }
Beispiel #10
0
        public static GTABoundingBox2 ComputeBoundingBox(Entity entity)
        {
            var m = entity.Model;

            (Vector3 gmin, Vector3 gmax) = m.Dimensions;

            var bbox = new SharpDX.BoundingBox(new SharpDX.Vector3(gmin.X, gmin.Y, gmin.Z), new SharpDX.Vector3(gmax.X, gmax.Y, gmax.Z));

            var res = new GTABoundingBox2
            {
                Min = new Vector2(float.PositiveInfinity, float.PositiveInfinity),
                Max = new Vector2(float.NegativeInfinity, float.NegativeInfinity)
            };

            foreach (var corner in bbox.GetCorners())
            {
                var cornerVector = new Vector3(corner.X, corner.Y, corner.Z);

                cornerVector = entity.GetOffsetPosition(cornerVector);
                Vector2 position = HashFunctions.Convert3dTo2d(cornerVector);

                if (position.X == .1f || position.Y == .1f || position.X == .9f || position.Y == .9f)
                {
                    return(new GTABoundingBox2
                    {
                        Min = new Vector2(float.PositiveInfinity, float.PositiveInfinity),
                        Max = new Vector2(float.NegativeInfinity, float.NegativeInfinity),
                        Quality = DataQuality.Low
                    });
                }

                res = new GTABoundingBox2
                {
                    Min     = new Vector2(Math.Min(res.Min.X, position.X), Math.Min(res.Min.Y, position.Y)),
                    Max     = new Vector2(Math.Max(res.Max.X, position.X), Math.Max(res.Max.Y, position.Y)),
                    Quality = DataQuality.High
                };
            }

            if (res.Max.X == res.Min.X || res.Max.Y == res.Min.Y)
            {
                res.Quality = DataQuality.Low;
            }

            return(res);
        }
Beispiel #11
0
        public static Vehicle SearchVehicle(Vector2 screenCoords)
        {
            const double searchRange    = 0.1;
            const double thresholdRange = 0.025;
            const float  raycastToDist  = 200.0f;
            var          vehs           = World.GetNearbyVehicles(Game.Player.Character.Position, raycastToDist);
            var          mindist        = Double.MaxValue;
            Vehicle      foundVeh       = null;

            //Util.Log("Vehs - " + vehs.Length);
            //Util.Log("V - " + DateTime.UtcNow.Ticks);
            foreach (var vehicle in vehs)
            {
                if ((Game.Player.Character.IsInVehicle()) && (vehicle.Handle == Game.Player.Character.CurrentVehicle.Handle))
                {
                    continue;                                                                                                                           //you own veh
                }
                var     vehOffset = vehicle.Position;
                Vector2 vehScreenCoords;

                if (!WorldToScreenRel(vehOffset, out vehScreenCoords))
                {
                    continue;
                }

                var dist = (screenCoords - vehScreenCoords).Length();
                if (!(dist < mindist) || !(dist < searchRange))
                {
                    continue;
                }
                if (vehicle.IsOccluded)
                {
                    continue;
                }
                //if (IsOccluded(vehicle, vehOffset)) continue;
                mindist  = dist;
                foundVeh = vehicle;
                if (dist < thresholdRange)
                {
                    break;
                }
            }
            //Util.Log("W - " + DateTime.UtcNow.Ticks);

            return(foundVeh);
        }
Beispiel #12
0
        public static void ScreenRelToWorld(Vector2 screenCoordsRel, out Vector3 camPoint, out Vector3 farPoint)
        {
            var mView = Util.GetCameraMatrix();

            camPoint = ViewMatrixToCameraPosition(mView);
            farPoint = ScreenRelToWorld(mView, screenCoordsRel);

            //UI.ShowSubtitle("Cam: " + Math.Round(camPoint.X, 1) + " " + Math.Round(camPoint.Y, 1) + " " +
            //                Math.Round(camPoint.Z, 1)
            //                + "\nResult: " + Math.Round(farPoint.X, 1) + " " + Math.Round(farPoint.Y, 1) + " " +
            //                Math.Round(farPoint.Z, 1));

//+ "\n Cam: " + Math.Round(mView.M11, 1) + " " + Math.Round(mView.M12, 1) + " " + Math.Round(mView.M13, 1) + " " + Math.Round(mView.M14, 1)
//+ "\n " + Math.Round(mView.M21, 1) + " " + Math.Round(mView.M22, 1) + " " + Math.Round(mView.M23, 1) + " " + Math.Round(mView.M24, 1)
//+ "\n " + Math.Round(mView.M31, 1) + " " + Math.Round(mView.M32, 1) + " " + Math.Round(mView.M33, 1) + " " + Math.Round(mView.M34, 1)
//+ "\n " + Math.Round(mView.M41, 1) + " " + Math.Round(mView.M42, 1) + " " + Math.Round(mView.M43, 1) + " " + Math.Round(mView.M44, 1));
        }
Beispiel #13
0
        public static GTA.Math.Vector3 RaycastFromCoord(float x, float y, Entity ignore, float maxDist, float failDist, out RaycastResult res) // 0, 0 is center screen
        {
            Camera camera = World.RenderingCamera;

            GTA.Math.Vector3 position     = camera.Position;
            GTA.Math.Vector2 screenCoords = new GTA.Math.Vector2(x, y);

            GTA.Math.Vector3 WorldCoord = ScreenToWorld(screenCoords, camera);

            GTA.Math.Vector3 vector31 = WorldCoord - position;
            vector31.Normalize();

            res = World.Raycast(position + (vector31 * 1.0f), position + (vector31 * maxDist), (IntersectFlags)287, ignore);
            if (res.DidHit)
            {
                return(res.HitPosition);
            }
            return(position + (vector31 * failDist));
        }
Beispiel #14
0
        private static Vector3 ScreenRelToWorld(Matrix mView, Vector2 screenCoordsRel)
        {
            mView.Transpose();

            var vForward = mView.Row4;
            var vRight   = mView.Row2;
            var vUpward  = mView.Row3;

            var d = 1 - vForward.W;
            var h = screenCoordsRel.X - vRight.W;
            var s = -screenCoordsRel.Y - vUpward.W;

            var m = new Matrix(vForward.X, vForward.Y, vForward.Z, 0,
                               vRight.X, vRight.Y, vRight.Z, 0,
                               vUpward.X, vUpward.Y, vUpward.Z, 0,
                               0, 0, 0, 1);
            var det = m.Determinant();

            var mx = new Matrix(d, vForward.Y, vForward.Z, 0,
                                h, vRight.Y, vRight.Z, 0,
                                s, vUpward.Y, vUpward.Z, 0,
                                0, 0, 0, 1);
            var detx = mx.Determinant();

            var my = new Matrix(vForward.X, d, vForward.Z, 0,
                                vRight.X, h, vRight.Z, 0,
                                vUpward.X, s, vUpward.Z, 0,
                                0, 0, 0, 1);
            var dety = my.Determinant();

            var mz = new Matrix(vForward.X, vForward.Y, d, 0,
                                vRight.X, vRight.Y, h, 0,
                                vUpward.X, vUpward.Y, s, 0,
                                0, 0, 0, 1);
            var detz = mz.Determinant();

            var epsilon = 0.0000001;

            return(Math.Abs(det) < epsilon ? new Vector3() : new Vector3(detx / det, dety / det, detz / det));
        }
Beispiel #15
0
        public static Vector3 RaycastEverything(Vector2 screenCoord, out Entity hitEntity, bool skipProjection)
        {
            hitEntity = null;
            const float raycastToDist   = 200.0f;
            const float raycastFromDist = 1f;
            const float defaultDist     = 60.0f;

            Vector3 source3D;
            Vector3 target3D;

            ScreenRelToWorld(screenCoord, out source3D, out target3D);

            Entity ignoreEntity = Game.Player.Character;

            if (Game.Player.Character.IsInVehicle())
            {
                ignoreEntity = Game.Player.Character.CurrentVehicle;
            }

            var dir = (target3D - source3D);

            dir.Normalize();
            var raycastResults = World.Raycast(source3D + dir * raycastFromDist,
                                               source3D + dir * raycastToDist,
                                               (IntersectOptions)(1 | 16 | 256 | 2 | 4 | 8)// | peds + vehicles
                                               , ignoreEntity);

            if (raycastResults.DitHitAnything)
            {
                if (raycastResults.DitHitEntity)
                {
                    hitEntity = raycastResults.HitEntity;
                }
                return(raycastResults.HitCoords);
            }

            return(source3D + dir * defaultDist);
        }
Beispiel #16
0
        public static GTA.Math.Vector3 ScreenToWorld(GTA.Math.Vector2 screenCoords, Camera camera)
        {
            GTA.Math.Vector3 position = camera.Position;
            GTA.Math.Vector3 rotation = camera.Rotation;
            GTA.Math.Vector2 vector2;
            GTA.Math.Vector2 vector21;

            GTA.Math.Vector3 direction = camera.Direction;
            GTA.Math.Vector3 vector3   = rotation + new GTA.Math.Vector3(10.0f, 0.0f, 0.0f);
            GTA.Math.Vector3 vector31  = rotation + new GTA.Math.Vector3(-10.0f, 0.0f, 0.0f);
            GTA.Math.Vector3 vector32  = rotation + new GTA.Math.Vector3(0.0f, 0.0f, -10.0f);

            GTA.Math.Vector3 direction1 = RotationToDirection(rotation + new GTA.Math.Vector3(0.0f, 0.0f, 10.0f)) - RotationToDirection(vector32);
            GTA.Math.Vector3 direction2 = RotationToDirection(vector3) - RotationToDirection(vector31);

            float rad = -DegreeToRadian(rotation.Y);

            GTA.Math.Vector3 vector33 = GTA.Math.Vector3.Multiply(direction1, (float)Math.Cos(rad)) - GTA.Math.Vector3.Multiply(direction2, (float)Math.Sin(rad));
            GTA.Math.Vector3 vector34 = GTA.Math.Vector3.Multiply(direction1, (float)Math.Sin(rad)) + GTA.Math.Vector3.Multiply(direction2, (float)Math.Cos(rad));

            GTA.Math.Vector3 res1 = position + (direction * 10f);
            if (!WorldToScreenRel(res1, out vector21))
            {
                return(res1);
            }
            if (!WorldToScreenRel(res1 + vector33 + vector34, out vector2))
            {
                return(res1);
            }
            if (Math.Abs(vector2.X - vector21.X) < 0.001 || Math.Abs(vector2.Y - vector21.Y) < 0.001)
            {
                return(res1);
            }
            float x = (screenCoords.X - vector21.X) / (vector2.X - vector21.X);
            float y = (screenCoords.Y - vector21.Y) / (vector2.Y - vector21.Y);

            return(res1 + (vector33 * x) + (vector34 * y));
        }
Beispiel #17
0
        public static Vector3 ConecastPedsAndVehicles(Vector2 screenCoords, out Entity hitEntity)
        {
            var radius      = 1;
            var numPoints   = 5;
            var angleStep   = Math.PI * 0.2;
            var distStep    = 0.05 / numPoints;
            var resultCoord = new Vector3();

            hitEntity = null;
            for (var i = 0; i < numPoints; i++)
            {
                var    angle   = i * angleStep;
                var    dist    = i * distStep;
                var    offsetX = Math.Sin(angle) * dist;
                var    offsetY = Math.Cos(angle) * dist;
                var    coord   = screenCoords + new Vector2((float)offsetX, (float)offsetY);
                Entity entity;
                var    hitcoord = RaycastEverything(coord, out entity, radius);
                if (i == 0)
                {
                    resultCoord = hitcoord;
                }

                if ((entity != null) &&
                    ((ScriptHookExtensions.IsEntityAPed(entity) &&
                      entity.Handle != Game.Player.Character.Handle) ||
                     (ScriptHookExtensions.IsEntityAVehicle(entity) &&
                      !(Game.Player.Character.IsInVehicle() &&
                        entity.Handle == Game.Player.Character.CurrentVehicle.Handle))))
                {
                    hitEntity   = entity;
                    resultCoord = hitcoord;
                    break;
                }
            }
            return(resultCoord);
        }
Beispiel #18
0
        public static Vehicle SearchVehicle(Vector2 screenCoords)
        {
            const double searchRange = 0.1;
            const double thresholdRange = 0.025;
            const float raycastToDist = 200.0f;
            var vehs = World.GetNearbyVehicles(Game.Player.Character.Position, raycastToDist);
            var mindist = Double.MaxValue;
            Vehicle foundVeh = null;
            //Util.Log("Vehs - " + vehs.Length);
            //Util.Log("V - " + DateTime.UtcNow.Ticks);
            foreach (var vehicle in vehs)
            {
                if (Game.Player.Character.IsInVehicle() && (vehicle.Handle == Game.Player.Character.CurrentVehicle.Handle)) continue; //you own veh
                if (!vehicle.IsAlive) continue;

                var vehOffset = vehicle.Position;
                Vector2 vehScreenCoords;

                if (!WorldToScreenRel(vehOffset, out vehScreenCoords)) continue;

                var dist = (screenCoords - vehScreenCoords).Length();
                if (!(dist < mindist) || !(dist < searchRange)) continue;
                if (vehicle.IsOccluded) continue;
                //if (IsOccluded(vehicle, vehOffset)) continue;
                mindist = dist;
                foundVeh = vehicle;
                if (dist < thresholdRange)
                {
                    break;
                }
            }
            //Util.Log("W - " + DateTime.UtcNow.Ticks);

            return foundVeh;
        }
Beispiel #19
0
        public static Vector3 RaycastEverything(Vector2 screenCoord, out Entity hitEntity, bool skipProjection)
        {
            Vector3 source3D;
            Vector3 target3D;
            ScreenRelToWorld(screenCoord, out source3D, out target3D);

            return RaycastEverything(out hitEntity, target3D, source3D);
        }
Beispiel #20
0
        public static void ScreenRelToWorld(Vector2 screenCoordsRel, out Vector3 camPoint, out Vector3 farPoint)
        {
            var mView = ScriptHookExtensions.GetCameraMatrix();

            camPoint = ViewMatrixToCameraPosition(mView);
            farPoint = ScreenRelToWorld(mView, screenCoordsRel);
        }
Beispiel #21
0
 public GTAVector2(Vector2 v)
 {
     X = v.X;
     Y = v.Y;
 }
Beispiel #22
0
        private static Vector3 ScreenRelToWorld(Matrix mView, Vector2 screenCoordsRel)
        {
            mView.Transpose();

            var vForward = mView.Row4;
            var vRight = mView.Row2;
            var vUpward = mView.Row3;

            var d = 1 - vForward.W;
            var h = screenCoordsRel.X - vRight.W;
            var s = -screenCoordsRel.Y - vUpward.W;

            var m = new Matrix(vForward.X, vForward.Y, vForward.Z, 0,
                vRight.X, vRight.Y, vRight.Z, 0,
                vUpward.X, vUpward.Y, vUpward.Z, 0,
                0, 0, 0, 1);
            var det = m.Determinant();

            var mx = new Matrix(d, vForward.Y, vForward.Z, 0,
                h, vRight.Y, vRight.Z, 0,
                s, vUpward.Y, vUpward.Z, 0,
                0, 0, 0, 1);
            var detx = mx.Determinant();

            var my = new Matrix(vForward.X, d, vForward.Z, 0,
                vRight.X, h, vRight.Z, 0,
                vUpward.X, s, vUpward.Z, 0,
                0, 0, 0, 1);
            var dety = my.Determinant();

            var mz = new Matrix(vForward.X, vForward.Y, d, 0,
                vRight.X, vRight.Y, h, 0,
                vUpward.X, vUpward.Y, s, 0,
                0, 0, 0, 1);
            var detz = mz.Determinant();

            var epsilon = 0.0000001;
            return Math.Abs(det) < epsilon ? new Vector3() : new Vector3(detx / det, dety / det, detz / det);
        }
Beispiel #23
0
        public static Ped SearchPed(Vector2 screenCoords)
        {
            const double searchRange    = 0.1;
            const double thresholdRange = 0.025;
            const float  raycastToDist  = 200.0f;
            var          peds           = World.GetNearbyPeds(Game.Player.Character.Position, raycastToDist);
            var          mindist        = Double.MaxValue;
            Ped          foundPed       = null;

            //Util.Log("Peds - " + peds.Length);
            //Util.Log("P - " + DateTime.UtcNow.Ticks);
            foreach (var ped in peds)
            {
                if (ped.Handle == Game.Player.Character.Handle)
                {
                    continue;
                }
                //if (ped.IsOccluded) continue; slow?

                {
                    var     headOffest = ped.GetBoneCoord(Bone.SKEL_ROOT);
                    Vector2 pedScreenCoords;
                    if (WorldToScreenRel(headOffest, out pedScreenCoords))
                    {
                        var dist = (screenCoords - pedScreenCoords).Length();
                        if ((dist < mindist) && (dist < searchRange))
                        {
                            if (ped.IsOccluded)
                            {
                                continue;
                            }
                            //if (IsOccluded(ped, headOffest)) continue;
                            mindist  = dist;
                            foundPed = ped;
                        }
                        if (dist < thresholdRange)
                        {
                            break;
                        }
                    }
                }

                {
                    var     headOffest = ped.GetBoneCoord(Bone.SKEL_Head);
                    Vector2 pedScreenCoords;

                    if (!WorldToScreenRel(headOffest, out pedScreenCoords))
                    {
                        continue;
                    }

                    var dist = (screenCoords - pedScreenCoords).Length();

                    if (!(dist < mindist) || !(dist < searchRange))
                    {
                        continue;
                    }
                    if (ped.IsOccluded)
                    {
                        continue;
                    }
                    //if (IsOccluded(ped, headOffest)) continue;
                    mindist  = dist;
                    foundPed = ped;
                    if (dist < thresholdRange)
                    {
                        break;
                    }
                }
            }
            //Util.Log("Q - " + DateTime.UtcNow.Ticks);
            return(foundPed);
        }
Beispiel #24
0
 public static string ConvertToString(this GTA.Math.Vector2 vec)
 {
     return(vec.X.ToString(CultureInfo.InvariantCulture) + "," + vec.Y.ToString(CultureInfo.InvariantCulture));
 }
Beispiel #25
0
        public static Ped SearchPed(Vector2 screenCoords)
        {
            const double searchRange = 0.1;
            const double thresholdRange = 0.025;
            const float raycastToDist = 200.0f;
            var peds = World.GetNearbyPeds(Game.Player.Character.Position, raycastToDist);
            var mindist = Double.MaxValue;
            Ped foundPed = null;
            //Util.Log("Peds - " + peds.Length);
            //Util.Log("P - " + DateTime.UtcNow.Ticks);
            foreach (var ped in peds)
            {
                if (ped.Handle == Game.Player.Character.Handle) continue;
                if (!ped.IsAlive) continue;
                //if (ped.IsOccluded) continue; slow?

                {
                    var headOffest = ped.GetBoneCoord(Bone.SKEL_ROOT);
                    Vector2 pedScreenCoords;
                    if (WorldToScreenRel(headOffest, out pedScreenCoords))
                    {
                        var dist = (screenCoords - pedScreenCoords).Length();
                        if ((dist < mindist) && (dist < searchRange))
                        {
                            if (ped.IsOccluded) continue;
                            //if (IsOccluded(ped, headOffest)) continue;
                            mindist = dist;
                            foundPed = ped;
                        }
                        if (dist < thresholdRange)
                        {
                            break;
                        }
                    }
                }

                {
                    var headOffest = ped.GetBoneCoord(Bone.SKEL_Head);
                    Vector2 pedScreenCoords;

                    if (!WorldToScreenRel(headOffest, out pedScreenCoords)) continue;

                    var dist = (screenCoords - pedScreenCoords).Length();

                    if (!(dist < mindist) || !(dist < searchRange)) continue;
                    if (ped.IsOccluded) continue;
                    //if (IsOccluded(ped, headOffest)) continue;
                    mindist = dist;
                    foundPed = ped;
                    if (dist < thresholdRange)
                    {
                        break;
                    }
                }

            }
            //Util.Log("Q - " + DateTime.UtcNow.Ticks);
            return foundPed;
        }
Beispiel #26
-1
        public static bool WorldToScreenRel(Vector3 entityPosition, out Vector2 screenCoords)
        {
            var mView = ScriptHookExtensions.GetCameraMatrix();
            mView.Transpose();

            var vForward = mView.Row4;
            var vRight = mView.Row2;
            var vUpward = mView.Row3;

            var result = new SharpDX.Vector3(0,0,0);
            result.Z = (vForward.X * entityPosition.X) + (vForward.Y * entityPosition.Y) + (vForward.Z * entityPosition.Z) + vForward.W;
            result.X = (vRight.X * entityPosition.X) + (vRight.Y * entityPosition.Y) + (vRight.Z * entityPosition.Z) + vRight.W;
            result.Y = (vUpward.X * entityPosition.X) + (vUpward.Y * entityPosition.Y) + (vUpward.Z * entityPosition.Z) + vUpward.W;

            if (result.Z < 0.001f)
            {
                screenCoords = new Vector2(0, 0);
                return false;
            }

            float invw = 1.0f / result.Z;
            result.X *= invw;
            result.Y *= invw;
            screenCoords = new Vector2(result.X, -result.Y);
            return true;
        }
Beispiel #27
-1
 public static bool WorldToScreenRel_Native(Vector3 worldCoords, out Vector2 screenCoords)
 {
     var num1 = new OutputArgument();
     var num2 = new OutputArgument();
     if (!Function.Call<bool>(Hash._WORLD3D_TO_SCREEN2D, worldCoords.X, worldCoords.Y, worldCoords.Z, num1, num2))
     {
         screenCoords = new Vector2();
         return false;
     }
     screenCoords = new Vector2((num1.GetResult<float>() - 0.5f) * 2, (num2.GetResult<float>() - 0.5f) * 2);
     return true;
 }