aboutsummaryrefslogtreecommitdiff
path: root/KaplaDemo/externalIP/resources/shaders/dust_gs.cpp
blob: 672a66e5f590dc5368dda4dd929097cfa55bdad1 (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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//#version 120\n
//#extension GL_EXT_geometry_shader4 : enable\n
uniform float pointRadius;  // point size in world space
uniform float densityThreshold = 50.0;
uniform float idensityThreshold = 1.0 / 30.0;
uniform float pointShrink = 0.25;
uniform sampler2D meteorTex;
void main()
{
    gl_FrontColor = gl_FrontColorIn[0];
    float density = gl_TexCoordIn[0][1].x;
	float life = gl_TexCoordIn[0][1].y;
	

	gl_TexCoord[1].xy = 0.25f*vec2(gl_PrimitiveIDIn / 4, gl_PrimitiveIDIn % 4);
    // scale down point size based on density
	float factor = 1.0f;//density * idensityThreshold;
	//smoothstep(0.0f, densityThreshold, density);
		//density * idensityThreshold;
		//clamp(density / 50.0f, 0, 1);
    float pointSize = pointRadius*factor;//*(pointShrink + smoothstep(0.0, densityThreshold, density)*(1.0-pointShrink));

	pointSize *= gl_TexCoordIn[0][3].x;
	float tmp = gl_TexCoordIn[0][3].y;

	float bb = 1.0f;
	if (tmp > 0.5f) {
		//gl_FrontColor = vec4(3*life,0,0,1);
		// TODO: Meteor trail color here...
		//vec2 fetchPos = vec2( min(max((3-lifeTime)/3,0),1), 0);
		float val = 1-min(max((life-0.3)/0.2,0.01),0.99);
		vec2 fetchPos = vec2(val, 0);
		gl_FrontColor = texture2D(meteorTex, fetchPos);
		if (gl_FrontColor.r > 0.5) bb += (gl_FrontColor.r-0.5)*(gl_FrontColor.r-0.5)*10;
		
	}
//    float pointSize = pointRadius;

    // eye space
    vec3 pos = gl_PositionIn[0].xyz;
    vec3 pos2 = gl_TexCoordIn[0][0].xyz;
    vec3 motion = pos - pos2;
    vec3 dir = normalize(motion);
    float len = length(motion);

    vec3 x = dir * pointSize;
    vec3 view = normalize(-pos);
    vec3 y = normalize(cross(dir, view)) * pointSize;
    float facing = dot(view, dir);

    // check for very small motion to avoid jitter
    float threshold = 0.01;
//    if (len < threshold) {
    if ((len < threshold) || (facing > 0.95) || (facing < -0.95)) {
        pos2 = pos;
        x = vec3(pointSize, 0.0, 0.0);
        y = vec3(0.0, -pointSize, 0.0);
    }

	float angle = density;
	float cv = cos(angle);
	float sv = sin(angle);

	vec3 xt = cv*x + sv*y;
	vec3 yt = -sv*x + cv*y;
	x = xt;
	y = yt;

    {

        gl_TexCoord[0] = vec4(0, 0, bb, life);
        gl_TexCoord[2] = vec4(pos + x + y, 1);
        gl_Position = gl_ProjectionMatrix * gl_TexCoord[2];
		gl_TexCoord[3] = gl_TexCoordIn[0][2];
        EmitVertex();

        gl_TexCoord[0] = vec4(0, 1, bb, life);
		gl_TexCoord[2] = vec4(pos + x - y, 1);
        gl_Position = gl_ProjectionMatrix * gl_TexCoord[2];

        EmitVertex();

        gl_TexCoord[0] = vec4(1, 0, bb, life);
		gl_TexCoord[2] = vec4(pos2 - x + y, 1);
        gl_Position = gl_ProjectionMatrix * gl_TexCoord[2];

        EmitVertex();

        gl_TexCoord[0] = vec4(1, 1, bb, life);
        gl_TexCoord[2] = vec4(pos2 - x - y, 1);
		gl_Position = gl_ProjectionMatrix * gl_TexCoord[2];

        EmitVertex();
/*
        gl_TexCoord[0] = vec4(0, 0, 0, life);
        gl_TexCoord[2] =  vec4(pos + x + y, 1);
        gl_Position = gl_ProjectionMatrix * gl_TexCoord[2];
        EmitVertex();

        gl_TexCoord[0] = vec4(0, 1, 0, life);
        gl_TexCoord[2] = vec4(pos + x - y, 1);
        gl_Position = gl_ProjectionMatrix * gl_TexCoord[2];
        EmitVertex();

        gl_TexCoord[0] = vec4(1, 0, 0, life);
        gl_TexCoord[2] = vec4(pos2 - x + y, 1);
        gl_Position = gl_ProjectionMatrix * gl_TexCoord[2];
        EmitVertex();

        gl_TexCoord[0] = vec4(1, 1, 0, life);
        gl_TexCoord[2] = vec4(pos2 - x - y, 1);
        gl_Position = gl_ProjectionMatrix * gl_TexCoord[2];
        EmitVertex();
		*/
    }
}