Spaces:
Running
Running
Update viewer.js
Browse files
viewer.js
CHANGED
|
@@ -144,23 +144,44 @@ export async function initializeViewer(config, instanceId) {
|
|
| 144 |
canvas.addEventListener('touchstart', e => { if (e.touches.length > 1) e.preventDefault(); }, { passive: false });
|
| 145 |
canvas.addEventListener('wheel', (e) => { e.preventDefault(); }, { passive: false });
|
| 146 |
|
| 147 |
-
// --- Clavier :
|
| 148 |
const scrollKeys = new Set([
|
| 149 |
-
'ArrowUp','ArrowDown','ArrowLeft','ArrowRight',
|
| 150 |
-
'PageUp','PageDown','Home','End',' ','Space','Spacebar'
|
| 151 |
]);
|
|
|
|
| 152 |
let isPointerOverCanvas = false;
|
| 153 |
|
| 154 |
const focusCanvas = () => canvas.focus({ preventScroll: true });
|
| 155 |
-
const onPointerEnter = () => { isPointerOverCanvas = true; focusCanvas(); };
|
| 156 |
-
const onPointerLeave = () => { isPointerOverCanvas = false; };
|
| 157 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 158 |
canvas.addEventListener('pointerenter', onPointerEnter);
|
| 159 |
canvas.addEventListener('pointerleave', onPointerLeave);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 160 |
canvas.addEventListener('mousedown', focusCanvas);
|
| 161 |
canvas.addEventListener('touchstart', () => { focusCanvas(); }, { passive: false });
|
| 162 |
|
| 163 |
-
//
|
|
|
|
|
|
|
|
|
|
|
|
|
| 164 |
const onKeyDownCapture = (e) => {
|
| 165 |
if (!isPointerOverCanvas) return;
|
| 166 |
if (scrollKeys.has(e.key) || scrollKeys.has(e.code)) {
|
|
@@ -170,12 +191,8 @@ export async function initializeViewer(config, instanceId) {
|
|
| 170 |
};
|
| 171 |
window.addEventListener('keydown', onKeyDownCapture, true);
|
| 172 |
|
| 173 |
-
//
|
| 174 |
-
|
| 175 |
-
if (scrollKeys.has(e.key) || scrollKeys.has(e.code)) e.preventDefault();
|
| 176 |
-
};
|
| 177 |
-
canvas.addEventListener('keydown', onCanvasKey);
|
| 178 |
-
canvas.addEventListener('keyup', onCanvasKey);
|
| 179 |
|
| 180 |
progressDialog.style.display = 'block';
|
| 181 |
|
|
@@ -233,12 +250,14 @@ export async function initializeViewer(config, instanceId) {
|
|
| 233 |
if (opts.keyboard && opts.keyboard.detach) opts.keyboard.detach();
|
| 234 |
|
| 235 |
window.removeEventListener('keydown', onKeyDownCapture, true);
|
|
|
|
| 236 |
canvas.removeEventListener('pointerenter', onPointerEnter);
|
| 237 |
canvas.removeEventListener('pointerleave', onPointerLeave);
|
|
|
|
|
|
|
| 238 |
canvas.removeEventListener('mousedown', focusCanvas);
|
| 239 |
canvas.removeEventListener('touchstart', focusCanvas);
|
| 240 |
-
canvas.removeEventListener('
|
| 241 |
-
canvas.removeEventListener('keyup', onCanvasKey);
|
| 242 |
});
|
| 243 |
|
| 244 |
// Assets after app exists
|
|
@@ -323,8 +342,8 @@ export async function initializeViewer(config, instanceId) {
|
|
| 323 |
cameraEntity.script.create('orbitCameraInputTouch');
|
| 324 |
cameraEntity.script.create('orbitCameraInputKeyboard', {
|
| 325 |
attributes: {
|
| 326 |
-
forwardSpeed: 1.2, //
|
| 327 |
-
strafeSpeed: 1.2 // gauche/droite
|
| 328 |
}
|
| 329 |
});
|
| 330 |
app.root.addChild(cameraEntity);
|
|
|
|
| 144 |
canvas.addEventListener('touchstart', e => { if (e.touches.length > 1) e.preventDefault(); }, { passive: false });
|
| 145 |
canvas.addEventListener('wheel', (e) => { e.preventDefault(); }, { passive: false });
|
| 146 |
|
| 147 |
+
// --- Clavier : bloquer le scroll seulement quand le pointeur est au-dessus du canvas ---
|
| 148 |
const scrollKeys = new Set([
|
| 149 |
+
'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',
|
| 150 |
+
'PageUp', 'PageDown', 'Home', 'End', ' ', 'Space', 'Spacebar'
|
| 151 |
]);
|
| 152 |
+
|
| 153 |
let isPointerOverCanvas = false;
|
| 154 |
|
| 155 |
const focusCanvas = () => canvas.focus({ preventScroll: true });
|
|
|
|
|
|
|
| 156 |
|
| 157 |
+
const onPointerEnter = () => {
|
| 158 |
+
isPointerOverCanvas = true;
|
| 159 |
+
focusCanvas();
|
| 160 |
+
};
|
| 161 |
+
|
| 162 |
+
const onPointerLeave = () => {
|
| 163 |
+
isPointerOverCanvas = false;
|
| 164 |
+
// rendre immédiatement le scroll à la page sans recliquer
|
| 165 |
+
if (document.activeElement === canvas) {
|
| 166 |
+
canvas.blur();
|
| 167 |
+
}
|
| 168 |
+
};
|
| 169 |
+
|
| 170 |
+
// Fallback souris si pointer events indisponibles
|
| 171 |
canvas.addEventListener('pointerenter', onPointerEnter);
|
| 172 |
canvas.addEventListener('pointerleave', onPointerLeave);
|
| 173 |
+
canvas.addEventListener('mouseenter', onPointerEnter);
|
| 174 |
+
canvas.addEventListener('mouseleave', onPointerLeave);
|
| 175 |
+
|
| 176 |
+
// Forcer le focus quand on interagit
|
| 177 |
canvas.addEventListener('mousedown', focusCanvas);
|
| 178 |
canvas.addEventListener('touchstart', () => { focusCanvas(); }, { passive: false });
|
| 179 |
|
| 180 |
+
// Si le canvas perd le focus (Alt+Tab, click ailleurs…), on arrête de bloquer
|
| 181 |
+
const onCanvasBlur = () => { isPointerOverCanvas = false; };
|
| 182 |
+
canvas.addEventListener('blur', onCanvasBlur);
|
| 183 |
+
|
| 184 |
+
// Capture au niveau fenêtre pour bloquer le scroll, mais seulement si pointeur dessus
|
| 185 |
const onKeyDownCapture = (e) => {
|
| 186 |
if (!isPointerOverCanvas) return;
|
| 187 |
if (scrollKeys.has(e.key) || scrollKeys.has(e.code)) {
|
|
|
|
| 191 |
};
|
| 192 |
window.addEventListener('keydown', onKeyDownCapture, true);
|
| 193 |
|
| 194 |
+
// ⚠️ IMPORTANT : on ne bloque plus keydown/keyup sur le canvas lui-même.
|
| 195 |
+
// Ça évite de devoir “recliquer” pour retrouver le scroll.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 196 |
|
| 197 |
progressDialog.style.display = 'block';
|
| 198 |
|
|
|
|
| 250 |
if (opts.keyboard && opts.keyboard.detach) opts.keyboard.detach();
|
| 251 |
|
| 252 |
window.removeEventListener('keydown', onKeyDownCapture, true);
|
| 253 |
+
|
| 254 |
canvas.removeEventListener('pointerenter', onPointerEnter);
|
| 255 |
canvas.removeEventListener('pointerleave', onPointerLeave);
|
| 256 |
+
canvas.removeEventListener('mouseenter', onPointerEnter);
|
| 257 |
+
canvas.removeEventListener('mouseleave', onPointerLeave);
|
| 258 |
canvas.removeEventListener('mousedown', focusCanvas);
|
| 259 |
canvas.removeEventListener('touchstart', focusCanvas);
|
| 260 |
+
canvas.removeEventListener('blur', onCanvasBlur);
|
|
|
|
| 261 |
});
|
| 262 |
|
| 263 |
// Assets after app exists
|
|
|
|
| 342 |
cameraEntity.script.create('orbitCameraInputTouch');
|
| 343 |
cameraEntity.script.create('orbitCameraInputKeyboard', {
|
| 344 |
attributes: {
|
| 345 |
+
forwardSpeed: 1.2, // vertical (relatif à la distance)
|
| 346 |
+
strafeSpeed: 1.2 // gauche/droite (relatif à la distance)
|
| 347 |
}
|
| 348 |
});
|
| 349 |
app.root.addChild(cameraEntity);
|