public VoxelGeometryVolumeRequest[] Pull(int pullCount, Vector3 sortPriorityPosition = default) { for (var index = 0; index < pullCount; index++) { var count = _requests.Count; if (count < 1) { break; } var bestRequest = new VoxelGeometryVolumeRequest(); var bestIndex = 0; var bestDistance = float.MaxValue; for (var i = 0; i < count; i++) { var request = _requests[i]; var chunkPosition = new Vector3( request.chunkPosition.x * request.chunkSize.x, request.chunkPosition.y * request.chunkSize.y, request.chunkPosition.z * request.chunkSize.z); var currentDistance = Vector3.Distance(sortPriorityPosition, chunkPosition); var currentDistanceAbs = Mathf.Abs(currentDistance); if (bestDistance > currentDistanceAbs) { bestRequest = request; bestDistance = currentDistance; bestIndex = i; } } _requests.RemoveAt(bestIndex); _pullBuffer.Add(bestRequest); } var pullBuffer = _pullBuffer.ToArray(); _pullBuffer.Clear(); return(pullBuffer); }
public VoxelGeometryChunkResponse Execute(VoxelGeometryVolumeRequest geometryVolumeRequest) { _currentGeometryChunkCommand.geometryVolumeRequest = geometryVolumeRequest; _currentGeometryChunkCommand.Execute(); var elementLengths = _currentGeometryChunkCommand.elementLengths; var verticesLength = elementLengths[0]; var indicesLength = elementLengths[1]; var vertices = new Vector3[verticesLength]; var colors = new Color32[verticesLength]; var indices = new int[indicesLength]; Array.Copy(_vertices, vertices, verticesLength); Array.Copy(_colors, colors, verticesLength); Array.Copy(_indices, indices, indicesLength); var command = _currentGeometryChunkCommand.geometryVolumeRequest; var chunkIndex = VoxelChunkUtility.GetIndex(command.chunkPosition); return(new VoxelGeometryChunkResponse(chunkIndex, vertices, indices, colors)); }
public void Push(VoxelGeometryVolumeRequest geometryVolumeRequest) { _requests.Add(geometryVolumeRequest); }