trail.glsl 1.5 KB
@export ecgl.trail.vertex

uniform mat4 worldViewProjection : WORLDVIEWPROJECTION;
uniform float percent : 0.0;
uniform float trailLength: 0.3;

uniform sampler2D pointsTexture;
uniform float textureWidth : 1024;

uniform vec4 viewport : VIEWPORT;
uniform float near : NEAR;

attribute vec2 uv;
attribute vec4 color : COLOR;

attribute float start;
attribute float prevT;
attribute float currT;
attribute float nextT;
attribute float offset;

varying vec4 v_Color;

@import ecgl.lines3D.clipNear

vec3 getPointAt(in float off, in vec3 p0, in vec3 p1, in vec3 p2, in vec3 p3) {
    float t = max(min(mod(start + percent, (1.0 + trailLength)) + off, 1.0), 0.0);
    float onet = 1.0 - t;
    return onet * onet * (onet * p0 + 3.0 * t * p1)
        + t * t * (t * p3 + 3.0 * onet * p2);
}

void main()
{
    vec2 unit = vec2(1.0 / textureWidth, 0.0);
    vec3 p0 = texture2D(pointsTexture, uv).rgb;
    vec3 p1 = texture2D(pointsTexture, uv + unit).rgb;
    vec3 p2 = texture2D(pointsTexture, uv + unit * 2.0).rgb;
    vec3 p3 = texture2D(pointsTexture, uv + unit * 3.0).rgb;

    vec3 positionPrev = getPointAt(prevT, p0, p1, p2, p3);
    vec3 position = getPointAt(currT, p0, p1, p2, p3);
    vec3 positionNext = getPointAt(nextT, p0, p1, p2, p3);

    @import ecgl.lines3D.expandLine

    gl_Position = currProj;

    v_Color = color;
}

@end

@export ecgl.trail.fragment

varying vec4 v_Color;

uniform sampler2D sprite;

void main()
{
    gl_FragColor = v_Color;

#ifdef SPRITE_ENABLED
    gl_FragColor *= texture2D(sprite, gl_PointCoord);
#endif

}
@end