File size: 1,671 Bytes
352fb85
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { RenderProgram } from "../programs/RenderProgram";
import { ShaderProgram } from "../programs/ShaderProgram";
import { ShaderPass } from "./ShaderPass";

class FadeInPass implements ShaderPass {
    initialize: (program: ShaderProgram) => void;
    render: () => void;

    constructor(speed: number = 1.0) {
        let value = 0.0;
        let active = false;

        let renderProgram: RenderProgram;
        let gl: WebGL2RenderingContext;
        let u_useDepthFade: WebGLUniformLocation;
        let u_depthFade: WebGLUniformLocation;

        this.initialize = (program: ShaderProgram) => {
            if (!(program instanceof RenderProgram)) {
                throw new Error("FadeInPass requires a RenderProgram");
            }

            value = program.started ? 1.0 : 0.0;
            active = true;
            renderProgram = program;
            gl = program.renderer.gl;

            u_useDepthFade = gl.getUniformLocation(renderProgram.program, "useDepthFade") as WebGLUniformLocation;
            gl.uniform1i(u_useDepthFade, 1);

            u_depthFade = gl.getUniformLocation(renderProgram.program, "depthFade") as WebGLUniformLocation;
            gl.uniform1f(u_depthFade, value);
        };

        this.render = () => {
            if (!active || renderProgram.renderData?.updating) return;
            gl.useProgram(renderProgram.program);
            value = Math.min(value + speed * 0.01, 1.0);
            if (value >= 1.0) {
                active = false;
                gl.uniform1i(u_useDepthFade, 0);
            }
            gl.uniform1f(u_depthFade, value);
        };
    }

    dispose() {}
}

export { FadeInPass };