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; }
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 }; }
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); }