static RockGeneratorGUI()
        {
            CHARACTER_WIDTH = 7;

            var settings = new RockGenerationSettings();

            MAX_LABEL_WIDTH = new[] {
                nameof(settings.StockDensity),
                nameof(settings.TargetTriangleCount),
                nameof(settings.Distortion),
            }.Max(n => n.Length) * CHARACTER_WIDTH;
        }
Example #2
0
        void Start()
        {
            var settings = new RockGenerationSettings {
                GridSettings = new VoronoiGridSettings {
                    Size       = 5,
                    Randomness = .75f
                },
                StockDensity        = 8,
                TargetTriangleCount = 220,
                Distortion          = .5f,
                PatternSize         = 1.35f,
                Transform           = Convert.FromUnityMatrix(UnityEngine.Matrix4x4.TRS(new Vector3(2, 2, 2),
                                                                                        Quaternion.identity,
                                                                                        Vector3.one))
            };

            generator = new RockGenerator {
                Settings = settings
            };
        }
Example #3
0
        Mesh CreateRandomRock()
        {
            // Copy existing settings
            var settings = new RockGenerationSettings(generator.Settings);

            // Modify rock shape
            UnityEngine.Matrix4x4 rockTransform = UnityEngine.Matrix4x4.TRS(
                new Vector3(2, 2, 2),
                Random.rotation,
                new Vector3(Random.Range(.5f, 1.5f),
                            Random.Range(.5f, 1.5f),
                            Random.Range(.5f, 1.5f))
                );
            settings.Transform = Convert.FromUnityMatrix(rockTransform);

            // Apply settings. Generator will optimize generation base on which settings was changed.
            generator.Settings = settings;

            // Generator do not use Unity's types, so it can be used outside of Unity
            // Notable different are: Matrix4x4, Mesh
            return(Convert.ToUnityMesh(generator.MakeRock()));
        }
        public static bool OnGUI(RockGenerator generator)
        {
            var groupStyle  = GUI.skin.box;
            var newSettings = new RockGenerationSettings(generator.Settings);

            using (var vs = new VerticalScope(groupStyle))
            {
                newSettings.StockDensity = SettingSlider(nameof(newSettings.StockDensity),
                                                         newSettings.StockDensity, 2, 16, "N1");
                newSettings.TargetTriangleCount = Mathf.RoundToInt(
                    SettingSlider(nameof(newSettings.TargetTriangleCount),
                                  newSettings.TargetTriangleCount, 50, 2000,
                                  "N0",
                                  logScale: true
                                  )
                    );
            }

            using (var vs = new VerticalScope(groupStyle))
            {
                using (var gcs = new GUIChangedScope())
                {
                    var Uniformity = Mathf.Clamp01(1 - newSettings.GridSettings.Randomness);
                    Uniformity = SettingSlider(nameof(Uniformity), Uniformity, 0, 1);

                    if (GUI.changed)
                    {
                        newSettings.GridSettings = new VoronoiGridSettings(newSettings.GridSettings)
                        {
                            Randomness = 1 - Uniformity
                        };
                    }
                }

                newSettings.Distortion = SettingSlider(nameof(newSettings.Distortion),
                                                       newSettings.Distortion, -1, 1);
                newSettings.PatternSize = SettingSlider(nameof(newSettings.PatternSize),
                                                        newSettings.PatternSize, .5f, 2.5f);
            }

            using (var vs = new VerticalScope(groupStyle))
                using (var gcs = new GUIChangedScope())
                {
                    var scale = newSettings.Scale;
                    Label("Shape:");
                    var newX = SettingSlider("X", Mathf.Clamp((float)scale.X, .5f, 2), 0.5f, 2);
                    var newY = SettingSlider("Y", Mathf.Clamp((float)scale.Y, .5f, 2), 0.5f, 2);
                    var newZ = (float)scale.Z;

                    if (GUI.changed)
                    {
                        var m = UnityEngine.Matrix4x4.TRS(DEFAULT_POS,
                                                          rotation,
                                                          new Vector3(newX, newY, newZ));
                        newSettings.Transform = Convert.FromUnityMatrix(m);
                    }
                }

            if (Button("Make Rock"))
            {
                var newGridSettings = new VoronoiGridSettings(newSettings.GridSettings);
                newGridSettings.Randomness += 1e-6f;

                newSettings.Transform = Convert.FromUnityMatrix(
                    UnityEngine.Matrix4x4.TRS(DEFAULT_POS + Random.insideUnitSphere,
                                              rotation = Random.rotation,
                                              Convert.ToVector3(newSettings.Scale))
                    );

                newSettings.GridSettings = newGridSettings;
            }

            var settingsChanged = GUI.changed;

            if (settingsChanged)
            {
                generator.Settings = newSettings;
            }

            if (Button("Save this one"))
            {
                var path = FileSaver.SaveMesh(generator.LatestMesh, "rock");
                OnFileExported(path);
            }

            return(settingsChanged);
        }