summaryrefslogtreecommitdiff
path: root/_shared/2d/program_common.js
blob: 48d0a6bbe8b507eeeee834d5ea65f1eb93338bc6 (plain)
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
/// <reference path="shader.js" />
/// <reference path="../math/mat4.js" />

function getContext(pId, pOnRun) {
    const lCanvas = $(pId).find('canvas'),
        lPlayButton = $(pId).find('.play_button'),
        lStopButton = $(pId).find('.stop_button'),
        lGl = lCanvas[0].getContext('webgl'),
        lWidth = lCanvas.width(),
        lHeight = lCanvas.height();

    return {
        canvas: lCanvas,
        playButton: lPlayButton,
        stopButton: lStopButton,
        gl: lGl,
        width: lWidth,
        height: lHeight,
        perspective: orthographic(0, lWidth, 0, lHeight),
        load: function() {
            lPlayButton.empty().append($('<div>').addClass('spin-loader'));
            return loadOrthographicShader(lGl).then(function(pProgramInfo) {
                lPlayButton.css('display', 'none');
                lStopButton.css('display', 'block');
                return pProgramInfo;
            });
        },
        reset: function() {
            lPlayButton.css('display', 'block');
            lPlayButton.empty().text('Play');
            lStopButton.css('display', 'none');
            lStopButton.on('click', undefined);
        }
    };
}

function requestUpdateLoop(pFunction, pOnExit) {
    let lDeltaTimeSeconds = undefined,
        lLastTimeSeconds = undefined,
        lIsRunning = true;

    function update(pTimeStamp) {
        if (!lIsRunning) {
            if (pOnExit) {
                pOnExit();
            }
            return;
        }

        pTimeStamp = pTimeStamp / 1000.0; // Convert to seconds

        // Time calculation
        if (lLastTimeSeconds === undefined) {
            lLastTimeSeconds = pTimeStamp;
            lDeltaTimeSeconds = 0;
        } else {
            lDeltaTimeSeconds = pTimeStamp - lLastTimeSeconds;
            lLastTimeSeconds = pTimeStamp;
        }

        while (lDeltaTimeSeconds > 0) {
            pFunction(lDeltaTimeSeconds);
            lDeltaTimeSeconds -= 0.16;
        }
        requestAnimationFrame(update);
    }

    requestAnimationFrame(update);

    function lExit() {
        lIsRunning = false;
    }

    return lExit;
}