From 9b73dfe80abd09ec6b72efcab9213a172bbad076 Mon Sep 17 00:00:00 2001 From: xen-42 Date: Mon, 6 Jan 2025 00:23:24 -0500 Subject: [PATCH] Add option to toggle quantum object visualization separate from debug --- NewHorizons/Builder/Props/QuantumBuilder.cs | 68 ++++++++++--------- NewHorizons/Main.cs | 2 + .../Utility/Geometry/BoxShapeVisualizer.cs | 13 ++-- NewHorizons/default-config.json | 6 ++ 4 files changed, 52 insertions(+), 37 deletions(-) diff --git a/NewHorizons/Builder/Props/QuantumBuilder.cs b/NewHorizons/Builder/Props/QuantumBuilder.cs index dff1d3a7..0448eb7d 100644 --- a/NewHorizons/Builder/Props/QuantumBuilder.cs +++ b/NewHorizons/Builder/Props/QuantumBuilder.cs @@ -12,17 +12,17 @@ namespace NewHorizons.Builder.Props { public static class QuantumBuilder { - + public static void Make(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup) { - switch(quantumGroup.type) + switch (quantumGroup.type) { - case QuantumGroupType.Sockets: MakeSocketGroup (go, sector, config, mod, quantumGroup, propsInGroup); return; - case QuantumGroupType.States: MakeStateGroup (go, sector, config, mod, quantumGroup, propsInGroup); return; - // case PropModule.QuantumGroupType.Shuffle: MakeShuffleGroup(go, sector, config, mod, quantumGroup, propsInGroup); return; + case QuantumGroupType.Sockets: MakeSocketGroup(go, sector, config, mod, quantumGroup, propsInGroup); return; + case QuantumGroupType.States: MakeStateGroup(go, sector, config, mod, quantumGroup, propsInGroup); return; + // case PropModule.QuantumGroupType.Shuffle: MakeShuffleGroup(go, sector, config, mod, quantumGroup, propsInGroup); return; } } - + // TODO: Socket groups that have an equal number of props and sockets // Nice to have: socket groups that specify a filledSocketObject and an emptySocketObject (eg the archway in the giant's deep tower) public static void MakeSocketGroup(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup) @@ -31,7 +31,7 @@ namespace NewHorizons.Builder.Props groupRoot.transform.parent = sector?.transform ?? go.transform; groupRoot.transform.localPosition = Vector3.zero; groupRoot.transform.localEulerAngles = Vector3.zero; - + var sockets = new QuantumSocket[quantumGroup.sockets.Length]; for (int i = 0; i < quantumGroup.sockets.Length; i++) { @@ -44,7 +44,7 @@ namespace NewHorizons.Builder.Props socket.SetActive(true); } - foreach(var prop in propsInGroup) + foreach (var prop in propsInGroup) { prop.SetActive(false); var quantumObject = prop.AddComponent(); @@ -55,7 +55,7 @@ namespace NewHorizons.Builder.Props quantumObject._childSockets = new List(); // TODO: support _alignWithGravity? if (prop.GetComponentInChildren() == null) AddBoundsVisibility(prop); - prop.SetActive(true); + prop.SetActive(true); } } @@ -72,7 +72,7 @@ namespace NewHorizons.Builder.Props groupRoot.transform.localPosition = Vector3.zero; var states = new List(); - foreach(var prop in propsInGroup) + foreach (var prop in propsInGroup) { prop.transform.parent = groupRoot.transform; var state = prop.AddComponent(); @@ -87,7 +87,7 @@ namespace NewHorizons.Builder.Props if (quantumGroup.hasEmptyState) { var template = propsInGroup[0]; - + var empty = new GameObject("Empty State"); empty.transform.parent = groupRoot.transform; var state = empty.AddComponent(); @@ -97,8 +97,8 @@ namespace NewHorizons.Builder.Props var boxShape = empty.AddComponent(); boxShape.center = boxBounds.center; boxShape.extents = boxBounds.size; - if (Main.Debug) empty.AddComponent(); - + empty.AddComponent(); + empty.AddComponent(); } @@ -121,43 +121,43 @@ namespace NewHorizons.Builder.Props shuffleParent.SetActive(false); shuffleParent.transform.parent = sector?.transform ?? go.transform; shuffleParent.transform.localPosition = Vector3.zero; - propsInGroup.ToList().ForEach(p => p.transform.parent = shuffleParent.transform); + propsInGroup.ToList().ForEach(p => p.transform.parent = shuffleParent.transform); var shuffle = shuffleParent.AddComponent(); shuffle._shuffledObjects = propsInGroup.Select(p => p.transform).ToArray(); shuffle.Awake(); // this doesn't get called on its own for some reason. what? how? - + AddBoundsVisibility(shuffleParent); shuffleParent.SetActive(true); } - + struct BoxShapeReciever { public MeshFilter f; public SkinnedMeshRenderer s; - public GameObject g; + public GameObject gameObject; } public static void AddBoundsVisibility(GameObject g) { var meshFilters = g.GetComponentsInChildren(); var skinnedMeshRenderers = g.GetComponentsInChildren(); - + var boxShapeRecievers = meshFilters - .Select(f => new BoxShapeReciever() { f=f, g=f.gameObject }) - .Concat ( - skinnedMeshRenderers.Select(s => new BoxShapeReciever() { s=s, g=s.gameObject }) + .Select(f => new BoxShapeReciever() { f = f, gameObject = f.gameObject }) + .Concat( + skinnedMeshRenderers.Select(s => new BoxShapeReciever() { s = s, gameObject = s.gameObject }) ) .ToList(); - foreach(var boxshapeReciever in boxShapeRecievers) + foreach (var boxshapeReciever in boxShapeRecievers) { - var box = boxshapeReciever.g.AddComponent(); - boxshapeReciever.g.AddComponent(); - if (Main.Debug) boxshapeReciever.g.AddComponent(); + var box = boxshapeReciever.gameObject.AddComponent(); + boxshapeReciever.gameObject.AddComponent(); + boxshapeReciever.gameObject.AddComponent(); - var fixer = boxshapeReciever.g.AddComponent(); + var fixer = boxshapeReciever.gameObject.AddComponent(); fixer.shape = box; fixer.meshFilter = boxshapeReciever.f; fixer.skinnedMeshRenderer = boxshapeReciever.s; @@ -169,7 +169,7 @@ namespace NewHorizons.Builder.Props { var meshFilters = g.GetComponentsInChildren(); var corners = meshFilters.SelectMany(m => GetMeshCorners(m, g)).ToList(); - + Bounds b = new Bounds(corners[0], Vector3.zero); corners.ForEach(corner => b.Encapsulate(corner)); @@ -191,9 +191,9 @@ namespace NewHorizons.Builder.Props new Vector3(bounds.max.x, bounds.min.y, bounds.max.z), new Vector3(bounds.max.x, bounds.max.y, bounds.min.z), }; - + var globalCorners = localCorners.Select(localCorner => m.transform.TransformPoint(localCorner)).ToArray(); - + if (relativeTo == null) return globalCorners; return globalCorners.Select(globalCorner => relativeTo.transform.InverseTransformPoint(globalCorner)).ToArray(); @@ -213,9 +213,13 @@ namespace NewHorizons.Builder.Props public MeshFilter meshFilter; public SkinnedMeshRenderer skinnedMeshRenderer; - void Update() + public void Update() { - if (meshFilter == null && skinnedMeshRenderer == null) { NHLogger.LogVerbose("Useless BoxShapeFixer, destroying"); DestroyImmediate(this); } + if (meshFilter == null && skinnedMeshRenderer == null) + { + NHLogger.LogVerbose("Useless BoxShapeFixer, destroying"); + DestroyImmediate(this); + } Mesh sharedMesh = null; if (meshFilter != null) sharedMesh = meshFilter.sharedMesh; @@ -223,7 +227,7 @@ namespace NewHorizons.Builder.Props if (sharedMesh == null) return; if (sharedMesh.bounds.size == Vector3.zero) return; - + shape.size = sharedMesh.bounds.size; shape.center = sharedMesh.bounds.center; diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 97b861ab..20123633 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -47,6 +47,7 @@ namespace NewHorizons // Settings public static bool Debug { get; private set; } + public static bool VisualizeQuantumObjects { get; private set; } public static bool VerboseLogs { get; private set; } public static bool SequentialPreCaching { get; private set; } public static bool CustomTitleScreen { get; private set; } @@ -134,6 +135,7 @@ namespace NewHorizons var currentScene = SceneManager.GetActiveScene().name; Debug = config.GetSettingsValue(nameof(Debug)); + VisualizeQuantumObjects = config.GetSettingsValue(nameof(VisualizeQuantumObjects)); VerboseLogs = config.GetSettingsValue(nameof(VerboseLogs)); SequentialPreCaching = config.GetSettingsValue(nameof(SequentialPreCaching)); diff --git a/NewHorizons/Utility/Geometry/BoxShapeVisualizer.cs b/NewHorizons/Utility/Geometry/BoxShapeVisualizer.cs index 77dbf6cf..039e7bdc 100644 --- a/NewHorizons/Utility/Geometry/BoxShapeVisualizer.cs +++ b/NewHorizons/Utility/Geometry/BoxShapeVisualizer.cs @@ -4,16 +4,19 @@ namespace NewHorizons.Utility.Geometry { public class BoxShapeVisualizer : MonoBehaviour { - BoxShape box; + private BoxShape _box; - void Awake() + public void Awake() { - box = GetComponent(); + _box = GetComponent(); } - void OnRenderObject() + public void OnRenderObject() { - Popcron.Gizmos.Cube(transform.TransformPoint(box.center), transform.rotation, Vector3.Scale(box.size, transform.lossyScale)); + if (Main.Debug && Main.VisualizeQuantumObjects) + { + Popcron.Gizmos.Cube(transform.TransformPoint(_box.center), transform.rotation, Vector3.Scale(_box.size, transform.lossyScale)); + } } } } diff --git a/NewHorizons/default-config.json b/NewHorizons/default-config.json index e4b87a61..4f3239c2 100644 --- a/NewHorizons/default-config.json +++ b/NewHorizons/default-config.json @@ -16,6 +16,12 @@ "value": false, "tooltip": "Enables the debug raycast, visible quantum object colliders, and debug options menu." }, + "VisualizeQuantumObjects": { + "title": "Visualize Quantum Objects", + "type": "toggle", + "value": false, + "tooltip": "Draws boundaries around quantum objects when Debug mode is on." + }, "VerboseLogs": { "title": "Verbose Logs", "type": "toggle",