public static bool TargetHasNotChanged(GeometryDataModels.Target newTarget,
                                        GeometryDataModels.Target currentTarget)
 {
     return(newTarget.GeoInfoHashCode == currentTarget.GeoInfoHashCode &&
            newTarget.entity.Index == currentTarget.entity.Index &&
            newTarget.entity.Version == currentTarget.entity.Version);
 }
Esempio n. 2
0
        // Update is called once per frame
        void Update()
        {
            closestTarget = geoVision.GetClosestTarget();
            if (currentTarget.distanceToCastOrigin == 0)
            {
                Destroy(this.gameObject);
            }

            else if (GeometryVisionUtilities.TargetHasNotChanged(closestTarget, currentTarget))
            {
                targetingSystemPosition = geoVision.transform.position;
                PlayParticleSystemAtTarget();

                positions = ElectrifyPoints(targetingSystemPosition, frequency, currentTarget.position,
                                            currentTarget.distanceToCastOrigin);

                lineRenderer.positionCount = positions.Length;
                lineRenderer.SetPositions(positions);
            }
            else
            {
                Destroy(this.gameObject);
            }

            void PlayParticleSystemAtTarget()
            {
                if (targetParticlesEffect)
                {
                    targetParticlesEffect.Play(true);
                    targetParticlesEffect.transform.position = currentTarget.position;
                }
            }
        }
Esempio n. 3
0
        private List <GeometryDataModels.Target> GetProjectionDataForTargets(Vector3 rayLocation, Vector3 rayDirectionWS,
                                                                             List <GeometryDataModels.GeoInfo> GeoInfos, List <GeometryDataModels.Target> targetInfos)
        {
            GeometryDataModels.Target targetInfo = new GeometryDataModels.Target();
            foreach (var geoInfoAsTarget in GeoInfos)
            {
                targetInfos = GetDataForTarget();

                List <GeometryDataModels.Target> GetDataForTarget()
                {
                    Vector3 point = geoInfoAsTarget.transform.position;
                    Vector3 rayDirectionEndPoint = rayDirectionWS;

                    point = pointToRaySpace(rayLocation, point);
                    rayDirectionEndPoint = pointToRaySpace(rayLocation, rayDirectionWS);
                    targetInfo.projectedTargetPosition = Vector3.Project(point, rayDirectionEndPoint) + rayLocation;
                    targetInfo.position      = pointFromRaySpaceToObjectSpace(point, rayLocation);
                    targetInfo.distanceToRay =
                        Vector3.Distance(targetInfo.position, targetInfo.projectedTargetPosition);
                    targetInfo.distanceToCastOrigin = Vector3.Distance(rayLocation, targetInfo.projectedTargetPosition);
                    targetInfo.GeoInfoHashCode      = geoInfoAsTarget.GetHashCode();
                    targetInfos.Add(targetInfo);
                    return(targetInfos);
                }
            }

            return(targetInfos);
        }
Esempio n. 4
0
        public IEnumerator PerformanceOfUpdateVisibilityForGameObjects(
            [ValueSource(typeof(TestUtilities), nameof(TestUtilities.GetStressTestsScenePathsForGameObjects))]
            string scenePath)
        {
            TestUtilities.SetupScene(scenePath);
            for (int i = 0; i < 50; i++)
            {
                yield return(null);
            }

            factorySettings.processGameObjects = true;
            var geoVision =
                TestUtilities.SetupGeoVision(new Vector3(0f, 0f, -6f), new GeometryVisionFactory(factorySettings));

            yield return(null);

            var target = new GeometryDataModels.Target();

            Measure.Method(() =>
            {
                geoVision.GetComponent <GeometryVision>().GetEye <GeometryVisionEye>().UpdateVisibility(false);
            }).Run();
            target = geoVision.GetComponent <GeometryVision>().GetClosestTarget();
            Assert.True(target.distanceToCastOrigin != 0f);
        }
        internal static IEnumerator MoveEntityTarget(Vector3 newPosition,
                                                     float speedMultiplier, GeometryDataModels.Target target, float distanceToStop,
                                                     TransformEntitySystem transformEntitySystem, World entityWorld,
                                                     NativeList <GeometryDataModels.Target> closestTargets)
        {
            if (transformEntitySystem == null)
            {
                transformEntitySystem = entityWorld.CreateSystem <TransformEntitySystem>();
            }

            float timeOut = 2f;

            while (Vector3.Distance(target.position, newPosition) > distanceToStop)
            {
                var animatedPoint =
                    transformEntitySystem.MoveEntityToPosition(newPosition, target, speedMultiplier);

                target.position = animatedPoint;
                if (closestTargets.Length != 0)
                {
                    closestTargets[0] = target;
                }

                if (timeOut < 0.1f)
                {
                    break;
                }

                timeOut -= Time.deltaTime;

                yield return(null);
            }
        }
 public void Execute(int index)
 {
     GeometryDataModels.Target target = targets[index];
     target.position = translations[index].Value;
     target.isEntity = true;
     target.entity   = entities[index];
     targets[index]  = target;
 }
Esempio n. 7
0
            public void Execute()
            {
                tempJobTarget          = target[0];
                tempJobTarget.position = Vector3.MoveTowards(tempJobTarget.position, newPosition, moveSpeed);
                target[0] = tempJobTarget;
                var trans = translation[0];

                trans.Value    = tempJobTarget.position;
                translation[0] = trans;
            }
Esempio n. 8
0
        // Start is called before the first frame update
        void Start()
        {
            GetGeometricVisionFromParentAndUnParent();
            currentTarget = geoVision.GetClosestTarget();
            lineRenderer  = GetComponent <LineRenderer>();

            void GetGeometricVisionFromParentAndUnParent()
            {
                if (transform.parent != null)
                {
                    geoVision = transform.parent.GetComponent <GeometryVision>();
                }

                transform.parent = null;
            }
        }
Esempio n. 9
0
        List <GeometryDataModels.Target> IGeoTargeting.GetTargets(Vector3 rayLocation, Vector3 rayDirectionWS,
                                                                  GeometryVision geoVision, TargetingInstruction targetingInstruction)
        {
            GeometryDataModels.Target        targetInfo        = new GeometryDataModels.Target();
            List <GeometryDataModels.Target> gameObjectTargets = new List <GeometryDataModels.Target>();

            if (targetingInstruction.TargetTag.Length > 0)
            {
                foreach (var geoInfoAsTarget in geoVision.GetEye <GeometryVisionEye>().SeenGeoInfos)
                {
                    if (geoInfoAsTarget.gameObject.CompareTag(targetingInstruction.TargetTag))
                    {
                        gameObjectTargets.Add(GetDataForTarget(geoInfoAsTarget));
                    }
                }
            }
            else
            {
                foreach (var geoInfoAsTarget in geoVision.GetEye <GeometryVisionEye>().SeenGeoInfos)
                {
                    gameObjectTargets.Add(GetDataForTarget(geoInfoAsTarget));
                }
            }


            return(gameObjectTargets);

            //Local functions

            GeometryDataModels.Target GetDataForTarget(GeometryDataModels.GeoInfo geoInfoAsTarget)
            {
                float3 point = geoInfoAsTarget.transform.position;
                float3 rayDirectionEndPoint = rayDirectionWS;

                point = pointToRaySpace(rayLocation, point);
                rayDirectionEndPoint = pointToRaySpace(rayLocation, rayDirectionWS);
                targetInfo.projectedTargetPosition = Vector3.Project(point, rayDirectionEndPoint) + rayLocation;
                targetInfo.position      = pointFromRaySpaceToObjectSpace(point, rayLocation);
                targetInfo.distanceToRay =
                    Vector3.Distance(targetInfo.position, targetInfo.projectedTargetPosition);
                targetInfo.distanceToCastOrigin =
                    Vector3.Distance(rayLocation, targetInfo.projectedTargetPosition);
                targetInfo.GeoInfoHashCode = geoInfoAsTarget.GetHashCode();

                return(targetInfo);
            }
        }
Esempio n. 10
0
        public Vector3 MoveEntityToPosition(Vector3 newPosition, GeometryDataModels.Target closestTarget, float speed)
        {
            this.speedMultiplier = speed;
            this.newPosition     = newPosition;
            this.target          = new NativeArray <GeometryDataModels.Target>(1, Allocator.TempJob);
            this.entityToMove    = new NativeArray <Entity>(1, Allocator.TempJob);
            this.entityToMove[0] = closestTarget.entity;
            this.target[0]       = closestTarget;
            this.Update();

            var toReturn = this.target[0].position;

            closestTarget = target[0];
            target.Dispose();
            entityToMove.Dispose();
            return(toReturn);
        }
Esempio n. 11
0
        // Update is called once per frame
        void Update()
        {
            closestTarget = geoVision.GetClosestTarget();
            if (closestTarget.distanceToCastOrigin < 0.56f)
            {
                Destroy(this);
            }

            var shape = particleSystem.shape;

            shape.length = closestTarget.distanceToCastOrigin;
            cachedTransform.LookAt(closestTarget.position);
            if (lockPositionToParent)
            {
                cachedTransform.position = geoVision.transform.position;
            }
        }
Esempio n. 12
0
        public void DestroyTargetEntity(GeometryDataModels.Target target1)
        {
            ecb = endSimulationEcbSystem.CreateCommandBuffer();
            if (World.EntityManager.Exists(target1.entity))
            {
                if (World.EntityManager.HasComponent <Child>(target1.entity))
                {
                    DynamicBuffer <Child> childs = World.EntityManager.GetBuffer <Child>(target1.entity);
                    foreach (var child in childs)
                    {
                        ecb.DestroyEntity(child.Value);
                    }
                }

                ecb.DestroyEntity(target1.entity);
            }
        }
            public void Execute(int i)
            {
                GeometryDataModels.Target target = targets[i];
                Vector3 targetLocation           = target.position;
                Vector3 rayDirection             = rayDirWS;
                Vector3 rayDirectionEndPoint     = rayDirWS;

                targetLocation       = pointToRaySpace(rayLocWS, targetLocation);
                rayDirectionEndPoint = pointToRaySpace(rayLocWS, rayDirection);

                Vector3 pointToRaySpace(Vector3 rayLocation, Vector3 point)
                {
                    return(point - rayLocation);
                }

                target.projectedTargetPosition = Project(targetLocation, rayDirectionEndPoint) + rayLocWS;

                Vector3 Project(Vector3 vector, Vector3 onNormal)
                {
                    float num1 = Vector3.Dot(onNormal, onNormal);

                    if (num1 < float.Epsilon)
                    {
                        return(Vector3.zero);
                    }
                    float num2 = Vector3.Dot(vector, onNormal);

                    return(new Vector3(onNormal.x * num2 / num1, onNormal.y * num2 / num1,
                                       onNormal.z * num2 / num1));
                }

                target.position = pointFromRaySpaceToObjectSpace(targetLocation, rayLocWS);

                Vector3 pointFromRaySpaceToObjectSpace(Vector3 rayLocation, Vector3 target3)
                {
                    return(target3 + rayLocation);
                }

                target.isEntity             = true;
                target.distanceToRay        = Vector3.Distance(target.position, target.projectedTargetPosition);
                target.distanceToCastOrigin = Vector3.Distance(rayLocWS, target.projectedTargetPosition);
                targets[i] = target;
            }
        public IEnumerator TargetingSystemGetsTarget([ValueSource(typeof(TestUtilities), nameof(TestUtilities.GetSimpleTestScenePathsForGameObjects))] string scenePath)
        {
            TestUtilities.SetupScene(scenePath);
            for (int i = 0; i < 50; i++)
            {
                yield return(null);
            }

            factorySettings.defaultTag = "";
            var geoVision = TestUtilities.SetupGeoVision(new Vector3(0f, 0f, -6f), new GeometryVisionFactory(factorySettings));

            yield return(null);

            GeometryDataModels.Target target = new GeometryDataModels.Target();
            Measure.Method(() => { target = geoVision.GetComponent <GeometryVision>().GetClosestTarget(); }).Run();

            Assert.True(target.isEntity == false);
            Assert.True(target.distanceToCastOrigin > 0);
        }
Esempio n. 15
0
        // Update is called once per frame
        void Update()
        {
            closestTarget = geoVision.GetClosestTarget();
            if (closestTarget.distanceToCastOrigin == 0)
            {
                Destroy(this.gameObject);
            }
            if (closestTarget.distanceToCastOrigin > 0)
            {
                if (lockPositionToTarget)
                {
                    cachedTransform.position = closestTarget.position;
                }

                if (rotateTowardsCamera)
                {
                    transform.LookAt(geoVision.transform.position);
                }
            }
        }
Esempio n. 16
0
        public IEnumerator EntityFilteringByComponentWorks([ValueSource(typeof(TestUtilities), nameof(TestUtilities.GetTargetingTestScenePathsForEntities))] string scenePath)
        {
            TestUtilities.SetupScene(scenePath);
            for (int i = 0; i < 50; i++)
            {
                yield return(null);
            }

            string pathToEntityFilterScript = "Assets/Plugins/GeometricVision/EntityScripts/FromUnity/RotationSpeed_SpawnAndRemove.cs";

            UnityEngine.Object entityFilterScript = AssetDatabase.LoadAssetAtPath(pathToEntityFilterScript, typeof(UnityEngine.Object));
            factorySettings.entityComponentQueryFilter = entityFilterScript;
            var geoVision =
                TestUtilities.SetupGeoVision(new Vector3(0f, 0f, -6f), new GeometryVisionFactory(factorySettings));

            yield return(null);

            factorySettings.entityComponentQueryFilter = null;
            float offset = 0.1f;

            GeometryDataModels.Target target   = new GeometryDataModels.Target();
            int amountOfItemsFound             = 0;
            int amountOfExpectedItemsToBeFound = 1;

            for (var index = 0; index < testObjectNames.Length; index++)
            {
                geoVision.transform.position = new Vector3(index * -2f + offset, 0f, -6f);
                yield return(null);

                Measure.Method(() => { target = geoVision.GetComponent <GeometryVision>().GetClosestTarget(); })
                .Run();
                if (Vector3.Distance(target.position, new Vector3(index * -2f, 0f, 10f)) < 0.1f + offset)
                {
                    amountOfItemsFound += 1;
                    Assert.True(target.isEntity == true);
                    Assert.True(target.distanceToCastOrigin > 0);
                }
            }

            Assert.True(amountOfItemsFound == amountOfExpectedItemsToBeFound);
        }
Esempio n. 17
0
        public IEnumerator TargetingSystemGetsClosestTarget(
            [ValueSource(typeof(TestUtilities), nameof(TestUtilities.GetTargetingTestScenePathsForEntities))]
            string scenePath)
        {
            TestUtilities.SetupScene(scenePath);
            for (int i = 0; i < 50; i++)
            {
                yield return(null);
            }

            factorySettings.entityComponentQueryFilter = null;
            var geoVision =
                TestUtilities.SetupGeoVision(new Vector3(0f, 0f, -6f), new GeometryVisionFactory(factorySettings));

            yield return(null);

            yield return(null);

            float offset = 0.1f;

            GeometryDataModels.Target target = new GeometryDataModels.Target();

            //Go through every test object
            for (var index = 0; index < testObjectNames.Length; index++)
            {
                geoVision.transform.position = new Vector3(index * -2f + offset, 0f, -6f);
                yield return(null);

                Measure.Method(() => { target = geoVision.GetComponent <GeometryVision>().GetClosestTarget(); })
                .Run();
                Assert.True(Vector3.Distance(target.position, new Vector3(index * -2f, 0f, 10f)) < 0.1f + offset);
            }

            Assert.True(target.isEntity);
            Assert.True(target.distanceToCastOrigin > 0);
        }
Esempio n. 18
0
 public void Execute(int index)
 {
     GeometryDataModels.Target target = targets[index];
     target.isSeen  = IsInsideFrustum(target.position, planes);
     targets[index] = target;
 }
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            var  renderer = GetComponent <Renderer>();
            Mesh mesh;

            if (UseColliderMeshInsteadOfRendererMesh)
            {
                mesh = GetComponent <MeshCollider>().sharedMesh;
            }
            else
            {
                mesh = GetComponent <MeshFilter>().mesh;
            }

            GeometryDataModels.Edge[] edges = new GeometryDataModels.Edge[1];
            dstManager.AddBuffer <GeometryDataModelsEntities.EdgesBuffer>(entity);
            dstManager.AddBuffer <GeometryDataModelsEntities.VerticesBuffer>(entity);
            dstManager.AddBuffer <GeometryDataModelsEntities.TrianglesBuffer>(entity);
            DynamicBuffer <GeometryDataModelsEntities.EdgesBuffer>     eBuffer = dstManager.GetBuffer <GeometryDataModelsEntities.EdgesBuffer>(entity);
            DynamicBuffer <GeometryDataModelsEntities.VerticesBuffer>  vBuffer = dstManager.GetBuffer <GeometryDataModelsEntities.VerticesBuffer>(entity);
            DynamicBuffer <GeometryDataModelsEntities.TrianglesBuffer> tBuffer = dstManager.GetBuffer <GeometryDataModelsEntities.TrianglesBuffer>(entity);
            //Reinterpret to plain int buffer
            DynamicBuffer <GeometryDataModels.Edge> edgesBuffer = eBuffer.Reinterpret <GeometryDataModels.Edge>();
            DynamicBuffer <Vector3> vector3Buffer  = vBuffer.Reinterpret <Vector3>();
            DynamicBuffer <int>     triangleBuffer = tBuffer.Reinterpret <int>();

            //populate the dynamic buffer
            for (int j = 0; j < mesh.vertexCount; j++)
            {
                vector3Buffer.Add(mesh.vertices[j]);
            }

            for (int j = 0; j < mesh.triangles.Length; j++)
            {
                triangleBuffer.Add(mesh.triangles[j]);
            }

            dstManager.AddComponentData(entity, new GeometryDataModelsEntities.LocalToWorldMatrix
            {
                Matrix = renderer.localToWorldMatrix,
            });

            dstManager.AddComponentData(entity, new GeometryDataModelsEntities.Visible
            {
                IsVisible = true,
            });

            var geoInfoData = new GeometryDataModelsEntities.GeoInfoEntityComponent
            {
                Edges     = edgesBuffer,
                Vertices  = vector3Buffer,
                Triangles = triangleBuffer,
                Matrix    = renderer.localToWorldMatrix,
            };

            dstManager.AddComponentData(entity, geoInfoData);

            var targetData = new GeometryDataModels.Target
            {
                position = transform.position,
                projectedTargetPosition = Vector3.zero,
                distanceToRay           = 0,
                distanceToCastOrigin    = 0,
                entity = entity
            };

            dstManager.AddComponentData(entity, targetData);
        }