Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/VolumetricFogAndMist/VolumetricFogMaterialIntegration.cs
2026-02-21 16:45:37 +08:00

339 lines
7.2 KiB
C#

using UnityEngine;
namespace VolumetricFogAndMist
{
[ExecuteInEditMode]
[RequireComponent(typeof(VolumetricFog))]
public class VolumetricFogMaterialIntegration : MonoBehaviour
{
private enum PropertyType
{
Float = 0,
Float3 = 1,
Float4 = 2,
Color = 3,
Texture2D = 4,
FloatArray = 5,
Float4Array = 6,
ColorArray = 7,
Matrix4x4 = 8
}
private struct Properties
{
public string name;
public PropertyType type;
}
private static Properties[] props = new Properties[29]
{
new Properties
{
name = "_NoiseTex",
type = PropertyType.Texture2D
},
new Properties
{
name = "_FogAlpha",
type = PropertyType.Float
},
new Properties
{
name = "_Color",
type = PropertyType.Color
},
new Properties
{
name = "_FogDistance",
type = PropertyType.Float4
},
new Properties
{
name = "_FogData",
type = PropertyType.Float4
},
new Properties
{
name = "_FogWindDir",
type = PropertyType.Float3
},
new Properties
{
name = "_FogStepping",
type = PropertyType.Float4
},
new Properties
{
name = "_BlurTex",
type = PropertyType.Texture2D
},
new Properties
{
name = "_FogVoidPosition",
type = PropertyType.Float3
},
new Properties
{
name = "_FogVoidData",
type = PropertyType.Float4
},
new Properties
{
name = "_FogAreaPosition",
type = PropertyType.Float3
},
new Properties
{
name = "_FogAreaData",
type = PropertyType.Float4
},
new Properties
{
name = "_FogOfWar",
type = PropertyType.Texture2D
},
new Properties
{
name = "_FogOfWarCenter",
type = PropertyType.Float3
},
new Properties
{
name = "_FogOfWarSize",
type = PropertyType.Float3
},
new Properties
{
name = "_FogOfWarCenterAdjusted",
type = PropertyType.Float3
},
new Properties
{
name = "_FogPointLightPosition",
type = PropertyType.Float4Array
},
new Properties
{
name = "_FogPointLightColor",
type = PropertyType.ColorArray
},
new Properties
{
name = "_SunPosition",
type = PropertyType.Float3
},
new Properties
{
name = "_SunDir",
type = PropertyType.Float3
},
new Properties
{
name = "_SunColor",
type = PropertyType.Float3
},
new Properties
{
name = "_FogScatteringData",
type = PropertyType.Float4
},
new Properties
{
name = "_FogScatteringData2",
type = PropertyType.Float4
},
new Properties
{
name = "_VolumetricFogSunDepthTexture",
type = PropertyType.Texture2D
},
new Properties
{
name = "_VolumetricFogSunDepthTexture_TexelSize",
type = PropertyType.Float4
},
new Properties
{
name = "_VolumetricFogSunProj",
type = PropertyType.Matrix4x4
},
new Properties
{
name = "_VolumetricFogSunWorldPos",
type = PropertyType.Float4
},
new Properties
{
name = "_VolumetricFogSunShadowsData",
type = PropertyType.Float4
},
new Properties
{
name = "_Jitter",
type = PropertyType.Float
}
};
private static string[] keywords = new string[10] { "FOG_DISTANCE_ON", "FOG_AREA_SPHERE", "FOG_AREA_BOX", "FOG_VOID_SPHERE", "FOG_VOID_BOX", "FOG_OF_WAR_ON", "FOG_SCATTERING_ON", "FOG_BLUR_ON", "FOG_POINT_LIGHTS", "FOG_SUN_SHADOWS_ON" };
public VolumetricFog fog;
public Renderer[] materials;
private void OnEnable()
{
fog = GetComponent<VolumetricFog>();
}
private void OnPreRender()
{
if (fog == null)
{
return;
}
Material fogMat = fog.fogMat;
if (fogMat == null || materials == null || materials.Length == 0)
{
return;
}
for (int i = 0; i < props.Length; i++)
{
if (!fogMat.HasProperty(props[i].name))
{
continue;
}
switch (props[i].type)
{
case PropertyType.Color:
{
Color color = fogMat.GetColor(props[i].name);
for (int num = 0; num < materials.Length; num++)
{
if (materials[num] != null && materials[num].sharedMaterial != null)
{
materials[num].sharedMaterial.SetColor(props[i].name, color);
}
}
break;
}
case PropertyType.ColorArray:
{
Color[] colorArray = fogMat.GetColorArray(props[i].name);
if (colorArray == null)
{
break;
}
for (int m = 0; m < materials.Length; m++)
{
if (materials[m] != null && materials[m].sharedMaterial != null)
{
materials[m].sharedMaterial.SetColorArray(props[i].name, colorArray);
}
}
break;
}
case PropertyType.FloatArray:
{
float[] floatArray = fogMat.GetFloatArray(props[i].name);
if (floatArray == null)
{
break;
}
for (int num3 = 0; num3 < materials.Length; num3++)
{
if (materials[num3] != null && materials[num3].sharedMaterial != null)
{
materials[num3].sharedMaterial.SetFloatArray(props[i].name, floatArray);
}
}
break;
}
case PropertyType.Float4Array:
{
Vector4[] vectorArray = fogMat.GetVectorArray(props[i].name);
if (vectorArray == null)
{
break;
}
for (int k = 0; k < materials.Length; k++)
{
if (materials[k] != null && materials[k].sharedMaterial != null)
{
materials[k].sharedMaterial.SetVectorArray(props[i].name, vectorArray);
}
}
break;
}
case PropertyType.Float:
{
for (int num2 = 0; num2 < materials.Length; num2++)
{
if (materials[num2] != null && materials[num2].sharedMaterial != null)
{
materials[num2].sharedMaterial.SetFloat(props[i].name, fogMat.GetFloat(props[i].name));
}
}
break;
}
case PropertyType.Float3:
case PropertyType.Float4:
{
for (int n = 0; n < materials.Length; n++)
{
if (materials[n] != null && materials[n].sharedMaterial != null)
{
materials[n].sharedMaterial.SetVector(props[i].name, fogMat.GetVector(props[i].name));
}
}
break;
}
case PropertyType.Matrix4x4:
{
for (int l = 0; l < materials.Length; l++)
{
if (materials[l] != null && materials[l].sharedMaterial != null)
{
materials[l].sharedMaterial.SetMatrix(props[i].name, fogMat.GetMatrix(props[i].name));
}
}
break;
}
case PropertyType.Texture2D:
{
for (int j = 0; j < materials.Length; j++)
{
if (materials[j] != null && materials[j].sharedMaterial != null)
{
materials[j].sharedMaterial.SetTexture(props[i].name, fogMat.GetTexture(props[i].name));
}
}
break;
}
}
}
for (int num4 = 0; num4 < keywords.Length; num4++)
{
if (fogMat.IsKeywordEnabled(keywords[num4]))
{
for (int num5 = 0; num5 < materials.Length; num5++)
{
if (materials[num5] != null && materials[num5].sharedMaterial != null)
{
materials[num5].sharedMaterial.EnableKeyword(keywords[num4]);
}
}
continue;
}
for (int num6 = 0; num6 < materials.Length; num6++)
{
if (materials[num6] != null && materials[num6].sharedMaterial != null)
{
materials[num6].sharedMaterial.DisableKeyword(keywords[num4]);
}
}
}
}
}
}