Project_WL/Assets/Critter Volumetric Lighting/Scripts/Utils/VolumetricLightMaterialHand...

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);
}
}
}