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>