From 453664031c0e4cfba1c896fcbf0457fc926d2372 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Thu, 8 Jul 2021 16:44:25 +0200 Subject: [PATCH] Moved creation of game objects for the world to GameState, which is where the bridge between Quake's game logic and Unity's game objects will happen. Also includes destruction of said game objects, so that the world is properly destroyed and recreated on map change. --- Assets/Scripts/Game/GameAssets.cs | 2 +- Assets/Scripts/Game/GameState.cs | 54 ++++++++++++++++++++++++++ Assets/Scripts/Modules/RenderModule.cs | 39 ++----------------- Assets/Scripts/UniQuake.cs | 4 +- 4 files changed, 62 insertions(+), 37 deletions(-) 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();