Browse Source

Reworked visual style setup, reducing entity materials to just one material for both alias models and brush models, and turning material creation into a separate step. This makes it more obvious when new materials are created, and allows for more potential customization in sub-classes.

console
Nico de Poel 5 years ago
parent
commit
b3175ebb3b
  1. 12
      Assets/Scripts/Game/Entity.cs
  2. 5
      Assets/Scripts/Game/GameState.cs
  3. 52
      Assets/Scripts/VisualStyle.cs
  4. 5
      Assets/Styles/GLQuake/GLQuake.asset

12
Assets/Scripts/Game/Entity.cs

@ -145,22 +145,24 @@ public class Entity
{ {
var skin = skins[skinNumber >= 0 && skinNumber < skins.Count ? skinNumber : 0]; var skin = skins[skinNumber >= 0 && skinNumber < skins.Count ? skinNumber : 0];
if (skin.Frames.Count > 0) if (skin.Frames.Count > 0)
visualStyle.SetAliasModelTextures(material, skin.Frames[0].MainTexture, skin.Frames[0].FullBrightTexture);
visualStyle.SetEntityTextures(material, skin.Frames[0].MainTexture, skin.Frames[0].FullBrightTexture);
} }
} }
private void AssignMeshRenderer() private void AssignMeshRenderer()
{ {
material = visualStyle.CreateEntityMaterial();
if (aliasModel.IsAnimated) if (aliasModel.IsAnimated)
{ {
visualStyle.SetupAliasModelRenderer(skinnedMeshRenderer);
material = skinnedMeshRenderer.material;
visualStyle.SetupEntityRenderer(skinnedMeshRenderer);
skinnedMeshRenderer.material = material;
skinnedMeshRenderer.enabled = true; skinnedMeshRenderer.enabled = true;
} }
else else
{ {
visualStyle.SetupAliasModelRenderer(meshRenderer);
material = meshRenderer.material;
visualStyle.SetupEntityRenderer(meshRenderer);
meshRenderer.material = material;
meshRenderer.enabled = true; meshRenderer.enabled = true;
} }

5
Assets/Scripts/Game/GameState.cs

@ -49,7 +49,8 @@ public class GameState
mf.sharedMesh = surfaceMesh.Mesh; mf.sharedMesh = surfaceMesh.Mesh;
// TODO FIXME This is wrong for brush model entities // TODO FIXME This is wrong for brush model entities
uq.CurrentStyle.SetupWorldModelRenderer(mr); // TODO FIXME this currently leaks Materials
uq.CurrentStyle.SetupWorldRenderer(mr);
mr.material = uq.CurrentStyle.CreateWorldMaterial(); // TODO FIXME this currently leaks Materials
uint texNum = surfaceMesh.TextureNum; uint texNum = surfaceMesh.TextureNum;
if (uq.GameAssets.TryGetTexture(texNum, out var texture)) if (uq.GameAssets.TryGetTexture(texNum, out var texture))
@ -57,7 +58,7 @@ public class GameState
uint fbNum = surfaceMesh.FullBrightNum; uint fbNum = surfaceMesh.FullBrightNum;
uq.GameAssets.TryGetTexture(fbNum, out var fullBright); uq.GameAssets.TryGetTexture(fbNum, out var fullBright);
uq.CurrentStyle.SetWorldModelTextures(mr.material, texture, fullBright, null);
uq.CurrentStyle.SetWorldTextures(mr.material, texture, fullBright, null);
} }
} }

52
Assets/Scripts/VisualStyle.cs

@ -7,66 +7,48 @@ using UnityEngine.Rendering;
public class VisualStyle : ScriptableObject public class VisualStyle : ScriptableObject
{ {
[SerializeField] [SerializeField]
protected Material aliasModelMaterial;
protected Material entityMaterial;
[SerializeField] [SerializeField]
protected Material brushModelMaterial; // TODO: not sure if this should be separate or combined into one entityMaterial
[SerializeField]
protected Material worldModelMaterial; // TODO: split into wall, liquid, sky, etc
protected Material worldMaterial; // TODO: split into wall, liquid, sky, etc
// TODO: add particle effects // TODO: add particle effects
public virtual void SetupAliasModelRenderer(MeshRenderer meshRenderer)
public virtual Material CreateEntityMaterial()
{
return new Material(entityMaterial);
}
public virtual Material CreateWorldMaterial()
{
return new Material(worldMaterial);
}
public virtual void SetupEntityRenderer(MeshRenderer meshRenderer)
{ {
meshRenderer.material = new Material(aliasModelMaterial);
meshRenderer.shadowCastingMode = ShadowCastingMode.Off; meshRenderer.shadowCastingMode = ShadowCastingMode.Off;
meshRenderer.receiveShadows = false; meshRenderer.receiveShadows = false;
meshRenderer.lightProbeUsage = LightProbeUsage.Off; meshRenderer.lightProbeUsage = LightProbeUsage.Off;
meshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off; meshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off;
} }
public virtual void SetupAliasModelRenderer(SkinnedMeshRenderer skinnedMeshRenderer)
public virtual void SetupEntityRenderer(SkinnedMeshRenderer skinnedMeshRenderer)
{ {
skinnedMeshRenderer.material = new Material(aliasModelMaterial);
skinnedMeshRenderer.shadowCastingMode = ShadowCastingMode.Off; skinnedMeshRenderer.shadowCastingMode = ShadowCastingMode.Off;
skinnedMeshRenderer.receiveShadows = false; skinnedMeshRenderer.receiveShadows = false;
skinnedMeshRenderer.lightProbeUsage = LightProbeUsage.Off; skinnedMeshRenderer.lightProbeUsage = LightProbeUsage.Off;
skinnedMeshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off; skinnedMeshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off;
} }
public virtual void SetupBrushModelRenderer(MeshRenderer meshRenderer)
public virtual void SetupWorldRenderer(MeshRenderer meshRenderer)
{ {
meshRenderer.material = new Material(brushModelMaterial);
meshRenderer.shadowCastingMode = ShadowCastingMode.Off; meshRenderer.shadowCastingMode = ShadowCastingMode.Off;
meshRenderer.receiveShadows = false; meshRenderer.receiveShadows = false;
meshRenderer.lightProbeUsage = LightProbeUsage.Off; meshRenderer.lightProbeUsage = LightProbeUsage.Off;
meshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off; meshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off;
} }
public virtual void SetupWorldModelRenderer(MeshRenderer meshRenderer)
{
meshRenderer.material = new Material(worldModelMaterial);
meshRenderer.shadowCastingMode = ShadowCastingMode.Off;
meshRenderer.receiveShadows = false;
meshRenderer.lightProbeUsage = LightProbeUsage.Off;
meshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off;
}
public virtual void SetAliasModelTextures(Material material, Texture2D mainTexture, Texture2D fullBright)
{
material.mainTexture = mainTexture;
material.SetTexture("_EmissionMap", fullBright);
material.SetColor("_EmissionColor", Color.white);
if (fullBright != null)
material.EnableKeyword("_EMISSION");
else
material.DisableKeyword("_EMISSION");
}
public virtual void SetBrushModelTextures(Material material, Texture2D mainTexture, Texture2D fullBright)
public virtual void SetEntityTextures(Material material, Texture2D mainTexture, Texture2D fullBright)
{ {
material.mainTexture = mainTexture; material.mainTexture = mainTexture;
@ -79,7 +61,7 @@ public class VisualStyle : ScriptableObject
material.DisableKeyword("_EMISSION"); material.DisableKeyword("_EMISSION");
} }
public virtual void SetWorldModelTextures(Material material, Texture2D mainTexture, Texture2D fullBright, Texture2D lightmap)
public virtual void SetWorldTextures(Material material, Texture2D mainTexture, Texture2D fullBright, Texture2D lightmap)
{ {
material.mainTexture = mainTexture; material.mainTexture = mainTexture;

5
Assets/Styles/GLQuake/GLQuake.asset

@ -12,6 +12,5 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 2df0cbad06a6ed5489201e395f9c5bb3, type: 3} m_Script: {fileID: 11500000, guid: 2df0cbad06a6ed5489201e395f9c5bb3, type: 3}
m_Name: GLQuake m_Name: GLQuake
m_EditorClassIdentifier: m_EditorClassIdentifier:
aliasModelMaterial: {fileID: 2100000, guid: 4d7703ac1adf3534f89b4041b779ff5e, type: 2}
brushModelMaterial: {fileID: 2100000, guid: 4d7703ac1adf3534f89b4041b779ff5e, type: 2}
worldModelMaterial: {fileID: 2100000, guid: fcbaf32c00bea2344bbb1419c61364b6, type: 2}
entityMaterial: {fileID: 2100000, guid: 4d7703ac1adf3534f89b4041b779ff5e, type: 2}
worldMaterial: {fileID: 2100000, guid: fcbaf32c00bea2344bbb1419c61364b6, type: 2}
Loading…
Cancel
Save