public BroadPhase(ComputeShader compute, ComputeShader computeSort, LifeService l, PositionService p) { var capacity = l.Lifes.count; _lifes = l; _positions = p; _kernelInitYs = compute.FindKernel(ShaderConst.KERNEL_INIT_BROADPHASE); _kernelSolve = compute.FindKernel(ShaderConst.KERNEL_SOVLE_BROADPHASE); _compute = compute; _sort = new BitonicMergeSort(computeSort); Keys = new ComputeBuffer(capacity, Marshal.SizeOf(typeof(uint))); _ys = new ComputeBuffer(capacity, Marshal.SizeOf(typeof(float))); Bands = new ComputeBuffer(capacity, Marshal.SizeOf(typeof(Band))); }
public HashGrid(ComputeShader compute, ComputeShader computeSort, LifeService l, PositionService p, GridService.Grid g) { var capacity = l.Lifes.count; _compute = compute; _lifes = l; _positions = p; _kernelSolve = compute.FindKernel(ShaderConst.KERNEL_SOVLE_COLLISION_DETECTION); _sort = new BitonicMergeSort(computeSort); _keys = new ComputeBuffer(capacity, Marshal.SizeOf(typeof(uint))); CollisionData = new Collision[capacity]; Collisions = new ComputeBuffer(capacity, Marshal.SizeOf(typeof(Collision))); _hashes = new HashService(compute, l, p); _grid = new GridService(compute, g, _hashes); }
void Start() { var count = 1 << powOfSize; Debug.LogFormat("Count={0}", count); _sort = new BitonicMergeSort(compute); _keys = new DisposableBuffer <uint>(count); _values = new DisposableBuffer <int>(count); Random.seed = seed; var data = new int[count]; for (var i = 0; i < count; i++) { data[i] = i; } for (var i = 0; i < count; i++) { var j = Random.Range(0, count); var k = Random.Range(0, count); var tmp = data[j]; data[j] = data[k]; data[k] = tmp; } System.Array.Copy(data, _values.Data, count); _values.Upload(); _sort.Init(_keys.Buffer); _sort.SortInt(_keys.Buffer, _values.Buffer); _keys.Download(); var failed = false; for (var i = 0; i < count; i++) { var j = _values.Data[_keys.Data[i]]; if (j != i) { failed = true; Debug.LogErrorFormat("Unexpected Key {0} at {1}", j, i); } } Debug.LogFormat("Sort Test Result = {0}", (failed ? "Wrong" : "Correct")); }