using UnityEngine; namespace VolumetricFogAndMist { [CreateAssetMenu(fileName = "VolumetricFogProfile", menuName = "Volumetric Fog Profile", order = 100)] public class VolumetricFogProfile : ScriptableObject { public LIGHTING_MODEL lightingModel; public bool sunCopyColor = true; [Range(0f, 1.25f)] public float density = 1f; [Range(0f, 1f)] public float noiseStrength = 0.8f; [Range(0f, 500f)] public float height = 4f; public float baselineHeight; [Range(0f, 1000f)] public float distance; [Range(0f, 5f)] public float distanceFallOff; [Range(0f, 2000f)] public float maxFogLength = 1000f; [Range(0f, 1f)] public float maxFogLengthFallOff; public bool baselineRelativeToCamera; [Range(0f, 1f)] public float baselineRelativeToCameraDelay; [Range(0.2f, 10f)] public float noiseScale = 1f; [Range(-0.3f, 2f)] public float noiseSparse; [Range(1f, 2f)] public float noiseFinalMultiplier = 1f; [Range(0f, 1.05f)] public float alpha = 1f; public Color color = new Color(0.89f, 0.89f, 0.89f, 1f); public Color specularColor = new Color(1f, 1f, 0.8f, 1f); [Range(0f, 1f)] public float specularThreshold = 0.6f; [Range(0f, 1f)] public float specularIntensity = 0.2f; public Vector3 lightDirection = new Vector3(1f, 0f, -1f); [Range(-1f, 3f)] public float lightIntensity = 0.2f; public Color lightColor = Color.white; [Range(0f, 1f)] public float speed = 0.01f; public bool useRealTime; public Vector3 windDirection = new Vector3(-1f, 0f, 0f); [Range(0f, 10f)] public float turbulenceStrength; public bool useXYPlane; public Color skyColor = new Color(0.89f, 0.89f, 0.89f, 1f); [Range(0f, 1000f)] public float skyHaze = 50f; [Range(0f, 1f)] public float skySpeed = 0.3f; [Range(0f, 1f)] public float skyNoiseStrength = 0.1f; [Range(0f, 1f)] public float skyAlpha = 1f; public float stepping = 12f; public float steppingNear = 1f; public bool dithering; public float ditherStrength = 0.75f; public bool downsamplingOverride; [Range(1f, 8f)] public int downsampling = 1; public bool forceComposition; public bool edgeImprove; [Range(1E-05f, 0.005f)] public float edgeThreshold = 0.0005f; public bool lightScatteringOverride; public bool lightScatteringEnabled; [Range(0f, 1f)] [SerializeField] public float lightScatteringDiffusion = 0.7f; [Range(0f, 1f)] [SerializeField] public float lightScatteringSpread = 0.686f; [Range(4f, 64f)] [SerializeField] public int lightScatteringSamples = 16; [Range(0f, 50f)] [SerializeField] public float lightScatteringWeight = 1.9f; [SerializeField] [Range(0f, 50f)] public float lightScatteringIllumination = 18f; [Range(0.9f, 1.1f)] [SerializeField] public float lightScatteringDecay = 0.986f; [SerializeField] [Range(0f, 0.2f)] public float lightScatteringExposure; [Range(0f, 1f)] [SerializeField] public float lightScatteringJittering = 0.5f; public bool fogVoidOverride; public FOG_VOID_TOPOLOGY fogVoidTopology; [SerializeField] [Range(0f, 10f)] public float fogVoidFallOff = 1f; public float fogVoidRadius; public Vector3 fogVoidPosition = Vector3.zero; public float fogVoidDepth; public float fogVoidHeight; public void Load(VolumetricFog fog) { fog.density = density; fog.noiseStrength = noiseStrength; fog.height = height; fog.baselineHeight = baselineHeight; fog.distance = distance; fog.distanceFallOff = distanceFallOff; fog.maxFogLength = maxFogLength; fog.maxFogLengthFallOff = maxFogLengthFallOff; fog.baselineRelativeToCamera = baselineRelativeToCamera; fog.baselineRelativeToCameraDelay = baselineRelativeToCameraDelay; fog.noiseScale = noiseScale; fog.noiseSparse = noiseSparse; fog.noiseFinalMultiplier = noiseFinalMultiplier; fog.useXYPlane = useXYPlane; fog.lightingModel = lightingModel; fog.sunCopyColor = sunCopyColor; fog.alpha = alpha; fog.color = color; fog.specularColor = specularColor; fog.specularThreshold = specularThreshold; fog.specularIntensity = specularIntensity; fog.lightDirection = lightDirection; fog.lightIntensity = lightIntensity; fog.lightColor = lightColor; fog.speed = speed; fog.windDirection = windDirection; fog.turbulenceStrength = turbulenceStrength; fog.useRealTime = useRealTime; fog.skyColor = skyColor; fog.skyHaze = skyHaze; fog.skySpeed = skySpeed; fog.skyNoiseStrength = skyNoiseStrength; fog.skyAlpha = skyAlpha; fog.stepping = stepping; fog.steppingNear = steppingNear; fog.dithering = dithering; fog.ditherStrength = ditherStrength; if (downsamplingOverride) { fog.downsampling = downsampling; fog.forceComposition = forceComposition; fog.edgeImprove = edgeImprove; fog.edgeThreshold = edgeThreshold; } if (fogVoidOverride) { fog.fogVoidTopology = fogVoidTopology; fog.fogVoidDepth = fogVoidDepth; fog.fogVoidFallOff = fogVoidFallOff; fog.fogVoidHeight = fogVoidHeight; fog.fogVoidPosition = fogVoidPosition; fog.fogVoidRadius = fogVoidRadius; } if (lightScatteringOverride) { fog.lightScatteringEnabled = lightScatteringEnabled; fog.lightScatteringDecay = lightScatteringDecay; fog.lightScatteringDiffusion = lightScatteringDiffusion; fog.lightScatteringExposure = lightScatteringExposure; fog.lightScatteringIllumination = lightScatteringIllumination; fog.lightScatteringJittering = lightScatteringJittering; fog.lightScatteringSamples = lightScatteringSamples; fog.lightScatteringSpread = lightScatteringSpread; fog.lightScatteringWeight = lightScatteringWeight; } } public void Save(VolumetricFog fog) { density = fog.density; noiseStrength = fog.noiseStrength; height = fog.height; baselineHeight = fog.baselineHeight; distance = fog.distance; distanceFallOff = fog.distanceFallOff; maxFogLength = fog.maxFogLength; maxFogLengthFallOff = fog.maxFogLengthFallOff; baselineRelativeToCamera = fog.baselineRelativeToCamera; baselineRelativeToCameraDelay = fog.baselineRelativeToCameraDelay; noiseScale = fog.noiseScale; noiseSparse = fog.noiseSparse; noiseFinalMultiplier = fog.noiseFinalMultiplier; useXYPlane = fog.useXYPlane; sunCopyColor = fog.sunCopyColor; alpha = fog.alpha; color = fog.color; specularColor = fog.specularColor; specularThreshold = fog.specularThreshold; specularIntensity = fog.specularIntensity; lightDirection = fog.lightDirection; lightIntensity = fog.lightIntensity; lightColor = fog.lightColor; lightingModel = fog.lightingModel; speed = fog.speed; windDirection = fog.windDirection; turbulenceStrength = fog.turbulenceStrength; useRealTime = fog.useRealTime; skyColor = fog.skyColor; skyHaze = fog.skyHaze; skySpeed = fog.skySpeed; skyNoiseStrength = fog.skyNoiseStrength; skyAlpha = fog.skyAlpha; stepping = fog.stepping; steppingNear = fog.steppingNear; dithering = fog.dithering; ditherStrength = fog.ditherStrength; downsampling = fog.downsampling; forceComposition = fog.forceComposition; edgeImprove = fog.edgeImprove; edgeThreshold = fog.edgeThreshold; fogVoidTopology = fog.fogVoidTopology; fogVoidDepth = fog.fogVoidDepth; fogVoidFallOff = fog.fogVoidFallOff; fogVoidHeight = fog.fogVoidHeight; fogVoidPosition = fog.fogVoidPosition; fogVoidRadius = fog.fogVoidRadius; lightScatteringEnabled = fog.lightScatteringEnabled; lightScatteringDecay = fog.lightScatteringDecay; lightScatteringDiffusion = fog.lightScatteringDiffusion; lightScatteringExposure = fog.lightScatteringExposure; lightScatteringIllumination = fog.lightScatteringIllumination; lightScatteringJittering = fog.lightScatteringJittering; lightScatteringSamples = fog.lightScatteringSamples; lightScatteringSpread = fog.lightScatteringSamples; lightScatteringSpread = fog.lightScatteringSpread; lightScatteringWeight = fog.lightScatteringWeight; } public static void Lerp(VolumetricFogProfile profile1, VolumetricFogProfile profile2, float t, VolumetricFog fog) { if (t < 0f) { t = 0f; } else if (t > 1f) { t = 1f; } fog.density = profile1.density * (1f - t) + profile2.density * t; fog.noiseStrength = profile1.noiseStrength * (1f - t) + profile2.noiseStrength * t; fog.height = profile1.height * (1f - t) + profile2.height * t; fog.baselineHeight = profile1.baselineHeight * (1f - t) + profile2.baselineHeight * t; fog.distance = profile1.distance * (1f - t) + profile2.distance * t; fog.distanceFallOff = profile1.distanceFallOff * (1f - t) + profile2.distanceFallOff * t; fog.maxFogLength = profile1.maxFogLength * (1f - t) + profile2.maxFogLength * t; fog.maxFogLengthFallOff = profile1.maxFogLengthFallOff * (1f - t) + profile2.maxFogLengthFallOff * t; fog.baselineRelativeToCamera = ((!(t < 0.5f)) ? profile2.baselineRelativeToCamera : profile1.baselineRelativeToCamera); fog.baselineRelativeToCameraDelay = profile1.baselineRelativeToCameraDelay * (1f - t) + profile2.baselineRelativeToCameraDelay * t; fog.noiseScale = profile1.noiseScale * (1f - t) + profile2.noiseScale * t; fog.noiseSparse = profile1.noiseSparse * (1f - t) + profile2.noiseSparse * t; fog.noiseFinalMultiplier = profile1.noiseFinalMultiplier * (1f - t) + profile2.noiseFinalMultiplier * t; fog.sunCopyColor = ((!(t < 0.5f)) ? profile2.sunCopyColor : profile1.sunCopyColor); fog.alpha = profile1.alpha * (1f - t) + profile2.alpha * t; fog.color = profile1.color * (1f - t) + profile2.color * t; fog.specularColor = profile1.specularColor * (1f - t) + profile2.specularColor * t; fog.specularThreshold = profile1.specularThreshold * (1f - t) + profile2.specularThreshold * t; fog.specularIntensity = profile1.specularIntensity * (1f - t) + profile2.specularIntensity * t; fog.lightDirection = profile1.lightDirection * (1f - t) + profile2.lightDirection * t; fog.lightIntensity = profile1.lightIntensity * (1f - t) + profile2.lightIntensity * t; fog.lightColor = profile1.lightColor * (1f - t) + profile2.lightColor * t; fog.speed = profile1.speed * (1f - t) + profile2.speed * t; fog.windDirection = profile1.windDirection * (1f - t) + profile2.windDirection * t; fog.turbulenceStrength = profile1.turbulenceStrength * (1f - t) + profile2.turbulenceStrength * t; fog.skyColor = profile1.skyColor * (1f - t) + profile2.skyColor * t; fog.skyHaze = profile1.skyHaze * (1f - t) + profile2.skyHaze * t; fog.skySpeed = profile1.skySpeed * (1f - t) + profile2.skySpeed * t; fog.skyNoiseStrength = profile1.skyNoiseStrength * (1f - t) + profile2.skyNoiseStrength * t; fog.skyAlpha = profile1.skyAlpha * (1f - t) + profile2.skyAlpha * t; fog.stepping = profile1.stepping * (1f - t) + profile2.stepping * t; fog.steppingNear = profile1.steppingNear * (1f - t) + profile2.steppingNear * t; fog.dithering = ((!(t < 0.5f)) ? profile2.dithering : profile1.dithering); fog.ditherStrength = profile1.ditherStrength * (1f - t) + profile2.ditherStrength * t; if (profile1.fogVoidOverride && profile2.fogVoidOverride) { fog.fogVoidDepth = profile1.fogVoidDepth * (1f - t) + profile2.fogVoidDepth * t; fog.fogVoidFallOff = profile1.fogVoidFallOff * (1f - t) + profile2.fogVoidFallOff * t; fog.fogVoidHeight = profile1.fogVoidHeight * (1f - t) + profile2.fogVoidHeight * t; fog.fogVoidPosition = profile1.fogVoidPosition * (1f - t) + profile2.fogVoidPosition * t; fog.fogVoidRadius = profile1.fogVoidRadius * (1f - t) + profile2.fogVoidRadius * t; } if (profile1.lightScatteringOverride && profile2.lightScatteringOverride) { fog.lightScatteringDecay = profile1.lightScatteringDecay * (1f - t) + profile2.lightScatteringDecay * t; fog.lightScatteringDiffusion = profile1.lightScatteringDiffusion * (1f - t) + profile2.lightScatteringDiffusion * t; fog.lightScatteringExposure = profile1.lightScatteringExposure * (1f - t) + profile2.lightScatteringExposure * t; fog.lightScatteringIllumination = profile1.lightScatteringIllumination * (1f - t) + profile2.lightScatteringIllumination * t; fog.lightScatteringJittering = profile1.lightScatteringJittering * (1f - t) + profile2.lightScatteringJittering * t; fog.lightScatteringSamples = (int)((float)profile1.lightScatteringSamples * (1f - t) + (float)profile2.lightScatteringSamples * t); fog.lightScatteringSpread = profile1.lightScatteringSpread * (1f - t) + profile2.lightScatteringSpread * t; fog.lightScatteringWeight = profile1.lightScatteringWeight * (1f - t) + profile2.lightScatteringWeight * t; } } } }