aboutsummaryrefslogtreecommitdiff
path: root/demo/d3d/shaders/pointThicknessGS.hlsl
blob: 21c75fc8935e8ad6c1d46d05b9960a1e2965b4c3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "shaderCommon.h"

cbuffer constBuf : register(b0)
{
	FluidShaderConst gParams;
};

static const float2 corners[4] =
{
	float2(0.0, 1.0), float2(0.0, 0.0), float2(1.0, 1.0), float2(1.0, 0.0)
};

[maxvertexcount(4)]
void pointThicknessGS(point FluidVertexOut input[1], inout TriangleStream<FluidGeoOut> triStream)
{
	float4 gl_Position;
	float4 gl_TexCoord[4];

	{
		[unroll]
		for (int i = 0; i < 4; i++)
			gl_TexCoord[i] = float4(0.0f, 0.0f, 0.0f, 0.0f);
	}

	const float4x4 gl_ModelViewMatrix = gParams.modelView;
	const float pointRadius = gParams.pointRadius;
	//const float pointScale = gParams.pointScale;

	float4 viewPos = input[0].position;
	float4 gl_Vertex = input[0].bounds;	// retrieve gl_Vertex from bounds

	//float spriteSize = pointScale * (pointRadius / gl_Position.w);
	float spriteSize = pointRadius * 2;

	FluidGeoOut output;

	for (int i = 0; i < 4; ++i)
	{

		float4 eyePos = viewPos;									// start with point position
		eyePos.xy += spriteSize * (corners[i] - float2(0.5, 0.5));	// add corner position
		gl_Position = mul(gParams.projection, eyePos);				// complete transformation

		gl_TexCoord[0].xy = corners[i].xy;							// use corner as texCoord
		gl_TexCoord[0].y = 1.0f - gl_TexCoord[0].y;					// flip the y component of uv (glsl to hlsl conversion)
		//gl_TexCoord[1] = mul(gl_ModelViewMatrix, float4(gl_Vertex.xyz, 1.0));

		output.position = gl_Position;
		//[unroll]
		//for (int j = 0; j < 4; j++)
		//	output.texCoord[j] = gl_TexCoord[j];
		output.invQ0 = gl_TexCoord[0];
		output.invQ1 = gl_TexCoord[1];
		output.invQ2 = gl_TexCoord[2];
		output.invQ3 = gl_TexCoord[3];

		triStream.Append(output);
	}
}