// Schedule a set of jobs which will write all overlapping body pairs to the given steam, // where at least one of the bodies is dynamic. The results are unsorted. public JobHandle ScheduleFindOverlapsJobs( out BlockStream dynamicVsDynamicPairsStream, out BlockStream staticVsDynamicPairsStream, JobHandle inputDeps) { int numDynamicVsDynamicBranchOverlapPairs = m_DynamicTree.BranchCount * (m_DynamicTree.BranchCount + 1) / 2; dynamicVsDynamicPairsStream = new BlockStream(numDynamicVsDynamicBranchOverlapPairs, 0xa542b34); int numStaticVsDynamicBranchOverlapPairs = m_StaticTree.BranchCount * m_DynamicTree.BranchCount; staticVsDynamicPairsStream = new BlockStream(numStaticVsDynamicBranchOverlapPairs, 0xa542b34); // Build pairs of branch node indices var dynamicVsDynamicNodePairIndices = new NativeArray <int2>(numDynamicVsDynamicBranchOverlapPairs, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); JobHandle dynamicVsDynamicPairs = new DynamicVsDynamicBuildBranchNodePairsJob { Ranges = m_DynamicTree.Ranges, NumBranches = m_DynamicTree.BranchCount, NodePairIndices = dynamicVsDynamicNodePairIndices }.Schedule(inputDeps); var staticVsDynamicNodePairIndices = new NativeArray <int2>(numStaticVsDynamicBranchOverlapPairs, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); JobHandle staticVsDynamicPairs = new StaticVsDynamicBuildBranchNodePairsJob { DynamicRanges = m_DynamicTree.Ranges, StaticRanges = m_StaticTree.Ranges, NumStaticBranches = m_StaticTree.BranchCount, NumDynamicBranches = m_DynamicTree.BranchCount, NodePairIndices = staticVsDynamicNodePairIndices }.Schedule(inputDeps); // Write all overlaps to the stream (also deallocates nodePairIndices) JobHandle dynamicVsDynamicHandle = new DynamicVsDynamicFindOverlappingPairsJob { DynamicNodes = m_DynamicTree.Nodes, BodyFilters = m_BodyFilters, DynamicNodeFilters = m_DynamicTree.NodeFilters, PairWriter = dynamicVsDynamicPairsStream, NodePairIndices = dynamicVsDynamicNodePairIndices }.Schedule(numDynamicVsDynamicBranchOverlapPairs, 1, dynamicVsDynamicPairs); // Write all overlaps to the stream (also deallocates nodePairIndices) JobHandle staticVsDynamicHandle = new StaticVsDynamicFindOverlappingPairsJob { StaticNodes = m_StaticTree.Nodes, DynamicNodes = m_DynamicTree.Nodes, BodyFilters = m_BodyFilters, StaticNodeFilters = m_StaticTree.NodeFilters, DynamicNodeFilters = m_DynamicTree.NodeFilters, PairWriter = staticVsDynamicPairsStream, NodePairIndices = staticVsDynamicNodePairIndices }.Schedule(numStaticVsDynamicBranchOverlapPairs, 1, staticVsDynamicPairs); return(JobHandle.CombineDependencies(dynamicVsDynamicHandle, staticVsDynamicHandle)); }
// Write all overlapping body pairs to the given streams, // where at least one of the bodies is dynamic. The results are unsorted. public void FindOverlaps(ref NativeStream.Writer dynamicVsDynamicPairsWriter, ref NativeStream.Writer staticVsDynamicPairsWriter) { // Dynamic-dynamic { dynamicVsDynamicPairsWriter.BeginForEachIndex(0); DynamicVsDynamicFindOverlappingPairsJob.ExecuteImpl( new int2(1, 1), m_DynamicTree, ref dynamicVsDynamicPairsWriter); dynamicVsDynamicPairsWriter.EndForEachIndex(); } // Static-dynamic { staticVsDynamicPairsWriter.BeginForEachIndex(0); StaticVsDynamicFindOverlappingPairsJob.ExecuteImpl( new int2(1, 1), m_StaticTree, m_DynamicTree, ref staticVsDynamicPairsWriter); staticVsDynamicPairsWriter.EndForEachIndex(); } }
// Schedule a set of jobs which will write all overlapping body pairs to the given steam, // where at least one of the bodies is dynamic. The results are unsorted. internal JobHandle ScheduleFindOverlapsJobs(out BlockStream dynamicVsDynamicPairsStream, out BlockStream staticVsDynamicPairsStream, ref Simulation.Context context, JobHandle inputDeps) { var dynamicVsDynamicNodePairIndices = new NativeList <int2>(Allocator.TempJob); var staticVsDynamicNodePairIndices = new NativeList <int2>(Allocator.TempJob); JobHandle allocateDeps = new AllocateDynamicVsStaticNodePairs { dynamicVsDynamicNodePairIndices = dynamicVsDynamicNodePairIndices, staticVsDynamicNodePairIndices = staticVsDynamicNodePairIndices, dynamicBranchCount = m_DynamicTree.m_BranchCount, staticBranchCount = m_StaticTree.m_BranchCount }.Schedule(inputDeps); // Build pairs of branch node indices JobHandle dynamicVsDynamicPairs = new DynamicVsDynamicBuildBranchNodePairsJob { Ranges = m_DynamicTree.Ranges, NumBranches = m_DynamicTree.m_BranchCount, NodePairIndices = dynamicVsDynamicNodePairIndices.AsDeferredJobArray() }.Schedule(allocateDeps); JobHandle staticVsDynamicPairs = new StaticVsDynamicBuildBranchNodePairsJob { DynamicRanges = m_DynamicTree.Ranges, StaticRanges = m_StaticTree.Ranges, NumStaticBranches = m_StaticTree.m_BranchCount, NumDynamicBranches = m_DynamicTree.m_BranchCount, NodePairIndices = staticVsDynamicNodePairIndices.AsDeferredJobArray() }.Schedule(allocateDeps); //@TODO: We only need a dependency on allocateDeps, but the safety system doesn't understand that we can not change length list in DynamicVsDynamicBuildBranchNodePairsJob & StaticVsDynamicBuildBranchNodePairsJob // if this is a performance issue we can use [NativeDisableContainerSafetyRestriction] on DynamicVsDynamicBuildBranchNodePairsJob & StaticVsDynamicBuildBranchNodePairsJob JobHandle dynamicConstruct = BlockStream.ScheduleConstruct(out dynamicVsDynamicPairsStream, dynamicVsDynamicNodePairIndices, 0x0a542b34, dynamicVsDynamicPairs); JobHandle staticConstruct = BlockStream.ScheduleConstruct(out staticVsDynamicPairsStream, staticVsDynamicNodePairIndices, 0x0a542666, staticVsDynamicPairs); // Write all overlaps to the stream (also deallocates nodePairIndices) JobHandle dynamicVsDynamicHandle = new DynamicVsDynamicFindOverlappingPairsJob { DynamicNodes = m_DynamicTree.Nodes, BodyFilters = m_BodyFilters, DynamicNodeFilters = m_DynamicTree.NodeFilters, PairWriter = dynamicVsDynamicPairsStream, NodePairIndices = dynamicVsDynamicNodePairIndices.AsDeferredJobArray() }.Schedule(dynamicVsDynamicNodePairIndices, 1, JobHandle.CombineDependencies(dynamicVsDynamicPairs, dynamicConstruct)); // Write all overlaps to the stream (also deallocates nodePairIndices) JobHandle staticVsDynamicHandle = new StaticVsDynamicFindOverlappingPairsJob { StaticNodes = m_StaticTree.Nodes, DynamicNodes = m_DynamicTree.Nodes, BodyFilters = m_BodyFilters, StaticNodeFilters = m_StaticTree.NodeFilters, DynamicNodeFilters = m_DynamicTree.NodeFilters, PairWriter = staticVsDynamicPairsStream, NodePairIndices = staticVsDynamicNodePairIndices.AsDeferredJobArray() }.Schedule(staticVsDynamicNodePairIndices, 1, JobHandle.CombineDependencies(staticVsDynamicPairs, staticConstruct)); // Dispose node pair lists context.DisposeOverlapPairs0 = NativeListUtilityTemp.DisposeHotFix(ref dynamicVsDynamicNodePairIndices, dynamicVsDynamicHandle); context.DisposeOverlapPairs1 = NativeListUtilityTemp.DisposeHotFix(ref staticVsDynamicNodePairIndices, staticVsDynamicHandle); return(JobHandle.CombineDependencies(dynamicVsDynamicHandle, staticVsDynamicHandle)); }
// Schedule a set of jobs which will write all overlapping body pairs to the given steam, // where at least one of the bodies is dynamic. The results are unsorted. public SimulationJobHandles ScheduleFindOverlapsJobs(out NativeStream dynamicVsDynamicPairsStream, out NativeStream staticVsDynamicPairsStream, JobHandle inputDeps, int threadCountHint = 0) { SimulationJobHandles returnHandles = default; if (threadCountHint <= 0) { dynamicVsDynamicPairsStream = new NativeStream(1, Allocator.TempJob); staticVsDynamicPairsStream = new NativeStream(1, Allocator.TempJob); returnHandles.FinalExecutionHandle = new FindOverlapsJob { Broadphase = this, DynamicVsDynamicPairsWriter = dynamicVsDynamicPairsStream.AsWriter(), StaticVsDynamicPairsWriter = staticVsDynamicPairsStream.AsWriter() }.Schedule(inputDeps); return(returnHandles); } var dynamicVsDynamicNodePairIndices = new NativeList <int2>(Allocator.TempJob); var staticVsDynamicNodePairIndices = new NativeList <int2>(Allocator.TempJob); JobHandle allocateDeps = new AllocateDynamicVsStaticNodePairs { dynamicVsDynamicNodePairIndices = dynamicVsDynamicNodePairIndices, staticVsDynamicNodePairIndices = staticVsDynamicNodePairIndices, dynamicBranchCount = m_DynamicTree.BranchCount, staticBranchCount = m_StaticTree.BranchCount }.Schedule(inputDeps); // Build pairs of branch node indices JobHandle dynamicVsDynamicPairs = new DynamicVsDynamicBuildBranchNodePairsJob { Ranges = m_DynamicTree.Ranges, NumBranches = m_DynamicTree.BranchCount, NodePairIndices = dynamicVsDynamicNodePairIndices.AsDeferredJobArray() }.Schedule(allocateDeps); JobHandle staticVsDynamicPairs = new StaticVsDynamicBuildBranchNodePairsJob { DynamicRanges = m_DynamicTree.Ranges, StaticRanges = m_StaticTree.Ranges, NumStaticBranches = m_StaticTree.BranchCount, NumDynamicBranches = m_DynamicTree.BranchCount, NodePairIndices = staticVsDynamicNodePairIndices.AsDeferredJobArray() }.Schedule(allocateDeps); //@TODO: We only need a dependency on allocateDeps, but the safety system doesn't understand that we can not change length list in DynamicVsDynamicBuildBranchNodePairsJob & StaticVsDynamicBuildBranchNodePairsJob // if this is a performance issue we can use [NativeDisableContainerSafetyRestriction] on DynamicVsDynamicBuildBranchNodePairsJob & StaticVsDynamicBuildBranchNodePairsJob JobHandle dynamicConstruct = NativeStream.ScheduleConstruct(out dynamicVsDynamicPairsStream, dynamicVsDynamicNodePairIndices, dynamicVsDynamicPairs, Allocator.TempJob); JobHandle staticConstruct = NativeStream.ScheduleConstruct(out staticVsDynamicPairsStream, staticVsDynamicNodePairIndices, staticVsDynamicPairs, Allocator.TempJob); // Write all overlaps to the stream (also deallocates nodePairIndices) JobHandle dynamicVsDynamicHandle = new DynamicVsDynamicFindOverlappingPairsJob { DynamicTree = m_DynamicTree, PairWriter = dynamicVsDynamicPairsStream.AsWriter(), NodePairIndices = dynamicVsDynamicNodePairIndices.AsDeferredJobArray() }.Schedule(dynamicVsDynamicNodePairIndices, 1, JobHandle.CombineDependencies(dynamicVsDynamicPairs, dynamicConstruct)); // Write all overlaps to the stream (also deallocates nodePairIndices) JobHandle staticVsDynamicHandle = new StaticVsDynamicFindOverlappingPairsJob { StaticTree = m_StaticTree, DynamicTree = m_DynamicTree, PairWriter = staticVsDynamicPairsStream.AsWriter(), NodePairIndices = staticVsDynamicNodePairIndices.AsDeferredJobArray() }.Schedule(staticVsDynamicNodePairIndices, 1, JobHandle.CombineDependencies(staticVsDynamicPairs, staticConstruct)); // Dispose node pair lists var disposeOverlapPairs0 = NativeListUtilityTemp.DisposeHotFix(ref dynamicVsDynamicNodePairIndices, dynamicVsDynamicHandle); var disposeOverlapPairs1 = NativeListUtilityTemp.DisposeHotFix(ref staticVsDynamicNodePairIndices, staticVsDynamicHandle); returnHandles.FinalDisposeHandle = JobHandle.CombineDependencies(disposeOverlapPairs0, disposeOverlapPairs1); returnHandles.FinalExecutionHandle = JobHandle.CombineDependencies(dynamicVsDynamicHandle, staticVsDynamicHandle); return(returnHandles); }