diff --git a/public/js/exhibit.js b/public/js/exhibit.js index 60b8fb4..ab00a18 100644 --- a/public/js/exhibit.js +++ b/public/js/exhibit.js @@ -26,6 +26,7 @@ const ENGINES = ['opencv', 'posit']; let engine = localStorage.getItem('nbx.engine') || 'opencv'; if (!ENGINES.includes(engine)) engine = 'opencv'; let cvState = 'idle'; // idle | loading | ready | failed +let cvNote = ''; // download % / init stage while loading function setEngine(e) { engine = e; localStorage.setItem('nbx.engine', e); } /* Camera-frame correction for the POSIT path (unchanged from v2; the opencv path @@ -72,7 +73,7 @@ function updateDbg(fusedQuat, markerCount, extra) { const up = _dbgV.set(0, 1, 0).applyQuaternion(camera3.quaternion).clone(); const v3 = v => `(${v.x.toFixed(2)},${v.y.toFixed(2)},${v.z.toFixed(2)})`; const modeLine = engine === 'opencv' - ? `axis ${cvSolver ? cvSolver.getAxisMode() : 'std'} cv:${cvState}` + ? `axis ${cvSolver ? cvSolver.getAxisMode() : 'std'} cv:${cvState}${cvNote ? ' ' + cvNote : ''}` : `rot ${getRotMode()} cam ${camMode}`; dbgEl.textContent = `eng ${engine} ${freezeGhosts ? 'FROZEN' : 'moving'}\n` + @@ -131,12 +132,13 @@ async function applyLanding() { * posit engine takes over automatically — visitors always get a working exhibit. */ function ensureOpenCV() { if (cvState === 'ready' || cvState === 'loading') return; + // 'failed' falls through: tapping back to opencv retries the load cvState = 'loading'; - loadOpenCV().then(() => { - cvState = 'ready'; + loadOpenCV('/vendor/opencv.js', (p) => { cvNote = typeof p === 'number' ? p + '%' : String(p); }).then(() => { + cvState = 'ready'; cvNote = ''; if (engine === 'opencv') toast('Tracking engine ready'); }).catch((e) => { - cvState = 'failed'; + cvState = 'failed'; cvNote = ''; console.warn('opencv.js unavailable, falling back to posit', e); if (engine === 'opencv') { setEngine('posit'); toast('Using classic tracking'); } });