Untitled
unknown
plain_text
a month ago
3.2 kB
2
Indexable
Never
using System; using Unity.Burst; using Unity.Collections; using Unity.Jobs; using UnityEngine; namespace Game.World.Views.Spreads.Jobs { [BurstCompile] public struct CreateGradationMapJob : IJob { public NativeArray<int> GradationMap; public int Gradations; public int Width; public int Height; public NativeArray<bool> Filled; public NativeList<int> PointQueue; private int _pixelsCount; private int _pixelsPerColor; private Unity.Mathematics.Random _random; public void Execute() { _random = new Unity.Mathematics.Random((uint)Environment.TickCount); _pixelsCount = Width * Height; _pixelsPerColor = _pixelsCount / Gradations; for (int gradation = 0; gradation < Gradations; gradation++) { int startX = _random.NextInt(0, Width); int startY = _random.NextInt(0, Height); PointQueue.Clear(); PointQueue.Add(startX + startY * Width); SetFilledValue(startX, startY, true); GradationMap[startX + startY * Width] = gradation; while (PointQueue.Length > 0) { int currentPoint = PointQueue[0]; PointQueue.RemoveAtSwapBack(0); int x = currentPoint % Width; int y = currentPoint / Width; TryFill(x + 1, y, gradation); TryFill(x - 1, y, gradation); TryFill(x, y + 1, gradation); TryFill(x, y - 1, gradation); TryFill(x + 1, y + 1, gradation); // діагоналі для створення круглих форм TryFill(x - 1, y - 1, gradation); // діагоналі для створення круглих форм TryFill(x + 1, y - 1, gradation); // діагоналі для створення круглих форм TryFill(x - 1, y + 1, gradation); // діагоналі для створення круглих форм } } } private void TryFill(int x, int y, int gradation) { if (x >= 0 && x < Width && y >= 0 && y < Height && !GetFilledValue(x, y)) { int index = x + y * Width; PointQueue.Add(index); SetFilledValue(x, y, true); GradationMap[index] = gradation; } } private bool GetFilledValue(int x, int y) { if (x < 0 || x >= Width || y < 0 || y >= Height) { throw new ArgumentOutOfRangeException("Error 0"); } int index = y * Width + x; return Filled[index]; } private void SetFilledValue(int x, int y, bool value) { if (x < 0 || x >= Width || y < 0 || y >= Height) { throw new ArgumentOutOfRangeException("Error 1"); } int index = y * Width + x; Filled[index] = value; } } }
Leave a Comment