dronedemo/public/render.js

99 lines
3.2 KiB
JavaScript
Raw Normal View History

2024-08-07 19:59:21 -04:00
const socket = io();
let gameState = null;
let clientId = null;
const modelMeshes = {};
const canvas = document.getElementById("renderCanvas");
const engine = new BABYLON.Engine(canvas, true);
var {scene,camera} = createScene();
function createScene() {
var scene = new BABYLON.Scene(engine);
var camera = new BABYLON.FreeCamera("camera", new BABYLON.Vector3(0, 5, -10), scene);
camera.setTarget(BABYLON.Vector3.Zero());
camera.attachControl(canvas, true);
const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0), scene);
// Create ground
const ground = BABYLON.MeshBuilder.CreateGround("ground", {width: 200, height: 200}, scene);
const groundMaterial = new BABYLON.StandardMaterial("groundMaterial", scene);
groundMaterial.diffuseColor = new BABYLON.Color3(0.5, 0.5, 0.5);
ground.material = groundMaterial;
return {scene,camera};
}
function createOrUpdateMesh(model) {
if (!modelMeshes[model.id]) {
let mesh;
if (model.type === 'human') {
mesh = BABYLON.MeshBuilder.CreateBox(model.id, {height: 1.8, width: 0.5, depth: 0.5}, scene);
mesh.material = new BABYLON.StandardMaterial(model.id + "Material", scene);
mesh.material.diffuseColor = new BABYLON.Color3(0, 0, 1);
} else if (model.type === 'drone') {
mesh = BABYLON.MeshBuilder.CreateBox(model.id, {size: 1}, scene);
mesh.material = new BABYLON.StandardMaterial(model.id + "Material", scene);
mesh.material.diffuseColor = new BABYLON.Color3(1, 0, 0);
} else if (model.type === 'antenna') {
mesh = BABYLON.MeshBuilder.CreateCylinder(model.id, {height: 5, diameter: 0.5}, scene);
mesh.material = new BABYLON.StandardMaterial(model.id + "Material", scene);
mesh.material.diffuseColor = new BABYLON.Color3(0, 1, 0);
}
modelMeshes[model.id] = mesh;
}
const mesh = modelMeshes[model.id];
mesh.position.set(model.x, model.z, model.y);
mesh.rotation.set(model.pitch, model.yaw, model.roll);
}
socket.on('connect', () => {
clientId = socket.id;
});
socket.on('initialState', (state) => {
gameState = state;
Object.values(state.models).forEach(createOrUpdateMesh);
});
socket.on('stateUpdate', (state) => {
gameState = state;
console.log(gameState);
console.log(gameState.models.human1);
Object.values(state.models).forEach(createOrUpdateMesh);
const client = gameState.clients[clientId];
if (client) {
const viewerModel = gameState.models[client.viewingId]
if (viewerModel) {
camera.position.set(viewerModel.x, viewerModel.z + 1.8, viewerModel.y);
camera.rotation.set(viewerModel.pitch, viewerModel.yaw, viewerModel.roll);
}
}
});
engine.runRenderLoop(() => {
scene.render();
});
window.addEventListener("resize", () => {
engine.resize();
});
document.addEventListener('keydown', (event) => {
socket.emit('keyEvent', { key: event.key, isDown: true });
});
document.addEventListener('keyup', (event) => {
socket.emit('keyEvent', { key: event.key, isDown: false });
});
document.addEventListener('keypress', (event) => {
if (event.key === 'v') {
socket.emit('toggleView');
}
});