summaryrefslogtreecommitdiffstats
path: root/tessellation.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-03-25 19:12:49 -0700
committeryum <yum.food.vr@gmail.com>2025-03-25 19:12:49 -0700
commit274f601c9c49f69e4acef24b56982190b5b0bf93 (patch)
tree8c241e6cb0310485edb7db96d42d164189753c4b /tessellation.cginc
parentccdda956f7de812bb9c318161c6852301a60d413 (diff)
Continue work on tessellation
Diffstat (limited to 'tessellation.cginc')
-rw-r--r--tessellation.cginc36
1 files changed, 28 insertions, 8 deletions
diff --git a/tessellation.cginc b/tessellation.cginc
index c77cd83..92aca3a 100644
--- a/tessellation.cginc
+++ b/tessellation.cginc
@@ -3,6 +3,7 @@
#include "globals.cginc"
#include "interpolators.cginc"
+#include "shatter_wave.cginc"
//ifex _Tessellation_Enabled==0
@@ -14,10 +15,10 @@ struct tess_factors {
tess_factors patch_constant(InputPatch<v2f, 3> patch) {
tess_factors f;
#if defined(_TESSELLATION)
- f.edge[0] = _Tessellation_Edge_Factors[0];
- f.edge[1] = _Tessellation_Edge_Factors[1];
- f.edge[2] = _Tessellation_Edge_Factors[2];
- f.inside = _Tessellation_Inside_Factor;
+ f.edge[0] = _Tessellation_Factor;
+ f.edge[1] = _Tessellation_Factor;
+ f.edge[2] = _Tessellation_Factor;
+ f.inside = _Tessellation_Factor;
#else
f.edge[0] = 1;
f.edge[1] = 1;
@@ -50,16 +51,35 @@ v2f domain(
patch[0].fieldName * baryc.x + \
patch[1].fieldName * baryc.y + \
patch[2].fieldName * baryc.z
- o.pos = DOMAIN_INTERP(pos);
- o.uv01 = DOMAIN_INTERP(uv01);
+#if defined(_TESSELLATION)
+ o.objPos = DOMAIN_INTERP(tpos);
+#else
o.objPos = DOMAIN_INTERP(pos);
- o.worldPos = DOMAIN_INTERP(worldPos);
+#endif
o.normal = DOMAIN_INTERP(normal);
o.tangent = DOMAIN_INTERP(tangent);
o.binormal = DOMAIN_INTERP(binormal);
- o.eyeVec = DOMAIN_INTERP(eyeVec);
+ o.uv01 = DOMAIN_INTERP(uv01);
+
+#if defined(_SHATTER_WAVE)
+ shatterWaveVert(o.objPos.xyz, o.normal, o.tangent);
+ o.binormal = cross(o.normal, o.tangent);
+#endif
+
+#if defined(_TESSELLATION_HEIGHTMAP)
+ float height = _Tessellation_Heightmap.SampleLevel(linear_repeat_s, o.uv01.xy * _Tessellation_Heightmap_ST.xy + _Tessellation_Heightmap_ST.zw, 0).r * _Tessellation_Heightmap_Scale;
+ o.objPos.xyz += o.normal * height;
+#endif
+
+ o.pos = UnityObjectToClipPos(o.objPos);
+ o.worldPos = mul(unity_ObjectToWorld, o.objPos);
+ o.eyeVec.xyz = normalize(o.worldPos - _WorldSpaceCameraPos);
+ o.eyeVec.w = 1;
// TODO what about UNITY_LIGHTING_COORDS(7,8) and instance id and shit?
+ //UNITY_TRANSFER_LIGHTING(o, DOMAIN_INTERP(_unity_lightcoords));
+ UNITY_TRANSFER_INSTANCE_ID(patch[0], o);
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
return o;
}