diff --git a/Assets/Scripts/Bootstrap.cs b/Assets/Scripts/Bootstrap.cs index 0e5656e..49f0c49 100644 --- a/Assets/Scripts/Bootstrap.cs +++ b/Assets/Scripts/Bootstrap.cs @@ -27,6 +27,7 @@ public class Bootstrap : MonoBehaviour uq.ModDirectory = mod; uq.AdditionalArguments = ParseArgs(); uq.Camera = Camera.main; // This can be any one of four cameras for split-screen, each with its own culling layer + uq.SetVisualStyle(visualStyles[0]); } if (GUILayout.Button("Start Scourge of Armagon!")) @@ -36,6 +37,7 @@ public class Bootstrap : MonoBehaviour uq.ModDirectory = mod; uq.AdditionalArguments = ParseArgs(); uq.Camera = Camera.main; + uq.SetVisualStyle(visualStyles[0]); } if (GUILayout.Button("Start Dissolution of Eternity!")) @@ -45,6 +47,7 @@ public class Bootstrap : MonoBehaviour uq.ModDirectory = mod; uq.AdditionalArguments = ParseArgs(); uq.Camera = Camera.main; + uq.SetVisualStyle(visualStyles[0]); } GUILayout.Label("Mod directory:"); diff --git a/Assets/Scripts/Game/Entity.cs b/Assets/Scripts/Game/Entity.cs index 13a2e90..df28657 100644 --- a/Assets/Scripts/Game/Entity.cs +++ b/Assets/Scripts/Game/Entity.cs @@ -4,9 +4,10 @@ using UnityEngine.Rendering; public class Entity { private readonly int entityNum; + private readonly VisualStyle visualStyle; private GameObject gameObject; - + private MeshFilter meshFilter; private MeshRenderer meshRenderer; private SkinnedMeshRenderer skinnedMeshRenderer; @@ -15,9 +16,10 @@ public class Entity private GameObject brushModel; private GameObject worldModel; - public Entity(int entityNum) + public Entity(int entityNum, VisualStyle visualStyle) { this.entityNum = entityNum; + this.visualStyle = visualStyle; CreateGameObject(); } @@ -26,18 +28,10 @@ public class Entity gameObject = new GameObject($"Entity_{entityNum}"); skinnedMeshRenderer = gameObject.AddComponent(); - skinnedMeshRenderer.shadowCastingMode = ShadowCastingMode.Off; - skinnedMeshRenderer.receiveShadows = false; - skinnedMeshRenderer.lightProbeUsage = LightProbeUsage.Off; - skinnedMeshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off; skinnedMeshRenderer.enabled = false; meshFilter = gameObject.AddComponent(); meshRenderer = gameObject.AddComponent(); - meshRenderer.shadowCastingMode = ShadowCastingMode.Off; - meshRenderer.receiveShadows = false; - meshRenderer.lightProbeUsage = LightProbeUsage.Off; - meshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off; meshRenderer.enabled = false; } @@ -135,16 +129,14 @@ public class Entity private void AssignMeshRenderer() { - // DEBUG - we'll want to instantiate a prefab and assign materials from a preset collection - var material = new Material(Shader.Find("Universal Render Pipeline/Simple Lit")); if (aliasModel.IsAnimated) { - skinnedMeshRenderer.material = material; + visualStyle.SetupAliasModelRenderer(skinnedMeshRenderer); skinnedMeshRenderer.enabled = true; } else { - meshRenderer.material = material; + visualStyle.SetupAliasModelRenderer(meshRenderer); meshRenderer.enabled = true; } } diff --git a/Assets/Scripts/Game/GameState.cs b/Assets/Scripts/Game/GameState.cs index b1a0016..21d1d60 100644 --- a/Assets/Scripts/Game/GameState.cs +++ b/Assets/Scripts/Game/GameState.cs @@ -25,6 +25,7 @@ public class GameState public void NewMap(BrushModel worldModel) { Destroy(); + Resources.UnloadUnusedAssets(); worldGameObject = new GameObject(worldModel.Name); @@ -38,7 +39,6 @@ public class GameState { var subModelGO = new GameObject(subModel.Name); - // DEBUG - we'll want to instantiate prefabs for each sub-model and assign materials from a preset collection foreach (var surfaceMesh in subModel.SurfaceMeshes) { var meshGO = new GameObject(surfaceMesh.Mesh.name); @@ -47,19 +47,14 @@ public class GameState var mf = meshGO.AddComponent(); mf.sharedMesh = surfaceMesh.Mesh; - var material = new Material(Shader.Find("Universal Render Pipeline/Simple Lit")); + var mr = meshGO.AddComponent(); + uq.CurrentStyle.SetupWorldModelRenderer(mr); // TODO FIXME This is wrong for brush model entities + uint texNum = surfaceMesh.Texture.TextureNum; if (uq.GameAssets.TryGetTexture(texNum, out var texture)) { - material.mainTexture = texture; + uq.CurrentStyle.SetWorldModelTextures(mr.material, texture, null, null); } - - var mr = meshGO.AddComponent(); - mr.sharedMaterial = material; - mr.shadowCastingMode = ShadowCastingMode.Off; - mr.receiveShadows = false; - mr.lightProbeUsage = LightProbeUsage.Off; - mr.reflectionProbeUsage = ReflectionProbeUsage.Off; } return subModelGO; @@ -84,7 +79,7 @@ public class GameState { if (!entities.TryGetValue(entityNum, out var entity)) { - entity = new Entity(entityNum); + entity = new Entity(entityNum, uq.CurrentStyle); entities.Add(entityNum, entity); } diff --git a/Assets/Scripts/Modules/RenderModule.cs b/Assets/Scripts/Modules/RenderModule.cs index fb3698c..6f0837f 100644 --- a/Assets/Scripts/Modules/RenderModule.cs +++ b/Assets/Scripts/Modules/RenderModule.cs @@ -10,38 +10,20 @@ public partial class RenderModule { uq = uniQuake; BuildCallbacks(); - - zPos = globalZPos; - globalZPos -= 256f; } - private float xPos = -2048f; - private float zPos = 0f; - private static float globalZPos = 0f; - private int UploadAliasModel(string name, QAliasHeader header, QAliasFrameType frameType, QTriVertex[][] poseVertices, QTriangle[] triangles, QSTVert[] stVertices, QGLTexture[][] glTextures, QGLTexture[][] fbTextures) { - var sb = new System.Text.StringBuilder(); - foreach (var frame in header.frames) - { - sb.AppendLine($"- {frame.name} ({frame.numPoses} poses)"); - } - - Debug.Log($"Alias model '{name}' (frame type {frameType}) with {header.numVerts} vertices, {header.numTriangles} triangles, {header.numFrames} frame(s), {header.numPoses} pose(s):\n{sb}"); + Debug.Log($"Alias model '{name}' (frame type {frameType}) with {header.numVerts} vertices, {header.numTriangles} triangles, {header.numFrames} frame(s), {header.numPoses} pose(s)"); AliasModel aliasModel = new AliasModel(name, header, frameType); aliasModel.ImportMeshData(poseVertices, triangles, stVertices); uq.GameAssets.AddAliasModel(aliasModel); - string modelName = System.IO.Path.GetFileNameWithoutExtension(name); - var go = new GameObject(modelName); - go.transform.SetPositionAndRotation(new Vector3(xPos, 0, zPos), Quaternion.identity); - - aliasModel.Animate(0, out Mesh mesh, out float blendWeight); - + // DEBUG kept for reference for the moment, how to address skins & texture frames, and full-bright textures var material = new Material(Shader.Find("Universal Render Pipeline/Simple Lit")); uint texNum = glTextures[0][0].texNum; if (uq.GameAssets.TryGetTexture(texNum, out var texture)) @@ -59,35 +41,7 @@ public partial class RenderModule material.SetColor("_EmissionColor", Color.white); } } - - if (header.numPoses > 1) - { - var mr = go.AddComponent(); - mr.material = material; - - mr.sharedMesh = mesh; - mr.shadowCastingMode = ShadowCastingMode.Off; - mr.receiveShadows = false; - mr.lightProbeUsage = LightProbeUsage.Off; - mr.reflectionProbeUsage = ReflectionProbeUsage.Off; - - var animator = go.AddComponent(); - animator.aliasModel = aliasModel; - } - else - { - var mf = go.AddComponent(); - mf.sharedMesh = mesh; - var mr = go.AddComponent(); - mr.material = material; - - mr.shadowCastingMode = ShadowCastingMode.Off; - mr.receiveShadows = false; - mr.lightProbeUsage = LightProbeUsage.Off; - mr.reflectionProbeUsage = ReflectionProbeUsage.Off; - } - - xPos += 128f; + return 1; } diff --git a/Assets/Scripts/UniQuake.cs b/Assets/Scripts/UniQuake.cs index e4c32d7..ab07066 100644 --- a/Assets/Scripts/UniQuake.cs +++ b/Assets/Scripts/UniQuake.cs @@ -33,6 +33,8 @@ public partial class UniQuake: MonoBehaviour public GameAssets GameAssets { get; private set; } public GameState GameState { get; private set; } + public VisualStyle CurrentStyle { get; private set; } + private VisualStyle nextStyle; private Action logHandler; private readonly StringBuilder logBuffer = new StringBuilder(); @@ -199,6 +201,18 @@ public partial class UniQuake: MonoBehaviour logBuffer.Clear(); } } + + public void SetVisualStyle(VisualStyle style) + { + if (CurrentStyle == null) + { + CurrentStyle = style; + return; + } + + // Wait to swap styles until next map load + nextStyle = style; + } } public enum MissionPack diff --git a/Assets/Scripts/VisualStyle.cs b/Assets/Scripts/VisualStyle.cs index 036b680..7445a27 100644 --- a/Assets/Scripts/VisualStyle.cs +++ b/Assets/Scripts/VisualStyle.cs @@ -7,13 +7,13 @@ using UnityEngine.Rendering; public class VisualStyle : ScriptableObject { [SerializeField] - private Material aliasModelMaterial; + protected Material aliasModelMaterial; [SerializeField] - private Material brushModelMaterial; // TODO: not sure if this should be separate or combined into one entityMaterial + protected Material brushModelMaterial; // TODO: not sure if this should be separate or combined into one entityMaterial [SerializeField] - private Material worldModelMaterial; // TODO: split into wall, liquid, sky, etc + protected Material worldModelMaterial; // TODO: split into wall, liquid, sky, etc // TODO: add particle effects