public void CreateAndDestroy([Values(1, 100, 200)] int count) { var stream = new BlockStream(count, 0x9b98651b); Assert.IsTrue(stream.IsCreated); Assert.IsTrue(stream.ForEachCount == count); Assert.IsTrue(stream.ComputeItemCount() == 0); stream.Dispose(); Assert.IsFalse(stream.IsCreated); }
public void ItemCount([Values(1, 100, 200)] int count, [Values(1, 3, 10)] int batchSize) { var stream = new BlockStream(count, 0xd3e8afdd); var fillInts = new WriteInts { Writer = stream }; fillInts.Schedule(count, batchSize).Complete(); Assert.AreEqual(count * (count - 1) / 2, stream.ComputeItemCount()); stream.Dispose(); }
public unsafe void BuildTreeAndOverlapTasks([Values(2, 10, 33, 100)] int elementCount) { const int threadCount = 8; elementCount *= 2; int numNodes = elementCount + Constants.MaxNumTreeBranches; var points = new NativeArray <PointAndIndex>(elementCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var aabbs = new NativeArray <Aabb>(elementCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var filters = new NativeArray <CollisionFilter>(elementCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var nodefilters = new NativeArray <CollisionFilter>(numNodes, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var branchCount = new NativeArray <int>(1, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); InitInputWithCopyArrays(points, aabbs, filters); // Override filter data with default filters. for (int i = 0; i < filters.Length; i++) { filters[i] = CollisionFilter.Default; } for (int i = 0; i < nodefilters.Length; i++) { nodefilters[i] = CollisionFilter.Default; } var nodes = new NativeArray <Node>(numNodes, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var ranges = new NativeArray <Range>(Constants.MaxNumTreeBranches, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var branchNodeOffset = new NativeArray <int>(Constants.MaxNumTreeBranches, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var shouldDoWork = new NativeArray <int>(1, Allocator.TempJob); shouldDoWork[0] = 1; int oldBranchCount = branchCount[0]; JobHandle handle = new BuildFirstNLevelsJob { Points = points, Nodes = (Node *)nodes.GetUnsafePtr(), Ranges = ranges, BranchNodeOffsets = branchNodeOffset, BranchCount = branchCount, ThreadCount = threadCount, ShouldDoWork = shouldDoWork }.Schedule(); handle = new BuildBranchesJob { Points = points, Aabbs = aabbs, BodyFilters = filters, Nodes = (Node *)nodes.GetUnsafePtr(), Ranges = ranges, BranchNodeOffsets = branchNodeOffset, BranchCount = branchCount }.ScheduleUnsafeIndex0(branchCount, 1, handle); new FinalizeTreeJob { Aabbs = aabbs, LeafFilters = filters, Nodes = (Node *)nodes.GetUnsafePtr(), BranchNodeOffsets = branchNodeOffset, NumNodes = numNodes, BranchCount = branchCount, ShouldDoWork = shouldDoWork, OldBranchCount = oldBranchCount }.Schedule(handle).Complete(); int numBranchOverlapPairs = branchCount[0] * (branchCount[0] + 1) / 2; var nodePairIndices = new NativeList <int2>(Allocator.TempJob); nodePairIndices.ResizeUninitialized(numBranchOverlapPairs); var collisionPairs = new BlockStream(numBranchOverlapPairs, 0xb08c3d78); handle = new Broadphase.DynamicVsDynamicBuildBranchNodePairsJob { Ranges = ranges, NumBranches = branchCount, NodePairIndices = nodePairIndices }.Schedule(); handle = new Broadphase.DynamicVsDynamicFindOverlappingPairsJob { DynamicNodes = nodes, PairWriter = collisionPairs, BodyFilters = filters, NodePairIndices = nodePairIndices, DynamicNodeFilters = nodefilters, }.Schedule(nodePairIndices, numBranchOverlapPairs, handle); handle.Complete(); int numPairs = collisionPairs.ComputeItemCount(); Assert.AreEqual(elementCount / 2, numPairs); //Debug.Log($"Num colliding pairs: {numPairs}"); var bvh = new BoundingVolumeHierarchy(nodes); bvh.CheckIntegrity(); nodePairIndices.Dispose(); filters.Dispose(); nodefilters.Dispose(); nodes.Dispose(); ranges.Dispose(); collisionPairs.Dispose(); branchCount.Dispose(); shouldDoWork.Dispose(); }