summaryrefslogtreecommitdiff
path: root/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes
diff options
context:
space:
mode:
Diffstat (limited to 'VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes')
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiBasics.cginc60
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiBasics.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiData.cginc18
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiData.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDefaultPass.cginc20
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDefaultPass.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDragNDropLighting.cginc100
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDragNDropLighting.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiEmission.cginc52
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiEmission.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFrag.cginc159
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFrag.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFun.cginc62
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFun.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiGeom.cginc240
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiGeom.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiHelpers.cginc42
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiHelpers.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiLighting.cginc124
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiLighting.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMacros.cginc0
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMacros.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMatcap.cginc36
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMatcap.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMetal.cginc77
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMetal.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineFrag.cginc26
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineFrag.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineIncludes.cginc46
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineIncludes.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineVert.cginc28
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineVert.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPanosphere.cginc41
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPanosphere.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPass.cginc28
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPass.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassOutline.cginc18
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassOutline.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassShadow.cginc14
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassShadow.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRefraction.cginc49
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRefraction.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRimLighting.cginc39
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRimLighting.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiScrollingLayers.cginc23
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiScrollingLayers.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowFrag.cginc29
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowFrag.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowIncludes.cginc29
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowIncludes.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowVert.cginc11
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowVert.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSpecular.cginc173
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSpecular.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSubsurfaceScattering.cginc30
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSubsurfaceScattering.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiTextureBlending.cginc33
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiTextureBlending.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiVert.cginc32
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiVert.cginc.meta8
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/Poicludes.cginc46
-rw-r--r--VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/Poicludes.cginc.meta8
62 files changed, 1933 insertions, 0 deletions
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiBasics.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiBasics.cginc
new file mode 100644
index 00000000..afce52ad
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiBasics.cginc
@@ -0,0 +1,60 @@
+#ifndef BASICS
+ #define BASICS
+
+ //Properties
+ float4 _Color;
+ float _Desaturation;
+ UNITY_DECLARE_TEX2D(_MainTex); float4 _MainTex_ST;
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_BumpMap); float4 _BumpMap_ST;
+ float4 _GlobalPanSpeed;
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_DetailNormalMap); float4 _DetailNormalMap_ST;
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_DetailNormalMask); float4 _DetailNormalMask_ST;
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_AlphaMask); float4 _AlphaMask_ST;
+ float _BumpScale;
+ float _DetailNormalMapScale;
+ float _Clip;
+
+ float3 viewDirection;
+ float viewDotNormal;
+ float4 mainTexture;
+ float alphaMask;
+ float4 albedo;
+
+ void InitializeFragmentNormal(inout v2f i)
+ {
+
+ float3 mainNormal = UnpackScaleNormal(UNITY_SAMPLE_TEX2D_SAMPLER(_BumpMap, _MainTex, TRANSFORM_TEX(i.uv, _BumpMap)), _BumpScale);
+ float detailNormalMask = UNITY_SAMPLE_TEX2D_SAMPLER(_DetailNormalMask, _MainTex, TRANSFORM_TEX(i.uv, _DetailNormalMask));
+ float3 detailNormal = UnpackScaleNormal(UNITY_SAMPLE_TEX2D_SAMPLER(_DetailNormalMap, _MainTex, TRANSFORM_TEX(i.uv, _DetailNormalMap)), _DetailNormalMapScale * detailNormalMask);
+ float3 tangentSpaceNormal = BlendNormals(mainNormal, detailNormal);
+
+ #if defined(BINORMAL_PER_FRAGMENT)
+ float3 binormal = CreateBinormal(i.normal, i.tangent.xyz, i.tangent.w);
+ #else
+ float3 binormal = i.binormal;
+ #endif
+
+ i.normal = normalize(
+ tangentSpaceNormal.x * i.tangent +
+ tangentSpaceNormal.y * binormal +
+ tangentSpaceNormal.z * i.normal
+ );
+ }
+
+ void calculateBasics(inout v2f i)
+ {
+ UNITY_SETUP_INSTANCE_ID(i);
+ baseNormal = i.normal;
+
+ #ifndef DRAG_N_DROP
+ InitializeFragmentNormal(i);
+ #endif
+
+ viewDirection = normalize(_WorldSpaceCameraPos - i.worldPos);
+ viewDotNormal = abs(dot(viewDirection, i.normal));
+
+ mainTexture = UNITY_SAMPLE_TEX2D(_MainTex, TRANSFORM_TEX(i.uv, _MainTex));
+ alphaMask = UNITY_SAMPLE_TEX2D_SAMPLER(_AlphaMask, _MainTex, TRANSFORM_TEX(i.uv, _AlphaMask));
+ albedo = float4(lerp(mainTexture.rgb, dot(mainTexture.rgb, float3(0.3, 0.59, 0.11)), _Desaturation) * _Color.rgb, mainTexture.a * _Color.a * alphaMask);
+ }
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiBasics.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiBasics.cginc.meta
new file mode 100644
index 00000000..638c2908
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiBasics.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: baf5af145e9eff4499da9c1b47119eec
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiData.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiData.cginc
new file mode 100644
index 00000000..7383892c
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiData.cginc
@@ -0,0 +1,18 @@
+#ifndef DATA
+ #define DATA
+
+ struct PoiLighting
+ {
+ float3 direction;
+ float3 position;
+ float3 color;
+ float attenuation;
+ float3 directLighting;
+ float3 indirectLighting;
+ float lightMap;
+ float3 rampedLightMap;
+ float3 finalLighting;
+ float nDotL;
+ };
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiData.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiData.cginc.meta
new file mode 100644
index 00000000..8847efae
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiData.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f9c59d934064e36439e8b48450dd8fc9
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDefaultPass.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDefaultPass.cginc
new file mode 100644
index 00000000..364f46cb
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDefaultPass.cginc
@@ -0,0 +1,20 @@
+#ifndef POI_DEFAULT_PASS
+ #define POI_DEFAULT_PASS
+
+ #include "Poicludes.cginc"
+ #include "PoiHelpers.cginc"
+ #include "PoiBasics.cginc"
+ #include "PoiEmission.cginc"
+ #include "PoiLighting.cginc"
+ #include "PoiFun.cginc"
+ #include "PoiRimlighting.cginc"
+ #include "PoiMetal.cginc"
+ #include "PoiMatcap.cginc"
+ #include "PoiSpecular.cginc"
+ #include "PoiSubsurfaceScattering.cginc"
+
+ #include "PoiVert.cginc"
+ #include "PoiFrag.cginc"
+ #include "PoiGeom.cginc"
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDefaultPass.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDefaultPass.cginc.meta
new file mode 100644
index 00000000..96346d85
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDefaultPass.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e5b8c59f665242546a9251f482d54618
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDragNDropLighting.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDragNDropLighting.cginc
new file mode 100644
index 00000000..82979ded
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDragNDropLighting.cginc
@@ -0,0 +1,100 @@
+#ifndef DND_LIGHTING
+ #define DND_LIGHTING
+
+ sampler2D _ToonRamp;
+ float _AdditiveSoftness;
+ float _AdditiveOffset;
+ float _ForceLightDirection;
+ float _ShadowStrength;
+ float _OutlineShadowStrength;
+ float _ShadowOffset;
+ float3 _LightDirection;
+ float _ForceShadowStrength;
+ float _CastedShadowSmoothing;
+ float _MinBrightness;
+ float _MaxBrightness;
+ float _IndirectContribution;
+ float _AttenuationMultiplier;
+
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_AOMap); float4 _AOMap_ST;
+ float _AOStrength;
+
+ float3 ShadeSH9Indirect()
+ {
+ return ShadeSH9(half4(0.0, -1.0, 0.0, 1.0));
+ }
+
+ float3 ShadeSH9Direct()
+ {
+ return ShadeSH9(half4(0.0, 1.0, 0.0, 1.0));
+ }
+
+ float3 ShadeSH9Normal(float3 normalDirection)
+ {
+ return ShadeSH9(half4(normalDirection, 1.0));
+ }
+
+ half3 GetSHLength()
+ {
+ half3 x, x1;
+ x.r = length(unity_SHAr);
+ x.g = length(unity_SHAg);
+ x.b = length(unity_SHAb);
+ x1.r = length(unity_SHBr);
+ x1.g = length(unity_SHBg);
+ x1.b = length(unity_SHBb);
+ return x + x1;
+ }
+
+ float FadeShadows(float attenuation, float3 worldPosition)
+ {
+ float viewZ = dot(_WorldSpaceCameraPos - worldPosition, UNITY_MATRIX_V[2].xyz);
+ float shadowFadeDistance = UnityComputeShadowFadeDistance(worldPosition, viewZ);
+ float shadowFade = UnityComputeShadowFade(shadowFadeDistance);
+ attenuation = saturate(attenuation + shadowFade);
+ return attenuation;
+ }
+
+ float calculateAOMap(float AOMap, float AOStrength)
+ {
+ return lerp(1, AOMap, AOStrength);
+ }
+
+ void calculateBasePassLighting(float3 normal, float2 uv)
+ {
+ poiLight.direction = _WorldSpaceLightPos0;
+ poiLight.nDotL = dot(normal, poiLight.direction);
+ float AOMap = 1;
+ #ifndef OUTLINE
+ AOMap = UNITY_SAMPLE_TEX2D_SAMPLER(_AOMap, _MainTex, TRANSFORM_TEX(uv, _AOMap));
+ AOMap = calculateAOMap(AOMap, _AOStrength);
+ #endif
+ poiLight.finalLighting = saturate((GetSHLength() + poiLight.color) * AOMap);
+ }
+
+ void calculateDNDLighting(v2f i)
+ {
+ #ifdef OUTLINE
+ _ShadowStrength = _OutlineShadowStrength;
+ #endif
+ UNITY_LIGHT_ATTENUATION(attenuation, i, i.worldPos.xyz)
+ poiLight.attenuation = FadeShadows(attenuation, i.worldPos.xyz);
+ poiLight.color = _LightColor0.rgb;
+ #ifdef FORWARD_BASE_PASS
+ calculateBasePassLighting(i.normal, i.uv);
+ #else
+ #if defined(POINT) || defined(SPOT)
+ poiLight.position = _WorldSpaceLightPos0.xyz;
+ poiLight.direction = normalize(poiLight.position - i.worldPos);
+ poiLight.nDotL = dot(i.normal, poiLight.direction);
+ poiLight.finalLighting = poiLight.color * poiLight.attenuation * smoothstep(.499, .5, .5 * poiLight.nDotL + .5);
+ #endif
+ #endif
+ }
+
+ void applyDNDLighting(inout float4 finalColor)
+ {
+ finalColor.rgb *= poiLight.finalLighting;
+ }
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDragNDropLighting.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDragNDropLighting.cginc.meta
new file mode 100644
index 00000000..1b94adcd
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiDragNDropLighting.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 929b21dd7eb613f47bc07ab065883762
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiEmission.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiEmission.cginc
new file mode 100644
index 00000000..07c47016
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiEmission.cginc
@@ -0,0 +1,52 @@
+#ifndef EMISSION
+ #define EMISSION
+
+ float4 _EmissionColor;
+ sampler2D _EmissionMap; float4 _EmissionMap_ST;
+ sampler2D _EmissionMask; float4 _EmissionMask_ST;
+ float _EmissionStrength;
+
+ float4 _EmissiveScroll_Direction;
+ float4 _EmissionScrollSpeed;
+ float _EmissiveScroll_Width;
+ float _EmissiveScroll_Velocity;
+ float _EmissiveScroll_Interval;
+ float _EmissiveBlink_Min;
+ float _EmissiveBlink_Max;
+ float _EmissiveBlink_Velocity;
+ float _ScrollingEmission;
+
+ float4 emission = 0;
+
+ void calculateEmission(float2 uv, float3 localPos)
+ {
+ float4 _Emissive_Tex_var = tex2D(_EmissionMap, TRANSFORM_TEX(uv, _EmissionMap) + _Time.y * _EmissionScrollSpeed);
+ emission = _Emissive_Tex_var * _EmissionColor * _EmissionStrength;
+
+ // scrolling emission
+ if (_ScrollingEmission == 1)
+ {
+ float phase = dot(localPos, _EmissiveScroll_Direction);
+ phase -= _Time.y * _EmissiveScroll_Velocity;
+ phase /= _EmissiveScroll_Interval;
+ phase -= floor(phase);
+ float width = _EmissiveScroll_Width;
+ phase = (pow(phase, width) + pow(1 - phase, width * 4)) * 0.5;
+ emission *= phase;
+ }
+
+ // blinking emission
+ float amplitude = (_EmissiveBlink_Max - _EmissiveBlink_Min) * 0.5f;
+ float base = _EmissiveBlink_Min + amplitude;
+ float emissiveBlink = sin(_Time.y * _EmissiveBlink_Velocity) * amplitude + base;
+ emission *= emissiveBlink;
+
+ float _Emission_mask_var = tex2D(_EmissionMask, TRANSFORM_TEX(uv, _EmissionMask));
+ emission *= _Emission_mask_var;
+ }
+
+ void applyEmission(inout float4 finalColor)
+ {
+ finalColor.rgb += emission;
+ }
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiEmission.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiEmission.cginc.meta
new file mode 100644
index 00000000..552c0295
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiEmission.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 47ebba48949726e48984026733ee5648
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFrag.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFrag.cginc
new file mode 100644
index 00000000..7d277674
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFrag.cginc
@@ -0,0 +1,159 @@
+#ifndef POIFRAG
+ #define POIFRAG
+
+ int _CubeGradientDebug;
+
+ float4 frag(v2f i, float facing: VFACE): SV_Target
+ {
+ if (_CubeGradientDebug == 1)
+ {
+ float4 debugCol = frac(i.localPos.z);
+ if(debugCol.x <= 0.001)
+ {
+ debugCol.rgb = float3(1,0,0);
+ }
+ return debugCol;
+ }
+
+ #ifdef BASICS
+ calculateBasics(i);
+ #endif
+
+ #ifdef LIGHTING
+ calculateLighting(i);
+ #endif
+
+ #ifdef DND_LIGHTING
+ calculateDNDLighting(i);
+ #endif
+
+ #ifdef FORWARD_BASE_PASS
+ #ifdef REFRACTION
+ calculateRefraction(i);
+ #endif
+ #endif
+
+ #ifdef METAL
+ calculateReflections(i.uv, i.normal, viewDirection);
+ #endif
+
+ #ifdef TEXTURE_BLENDING
+ calculateTextureBlending(blendAlpha, mainTexture, albedo, i.uv);
+ #endif
+
+ clip(mainTexture.a * alphaMask - _Clip);
+
+ #ifdef MATCAP
+ calculateMatcap(viewDirection, i.normal, i.uv);
+ #endif
+
+ #ifdef LIGHTING
+ #ifdef SUBSURFACE
+ calculateSubsurfaceScattering(i, viewDirection);
+ #endif
+ #endif
+
+ #ifdef RIM_LIGHTING
+ calculateRimLighting(i.uv, viewDotNormal);
+ #endif
+
+ #ifdef PANOSPHERE
+ calculatePanosphere(i.worldPos, i.uv);
+ #endif
+
+ #ifdef SCROLLING_LAYERS
+ calculateScrollingLayers(i.uv);
+ #endif
+
+ #ifdef EMISSION
+ calculateEmission(i.uv, i.localPos);
+ #endif
+
+ float4 finalColor = albedo;
+
+ #ifdef RIM_LIGHTING
+ applyRimColor(finalColor);
+ #endif
+
+ #ifdef MATCAP
+ applyMatcap(finalColor);
+ #endif
+
+ #ifdef PANOSPHERE
+ applyPanosphereColor(finalColor);
+ #endif
+
+ #ifdef FORWARD_BASE_PASS
+ #ifdef REFRACTION
+ applyRefraction(finalColor);
+ #endif
+ #endif
+
+
+ float4 finalColorBeforeLighting = finalColor;
+
+ #ifdef LIGHTING
+ applyLighting(finalColor);
+ #endif
+
+ #ifdef DND_LIGHTING
+ applyDNDLighting(finalColor);
+ #endif
+
+ #ifdef METAL
+ applyReflections(finalColor, finalColorBeforeLighting);
+ #endif
+
+ #ifdef SPECULAR
+ calculateSpecular(i.normal, albedo, viewDirection, i.uv);
+ #endif
+
+ #ifdef FORWARD_BASE_PASS
+ #ifdef LIGHTING
+ #ifdef SPECULAR
+ //applyLightingToSpecular();
+ applySpecular(finalColor);
+ #endif
+ #endif
+
+ #ifdef PANOSPHERE
+ applyPanosphereEmission(finalColor);
+ #endif
+
+ #ifdef EMISSION
+ applyEmission(finalColor);
+ #endif
+
+ #ifdef RIM_LIGHTING
+ ApplyRimEmission(finalColor);
+ #endif
+ #endif
+
+ #ifdef LIGHTING
+ #if (defined(POINT) || defined(SPOT))
+ #ifdef METAL
+ applyAdditiveReflectiveLighting(finalColor);
+ #endif
+ #ifdef TRANSPARENT
+ finalColor.rgb *= finalColor.a;
+ #endif
+
+ #ifdef SPECULAR
+ applySpecular(finalColor);
+ #endif
+ #endif
+ #endif
+
+ #ifdef LIGHTING
+ #ifdef SUBSURFACE
+ applySubsurfaceScattering(finalColor);
+ #endif
+ #endif
+
+ #ifdef FORWARD_BASE_PASS
+ UNITY_APPLY_FOG(i.fogCoord, finalColor);
+ #endif
+
+ return finalColor;
+ }
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFrag.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFrag.cginc.meta
new file mode 100644
index 00000000..5e3093b0
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFrag.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a7be1d5beafa95c4eb95a33bd490f22f
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFun.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFun.cginc
new file mode 100644
index 00000000..102f2f8e
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFun.cginc
@@ -0,0 +1,62 @@
+#ifndef FUN
+ #define FUN
+
+ int _Mirror;
+
+ void applyFun(inout float4 vertex)
+ {
+ bool inMirror = IsInMirror();
+ UNITY_BRANCH
+ if (_Mirror == 0)
+ {
+ return;
+ }
+ if(_Mirror == 1 && inMirror)
+ {
+ return;
+ }
+ if(_Mirror == 1 && !inMirror)
+ {
+ vertex = -1;
+ return;
+ }
+ if(_Mirror == 2 && inMirror)
+ {
+ vertex = -1;
+ return;
+ }
+ if(_Mirror == 2 && !inMirror)
+ {
+ return;
+ }
+ }
+
+ void applyFunFrag()
+ {
+ bool inMirror = IsInMirror();
+ UNITY_BRANCH
+ if(_Mirror == 0)
+ {
+ return;
+ }
+ if(_Mirror == 1 && inMirror)
+ {
+ return;
+ }
+ if(_Mirror == 1 && !inMirror)
+ {
+ clip(-1);
+ return;
+ }
+ if(_Mirror == 2 && inMirror)
+ {
+ clip(-1);
+ return;
+ }
+ if(_Mirror == 2 && !inMirror)
+ {
+ return;
+ }
+ }
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFun.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFun.cginc.meta
new file mode 100644
index 00000000..5fc6b222
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiFun.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f04ca200839efd84d96d09eb392df59a
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiGeom.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiGeom.cginc
new file mode 100644
index 00000000..977eac1d
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiGeom.cginc
@@ -0,0 +1,240 @@
+struct Cube
+{
+ float3 min;
+ float3 max;
+};
+
+float random(in float3 st)
+{
+ return frac(cos(dot(st.xyz, float3(12.9898, 78.233, 123.691))) * 43758.5453123);
+}
+
+float _TriToCube;
+float _SpawnAlpha;
+float3 _LocalSpawnOffset;
+float3 _WorldSpawnOffset;
+float _Pieces;
+int _AssemblyMode;
+float3 _AssemblyBegin;
+float3 _AssemblyEnd;
+int _ExplodeMode;
+float _ExplodeFadeDistance;
+
+void assembleVert(float3 newPos, v2f i, float2 newUV, float alpha, inout v2f o)
+{
+ float3 worldPos = lerp(i.worldPos, newPos, alpha);
+ o.uv = lerp(i.uv, newUV, _TriToCube);
+ o.pos = UnityWorldToClipPos(float4(worldPos, 1));
+ o.worldPos = float4(worldPos, 1);
+}
+
+[maxvertexcount(18)]
+void geom(triangle v2f IN[3], inout TriangleStream < v2f > tristream)
+{
+ float3 edgeA = IN[1].localPos - IN[0].localPos;
+ float3 edgeB = IN[2].localPos - IN[0].localPos;
+ float3 c = cross(edgeA, edgeB);
+ float3 outDir = normalize(c);
+
+ float4 center = (IN[0].worldPos + IN[1].worldPos + IN[2].worldPos) / 3;
+ float2 uv = (IN[0].uv + IN[1].uv + IN[2].uv) / 3;
+ Cube cube;
+ v2f o;
+
+ float rando = random(float3(IN[0].vertexId, IN[1].vertexId, IN[2].vertexId));
+ //center += rando/50;
+ // Calculate Cube Bounds
+ cube.min = IN[0].worldPos;
+ cube.max = IN[0].worldPos;
+ for (int i = 1; i < 3; i ++)
+ {
+ cube.min = float3(min(IN[i].worldPos.x, cube.min.x), min(IN[i].worldPos.y, cube.min.y), min(IN[i].worldPos.z, cube.min.z));
+ cube.max = float3(max(IN[i].worldPos.x, cube.max.x), max(IN[i].worldPos.y, cube.max.y), max(IN[i].worldPos.z, cube.max.z));
+ }
+ cube.min = lerp(cube.min, center, rando / 20);
+ cube.max = lerp(cube.max, center, rando / 20);
+ float4 offset = 0;
+ if (_ExplodeMode == 0)
+ {
+ offset = float4(_WorldSpawnOffset, 0) + mul(unity_ObjectToWorld, _LocalSpawnOffset);
+ }
+ else if(_ExplodeMode == 1)
+ {
+ offset = float4(outDir * _ExplodeFadeDistance, 0);
+ }
+
+ float4 cameraExplodeOffset = 0;
+
+ float spawnAlpha = 0;
+
+ if(_AssemblyMode == 0) // Random
+ {
+ spawnAlpha = saturate((-rando) * _Pieces + (_SpawnAlpha * (_Pieces + 1)));
+ }
+ else if (_AssemblyMode == 1) // Building Blocks
+ {
+ float lineMagnitude = distance(_AssemblyBegin, _AssemblyEnd);
+ float3 constructionLine = (_AssemblyEnd - _AssemblyBegin);
+ float3 objectLine = (mul(unity_WorldToObject, center) - _AssemblyBegin);
+ float progress = -1 + saturate(dot(constructionLine, objectLine) / (lineMagnitude * lineMagnitude));
+
+ IN[0].localPos.z = progress;
+ IN[1].localPos.z = progress;
+ IN[2].localPos.z = progress;
+
+ spawnAlpha = saturate((progress) * _Pieces + (_SpawnAlpha * (_Pieces + 1)));
+ }
+
+ cube.min = lerp(cube.min, center + offset, spawnAlpha);
+ cube.max = lerp(cube.max, center + offset, spawnAlpha);
+
+ // Construct Cubes
+ float3 normal = float3(0, 0, 1);
+ o = IN[0];
+ o.uv = lerp(o.uv, uv, _TriToCube);
+
+ IN[0].worldPos = lerp(IN[0].worldPos, center + offset, spawnAlpha);
+ IN[1].worldPos = lerp(IN[1].worldPos, center + offset, spawnAlpha);
+ IN[2].worldPos = lerp(IN[2].worldPos, center + offset, spawnAlpha);
+
+
+ if (_TriToCube == 0)
+ {
+ for (int i = 0; i < 3; i ++)
+ {
+ IN[i].pos = UnityWorldToClipPos(IN[i].worldPos);
+ tristream.Append(IN[i]);
+ }
+ tristream.RestartStrip();
+ return;
+ }
+
+ float3 viewDirection = normalize(center - getCameraPosition());
+
+ //Front
+ o.normal = float3(0, 0, 1);
+ if (dot(viewDirection, o.normal) < 0)
+ {
+ assembleVert(float3(cube.min.x, cube.min.y, cube.max.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.min.y, cube.max.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.max.y, cube.max.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ assembleVert(float3(cube.max.x, cube.max.y, cube.max.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.max.y, cube.max.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.min.y, cube.max.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ }
+
+ //Back
+ o.normal = float3(0, 0, -1);
+ if (dot(viewDirection, o.normal) < 0)
+ {
+ assembleVert(float3(cube.min.x, cube.max.y, cube.min.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.min.y, cube.min.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.min.y, cube.min.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ assembleVert(float3(cube.max.x, cube.min.y, cube.min.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.max.y, cube.min.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.max.y, cube.min.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ }
+
+ //-x
+ o.normal = float3(1, 0, 0);
+ if (dot(viewDirection, o.normal) < 0)
+ {
+ assembleVert(float3(cube.max.x, cube.max.y, cube.min.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.min.y, cube.max.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.min.y, cube.min.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ assembleVert(float3(cube.max.x, cube.min.y, cube.max.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.max.y, cube.min.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.max.y, cube.max.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ }
+
+ //+x
+ o.normal = float3(-1, 0, 0);
+ if (dot(viewDirection, o.normal) < 0)
+ {
+ assembleVert(float3(cube.min.x, cube.min.y, cube.min.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.min.y, cube.max.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.max.y, cube.min.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ assembleVert(float3(cube.min.x, cube.max.y, cube.max.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.max.y, cube.min.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.min.y, cube.max.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ }
+
+ //up
+ o.normal = float3(0, 1, 0);
+ if (dot(viewDirection, o.normal) < 0)
+ {
+ assembleVert(float3(cube.min.x, cube.max.y, cube.max.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.max.y, cube.min.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.max.y, cube.min.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ assembleVert(float3(cube.max.x, cube.max.y, cube.min.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.max.y, cube.max.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.max.y, cube.max.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ }
+
+ //down
+ o.normal = float3(0, -1, 0);
+ if (dot(viewDirection, o.normal) < 0)
+ {
+ assembleVert(float3(cube.min.x, cube.min.y, cube.min.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.min.y, cube.min.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.min.y, cube.max.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ assembleVert(float3(cube.max.x, cube.min.y, cube.max.z), IN[0], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.min.x, cube.min.y, cube.max.z), IN[1], uv, _TriToCube, o);
+ tristream.Append(o);
+ assembleVert(float3(cube.max.x, cube.min.y, cube.min.z), IN[2], uv, _TriToCube, o);
+ tristream.Append(o);
+ tristream.RestartStrip();
+ }
+ /*
+ for (int i = 0; i < 3; i ++)
+ {
+ IN[i].uv = uv;
+ tristream.Append(IN[i]);
+ }
+ */
+} \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiGeom.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiGeom.cginc.meta
new file mode 100644
index 00000000..c5e1e965
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiGeom.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0110416f419d6c1428eff564e8bba8a8
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiHelpers.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiHelpers.cginc
new file mode 100644
index 00000000..a5ad08db
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiHelpers.cginc
@@ -0,0 +1,42 @@
+// Normals
+float3 CreateBinormal(float3 normal, float3 tangent, float binormalSign)
+{
+ return cross(normal, tangent.xyz) *
+ (binormalSign * unity_WorldTransformParams.w);
+}
+
+bool IsInMirror()
+{
+ return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f;
+}
+
+// Camera
+float3 getCameraPosition()
+{
+ #ifdef USING_STEREO_MATRICES
+ return lerp(unity_StereoWorldSpaceCameraPos[0], unity_StereoWorldSpaceCameraPos[1], 0.5);
+ #endif
+ return _WorldSpaceCameraPos;
+}
+
+float3 getCameraForward()
+{
+ #if UNITY_SINGLE_PASS_STEREO
+ float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1));
+ float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1));
+ #else
+ float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1));
+ float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1));
+ #endif
+ return normalize(p2 - p1);
+}
+
+float3 grayscale_vector_node()
+{
+ return float3(0, 0.3823529, 0.01845836);
+}
+
+float3 grayscale_for_light()
+{
+ return float3(0.298912, 0.586611, 0.114478);
+} \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiHelpers.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiHelpers.cginc.meta
new file mode 100644
index 00000000..913b16d6
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiHelpers.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4046024b56935044b9bb885280ad296d
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiLighting.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiLighting.cginc
new file mode 100644
index 00000000..be9c72f1
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiLighting.cginc
@@ -0,0 +1,124 @@
+#ifndef LIGHTING
+ #define LIGHTING
+
+ int _LightingType;
+ sampler2D _ToonRamp;
+ float _AdditiveSoftness;
+ float _AdditiveOffset;
+ float _ForceLightDirection;
+ float _ShadowStrength;
+ float _OutlineShadowStrength;
+ float _ShadowOffset;
+ float3 _LightDirection;
+ float _ForceShadowStrength;
+ float _CastedShadowSmoothing;
+ float _MinBrightness;
+ float _MaxBrightness;
+ float _IndirectContribution;
+ float _AttenuationMultiplier;
+
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_AOMap); float4 _AOMap_ST;
+ float _AOStrength;
+
+ float3 ShadeSH9Indirect()
+ {
+ return ShadeSH9(half4(0.0, -1.0, 0.0, 1.0));
+ }
+
+ float3 ShadeSH9Direct()
+ {
+ return ShadeSH9(half4(0.0, 1.0, 0.0, 1.0));
+ }
+
+ float3 ShadeSH9Normal(float3 normalDirection)
+ {
+ return ShadeSH9(half4(normalDirection, 1.0));
+ }
+
+ half3 GetSHLength()
+ {
+ half3 x, x1;
+ x.r = length(unity_SHAr);
+ x.g = length(unity_SHAg);
+ x.b = length(unity_SHAb);
+ x1.r = length(unity_SHBr);
+ x1.g = length(unity_SHBg);
+ x1.b = length(unity_SHBb);
+ return x + x1;
+ }
+
+ float FadeShadows(float attenuation, float3 worldPosition)
+ {
+ float viewZ = dot(_WorldSpaceCameraPos - worldPosition, UNITY_MATRIX_V[2].xyz);
+ float shadowFadeDistance = UnityComputeShadowFadeDistance(worldPosition, viewZ);
+ float shadowFade = UnityComputeShadowFade(shadowFadeDistance);
+ attenuation = saturate(attenuation + shadowFade);
+ return attenuation;
+ }
+
+ float calculateAOMap(float AOMap, float AOStrength)
+ {
+ return lerp(1, AOMap, AOStrength);
+ }
+
+ void calculateBasePassLighting(float3 normal, float2 uv)
+ {
+ poiLight.direction = _WorldSpaceLightPos0;
+ poiLight.nDotL = dot(normal, poiLight.direction);
+ float AOMap = 1;
+ #ifndef OUTLINE
+ AOMap = UNITY_SAMPLE_TEX2D_SAMPLER(_AOMap, _MainTex, TRANSFORM_TEX(uv, _AOMap));
+ AOMap = calculateAOMap(AOMap, _AOStrength);
+ #endif
+
+ float3 grayscale_vector = grayscale_for_light();
+ float3 ShadeSH9Plus = GetSHLength();
+ float3 ShadeSH9Minus = ShadeSH9(float4(0, 0, 0, 1));
+ poiLight.directLighting = ShadeSH9Plus + poiLight.color;
+ poiLight.indirectLighting = ShadeSH9Minus;
+
+ float bw_lightColor = dot(poiLight.color, grayscale_vector);
+ float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, _AttenuationMultiplier)) + dot(ShadeSH9Normal(normal), grayscale_vector));
+ float bw_bottomIndirectLighting = dot(ShadeSH9Minus, grayscale_vector);
+ float bw_topIndirectLighting = dot(ShadeSH9Plus, grayscale_vector);
+ float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting);
+ poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting);
+ poiLight.rampedLightMap = tex2D(_ToonRamp, poiLight.lightMap + _ShadowOffset);
+
+ if (_LightingType == 0)
+ {
+ poiLight.finalLighting = lerp(saturate(poiLight.indirectLighting), lerp(poiLight.directLighting, poiLight.indirectLighting, _IndirectContribution), lerp(1, poiLight.rampedLightMap, _ShadowStrength)) * AOMap;
+ }
+ else
+ {
+ poiLight.finalLighting = saturate(poiLight.directLighting) * lerp(1, poiLight.rampedLightMap, _ShadowStrength) * AOMap;
+ }
+
+ poiLight.finalLighting = clamp(poiLight.finalLighting, _MinBrightness, _MaxBrightness);
+ }
+
+ void calculateLighting(v2f i)
+ {
+ #ifdef OUTLINE
+ _ShadowStrength = _OutlineShadowStrength;
+ #endif
+ UNITY_LIGHT_ATTENUATION(attenuation, i, i.worldPos.xyz)
+ poiLight.attenuation = FadeShadows(attenuation, i.worldPos.xyz);
+ poiLight.color = _LightColor0.rgb;
+ #ifdef FORWARD_BASE_PASS
+ calculateBasePassLighting(i.normal, i.uv);
+ #else
+ #if defined(POINT) || defined(SPOT)
+ poiLight.position = _WorldSpaceLightPos0.xyz;
+ poiLight.direction = normalize(poiLight.position - i.worldPos);
+ poiLight.nDotL = dot(i.normal, poiLight.direction);
+ poiLight.finalLighting = poiLight.color * poiLight.attenuation * smoothstep(.5 - _AdditiveSoftness + _AdditiveOffset, .5 + _AdditiveSoftness + _AdditiveOffset, .5 * poiLight.nDotL + .5);
+ #endif
+ #endif
+ }
+
+ void applyLighting(inout float4 finalColor)
+ {
+ finalColor.rgb *= poiLight.finalLighting;
+ }
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiLighting.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiLighting.cginc.meta
new file mode 100644
index 00000000..9d5b777f
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiLighting.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2c84013c28d21ab44a17e487e5202242
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMacros.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMacros.cginc
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMacros.cginc
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMacros.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMacros.cginc.meta
new file mode 100644
index 00000000..a9954ea2
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMacros.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ad8c37b1d1291e44da5c6ec1a305cd8c
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMatcap.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMatcap.cginc
new file mode 100644
index 00000000..4ed825f9
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMatcap.cginc
@@ -0,0 +1,36 @@
+#ifndef MATCAP
+ #define MATCAP
+
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_Matcap);
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_MatcapMap); float4 _MatcapMap_ST;
+ float4 _MatcapColor;
+ float _MatcapStrength;
+ float _ReplaceWithMatcap;
+ float _MultiplyMatcap;
+ float _AddMatcap;
+
+ float3 matcap;
+ float matcapMask;
+
+ float2 getMatcapUV(float3 viewDirection, float3 normalDirection)
+ {
+ half3 worldViewUp = normalize(half3(0, 1, 0) - viewDirection * dot(viewDirection, half3(0, 1, 0)));
+ half3 worldViewRight = normalize(cross(viewDirection, worldViewUp));
+ half2 matcapUV = half2(dot(worldViewRight, normalDirection), dot(worldViewUp, normalDirection)) * 0.5 + 0.5;
+ return matcapUV;
+ }
+
+ void calculateMatcap(float3 cameraToVert, float3 normal, float2 uv)
+ {
+ float2 matcapUV = getMatcapUV(cameraToVert, normal);
+ matcap = UNITY_SAMPLE_TEX2D_SAMPLER(_Matcap, _MainTex, matcapUV) * _MatcapColor * _MatcapStrength;
+ matcapMask = UNITY_SAMPLE_TEX2D_SAMPLER(_MatcapMap, _MainTex, TRANSFORM_TEX(uv, _MatcapMap));
+ }
+
+ void applyMatcap(inout float4 finalColor)
+ {
+ finalColor.rgb = lerp(finalColor, matcap, _ReplaceWithMatcap * matcapMask);
+ finalColor.rgb *= lerp(1, matcap, _MultiplyMatcap * matcapMask);
+ finalColor.rgb += matcap * _AddMatcap * matcapMask;
+ }
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMatcap.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMatcap.cginc.meta
new file mode 100644
index 00000000..d9411dbf
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMatcap.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9e7eb4a81e5a57243b485f097c939493
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMetal.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMetal.cginc
new file mode 100644
index 00000000..43d84dc7
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMetal.cginc
@@ -0,0 +1,77 @@
+#ifndef METAL
+ #define METAL
+
+ samplerCUBE _CubeMap;
+ float _SampleWorld;
+ float _PurelyAdditive;
+ sampler2D _MetallicMap; float4 _MetallicMap_ST;
+ float _Metallic;
+ sampler2D _SmoothnessMap; float4 _SmoothnessMap_ST;
+ float _InvertSmoothness;
+ float _Smoothness;
+
+ float3 finalreflections;
+ float metalicMap;
+ float3 reflection;
+ float roughness;
+ float lighty_boy_uwu_var;
+
+ void calculateReflections(float2 uv, float3 normal, float3 cameraToVert)
+ {
+ metalicMap = tex2D(_MetallicMap, TRANSFORM_TEX(uv, _MetallicMap)) * _Metallic;
+ float _Smoothness_map_var = (tex2D(_SmoothnessMap, TRANSFORM_TEX(uv, _SmoothnessMap)));
+ if (_InvertSmoothness == 1)
+ {
+ _Smoothness_map_var = 1 - _Smoothness_map_var;
+ }
+ _Smoothness_map_var *= _Smoothness;
+ roughness = 1 - _Smoothness_map_var;
+ roughness *= 1.7 - 0.7 * roughness;
+ float3 reflectedDir = reflect(-cameraToVert, normal);
+
+ float4 envSample = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, reflectedDir, roughness * UNITY_SPECCUBE_LOD_STEPS);
+
+ float interpolator = unity_SpecCube0_BoxMin.w;
+ UNITY_BRANCH
+ if(interpolator < 0.99999)
+ {
+ //Probe 1
+ float4 reflectionData0 = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, reflectedDir, roughness * UNITY_SPECCUBE_LOD_STEPS);
+ float3 reflectionColor0 = DecodeHDR(reflectionData0, unity_SpecCube0_HDR);
+
+ //Probe 2
+ float4 reflectionData1 = UNITY_SAMPLE_TEXCUBE_SAMPLER_LOD(unity_SpecCube1, unity_SpecCube0, reflectedDir, roughness * UNITY_SPECCUBE_LOD_STEPS);
+ float3 reflectionColor1 = DecodeHDR(reflectionData1, unity_SpecCube1_HDR);
+
+ reflection = lerp(reflectionColor1, reflectionColor0, interpolator);
+ }
+ else
+ {
+ float4 reflectionData = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, reflectedDir, roughness * UNITY_SPECCUBE_LOD_STEPS);
+ reflection = DecodeHDR(reflectionData, unity_SpecCube0_HDR);
+ }
+
+ bool no_probe = unity_SpecCube0_HDR.a == 0 && envSample.a == 0;
+ lighty_boy_uwu_var = 0;
+ if (no_probe || _SampleWorld)
+ {
+ lighty_boy_uwu_var = 1;
+ reflection = texCUBElod(_CubeMap, float4(reflectedDir, roughness * UNITY_SPECCUBE_LOD_STEPS));
+ }
+ }
+
+ void applyReflections(inout float4 finalColor, float4 finalColorBeforeLighting)
+ {
+ #ifdef FORWARD_BASE_PASS
+ finalreflections = reflection.rgb * lerp(finalColorBeforeLighting.rgb, 1, _PurelyAdditive);
+ finalColor.rgb = finalColor.rgb * (1 - metalicMap);
+ finalColor.rgb += (finalreflections * ((1 - roughness + metalicMap) / 2)) * lerp(1, poiLight.finalLighting, lighty_boy_uwu_var);
+ #endif
+ }
+
+ void applyAdditiveReflectiveLighting(inout float4 finalColor)
+ {
+ finalColor *= (1 - metalicMap);
+ }
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMetal.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMetal.cginc.meta
new file mode 100644
index 00000000..36c6e192
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMetal.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7c691dfa699477f4190c7b70403a3f36
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineFrag.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineFrag.cginc
new file mode 100644
index 00000000..52cba137
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineFrag.cginc
@@ -0,0 +1,26 @@
+ float4 frag(v2f i, float facing: VFACE): COLOR
+ {
+ float alphaMultiplier = smoothstep(_OutlineFadeDistance.x, _OutlineFadeDistance.y, distance(getCameraPosition(), i.worldPos));
+ clip(_LineWidth - 0.001);
+ float _alphaMask_tex_var = tex2D(_AlphaMask, TRANSFORM_TEX(i.uv, _AlphaMask));
+ fixed4 _main_tex_var = UNITY_SAMPLE_TEX2D(_MainTex, TRANSFORM_TEX(i.uv, _MainTex));
+ fixed4 col = tex2D(_OutlineTexture, TRANSFORM_TEX((i.uv + (_OutlineTexturePan.xy * _Time.g)), _OutlineTexture));
+ col.a *= alphaMultiplier;
+
+ clip(col.a * _alphaMask_tex_var - _Clip);
+
+ col *= _LineColor;
+
+ #ifdef LIGHTING
+ calculateLighting(i);
+ #endif
+
+ float4 finalColor = col;
+
+ #ifdef LIGHTING
+ applyLighting(finalColor);
+ #endif
+
+ finalColor.rgb += (col.rgb * _OutlineEmission);
+ return finalColor;
+ } \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineFrag.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineFrag.cginc.meta
new file mode 100644
index 00000000..5ddf8ab9
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineFrag.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3245036ffbf442745a7f0038571b9d7d
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineIncludes.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineIncludes.cginc
new file mode 100644
index 00000000..2057bc8b
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineIncludes.cginc
@@ -0,0 +1,46 @@
+
+#ifndef POICLUDES
+ #define POICLUDES
+
+ #include "PoiData.cginc"
+ #include "UnityCG.cginc"
+ #include "Lighting.cginc"
+ #include "UnityPBSLighting.cginc"
+ #include "AutoLight.cginc"
+
+ UNITY_DECLARE_TEX2D(_MainTex); float4 _MainTex_ST;
+ float _LineWidth;
+ float _OutlineEmission;
+ float4 _LineColor;
+ float4 _Color;
+ float _Clip;
+ sampler2D _OutlineTexture; float4 _OutlineTexture_ST;
+ sampler2D _AlphaMask; float4 _AlphaMask_ST;
+ float4 _OutlineTexturePan;
+
+ float4 _OutlineFadeDistance;
+ float4 _OutlineGlobalPan;
+
+ struct VertexInput
+ {
+ float4 vertex: POSITION;
+ float3 normal: NORMAL;
+ float2 texcoord0: TEXCOORD0;
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ };
+ struct v2f
+ {
+ float4 pos: SV_POSITION;
+ float2 uv: TEXCOORD0;
+ float3 normal: TEXCOORD1;
+ float3 worldPos: TEXCOORD2;
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ UNITY_VERTEX_OUTPUT_STEREO
+ UNITY_SHADOW_COORDS(3)
+ UNITY_FOG_COORDS(4)
+ };
+
+ static PoiLighting poiLight;
+ float pi;
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineIncludes.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineIncludes.cginc.meta
new file mode 100644
index 00000000..b54d15c6
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineIncludes.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8bc5e7c580bf74f4daf36e44f0bcc552
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineVert.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineVert.cginc
new file mode 100644
index 00000000..d82223d2
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineVert.cginc
@@ -0,0 +1,28 @@
+#ifndef OutlineVert
+ #define OutlineVert
+
+ v2f vert(VertexInput v)
+ {
+ v2f o;
+ UNITY_SETUP_INSTANCE_ID(v);
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
+ UNITY_TRANSFER_INSTANCE_ID(v, o);
+
+ #ifdef FUN
+ applyFun(v.vertex);
+ #endif
+
+ o.uv = v.texcoord0 + _OutlineGlobalPan.xy * _Time.y;
+
+ o.normal = UnityObjectToWorldNormal(v.normal);
+ float3 offset = o.normal * (_LineWidth/100);
+ o.worldPos = mul(unity_ObjectToWorld, v.vertex) + float4(offset,0);
+
+ o.pos = UnityWorldToClipPos(o.worldPos);
+
+ UNITY_TRANSFER_SHADOW(o, o.uv);
+ UNITY_TRANSFER_FOG(o, o.pos);
+ return o;
+ }
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineVert.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineVert.cginc.meta
new file mode 100644
index 00000000..8552b862
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiOutlineVert.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 31c5e772bdbeb7e438a6cb639b69815a
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPanosphere.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPanosphere.cginc
new file mode 100644
index 00000000..d167c6a0
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPanosphere.cginc
@@ -0,0 +1,41 @@
+#ifndef PANOSPHERE
+ #define PANOSPHERE
+
+ sampler2D _PanosphereTexture; float4 _PanosphereTexture_ST;
+ sampler2D _PanoMapTexture; float4 _PanoMapTexture_ST;
+ float _PanoEmission;
+ float _PanoBlend;
+ float4 _PanosphereColor;
+ float4 _PanosphereScroll;
+
+ float3 panoColor;
+ float panoMask;
+
+ float2 StereoPanoProjection(float3 coords)
+ {
+ float3 normalizedCoords = normalize(coords);
+ float latitude = acos(normalizedCoords.y);
+ float longitude = atan2(normalizedCoords.z, normalizedCoords.x);
+ float2 sphereCoords = float2(longitude + _Time.y * _PanosphereScroll.x, latitude + _Time.y * _PanosphereScroll.y) * float2(0.5 / UNITY_PI, 1.0 / UNITY_PI);
+ sphereCoords = float2(0.5, 1.0) - sphereCoords;
+ return(sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw;
+ }
+
+ void calculatePanosphere(float3 worldPos, float2 uv)
+ {
+ float2 _StereoEnabled_var = StereoPanoProjection(normalize(_WorldSpaceCameraPos.xyz - worldPos.xyz) * - 1);
+ panoColor = tex2D(_PanosphereTexture, TRANSFORM_TEX(_StereoEnabled_var, _PanosphereTexture)) * _PanosphereColor.rgb;
+ panoMask = tex2D(_PanoMapTexture, TRANSFORM_TEX(uv, _PanoMapTexture));
+ }
+
+ void applyPanosphereColor(inout float4 finalColor)
+ {
+ finalColor.rgb = lerp(finalColor.rgb, panoColor, _PanoBlend * panoMask);
+ }
+
+ void applyPanosphereEmission(inout float4 finalColor)
+ {
+ finalColor.rgb += panoColor * _PanoBlend * panoMask * _PanoEmission;
+ }
+
+#endif
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPanosphere.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPanosphere.cginc.meta
new file mode 100644
index 00000000..ff1c1083
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPanosphere.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: eaa1b35980202f640aba378002e247c0
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPass.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPass.cginc
new file mode 100644
index 00000000..fdcd589b
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPass.cginc
@@ -0,0 +1,28 @@
+#ifndef POI_PASS
+ #define POI_PASS
+
+ #include "Poicludes.cginc"
+ #include "PoiHelpers.cginc"
+ #include "PoiBasics.cginc"
+ #include "PoiEmission.cginc"
+ #ifndef DRAG_N_DROP
+ #include "PoiLighting.cginc"
+ #include "PoiFun.cginc"
+ #ifndef GOTTA_GO_FAST
+ #include "PoiScrollingLayers.cginc"
+ #include "PoiTextureBlending.cginc"
+ #include "PoiPanosphere.cginc"
+ #include "PoiRimlighting.cginc"
+ #include "PoiMetal.cginc"
+ #include "PoiMatcap.cginc"
+ #include "PoiSpecular.cginc"
+ #include "PoiSubsurfaceScattering.cginc"
+ #endif
+ #else
+ #include "PoiDragNDropLighting.cginc"
+ #endif
+
+ #include "PoiVert.cginc"
+ #include "PoiFrag.cginc"
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPass.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPass.cginc.meta
new file mode 100644
index 00000000..20709994
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPass.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8e55c50551f60a043b5127d93c0a7906
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassOutline.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassOutline.cginc
new file mode 100644
index 00000000..b77839ff
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassOutline.cginc
@@ -0,0 +1,18 @@
+#ifndef POI_PASS_OUTLINE
+ #define POI_PASS_OUTLINE
+
+ #pragma target 5.0
+ #pragma multi_compile_fwdbase
+ #pragma fragmentoption ARB_precision_hint_fastest
+ #pragma multi_compile_fog
+ #pragma multi_compile_instancing
+ #define FORWARD_BASE_PASS
+ #define OUTLINE
+ #include "PoiOutlineIncludes.cginc"
+ #include "PoiHelpers.cginc"
+ #include "PoiFun.cginc"
+ #include "PoiLighting.cginc"
+ #include "PoiOutlineVert.cginc"
+ #include "PoiOutlineFrag.cginc"
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassOutline.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassOutline.cginc.meta
new file mode 100644
index 00000000..a29147a7
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassOutline.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: be0358aa48706344da098705a5795d9a
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassShadow.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassShadow.cginc
new file mode 100644
index 00000000..42abd7ec
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassShadow.cginc
@@ -0,0 +1,14 @@
+#ifndef POI_PASS_SHADOW
+ #define POI_PASS_SHADOW
+
+ #pragma target 5.0
+ #pragma multi_compile_shadowcaster
+ #include "UnityCG.cginc"
+ #include "UnityShaderVariables.cginc"
+ #include "PoiShadowIncludes.cginc"
+ #include "PoiHelpers.cginc"
+ #include "PoiFun.cginc"
+ #include "PoiShadowVert.cginc"
+ #include "PoiShadowFrag.cginc"
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassShadow.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassShadow.cginc.meta
new file mode 100644
index 00000000..0d897a88
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiPassShadow.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a67f98d2ea6b4d64f82e39d30923f91e
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRefraction.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRefraction.cginc
new file mode 100644
index 00000000..6da9a05a
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRefraction.cginc
@@ -0,0 +1,49 @@
+#ifndef REFRACTION
+ #define REFRACTION
+
+ sampler2D _PoiGrab;
+ float _IndexOfRefraction;
+ float _RefractionOpacity;
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_RefractionOpacityMask); float4 _RefractionOpacityMask_ST;
+
+ float3 refraction;
+ float refractionOpacityMask;
+
+ inline float4 Refraction(v2f i, float indexOfRefraction/*, float chomaticAberration*/)
+ {
+ float4 screenPos = i.screenPos;
+ #if UNITY_UV_STARTS_AT_TOP
+ float scale = -1.0;
+ #else
+ float scale = 1.0;
+ #endif
+ float halfPosW = screenPos.w * 0.5;
+ screenPos.y = (screenPos.y - halfPosW) * _ProjectionParams.x * scale + halfPosW;
+ #if SHADER_API_D3D9 || SHADER_API_D3D11
+ screenPos.w += 0.00000000001;
+ #endif
+ float2 projScreenPos = (screenPos / screenPos.w).xy;
+ float3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
+ float3 refractionOffset = ((((indexOfRefraction - 1.0) * mul(UNITY_MATRIX_V, float4(i.normal, 0.0))) * (1.0 / (screenPos.z + 1.0))) * (1.0 - dot(i.normal, worldViewDir)));
+ float2 cameraRefraction = float2(refractionOffset.x, - (refractionOffset.y * _ProjectionParams.x));
+ return tex2D(_PoiGrab, (projScreenPos + cameraRefraction));
+ /*
+ float4 redAlpha = tex2D(_GrabTexture, (projScreenPos + cameraRefraction));
+ float green = tex2D(_GrabTexture, (projScreenPos + (cameraRefraction * (1.0 - chomaticAberration)))).g;
+ float blue = tex2D(_GrabTexture, (projScreenPos + (cameraRefraction * (1.0 + chomaticAberration)))).b;
+ return float4(redAlpha.r, green, blue, redAlpha.a);
+ */
+ }
+
+ void calculateRefraction(v2f i)
+ {
+ refraction = Refraction(i, _IndexOfRefraction).rgb;
+ refractionOpacityMask = UNITY_SAMPLE_TEX2D_SAMPLER(_RefractionOpacityMask, _MainTex, TRANSFORM_TEX(i.uv, _RefractionOpacityMask));
+ }
+
+ void applyRefraction(inout float4 finalColor)
+ {
+ finalColor.rgb = lerp(refraction, finalColor, _RefractionOpacity * refractionOpacityMask);
+ }
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRefraction.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRefraction.cginc.meta
new file mode 100644
index 00000000..dd3363d0
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRefraction.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3b42a5209d7a47440a5f7466b1dac531
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRimLighting.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRimLighting.cginc
new file mode 100644
index 00000000..f5cacba3
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRimLighting.cginc
@@ -0,0 +1,39 @@
+#ifndef RIM_LIGHTING
+ #define RIM_LIGHTING
+
+ float4 _RimLightColor;
+ float _RimWidth;
+ float _RimStrength;
+ float _RimSharpness;
+ float _RimLightColorBias;
+ float4 _RimTexPanSpeed;
+ float _ShadowMix;
+ float _ShadowMixThreshold;
+ float _ShadowMixWidthMod;
+
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_RimTex); float4 _RimTex_ST;
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_RimMask); float4 _RimMask_ST;
+
+ float4 rimColor = float4(0, 0, 0, 0);
+ float rim = 0;
+
+ void calculateRimLighting(float2 uv, float cameraDotVert)
+ {
+ float rimMask = UNITY_SAMPLE_TEX2D_SAMPLER(_RimMask, _MainTex, TRANSFORM_TEX(uv, _RimMask));
+ rimColor = UNITY_SAMPLE_TEX2D_SAMPLER(_RimTex, _MainTex, TRANSFORM_TEX(uv, _RimTex) + (_Time.y * _RimTexPanSpeed.xy)) * _RimLightColor;
+ _RimWidth = lerp(_RimWidth,_RimWidth * lerp(0,1,poiLight.lightMap-_ShadowMixThreshold) * _ShadowMixWidthMod,_ShadowMix);
+ rim = 1-smoothstep(min(_RimSharpness,_RimWidth),_RimWidth,cameraDotVert);
+ rim *= _RimLightColor.a * rimColor.a * rimMask;
+ }
+
+ void applyRimColor(inout float4 finalColor)
+ {
+ finalColor.rgb = lerp(finalColor.rgb, lerp(finalColor.rgb, rimColor, _RimLightColorBias), rim);
+ }
+
+ void ApplyRimEmission(inout float4 finalColor)
+ {
+ finalColor.rgb += rim * rimColor * _RimStrength;
+ }
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRimLighting.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRimLighting.cginc.meta
new file mode 100644
index 00000000..02866e40
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRimLighting.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8cc181529cb7e164eb0bc84365fc12a4
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiScrollingLayers.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiScrollingLayers.cginc
new file mode 100644
index 00000000..cc27ff88
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiScrollingLayers.cginc
@@ -0,0 +1,23 @@
+#ifndef SCROLLING_LAYERS
+ #define SCROLLING_LAYERS
+
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_LayerTexture); float4 _LayerTexture_ST;
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_LayerMask); float4 _LayerMask_ST;
+ float4 _LayerColor;
+ float4 _LayerSpeed;
+ float _Layers;
+ float _LayerShrinkage;
+
+ float4 color;
+ float4 calculateScrollingLayers(float2 uv)
+ {
+ color = 0;
+
+ for (int i = 0; i < _Layers; i++) {
+ float2 uvMod = (1 + i*_LayerShrinkage) + (_Time.y * _LayerSpeed.xy);// / (1+i/3);
+ color = saturate(color + UNITY_SAMPLE_TEX2D_SAMPLER(_LayerTexture, _MainTex, TRANSFORM_TEX(uv, _LayerTexture) * uvMod )) / (1+i*2);
+ }
+
+ return color * _LayerColor;
+ }
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiScrollingLayers.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiScrollingLayers.cginc.meta
new file mode 100644
index 00000000..2e31cfb7
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiScrollingLayers.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 04d6f9981ab9b9a489db5cb7bedbe941
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowFrag.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowFrag.cginc
new file mode 100644
index 00000000..02331e51
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowFrag.cginc
@@ -0,0 +1,29 @@
+#ifndef SHADOW_FRAG
+ #define SHADOW_FRAG
+
+ half4 fragShadowCaster(
+ #if !defined(V2F_SHADOW_CASTER_NOPOS_IS_EMPTY) || defined(UNITY_STANDARD_USE_SHADOW_UVS)
+ VertexOutputShadowCaster i
+ #endif
+ ): SV_Target
+ {
+ #ifdef FUN
+ applyFunFrag();
+ #endif
+
+ #if defined(UNITY_STANDARD_USE_SHADOW_UVS)
+ half alpha = tex2D(_MainTex, TRANSFORM_TEX(i.uv, _MainTex)).a * _Color.a;
+ half alphaMask = tex2D(_AlphaMask, TRANSFORM_TEX(i.uv, _AlphaMask));
+
+ #ifdef CUTOUT
+ clip(alpha * alphaMask - _Clip);
+ #endif
+ #ifdef TRANSPARENT
+ clip(alpha * alphaMask - 0.01);
+ #endif
+ #endif
+
+ SHADOW_CASTER_FRAGMENT(i)
+ }
+
+ #endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowFrag.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowFrag.cginc.meta
new file mode 100644
index 00000000..8613fdcb
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowFrag.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e264d11d61c3f6b4da7cf7ca0afeb2b8
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowIncludes.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowIncludes.cginc
new file mode 100644
index 00000000..0bdf8e2e
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowIncludes.cginc
@@ -0,0 +1,29 @@
+#ifndef SHADOW_INCLUDES
+ #define SHADOW_INCLUDES
+
+ #define UNITY_STANDARD_USE_SHADOW_UVS 1
+
+ float4 _Color;
+ float _Clip;
+ sampler2D _MainTex; float4 _MainTex_ST;
+ float4 _GlobalPanSpeed;
+ sampler2D _AlphaMask; float4 _AlphaMask_ST;
+
+ struct VertexInput
+ {
+ float4 vertex: POSITION;
+ float3 normal: NORMAL;
+ float2 uv0: TEXCOORD0;
+ };
+
+ #if !defined(V2F_SHADOW_CASTER_NOPOS_IS_EMPTY) || defined(UNITY_STANDARD_USE_SHADOW_UVS)
+ struct VertexOutputShadowCaster
+ {
+ V2F_SHADOW_CASTER_NOPOS
+ #if defined(UNITY_STANDARD_USE_SHADOW_UVS)
+ float2 uv: TEXCOORD1;
+ #endif
+ };
+ #endif
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowIncludes.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowIncludes.cginc.meta
new file mode 100644
index 00000000..159bff8a
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowIncludes.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1e46f338a3c4bac43b616326ad55efae
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowVert.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowVert.cginc
new file mode 100644
index 00000000..a855047b
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowVert.cginc
@@ -0,0 +1,11 @@
+void vertShadowCaster(VertexInput v,
+#if !defined(V2F_SHADOW_CASTER_NOPOS_IS_EMPTY) || defined(UNITY_STANDARD_USE_SHADOW_UVS)
+ out VertexOutputShadowCaster o,
+#endif
+out float4 opos: SV_POSITION)
+{
+ TRANSFER_SHADOW_CASTER_NOPOS(o, opos)
+ #if defined(UNITY_STANDARD_USE_SHADOW_UVS)
+ o.uv = TRANSFORM_TEX(v.uv0 + _GlobalPanSpeed.xy * float2(_Time.y, _Time.y), _MainTex);
+ #endif
+} \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowVert.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowVert.cginc.meta
new file mode 100644
index 00000000..fb104209
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiShadowVert.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b779a0b47859b5444b0a513ac6ee601c
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSpecular.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSpecular.cginc
new file mode 100644
index 00000000..058bcb7c
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSpecular.cginc
@@ -0,0 +1,173 @@
+#ifndef SPECULAR
+ #define SPECULAR
+
+ int _SpecularType;
+ int _SmoothnessFrom;
+ int _SpecularColorFrom;
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_SpecularMap); float4 _SpecularMap_ST;
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_SpecularHighTexture); float4 _SpecularHighTexture_ST;
+ float4 _SpecularTint;
+ float _SpecularSmoothness;
+
+ // Globals
+ half4 finalSpecular;
+ half4 highTexture;
+
+ UnityIndirect ZeroIndirect()
+ {
+ UnityIndirect ind;
+ ind.diffuse = 0;
+ ind.specular = 0;
+ return ind;
+ }
+
+ // From unity just putting it here in case I want to mod it
+ half4 poiRealisticSpecular(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness,
+ float3 normal, float3 viewDir,
+ UnityLight light, UnityIndirect gi)
+ {
+ float perceptualRoughness = SmoothnessToPerceptualRoughness(smoothness);
+ float3 halfDir = Unity_SafeNormalize(float3(light.dir) + viewDir);
+
+ // NdotV should not be negative for visible pixels, but it can happen due to perspective projection and normal mapping
+ // In this case normal should be modified to become valid (i.e facing camera) and not cause weird artifacts.
+ // but this operation adds few ALU and users may not want it. Alternative is to simply take the abs of NdotV (less correct but works too).
+ // Following define allow to control this. Set it to 0 if ALU is critical on your platform.
+ // This correction is interesting for GGX with SmithJoint visibility function because artifacts are more visible in this case due to highlight edge of rough surface
+ // Edit: Disable this code by default for now as it is not compatible with two sided lighting used in SpeedTree.
+ #define UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV 0
+
+ #if UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV
+ // The amount we shift the normal toward the view vector is defined by the dot product.
+ half shiftAmount = dot(normal, viewDir);
+ normal = shiftAmount < 0.0f ? normal + viewDir * (-shiftAmount + 1e-5f): normal;
+ // A re-normalization should be applied here but as the shift is small we don't do it to save ALU.
+ //normal = normalize(normal);
+
+ float nv = saturate(dot(normal, viewDir)); // TODO: this saturate should no be necessary here
+ #else
+ half nv = abs(dot(normal, viewDir)); // This abs allow to limit artifact
+ #endif
+
+ float nl = saturate(dot(normal, light.dir));
+ float nh = saturate(dot(normal, halfDir));
+
+ half lv = saturate(dot(light.dir, viewDir));
+ half lh = saturate(dot(light.dir, halfDir));
+
+ // Diffuse term
+ half diffuseTerm = DisneyDiffuse(nv, nl, lh, perceptualRoughness) * nl;
+
+ // Specular term
+ // HACK: theoretically we should divide diffuseTerm by Pi and not multiply specularTerm!
+ // BUT 1) that will make shader look significantly darker than Legacy ones
+ // and 2) on engine side "Non-important" lights have to be divided by Pi too in cases when they are injected into ambient SH
+ float roughness = PerceptualRoughnessToRoughness(perceptualRoughness);
+
+ // GGX with roughtness to 0 would mean no specular at all, using max(roughness, 0.002) here to match HDrenderloop roughtness remapping.
+ roughness = max(roughness, 0.002);
+ float V = SmithJointGGXVisibilityTerm(nl, nv, roughness);
+ float D = GGXTerm(nh, roughness);
+
+ float specularTerm = V * D * UNITY_PI; // Torrance-Sparrow model, Fresnel is applied later
+
+ #ifdef UNITY_COLORSPACE_GAMMA
+ specularTerm = sqrt(max(1e-4h, specularTerm));
+ #endif
+
+ // specularTerm * nl can be NaN on Metal in some cases, use max() to make sure it's a sane value
+ specularTerm = max(0, specularTerm * nl);
+ #if defined(_SPECULARHIGHLIGHTS_OFF)
+ specularTerm = 0.0;
+ #endif
+
+ // surfaceReduction = Int D(NdotH) * NdotH * Id(NdotL>0) dH = 1/(roughness^2+1)
+ half surfaceReduction;
+ #ifdef UNITY_COLORSPACE_GAMMA
+ surfaceReduction = 1.0 - 0.28 * roughness * perceptualRoughness; // 1-0.28*x^3 as approximation for (1/(x^4+1))^(1/2.2) on the domain [0;1]
+ #else
+ surfaceReduction = 1.0 / (roughness * roughness + 1.0); // fade \in [0.5;1]
+ #endif
+
+ // To provide true Lambert lighting, we need to be able to kill specular completely.
+ specularTerm *= any(specColor) ? 1.0: 0.0;
+
+ half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity));
+ half3 color = diffColor * (gi.diffuse + light.color * diffuseTerm)
+ + specularTerm * light.color * FresnelTerm(specColor, lh)
+ + surfaceReduction * gi.specular * FresnelLerp(specColor, grazingTerm, nv);
+
+ return half4(color, 1);
+ }
+
+ void calculateRealisticSpecular(float3 normal, float4 albedo, float3 viewDir, float2 uv)
+ {
+ half4 spec = UNITY_SAMPLE_TEX2D_SAMPLER(_SpecularMap, _MainTex, TRANSFORM_TEX(uv, _SpecularMap));
+
+ half oneMinusReflectivity;
+
+ UnityLight unityLight;
+ unityLight.color = poiLight.color;
+ unityLight.dir = poiLight.direction;
+ unityLight.ndotl = poiLight.nDotL;
+
+ UNITY_BRANCH
+ if(_SmoothnessFrom == 0)
+ {
+ half3 diffColor = EnergyConservationBetweenDiffuseAndSpecular(albedo, spec.rgb * _SpecularTint.rgb, /*out*/ oneMinusReflectivity);
+ finalSpecular = poiRealisticSpecular(diffColor, spec.rgb, oneMinusReflectivity, spec.a * _SpecularSmoothness, normal, viewDir, unityLight, ZeroIndirect());
+ }
+ else
+ {
+ half3 diffColor = EnergyConservationBetweenDiffuseAndSpecular(albedo, _SpecularTint.rgb, /*out*/ oneMinusReflectivity);
+ float smoothness = max (max (spec.r, spec.g), spec.b);
+ finalSpecular = poiRealisticSpecular(diffColor, 1, oneMinusReflectivity, smoothness * _SpecularSmoothness, normal, viewDir, unityLight, ZeroIndirect());
+ }
+ }
+
+ void calculateToonSpecular(float3 normal, float4 albedo, float3 viewDir, float2 uv)
+ {
+ finalSpecular = 1;
+ calculateRealisticSpecular(normal, albedo, viewDir, uv);
+ float specIntensity = dot(finalSpecular.rgb, grayscale_for_light());
+ finalSpecular.rgb = smoothstep(0.99,1, specIntensity) * poiLight.color.rgb * poiLight.attenuation;
+ }
+
+ void calculateSpecular(float3 normal, float4 albedo, float3 viewDir, float2 uv)
+ {
+ highTexture = UNITY_SAMPLE_TEX2D_SAMPLER(_SpecularHighTexture, _MainTex, TRANSFORM_TEX(uv, _SpecularHighTexture));
+
+ UNITY_BRANCH
+ if (_SpecularType == 0) // Off
+ {
+ return;
+ }
+ else if (_SpecularType == 1) // Realistic
+ {
+ calculateRealisticSpecular(normal, albedo, viewDir, uv);
+ finalSpecular *= poiLight.attenuation;
+ }
+ else if (_SpecularType == 2) // Toon
+ {
+ calculateToonSpecular(normal, albedo, viewDir, uv);
+ }
+ else if (_SpecularType == 4) // anisotropic
+ {
+ return;
+ }
+ }
+
+ void applySpecular(inout float4 finalColor)
+ {
+ if(_SpecularColorFrom == 0)
+ {
+ finalColor.rgb += finalSpecular.rgb * _SpecularTint.rgb;
+ }
+ else
+ {
+ float specIntensity = max (max (finalSpecular.r, finalSpecular.g), finalSpecular.b);
+ finalColor.rgb += lerp(0, highTexture.rgb, saturate(specIntensity)) * _SpecularTint.rgb;
+ }
+ }
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSpecular.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSpecular.cginc.meta
new file mode 100644
index 00000000..f3eddf8a
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSpecular.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7d524a9f958280e4ca1b5f64f8b1e50b
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSubsurfaceScattering.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSubsurfaceScattering.cginc
new file mode 100644
index 00000000..58cf74a0
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSubsurfaceScattering.cginc
@@ -0,0 +1,30 @@
+#ifndef SUBSURFACE
+ #define SUBSURFACE
+
+ float _SSSThicknessMod;
+ float _SSSStrength;
+ float _SSSPower;
+ float _SSSDistortion;
+ float4 _SSSColor;
+
+ UNITY_DECLARE_TEX2D_NOSAMPLER(_SSSThicknessMap); float4 _SSSThicknessMap_ST;
+
+ float3 finalSSS;
+
+ void calculateSubsurfaceScattering(v2f i, float3 viewDir)
+ {
+ float SSS = 1 - UNITY_SAMPLE_TEX2D_SAMPLER(_SSSThicknessMap, _MainTex, TRANSFORM_TEX(i.uv, _SSSThicknessMap));
+
+ half3 vLTLight = poiLight.direction + baseNormal * _SSSDistortion;
+ half flTDot = pow(saturate(dot(viewDir, -vLTLight)), _SSSPower) * _SSSStrength;
+ half3 fLT = poiLight.attenuation * (flTDot) * saturate(SSS + -1 * _SSSThicknessMod);
+
+ finalSSS = fLT;
+ }
+
+ void applySubsurfaceScattering(inout float4 finalColor)
+ {
+ finalColor.rgb += finalSSS * poiLight.color * albedo * _SSSColor;
+ }
+
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSubsurfaceScattering.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSubsurfaceScattering.cginc.meta
new file mode 100644
index 00000000..2910fa3c
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiSubsurfaceScattering.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 652e127dbbf09f8439c062ffcfd431b4
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiTextureBlending.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiTextureBlending.cginc
new file mode 100644
index 00000000..cf9d199a
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiTextureBlending.cginc
@@ -0,0 +1,33 @@
+#ifndef TEXTURE_BLENDING
+ #define TEXTURE_BLENDING
+
+ int _Blend;
+ float4 _BlendTextureColor;
+ sampler2D _BlendTexture; float4 _BlendTexture_ST;
+ sampler2D _BlendNoiseTexture; float4 _BlendNoiseTexture_ST;
+ float _BlendAlpha;
+ float _BlendTiling;
+ float _AutoBlend;
+ float _AutoBlendSpeed;
+ float _AutoBlendDelay;
+
+ float blendAlpha = 0;
+
+ void calculateTextureBlending(float blendAlpha, inout float4 mainTexture, inout float4 diffuse, float2 uv)
+ {
+ UNITY_BRANCH
+ if (_Blend != 0)
+ {
+ float blendNoise = tex2D(_BlendNoiseTexture, TRANSFORM_TEX(uv, _BlendNoiseTexture));
+ if(_AutoBlend > 0)
+ {
+ blendAlpha = (clamp(sin(_Time.y * _AutoBlendSpeed / _AutoBlendDelay) * (_AutoBlendDelay + 1), -1, 1) + 1) / 2;
+ }
+ blendAlpha = lerp(saturate((blendNoise - 1) + blendAlpha * 2), step(blendAlpha * 1.001, blendNoise), _Blend - 1);
+
+ float4 blendCol = tex2D(_BlendTexture, TRANSFORM_TEX(uv, _BlendTexture)) * _BlendTextureColor;
+ diffuse = lerp(diffuse, blendCol, blendAlpha);
+ mainTexture.a = lerp(mainTexture.a, blendCol.a, blendAlpha);
+ }
+ }
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiTextureBlending.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiTextureBlending.cginc.meta
new file mode 100644
index 00000000..a0f15399
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiTextureBlending.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d23c5fcad4c581c47ad9c14ea07c3ab1
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiVert.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiVert.cginc
new file mode 100644
index 00000000..6fe6dde6
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiVert.cginc
@@ -0,0 +1,32 @@
+#ifndef POIVERT
+ #define POIVERT
+ v2f vert(appdata v)
+ {
+ v2f o;
+ UNITY_SETUP_INSTANCE_ID(v);
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
+ UNITY_TRANSFER_INSTANCE_ID(v, o);
+
+ #ifdef FUN
+ applyFun(v.vertex);
+ #endif
+
+ TANGENT_SPACE_ROTATION;
+ o.localPos = v.vertex;
+ o.pos = UnityObjectToClipPos(o.localPos);
+ //o.screenPos = ComputeScreenPos(o.pos);
+ o.worldPos = mul(unity_ObjectToWorld, o.localPos);
+ o.uv = v.texcoord.xy + _GlobalPanSpeed.xy * _Time.y;
+ o.normal = UnityObjectToWorldNormal(v.normal);
+ #if defined(BINORMAL_PER_FRAGMENT)
+ o.tangent = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
+ #else
+ o.tangent = UnityObjectToWorldDir(v.tangent.xyz);
+ o.binormal = CreateBinormal(o.normal, o.tangent, v.tangent.w);
+ #endif
+ UNITY_TRANSFER_SHADOW(o, o.uv);
+ UNITY_TRANSFER_FOG(o, o.pos);
+ o.vertexId = v.vertexId;
+ return o;
+ }
+#endif \ No newline at end of file
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiVert.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiVert.cginc.meta
new file mode 100644
index 00000000..3e338521
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiVert.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ff346a2a2e9500945a02a9c50e8feccf
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/Poicludes.cginc b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/Poicludes.cginc
new file mode 100644
index 00000000..0dfa5e24
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/Poicludes.cginc
@@ -0,0 +1,46 @@
+#ifndef POICLUDES
+ #define POICLUDES
+
+ #include "PoiData.cginc"
+ #include "UnityCG.cginc"
+ #include "Lighting.cginc"
+ #include "UnityPBSLighting.cginc"
+ #include "AutoLight.cginc"
+
+ //Structs
+ struct appdata
+ {
+ float4 vertex: POSITION;
+ float3 normal: NORMAL;
+ float4 tangent: TANGENT;
+ float2 texcoord: TEXCOORD0;
+ float2 texcoord1: TEXCOORD1;
+ uint vertexId : SV_VertexID;
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ };
+
+ struct v2f
+ {
+ float2 uv: TEXCOORD0;
+ float3 normal: TEXCOORD1;
+ #if defined(BINORMAL_PER_FRAGMENT)
+ float4 tangent: TEXCOORD2;
+ #else
+ float3 tangent: TEXCOORD2;
+ float3 binormal: TEXCOORD3;
+ #endif
+ float4 pos: SV_POSITION;
+ float4 worldPos: TEXCOORD4;
+ float4 localPos: TEXCOORD5;
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ UNITY_VERTEX_OUTPUT_STEREO
+ UNITY_SHADOW_COORDS(7)
+ UNITY_FOG_COORDS(8)
+ uint vertexId: TEXCOORD9;
+ };
+
+ static PoiLighting poiLight;
+ float3 baseNormal;
+ #define pi float(3.14159265359)
+
+#endif
diff --git a/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/Poicludes.cginc.meta b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/Poicludes.cginc.meta
new file mode 100644
index 00000000..4c6f3622
--- /dev/null
+++ b/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/Poicludes.cginc.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1477de18f5f465643b94da7909775248
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant: