コード例 #1
0
        public static void ScheduleColliderBake(ChiselModel model, ChiselColliderObjects[] colliders)
        {
            var colliderSettings = model.ColliderSettings;
            //*
            // TODO: find all the instanceIDs before we start doing CSG, then we can do the Bake's in the same job that sets the meshes
            //          hopefully that will make it easier for Unity to not screw up the scheduling
            var bakingSettings = new NativeArray <BakeData>(colliders.Length, Allocator.TempJob);

            for (int i = 0; i < colliders.Length; i++)
            {
                var meshCollider = colliders[i].meshCollider;
                if (!meshCollider)
                {
                    bakingSettings[i] = new BakeData
                    {
                        instanceID = 0
                    };
                    continue;
                }

                var sharedMesh = colliders[i].sharedMesh;
                bakingSettings[i] = new BakeData
                {
                    convex     = colliderSettings.convex,
                    instanceID = sharedMesh.GetInstanceID()
                };
            }

            /*
             * var allJobHandles = default(JobHandle);
             * for (int i = 0; i < bakingSettings.Length; i++)
             * {
             *  var bakeColliderJob = new BakeColliderJob
             *  {
             *      bakingSettings = bakingSettings[i]
             *  };
             *  var jobHandle = bakeColliderJob.Schedule();
             *  allJobHandles = JobHandle.CombineDependencies(allJobHandles, jobHandle);
             * }
             * /*/
            var bakeColliderJob = new BakeColliderJobParallel
            {
                bakingSettings = bakingSettings
            };
            // WHY ARE ALL OF THESE JOBS SEQUENTIAL ON A SINGLE WORKER THREAD?
            var allJobHandles = bakeColliderJob.Schedule(colliders.Length, 1);

            //*/

            bakingSettings.Dispose(allJobHandles);
            //*/

            /*
             * // TODO: is there a way to defer forcing the collider to update?
             * for (int i = 0; i < colliders.Length; i++)
             * {
             *  var meshCollider = colliders[i].meshCollider;
             *  if (!meshCollider)
             *      continue;
             *
             *  meshCollider.sharedMesh = colliders[i].sharedMesh;
             * }*/
        }
コード例 #2
0
        public static void UpdateProperties(ChiselModel model, ChiselColliderObjects[] colliders)
        {
            if (colliders == null)
            {
                return;
            }

            var colliderSettings = model.ColliderSettings;

            for (int i = 0; i < colliders.Length; i++)
            {
                var meshCollider = colliders[i].meshCollider;
                if (!meshCollider)
                {
                    continue;
                }

                // If the cookingOptions are not the default values it would force a full slow rebake later,
                // even if we already did a Bake in a job
                //if (meshCollider.cookingOptions != colliderSettings.cookingOptions)
                //    meshCollider.cookingOptions = colliderSettings.cookingOptions;

                if (meshCollider.convex != colliderSettings.convex)
                {
                    meshCollider.convex = colliderSettings.convex;
                }
                if (meshCollider.isTrigger != colliderSettings.isTrigger)
                {
                    meshCollider.isTrigger = colliderSettings.isTrigger;
                }

                var sharedMesh      = colliders[i].sharedMesh;
                var expectedEnabled = sharedMesh.vertexCount > 0;
                if (meshCollider.enabled != expectedEnabled)
                {
                    meshCollider.enabled = expectedEnabled;
                }
            }

            // TODO: find all the instanceIDs before we start doing CSG, then we can do the Bake's in the same job that sets the meshes
            //          hopefully that will make it easier for Unity to not screw up the scheduling
            var bakingSettings = new NativeArray <BakeData>(colliders.Length, Allocator.TempJob);

            for (int i = 0; i < colliders.Length; i++)
            {
                var meshCollider = colliders[i].meshCollider;
                if (!meshCollider)
                {
                    bakingSettings[i] = new BakeData
                    {
                        instanceID = 0
                    };
                    continue;
                }

                var sharedMesh = colliders[i].sharedMesh;
                bakingSettings[i] = new BakeData
                {
                    convex     = colliderSettings.convex,
                    instanceID = sharedMesh.GetInstanceID()
                };
            }
            var bakeColliderJob = new BakeColliderJob
            {
                bakingSettings = bakingSettings.AsReadOnly()
            };
            // WHY ARE ALL OF THESE JOBS SEQUENTIAL ON THE SAME WORKER THREAD?
            var jobHandle = bakeColliderJob.Schedule(colliders.Length, 1);

            jobHandle.Complete();
            bakingSettings.Dispose(jobHandle);
            // TODO: is there a way to defer forcing the collider to update?
            for (int i = 0; i < colliders.Length; i++)
            {
                var meshCollider = colliders[i].meshCollider;
                if (!meshCollider)
                {
                    continue;
                }

                meshCollider.sharedMesh = colliders[i].sharedMesh;
            }
        }