133 lines
6.4 KiB
C#
133 lines
6.4 KiB
C#
using UnityEngine;
|
|
|
|
namespace CritterVolumetricLighting
|
|
{
|
|
/**
|
|
Helper library for VolumetricLightManager.
|
|
This class is used push values to godray materials.
|
|
*/
|
|
public static class VolumetricLightMaterialHandler
|
|
{
|
|
private static VolumetricLightManager _vLManager;
|
|
|
|
public static void Init(VolumetricLightManager vLManager)
|
|
{
|
|
_vLManager = vLManager;
|
|
|
|
ApplySettings();
|
|
UpkeepProperties();
|
|
|
|
_vLManager.godrayMat.SetTexture("_CloudDataTexture", _vLManager.cloudDataTexture);
|
|
}
|
|
|
|
|
|
public static void UpkeepProperties()
|
|
{
|
|
UpkeepDataWriterProp();
|
|
UpkeepGodrayMatProp();
|
|
}
|
|
|
|
public static void DrawCloudData()
|
|
{
|
|
Graphics.Blit(null, _vLManager.cloudDataTexture, _vLManager.cloudDataWriterMat);
|
|
}
|
|
|
|
public static void ApplySettings()
|
|
{
|
|
UpdateDataWriterProp();
|
|
UpdateGodrayMatProp();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////
|
|
////////////////// DATA WRITER //////////////////
|
|
//////////////////////////////////////////////////////
|
|
|
|
private static void UpdateDataWriterProp()
|
|
{
|
|
_vLManager.cloudDataWriterMat.SetFloat("_PlaneWidthWorldUnits", _vLManager.planeWidthWorldUnits);
|
|
_vLManager.cloudDataWriterMat.SetFloat("_PlaneLengthWorldUnits", _vLManager.planeHeightWorldUnits);
|
|
_vLManager.cloudDataWriterMat.SetFloat("_CloudScale", _vLManager.cloudScale);
|
|
_vLManager.cloudDataWriterMat.SetFloat("_Cloud_Change", _vLManager.cloudChange);
|
|
_vLManager.cloudDataWriterMat.SetVector("_CloudStep", _vLManager.cloudStep);
|
|
_vLManager.cloudDataWriterMat.SetVector("_CloudMovement", _vLManager.cloudMovement);
|
|
_vLManager.cloudDataWriterMat.SetFloat("_Ramps", _vLManager.lightRamps);
|
|
|
|
_vLManager.cloudDataWriterMat.SetFloat("_DataWriterMultiplier", _vLManager.dataWriterMultiplier);
|
|
_vLManager.cloudDataWriterMat.SetFloat("_DataWriterAdditive", _vLManager.dataWriterAdditive);
|
|
_vLManager.cloudDataWriterMat.SetFloat("_Brigthness", _vLManager.brightness);
|
|
|
|
}
|
|
|
|
private static void UpkeepDataWriterProp()
|
|
{
|
|
_vLManager.cloudDataWriterMat.SetVector("_PlaneRight", -_vLManager.anchorTrans.right);
|
|
_vLManager.cloudDataWriterMat.SetVector("_CameraPos", _vLManager.mainCamera.transform.position);
|
|
_vLManager.cloudDataWriterMat.SetVector("_PlaneForward", -_vLManager.anchorTrans.forward);
|
|
float cameraSunDot = Vector3.Dot(_vLManager.mainCamera.transform.forward, _vLManager.mainLightTrans.forward);
|
|
_vLManager.cloudDataWriterMat.SetFloat("_CloudCoverage", _vLManager.cloudCoverage);
|
|
|
|
Vector3 planeMid = _vLManager.anchorTrans.position +
|
|
_vLManager.anchorTrans.forward * _vLManager.planeHeightWorldUnits / 2;
|
|
|
|
_vLManager.cloudDataWriterMat.SetVector("_AnchorMid", planeMid);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////
|
|
////////////////// GODRAY MAT //////////////////
|
|
//////////////////////////////////////////////////////
|
|
|
|
private static void UpdateGodrayMatProp()
|
|
{
|
|
_vLManager.godrayMat.SetFloat("_planeWidthWorldUnits", _vLManager.planeWidthWorldUnits);
|
|
_vLManager.godrayMat.SetFloat("_planeHeightWorldUnits", _vLManager.planeHeightWorldUnits);
|
|
_vLManager.godrayMat.SetFloat("_planeWidthPixels", _vLManager.cloudDataTexture.width);
|
|
_vLManager.godrayMat.SetFloat("_planeHeightPixels", _vLManager.cloudDataTexture.height);
|
|
_vLManager.godrayMat.SetFloat("_ScreenWidthWorldUnits", _vLManager.screenWidthWorldUnits);
|
|
_vLManager.godrayMat.SetFloat("_ScreenHeightWorldUnits", _vLManager.screenHeightWorldUnits);
|
|
_vLManager.godrayMat.SetFloat("_pixelUvLen", 1.0f / _vLManager.cloudDataTexture.height);
|
|
_vLManager.godrayMat.SetFloat("_NearPlane", _vLManager.mainCamera.nearClipPlane);
|
|
_vLManager.godrayMat.SetFloat("_CloudNearClipPlane", _vLManager.cloudAreaNearClipPlane);
|
|
_vLManager.godrayMat.SetFloat("_FarPlane", _vLManager.mainCamera.farClipPlane);
|
|
|
|
if (_vLManager.mainCamera.targetTexture != null) {
|
|
_vLManager.godrayMat.SetFloat("ScreenWidthPixels", _vLManager.mainCamera.targetTexture.width);
|
|
_vLManager.godrayMat.SetFloat("ScreenHeightPixels", _vLManager.mainCamera.targetTexture.height);
|
|
} else {
|
|
_vLManager.godrayMat.SetFloat("ScreenWidthPixels", Screen.width);
|
|
_vLManager.godrayMat.SetFloat("ScreenHeightPixels", Screen.height);
|
|
}
|
|
|
|
_vLManager.godrayMat.SetFloat("_StepSize", _vLManager.shadowMarchStepSize);
|
|
_vLManager.godrayMat.SetFloat("_Steps", _vLManager.shadowMarchSteps);
|
|
_vLManager.godrayMat.SetColor("_GodrayColor", _vLManager.lightColor);
|
|
_vLManager.godrayMat.SetFloat("_Cells", _vLManager.lightRamps);
|
|
_vLManager.godrayMat.SetFloat("_ShadowRamps", _vLManager.shadowRamps);
|
|
_vLManager.godrayMat.SetFloat("_FadeStart", _vLManager.fadeStart);
|
|
_vLManager.godrayMat.SetFloat("_FadeStrength", _vLManager.fadeStrength);
|
|
_vLManager.godrayMat.SetFloat("_ShadowStrength", _vLManager.shadowStrength*1.25f);
|
|
_vLManager.godrayMat.SetFloat("_Strength", _vLManager.lightStrength);
|
|
_vLManager.godrayMat.SetFloat("_DirectionalFading", _vLManager.directionalFading);
|
|
}
|
|
|
|
private static void UpkeepGodrayMatProp()
|
|
{
|
|
_vLManager.godrayMat.SetVector("_planeOrigo", _vLManager.planeOrigo);
|
|
_vLManager.godrayMat.SetVector("_anchorForward", _vLManager.anchorTrans.forward);
|
|
_vLManager.godrayMat.SetVector("_anchorPosition", _vLManager.anchorTrans.position);
|
|
_vLManager.godrayMat.SetVector("_anchorUp", _vLManager.anchorTrans.up);
|
|
_vLManager.godrayMat.SetVector("_CameraPos", _vLManager.mainCamera.transform.position);
|
|
_vLManager.godrayMat.SetVector("_CameraForward", _vLManager.mainCamera.transform.forward);
|
|
_vLManager.godrayMat.SetVector("_CameraRight", _vLManager.mainCamera.transform.right);
|
|
_vLManager.godrayMat.SetVector("_CameraUp", _vLManager.mainCamera.transform.up);
|
|
|
|
// Hardcoded smoothnes for directional disappearance. It is hardcoded to quite high value because smooth disappearance is difficult to achieve without running into weird clipping or premature disappearance...
|
|
const float disappearanceSpeed = 12f; // Higher value = more snappy disappearance, lower value = smoother disappearance
|
|
|
|
float cameraSunDot = 1-Vector3.Dot(_vLManager.mainCamera.transform.forward, _vLManager.mainLightTrans.forward);
|
|
float normalizedVisibility = Mathf.Clamp01((cameraSunDot + 1) / 2.0f);
|
|
float directionalShadowEffect = Mathf.Clamp01((normalizedVisibility - _vLManager.directionalDisappearance) * disappearanceSpeed);
|
|
_vLManager.godrayMat.SetFloat("_DirectionalShadowEffect", directionalShadowEffect);
|
|
|
|
}
|
|
}
|
|
} |