Browse Source

Use visual style reference to set up world and entity renderers and textures. With this we can clear out a LOT of debug code that was kept around for reference.

console
Nico de Poel 5 years ago
parent
commit
2e35a148b8
  1. 3
      Assets/Scripts/Bootstrap.cs
  2. 20
      Assets/Scripts/Game/Entity.cs
  3. 17
      Assets/Scripts/Game/GameState.cs
  4. 52
      Assets/Scripts/Modules/RenderModule.cs
  5. 14
      Assets/Scripts/UniQuake.cs
  6. 6
      Assets/Scripts/VisualStyle.cs

3
Assets/Scripts/Bootstrap.cs

@ -27,6 +27,7 @@ public class Bootstrap : MonoBehaviour
uq.ModDirectory = mod; uq.ModDirectory = mod;
uq.AdditionalArguments = ParseArgs(); 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.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!")) if (GUILayout.Button("Start Scourge of Armagon!"))
@ -36,6 +37,7 @@ public class Bootstrap : MonoBehaviour
uq.ModDirectory = mod; uq.ModDirectory = mod;
uq.AdditionalArguments = ParseArgs(); uq.AdditionalArguments = ParseArgs();
uq.Camera = Camera.main; uq.Camera = Camera.main;
uq.SetVisualStyle(visualStyles[0]);
} }
if (GUILayout.Button("Start Dissolution of Eternity!")) if (GUILayout.Button("Start Dissolution of Eternity!"))
@ -45,6 +47,7 @@ public class Bootstrap : MonoBehaviour
uq.ModDirectory = mod; uq.ModDirectory = mod;
uq.AdditionalArguments = ParseArgs(); uq.AdditionalArguments = ParseArgs();
uq.Camera = Camera.main; uq.Camera = Camera.main;
uq.SetVisualStyle(visualStyles[0]);
} }
GUILayout.Label("Mod directory:"); GUILayout.Label("Mod directory:");

20
Assets/Scripts/Game/Entity.cs

@ -4,9 +4,10 @@ using UnityEngine.Rendering;
public class Entity public class Entity
{ {
private readonly int entityNum; private readonly int entityNum;
private readonly VisualStyle visualStyle;
private GameObject gameObject; private GameObject gameObject;
private MeshFilter meshFilter; private MeshFilter meshFilter;
private MeshRenderer meshRenderer; private MeshRenderer meshRenderer;
private SkinnedMeshRenderer skinnedMeshRenderer; private SkinnedMeshRenderer skinnedMeshRenderer;
@ -15,9 +16,10 @@ public class Entity
private GameObject brushModel; private GameObject brushModel;
private GameObject worldModel; private GameObject worldModel;
public Entity(int entityNum)
public Entity(int entityNum, VisualStyle visualStyle)
{ {
this.entityNum = entityNum; this.entityNum = entityNum;
this.visualStyle = visualStyle;
CreateGameObject(); CreateGameObject();
} }
@ -26,18 +28,10 @@ public class Entity
gameObject = new GameObject($"Entity_{entityNum}"); gameObject = new GameObject($"Entity_{entityNum}");
skinnedMeshRenderer = gameObject.AddComponent<SkinnedMeshRenderer>(); skinnedMeshRenderer = gameObject.AddComponent<SkinnedMeshRenderer>();
skinnedMeshRenderer.shadowCastingMode = ShadowCastingMode.Off;
skinnedMeshRenderer.receiveShadows = false;
skinnedMeshRenderer.lightProbeUsage = LightProbeUsage.Off;
skinnedMeshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off;
skinnedMeshRenderer.enabled = false; skinnedMeshRenderer.enabled = false;
meshFilter = gameObject.AddComponent<MeshFilter>(); meshFilter = gameObject.AddComponent<MeshFilter>();
meshRenderer = gameObject.AddComponent<MeshRenderer>(); meshRenderer = gameObject.AddComponent<MeshRenderer>();
meshRenderer.shadowCastingMode = ShadowCastingMode.Off;
meshRenderer.receiveShadows = false;
meshRenderer.lightProbeUsage = LightProbeUsage.Off;
meshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off;
meshRenderer.enabled = false; meshRenderer.enabled = false;
} }
@ -135,16 +129,14 @@ public class Entity
private void AssignMeshRenderer() 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) if (aliasModel.IsAnimated)
{ {
skinnedMeshRenderer.material = material;
visualStyle.SetupAliasModelRenderer(skinnedMeshRenderer);
skinnedMeshRenderer.enabled = true; skinnedMeshRenderer.enabled = true;
} }
else else
{ {
meshRenderer.material = material;
visualStyle.SetupAliasModelRenderer(meshRenderer);
meshRenderer.enabled = true; meshRenderer.enabled = true;
} }
} }

17
Assets/Scripts/Game/GameState.cs

@ -25,6 +25,7 @@ public class GameState
public void NewMap(BrushModel worldModel) public void NewMap(BrushModel worldModel)
{ {
Destroy(); Destroy();
Resources.UnloadUnusedAssets();
worldGameObject = new GameObject(worldModel.Name); worldGameObject = new GameObject(worldModel.Name);
@ -38,7 +39,6 @@ public class GameState
{ {
var subModelGO = new GameObject(subModel.Name); 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) foreach (var surfaceMesh in subModel.SurfaceMeshes)
{ {
var meshGO = new GameObject(surfaceMesh.Mesh.name); var meshGO = new GameObject(surfaceMesh.Mesh.name);
@ -47,19 +47,14 @@ public class GameState
var mf = meshGO.AddComponent<MeshFilter>(); var mf = meshGO.AddComponent<MeshFilter>();
mf.sharedMesh = surfaceMesh.Mesh; mf.sharedMesh = surfaceMesh.Mesh;
var material = new Material(Shader.Find("Universal Render Pipeline/Simple Lit"));
var mr = meshGO.AddComponent<MeshRenderer>();
uq.CurrentStyle.SetupWorldModelRenderer(mr); // TODO FIXME This is wrong for brush model entities
uint texNum = surfaceMesh.Texture.TextureNum; uint texNum = surfaceMesh.Texture.TextureNum;
if (uq.GameAssets.TryGetTexture(texNum, out var texture)) if (uq.GameAssets.TryGetTexture(texNum, out var texture))
{ {
material.mainTexture = texture;
uq.CurrentStyle.SetWorldModelTextures(mr.material, texture, null, null);
} }
var mr = meshGO.AddComponent<MeshRenderer>();
mr.sharedMaterial = material;
mr.shadowCastingMode = ShadowCastingMode.Off;
mr.receiveShadows = false;
mr.lightProbeUsage = LightProbeUsage.Off;
mr.reflectionProbeUsage = ReflectionProbeUsage.Off;
} }
return subModelGO; return subModelGO;
@ -84,7 +79,7 @@ public class GameState
{ {
if (!entities.TryGetValue(entityNum, out var entity)) if (!entities.TryGetValue(entityNum, out var entity))
{ {
entity = new Entity(entityNum);
entity = new Entity(entityNum, uq.CurrentStyle);
entities.Add(entityNum, entity); entities.Add(entityNum, entity);
} }

52
Assets/Scripts/Modules/RenderModule.cs

@ -10,38 +10,20 @@ public partial class RenderModule
{ {
uq = uniQuake; uq = uniQuake;
BuildCallbacks(); 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, private int UploadAliasModel(string name, QAliasHeader header, QAliasFrameType frameType,
QTriVertex[][] poseVertices, QTriangle[] triangles, QSTVert[] stVertices, QTriVertex[][] poseVertices, QTriangle[] triangles, QSTVert[] stVertices,
QGLTexture[][] glTextures, QGLTexture[][] fbTextures) 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 aliasModel = new AliasModel(name, header, frameType);
aliasModel.ImportMeshData(poseVertices, triangles, stVertices); aliasModel.ImportMeshData(poseVertices, triangles, stVertices);
uq.GameAssets.AddAliasModel(aliasModel); 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")); var material = new Material(Shader.Find("Universal Render Pipeline/Simple Lit"));
uint texNum = glTextures[0][0].texNum; uint texNum = glTextures[0][0].texNum;
if (uq.GameAssets.TryGetTexture(texNum, out var texture)) if (uq.GameAssets.TryGetTexture(texNum, out var texture))
@ -59,35 +41,7 @@ public partial class RenderModule
material.SetColor("_EmissionColor", Color.white); material.SetColor("_EmissionColor", Color.white);
} }
} }
if (header.numPoses > 1)
{
var mr = go.AddComponent<SkinnedMeshRenderer>();
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<AliasModelAnimator>();
animator.aliasModel = aliasModel;
}
else
{
var mf = go.AddComponent<MeshFilter>();
mf.sharedMesh = mesh;
var mr = go.AddComponent<MeshRenderer>();
mr.material = material;
mr.shadowCastingMode = ShadowCastingMode.Off;
mr.receiveShadows = false;
mr.lightProbeUsage = LightProbeUsage.Off;
mr.reflectionProbeUsage = ReflectionProbeUsage.Off;
}
xPos += 128f;
return 1; return 1;
} }

14
Assets/Scripts/UniQuake.cs

@ -33,6 +33,8 @@ public partial class UniQuake: MonoBehaviour
public GameAssets GameAssets { get; private set; } public GameAssets GameAssets { get; private set; }
public GameState GameState { get; private set; } public GameState GameState { get; private set; }
public VisualStyle CurrentStyle { get; private set; }
private VisualStyle nextStyle;
private Action<string> logHandler; private Action<string> logHandler;
private readonly StringBuilder logBuffer = new StringBuilder(); private readonly StringBuilder logBuffer = new StringBuilder();
@ -199,6 +201,18 @@ public partial class UniQuake: MonoBehaviour
logBuffer.Clear(); 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 public enum MissionPack

6
Assets/Scripts/VisualStyle.cs

@ -7,13 +7,13 @@ using UnityEngine.Rendering;
public class VisualStyle : ScriptableObject public class VisualStyle : ScriptableObject
{ {
[SerializeField] [SerializeField]
private Material aliasModelMaterial;
protected Material aliasModelMaterial;
[SerializeField] [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] [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 // TODO: add particle effects

Loading…
Cancel
Save