MikaFil commited on
Commit
8e18f81
·
verified ·
1 Parent(s): 2af0591

Update viewer.js

Browse files
Files changed (1) hide show
  1. viewer.js +35 -16
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 : empêcher le scroll de la page quand le pointeur est au-dessus du viewer ---
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
- // Capture au niveau fenêtre pour bloquer le scroll, mais laisser PlayCanvas recevoir l'event
 
 
 
 
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
- // Ceinture et bretelles: si le canvas a le focus, on bloque ici aussi
174
- const onCanvasKey = (e) => {
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('keydown', onCanvasKey);
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, // vitesses relatives à la distance (vertical)
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);