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); }
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(); } }
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(); } }
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); }
void Cleanup() { blockData.Dispose(); }