tosijs-3d 0.11.1 → 0.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +7 -8
  2. package/changelog/v0.11.2.md +23 -0
  3. package/changelog/v0.11.3.md +21 -0
  4. package/dist/b3d-biped.d.ts +9 -0
  5. package/dist/b3d-biped.d.ts.map +1 -1
  6. package/dist/b3d-biped.js +73 -4
  7. package/dist/b3d-biped.js.map +1 -1
  8. package/dist/b3d-panel.d.ts.map +1 -1
  9. package/dist/b3d-panel.js +6 -4
  10. package/dist/b3d-panel.js.map +1 -1
  11. package/dist/b3d-shadows.d.ts +11 -17
  12. package/dist/b3d-shadows.d.ts.map +1 -1
  13. package/dist/b3d-shadows.js +15 -21
  14. package/dist/b3d-shadows.js.map +1 -1
  15. package/dist/gamepad-art.d.ts +1 -3
  16. package/dist/gamepad-art.d.ts.map +1 -1
  17. package/dist/gamepad-art.js +2 -4
  18. package/dist/gamepad-art.js.map +1 -1
  19. package/dist/glass-gamepad.d.ts +46 -4
  20. package/dist/glass-gamepad.d.ts.map +1 -1
  21. package/dist/glass-gamepad.js +227 -56
  22. package/dist/glass-gamepad.js.map +1 -1
  23. package/dist/hardware-gamepad.d.ts +2 -0
  24. package/dist/hardware-gamepad.d.ts.map +1 -1
  25. package/dist/hardware-gamepad.js +6 -3
  26. package/dist/hardware-gamepad.js.map +1 -1
  27. package/dist/playground.d.ts.map +1 -1
  28. package/dist/playground.js +5 -3
  29. package/dist/playground.js.map +1 -1
  30. package/dist/scene-schemas.js +2 -2
  31. package/dist/scene-schemas.js.map +1 -1
  32. package/dist/tosi-b3d.d.ts +16 -0
  33. package/dist/tosi-b3d.d.ts.map +1 -1
  34. package/dist/tosi-b3d.js +108 -22
  35. package/dist/tosi-b3d.js.map +1 -1
  36. package/dist/touch-gamepad.d.ts.map +1 -1
  37. package/dist/touch-gamepad.js +5 -1
  38. package/dist/touch-gamepad.js.map +1 -1
  39. package/dist/virtual-gamepad.d.ts +4 -0
  40. package/dist/virtual-gamepad.d.ts.map +1 -1
  41. package/dist/virtual-gamepad.js +13 -2
  42. package/dist/virtual-gamepad.js.map +1 -1
  43. package/dist/xr-gamepad.d.ts.map +1 -1
  44. package/dist/xr-gamepad.js +15 -7
  45. package/dist/xr-gamepad.js.map +1 -1
  46. package/package.json +1 -1
  47. package/static/attributes.json +28 -5
  48. package/static/attributes.txt +8 -3
package/CHANGELOG.md CHANGED
@@ -12,19 +12,18 @@ Upgrading across a minor? Start with [Migration](/Migration/).
12
12
 
13
13
  ## Unreleased
14
14
 
15
- Nothing yet.
15
+ ## 0.11.3
16
16
 
17
- ## 0.11.1
18
-
19
- The latest release. Three defaults that loaded files only our doc site serves
20
- now work on yours (the glass gamepad's art, the XR reticle, the crowd's
21
- skinned baseline), and the docs are reorganised: helper pages folded into the
22
- pages that use them, complete attribute tables, a changelog page per version.
23
- No other code changed. [Read 0.11.1](/v0.11.1/).
17
+ The latest release. The biped eases between animations instead of cutting
18
+ (`blendSeconds`, a quarter of a second by default), R3 toggles its weapon, XR
19
+ thumbsticks get a deadzone so the aim no longer drifts, and the sun's shadow
20
+ bias defaults clear acne stripes. [Read 0.11.3](/v0.11.3/).
24
21
 
25
22
  ## Every version
26
23
 
27
24
  <!-- toc -->
25
+ - [0.11.3](/v0.11.3/)
26
+ - [0.11.2](/v0.11.2/)
28
27
  - [0.11.1](/v0.11.1/)
29
28
  - [0.11.0](/v0.11.0/)
30
29
  - [0.10.20](/v0.10.20/)
@@ -0,0 +1,23 @@
1
+ # 0.11.2
2
+
3
+ <!--{ "parent": "CHANGELOG", "order": 9988998 }-->
4
+
5
+ ## Added
6
+
7
+ - **A new glass gamepad**, laid out like a pair of VR controllers held flat: on each side a trigger, bumper, stick and two face buttons (X and Y on the left, A and B on the right, in Xbox colours), with view and menu between them at the bottom. It is one SVG sheet (`static/glass-gamepad.svg`) that the pad cuts into three clusters along the bottom; on a narrow screen the centre cluster tucks in between the others when it fits and sits above them when it does not.
8
+ - **Stick clicks (L3, R3)**: `leftStickPress` and `rightStickPress` on `VirtualGamepad`. The glass pad has a button under each stick, a hardware pad's buttons 10 and 11 feed them, and so does clicking a thumbstick in a headset. On the biped, a left-stick click sneaks (as L3 does in GTA V).
9
+ - **View and menu on the headset's system bar**, when the glass pad's `controls` name them. `pad.pulse('view' | 'menu')` presses one from code.
10
+
11
+ ## Changed
12
+
13
+ - **The glass gamepad hides its d-pad unless you name it** (`controls="…,dpad"`). View and menu are still shown by default, but will become opt-in in a future release: name them if you use them.
14
+ - **In a headset, clicking a thumbstick is a stick press**, not view (right) or menu (left). Y still toggles the camera view, and the system bar carries view and menu when a scene asks for them.
15
+ - **A hardware pad's view and menu buttons (8 and 9) now reach `view` and `menu`**; they were read but dropped.
16
+ - The glass pad's `clusters.top` is now `clusters.center` (`top` still works).
17
+
18
+ ## Fixed
19
+
20
+ - **The full-screen button on an iPhone.** iPhone Safari has no Fullscreen API for anything but video, so the button hid itself. It now maximises the scene instead: in the top layer as a popover (iOS 17+, so a doc page's card cannot trap it), filling what is visible.
21
+ - **The glass gamepad demo goes full screen with its pad**, which is now inside the scene as `gamepad: true` mounts it; beside the scene it was left behind.
22
+
23
+ Size: barrel (min, packages external) 1244.9 KB raw / 425.9 KB gz, +0.27% on 0.11.1.
@@ -0,0 +1,21 @@
1
+ # 0.11.3
2
+
3
+ <!--{ "parent": "CHANGELOG", "order": 9988997 }-->
4
+
5
+ ## Added
6
+
7
+ - **`blendSeconds` on `<tosi-b3d-biped>`** (default 0.25): how long each animation change eases over. `0` cuts.
8
+ - The panel page's system-bar demo has a "New journal entry" button that blinks the Journal button (`attention()`).
9
+
10
+ ## Changed
11
+
12
+ - **The biped eases every animation change** instead of cutting: walk to run, standing to crouch, the gun coming up and going down, aim up/level/down. The blend is timed, so it lasts the same at any frame rate. A crouch at rest plays a transition clip if the states name one (`sneakEnter` / `sneakExit`, e.g. UAL's `Crouch_Enter` / `Crouch_Exit`); the defaults have none, so it blends.
13
+ - **The sun's shadow bias defaults are now `shadowBias` 0.002 and `shadowNormalBias` 0.04**, which clears the fine acne stripes on plain lit surfaces. If a small caster's shadow detaches, set them lower on your `<tosi-b3d-sun>`.
14
+ - **In the biped mapping, clicking the right stick (R3) toggles the weapon**, as the right bumper does. The playground's glass pad shows both stick clicks.
15
+
16
+ ## Fixed
17
+
18
+ - **XR thumbsticks have the hardware pad's 0.15 per-axis deadzone**, so a stick pushed sideways to turn no longer drifts the biped's look pitch (its aim). Raising the weapon now levels the aim in a headset too.
19
+ - In the glass gamepad demo, the cube moves away from you on left stick up, and the readout sits top centre, clear of the system bar.
20
+
21
+ Size: barrel (min, packages external) 1245.8 KB raw / 426.2 KB gz, +0.08% on 0.11.2.
@@ -49,6 +49,7 @@ export declare class B3dBiped extends B3dControllable {
49
49
  static preferredTagName: string;
50
50
  url: string;
51
51
  player: boolean;
52
+ blendSeconds: number;
52
53
  static initAttributes: {
53
54
  url: string;
54
55
  skin: string;
@@ -57,6 +58,7 @@ export declare class B3dBiped extends B3dControllable {
57
58
  cameraType: string;
58
59
  animation: string;
59
60
  animationSpeed: number;
61
+ blendSeconds: number;
60
62
  initialState: string;
61
63
  turnSpeed: number;
62
64
  forwardSpeed: number;
@@ -513,6 +515,9 @@ export declare class B3dBiped extends B3dControllable {
513
515
  */
514
516
  private _clipSeconds;
515
517
  private _sneakWas;
518
+ /** The stance-change clip playing (`sneakEnter`/`sneakExit`), and its seconds left. */
519
+ private _stanceClip;
520
+ private _stanceLeft;
516
521
  /** Zoom 0..1, now integrated from the d-pad rather than read off a stick. */
517
522
  private _camZoom;
518
523
  private _waterEl;
@@ -661,6 +666,10 @@ export declare class B3dBiped extends B3dControllable {
661
666
  private _updateAimLayer;
662
667
  /** Seconds left of the one-shot fire pose. */
663
668
  private _shootFor;
669
+ private _eased;
670
+ private _blendStep;
671
+ private _ease;
672
+ private _paceBlends;
664
673
  setAnimationState(name: string, speed?: number): void;
665
674
  getCameraTarget(): BABYLON.Node | null;
666
675
  applyInput(input: ControlInput, dt: number): void;
@@ -1 +1 @@
1
- {"version":3,"file":"b3d-biped.d.ts","sourceRoot":"","sources":["../src/b3d-biped.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"b3d-biped.d.ts","sourceRoot":"","sources":["../src/b3d-biped.ts"],"names":[],"mappings":"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"}
package/dist/b3d-biped.js CHANGED
@@ -184,6 +184,7 @@ preview.append(
184
184
  | `scale` | `1` | Uniform scale applied to the loaded model |
185
185
  | `animation` | `''` | Current animation state name |
186
186
  | `animationSpeed` | `1` | Playback speed multiplier (0–2) |
187
+ | `blendSeconds` | `0.25` | Seconds each animation change eases over (walk to run, crouching, the gun coming up). `0` cuts |
187
188
  | `player` | `false` | Whether this biped receives input |
188
189
  | `cameraType` | `'none'` | `'follow'`, `'xr'`, or `'none'` |
189
190
  | `turnSpeed` | `180` | Degrees per second |
@@ -374,6 +375,9 @@ export function ualAnimationStates(extra = []) {
374
375
  { name: 'sneakIdle', animation: 'Crouch_Idle_Loop', loop: true },
375
376
  { name: 'sneakLeft', animation: 'Crouch_Left_Loop', loop: true },
376
377
  { name: 'sneakRight', animation: 'Crouch_Right_Loop', loop: true },
378
+ // No `sneakEnter` / `sneakExit`: UAL's `Crouch_Enter` / `Crouch_Exit` are
379
+ // slower than the blend between the loops, which reads better. Add them to
380
+ // your states to have a crouch at rest play them.
377
381
  // One clip per phase, which is why the jump can be done properly here:
378
382
  // `jump` is the wind-up, and the loop and landing are addressable.
379
383
  { name: 'jump', animation: 'Jump_Start', loop: false },
@@ -481,6 +485,8 @@ export class B3dBiped extends B3dControllable {
481
485
  cameraType: 'none',
482
486
  animation: '',
483
487
  animationSpeed: 1,
488
+ // Seconds every animation change eases over (see `_ease`).
489
+ blendSeconds: 0.25,
484
490
  initialState: 'idle',
485
491
  turnSpeed: 180,
486
492
  forwardSpeed: 2,
@@ -818,10 +824,10 @@ export class B3dBiped extends B3dControllable {
818
824
  look pitch is whatever it was left at: walking around looking at the
819
825
  ground, or the last dive, so the gun came up pointing at your feet. Tonio:
820
826
  "It seems quite common for it to be aiming at your feet which is weird."
821
- Levelled only on the way UP (lowering it leaves the view alone) and only
822
- flat: in a headset the aim is the controller.
827
+ Levelled only on the way UP (lowering it leaves the view alone), and in a
828
+ headset too: there the right stick still sets the look pitch the aim reads.
823
829
  */
824
- if (on && !this.gunplay && !this.owner?.xrActive)
830
+ if (on && !this.gunplay)
825
831
  this._lookPitch = 0;
826
832
  this.gunplay = on;
827
833
  this._showWeapons(on);
@@ -1269,6 +1275,9 @@ export class B3dBiped extends B3dControllable {
1269
1275
  return (g.to - g.from) / fps / ratio;
1270
1276
  }
1271
1277
  _sneakWas = false;
1278
+ /** The stance-change clip playing (`sneakEnter`/`sneakExit`), and its seconds left. */
1279
+ _stanceClip = '';
1280
+ _stanceLeft = 0;
1272
1281
  /** Zoom 0..1, now integrated from the d-pad rather than read off a stick. */
1273
1282
  _camZoom = 0;
1274
1283
  _waterEl;
@@ -1392,7 +1401,9 @@ export class B3dBiped extends B3dControllable {
1392
1401
  * immediately and merely gets better; it is committed to the cache once the
1393
1402
  * window closes.
1394
1403
  */
1395
- _currentPose(settle = 0.25, window = 2, interval = 0.08) {
1404
+ _currentPose(
1405
+ // Past the blend, so a pose is never measured mid-blend.
1406
+ settle = Math.max(0.25, Number(this.blendSeconds) + 0.1), window = 2, interval = 0.08) {
1396
1407
  const key = this.animationState?.animation ?? this.animationState?.name;
1397
1408
  if (key == null)
1398
1409
  return null;
@@ -1693,12 +1704,45 @@ export class B3dBiped extends B3dControllable {
1693
1704
  const layerGroup = groups.find((g) => g.name.replace(/^Clone of /, '') === layerClip);
1694
1705
  if (layerGroup == null)
1695
1706
  return;
1707
+ this._ease(baseGroup);
1708
+ this._ease(layerGroup);
1696
1709
  baseGroup.stop();
1697
1710
  this._aimLayer = layerOnUpperBody(scene, skeleton, baseGroup, layerGroup);
1698
1711
  this._aimLayer?.play(layerClip !== 'Pistol_Shoot');
1699
1712
  }
1700
1713
  /** Seconds left of the one-shot fire pose. */
1701
1714
  _shootFor = 0;
1715
+ /*
1716
+ EVERY CLIP CHANGE IS EASED, not cut. Babylon's animation blending starts a
1717
+ clip from wherever each bone is now and eases it in, so standing to crouch,
1718
+ walk to run and the gun coming up all move rather than pop. It is set on the
1719
+ ANIMATIONS (an AnimationGroup passes it down), which the upper-body layer's
1720
+ tiers share, so the layer is eased too.
1721
+
1722
+ Babylon's `blendingSpeed` is a step PER FRAME, so a fixed value is slower the
1723
+ slower the frame rate (0.2 took 300 ms at 20 fps). `_paceBlends` resets it
1724
+ from each frame's dt so a blend takes `blendSeconds` at any frame rate.
1725
+ `_currentPose` waits past it, so a pose is not measured mid-blend.
1726
+ */
1727
+ _eased = new Set();
1728
+ _blendStep = 0;
1729
+ _ease(group) {
1730
+ if (group == null || this._eased.has(group))
1731
+ return;
1732
+ this._eased.add(group);
1733
+ group.enableBlending = true;
1734
+ group.blendingSpeed = this._blendStep || 0.2;
1735
+ }
1736
+ _paceBlends(dt) {
1737
+ const seconds = Number(this.blendSeconds);
1738
+ const step = seconds > 0 ? Math.min(1, dt / seconds) : 1;
1739
+ // Only when it moves noticeably: the setter walks every animation.
1740
+ if (Math.abs(step - this._blendStep) < this._blendStep * 0.1)
1741
+ return;
1742
+ this._blendStep = step;
1743
+ for (const group of this._eased)
1744
+ group.blendingSpeed = step;
1745
+ }
1702
1746
  setAnimationState(name, speed = 1) {
1703
1747
  name = this._gunplayState(name);
1704
1748
  if (name == null) {
@@ -1752,6 +1796,7 @@ export class B3dBiped extends B3dControllable {
1752
1796
  }
1753
1797
  }
1754
1798
  const animationGroup = this.entries.animationGroups[idx];
1799
+ this._ease(animationGroup);
1755
1800
  if (newState.backwards) {
1756
1801
  animationGroup.start(loop, speed, animationGroup.to, animationGroup.from, additive);
1757
1802
  }
@@ -1936,8 +1981,23 @@ export class B3dBiped extends B3dControllable {
1936
1981
  const sneakDown = (input.sneak ?? 0) > 0.5;
1937
1982
  if (!this._swimming && sneakDown && !this._sneakWas) {
1938
1983
  this._sneaking = !this._sneaking;
1984
+ /*
1985
+ A TRANSITION CLIP if the states name one (`sneakEnter` / `sneakExit`,
1986
+ none by default); a blend otherwise. Such clips are drawn standing
1987
+ still, so they play only while you are at rest (see the idle branch
1988
+ below); moving, the stance change is the ordinary blend between loops.
1989
+ */
1990
+ const clip = this._sneaking ? 'sneakEnter' : 'sneakExit';
1991
+ this._stanceClip = this.animationStates.some((st) => st.name === clip)
1992
+ ? clip
1993
+ : '';
1994
+ this._stanceLeft = this._stanceClip
1995
+ ? this._clipSeconds(this._stanceClip)
1996
+ : 0;
1939
1997
  }
1940
1998
  this._sneakWas = sneakDown;
1999
+ this._stanceLeft = Math.max(0, this._stanceLeft - dt);
2000
+ this._paceBlends(dt);
1941
2001
  const speed = input.forward;
1942
2002
  /*
1943
2003
  STRAFING IS OPTIONAL, AND OFF BY DEFAULT.
@@ -2911,6 +2971,9 @@ export class B3dBiped extends B3dControllable {
2911
2971
  else if (speed < -0.1) {
2912
2972
  this.setAnimationState('walkBackwards', Math.abs(speed) + 0.25);
2913
2973
  }
2974
+ else if (this._stanceLeft > 0 && Math.abs(rotation) <= 0.1) {
2975
+ this.setAnimationState(this._stanceClip);
2976
+ }
2914
2977
  else if (this._sneaking &&
2915
2978
  this.animationStates.some((st) => st.name === 'sneakIdle')) {
2916
2979
  // A crouch that HOLDS at rest — the stock rig had no such clip, so
@@ -2923,6 +2986,10 @@ export class B3dBiped extends B3dControllable {
2923
2986
  else {
2924
2987
  this.setAnimationState('idle');
2925
2988
  }
2989
+ // Anything else chosen (moving, a jump) ends the transition clip, so
2990
+ // stopping again later does not replay half of it.
2991
+ if (this.animationState?.name !== this._stanceClip)
2992
+ this._stanceLeft = 0;
2926
2993
  }
2927
2994
  }
2928
2995
  setupXRInput(xr) {
@@ -3217,6 +3284,7 @@ export class B3dBiped extends B3dControllable {
3217
3284
  const attrs = this;
3218
3285
  if (attrs.url !== '' && !this.entries) {
3219
3286
  this.loadAssetContainer(scene, attrs.url, (container) => {
3287
+ this._eased.clear();
3220
3288
  this.entries = container.instantiateModelsToScene(undefined, false, {
3221
3289
  doNotInstantiate: true,
3222
3290
  });
@@ -3321,6 +3389,7 @@ export class B3dBiped extends B3dControllable {
3321
3389
  ag.dispose();
3322
3390
  }
3323
3391
  this.entries = undefined;
3392
+ this._eased.clear();
3324
3393
  }
3325
3394
  this.gameController = undefined;
3326
3395
  this.inputProvider = null;