Removed hard zone boundaries Fixed stuff that broke because of hard zone boundary assumption (stardust placement, vertical fog) Added a skybox! Removed density-based albedo boost (_TintExponent) to improve perceptual uniformity at different step sizes, reconfigured shader to achieve / surpass previous looks and performance Cell Brush has a material editor now to enable variant selection Enabled Caching Shader Preprocessor Moved raymarching loop into CloudShader Get environment settings from game manager to enable configuration / variation Introduced slope-based nebulae damping and volumetric flow Hid optional volumetric features behind preprocessor branches Created shader variants selected by global keywords for all shaders depending on volumetrics Environment settings used to configure shader variant selection Moved dynamic lighting settings to own subclass Dynamically adjust gravity map isoline contour depth range according to zone contents
154 lines
5.7 KiB
C#
154 lines
5.7 KiB
C#
using System;
|
|
using MessagePack;
|
|
using Newtonsoft.Json;
|
|
using Unity.Mathematics;
|
|
using static Unity.Mathematics.math;
|
|
using static Unity.Mathematics.noise;
|
|
using float2 = Unity.Mathematics.float2;
|
|
|
|
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class ZoneEnvironment
|
|
{
|
|
[JsonProperty("nebula"), Key(0)] public NebulaSettings Nebula;
|
|
[JsonProperty("flow"), Key(1)] public FlowSettings Flow;
|
|
[JsonProperty("noise"), Key(2)] public NoiseSettings Noise;
|
|
[JsonProperty("lighting"), Key(2)] public AmbientLightingSettings Lighting;
|
|
}
|
|
|
|
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class NebulaSettings
|
|
{
|
|
[JsonProperty("fillDensity"), Key(0)] public float FillDensity;
|
|
[JsonProperty("fillDistance"), Key(1)] public float FillDistance;
|
|
[JsonProperty("fillExponent"), Key(2)] public float FillExponent;
|
|
[JsonProperty("fillOffset"), Key(12)] public float FillOffset;
|
|
[JsonProperty("cloudDensity"), Key(3)] public float PatchDensity;
|
|
[JsonProperty("fogOffset"), Key(4)] public float FloorOffset;
|
|
[JsonProperty("fogBlend"), Key(5)] public float FloorBlend;
|
|
[JsonProperty("cloudBlend"), Key(6)] public float PatchBlend;
|
|
[JsonProperty("luminance"), Key(7)] public float Luminance;
|
|
[JsonProperty("extinction"), Key(13)] public float Extinction;
|
|
//[JsonProperty("tintExponent"), Key(8)] public float TintExponent;
|
|
[JsonProperty("tintLodExponent"), Key(9)] public float TintLodExponent;
|
|
[JsonProperty("safetyDistance"), Key(10)] public float SafetyDistance;
|
|
}
|
|
|
|
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class AmbientLightingSettings
|
|
{
|
|
[JsonProperty("dynamicSkyBoost"), Key(0)] public float DynamicSkyBoost;
|
|
[JsonProperty("dynamicLodHigh"), Key(1)] public float DynamicLodHigh;
|
|
[JsonProperty("dynamicLodLow"), Key(2)] public float DynamicLodLow;
|
|
[JsonProperty("dynamicIntensity"), Key(3)] public float DynamicIntensity;
|
|
}
|
|
|
|
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class FlowSettings
|
|
{
|
|
[JsonProperty("scale"), Key(0)] public float GlobalScale;
|
|
[JsonProperty("amplitudeGlobal"), Key(1)] public float GlobalAmplitude;
|
|
[JsonProperty("scrollSpeed"), Key(2)] public float GlobalScrollSpeed;
|
|
[JsonProperty("period"), Key(3)] public float Period;
|
|
[JsonProperty("amplitudeSlope"), Key(4)] public float SlopeAmplitude;
|
|
[JsonProperty("amplitudeSwirl"), Key(4)] public float SwirlAmplitude;
|
|
}
|
|
|
|
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class NoiseSettings
|
|
{
|
|
[JsonProperty("scale"), Key(0)] public float Scale;
|
|
[JsonProperty("amplitude"), Key(1)] public float Amplitude;
|
|
[JsonProperty("exponent"), Key(2)] public float Exponent;
|
|
[JsonProperty("speed"), Key(3)] public float Speed;
|
|
[JsonProperty("slopeExponent"), Key(4)] public float SlopeExponent;
|
|
}
|
|
|
|
[Union(0, typeof(PowerBrush)),
|
|
Union(1, typeof(SimplexBrush)),
|
|
Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public abstract class Brush
|
|
{
|
|
[JsonProperty("layerMask"), Key(0)] public BrushLayer LayerMask;
|
|
[JsonProperty("cutoff"), Key(1)] public float Cutoff;
|
|
[JsonProperty("depth"), Key(2)] public float Depth;
|
|
[JsonProperty("envelopeExponent"), Key(3)] public float EnvelopeExponent;
|
|
|
|
float powerPulse( float x, float power )
|
|
{
|
|
x = saturate(abs(x))-.001f;
|
|
return pow((x + 1.0f) * (1.0f - x), power);
|
|
}
|
|
|
|
protected abstract float Evaluate(float2 world, float2 uv);
|
|
|
|
public float Evaluate(float2 world, float2 pos, float2 radius)
|
|
{
|
|
var uv = (world - pos) / radius;
|
|
float dist = length(uv)*2;
|
|
float envelope = min(Cutoff, powerPulse(dist,EnvelopeExponent)) * smoothstep(1, .95f, dist);
|
|
return Depth * Evaluate(world, uv) * envelope;
|
|
}
|
|
}
|
|
|
|
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class PowerBrush : Brush
|
|
{
|
|
protected override float Evaluate(float2 world, float2 uv)
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public abstract class TextureBrush : Brush
|
|
{
|
|
[JsonProperty("frequency"), Key(4)] public float2 Frequency;
|
|
[JsonProperty("phase"), Key(5)] public float2 Phase;
|
|
}
|
|
|
|
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public abstract class AnimatedBrush : TextureBrush
|
|
{
|
|
[JsonProperty("animationSpeed"), Key(6)] public float AnimationSpeed;
|
|
|
|
[IgnoreMember]
|
|
public float Time { get; set; }
|
|
}
|
|
|
|
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class SimplexBrush : TextureBrush
|
|
{
|
|
[JsonProperty("absolute"), Key(6)] public bool AbsoluteValue;
|
|
|
|
protected override float Evaluate(float2 world, float2 uv)
|
|
{
|
|
var noise = snoise(world * Frequency + Phase);
|
|
return AbsoluteValue ? abs(noise) : noise;
|
|
}
|
|
}
|
|
|
|
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class AnimatedSimplexBrush : AnimatedBrush
|
|
{
|
|
[JsonProperty("absolute"), Key(7)] public bool AbsoluteValue;
|
|
|
|
protected override float Evaluate(float2 world, float2 uv)
|
|
{
|
|
var noise = snoise(float3(float2(world * Frequency + Phase), AnimationSpeed * Time));
|
|
return AbsoluteValue ? abs(noise) : noise;
|
|
}
|
|
}
|
|
|
|
[Serializable, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class RadialWaveBrush : TextureBrush
|
|
{
|
|
[JsonProperty("waveExponent"), Key(7)] public float WaveExponent;
|
|
|
|
protected override float Evaluate(float2 world, float2 uv)
|
|
{
|
|
float dist = length(uv);
|
|
float ang = atan2(uv.y,uv.x);
|
|
return cos((ang + Phase.x) * Frequency.x * PI + (pow(dist, WaveExponent) + Phase.y) * Frequency.y);
|
|
}
|
|
}
|
|
|