rkgk/static/index.js

75 lines
2.9 KiB
JavaScript
Raw Normal View History

2024-08-10 23:13:20 +02:00
import { Painter } from "./painter.js";
import { Wall } from "./wall.js";
import { Haku } from "./haku.js";
import { getUserId, newSession, waitForLogin } from "./session.js";
import { debounce } from "./framework.js";
2024-08-10 23:10:03 +02:00
2024-08-10 23:13:20 +02:00
let main = document.querySelector("main");
let canvasRenderer = main.querySelector("rkgk-canvas-renderer");
let reticleRenderer = main.querySelector("rkgk-reticle-renderer");
let brushEditor = main.querySelector("rkgk-brush-editor");
2024-08-10 23:10:03 +02:00
2024-08-10 23:13:20 +02:00
let haku = new Haku();
let painter = new Painter(512);
2024-08-10 23:10:03 +02:00
2024-08-10 23:13:20 +02:00
reticleRenderer.connectViewport(canvasRenderer.viewport);
canvasRenderer.addEventListener(".viewportUpdate", () => reticleRenderer.updateTransform());
2024-08-10 23:10:03 +02:00
2024-08-10 23:13:20 +02:00
// In the background, connect to the server.
(async () => {
await waitForLogin();
console.info("login ready! starting session");
2024-08-10 23:10:03 +02:00
2024-08-10 23:13:20 +02:00
let session = await newSession(getUserId(), localStorage.getItem("rkgk.mostRecentWallId"));
localStorage.setItem("rkgk.mostRecentWallId", session.wallId);
2024-08-10 23:10:03 +02:00
2024-08-10 23:13:20 +02:00
let wall = new Wall(session.wallInfo.chunkSize);
canvasRenderer.initialize(wall);
2024-08-10 23:10:03 +02:00
2024-08-10 23:13:20 +02:00
for (let onlineUser of session.wallInfo.online) {
wall.onlineUsers.addUser(onlineUser.sessionId, { nickname: onlineUser.nickname });
2024-08-10 23:10:03 +02:00
}
2024-08-10 23:13:20 +02:00
session.addEventListener("error", (event) => console.error(event));
session.addEventListener("action", (event) => {
if (event.kind.event == "cursor") {
let reticle = reticleRenderer.getOrAddReticle(wall.onlineUsers, event.sessionId);
let { x, y } = event.kind.position;
reticle.setCursor(x, y);
}
});
let compileBrush = () => haku.setBrush(brushEditor.code);
compileBrush();
brushEditor.addEventListener(".codeChanged", () => compileBrush());
let reportCursor = debounce(1000 / 60, (x, y) => session.reportCursor(x, y));
canvasRenderer.addEventListener(".cursor", async (event) => {
reportCursor(event.x, event.y);
});
canvasRenderer.addEventListener(".paint", async (event) => {
painter.renderBrush(haku);
let imageBitmap = await painter.createImageBitmap();
let left = event.x - painter.paintArea / 2;
let top = event.y - painter.paintArea / 2;
let leftChunk = Math.floor(left / wall.chunkSize);
let topChunk = Math.floor(top / wall.chunkSize);
let rightChunk = Math.ceil((left + painter.paintArea) / wall.chunkSize);
let bottomChunk = Math.ceil((top + painter.paintArea) / wall.chunkSize);
for (let chunkY = topChunk; chunkY < bottomChunk; ++chunkY) {
for (let chunkX = leftChunk; chunkX < rightChunk; ++chunkX) {
let chunk = wall.getOrCreateChunk(chunkX, chunkY);
let x = Math.floor(-chunkX * wall.chunkSize + left);
let y = Math.floor(-chunkY * wall.chunkSize + top);
chunk.ctx.drawImage(imageBitmap, x, y);
}
}
imageBitmap.close();
});
session.eventLoop();
})();