private Unity.Collections.NativeList <GridNodeData> AstarSearch(ref int statVisited, GridGraph graph, GridNode startNode, GridNode endNode, Constraint constraint, int threadIndex)
        {
            var graphSize       = graph.size;
            var graphCenter     = graph.graphCenter;
            var burstConstraint = constraint.GetBurstConstraint();
            var resultPath      = new Unity.Collections.NativeList <GridNodeData>(10, Unity.Collections.Allocator.Persistent);
            var arr             = new Unity.Collections.NativeArray <GridNodeData>(graph.nodesData, Unity.Collections.Allocator.TempJob);
            var openList        = new PriorityQueueNative <GridNodeData>(Unity.Collections.Allocator.TempJob, 500, true);
            var results         = new Unity.Collections.NativeArray <int>(2, Unity.Collections.Allocator.TempJob);
            var endNodeIndex    = endNode.index;
            var startNodeIndex  = startNode.index;

            var job = new Job()
            {
                graphCenter     = graphCenter,
                graphSize       = graphSize,
                burstConstraint = burstConstraint,
                resultPath      = resultPath,
                arr             = arr,
                openList        = openList,
                results         = results,
                endNodeIndex    = endNodeIndex,
                startNodeIndex  = startNodeIndex,
            };

            job.Schedule().Complete();

            statVisited = results[0];

            results.Dispose();
            openList.Dispose();
            arr.Dispose();
            return(resultPath);
        }
示例#2
0
        public override void UpdateBehaviour()
        {
            // Re-assign the new texture to the minimap
            minimap.image = miniMapRenderTexture;



            // // ---- RESOURCES ---- \\
            // EntityQuery entityQuery = entityManager.CreateEntityQuery(ComponentType.ReadWrite<Resources>());
            // Resources resources = entityQuery.GetSingleton<Resources>();
            // // entityQuery.SetSingleton<Resources>(res);
            // // Resource Text
            // resource1Text.text = resources.buildingMaterial.ToString();
            // resource2Text.text = resources.food.ToString();
            // resource3Text.text = resources.rareResource.ToString();


            // ---- SELECTED PLAYERS ---- \\
            if (selectionSystem.redrawSelectedUnits)
            {
                selectionSystem.redrawSelectedUnits = false;

                entities = selectedQuery.ToEntityArray(Unity.Collections.Allocator.Persistent);
                if (entities.Length > 0)
                {
                    AddSelectedUnits(entities.Length);
                }
                entities.Dispose();
            }
        }
示例#3
0
        public void CompareBurstWithManagedAccess()
        {
            var arr        = new Unity.Collections.NativeArray <TestData>(100, Unity.Collections.Allocator.Persistent);
            var managedArr = new TestData[100];

            {
                var sw = System.Diagnostics.Stopwatch.StartNew();
                managedArr[50] = new TestData();
                UnityEngine.Debug.Log("Managed ticks: " + sw.ElapsedTicks);
                sw.Restart();
            }

            {
                var sw = System.Diagnostics.Stopwatch.StartNew();
                new BurstAccess()
                {
                    arr = arr, index = 50
                }.Schedule().Complete();
                UnityEngine.Debug.Log("Burst job ticks: " + sw.ElapsedTicks);
                sw.Restart();
            }

            {
                var sw = System.Diagnostics.Stopwatch.StartNew();
                BurstMethod(ref arr, 50);
                UnityEngine.Debug.Log("Burst ticks: " + sw.ElapsedTicks);
                sw.Restart();
            }

            arr.Dispose();
        }
            public void Execute()
            {
                this.pathResults[0] = default;
                this.pathResults[1] = default;

                //UnityEngine.Debug.Log("Exec1");
                var from = this.query.MapLocation(this.fromPoint, new Vector3(100f, 100f, 100f), this.agentTypeId, this.areas);

                if (from.polygon.IsNull() == true)
                {
                    return;
                }

                //UnityEngine.Debug.Log("Exec2");
                var to = this.query.MapLocation(this.toPoint, new Vector3(100f, 100f, 100f), this.agentTypeId, this.areas);

                if (to.polygon.IsNull() == true)
                {
                    return;
                }

                //UnityEngine.Debug.Log("Exec3");
                this.query.BeginFindPath(from, to, this.areas);
                this.query.UpdateFindPath(PathfindingNavMeshProcessor.MAX_ITERATIONS, out var performed);
                //statVisited = performed;

                var result = this.query.EndFindPath(out var pathSize);

                if ((result & UnityEngine.Experimental.AI.PathQueryStatus.Success) != 0)
                {
                    var pathInternal      = new Unity.Collections.NativeArray <UnityEngine.Experimental.AI.PolygonId>(pathSize, Unity.Collections.Allocator.Temp);
                    var straightPathFlags = new Unity.Collections.NativeArray <StraightPathFlags>(PathfindingNavMeshProcessor.MAX_PATH_SIZE, Unity.Collections.Allocator.Temp);
                    var vertexSide        = new Unity.Collections.NativeArray <float>(PathfindingNavMeshProcessor.MAX_PATH_SIZE, Unity.Collections.Allocator.Temp);

                    //UnityEngine.Debug.Log("Exec4");
                    this.query.GetPathResult(pathInternal);
                    var job = new FindStraightPathJob()
                    {
                        query             = this.query,
                        from              = from,
                        to                = to,
                        pathInternal      = pathInternal,
                        pathSize          = pathSize,
                        results           = this.results,
                        straightPathFlags = straightPathFlags,
                        vertexSide        = vertexSide,
                        resultStatus      = this.pathResults,
                    };
                    job.Execute();

                    if ((result & UnityEngine.Experimental.AI.PathQueryStatus.PartialResult) != 0)
                    {
                        this.pathResults[0] |= (int)UnityEngine.Experimental.AI.PathQueryStatus.PartialResult;
                    }

                    vertexSide.Dispose();
                    straightPathFlags.Dispose();
                    pathInternal.Dispose();
                }
            }
示例#5
0
        public static void RecycleWithIndex <T, TCopy>(ref Unity.Collections.NativeArray <T> item, TCopy copy) where TCopy : IArrayElementCopyWithIndex <T> where T : struct
        {
            for (int i = 0; i < item.Length; ++i)
            {
                copy.Recycle(i, ref item.GetRef(i));
            }

            item.Dispose();
        }
        private static void FixSeams(Mesh source, Mesh output, List <List <int> > submeshes, List <Ring> rings, List <Insertion> insertions, P3dCoord coord)
        {
            output.bindposes    = source.bindposes;
            output.bounds       = source.bounds;
            output.subMeshCount = source.subMeshCount;
            output.indexFormat  = source.indexFormat;

            if (source.vertexCount + insertions.Count >= 65535)
            {
                output.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
            }

            var weights   = new List <BoneWeight>(); source.GetBoneWeights(weights);
            var colors    = new List <Color32>();    source.GetColors(colors);
            var normals   = new List <Vector3>();    source.GetNormals(normals);
            var tangents  = new List <Vector4>();    source.GetTangents(tangents);
            var coords0   = new List <Vector4>();    source.GetUVs(0, coords0);
            var coords1   = new List <Vector4>();    source.GetUVs(1, coords1);
            var coords2   = new List <Vector4>();    source.GetUVs(2, coords2);
            var coords3   = new List <Vector4>();    source.GetUVs(3, coords3);
            var positions = new List <Vector3>();    source.GetVertices(positions);

#if UNITY_2019_1_OR_NEWER
            var boneVertices = new List <byte>(source.GetBonesPerVertex());
            var boneWeights  = new List <BoneWeight1>(source.GetAllBoneWeights());
            var boneIndices  = new List <int>();

            if (boneVertices.Count > 0)
            {
                var total = 0;

                foreach (var count in boneVertices)
                {
                    boneIndices.Add(total);

                    total += count;
                }

                weights.Clear();
            }
#endif
            foreach (var insertion in insertions)
            {
#if UNITY_2019_1_OR_NEWER
                if (boneVertices.Count > 0)
                {
                    var index = boneIndices[insertion.Index];
                    var count = boneVertices[insertion.Index];

                    boneVertices.Add(count);

                    for (var i = 0; i < count; i++)
                    {
                        boneWeights.Add(boneWeights[index + i]);
                    }
                }
#endif
                if (weights.Count > 0)
                {
                    weights.Add(weights[insertion.Index]);
                }

                if (colors.Count > 0)
                {
                    colors.Add(colors[insertion.Index]);
                }

                if (normals.Count > 0)
                {
                    normals.Add(normals[insertion.Index]);
                }

                if (tangents.Count > 0)
                {
                    tangents.Add(tangents[insertion.Index]);
                }

                if (coords0.Count > 0)
                {
                    AddCoord(coords0, insertion, coord == P3dCoord.First);
                }

                if (coords1.Count > 0)
                {
                    AddCoord(coords1, insertion, coord == P3dCoord.Second);
                }

                if (coords2.Count > 0)
                {
                    AddCoord(coords2, insertion, coord == P3dCoord.Third);
                }

                if (coords3.Count > 0)
                {
                    AddCoord(coords3, insertion, coord == P3dCoord.Fourth);
                }

                positions.Add(positions[insertion.Index]);
            }

            output.SetVertices(positions);

            if (weights.Count > 0)
            {
                output.boneWeights = weights.ToArray();
            }
#if UNITY_2019_1_OR_NEWER
            if (boneVertices.Count > 0)
            {
                var na1 = new Unity.Collections.NativeArray <byte>(boneVertices.ToArray(), Unity.Collections.Allocator.Temp);
                var na2 = new Unity.Collections.NativeArray <BoneWeight1>(boneWeights.ToArray(), Unity.Collections.Allocator.Temp);
                output.SetBoneWeights(na1, na2);
                na2.Dispose();
                na1.Dispose();
            }
#endif
            output.SetColors(colors);
            output.SetNormals(normals);
            output.SetTangents(tangents);
            output.SetUVs(0, coords0);
            output.SetUVs(1, coords1);
            output.SetUVs(2, coords2);
            output.SetUVs(3, coords3);

            var deltaVertices = new List <Vector3>();
            var deltaNormals  = new List <Vector3>();
            var deltaTangents = new List <Vector3>();

            if (source.blendShapeCount > 0)
            {
                var tempDeltaVertices = new Vector3[source.vertexCount];
                var tempDeltaNormals  = new Vector3[source.vertexCount];
                var tempDeltaTangents = new Vector3[source.vertexCount];

                for (var i = 0; i < source.blendShapeCount; i++)
                {
                    var shapeName  = source.GetBlendShapeName(i);
                    var frameCount = source.GetBlendShapeFrameCount(i);

                    for (var j = 0; j < frameCount; j++)
                    {
                        source.GetBlendShapeFrameVertices(i, j, tempDeltaVertices, tempDeltaNormals, tempDeltaTangents);

                        deltaVertices.Clear();
                        deltaNormals.Clear();
                        deltaTangents.Clear();

                        deltaVertices.AddRange(tempDeltaVertices);
                        deltaNormals.AddRange(tempDeltaNormals);
                        deltaTangents.AddRange(tempDeltaTangents);

                        foreach (var insertion in insertions)
                        {
                            deltaVertices.Add(deltaVertices[insertion.Index]);
                            deltaNormals.Add(deltaNormals[insertion.Index]);
                            deltaTangents.Add(deltaTangents[insertion.Index]);
                        }

                        output.AddBlendShapeFrame(shapeName, source.GetBlendShapeFrameWeight(i, j), deltaVertices.ToArray(), deltaNormals.ToArray(), deltaTangents.ToArray());
                    }
                }
            }

            for (var i = 0; i < submeshes.Count; i++)
            {
                output.SetTriangles(submeshes[i], i);
            }
        }
            public void Execute()
            {
                var temp = new Unity.Collections.NativeArray <TempNodeData>(this.arr.Length, Unity.Collections.Allocator.Temp);
                var tmp  = temp[this.startNodeIndex];

                tmp.startToCurNodeLen     = 0f;
                tmp.isOpened              = true;
                temp[this.startNodeIndex] = tmp;

                this.openList.Enqueue(0, this.arr[this.startNodeIndex]);

                var maxIter = 10000;

                while (this.openList.Count > 0)
                {
                    if (--maxIter <= 0)
                    {
                        UnityEngine.Debug.LogError("Break");
                        break;
                    }

                    var node     = this.openList.Dequeue();
                    var nodeTemp = temp[node.index];
                    nodeTemp.isClosed = true;
                    temp[node.index]  = nodeTemp;

                    if (node.index == this.endNodeIndex)
                    {
                        maxIter = 10000;
                        this.resultPath.Add(this.arr[this.endNodeIndex]);
                        while (temp[this.endNodeIndex].parent != 0)
                        {
                            if (--maxIter <= 0)
                            {
                                UnityEngine.Debug.LogError("Break");
                                break;
                            }

                            var n = this.endNodeIndex;
                            this.endNodeIndex = temp[this.endNodeIndex].parent - 1;
                            this.resultPath.Add(this.arr[n]);
                        }

                        for (int i = 0; i < this.resultPath.Length / 2; ++i)
                        {
                            var ePtr = this.resultPath[this.resultPath.Length - 1 - i];
                            this.resultPath[this.resultPath.Length - 1 - i] = this.resultPath[i];
                            this.resultPath[i] = ePtr;
                        }

                        break;
                    }

                    var neighbors       = node.connections;
                    var currentNodeCost = nodeTemp.startToCurNodeLen;
                    for (int i = 0; i < neighbors.Length; ++i)
                    {
                        var conn = neighbors.Get(i);
                        if (conn.index < 0)
                        {
                            continue;
                        }

                        if (this.Jump(out var neighbor, in temp, in node, this.arr[conn.index]) == false)
                        {
                            continue;
                        }
                        var neighborTemp = temp[neighbor.index];
                        if (neighborTemp.isClosed == true)
                        {
                            continue;
                        }
                        if (neighbor.IsSuitable(this.burstConstraint, this.arr, this.graphSize, this.graphCenter) == false)
                        {
                            continue;
                        }

                        var cost = currentNodeCost + conn.cost;
                        if (neighborTemp.isOpened == false || cost < neighborTemp.startToCurNodeLen)
                        {
                            neighborTemp.startToCurNodeLen = cost;
                            neighborTemp.parent            = node.index + 1;
                            if (neighborTemp.isOpened == false)
                            {
                                Gizmos.DrawCube(neighbor.worldPosition, Vector3.one);

                                this.openList.Enqueue(cost, neighbor);
                                ++this.results[0];
                                neighborTemp.isOpened = true;
                            }
                        }

                        temp[neighbor.index] = neighborTemp;
                    }
                }

                temp.Dispose();
            }
        public Path Run <TMod>(LogLevel pathfindingLogLevel, Vector3 fromPoint, Vector3 toPoint, Constraint constraint, Graph graph, TMod pathModifier, int threadIndex = 0,
                               bool burstEnabled = true, bool cacheEnabled = false) where TMod : struct, IPathModifier
        {
            var path         = new Path();
            var pathResult   = new PathInternal();
            var navMeshGraph = (NavMeshGraph)graph;

            var areas = -1;

            if (constraint.checkArea == true)
            {
                areas = (int)constraint.areaMask;
            }

            System.Diagnostics.Stopwatch swPath = null;
            if ((pathfindingLogLevel & LogLevel.Path) != 0)
            {
                swPath = System.Diagnostics.Stopwatch.StartNew();
            }

            var statLength  = 0;
            var statVisited = 0;

            var query = new UnityEngine.Experimental.AI.NavMeshQuery(UnityEngine.Experimental.AI.NavMeshWorld.GetDefaultWorld(), Unity.Collections.Allocator.TempJob, PathfindingNavMeshProcessor.POOL_SIZE);

            if (burstEnabled == true)
            {
                var results     = new Unity.Collections.NativeArray <UnityEngine.Experimental.AI.NavMeshLocation>(PathfindingNavMeshProcessor.MAX_PATH_SIZE, Unity.Collections.Allocator.TempJob);
                var pathResults = new Unity.Collections.NativeArray <int>(2, Unity.Collections.Allocator.TempJob);
                var job         = new BuildPathJob()
                {
                    query       = query,
                    fromPoint   = fromPoint,
                    toPoint     = toPoint,
                    agentTypeId = navMeshGraph.agentTypeId,
                    areas       = areas,
                    pathResults = pathResults,
                    results     = results,
                };
                job.Schedule().Complete();
                var pathStatus  = (UnityEngine.Experimental.AI.PathQueryStatus)pathResults[0];
                var cornerCount = pathResults[1];
                pathResults.Dispose();

                if ((pathStatus & UnityEngine.Experimental.AI.PathQueryStatus.Success) != 0)
                {
                    if (cornerCount >= 2)
                    {
                        path.navMeshPoints = PoolListCopyable <Vector3> .Spawn(cornerCount);

                        for (var i = 0; i < cornerCount; ++i)
                        {
                            path.navMeshPoints.Add(results[i].position);
                        }

                        if ((pathfindingLogLevel & LogLevel.Path) != 0)
                        {
                            var hash = 0;
                            for (var i = 0; i < cornerCount; ++i)
                            {
                                hash ^= (int)(results[i].position.x * 1000000f);
                            }

                            UnityEngine.Debug.Log("Path hash X: " + hash);

                            hash = 0;
                            for (var i = 0; i < cornerCount; ++i)
                            {
                                hash ^= (int)(results[i].position.y * 1000000f);
                            }

                            UnityEngine.Debug.Log("Path hash Y: " + hash);

                            hash = 0;
                            for (var i = 0; i < cornerCount; ++i)
                            {
                                hash ^= (int)(results[i].position.z * 1000000f);
                            }

                            UnityEngine.Debug.Log("Path hash Z: " + hash);
                        }

                        if ((pathStatus & UnityEngine.Experimental.AI.PathQueryStatus.PartialResult) != 0)
                        {
                            path.result = PathCompleteState.CompletePartial;
                        }
                        else
                        {
                            path.result = PathCompleteState.Complete;
                        }
                    }
                    else
                    {
                        path.result = PathCompleteState.NotExist;
                    }
                }
                results.Dispose();
                query.Dispose();
                return(path);
            }

            UnityEngine.AI.NavMesh.SamplePosition(fromPoint, out var hitFrom, 1000f, new UnityEngine.AI.NavMeshQueryFilter()
            {
                agentTypeID = navMeshGraph.agentTypeId,
                areaMask    = areas,
            });
            fromPoint = hitFrom.position;
            var from = query.MapLocation(fromPoint, Vector3.one * 10f, navMeshGraph.agentTypeId, areas);

            if (from.polygon.IsNull() == true)
            {
                return(path);
            }

            UnityEngine.AI.NavMesh.SamplePosition(toPoint, out var hitTo, 1000f, new UnityEngine.AI.NavMeshQueryFilter()
            {
                agentTypeID = navMeshGraph.agentTypeId,
                areaMask    = areas,
            });
            toPoint = hitTo.position;
            var to = query.MapLocation(toPoint, Vector3.one * 10f, navMeshGraph.agentTypeId, areas);

            if (to.polygon.IsNull() == true)
            {
                return(path);
            }

            var marker = new Unity.Profiling.ProfilerMarker("PathfindingNavMeshProcessor::Query::BuildPath");

            marker.Begin();
            query.BeginFindPath(from, to, areas);
            query.UpdateFindPath(PathfindingNavMeshProcessor.MAX_ITERATIONS, out var performed);
            marker.End();
            statVisited = performed;

            var result = query.EndFindPath(out var pathSize);

            if ((result & UnityEngine.Experimental.AI.PathQueryStatus.Success) != 0)
            {
                var pathInternal = new Unity.Collections.NativeArray <UnityEngine.Experimental.AI.PolygonId>(pathSize, Unity.Collections.Allocator.Persistent);
                query.GetPathResult(pathInternal);

                var markerFindStraight = new Unity.Profiling.ProfilerMarker("PathfindingNavMeshProcessor::Query::FindStraightPath");
                markerFindStraight.Begin();

                var straightPathFlags = new Unity.Collections.NativeArray <StraightPathFlags>(PathfindingNavMeshProcessor.MAX_PATH_SIZE, Unity.Collections.Allocator.Persistent);
                var vertexSide        = new Unity.Collections.NativeArray <float>(PathfindingNavMeshProcessor.MAX_PATH_SIZE, Unity.Collections.Allocator.Persistent);
                var results           = new Unity.Collections.NativeArray <UnityEngine.Experimental.AI.NavMeshLocation>(PathfindingNavMeshProcessor.MAX_PATH_SIZE, Unity.Collections.Allocator.Persistent);
                var resultStatus      = new Unity.Collections.NativeArray <int>(2, Unity.Collections.Allocator.TempJob);
                var job = new FindStraightPathJob()
                {
                    query             = query,
                    from              = from,
                    to                = to,
                    pathInternal      = pathInternal,
                    pathSize          = pathSize,
                    results           = results,
                    straightPathFlags = straightPathFlags,
                    vertexSide        = vertexSide,
                    resultStatus      = resultStatus,
                };
                job.Schedule().Complete();

                var pathStatus  = (UnityEngine.Experimental.AI.PathQueryStatus)job.resultStatus[0];
                var cornerCount = job.resultStatus[1];
                resultStatus.Dispose();

                statLength = cornerCount;

                markerFindStraight.End();

                if (pathStatus == UnityEngine.Experimental.AI.PathQueryStatus.Success)
                {
                    /*for (int i = 1; i < cornerCount; ++i) {
                     *
                     *  Gizmos.color = Color.green;
                     *  Gizmos.DrawLine(results[i].position, results[i - 1].position);
                     *
                     * }*/
                    pathResult.pathStatus = pathStatus;
                    pathResult.results    = results;
                    pathResult.corners    = cornerCount;

                    if (cornerCount >= 2)
                    {
                        path.navMeshPoints = PoolListCopyable <Vector3> .Spawn(cornerCount);

                        for (var i = 0; i < cornerCount; ++i)
                        {
                            path.navMeshPoints.Add(results[i].position);
                        }

                        if ((pathfindingLogLevel & LogLevel.Path) != 0)
                        {
                            var hash = 0;
                            for (var i = 0; i < cornerCount; ++i)
                            {
                                hash ^= (int)(results[i].position.x * 1000000f);
                            }

                            UnityEngine.Debug.Log("Path hash X: " + hash);

                            hash = 0;
                            for (var i = 0; i < cornerCount; ++i)
                            {
                                hash ^= (int)(results[i].position.y * 1000000f);
                            }

                            UnityEngine.Debug.Log("Path hash Y: " + hash);

                            hash = 0;
                            for (var i = 0; i < cornerCount; ++i)
                            {
                                hash ^= (int)(results[i].position.z * 1000000f);
                            }

                            UnityEngine.Debug.Log("Path hash Z: " + hash);
                        }

                        path.result = PathCompleteState.Complete;
                    }
                    else
                    {
                        path.result = PathCompleteState.NotExist;
                    }

                    pathResult.Dispose();
                }
                else
                {
                    path.result = PathCompleteState.NotExist;
                    results.Dispose();
                }

                vertexSide.Dispose();
                straightPathFlags.Dispose();
                pathInternal.Dispose();
            }
            else
            {
                path.result = PathCompleteState.NotExist;
                //Debug.LogWarning("Path result: " + result + ", performed: " + performed);
            }

            System.Diagnostics.Stopwatch swModifier = null;
            if ((pathfindingLogLevel & LogLevel.PathMods) != 0)
            {
                swModifier = System.Diagnostics.Stopwatch.StartNew();
            }

            if ((path.result & PathCompleteState.Complete) != 0)
            {
                path = pathModifier.Run(path, constraint);
            }

            if ((pathfindingLogLevel & LogLevel.Path) != 0)
            {
                Logger.Log(
                    $"Path result {path.result}, built in {(swPath.ElapsedTicks / (double)System.TimeSpan.TicksPerMillisecond).ToString("0.##")}ms. Path length: {statLength} (Visited: {statVisited})\nThread Index: {threadIndex}");
            }

            if ((pathfindingLogLevel & LogLevel.PathMods) != 0)
            {
                Logger.Log($"Path Mods: {swModifier.ElapsedMilliseconds}ms");
            }

            query.Dispose();

            return(path);
        }
示例#9
0
 void Cleanup()
 {
     blockData.Dispose();
 }