diff --git a/Assets/Scripts/Game/GameAssets.cs b/Assets/Scripts/Game/GameAssets.cs index bddbcd7..d365889 100644 --- a/Assets/Scripts/Game/GameAssets.cs +++ b/Assets/Scripts/Game/GameAssets.cs @@ -52,7 +52,7 @@ public class GameAssets public void SetWorldModel(BrushModel brushModel) { - worldModel?.Dispose(); // TODO: also need to clean up any GameObjects made from this + worldModel?.Dispose(); worldModel = brushModel; } diff --git a/Assets/Scripts/Game/GameState.cs b/Assets/Scripts/Game/GameState.cs index 7cf71ad..9380756 100644 --- a/Assets/Scripts/Game/GameState.cs +++ b/Assets/Scripts/Game/GameState.cs @@ -1,13 +1,67 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +using UnityEngine.Rendering; public class GameState { private readonly UniQuake uq; + private GameObject worldGameObject; + public GameState(UniQuake uniQuake) { uq = uniQuake; } + + public void Destroy() + { + DestroyWorld(); + } + + public void NewMap(BrushModel worldModel) + { + DestroyWorld(); + + // DEBUG - we'll want to instantiate prefabs for each submodel and assign materials from a preset collection + worldGameObject = new GameObject(worldModel.Name); + for (int i = 0; i < worldModel.SubModelCount; ++i) + { + var subModel = worldModel.GetSubModel(i); + var subModelGO = new GameObject($"SubModel_{i}"); + subModelGO.transform.SetParent(worldGameObject.transform); + + foreach (var surfaceMesh in subModel.SurfaceMeshes) + { + var meshGO = new GameObject(surfaceMesh.Mesh.name); + meshGO.transform.SetParent(subModelGO.transform); + + var mf = meshGO.AddComponent(); + mf.sharedMesh = surfaceMesh.Mesh; + + var material = new Material(Shader.Find("Universal Render Pipeline/Simple Lit")); + uint texNum = surfaceMesh.Texture.TextureNum; + if (uq.GameAssets.TryGetTexture(texNum, out var texture)) + { + material.mainTexture = texture; + } + + var mr = meshGO.AddComponent(); + mr.sharedMaterial = material; + mr.shadowCastingMode = ShadowCastingMode.Off; + mr.receiveShadows = false; + mr.lightProbeUsage = LightProbeUsage.Off; + mr.reflectionProbeUsage = ReflectionProbeUsage.Off; + } + } + } + + private void DestroyWorld() + { + if (worldGameObject != null) + { + Object.Destroy(worldGameObject); + worldGameObject = null; + } + } } diff --git a/Assets/Scripts/Modules/RenderModule.cs b/Assets/Scripts/Modules/RenderModule.cs index 9806760..b0123eb 100644 --- a/Assets/Scripts/Modules/RenderModule.cs +++ b/Assets/Scripts/Modules/RenderModule.cs @@ -107,42 +107,11 @@ public partial class RenderModule { Debug.Log($"World model '{model.name}' with {model.numVertices} vertices, {model.numEdges} edges, {model.numSurfaces} surfaces"); - var brushModel = new BrushModel(model.name); - brushModel.ImportMeshData(model); + var worldModel = new BrushModel(model.name); + worldModel.ImportMeshData(model); - uq.GameAssets.SetWorldModel(brushModel); - - // DEBUG - var worldGO = new GameObject(model.name); - for (int i = 0; i < brushModel.SubModelCount; ++i) - { - var subModel = brushModel.GetSubModel(i); - var subModelGO = new GameObject($"SubModel_{i}"); - subModelGO.transform.SetParent(worldGO.transform); - - foreach (var surfaceMesh in subModel.SurfaceMeshes) - { - var meshGO = new GameObject(surfaceMesh.Mesh.name); - meshGO.transform.SetParent(subModelGO.transform); - - var mf = meshGO.AddComponent(); - mf.sharedMesh = surfaceMesh.Mesh; - - var material = new Material(Shader.Find("Universal Render Pipeline/Simple Lit")); - uint texNum = surfaceMesh.Texture.TextureNum; - if (uq.GameAssets.TryGetTexture(texNum, out var texture)) - { - material.mainTexture = texture; - } - - var mr = meshGO.AddComponent(); - mr.sharedMaterial = material; - mr.shadowCastingMode = ShadowCastingMode.Off; - mr.receiveShadows = false; - mr.lightProbeUsage = LightProbeUsage.Off; - mr.reflectionProbeUsage = ReflectionProbeUsage.Off; - } - } + uq.GameAssets.SetWorldModel(worldModel); + uq.GameState.NewMap(worldModel); return 1; } diff --git a/Assets/Scripts/UniQuake.cs b/Assets/Scripts/UniQuake.cs index bf3a1a5..bc04b8c 100644 --- a/Assets/Scripts/UniQuake.cs +++ b/Assets/Scripts/UniQuake.cs @@ -35,7 +35,7 @@ public partial class UniQuake: MonoBehaviour public GameState GameState { get; private set; } private Action logHandler; - private StringBuilder logBuffer = new StringBuilder(); + private readonly StringBuilder logBuffer = new StringBuilder(); void Start() { @@ -158,8 +158,10 @@ public partial class UniQuake: MonoBehaviour private void OnDestroy() { + GameState.Destroy(); GameAssets.Destroy(); + gameModule.Destroy(); renderModule.Destroy(); systemModule.Destroy();