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"); // and chat document.getElementById("chat")!.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); }