internal static JobHandle ScheduleProcessBodyPairsJobs(ref PhysicsWorld world, float timeStep, int numIterations, ref Simulation.Context context, JobHandle inputDeps) { var numWorkItems = context.SolverSchedulerInfo.NumWorkItems; var contactsHandle = NativeStream.ScheduleConstruct(out context.Contacts, numWorkItems, inputDeps, Allocator.TempJob); var jointJacobiansHandle = NativeStream.ScheduleConstruct(out context.JointJacobians, numWorkItems, inputDeps, Allocator.TempJob); var jacobiansHandle = NativeStream.ScheduleConstruct(out context.Jacobians, numWorkItems, inputDeps, Allocator.TempJob); var processHandle = new ProcessBodyPairsJob { World = world, TimeStep = timeStep, NumIterations = numIterations, PhasedDispatchPairs = context.PhasedDispatchPairs.AsDeferredJobArray(), SolverSchedulerInfo = context.SolverSchedulerInfo, ContactWriter = context.Contacts.AsWriter(), JointJacobianWriter = context.JointJacobians.AsWriter(), }.ScheduleUnsafeIndex0(numWorkItems, 1, JobHandle.CombineDependencies(contactsHandle, jointJacobiansHandle, jacobiansHandle)); context.DisposeProcessBodyPairs = NativeListUtilityTemp.DisposeHotFix(ref context.PhasedDispatchPairs, processHandle); return(processHandle); }
// 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); }