61 lines
2.1 KiB
C#
61 lines
2.1 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace X.Rendering.Feature
|
|
{
|
|
public class FakeShadowPlayer : MonoBehaviour
|
|
{
|
|
private static readonly int PROP_LIGHTS_ARRAY = Shader.PropertyToID("_FakeShadowsLights");
|
|
private static readonly int PROP_PLAYER_SHADOW_POSITION = Shader.PropertyToID("_PlayerPosition");
|
|
private static readonly int PROP_FAKE_SHADOWS_ARGS = Shader.PropertyToID("_FakeShadowsArgs");
|
|
|
|
|
|
private static readonly Vector4 DEFAULT_LIGHT_VALUE = new Vector4(0f, 0f, 0f, 1f);
|
|
|
|
private Vector4[] lightsData = new Vector4[4]
|
|
{
|
|
DEFAULT_LIGHT_VALUE,
|
|
DEFAULT_LIGHT_VALUE,
|
|
DEFAULT_LIGHT_VALUE,
|
|
DEFAULT_LIGHT_VALUE
|
|
};
|
|
|
|
[SerializeField] private Vector3 playerPositionOffset = new Vector3(0f, 0.1f, 0f);
|
|
[SerializeField] private float playerRadius = 0.1f;
|
|
[SerializeField, Range(0f, 1f)] private float shadowStrength = 0.7f;
|
|
|
|
|
|
private void OnTriggerEnter(Collider other)
|
|
{
|
|
if (other.GetComponent<FakeShadowLightConfig>() is FakeShadowLightConfig fsc && fsc)
|
|
{
|
|
lightsData = fsc.lightData;
|
|
}
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
private void OnTriggerStay(Collider other)
|
|
{
|
|
if (other.GetComponent<FakeShadowLightConfig>() is FakeShadowLightConfig fsc && fsc)
|
|
{
|
|
lightsData = fsc.lightData;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
private void OnTriggerExit(Collider other)
|
|
{
|
|
lightsData[0] = DEFAULT_LIGHT_VALUE;
|
|
lightsData[1] = DEFAULT_LIGHT_VALUE;
|
|
lightsData[2] = DEFAULT_LIGHT_VALUE;
|
|
lightsData[3] = DEFAULT_LIGHT_VALUE;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
Shader.SetGlobalVectorArray(PROP_LIGHTS_ARRAY, lightsData);
|
|
Shader.SetGlobalVector(PROP_PLAYER_SHADOW_POSITION, this.transform.position + playerPositionOffset);
|
|
Shader.SetGlobalVector(PROP_FAKE_SHADOWS_ARGS, new Vector4(playerRadius, shadowStrength, 0, 0));
|
|
}
|
|
}
|
|
} |