~starkingdoms/starkingdoms

ref: 02df8a053b6bfd7d2ee9fbdbd60fe29137b63a7c starkingdoms/starkingdoms-client/src/rendering.ts -rw-r--r-- 4.0 KiB
02df8a05 — core Merge branch 'bevy_rewrite' of gitlab.com:starkingdoms.tk/starkingdoms.tk into bevy_rewrite 2 years ago
                                                                                
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import {global, player} from "./main.ts";
import {part_texture, planet_texture} from "./textures.ts";
import {planet_color} from "./planet_colors.ts";

//let t = performance.now();
//let delta = 0.0;

export function startRender() {
    // hide the launch popup
    document.getElementById("server_selector")!.classList.add("hidden");
    // show the HUD
    document.getElementById("hud")!.classList.remove("hidden");
    // create the canvas
    let canvas = document.createElement("canvas");
    canvas.classList.add("game");
    // append it
    document.getElementById("gamewindow")!.appendChild(canvas);
    let ctx = canvas.getContext("2d")!;
    ctx.canvas.width = window.innerWidth;
    ctx.canvas.height = window.innerHeight;

    window.onresize = () => {
        ctx.canvas.width = window.innerWidth;
        ctx.canvas.height = window.innerHeight;
    }

    global.rendering = {
        canvas: canvas,
        ctx: ctx
    };
    //t = performance.now();
    //delta = 0.0;
    // start the render loop
    requestAnimationFrame(renderLoop);
}

async function renderLoop(_newT: DOMHighResTimeStamp) {
    //delta = newT - t;
    //t = newT;

    let viewer_size_x = global.rendering?.canvas.width!;
    let viewer_size_y = global.rendering?.canvas.height!;

    global.rendering!.canvas.style.setProperty("background-position", `${player()?.transform.x!/5}px ${-player()?.transform.y!/5}px`);

    global.rendering!.ctx.setTransform(1, 0, 0, 1, 0, 0);
    global.rendering!.ctx.clearRect(0, 0, viewer_size_x, viewer_size_y);

    // *dont* translate the camera. we're moving everything else around us. cameracentrism.
    // only translation will be to center our core module.

    global.rendering!.ctx.translate(viewer_size_x / 2, viewer_size_y / 2);

    /*
    todo: track indicator
     */

    for (let [_id, planet] of global.planets_map) {
        global.rendering!.ctx.drawImage(
            await planet_texture(planet.planet_type),
            (planet.transform.x - planet.radius - player()?.transform.x!), // dx
            (planet.transform.y - planet.radius - player()?.transform.y!), // dy
            planet.radius * 2, // dw
            planet.radius * 2 // dh
        );

        global.rendering!.ctx.beginPath();
        global.rendering!.ctx.strokeStyle = planet_color(planet.planet_type);
        global.rendering!.ctx.lineWidth = 5;
        global.rendering!.ctx.moveTo(player()!.transform.x - player()!.transform.x, player()!.transform.y - player()!.transform.y);
        global.rendering!.ctx.lineTo(planet.transform.x - player()!.transform.x, planet.transform.y - player()!.transform.y);
        global.rendering!.ctx.stroke();
    }

    for (let [_id, part] of global.parts_map) {
        global.rendering!.ctx.save();

        // x_{screen} = x_{world} - player_{x_{world}}
        // x_{world} = x_{screen} + player_{x_{world}}

        global.rendering!.ctx.translate(part.transform.x - player()!.transform.x, part.transform.y - player()!.transform.y);

        global.rendering!.ctx.rotate(part.transform.rot);

        global.rendering!.ctx.drawImage(
            await part_texture(part.part_type),
            -25, -25, 50, 50
        );

        global.rendering!.ctx.restore();

        // todo: clicked stuff
    }

    for (let [id, username] of global.players_map) {
        let part = global.parts_map.get(id);

        if (part !== undefined) {
            global.rendering!.ctx.save();

            global.rendering!.ctx.translate(part!.transform.x - player()!.transform.x, part!.transform.y - player()!.transform.y);

            global.rendering!.ctx.textAlign = "center";
            global.rendering!.ctx.font = '30px ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"';
            global.rendering!.ctx.fillStyle = "white";
            global.rendering!.ctx.fillText(username, 0, -35);

            global.rendering!.ctx.restore();
        }
    }

    // particles stuff

    requestAnimationFrame(renderLoop);
}