/// <summary> /// Schedule building of the static layer in broadphase. /// Note: If param staticLayerChangeInfo.HaveStaticBodiesChanged indicates static layer needs to be rebuilt, /// than Adjust* jobs will early out and Build* jobs will be executed. /// Otherwise if staticLayerChangeInfo indicates that rebuild is not required, /// Adjust* jobs will be executed and Build* will early out in runtime. /// </summary> public unsafe JobHandle ScheduleStaticTreeBuildJobs( ref PhysicsWorld world, int numThreadsHint, ref StaticLayerChangeInfo staticLayerChangeInfo, NativeArray <CollisionFilter> previousFrameBodyFilters, JobHandle inputDeps) { JobHandle handle = inputDeps; m_StaticTree.NodeCount = world.NumStaticBodies + BoundingVolumeHierarchy.Constants.MaxNumTreeBranches; int dynamicBodyDiffFromPreviousFrame = world.NumDynamicBodies - m_DynamicTree.BodyCount; // Fix up the static tree. JobHandle adjustBodyIndices = new AdjustBodyIndicesJob { StaticNodes = m_StaticTree.Nodes, NumStaticNodes = m_StaticTree.Nodes.Length, NumDynamicBodiesDiff = dynamicBodyDiffFromPreviousFrame, HaveStaticBodiesChanged = staticLayerChangeInfo.HaveStaticBodiesChangedArray }.Schedule(handle); // Fix up body filters for static bodies. JobHandle adjustStaticBodyFilters = new AdjustStaticBodyFilters { NumDynamicBodiesDiff = dynamicBodyDiffFromPreviousFrame, PreviousFrameBodyFilters = previousFrameBodyFilters, BodyFilters = m_BodyFilters, NumStaticBodies = world.NumStaticBodies, NumDynamicBodies = world.NumDynamicBodies, HaveStaticBodiesChanged = staticLayerChangeInfo.HaveStaticBodiesChangedArray }.Schedule(handle); handle = JobHandle.CombineDependencies(adjustBodyIndices, adjustStaticBodyFilters); var aabbs = new NativeArray <Aabb>(world.NumBodies, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var lookup = new NativeArray <PointAndIndex>(world.NumStaticBodies, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); handle = new BuildStaticBodyDataJob { RigidBodies = world.StaticBodies, Aabbs = aabbs, FiltersOut = new NativeSlice <CollisionFilter>(m_BodyFilters, world.NumDynamicBodies, world.NumStaticBodies), Lookup = lookup, Offset = world.NumDynamicBodies, AabbMargin = world.CollisionWorld.CollisionTolerance / 2.0f // each body contributes half, }.ScheduleUnsafeIndex0(staticLayerChangeInfo.NumStaticBodiesArray, 32, handle); return(m_StaticTree.BoundingVolumeHierarchy.ScheduleBuildJobs( lookup, aabbs, m_BodyFilters, staticLayerChangeInfo.HaveStaticBodiesChangedArray, numThreadsHint, handle, m_StaticTree.NodeCount, m_StaticTree.Ranges, m_StaticTree.m_BranchCount)); }
/// <summary> /// Schedule a set of jobs to build the broadphase based on the given world. /// </summary> public JobHandle ScheduleBuildJobs(ref PhysicsWorld world, float timeStep, float3 gravity, int numThreadsHint, ref StaticLayerChangeInfo staticLayerChangeInfo, JobHandle inputDeps) { var previousFrameBodyFilters = new NativeArray <CollisionFilter>(m_BodyFilters, Allocator.TempJob); if (world.NumBodies > m_BodyFilters.Length) { m_BodyFilters.Dispose(); m_BodyFilters = new NativeArray <CollisionFilter>(world.NumBodies, Allocator.Persistent, NativeArrayOptions.UninitializedMemory); } m_StaticTree.BodyCount = world.NumStaticBodies; JobHandle staticTree = ScheduleStaticTreeBuildJobs(ref world, numThreadsHint, ref staticLayerChangeInfo, previousFrameBodyFilters, inputDeps); m_DynamicTree.BodyCount = world.NumDynamicBodies; JobHandle dynamicTree = inputDeps; if (world.NumDynamicBodies > 0) { dynamicTree = ScheduleDynamicTreeBuildJobs(ref world, timeStep, gravity, numThreadsHint, inputDeps); } return(JobHandle.CombineDependencies(staticTree, dynamicTree)); }
public JobHandle ScheduleBuildJobs(ref PhysicsWorld world, float timeStep, int numThreadsHint, ref StaticLayerChangeInfo staticLayerChangeInfo, JobHandle inputDeps) { PhysicsStep stepComponent = PhysicsStep.Default; return(ScheduleBuildJobs(ref world, timeStep, stepComponent.Gravity, numThreadsHint, ref staticLayerChangeInfo, inputDeps)); }