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); }