using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; [CreateAssetMenu(fileName = "VisualStyle", menuName = "UniQuake/Visual Style", order = 1)] public class VisualStyle : ScriptableObject { [SerializeField] protected Material entityMaterial; [SerializeField] protected Material worldMaterial; // TODO: split into wall, liquid, sky, etc [SerializeField] protected Material liquidMaterial; [SerializeField] protected LiquidProperties liquidProperties = new LiquidProperties(); [SerializeField] protected ParticleSystems particles = new ParticleSystems(); public ParticleSystems Particles => particles; public virtual Material CreateEntityMaterial() { return new Material(entityMaterial); } public virtual Material CreateWorldMaterial(QSurfaceFlags surfaceFlags) { if (surfaceFlags.HasFlag(QSurfaceFlags.DrawTurbulence) && liquidMaterial != null) { float alpha = 1f; if (surfaceFlags.HasFlag(QSurfaceFlags.DrawWater)) alpha = liquidProperties.waterAlpha; else if (surfaceFlags.HasFlag(QSurfaceFlags.DrawSlime)) alpha = liquidProperties.slimeAlpha; else if (surfaceFlags.HasFlag(QSurfaceFlags.DrawLava)) alpha = liquidProperties.lavaAlpha; else if (surfaceFlags.HasFlag(QSurfaceFlags.DrawTeleporter)) alpha = liquidProperties.teleporterAlpha; var material = new Material(liquidMaterial); material.SetColor("_BaseColor", new Color(1, 1, 1, alpha)); return material; } return new Material(worldMaterial); } public virtual void SetupEntityRenderer(MeshRenderer meshRenderer) { meshRenderer.shadowCastingMode = ShadowCastingMode.Off; meshRenderer.receiveShadows = false; meshRenderer.lightProbeUsage = LightProbeUsage.Off; meshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off; } public virtual void SetupEntityRenderer(SkinnedMeshRenderer skinnedMeshRenderer) { skinnedMeshRenderer.shadowCastingMode = ShadowCastingMode.Off; skinnedMeshRenderer.receiveShadows = false; skinnedMeshRenderer.lightProbeUsage = LightProbeUsage.Off; skinnedMeshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off; } public virtual void SetupWorldRenderer(MeshRenderer meshRenderer) { meshRenderer.shadowCastingMode = ShadowCastingMode.Off; meshRenderer.receiveShadows = false; meshRenderer.lightProbeUsage = LightProbeUsage.Off; meshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off; } public virtual void SetEntityTextures(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 SetWorldTextures(Material material, Texture2D mainTexture, Texture2D fullBright, Texture2D lightmap) { material.mainTexture = mainTexture; material.SetTexture("_EmissionMap", fullBright); material.SetColor("_EmissionColor", Color.white); if (fullBright != null) material.EnableKeyword("_EMISSION"); else material.DisableKeyword("_EMISSION"); // TODO: lightmap texture } } [System.Serializable] public class LiquidProperties { [Range(0, 1)] public float waterAlpha = 0.85f, slimeAlpha = 0.9f, lavaAlpha = 0.95f, teleporterAlpha = 1.0f; } [System.Serializable] public class ParticleSystems { [SerializeField] protected ParticleSystem explosion; public virtual void CreateExplosion(Vector3 position) { var go = Object.Instantiate(explosion.gameObject); go.transform.position = position; } }