private static void HandleSimulationStepMode(Scene scene,
                                                     Simulation simulation,
                                                     IO.Utils.YamlObject script)
        {
            if (!script.Fields.ContainsKey("m_enableAutomaticStepping"))
            {
                return;
            }

            var enableAutoStepping = true;

            script.Fields["m_enableAutomaticStepping"].TryGet(out enableAutoStepping);

            simulation.AutoSteppingMode = enableAutoStepping ?
                                          Simulation.AutoSteppingModes.FixedUpdate :
                                          Simulation.AutoSteppingModes.Disabled;
            UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(scene);
        }
        private static void HandleSolverSettings(Scene scene,
                                                 Simulation simulation,
                                                 IO.Utils.YamlObject script)
        {
            var isUpToDate = !script.Fields.ContainsKey("m_warmStartingDirectContacts");

            // Flag scene dirty when we have the old version in the file.
            if (!isUpToDate)
            {
                UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(scene);
            }

            if (simulation.SolverSettings != null || isUpToDate)
            {
                return;
            }

            var warmStartingContacts     = false;
            var numRestingIterations     = -1;
            var numDryFrictionIterations = -1;

            try {
                if (!script.Fields["m_warmStartingDirectContacts"].TryGet(out warmStartingContacts))
                {
                    warmStartingContacts = false;
                }
                if (!script.Fields["m_numRestingIterations"].TryGet(out numRestingIterations))
                {
                    numRestingIterations = -1;
                }
                if (!script.Fields["m_numDryFrictionIterations"].TryGet(out numDryFrictionIterations))
                {
                    numDryFrictionIterations = -1;
                }
            }
            catch (System.Exception) {
                return;
            }

            // Ignore if default values were used.
            if (warmStartingContacts == false && numRestingIterations < 0 && numDryFrictionIterations < 0)
            {
                return;
            }

            var createSettings = EditorUtility.DisplayDialog("Solver settings asset",
                                                             "Solver settings moved from Simulation to SolverSettings asset.\n\nCreate new solver settings asset with previous values?",
                                                             "Yes",
                                                             "No");

            if (!createSettings)
            {
                return;
            }

            var path = EditorUtility.SaveFilePanel("Create new Solver Settings",
                                                   "Assets",
                                                   "solver settings.asset",
                                                   "asset");

            if (path == string.Empty)
            {
                return;
            }

            var info           = new FileInfo(path);
            var relPath        = IO.Utils.MakeRelative(path, Application.dataPath);
            var solverSettings = AGXUnity.ScriptAsset.Create <AGXUnity.SolverSettings>();

            solverSettings.name = info.Name;
            AssetDatabase.CreateAsset(solverSettings, relPath + (info.Extension == ".asset" ? "" : ".asset"));
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();

            solverSettings.WarmStartDirectContacts = warmStartingContacts;
            if (numRestingIterations >= 0)
            {
                solverSettings.RestingIterations = numRestingIterations;
            }
            if (numDryFrictionIterations >= 0)
            {
                solverSettings.DryFrictionIterations = numDryFrictionIterations;
            }
            simulation.SolverSettings = solverSettings;
        }