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; * }*/ }
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; } }