Fixed stuff I broke by merging :-P

also twerked the waves a bit
This commit is contained in:
DeMuenu
2025-09-27 01:04:28 +02:00
parent b94c52da3c
commit 8780f50ebc
4 changed files with 89 additions and 55 deletions

View File

@@ -9,7 +9,6 @@ public static class PlayerPositionsToShaderPreview
{
const double kTickInterval = 0.1; // seconds
static double _nextTick;
static readonly MaterialPropertyBlock _mpb = new MaterialPropertyBlock();
static readonly Dictionary<PlayerPositionsToShader, Cache> _cache = new Dictionary<PlayerPositionsToShader, Cache>();
struct Cache
@@ -47,7 +46,7 @@ public static class PlayerPositionsToShaderPreview
{
if (b == null || !b.isActiveAndEnabled) continue;
if (EditorUtility.IsPersistent(b)) continue; // skip assets
PushFromUdonBehaviour(b);
PushFromBehaviour(b);
}
SceneView.RepaintAll();
@@ -82,7 +81,7 @@ public static class PlayerPositionsToShaderPreview
}
}
static void PushFromUdonBehaviour(PlayerPositionsToShader src)
static void PushFromBehaviour(PlayerPositionsToShader src)
{
int max = Mathf.Max(1, src.maxLights);
EnsureArrays(src, max);
@@ -93,6 +92,7 @@ public static class PlayerPositionsToShaderPreview
var directions = c.directions;
var types = c.types;
// Clear arrays to safe defaults
for (int i = 0; i < max; i++)
{
positions[i] = Vector4.zero;
@@ -101,36 +101,61 @@ public static class PlayerPositionsToShaderPreview
types[i] = 0f;
}
// 🔗 Use the Editor-side function defined on the partial class
// Use the Editor-side function defined on the partial class
int count = 0;
try
{
src.Editor_BuildPreview(out positions, out colors, out directions, out types, out count);
// replace cache arrays if sizes changed
if (positions.Length != c.size) EnsureArrays(src, positions.Length);
_cache[src] = new Cache { positions = positions, colors = colors, directions = directions, types = types, size = positions.Length };
if (positions.Length != c.size)
EnsureArrays(src, positions.Length);
_cache[src] = new Cache
{
positions = positions,
colors = colors,
directions = directions,
types = types,
size = positions.Length
};
}
catch
{
// Ultra-safe fallback: nothing to push if the method signature changes unexpectedly
// Fallback: nothing to push if the method signature changes unexpectedly
count = 0;
}
var rds = src.targets ?? System.Array.Empty<Renderer>();
for (int r = 0; r < rds.Length; r++)
// Mirror runtime: push as GLOBAL shader properties
// Resolve property IDs only if names are provided
if (!string.IsNullOrEmpty(src.positionsProperty))
{
var rd = rds[r];
if (rd == null) continue;
int id = Shader.PropertyToID(src.positionsProperty);
Shader.SetGlobalVectorArray(id, positions);
}
rd.GetPropertyBlock(_mpb);
if (!string.IsNullOrEmpty(src.colorProperty))
{
int id = Shader.PropertyToID(src.colorProperty);
Shader.SetGlobalVectorArray(id, colors);
}
if (!string.IsNullOrEmpty(src.positionsProperty)) _mpb.SetVectorArray(src.positionsProperty, positions);
if (!string.IsNullOrEmpty(src.colorProperty)) _mpb.SetVectorArray(src.colorProperty, colors);
if (!string.IsNullOrEmpty(src.directionsProperty)) _mpb.SetVectorArray(src.directionsProperty, directions);
if (!string.IsNullOrEmpty(src.typeProperty)) _mpb.SetFloatArray (src.typeProperty, types);
if (!string.IsNullOrEmpty(src.countProperty)) _mpb.SetFloat (src.countProperty, count);
if (!string.IsNullOrEmpty(src.directionsProperty))
{
int id = Shader.PropertyToID(src.directionsProperty);
Shader.SetGlobalVectorArray(id, directions);
}
rd.SetPropertyBlock(_mpb);
if (!string.IsNullOrEmpty(src.typeProperty))
{
int id = Shader.PropertyToID(src.typeProperty);
Shader.SetGlobalFloatArray(id, types);
}
if (!string.IsNullOrEmpty(src.countProperty))
{
int id = Shader.PropertyToID(src.countProperty);
Shader.SetGlobalFloat(id, count);
}
}
}
@@ -145,7 +170,7 @@ public class PlayerPositionsToShaderInspector : Editor
using (new EditorGUI.DisabledScope(true))
{
EditorGUILayout.LabelField("Edit-Mode Preview", EditorStyles.boldLabel);
EditorGUILayout.LabelField("Updates ~10×/s using \"Other Transforms\" as emitters.");
EditorGUILayout.LabelField("Updates ~10×/s using players and Other Light Sources.");
}
if (GUILayout.Button("Refresh Now"))

View File

@@ -12,8 +12,6 @@ public partial class PlayerPositionsToShader : UdonSharpBehaviour
[Tooltip("Place Transforms here which should also emit Light (attach LightdataStorage to them).")]
public Transform[] otherLightSources;
[Header("Renderers that use a supported shader")]
public Renderer[] targets;
[Header("Strength")]
[Tooltip("Local player light range")]
@@ -99,7 +97,7 @@ public partial class PlayerPositionsToShader : UdonSharpBehaviour
void LateUpdate()
{
if (Time.time < _nextUpdate) return;
_nextUpdate = Time.time + 0.05f;
_nextUpdate = Time.time + 0.025f;
UpdateData();
PushToRenderers();
@@ -266,7 +264,6 @@ public partial class PlayerPositionsToShader : UdonSharpBehaviour
private void PushToRenderers()
{
if (targets == null || targets.Length == 0) return;
// Snapshot which things are dirty this frame
bool pushPositions = _positons_isDirty;
@@ -274,23 +271,19 @@ public partial class PlayerPositionsToShader : UdonSharpBehaviour
bool pushDirs = _directions_isDirty;
bool pushTypes = _TypeArray_isDirty && !string.IsNullOrEmpty(typeProperty);
for (int r = 0; r < targets.Length; r++)
{
Renderer rd = targets[r];
if (!Utilities.IsValid(rd)) continue;
if (pushPositions) VRCShader.SetGlobalVectorArray(UdonID_PlayerPositions, _positions);
if (pushColors) VRCShader.SetGlobalVectorArray(UdonID_LightColors, _lightColors);
if (pushDirs) VRCShader.SetGlobalVectorArray(UdonID_LightDirections, _directions);
if (pushTypes) _mpb.SetFloatArray(UdonID_LightType, _TypeArray);
if (pushPositions) VRCShader.SetGlobalVectorArray(UdonID_PlayerPositions, _positions);
if (pushColors) VRCShader.SetGlobalVectorArray(UdonID_LightColors, _lightColors);
if (pushDirs) VRCShader.SetGlobalVectorArray(UdonID_LightDirections, _directions);
if (pushTypes) _mpb.SetFloatArray(UdonID_LightType, _TypeArray);
VRCShader.SetGlobalFloat(UdonID_LightCount, currentCount);
VRCShader.SetGlobalFloat(UdonID_LightCount, currentCount);
}
// Only now mark them clean
if (pushPositions) { _positons_isDirty = false; Debug.Log("Updated Positions"); }
if (pushColors) { _lightColors_isDirty = false; Debug.Log("Updated LightColors"); }
if (pushDirs) { _directions_isDirty = false; Debug.Log("Updated Directions"); }
if (pushTypes) { _TypeArray_isDirty = false; Debug.Log("Updated TypeArray"); }
if (pushPositions) { _positons_isDirty = false;}
if (pushColors) { _lightColors_isDirty = false;}
if (pushDirs) { _directions_isDirty = false;}
if (pushTypes) { _TypeArray_isDirty = false;}
}
}

View File

@@ -11,6 +11,8 @@ Shader "DeMuenu/World/Hoppou/Water"
_NormalMapScrollSpeed ("Normal Map Scroll Speed", Float) = 0.1
_NormalMapScrollSpeed2 ("Normal Map 2 Scroll Speed", Float) = 0.05
_MinTransparency ("Min Transparency", Range(0,1)) = 0
//Moonlight
_InverseSqareMultiplier ("Inverse Square Multiplier", Float) = 1
_LightCutoffDistance ("Light Cutoff Distance", Float) = 100
@@ -25,12 +27,11 @@ Shader "DeMuenu/World/Hoppou/Water"
//Moonlight END
_WaveInput ("Wave Input", 2D) = "black" {}
_WaveTex ("Wave Texture", 2D) = "black" {}
_CameraScale ("Camera Scale", Float) = 15
_CameraPositionZ ("Camera Position Z", Float) = 0
_CameraPositionX ("Camera Position X", Float) = 0
_WaveScale ("Wave Scale", Range(0.001, 100)) = 1
_WaveScale ("Wave Scale", Range(0.001, 2)) = 1
_WaveColor ("Wave Color", Color) = (1,1,1,1)
}
SubShader
{
@@ -84,6 +85,7 @@ Shader "DeMuenu/World/Hoppou/Water"
float _NormalMap2Tiling;
float _NormalMapScrollSpeed;
float _NormalMapScrollSpeed2;
float _MinTransparency;
MoonlightGlobalVariables
@@ -99,6 +101,7 @@ Shader "DeMuenu/World/Hoppou/Water"
float _CameraPositionZ;
float _CameraPositionX;
float _WaveScale;
float4 _WaveColor;
//Watershader specific END
@@ -134,18 +137,10 @@ Shader "DeMuenu/World/Hoppou/Water"
float3 NormalOffset1 = UnpackNormal(norm).xyz;
float3 NormalOffset2 = UnpackNormal(norm2).xyz;
float2 waveUV = float2(_CameraPositionX - i.worldPos.x, _CameraPositionZ - i.worldPos.z) / _CameraScale / 2 + 0.5;
fixed4 Wave = tex2D(_WaveInput, waveUV);
if ((waveUV.x < 0.1) || (waveUV.x > 0.9) || (waveUV.y < 0.1) || (waveUV.y > 0.9)){
Wave = float4(0,0,0,0);
}
//i.vertex += float4(0, Wave.g * _WaveScale, 0, 0);
//i.worldPos += float3(0, Wave.g * _WaveScale, 0);
//Moonlight
float3 N = normalize(i.worldNormal + NormalOffset1 * _NormalMapStrength1 + NormalOffset2 * _NormalMapStrength2 + Wave * _WaveScale); //for lambertian diffuse
float3 N = normalize(i.worldNormal + NormalOffset1 * _NormalMapStrength1 + NormalOffset2 * _NormalMapStrength2); //for lambertian diffuse
//Waterspecific
@@ -188,9 +183,33 @@ Shader "DeMuenu/World/Hoppou/Water"
dmax.a = dmax.a * _ReflectionStrength * fres;
//Moonlight END
float4 finalColor = col * _Color * dmax;
float2 waveUV = float2(_CameraPositionX - i.worldPos.x, _CameraPositionZ - i.worldPos.z) / _CameraScale / 2 + 0.5;
fixed4 Wave = tex2D(_WaveInput, waveUV);
if ((waveUV.x < 0.1) || (waveUV.x > 0.9) || (waveUV.y < 0.1) || (waveUV.y > 0.9)){
Wave = float4(0,0,0,0);
}
Wave.a = Wave.r;
Wave *= dmax;
float2 camXZ = float2(_CameraPositionX, _CameraPositionZ);
float2 posXZ = float2(i.worldPos.x, i.worldPos.z);
float dist = distance(posXZ, camXZ);
float distFade = 1.0 - smoothstep(0, _CameraScale, dist);
float4 waveCol = Wave * _WaveScale * _WaveColor;
float k = saturate(1 * distFade);
float4 outCol = finalColor;
outCol.rgb = lerp(outCol.rgb, waveCol.rgb, k);
outCol.a = max(outCol.a, _MinTransparency);
return outCol;
// Final color
return col * _Color * dmax ;
}
ENDCG
}

View File

@@ -3,13 +3,12 @@ Shader "DeMuenu/World/Hoppou/WaterParticle"
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_AlphaMap ("Alpha Map", 2D) = "white" {}
_Color ("Tint", Color) = (1,1,1,1)
}
SubShader
{
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" }
Blend SrcAlpha OneMinusSrcAlpha // normal alpha blend (not additive)
Blend One One
ZWrite Off
Lighting Off
Cull Off
@@ -38,7 +37,6 @@ Shader "DeMuenu/World/Hoppou/WaterParticle"
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _AlphaMap;
fixed4 _Color;
v2f vert (appdata v)
@@ -53,8 +51,7 @@ Shader "DeMuenu/World/Hoppou/WaterParticle"
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv) * _Color;
float alpha = tex2D(_AlphaMap, i.uv).r;
return col * alpha * i.color; // col.a drives the blend
return col * i.color; // col.a drives the blend
}
ENDCG
}