1617a3babSopenharmony_cicbuffer UniformBlock0 : register(b0)
2617a3babSopenharmony_ci{
3617a3babSopenharmony_ci  float4x4 model_view_matrix;
4617a3babSopenharmony_ci  float4x4 proj_matrix;
5617a3babSopenharmony_ci  float4x4 model_view_proj_matrix;
6617a3babSopenharmony_ci  float3x3 normal_matrix;
7617a3babSopenharmony_ci  float3   color;
8617a3babSopenharmony_ci  float3   view_dir;
9617a3babSopenharmony_ci  float3   tess_factor;
10617a3babSopenharmony_ci};
11617a3babSopenharmony_ci
12617a3babSopenharmony_ci// =============================================================================
13617a3babSopenharmony_ci// Hull Shader
14617a3babSopenharmony_ci// =============================================================================
15617a3babSopenharmony_cistruct HSInput {
16617a3babSopenharmony_ci  float3 PositionWS : POSITION;
17617a3babSopenharmony_ci  float3 NormalWS   : NORMAL;
18617a3babSopenharmony_ci};
19617a3babSopenharmony_ci
20617a3babSopenharmony_cistruct HSOutput {
21617a3babSopenharmony_ci  float3 PositionWS : POSITION;
22617a3babSopenharmony_ci};
23617a3babSopenharmony_ci
24617a3babSopenharmony_cistruct HSTrianglePatchConstant {
25617a3babSopenharmony_ci  float  EdgeTessFactor[3] : SV_TessFactor;
26617a3babSopenharmony_ci  float  InsideTessFactor  : SV_InsideTessFactor;
27617a3babSopenharmony_ci  float3 NormalWS[3]       : NORMAL;
28617a3babSopenharmony_ci};
29617a3babSopenharmony_ci
30617a3babSopenharmony_ciHSTrianglePatchConstant HSPatchConstant(InputPatch<HSInput, 3> patch)
31617a3babSopenharmony_ci{
32617a3babSopenharmony_ci  float3 roundedEdgeTessFactor = tess_factor;
33617a3babSopenharmony_ci  float  roundedInsideTessFactor = 3;
34617a3babSopenharmony_ci  float  insideTessFactor = 1;
35617a3babSopenharmony_ci
36617a3babSopenharmony_ci  HSTrianglePatchConstant result;
37617a3babSopenharmony_ci
38617a3babSopenharmony_ci  // Edge and inside tessellation factors
39617a3babSopenharmony_ci  result.EdgeTessFactor[0] = roundedEdgeTessFactor.x;
40617a3babSopenharmony_ci  result.EdgeTessFactor[1] = roundedEdgeTessFactor.y;
41617a3babSopenharmony_ci  result.EdgeTessFactor[2] = roundedEdgeTessFactor.z;
42617a3babSopenharmony_ci  result.InsideTessFactor  = roundedInsideTessFactor;
43617a3babSopenharmony_ci
44617a3babSopenharmony_ci  // Constant data
45617a3babSopenharmony_ci  result.NormalWS[0] = patch[0].NormalWS;
46617a3babSopenharmony_ci  result.NormalWS[1] = patch[1].NormalWS;
47617a3babSopenharmony_ci  result.NormalWS[2] = patch[2].NormalWS;
48617a3babSopenharmony_ci
49617a3babSopenharmony_ci  return result;
50617a3babSopenharmony_ci}
51617a3babSopenharmony_ci
52617a3babSopenharmony_ci[domain("tri")]
53617a3babSopenharmony_ci[partitioning("fractional_odd")]
54617a3babSopenharmony_ci[outputtopology("triangle_ccw")]
55617a3babSopenharmony_ci[outputcontrolpoints(3)]
56617a3babSopenharmony_ci[patchconstantfunc("HSPatchConstant")]
57617a3babSopenharmony_ciHSOutput HSMain(
58617a3babSopenharmony_ci  InputPatch<HSInput, 3>  patch,
59617a3babSopenharmony_ci  uint                    id : SV_OutputControlPointID
60617a3babSopenharmony_ci)
61617a3babSopenharmony_ci{
62617a3babSopenharmony_ci  HSOutput output;
63617a3babSopenharmony_ci  output.PositionWS = patch[id].PositionWS;
64617a3babSopenharmony_ci  return output;
65617a3babSopenharmony_ci}
66617a3babSopenharmony_ci
67617a3babSopenharmony_ci// =============================================================================
68617a3babSopenharmony_ci// Geometry Shader
69617a3babSopenharmony_ci// =============================================================================
70617a3babSopenharmony_cistruct GSVertexInput {
71617a3babSopenharmony_ci  float3 PositionWS : POSITION;
72617a3babSopenharmony_ci  float3 NormalWS   : NORMAL;
73617a3babSopenharmony_ci};
74617a3babSopenharmony_ci
75617a3babSopenharmony_cistruct GSVertexOutput {
76617a3babSopenharmony_ci  float4 PositionCS : SV_POSITION;
77617a3babSopenharmony_ci};
78617a3babSopenharmony_ci
79617a3babSopenharmony_ci[maxvertexcount(6)]
80617a3babSopenharmony_civoid GSMain(
81617a3babSopenharmony_ci  triangle GSVertexInput            input[3],
82617a3babSopenharmony_ci  inout LineStream<GSVertexOutput>  output
83617a3babSopenharmony_ci)
84617a3babSopenharmony_ci{
85617a3babSopenharmony_ci
86617a3babSopenharmony_ci  float3 P0 = input[0].PositionWS.xyz;
87617a3babSopenharmony_ci  float3 P1 = input[1].PositionWS.xyz;
88617a3babSopenharmony_ci  float3 P2 = input[2].PositionWS.xyz;
89617a3babSopenharmony_ci
90617a3babSopenharmony_ci  GSVertexOutput vertex;
91617a3babSopenharmony_ci  // Totally hacky...
92617a3babSopenharmony_ci  P0.z += 0.001;
93617a3babSopenharmony_ci  P1.z += 0.001;
94617a3babSopenharmony_ci  P2.z += 0.001;
95617a3babSopenharmony_ci  float4 Q0 = mul(proj_matrix, float4(P0, 1.0));
96617a3babSopenharmony_ci  float4 Q1 = mul(proj_matrix, float4(P1, 1.0));
97617a3babSopenharmony_ci  float4 Q2 = mul(proj_matrix, float4(P2, 1.0));
98617a3babSopenharmony_ci
99617a3babSopenharmony_ci  // Edge 0
100617a3babSopenharmony_ci  vertex.PositionCS = Q0;
101617a3babSopenharmony_ci  output.Append(vertex);
102617a3babSopenharmony_ci  vertex.PositionCS = Q1;
103617a3babSopenharmony_ci  output.Append(vertex);
104617a3babSopenharmony_ci  output.RestartStrip();
105617a3babSopenharmony_ci
106617a3babSopenharmony_ci  // Edge 1
107617a3babSopenharmony_ci  vertex.PositionCS = Q1;
108617a3babSopenharmony_ci  output.Append(vertex);
109617a3babSopenharmony_ci  vertex.PositionCS = Q2;
110617a3babSopenharmony_ci  output.Append(vertex);
111617a3babSopenharmony_ci  output.RestartStrip();
112617a3babSopenharmony_ci
113617a3babSopenharmony_ci  // Edge 2
114617a3babSopenharmony_ci  vertex.PositionCS = Q2;
115617a3babSopenharmony_ci  output.Append(vertex);
116617a3babSopenharmony_ci  vertex.PositionCS = Q0;
117617a3babSopenharmony_ci  output.Append(vertex);
118617a3babSopenharmony_ci  output.RestartStrip();
119617a3babSopenharmony_ci}
120