From e3341988b0864c9e6f89f91716557538a71f66c4 Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Tue, 8 Apr 2025 18:26:25 +0800 Subject: [PATCH] update shaders --- Runtime/Shaders/Handles.shader | 55 +++++------------------ Runtime/Shaders/HandlesLibrary.cginc | 47 +++++++++++++++++++ Runtime/Shaders/HandlesLibrary.cginc.meta | 7 +++ Runtime/Shaders/HandlesOverwrite.shader | 55 +++++------------------ Runtime/Shaders/HandlesWire.shader | 55 +++++------------------ 5 files changed, 88 insertions(+), 131 deletions(-) create mode 100644 Runtime/Shaders/HandlesLibrary.cginc create mode 100644 Runtime/Shaders/HandlesLibrary.cginc.meta diff --git a/Runtime/Shaders/Handles.shader b/Runtime/Shaders/Handles.shader index 5dad36e..0aa52b4 100644 --- a/Runtime/Shaders/Handles.shader +++ b/Runtime/Shaders/Handles.shader @@ -31,15 +31,23 @@ Shader "DCFApixels/DebugX/Handles" #pragma instancing_options procedural:setup #include "UnityCG.cginc" + #include "HandlesLibrary.cginc" -#if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED) + #if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED) struct InstanceData { float4x4 m; float4 color; }; StructuredBuffer _DataBuffer; -#endif + void setup() + { + InstanceData data = _DataBuffer[unity_InstanceID]; + UNITY_MATRIX_M = data.m; //UNITY_MATRIX_M + _Color = data.color; + } + #endif + struct appdata_t { float4 vertex : POSITION; @@ -58,55 +66,14 @@ Shader "DCFApixels/DebugX/Handles" half4 color : COLOR; }; - float4 _Color; float4 _DebugX_GlobalColor; - void setup() - { -#if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED) - InstanceData data = _DataBuffer[unity_InstanceID]; - - UNITY_MATRIX_M = data.m; //UNITY_MATRIX_M - _Color = data.color; -#endif - } - - - - -#if _DOT_ON - float _DebugX_GlobalDotSize; - float GetHandleSize(float3 objectPosition) - { - float3 viewDir = normalize(_WorldSpaceCameraPos - objectPosition); - - float distance = length(_WorldSpaceCameraPos - objectPosition); - float isOrthographic = UNITY_MATRIX_P[3][3]; - distance = lerp(distance, 1, isOrthographic); - - float fov = radians(UNITY_MATRIX_P[1][1] * 2.0); - float scale = distance * (1 / fov) * 0.015; - - - return scale * _DebugX_GlobalDotSize; - } -#endif - - v2f vert (appdata_t v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); - - float4x4 M = UNITY_MATRIX_M; -#if _DOT_ON - float scaleMultiplier = GetHandleSize(mul(UNITY_MATRIX_M, float4(0, 0, 0, 1)).xyz); - M._m00 *= scaleMultiplier; - M._m11 *= scaleMultiplier; - M._m22 *= scaleMultiplier; -#endif - + float4x4 M = GET_HANDLE_UNITY_MATRIX_M(); #if _BILLBOARD_ON float4 worldOrigin = mul(M, float4(0, 0, 0, 1)); diff --git a/Runtime/Shaders/HandlesLibrary.cginc b/Runtime/Shaders/HandlesLibrary.cginc new file mode 100644 index 0000000..01594b8 --- /dev/null +++ b/Runtime/Shaders/HandlesLibrary.cginc @@ -0,0 +1,47 @@ + + + +float GetHandleSize(float3 objectPosition, float scaleM) +{ + float3 viewDir = normalize(_WorldSpaceCameraPos - objectPosition); + + float distance = length(_WorldSpaceCameraPos - objectPosition); + float isOrthographic = UNITY_MATRIX_P[3][3]; + distance = lerp(distance, 1, isOrthographic); + + float fov = radians(UNITY_MATRIX_P[1][1] * 2.0); + float scale = distance * (1 / fov) * 0.015; + + return scale * scaleM; +} + +float4x4 GetHandleSizeMatrix(float3 objectPosition, float scaleM) +{ + float4x4 M = UNITY_MATRIX_M; + + float scale = GetHandleSize(objectPosition, scaleM); + M._m00 *= scale; + M._m11 *= scale; + M._m22 *= scale; + + return M; +} + + + +//Macros +#if _DOT_ON +float _DebugX_GlobalDotSize; +#endif +float4 _Color; + +float4x4 GET_HANDLE_UNITY_MATRIX_M() +{ +#if _DOT_ON + return GetHandleSizeMatrix(mul(UNITY_MATRIX_M, float4(0, 0, 0, 1)).xyz, _DebugX_GlobalDotSize); +#else + return UNITY_MATRIX_M; +#endif +} + + diff --git a/Runtime/Shaders/HandlesLibrary.cginc.meta b/Runtime/Shaders/HandlesLibrary.cginc.meta new file mode 100644 index 0000000..7bcc5c9 --- /dev/null +++ b/Runtime/Shaders/HandlesLibrary.cginc.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 728ffe8b3d2321e45a960a3a90e65bc6 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Shaders/HandlesOverwrite.shader b/Runtime/Shaders/HandlesOverwrite.shader index 968d8a7..22e88ae 100644 --- a/Runtime/Shaders/HandlesOverwrite.shader +++ b/Runtime/Shaders/HandlesOverwrite.shader @@ -33,15 +33,23 @@ Shader "DCFApixels/DebugX/Handles Overwrite" #pragma instancing_options procedural:setup #include "UnityCG.cginc" + #include "HandlesLibrary.cginc" -#if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED) + #if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED) struct InstanceData { float4x4 m; float4 color; }; StructuredBuffer _DataBuffer; -#endif + void setup() + { + InstanceData data = _DataBuffer[unity_InstanceID]; + UNITY_MATRIX_M = data.m; //UNITY_MATRIX_M + _Color = data.color; + } + #endif + struct appdata_t { float4 vertex : POSITION; @@ -60,54 +68,13 @@ Shader "DCFApixels/DebugX/Handles Overwrite" half4 color : COLOR; }; - float4 _Color; float4 _DebugX_GlobalColor; - void setup() - { -#if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED) - InstanceData data = _DataBuffer[unity_InstanceID]; - - UNITY_MATRIX_M = data.m; //UNITY_MATRIX_M - _Color = data.color; -#endif - } - - - - -#if _DOT_ON - float _DebugX_GlobalDotSize; - float GetHandleSize(float3 objectPosition) - { - float3 viewDir = normalize(_WorldSpaceCameraPos - objectPosition); - - float distance = length(_WorldSpaceCameraPos - objectPosition); - float isOrthographic = UNITY_MATRIX_P[3][3]; - distance = lerp(distance, 1, isOrthographic); - - float fov = radians(UNITY_MATRIX_P[1][1] * 2.0); - float scale = distance * (1 / fov) * 0.015; - - return scale * _DebugX_GlobalDotSize; - } -#endif - - - v2f vert (appdata_t v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); - - float4x4 M = UNITY_MATRIX_M; -#if _DOT_ON - float scaleMultiplier = GetHandleSize(mul(UNITY_MATRIX_M, float4(0, 0, 0, 1)).xyz); - M._m00 *= scaleMultiplier; - M._m11 *= scaleMultiplier; - M._m22 *= scaleMultiplier; -#endif - + float4x4 M = GET_HANDLE_UNITY_MATRIX_M(); #if _BILLBOARD_ON float4 worldOrigin = mul(M, float4(0, 0, 0, 1)); diff --git a/Runtime/Shaders/HandlesWire.shader b/Runtime/Shaders/HandlesWire.shader index e14f49e..c1655dc 100644 --- a/Runtime/Shaders/HandlesWire.shader +++ b/Runtime/Shaders/HandlesWire.shader @@ -32,15 +32,24 @@ Shader "DCFApixels/DebugX/Handles Wire" #pragma instancing_options procedural:setup #include "UnityCG.cginc" + #include "HandlesLibrary.cginc" -#if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED) + #if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED) struct InstanceData { float4x4 m; float4 color; }; StructuredBuffer _DataBuffer; -#endif + void setup() + { + InstanceData data = _DataBuffer[unity_InstanceID]; + UNITY_MATRIX_M = data.m; //UNITY_MATRIX_M + _Color = data.color; + } + #endif + + struct appdata_t { float4 vertex : POSITION; @@ -64,54 +73,14 @@ Shader "DCFApixels/DebugX/Handles Wire" float4 color : COLOR; }; - float4 _Color; float4 _DebugX_GlobalColor; - void setup() - { -#if defined(UNITY_PROCEDURAL_INSTANCING_ENABLED) - InstanceData data = _DataBuffer[unity_InstanceID]; - - UNITY_MATRIX_M = data.m; //UNITY_MATRIX_M - _Color = data.color; -#endif - } - - - - -#if _DOT_ON - float _DebugX_GlobalDotSize; - float GetHandleSize(float3 objectPosition) - { - float3 viewDir = normalize(_WorldSpaceCameraPos - objectPosition); - - float distance = length(_WorldSpaceCameraPos - objectPosition); - float isOrthographic = UNITY_MATRIX_P[3][3]; - distance = lerp(distance, 1, isOrthographic); - - float fov = radians(UNITY_MATRIX_P[1][1] * 2.0); - float scale = distance * (1 / fov) * 0.015; - - return scale * _DebugX_GlobalDotSize; - } -#endif - - v2g vert (appdata_t v) { v2g o; UNITY_SETUP_INSTANCE_ID(v); - - float4x4 M = UNITY_MATRIX_M; -#if _DOT_ON - float scaleMultiplier = GetHandleSize(mul(UNITY_MATRIX_M, float4(0, 0, 0, 1)).xyz); - M._m00 *= scaleMultiplier; - M._m11 *= scaleMultiplier; - M._m22 *= scaleMultiplier; -#endif - + float4x4 M = GET_HANDLE_UNITY_MATRIX_M(); #if _BILLBOARD_ON float4 worldOrigin = mul(M, float4(0, 0, 0, 1));