1#version 400 2 3/** 4 * TCS that assigns a patch grid density. 5 */ 6 7#pragma vp_name GroundCover tessellation control shader 8#pragma vp_entryPoint oe_GroundCover_configureTess 9#pragma vp_location tess_control 10 11layout(vertices=3) out; 12 13uniform float oe_GroundCover_density; 14 15// per-vertex tile coordinates 16vec4 oe_layer_tilec; 17 18#ifdef OE_GROUNDCOVER_COVERAGE_PRECHECK 19// SDK function to sample the coverage data 20int oe_GroundCover_getBiomeIndex(in vec4); 21 22// SDK function to load per-vertex data 23void VP_LoadVertex(in int); 24#endif 25 26// MAIN ENTRY POINT 27void oe_GroundCover_configureTess() 28{ 29 if (gl_InvocationID == 0) 30 { 31 float d = oe_GroundCover_density; 32 33#ifdef OE_GROUNDCOVER_COVERAGE_PRECHECK 34 // Samples the three corner points to see whether the triangle 35 // is likely to contain a groundcover biome. This is not perfect 36 // since it only samples the corner points, and the performance 37 // benefits are questionable. -gw 38 VP_LoadVertex(0); 39 if ( oe_GroundCover_getBiomeIndex(oe_layer_tilec) >= 0 ) { 40 d = oe_GroundCover_density; 41 } 42 else { 43 VP_LoadVertex(1); 44 if ( oe_GroundCover_getBiomeIndex(oe_layer_tilec) >= 0 ) { 45 d = oe_GroundCover_density; 46 VP_LoadVertex(0); 47 } 48 else { 49 VP_LoadVertex(2); 50 if ( oe_GroundCover_getBiomeIndex(oe_layer_tilec) >= 0 ) { 51 d = oe_GroundCover_density; 52 VP_LoadVertex(0); 53 } 54 } 55 } 56#endif 57 58 gl_TessLevelOuter[0] = d; 59 gl_TessLevelOuter[1] = d; 60 gl_TessLevelOuter[2] = d; 61 gl_TessLevelInner[0] = d+1; 62 } 63} 64