117 lines
3.5 KiB
C++
117 lines
3.5 KiB
C++
//#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();
|
|
*/
|
|
}
|
|
}
|