mirror of
https://github.com/DeMuenu/MoonlightVRC.git
synced 2025-12-12 19:13:56 +00:00
Refactor light range and angle calculations
Updated how light range and spot angle are calculated and packed for both editor and runtime scripts, distinguishing between sphere and non-sphere lights. Adjusted shader logic to use new packing for spot light contribution, improving consistency between CPU and GPU representations.
This commit is contained in:
@@ -30,15 +30,24 @@ public partial class LightUpdater
|
|||||||
|
|
||||||
LightdataStorage data = t.GetComponent<LightdataStorage>();
|
LightdataStorage data = t.GetComponent<LightdataStorage>();
|
||||||
|
|
||||||
|
// w = cosHalfAngle (0 for omni)
|
||||||
|
float cosHalf = (data != null) ? data.GetCosHalfAngle() : 0f;
|
||||||
|
|
||||||
Vector3 pos = t.position;
|
Vector3 pos = t.position;
|
||||||
float range = (data != null) ? data.range * t.localScale.x : t.localScale.x;
|
float range = 0;
|
||||||
|
if (data.lightType == LightType.Sphere)
|
||||||
|
{
|
||||||
|
range = (data != null) ? data.range * t.localScale.x : t.localScale.x;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
range = (data != null) ? Mathf.Cos(Mathf.Deg2Rad * ((data.spotAngleDeg * 0.5f) + Mathf.Max(data.range, 0))): 0f;
|
||||||
|
}
|
||||||
|
|
||||||
// rgb = color, a = intensity (packed to match runtime/shader)
|
// rgb = color, a = intensity (packed to match runtime/shader)
|
||||||
Vector4 col = (data != null) ? data.GetFinalColor() : new Vector4(1f, 1f, 1f, 1f);
|
Vector4 col = (data != null) ? data.GetFinalColor() : new Vector4(1f, 1f, 1f, 1f);
|
||||||
float intensity = (data != null) ? data.intensity * t.localScale.x : 1f;
|
float intensity = (data != null) ? data.intensity * t.localScale.x : 1f;
|
||||||
|
|
||||||
// w = cosHalfAngle (0 for omni)
|
|
||||||
float cosHalf = (data != null) ? data.spotAngleDeg : 0f;
|
|
||||||
|
|
||||||
// 0=Omni, 1=Spot, 2=Directional (your custom enum)
|
// 0=Omni, 1=Spot, 2=Directional (your custom enum)
|
||||||
int typeId = (data != null) ? data.GetTypeId() : 0;
|
int typeId = (data != null) ? data.GetTypeId() : 0;
|
||||||
|
|||||||
@@ -221,14 +221,22 @@ public partial class LightUpdater : UdonSharpBehaviour
|
|||||||
Vector3 fwd = rot * Vector3.down;
|
Vector3 fwd = rot * Vector3.down;
|
||||||
|
|
||||||
|
|
||||||
float Lightangle = (data != null) ? data.spotAngleDeg : 0f;
|
float Lightangle = (data != null) ? data.GetCosHalfAngle() : 0f;
|
||||||
|
|
||||||
Vector4 posTemp = new Vector4(pos.x, pos.y, pos.z, range);
|
Vector4 posTemp = Vector4.zero;
|
||||||
if (_positions[currentCount] != posTemp)
|
if (data.lightType == LightType.Sphere)
|
||||||
{
|
{
|
||||||
_positions[currentCount] = posTemp;
|
posTemp = new Vector4(pos.x, pos.y, pos.z, range);
|
||||||
_positons_isDirty = true;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
posTemp = new Vector4(pos.x, pos.y, pos.z, Mathf.Cos(Mathf.Deg2Rad * ((data.spotAngleDeg * 0.5f) + Mathf.Max(data.range, 0))));
|
||||||
|
}
|
||||||
|
if (_positions[currentCount] != posTemp)
|
||||||
|
{
|
||||||
|
_positions[currentCount] = posTemp;
|
||||||
|
_positons_isDirty = true;
|
||||||
|
}
|
||||||
Vector4 colorTemp = new Vector4(col.x, col.y, col.z, intensity);
|
Vector4 colorTemp = new Vector4(col.x, col.y, col.z, intensity);
|
||||||
if (_lightColors[currentCount] != colorTemp)
|
if (_lightColors[currentCount] != colorTemp)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,10 +11,9 @@
|
|||||||
else if (_Udon_LightType[LightCounter] == 1) \
|
else if (_Udon_LightType[LightCounter] == 1) \
|
||||||
{ \
|
{ \
|
||||||
float invSq = _Udon_LightColors[LightCounter].a / max(1e-4, (distanceFromLight * invSqMul) * (distanceFromLight * invSqMul)); \
|
float invSq = _Udon_LightColors[LightCounter].a / max(1e-4, (distanceFromLight * invSqMul) * (distanceFromLight * invSqMul)); \
|
||||||
float threshold = (-1 + _Udon_LightDirections[LightCounter].w / 180); \
|
|
||||||
\
|
\
|
||||||
contrib = min(dot(normalize(i.worldPos - Lightposition), -normalize(_Udon_LightDirections[LightCounter].xyz)), 0); \
|
contrib = dot(normalize(i.worldPos - Lightposition), normalize(_Udon_LightDirections[LightCounter].xyz)); \
|
||||||
contrib= 1 - smoothstep(threshold, threshold + radius / 180, contrib); \
|
contrib = smoothstep(radius,_Udon_LightDirections[LightCounter].w, contrib); \
|
||||||
\
|
\
|
||||||
contrib = contrib * invSq; \
|
contrib = contrib * invSq; \
|
||||||
dIntensity += contrib; \
|
dIntensity += contrib; \
|
||||||
|
|||||||
Reference in New Issue
Block a user