Character manager: asset uploads, per-ghost model/colour/opacity overrides, face+torso texture decals

This commit is contained in:
2026-07-24 14:47:36 +10:00
parent b6822af047
commit 5357c8464d
9 changed files with 642 additions and 39 deletions
+8 -1
View File
@@ -50,6 +50,7 @@ app.innerHTML = `${nav('preview')}
const g = await (await fetch('/api/ghosts')).json();
const gradients = g.gradients.gradients || g.gradients;
const modelManifest = await (await fetch('/api/models')).json();
let characters = await (await fetch('/api/characters')).json();
// ---------- three.js ----------
const cvs = document.getElementById('gl');
@@ -134,7 +135,7 @@ const clockSamples = []; let clockOffset = 0;
async function addGhost(rec) {
if (active.has(rec.uid)) return;
const group = await buildGhost(rec, gradients, modelManifest);
const group = await buildGhost(rec, gradients, modelManifest, characters);
group.userData.setHeight(ghostHeight);
const label = textSprite(rec.name, COLORS[rec.color] || '#fff');
label.scale.set(20, 5, 1);
@@ -157,6 +158,12 @@ net.on('scene', m => {
ghostHeight = m.scene.ghostHeightCm || 4;
for (const e of active.values()) e.group.userData.setHeight(ghostHeight);
})
.on('characters', async m => {
characters = m.characters || characters;
const recs = [...active.values()].map(e => e.rec);
for (const uid of [...active.keys()]) removeGhost(uid);
for (const rec of recs) await addGhost(rec);
})
.on('active', async m => {
for (const uid of [...active.keys()]) removeGhost(uid);
for (const rec of m.ghosts) await addGhost(rec);