MikaFil commited on
Commit
5e2e7fb
·
verified ·
1 Parent(s): 21c14a7

Update orbit-camera.js

Browse files
Files changed (1) hide show
  1. orbit-camera.js +81 -52
orbit-camera.js CHANGED
@@ -538,11 +538,7 @@ OrbitCameraInputTouch.prototype.onTouchMove = function (event) {
538
  }
539
  };
540
 
541
- // =================== Orbit Camera Input Keyboard ========================
542
- // Arrows:
543
- // - No modifier: Up/Down = vertical pan; Left/Right = strafe
544
- // - With Shift: Up/Down = orbit pitch; Left/Right = orbit yaw (inverted as requested)
545
- // - With Ctrl: Up/Down = zoom in/out
546
  var OrbitCameraInputKeyboard = pc.createScript('orbitCameraInputKeyboard');
547
 
548
  OrbitCameraInputKeyboard.attributes.add('forwardSpeed', { type: 'number', default: 1.2, title: 'Vertical Speed (rel. to distance)' });
@@ -555,31 +551,91 @@ OrbitCameraInputKeyboard.attributes.add('zoomKeySensitivity', { type: 'number',
555
 
556
  OrbitCameraInputKeyboard.prototype.initialize = function () {
557
  this.orbitCamera = this.entity.script.orbitCamera;
558
- this.keyboard = this.app.keyboard || null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
559
  };
560
 
561
  OrbitCameraInputKeyboard.prototype.update = function (dt) {
562
- if (!this.orbitCamera || !this.keyboard) return;
563
 
564
- var up = this.keyboard.isPressed(pc.KEY_UP);
565
- var dn = this.keyboard.isPressed(pc.KEY_DOWN);
566
- var lt = this.keyboard.isPressed(pc.KEY_LEFT);
567
- var rt = this.keyboard.isPressed(pc.KEY_RIGHT);
568
 
569
- var shift = this.keyboard.isPressed(pc.KEY_SHIFT);
570
- var ctrl = this.keyboard.isPressed(pc.KEY_CONTROL);
571
 
572
  // ---- SHIFT: Orbit (pitch / yaw) ----
573
  if (shift && (up || dn || lt || rt)) {
574
- // Yaw (left/right) — inverted per request: Shift+Right => orbit to the right
575
- var yawDir = (rt ? 1 : 0) - (lt ? 1 : 0); // right=+1, left=-1
576
  if (yawDir !== 0) {
577
  var dYaw = yawDir * this.orbitYawSpeedDeg * dt;
578
- this.orbitCamera.yaw = this.orbitCamera.yaw + dYaw; // NOTE: '+' (inversion)
579
  }
580
 
581
- // Pitch (up/down) — Shift+Up => orbit up, Shift+Down => down
582
- var pitchDir = (up ? 0 : 1) - (dn ? 0 : 1); // up=+1, down=-1
583
  if (pitchDir !== 0) {
584
  var dPitch = pitchDir * this.orbitPitchSpeedDeg * dt;
585
 
@@ -601,7 +657,7 @@ OrbitCameraInputKeyboard.prototype.update = function (dt) {
601
  var wouldGoBelow = proposedY < minY - 1e-4;
602
 
603
  if (!(wouldGoBelow && (proposedY < preY))) {
604
- this.orbitCamera.pitch = testPitch; // clamped by setter
605
  }
606
  }
607
  return;
@@ -609,48 +665,21 @@ OrbitCameraInputKeyboard.prototype.update = function (dt) {
609
 
610
  // ---- CTRL: Zoom (up/down) ----
611
  if (ctrl && (up || dn)) {
612
- var zoomSign = (up ? 1 : 0) - (dn ? 1 : 0); // up=zoom in, down=zoom out
613
  if (zoomSign !== 0) {
614
  if (this.entity.camera.projection === pc.PROJECTION_PERSPECTIVE) {
615
  var dz = zoomSign * this.zoomKeySensitivity * (this.orbitCamera.distance * 0.5) * dt;
616
- this.orbitCamera.distance -= dz; // clamped
617
  } else {
618
  var doh = zoomSign * this.zoomKeySensitivity * (this.orbitCamera.orthoHeight * 0.5) * dt;
619
- this.orbitCamera.orthoHeight -= doh; // clamped >= 0
620
  }
621
  }
622
  return;
623
  }
624
 
625
- // ---- No modifier: translate (vertical + strafe) ----
626
- var moveVert = (up ? 1 : 0) - (dn ? 1 : 0); // Up=+1 => go up
627
  var moveRight = (rt ? 1 : 0) - (lt ? 1 : 0);
628
 
629
- if (moveVert === 0 && moveRight === 0) return;
630
-
631
- // Base speeds relative to distance (consistent feel near/far)
632
- var dist = Math.max(0.1, this.orbitCamera.distance);
633
- var speedV = this.forwardSpeed * dist; // vertical speed
634
- var speedR = this.strafeSpeed * dist; // strafe speed
635
-
636
- // Vertical move (pure Y), respect minY
637
- var dy = moveVert * speedV * dt;
638
- if (dy !== 0) {
639
- var currentCamY = this.orbitCamera.worldCameraYForPivot(this.orbitCamera.pivotPoint);
640
- var minY = this.orbitCamera.minY;
641
- var proposedCamY = currentCamY + dy;
642
- if (proposedCamY < minY) {
643
- dy = Math.max(dy, minY - currentCamY);
644
- }
645
- if (dy !== 0) {
646
- this.orbitCamera._pivotPoint.y += dy;
647
- }
648
- }
649
-
650
- // Strafe on XZ
651
- var right = this.entity.right.clone(); right.y = 0; if (right.lengthSq() > 1e-8) right.normalize();
652
- var dx = moveRight * speedR * dt;
653
- if (dx !== 0) {
654
- this.orbitCamera._pivotPoint.add(right.mulScalar(dx));
655
- }
656
- };
 
538
  }
539
  };
540
 
541
+ // =================== Orbit Camera Input Keyboard (per-canvas) ========================
 
 
 
 
542
  var OrbitCameraInputKeyboard = pc.createScript('orbitCameraInputKeyboard');
543
 
544
  OrbitCameraInputKeyboard.attributes.add('forwardSpeed', { type: 'number', default: 1.2, title: 'Vertical Speed (rel. to distance)' });
 
551
 
552
  OrbitCameraInputKeyboard.prototype.initialize = function () {
553
  this.orbitCamera = this.entity.script.orbitCamera;
554
+
555
+ // État clavier local à CE canvas
556
+ this._keys = Object.create(null);
557
+ this._active = false;
558
+
559
+ // Cible = canvas de l'app
560
+ var el = this.app.graphicsDevice.canvas;
561
+ if (!el.hasAttribute('tabindex')) el.setAttribute('tabindex', '0');
562
+
563
+ // Empêche le scroll de page pour les touches de navigation quand actif
564
+ var shouldBlock = function(ev) {
565
+ if (!ev) return false;
566
+ var k = ev.key;
567
+ return k === 'ArrowUp' || k === 'ArrowDown' || k === 'ArrowLeft' || k === 'ArrowRight' ||
568
+ k === 'PageUp' || k === 'PageDown' || k === 'Home' || k === 'End' ||
569
+ k === ' ' || k === 'Spacebar' || (ev.ctrlKey && (k === 'ArrowUp' || k === 'ArrowDown'));
570
+ };
571
+
572
+ this._onKeyDown = (ev) => {
573
+ if (!this._active) return;
574
+ this._keys[ev.key] = true;
575
+ if (shouldBlock(ev)) ev.preventDefault();
576
+ };
577
+
578
+ this._onKeyUp = (ev) => {
579
+ this._keys[ev.key] = false;
580
+ };
581
+
582
+ this._onBlur = () => {
583
+ this._keys = Object.create(null);
584
+ };
585
+
586
+ this._onEnter = () => {
587
+ this._active = true;
588
+ try { el.focus({ preventScroll: true }); } catch(e) { el.focus(); }
589
+ };
590
+
591
+ this._onLeave = () => {
592
+ this._active = false;
593
+ el.blur();
594
+ this._keys = Object.create(null);
595
+ };
596
+
597
+ el.addEventListener('keydown', this._onKeyDown);
598
+ el.addEventListener('keyup', this._onKeyUp);
599
+ el.addEventListener('blur', this._onBlur);
600
+ el.addEventListener('pointerenter', this._onEnter);
601
+ el.addEventListener('pointerleave', this._onLeave);
602
+
603
+ // Nettoyage
604
+ this.on('destroy', function () {
605
+ el.removeEventListener('keydown', this._onKeyDown);
606
+ el.removeEventListener('keyup', this._onKeyUp);
607
+ el.removeEventListener('blur', this._onBlur);
608
+ el.removeEventListener('pointerenter', this._onEnter);
609
+ el.removeEventListener('pointerleave', this._onLeave);
610
+ }, this);
611
+ };
612
+
613
+ OrbitCameraInputKeyboard.prototype._pressed = function(name) {
614
+ return !!(this._keys[name] || this._keys[name + 'Left'] || this._keys[name + 'Right']);
615
  };
616
 
617
  OrbitCameraInputKeyboard.prototype.update = function (dt) {
618
+ if (!this.orbitCamera) return;
619
 
620
+ var up = !!this._keys['ArrowUp'];
621
+ var dn = !!this._keys['ArrowDown'];
622
+ var lt = !!this._keys['ArrowLeft'];
623
+ var rt = !!this._keys['ArrowRight'];
624
 
625
+ var shift = this._pressed('Shift');
626
+ var ctrl = this._pressed('Control');
627
 
628
  // ---- SHIFT: Orbit (pitch / yaw) ----
629
  if (shift && (up || dn || lt || rt)) {
630
+ // Yaw (left/right) — Shift+Right => orbit vers la droite
631
+ var yawDir = (rt ? 1 : 0) - (lt ? 1 : 0);
632
  if (yawDir !== 0) {
633
  var dYaw = yawDir * this.orbitYawSpeedDeg * dt;
634
+ this.orbitCamera.yaw = this.orbitCamera.yaw + dYaw;
635
  }
636
 
637
+ // Pitch (up/down)
638
+ var pitchDir = (up ? 1 : 0) - (dn ? 1 : 0);
639
  if (pitchDir !== 0) {
640
  var dPitch = pitchDir * this.orbitPitchSpeedDeg * dt;
641
 
 
657
  var wouldGoBelow = proposedY < minY - 1e-4;
658
 
659
  if (!(wouldGoBelow && (proposedY < preY))) {
660
+ this.orbitCamera.pitch = testPitch;
661
  }
662
  }
663
  return;
 
665
 
666
  // ---- CTRL: Zoom (up/down) ----
667
  if (ctrl && (up || dn)) {
668
+ var zoomSign = (up ? 1 : 0) - (dn ? 1 : 0);
669
  if (zoomSign !== 0) {
670
  if (this.entity.camera.projection === pc.PROJECTION_PERSPECTIVE) {
671
  var dz = zoomSign * this.zoomKeySensitivity * (this.orbitCamera.distance * 0.5) * dt;
672
+ this.orbitCamera.distance -= dz;
673
  } else {
674
  var doh = zoomSign * this.zoomKeySensitivity * (this.orbitCamera.orthoHeight * 0.5) * dt;
675
+ this.orbitCamera.orthoHeight -= doh;
676
  }
677
  }
678
  return;
679
  }
680
 
681
+ // ---- Sans modifieurs : translation (vertical + strafe) ----
682
+ var moveVert = (up ? 1 : 0) - (dn ? 1 : 0);
683
  var moveRight = (rt ? 1 : 0) - (lt ? 1 : 0);
684
 
685
+ i