summaryrefslogtreecommitdiff
path: root/frontend/_rigidbody/program_common.js
blob: 9d097e2e5aac56fc7c16783c8df5a836062b62e9 (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
/// <reference path="shader.js" />
/// <reference path="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,
        lStartTimeSeconds = undefined,
        lIsRunning = true;

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

        pTimeStamp = pTimeStamp / 1000.0; // Convert to seconds

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

        pFunction(lDeltaTimeSeconds);
        requestAnimationFrame(update);
    }

    requestAnimationFrame(update);

    function lExit() {
        lIsRunning = false;
    }

    return lExit;
}