コード例 #1
0
        /// <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));
        }
コード例 #2
0
        /// <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));
        }
コード例 #3
0
        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));
        }