#if GRIFFIN using UnityEngine; using System.Collections; using System.Collections.Generic; using Unity.Collections; using Unity.Burst; using Unity.Jobs; namespace Pinwheel.Griffin { #if GRIFFIN_BURST [BurstCompile(CompileSynchronously = false)] #endif public struct GSampleInstanceJob : IJobParallelFor { [WriteOnly] public NativeArray cullResult; [WriteOnly] public NativeArray instanceInfo; [ReadOnly] public GTextureNativeDataDescriptor mask; [ReadOnly] public NativeArray selectedPrototypeIndices; public float minRotation; public float maxRotation; public Vector3 minScale; public Vector3 maxScale; public int seed; public void Execute(int index) { Unity.Mathematics.Random rand = Unity.Mathematics.Random.CreateFromIndex((uint)(index^seed)); Vector2 uv = new Vector2(rand.NextFloat(), rand.NextFloat()); float maskValue = GJobCommon.GetColorBilinear(mask, uv).r; if (rand.NextFloat() > maskValue) { cullResult[index] = false; } else { cullResult[index] = true; GPrototypeInstanceInfo info = new GPrototypeInstanceInfo(); info.prototypeIndex = selectedPrototypeIndices[rand.NextInt(0, selectedPrototypeIndices.Length)]; info.position = new Vector3(uv.x, 0, uv.y); info.rotation = Quaternion.Euler(0, rand.NextFloat(minRotation, maxRotation), 0); info.scale = Vector3.Lerp(minScale, maxScale, rand.NextFloat()); instanceInfo[index] = info; } } } } #endif