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