~starkingdoms/starkingdoms

896c61d906c89e1e5a028cf29d229d8b85d5f1f8 — ghostlyzsh 2 years ago b99b782 + 6172f50
Merge branch 'master' of https://gitlab.com/starkingdoms.tk/starkingdoms.tk
M assets/dist/spritesheet-125.png => assets/dist/spritesheet-125.png +0 -0
M assets/dist/spritesheet-125.ron => assets/dist/spritesheet-125.ron +1 -1
@@ 1,1 1,1 @@
(texture_width:256,texture_height:1408,sprites:[(name:"earth",x:0,y:0,width:256,height:256,offsets:None,),(name:"ecothruster_on",x:0,y:256,width:64,height:64,offsets:None,),(name:"landingleg",x:0,y:320,width:64,height:64,offsets:None,),(name:"superthruster_on",x:0,y:384,width:64,height:64,offsets:None,),(name:"cargo_on",x:0,y:448,width:64,height:64,offsets:None,),(name:"autoplr_cfg",x:0,y:512,width:64,height:64,offsets:None,),(name:"landingthruster_off",x:0,y:576,width:64,height:64,offsets:None,),(name:"superthruster_off",x:0,y:640,width:64,height:64,offsets:None,),(name:"autoplr_on",x:0,y:704,width:64,height:64,offsets:None,),(name:"thruster_off",x:0,y:768,width:64,height:64,offsets:None,),(name:"cargo_off",x:0,y:832,width:64,height:64,offsets:None,),(name:"thruster_on",x:0,y:896,width:64,height:64,offsets:None,),(name:"autoplr_error",x:0,y:960,width:64,height:64,offsets:None,),(name:"hub_off",x:0,y:1024,width:64,height:64,offsets:None,),(name:"powerhub_off",x:0,y:1088,width:64,height:64,offsets:None,),(name:"hearty",x:0,y:1152,width:64,height:64,offsets:None,),(name:"hub_on",x:0,y:1216,width:64,height:64,offsets:None,),(name:"landingthruster_on",x:0,y:1280,width:64,height:64,offsets:None,),(name:"powerhub_on",x:0,y:1344,width:64,height:64,offsets:None,),],)
\ No newline at end of file
(texture_width:256,texture_height:1408,sprites:[(name:"earth",x:0,y:0,width:256,height:256,offsets:None,),(name:"autoplr_cfg",x:0,y:256,width:64,height:64,offsets:None,),(name:"superthruster_on",x:0,y:320,width:64,height:64,offsets:None,),(name:"hearty",x:0,y:384,width:64,height:64,offsets:None,),(name:"ecothruster_on",x:0,y:448,width:64,height:64,offsets:None,),(name:"superthruster_off",x:0,y:512,width:64,height:64,offsets:None,),(name:"landingleg",x:0,y:576,width:64,height:64,offsets:None,),(name:"hub_off",x:0,y:640,width:64,height:64,offsets:None,),(name:"powerhub_off",x:0,y:704,width:64,height:64,offsets:None,),(name:"powerhub_on",x:0,y:768,width:64,height:64,offsets:None,),(name:"cargo_off",x:0,y:832,width:64,height:64,offsets:None,),(name:"thruster_on",x:0,y:896,width:64,height:64,offsets:None,),(name:"landingthruster_on",x:0,y:960,width:64,height:64,offsets:None,),(name:"landingthruster_off",x:0,y:1024,width:64,height:64,offsets:None,),(name:"autoplr_on",x:0,y:1088,width:64,height:64,offsets:None,),(name:"thruster_off",x:0,y:1152,width:64,height:64,offsets:None,),(name:"cargo_on",x:0,y:1216,width:64,height:64,offsets:None,),(name:"autoplr_error",x:0,y:1280,width:64,height:64,offsets:None,),(name:"hub_on",x:0,y:1344,width:64,height:64,offsets:None,),],)
\ No newline at end of file

M assets/dist/spritesheet-375.png => assets/dist/spritesheet-375.png +0 -0
M assets/dist/spritesheet-375.ron => assets/dist/spritesheet-375.ron +1 -1
@@ 1,1 1,1 @@
(texture_width:768,texture_height:4224,sprites:[(name:"earth",x:0,y:0,width:768,height:768,offsets:None,),(name:"ecothruster_on",x:0,y:768,width:192,height:192,offsets:None,),(name:"landingleg",x:0,y:960,width:192,height:192,offsets:None,),(name:"superthruster_on",x:0,y:1152,width:192,height:192,offsets:None,),(name:"cargo_on",x:0,y:1344,width:192,height:192,offsets:None,),(name:"autoplr_cfg",x:0,y:1536,width:192,height:192,offsets:None,),(name:"landingthruster_off",x:0,y:1728,width:192,height:192,offsets:None,),(name:"superthruster_off",x:0,y:1920,width:192,height:192,offsets:None,),(name:"autoplr_on",x:0,y:2112,width:192,height:192,offsets:None,),(name:"thruster_off",x:0,y:2304,width:192,height:192,offsets:None,),(name:"cargo_off",x:0,y:2496,width:192,height:192,offsets:None,),(name:"thruster_on",x:0,y:2688,width:192,height:192,offsets:None,),(name:"autoplr_error",x:0,y:2880,width:192,height:192,offsets:None,),(name:"hub_off",x:0,y:3072,width:192,height:192,offsets:None,),(name:"powerhub_off",x:0,y:3264,width:192,height:192,offsets:None,),(name:"hearty",x:0,y:3456,width:192,height:192,offsets:None,),(name:"hub_on",x:0,y:3648,width:192,height:192,offsets:None,),(name:"landingthruster_on",x:0,y:3840,width:192,height:192,offsets:None,),(name:"powerhub_on",x:0,y:4032,width:192,height:192,offsets:None,),],)
\ No newline at end of file
(texture_width:768,texture_height:4224,sprites:[(name:"earth",x:0,y:0,width:768,height:768,offsets:None,),(name:"autoplr_cfg",x:0,y:768,width:192,height:192,offsets:None,),(name:"superthruster_on",x:0,y:960,width:192,height:192,offsets:None,),(name:"hearty",x:0,y:1152,width:192,height:192,offsets:None,),(name:"ecothruster_on",x:0,y:1344,width:192,height:192,offsets:None,),(name:"superthruster_off",x:0,y:1536,width:192,height:192,offsets:None,),(name:"landingleg",x:0,y:1728,width:192,height:192,offsets:None,),(name:"hub_off",x:0,y:1920,width:192,height:192,offsets:None,),(name:"powerhub_off",x:0,y:2112,width:192,height:192,offsets:None,),(name:"powerhub_on",x:0,y:2304,width:192,height:192,offsets:None,),(name:"cargo_off",x:0,y:2496,width:192,height:192,offsets:None,),(name:"thruster_on",x:0,y:2688,width:192,height:192,offsets:None,),(name:"landingthruster_on",x:0,y:2880,width:192,height:192,offsets:None,),(name:"landingthruster_off",x:0,y:3072,width:192,height:192,offsets:None,),(name:"autoplr_on",x:0,y:3264,width:192,height:192,offsets:None,),(name:"thruster_off",x:0,y:3456,width:192,height:192,offsets:None,),(name:"cargo_on",x:0,y:3648,width:192,height:192,offsets:None,),(name:"autoplr_error",x:0,y:3840,width:192,height:192,offsets:None,),(name:"hub_on",x:0,y:4032,width:192,height:192,offsets:None,),],)
\ No newline at end of file

M assets/dist/spritesheet-full.png => assets/dist/spritesheet-full.png +0 -0
M assets/dist/spritesheet-full.ron => assets/dist/spritesheet-full.ron +1 -1
@@ 1,1 1,1 @@
(texture_width:3072,texture_height:4096,sprites:[(name:"earth",x:0,y:0,width:2048,height:2048,offsets:None,),(name:"ecothruster_on",x:0,y:2048,width:512,height:512,offsets:None,),(name:"landingleg",x:0,y:2560,width:512,height:512,offsets:None,),(name:"superthruster_on",x:0,y:3072,width:512,height:512,offsets:None,),(name:"cargo_on",x:0,y:3584,width:512,height:512,offsets:None,),(name:"autoplr_cfg",x:512,y:2048,width:512,height:512,offsets:None,),(name:"landingthruster_off",x:512,y:2560,width:512,height:512,offsets:None,),(name:"superthruster_off",x:512,y:3072,width:512,height:512,offsets:None,),(name:"autoplr_on",x:512,y:3584,width:512,height:512,offsets:None,),(name:"thruster_off",x:1024,y:2048,width:512,height:512,offsets:None,),(name:"cargo_off",x:1024,y:2560,width:512,height:512,offsets:None,),(name:"thruster_on",x:1024,y:3072,width:512,height:512,offsets:None,),(name:"autoplr_error",x:1024,y:3584,width:512,height:512,offsets:None,),(name:"hub_off",x:1536,y:2048,width:512,height:512,offsets:None,),(name:"powerhub_off",x:1536,y:2560,width:512,height:512,offsets:None,),(name:"hearty",x:1536,y:3072,width:512,height:512,offsets:None,),(name:"hub_on",x:1536,y:3584,width:512,height:512,offsets:None,),(name:"landingthruster_on",x:2048,y:0,width:512,height:512,offsets:None,),(name:"powerhub_on",x:2560,y:0,width:512,height:512,offsets:None,),],)
\ No newline at end of file
(texture_width:3072,texture_height:4096,sprites:[(name:"earth",x:0,y:0,width:2048,height:2048,offsets:None,),(name:"autoplr_cfg",x:0,y:2048,width:512,height:512,offsets:None,),(name:"superthruster_on",x:0,y:2560,width:512,height:512,offsets:None,),(name:"hearty",x:0,y:3072,width:512,height:512,offsets:None,),(name:"ecothruster_on",x:0,y:3584,width:512,height:512,offsets:None,),(name:"superthruster_off",x:512,y:2048,width:512,height:512,offsets:None,),(name:"landingleg",x:512,y:2560,width:512,height:512,offsets:None,),(name:"hub_off",x:512,y:3072,width:512,height:512,offsets:None,),(name:"powerhub_off",x:512,y:3584,width:512,height:512,offsets:None,),(name:"powerhub_on",x:1024,y:2048,width:512,height:512,offsets:None,),(name:"cargo_off",x:1024,y:2560,width:512,height:512,offsets:None,),(name:"thruster_on",x:1024,y:3072,width:512,height:512,offsets:None,),(name:"landingthruster_on",x:1024,y:3584,width:512,height:512,offsets:None,),(name:"landingthruster_off",x:1536,y:2048,width:512,height:512,offsets:None,),(name:"autoplr_on",x:1536,y:2560,width:512,height:512,offsets:None,),(name:"thruster_off",x:1536,y:3072,width:512,height:512,offsets:None,),(name:"cargo_on",x:1536,y:3584,width:512,height:512,offsets:None,),(name:"autoplr_error",x:2048,y:0,width:512,height:512,offsets:None,),(name:"hub_on",x:2560,y:0,width:512,height:512,offsets:None,),],)
\ No newline at end of file

M client/src/rendering/renderer.rs => client/src/rendering/renderer.rs +46 -1
@@ 1,9 1,11 @@
use std::error::Error;
use async_trait::async_trait;
use web_sys::{CanvasRenderingContext2d, HtmlCanvasElement};
use log::debug;
use web_sys::{CanvasRenderingContext2d, HtmlCanvasElement, HtmlImageElement};
use crate::rendering::Renderer;
use wasm_bindgen::{JsCast, JsValue};
use crate::CLIENT;
use crate::textures::TextureManager;

#[derive(Debug)]
pub struct WebRenderer {


@@ 28,6 30,10 @@ impl Renderer for WebRenderer {
        let typed_canvas_element: HtmlCanvasElement = canvas_element.dyn_into::<web_sys::HtmlCanvasElement>().map_err(|_| ()).unwrap();
        let context = typed_canvas_element.get_context("2d").unwrap().unwrap().dyn_into::<CanvasRenderingContext2d>().unwrap();
        let client = CLIENT.read()?;
        if client.client_data.is_none() {
            return Err("client not yet initialized".into());
        }
        let client_data = client.client_data.as_ref().unwrap();

        context.set_transform(1f64, 0f64, 0f64, 1f64, 0f64, 0f64).map_err(|e: JsValue| e.as_string().unwrap())?;
        context.clear_rect(0f64, 0f64, typed_canvas_element.width() as f64, typed_canvas_element.height() as f64);


@@ 35,8 41,47 @@ impl Renderer for WebRenderer {
        let camera_translate_x = -client.x + (typed_canvas_element.width() / 2) as f64;
        let camera_translate_y = -client.y + (typed_canvas_element.height() / 2) as f64;

        debug!("translating to {} {}", camera_translate_x, camera_translate_y);

        context.translate(camera_translate_x, camera_translate_y).map_err(|e: JsValue| e.as_string().unwrap())?;

        for planet in &client.planets {
            context.save();
            context.set_transform(1f64, 0f64, 0f64, 1f64, 0f64, 0f64).map_err(|e: JsValue| e.as_string().unwrap())?;
            context.translate(-planet.x, -planet.y).map_err(|e: JsValue| e.as_string().unwrap())?;
            let texture_image = document.get_element_by_id(&format!("tex-{}", planet.planet_type.as_texture_id())).unwrap().dyn_into::<HtmlImageElement>().unwrap();
            context.draw_image_with_html_image_element_and_dw_and_dh(&texture_image, -planet.radius, -planet.radius, planet.radius * 2f64, planet.radius * 2f64).map_err(|e: JsValue| e.as_string().unwrap())?;
            context.restore();
        }
        // do not remove
        // im making this smiley an easter egg soon
        // i just have to go fix the broken build system first
/*
        context.begin_path();

        // Draw the outer circle.
        context
            .arc(75.0, 75.0, 50.0, 0.0, std::f64::consts::PI * 2.0)
            .unwrap();

        // Draw the mouth.
        context.move_to(110.0, 75.0);
        context.arc(75.0, 75.0, 35.0, 0.0, std::f64::consts::PI).unwrap();

        // Draw the left eye.
        context.move_to(65.0, 65.0);
        context
            .arc(60.0, 65.0, 5.0, 0.0, std::f64::consts::PI * 2.0)
            .unwrap();

        // Draw the right eye.
        context.move_to(95.0, 65.0);
        context
            .arc(90.0, 65.0, 5.0, 0.0, std::f64::consts::PI * 2.0)
            .unwrap();

        context.stroke();
*/
        Ok(())
    }
}
\ No newline at end of file

M client/src/textures/loader_slow.rs => client/src/textures/loader_slow.rs +1 -1
@@ 15,6 15,6 @@ impl TextureManager for TextureLoader {
    }

    fn get_texture(&self, texture_id: &str) -> Option<String> {
        Some(format!("/../assets/final/{}/{}.png", self.size.to_string(), texture_id))
        Some(format!("/assets/final/{}/{}.png", self.size.to_string(), texture_id))
    }
}
\ No newline at end of file

M protocol/src/lib.rs => protocol/src/lib.rs +8 -0
@@ 82,6 82,14 @@ pub enum PlanetType {
    Earth
}

impl PlanetType {
    pub fn as_texture_id(&self) -> String {
        match self {
            PlanetType::Earth => "earth".to_string()
        }
    }
}

pub fn pc2s(pkt: &MessageC2S) -> Vec<u8> {
    rmp_serde::to_vec(pkt).unwrap()
}

M spacetime => spacetime +3 -3
@@ 6,9 6,9 @@ SCRIPT_PATH=$(readlink -f "${BASH_SOURCE:-$0}")
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")

exec_spacetime() {
  # args: target, environment, build root
  echo "[*] Running configure command: 'python3 $SCRIPT_DIR/spacetime_py/spacetime.py $1 $2 $SCRIPT_DIR'"
  python3 "$SCRIPT_DIR/spacetime_py/spacetime.py" "$1" "$2" "$SCRIPT_DIR"
  # args: target, environment, build root, verbose?
  echo "[*] Running configure command: 'python3 $SCRIPT_DIR/spacetime_py/spacetime.py $1 $2 $SCRIPT_DIR $SPACETIME_VERBOSE'"
  python3 "$SCRIPT_DIR/spacetime_py/spacetime.py" "$1" "$2" "$SCRIPT_DIR" "$SPACETIME_VERBOSE"
}

exec_ninja() {

M spacetime_py/spacetime.py => spacetime_py/spacetime.py +10 -3
@@ 8,7 8,7 @@ def scan_assets(build_root):
    assets = []
    for entry in os.scandir(f'{build_root}/assets/src'):
        if entry.is_file() and entry.name.endswith('.ink.svg'):
            assets.append(f'{build_root}/assets/src/{entry.name}')
            assets.append(f'{entry.name}')
    print(f'[spacetime] Found {len(assets)} assets')
    return assets



@@ 18,7 18,6 @@ asset_override = {
    'earth.ink.svg': 2048
}


def gen_inkscape_rules_for_asset_size(size, writer):
    writer.rule(f'inkscape_{size}px_full', f'inkscape -w {size * 1} -h {size * 1} $in -o $out')
    writer.rule(f'inkscape_{size}px_375', f'inkscape -w {int(size * 0.375)} -h {int(size * 0.375)} $in -o $out')


@@ 39,7 38,7 @@ def asset_size(asset):


def gen_inkscape_rules_for_asset(root, asset, writer, files_375, files_full, files_125):
    in_file = asset
    in_file = f'{root}/assets/src/{asset}'
    out_file_name = asset.split('.')[0].split('/')[-1]

    out_full = f'{root}/assets/final/full/{out_file_name}.png'


@@ 173,6 172,12 @@ def main():
    target = sys.argv[1]
    env = sys.argv[2]
    root = sys.argv[3]

    verbose = False
    if len(sys.argv) > 4:
        if sys.argv[4] == '-v':
            verbose = True

    print(f'[spacetime] Configuring ninja for PRIMARY_TARGET={target} with ENV={env}, BUILDROOT={root}')

    with open(f'{root}/build.ninja', 'w') as f:


@@ 183,6 188,8 @@ def main():

        if env == 'prod' or target == 'asset':
            assets = scan_assets(root)
            if verbose:
                print(f'[spacetime -v] discovered assets: {assets}')
            generate_assets_build_command(root, assets, writer)

        if target == 'client':

M web/play.html => web/play.html +117 -83
@@ 6,95 6,129 @@
    <meta charset="utf-8">
</head>

    <body>
        <div class="chatbox">
            <div id="chats">
<body>
<div class="chatbox">
    <div id="chats">

    </div>
    <input id="chat-value" type="text" placeholder="chat text goes here"/>
    <button id="chat-submit">submit</button>
    <p id="status">Loading WASM module...</p>

    <div id="textures" style="display: none;">

    </div>
</div>

<canvas style="width: 100%; height: 100%; background-color: purple;" id="canvas"></canvas>

<script type="module">
    // If you're getting build errors here | you need to run `just build_client_bundle` first, to compile client code
    //                                     v
    import init, {
        rust_init,
        send_chat,
        update_socket,
        set_status,
        get_texture,
        render_frame,
        send_ping_pong
    } from "./dist/starkingdoms_client.js";

    init().then(() => {
        const urlSearchParams = new URLSearchParams(window.location.search);

        if (!(urlSearchParams.has("server") || urlSearchParams.has("username") || urlSearchParams.has("textures"))) {
            window.location.href = "/index.html";
        }

        rust_init(urlSearchParams.get("server"), urlSearchParams.get("username"), urlSearchParams.get("textures")).then(() => {
            document.getElementById("chat-submit").addEventListener("click", e => {
                send_chat(document.getElementById("chat-value").value);
            });

            let interval_id;
            let interval_id2;

            interval_id = setInterval(() => {
                update_socket().catch((e) => {
                    clearInterval(interval_id);
                    clearInterval(interval_id2);
                    set_status("There was an error. Reload the page to reconnect.")
                    throw e;
                });
            }, 5);

            interval_id2 = setInterval(() => {
                send_ping_pong().catch((e) => {
                    clearInterval(interval_id2);
                    clearInterval(interval_id);
                    set_status("There was an error. Reload the page to reconnect.")
                    throw e;
                });
            }, 5);

            let start;

            </div>
            <input id="chat-value" type="text" placeholder="chat text goes here" />
            <button id="chat-submit">submit</button>
            <p id="status">Loading WASM module...</p>
            let textures = ["autoplr_cfg", "autoplr_error", "autoplr_on", "cargo_off", "cargo_on", "earth", "ecothruster_on", "hearty", "hub_off", "hub_on", "landingleg", "landingthruster_off", "landingthruster_on", "powerhub_off", "powerhub_on", "superthruster_off", "superthruster_on", "thruster_off", "thruster_on"];

            <div id="textures">
            for (let i = 0; i < textures.length; i++) {
                let texture = textures[i];

            </div>
        </div>
                let fieldset_elem = document.createElement("fieldset");
                fieldset_elem.style = "width: min-content;";
                fieldset_elem.classList.add("texturebox")
                let legend_elem = document.createElement("legend");
                legend_elem.innerText = texture;

        <canvas style="width: 100%; height: 100%" id="canvas"></canvas>
                let img_elem = document.createElement("img");
                img_elem.src = get_texture(texture);
                img_elem.id = "tex-" + texture;

        <script type="module">
            // If you're getting build errors here | you need to run `just build_client_bundle` first, to compile client code
            //                                     v
            import init, { rust_init, send_chat, update_socket, set_status, get_texture, render_frame, send_ping_pong } from "./dist/starkingdoms_client.js";
            init().then(() => {
                const urlSearchParams = new URLSearchParams(window.location.search);
                fieldset_elem.appendChild(legend_elem);
                fieldset_elem.appendChild(img_elem);
                document.getElementById("textures").appendChild(fieldset_elem);
            }
            if (urlSearchParams.has("showTextures")) {
                document.getElementById("textures").style = "";
            }

                if (!(urlSearchParams.has("server") || urlSearchParams.has("username") || urlSearchParams.has("textures"))) {
                    window.location.href = "/index.html";
            // Textures must be fully loaded (above) before rendering can start
            // They are all put on the DOM, in a hidden element, so they arent visible to the user unless showTextures=1
            // but they need to have been loaded for the canvas to render them

            function animateFrame(time) {
                if (start === undefined) {
                    start = time;
                }
                let delta = time - start;

                rust_init(urlSearchParams.get("server"), urlSearchParams.get("username"), urlSearchParams.get("textures")).then(() => {
                    document.getElementById("chat-submit").addEventListener("click", e => {
                        send_chat(document.getElementById("chat-value").value);
                    });

                    let interval_id;
                    let interval_id2;

                    interval_id = setInterval(() => {
                        update_socket().catch((e) => {
                            clearInterval(interval_id);
                            clearInterval(interval_id2);
                            set_status("There was an error. Reload the page to reconnect.")
                            throw e;
                        });
                    }, 5);

                    interval_id2 = setInterval(() => {
                        send_ping_pong().catch((e) => {
                            clearInterval(interval_id2);
                            clearInterval(interval_id);
                            set_status("There was an error. Reload the page to reconnect.")
                            throw e;
                        });
                    }, 5);

                    let start;
                    function animateFrame(time) {
                        if (start === undefined) {
                            start = time;
                        }
                        let delta = time - start;

                        render_frame(delta);
                        start = time;
                        //requestAnimationFrame(animateFrame)
                    }

                    //requestAnimationFrame(animateFrame);

                    if (urlSearchParams.has("showTextures")) {
                        let textures = ["autoplr_cfg", "autoplr_error", "autoplr_on", "cargo_off", "cargo_on", "earth", "ecothruster_on", "hearty", "hub_off", "hub_on", "landingleg", "landingthruster_off", "landingthruster_on", "powerhub_off", "powerhub_on", "superthruster_off", "superthruster_on", "thruster_off", "thruster_on"];

                        for (let i = 0; i < textures.length; i++) {
                            let texture = textures[i];

                            let fieldset_elem = document.createElement("fieldset");
                            fieldset_elem.style = "width: min-content;";
                            fieldset_elem.classList.add("texturebox")
                            let legend_elem = document.createElement("legend");
                            legend_elem.innerText = texture;

                            let img_elem = document.createElement("img");
                            img_elem.src = get_texture(texture);

                            fieldset_elem.appendChild(legend_elem);
                            fieldset_elem.appendChild(img_elem);
                            document.body.appendChild(fieldset_elem);
                        }
                    }
                });
            })
        </script>
    </body>
                try {
                    render_frame(delta);
                } catch (e) {
                    console.error("error in renderFrame: "+e);
                    return;
                }
                start = time;

                //let earth_img = new Image();
                //earth_img.src = get_texture("earth");
                //document.getElementById("canvas").getContext("2d").drawImage(earth_img, 0, 0, 400, 400);

                let canvas = document.getElementById("canvas");
                let context = document.getElementById("canvas").getContext("2d");

                //context.setTransform(1, 0, 0, 1, 0, 0);
                //context.clearRect(0, 0, canvas.width, canvas.height);

                //context.drawImage(document.getElementById("tex-earth"), -1000, -1000, 2000, 2000);

                requestAnimationFrame(animateFrame);
            }

            requestAnimationFrame(animateFrame);
        });
    })
</script>
</body>
</html>