@oyna360/lobby-sdk 0.1.0

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 (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/dist/avatar-accessories.d.ts +16 -0
  4. package/dist/avatar-accessories.d.ts.map +1 -0
  5. package/dist/avatar-accessories.js +214 -0
  6. package/dist/avatar-accessories.js.map +1 -0
  7. package/dist/avatar-asset-manager.d.ts +54 -0
  8. package/dist/avatar-asset-manager.d.ts.map +1 -0
  9. package/dist/avatar-asset-manager.js +215 -0
  10. package/dist/avatar-asset-manager.js.map +1 -0
  11. package/dist/avatar-clips.d.ts +17 -0
  12. package/dist/avatar-clips.d.ts.map +1 -0
  13. package/dist/avatar-clips.js +47 -0
  14. package/dist/avatar-clips.js.map +1 -0
  15. package/dist/avatar-config.d.ts +4 -0
  16. package/dist/avatar-config.d.ts.map +1 -0
  17. package/dist/avatar-config.js +9 -0
  18. package/dist/avatar-config.js.map +1 -0
  19. package/dist/avatar-factory.d.ts +64 -0
  20. package/dist/avatar-factory.d.ts.map +1 -0
  21. package/dist/avatar-factory.js +464 -0
  22. package/dist/avatar-factory.js.map +1 -0
  23. package/dist/avatar-instance.d.ts +31 -0
  24. package/dist/avatar-instance.d.ts.map +1 -0
  25. package/dist/avatar-instance.js +56 -0
  26. package/dist/avatar-instance.js.map +1 -0
  27. package/dist/avatar-material-pipeline.d.ts +34 -0
  28. package/dist/avatar-material-pipeline.d.ts.map +1 -0
  29. package/dist/avatar-material-pipeline.js +580 -0
  30. package/dist/avatar-material-pipeline.js.map +1 -0
  31. package/dist/avatar-rig-builder.d.ts +74 -0
  32. package/dist/avatar-rig-builder.d.ts.map +1 -0
  33. package/dist/avatar-rig-builder.js +347 -0
  34. package/dist/avatar-rig-builder.js.map +1 -0
  35. package/dist/draco.d.ts +7 -0
  36. package/dist/draco.d.ts.map +1 -0
  37. package/dist/draco.js +82 -0
  38. package/dist/draco.js.map +1 -0
  39. package/dist/humanoid-animator.d.ts +35 -0
  40. package/dist/humanoid-animator.d.ts.map +1 -0
  41. package/dist/humanoid-animator.js +191 -0
  42. package/dist/humanoid-animator.js.map +1 -0
  43. package/dist/humanoid-bone-names.d.ts +35 -0
  44. package/dist/humanoid-bone-names.d.ts.map +1 -0
  45. package/dist/humanoid-bone-names.js +126 -0
  46. package/dist/humanoid-bone-names.js.map +1 -0
  47. package/dist/humanoid-locomotion.d.ts +101 -0
  48. package/dist/humanoid-locomotion.d.ts.map +1 -0
  49. package/dist/humanoid-locomotion.js +300 -0
  50. package/dist/humanoid-locomotion.js.map +1 -0
  51. package/dist/humanoid-rig.d.ts +51 -0
  52. package/dist/humanoid-rig.d.ts.map +1 -0
  53. package/dist/humanoid-rig.js +304 -0
  54. package/dist/humanoid-rig.js.map +1 -0
  55. package/dist/index.d.ts +60 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +42 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/lobby-chat-ui.d.ts +3 -0
  60. package/dist/lobby-chat-ui.d.ts.map +1 -0
  61. package/dist/lobby-chat-ui.js +258 -0
  62. package/dist/lobby-chat-ui.js.map +1 -0
  63. package/dist/lobby-colliders.d.ts +10 -0
  64. package/dist/lobby-colliders.d.ts.map +1 -0
  65. package/dist/lobby-colliders.js +225 -0
  66. package/dist/lobby-colliders.js.map +1 -0
  67. package/dist/lobby-connection-ui.d.ts +8 -0
  68. package/dist/lobby-connection-ui.d.ts.map +1 -0
  69. package/dist/lobby-connection-ui.js +68 -0
  70. package/dist/lobby-connection-ui.js.map +1 -0
  71. package/dist/lobby-debug.d.ts +50 -0
  72. package/dist/lobby-debug.d.ts.map +1 -0
  73. package/dist/lobby-debug.js +132 -0
  74. package/dist/lobby-debug.js.map +1 -0
  75. package/dist/lobby-font.d.ts +5 -0
  76. package/dist/lobby-font.d.ts.map +1 -0
  77. package/dist/lobby-font.js +35 -0
  78. package/dist/lobby-font.js.map +1 -0
  79. package/dist/lobby-music.d.ts +40 -0
  80. package/dist/lobby-music.d.ts.map +1 -0
  81. package/dist/lobby-music.js +250 -0
  82. package/dist/lobby-music.js.map +1 -0
  83. package/dist/lobby-orientation-ui.d.ts +10 -0
  84. package/dist/lobby-orientation-ui.d.ts.map +1 -0
  85. package/dist/lobby-orientation-ui.js +64 -0
  86. package/dist/lobby-orientation-ui.js.map +1 -0
  87. package/dist/lobby-perf-diag.d.ts +254 -0
  88. package/dist/lobby-perf-diag.d.ts.map +1 -0
  89. package/dist/lobby-perf-diag.js +775 -0
  90. package/dist/lobby-perf-diag.js.map +1 -0
  91. package/dist/lobby-plaza-diag.d.ts +103 -0
  92. package/dist/lobby-plaza-diag.d.ts.map +1 -0
  93. package/dist/lobby-plaza-diag.js +534 -0
  94. package/dist/lobby-plaza-diag.js.map +1 -0
  95. package/dist/lobby-presence-ui.d.ts +4 -0
  96. package/dist/lobby-presence-ui.d.ts.map +1 -0
  97. package/dist/lobby-presence-ui.js +89 -0
  98. package/dist/lobby-presence-ui.js.map +1 -0
  99. package/dist/lobby-real-device-diag.d.ts +119 -0
  100. package/dist/lobby-real-device-diag.d.ts.map +1 -0
  101. package/dist/lobby-real-device-diag.js +468 -0
  102. package/dist/lobby-real-device-diag.js.map +1 -0
  103. package/dist/lobby-spawn.d.ts +15 -0
  104. package/dist/lobby-spawn.d.ts.map +1 -0
  105. package/dist/lobby-spawn.js +18 -0
  106. package/dist/lobby-spawn.js.map +1 -0
  107. package/dist/lobby-ui-i18n.d.ts +11 -0
  108. package/dist/lobby-ui-i18n.d.ts.map +1 -0
  109. package/dist/lobby-ui-i18n.js +21 -0
  110. package/dist/lobby-ui-i18n.js.map +1 -0
  111. package/dist/lobby-voice-ui.d.ts +3 -0
  112. package/dist/lobby-voice-ui.d.ts.map +1 -0
  113. package/dist/lobby-voice-ui.js +105 -0
  114. package/dist/lobby-voice-ui.js.map +1 -0
  115. package/dist/local-player-controller.d.ts +80 -0
  116. package/dist/local-player-controller.d.ts.map +1 -0
  117. package/dist/local-player-controller.js +422 -0
  118. package/dist/local-player-controller.js.map +1 -0
  119. package/dist/name-tag.d.ts +3 -0
  120. package/dist/name-tag.d.ts.map +1 -0
  121. package/dist/name-tag.js +59 -0
  122. package/dist/name-tag.js.map +1 -0
  123. package/dist/network-client.d.ts +87 -0
  124. package/dist/network-client.d.ts.map +1 -0
  125. package/dist/network-client.js +182 -0
  126. package/dist/network-client.js.map +1 -0
  127. package/dist/platform-bridge.d.ts +17 -0
  128. package/dist/platform-bridge.d.ts.map +1 -0
  129. package/dist/platform-bridge.js +90 -0
  130. package/dist/platform-bridge.js.map +1 -0
  131. package/dist/platform-lobby.d.ts +176 -0
  132. package/dist/platform-lobby.d.ts.map +1 -0
  133. package/dist/platform-lobby.js +679 -0
  134. package/dist/platform-lobby.js.map +1 -0
  135. package/dist/platform-types.d.ts +56 -0
  136. package/dist/platform-types.d.ts.map +1 -0
  137. package/dist/platform-types.js +3 -0
  138. package/dist/platform-types.js.map +1 -0
  139. package/dist/player-label.d.ts +9 -0
  140. package/dist/player-label.d.ts.map +1 -0
  141. package/dist/player-label.js +14 -0
  142. package/dist/player-label.js.map +1 -0
  143. package/dist/playground/playground-layout.d.ts +14 -0
  144. package/dist/playground/playground-layout.d.ts.map +1 -0
  145. package/dist/playground/playground-layout.js +320 -0
  146. package/dist/playground/playground-layout.js.map +1 -0
  147. package/dist/playground/playground-system.d.ts +30 -0
  148. package/dist/playground/playground-system.d.ts.map +1 -0
  149. package/dist/playground/playground-system.js +202 -0
  150. package/dist/playground/playground-system.js.map +1 -0
  151. package/dist/plaza-layout.d.ts +30 -0
  152. package/dist/plaza-layout.d.ts.map +1 -0
  153. package/dist/plaza-layout.js +527 -0
  154. package/dist/plaza-layout.js.map +1 -0
  155. package/dist/plugins.d.ts +5 -0
  156. package/dist/plugins.d.ts.map +1 -0
  157. package/dist/plugins.js +26 -0
  158. package/dist/plugins.js.map +1 -0
  159. package/dist/protocol.d.ts +276 -0
  160. package/dist/protocol.d.ts.map +1 -0
  161. package/dist/protocol.js +107 -0
  162. package/dist/protocol.js.map +1 -0
  163. package/dist/quality.d.ts +39 -0
  164. package/dist/quality.d.ts.map +1 -0
  165. package/dist/quality.js +95 -0
  166. package/dist/quality.js.map +1 -0
  167. package/dist/remote-player-manager.d.ts +48 -0
  168. package/dist/remote-player-manager.d.ts.map +1 -0
  169. package/dist/remote-player-manager.js +339 -0
  170. package/dist/remote-player-manager.js.map +1 -0
  171. package/dist/scene-manager.d.ts +26 -0
  172. package/dist/scene-manager.d.ts.map +1 -0
  173. package/dist/scene-manager.js +169 -0
  174. package/dist/scene-manager.js.map +1 -0
  175. package/dist/spawn-utils.d.ts +8 -0
  176. package/dist/spawn-utils.d.ts.map +1 -0
  177. package/dist/spawn-utils.js +29 -0
  178. package/dist/spawn-utils.js.map +1 -0
  179. package/dist/starter-layout.d.ts +17 -0
  180. package/dist/starter-layout.d.ts.map +1 -0
  181. package/dist/starter-layout.js +102 -0
  182. package/dist/starter-layout.js.map +1 -0
  183. package/dist/third-person-camera.d.ts +35 -0
  184. package/dist/third-person-camera.d.ts.map +1 -0
  185. package/dist/third-person-camera.js +181 -0
  186. package/dist/third-person-camera.js.map +1 -0
  187. package/dist/types.d.ts +164 -0
  188. package/dist/types.d.ts.map +1 -0
  189. package/dist/types.js +2 -0
  190. package/dist/types.js.map +1 -0
  191. package/dist/voice-chat.d.ts +78 -0
  192. package/dist/voice-chat.d.ts.map +1 -0
  193. package/dist/voice-chat.js +321 -0
  194. package/dist/voice-chat.js.map +1 -0
  195. package/dist/yield-to-render.d.ts +3 -0
  196. package/dist/yield-to-render.d.ts.map +1 -0
  197. package/dist/yield-to-render.js +11 -0
  198. package/dist/yield-to-render.js.map +1 -0
  199. package/dist/zones.d.ts +36 -0
  200. package/dist/zones.d.ts.map +1 -0
  201. package/dist/zones.js +68 -0
  202. package/dist/zones.js.map +1 -0
  203. package/docs/00-overview.md +47 -0
  204. package/docs/01-connect.md +85 -0
  205. package/docs/02-github.md +43 -0
  206. package/docs/03-modes.md +70 -0
  207. package/docs/04-api.md +106 -0
  208. package/docs/05-features.md +55 -0
  209. package/docs/06-controls.md +34 -0
  210. package/docs/07-troubleshooting.md +39 -0
  211. package/package.json +65 -0
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Phase-4: Skeleton / bone / humanoid-rig construction for lobby avatars.
3
+ * Does not own animation, materials, GLB loading, or remote lifecycle.
4
+ */
5
+ import { Mesh, Scene, Skeleton, TransformNode, Vector3 as BVector3 } from '@babylonjs/core';
6
+ import type { AbstractMesh, AnimationGroup } from '@babylonjs/core';
7
+ import { type HumanoidBoneRig } from './humanoid-rig';
8
+ export interface AvatarRig {
9
+ /** Movable node (collider if present, otherwise visual root). */
10
+ root: TransformNode;
11
+ visual: TransformNode;
12
+ collider: Mesh | null;
13
+ torso: TransformNode;
14
+ head: TransformNode;
15
+ armL: TransformNode;
16
+ armR: TransformNode;
17
+ legL: TransformNode;
18
+ legR: TransformNode;
19
+ /** Skinned GLB: pivots are skeleton bones — only rotate, never rewrite bind positions. */
20
+ boneDriven?: boolean;
21
+ /** Full humanoid bone map (spine, knees, elbows…) when the GLB skeleton allows it. */
22
+ humanoid?: HumanoidBoneRig;
23
+ restRotation?: {
24
+ torso: BVector3;
25
+ head: BVector3;
26
+ armL: BVector3;
27
+ armR: BVector3;
28
+ legL: BVector3;
29
+ legR: BVector3;
30
+ };
31
+ }
32
+ export type LimbRigPivots = Omit<AvatarRig, 'root' | 'visual' | 'collider'>;
33
+ export interface PrepareGlbSkeletonInput {
34
+ scene: Scene;
35
+ name: string;
36
+ glbUrl: string;
37
+ model: TransformNode;
38
+ importRoot: AbstractMesh | TransformNode | undefined;
39
+ rootScaleZ: number;
40
+ meshes: AbstractMesh[];
41
+ transformNodes: TransformNode[];
42
+ skeletons: Skeleton[];
43
+ animationGroups: AnimationGroup[];
44
+ }
45
+ export interface PrepareGlbSkeletonResult {
46
+ clips: AnimationGroup[];
47
+ displayMeshes: AbstractMesh[];
48
+ rigidGlb: boolean;
49
+ boneDriven: boolean;
50
+ limbRig: LimbRigPivots | null;
51
+ /** Unmodified groups from instantiate (for sourceClips metadata). */
52
+ originalAnimationGroups: AnimationGroup[];
53
+ skeletons: Skeleton[];
54
+ transformNodes: TransformNode[];
55
+ }
56
+ /** Facade over skeleton / humanoid-rig helpers. */
57
+ export declare class AvatarRigBuilder {
58
+ static prepareGlbSkeleton(input: PrepareGlbSkeletonInput): PrepareGlbSkeletonResult;
59
+ static padSkinnedBounds(meshes: AbstractMesh[]): void;
60
+ static preferBoneTexture(skeletons: Skeleton[]): void;
61
+ static bindSkeletonRig(skeletons: Skeleton[], transformNodes: TransformNode[]): LimbRigPivots | null;
62
+ static buildHumanoidAfterFit(visual: TransformNode, skeletons: Skeleton[], transformNodes: TransformNode[], boneDriven: boolean): HumanoidBoneRig | undefined;
63
+ static resolveLimbPivots(scene: Scene, name: string, visual: TransformNode, limbRig: LimbRigPivots | null): Pick<AvatarRig, 'torso' | 'head' | 'armL' | 'armR' | 'legL' | 'legR'>;
64
+ /**
65
+ * Read the already-built rig from an AvatarInstance / root (creation-time only;
66
+ * never call from the animation/render loop).
67
+ * Accepts AvatarInstance-shaped objects without importing AvatarInstance (avoids cycles).
68
+ */
69
+ static build(instance: {
70
+ readonly root: TransformNode;
71
+ readonly rig?: AvatarRig | null;
72
+ }): AvatarRig | null;
73
+ }
74
+ //# sourceMappingURL=avatar-rig-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar-rig-builder.d.ts","sourceRoot":"","sources":["../src/avatar-rig-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,347 @@
1
+ /**
2
+ * Phase-4: Skeleton / bone / humanoid-rig construction for lobby avatars.
3
+ * Does not own animation, materials, GLB loading, or remote lifecycle.
4
+ */
5
+ import { BoundingInfo, Mesh, TransformNode, VertexBuffer, VertexData, } from '@babylonjs/core';
6
+ import { buildHumanoidBoneRig } from './humanoid-rig';
7
+ import { isLobbyPerfDiagEnabled, lobbyPerfMark } from './lobby-perf-diag';
8
+ /**
9
+ * Copy bind-pose geometry into a new non-skinned mesh.
10
+ * Needed when Tripo/etc skeletons collapse in Babylon and GPU skinning explodes or hides the mesh.
11
+ */
12
+ function bakeRigidFromImport(scene, sourceMeshes, parent, name) {
13
+ const baked = [];
14
+ for (const src of sourceMeshes) {
15
+ if (!(src instanceof Mesh))
16
+ continue;
17
+ const positions = src.getVerticesData(VertexBuffer.PositionKind);
18
+ if (!positions || positions.length < 9)
19
+ continue;
20
+ const indices = src.getIndices();
21
+ if (!indices || indices.length < 3)
22
+ continue;
23
+ const mesh = new Mesh(`${name}-${src.name || 'geo'}-rigid`, scene);
24
+ const vd = new VertexData();
25
+ vd.positions = Array.from(positions);
26
+ vd.indices = Array.from(indices);
27
+ const normals = src.getVerticesData(VertexBuffer.NormalKind);
28
+ if (normals && normals.length === positions.length) {
29
+ vd.normals = Array.from(normals);
30
+ }
31
+ else {
32
+ const nrm = [];
33
+ VertexData.ComputeNormals(vd.positions, vd.indices, nrm);
34
+ vd.normals = nrm;
35
+ }
36
+ const uvs = src.getVerticesData(VertexBuffer.UVKind);
37
+ if (uvs)
38
+ vd.uvs = Array.from(uvs);
39
+ vd.applyToMesh(mesh);
40
+ mesh.material = src.material;
41
+ mesh.parent = parent;
42
+ mesh.isPickable = false;
43
+ mesh.checkCollisions = false;
44
+ mesh.receiveShadows = false;
45
+ baked.push(mesh);
46
+ src.setEnabled(false);
47
+ src.isVisible = false;
48
+ src.skeleton = null;
49
+ src.numBoneInfluencers = 0;
50
+ }
51
+ return baked;
52
+ }
53
+ function padSkinnedBounds(meshes) {
54
+ for (const mesh of meshes) {
55
+ if (!(mesh instanceof Mesh) || !mesh.skeleton)
56
+ continue;
57
+ try {
58
+ mesh.refreshBoundingInfo(true, true);
59
+ const bi = mesh.getBoundingInfo();
60
+ const min = bi.minimum.clone();
61
+ const max = bi.maximum.clone();
62
+ const pad = 0.45;
63
+ min.x -= pad;
64
+ min.y -= pad;
65
+ min.z -= pad;
66
+ max.x += pad;
67
+ max.y += pad;
68
+ max.z += pad;
69
+ mesh.setBoundingInfo(new BoundingInfo(min, max));
70
+ }
71
+ catch {
72
+ // ignore
73
+ }
74
+ }
75
+ }
76
+ /** Keep bone matrices in a texture so skinning does not burn vertex uniform slots. */
77
+ function preferBoneTexture(skeletons) {
78
+ for (const sk of skeletons) {
79
+ try {
80
+ sk.useTextureToStoreBoneMatrices = true;
81
+ }
82
+ catch {
83
+ // ignore
84
+ }
85
+ }
86
+ }
87
+ function emptyPivot(scene, name, parent, y) {
88
+ const n = new TransformNode(name, scene);
89
+ n.parent = parent;
90
+ n.position.y = y;
91
+ return n;
92
+ }
93
+ function collectNamedTransforms(skeletons, transformNodes) {
94
+ const allowed = new Set();
95
+ for (const tn of transformNodes) {
96
+ let p = tn;
97
+ while (p) {
98
+ allowed.add(p.uniqueId);
99
+ p = p.parent;
100
+ }
101
+ const stack = [tn];
102
+ while (stack.length) {
103
+ const n = stack.pop();
104
+ allowed.add(n.uniqueId);
105
+ for (const child of n.getChildren()) {
106
+ if (child instanceof TransformNode)
107
+ stack.push(child);
108
+ }
109
+ }
110
+ }
111
+ const out = [];
112
+ for (const sk of skeletons) {
113
+ for (const bone of sk.bones) {
114
+ const tn = bone.getTransformNode?.() ?? null;
115
+ if (tn && allowed.has(tn.uniqueId))
116
+ out.push({ name: bone.name, node: tn });
117
+ }
118
+ }
119
+ for (const tn of transformNodes) {
120
+ out.push({ name: tn.name, node: tn });
121
+ }
122
+ return out;
123
+ }
124
+ function stripCloneSuffix(name) {
125
+ return (name ?? '').replace(/__a\d+$/, '');
126
+ }
127
+ function resolveNamedTransform(named, candidates) {
128
+ for (const candidate of candidates) {
129
+ const want = candidate.toLowerCase();
130
+ const exact = named.find((n) => stripCloneSuffix(n.name).toLowerCase() === want);
131
+ if (exact)
132
+ return exact.node;
133
+ }
134
+ for (const candidate of candidates) {
135
+ const want = candidate.toLowerCase();
136
+ const soft = named.find((n) => stripCloneSuffix(n.name).toLowerCase().includes(want));
137
+ if (soft)
138
+ return soft.node;
139
+ }
140
+ return null;
141
+ }
142
+ function captureRestEuler(node) {
143
+ if (node.rotationQuaternion) {
144
+ return node.rotationQuaternion.toEulerAngles();
145
+ }
146
+ return node.rotation.clone();
147
+ }
148
+ /** Bind Tripo / Mixamo-style skeleton bones to AvatarRig limb pivots. */
149
+ function bindSkeletonRig(skeletons, transformNodes) {
150
+ if (!skeletons.length)
151
+ return null;
152
+ const named = collectNamedTransforms(skeletons, transformNodes);
153
+ const torso = resolveNamedTransform(named, ['Spine01', 'Spine02', 'Waist', 'spine', 'Spine']);
154
+ const head = resolveNamedTransform(named, ['Head', 'head']);
155
+ const armL = resolveNamedTransform(named, ['L_UpperarmTwist01', 'L_Upperarm', 'LeftArm', 'Left_UpperArm', 'mixamorig:LeftArm']);
156
+ const armR = resolveNamedTransform(named, ['R_UpperarmTwist01', 'R_Upperarm', 'RightArm', 'Right_UpperArm', 'mixamorig:RightArm']);
157
+ const legL = resolveNamedTransform(named, ['L_ThighTwist01', 'L_Thigh', 'LeftUpLeg', 'Left_Thigh', 'mixamorig:LeftUpLeg']);
158
+ const legR = resolveNamedTransform(named, ['R_ThighTwist01', 'R_Thigh', 'RightUpLeg', 'Right_Thigh', 'mixamorig:RightUpLeg']);
159
+ if (!torso || !head || !armL || !armR || !legL || !legR) {
160
+ console.warn('[lobby-sdk] skinned GLB missing expected bones', {
161
+ torso: !!torso,
162
+ head: !!head,
163
+ armL: !!armL,
164
+ armR: !!armR,
165
+ legL: !!legL,
166
+ legR: !!legR,
167
+ available: [...new Set(named.map((n) => n.name))],
168
+ });
169
+ return null;
170
+ }
171
+ const restRotation = {
172
+ torso: captureRestEuler(torso),
173
+ head: captureRestEuler(head),
174
+ armL: captureRestEuler(armL),
175
+ armR: captureRestEuler(armR),
176
+ legL: captureRestEuler(legL),
177
+ legR: captureRestEuler(legR),
178
+ };
179
+ return { torso, head, armL, armR, legL, legR, boneDriven: true, restRotation };
180
+ }
181
+ /**
182
+ * Stop baked clips, bind limb pivots, prefer bone texture, or bake rigid when skin is unusable.
183
+ * Logic is identical to the former AvatarFactory.createFromGlb skeleton block.
184
+ */
185
+ function prepareGlbSkeleton(input) {
186
+ const { scene, name, glbUrl, model, importRoot, rootScaleZ, meshes, transformNodes, skeletons, animationGroups, } = input;
187
+ const hasSkeleton = skeletons.length > 0 || meshes.some((m) => !!m.skeleton);
188
+ let clips = animationGroups;
189
+ let displayMeshes = meshes;
190
+ let rigidGlb = false;
191
+ let boneDriven = false;
192
+ let limbRig = null;
193
+ // Prefer procedural bone control for lobby locomotion.
194
+ // Baked Meshy clips often have no Idle — frame 0 of Walking is mid-stride,
195
+ // so "stopped" clip still looks like walking. Bone pivots match procedural humanoid.
196
+ if (hasSkeleton) {
197
+ for (const g of clips) {
198
+ try {
199
+ g.stop();
200
+ g.reset();
201
+ g.setWeightForAllAnimatables?.(0);
202
+ }
203
+ catch {
204
+ // ignore
205
+ }
206
+ }
207
+ for (const sk of skeletons) {
208
+ try {
209
+ sk.returnToRest();
210
+ }
211
+ catch {
212
+ // ignore
213
+ }
214
+ }
215
+ limbRig = bindSkeletonRig(skeletons, transformNodes);
216
+ if (limbRig) {
217
+ if (importRoot)
218
+ importRoot.parent = model;
219
+ preferBoneTexture(skeletons);
220
+ for (const mesh of displayMeshes) {
221
+ if (mesh.skeleton)
222
+ mesh.numBoneInfluencers = Math.min(mesh.numBoneInfluencers || 4, 4);
223
+ }
224
+ boneDriven = true;
225
+ // Keep source clips for later emotes; do not feed them to HumanoidAnimator.
226
+ clips = [];
227
+ }
228
+ else {
229
+ preferBoneTexture(skeletons);
230
+ }
231
+ }
232
+ if (hasSkeleton && !boneDriven) {
233
+ // Last resort for broken Tripo-style skins with no usable bones.
234
+ const baked = bakeRigidFromImport(scene, meshes, model, name);
235
+ if (baked.length) {
236
+ displayMeshes = baked;
237
+ rigidGlb = true;
238
+ if (rootScaleZ < 0) {
239
+ model.scaling.z = -Math.abs(model.scaling.z || 1);
240
+ }
241
+ if (importRoot) {
242
+ importRoot.setEnabled(false);
243
+ if ('isVisible' in importRoot) {
244
+ importRoot.isVisible = false;
245
+ }
246
+ }
247
+ for (const sk of skeletons) {
248
+ try {
249
+ sk.dispose?.();
250
+ }
251
+ catch {
252
+ // ignore
253
+ }
254
+ }
255
+ for (const g of animationGroups) {
256
+ try {
257
+ g.dispose?.();
258
+ }
259
+ catch {
260
+ // ignore
261
+ }
262
+ }
263
+ console.warn('[lobby-sdk] GLB skin baked to rigid mesh (skeleton unusable)', {
264
+ glbUrl,
265
+ skeletons: skeletons.length,
266
+ baked: baked.length,
267
+ });
268
+ }
269
+ else if (importRoot) {
270
+ importRoot.parent = model;
271
+ }
272
+ }
273
+ else if (!hasSkeleton && importRoot) {
274
+ importRoot.parent = model;
275
+ rigidGlb = true;
276
+ }
277
+ return {
278
+ clips,
279
+ displayMeshes,
280
+ rigidGlb,
281
+ boneDriven,
282
+ limbRig,
283
+ originalAnimationGroups: animationGroups,
284
+ skeletons,
285
+ transformNodes,
286
+ };
287
+ }
288
+ function resolveLimbPivots(scene, name, visual, limbRig) {
289
+ const torso = limbRig?.torso ?? emptyPivot(scene, `${name}-torso`, visual, 1.18);
290
+ const head = limbRig?.head ?? emptyPivot(scene, `${name}-head-pivot`, visual, 1.78);
291
+ const armL = limbRig?.armL ?? emptyPivot(scene, `${name}-arm-l`, visual, 1.48);
292
+ if (!limbRig)
293
+ armL.position.x = -0.5;
294
+ const armR = limbRig?.armR ?? emptyPivot(scene, `${name}-arm-r`, visual, 1.48);
295
+ if (!limbRig)
296
+ armR.position.x = 0.5;
297
+ const legL = limbRig?.legL ?? emptyPivot(scene, `${name}-leg-l`, visual, 0.9);
298
+ if (!limbRig)
299
+ legL.position.x = -0.18;
300
+ const legR = limbRig?.legR ?? emptyPivot(scene, `${name}-leg-r`, visual, 0.9);
301
+ if (!limbRig)
302
+ legR.position.x = 0.18;
303
+ return { torso, head, armL, armR, legL, legR };
304
+ }
305
+ function buildHumanoidAfterFit(visual, skeletons, transformNodes, boneDriven) {
306
+ // Built after fitting so the sampled bone axes match the final transforms.
307
+ const tRig = performance.now();
308
+ const humanoid = boneDriven
309
+ ? buildHumanoidBoneRig(visual, skeletons, transformNodes) ?? undefined
310
+ : undefined;
311
+ if (isLobbyPerfDiagEnabled() && boneDriven) {
312
+ lobbyPerfMark('humanoid_bind', performance.now() - tRig);
313
+ }
314
+ return humanoid;
315
+ }
316
+ /** Facade over skeleton / humanoid-rig helpers. */
317
+ export class AvatarRigBuilder {
318
+ static prepareGlbSkeleton(input) {
319
+ return prepareGlbSkeleton(input);
320
+ }
321
+ static padSkinnedBounds(meshes) {
322
+ padSkinnedBounds(meshes);
323
+ }
324
+ static preferBoneTexture(skeletons) {
325
+ preferBoneTexture(skeletons);
326
+ }
327
+ static bindSkeletonRig(skeletons, transformNodes) {
328
+ return bindSkeletonRig(skeletons, transformNodes);
329
+ }
330
+ static buildHumanoidAfterFit(visual, skeletons, transformNodes, boneDriven) {
331
+ return buildHumanoidAfterFit(visual, skeletons, transformNodes, boneDriven);
332
+ }
333
+ static resolveLimbPivots(scene, name, visual, limbRig) {
334
+ return resolveLimbPivots(scene, name, visual, limbRig);
335
+ }
336
+ /**
337
+ * Read the already-built rig from an AvatarInstance / root (creation-time only;
338
+ * never call from the animation/render loop).
339
+ * Accepts AvatarInstance-shaped objects without importing AvatarInstance (avoids cycles).
340
+ */
341
+ static build(instance) {
342
+ if (instance.rig !== undefined)
343
+ return instance.rig;
344
+ return instance.root.metadata?.rig ?? null;
345
+ }
346
+ }
347
+ //# sourceMappingURL=avatar-rig-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar-rig-builder.js","sourceRoot":"","sources":["../src/avatar-rig-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Draco WASM must not load from cdn.babylonjs.com — that stalls the first
3
+ * avatar (often 10s+ or forever on filtered networks). Fetch from the platform
4
+ * origin, then wrap as blob URLs so the decoder worker is same-origin.
5
+ */
6
+ export declare function ensureDracoDecoder(): Promise<void>;
7
+ //# sourceMappingURL=draco.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draco.d.ts","sourceRoot":"","sources":["../src/draco.ts"],"names":[],"mappings":"AAmCA;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD"}
package/dist/draco.js ADDED
@@ -0,0 +1,82 @@
1
+ import { DracoCompression } from '@babylonjs/core';
2
+ import { isTouchDevice } from './quality';
3
+ const DECODER_DIR = '/vendor/draco';
4
+ function candidateOrigins() {
5
+ if (typeof window === 'undefined')
6
+ return [];
7
+ const origins = [];
8
+ try {
9
+ const ancestors = location.ancestorOrigins;
10
+ if (ancestors?.length) {
11
+ for (let i = 0; i < ancestors.length; i++)
12
+ origins.push(ancestors[i]);
13
+ }
14
+ }
15
+ catch {
16
+ /* ignore */
17
+ }
18
+ try {
19
+ const ref = document.referrer ? new URL(document.referrer).origin : '';
20
+ if (ref)
21
+ origins.push(ref);
22
+ }
23
+ catch {
24
+ /* ignore */
25
+ }
26
+ origins.push(window.location.origin);
27
+ return [...new Set(origins.filter(Boolean))];
28
+ }
29
+ async function blobUrl(url, mime) {
30
+ const res = await fetch(url, { mode: 'cors', credentials: 'omit' });
31
+ if (!res.ok)
32
+ throw new Error(`draco ${res.status} ${url}`);
33
+ const buf = await res.arrayBuffer();
34
+ return URL.createObjectURL(new Blob([buf], { type: mime }));
35
+ }
36
+ let pending = null;
37
+ /**
38
+ * Draco WASM must not load from cdn.babylonjs.com — that stalls the first
39
+ * avatar (often 10s+ or forever on filtered networks). Fetch from the platform
40
+ * origin, then wrap as blob URLs so the decoder worker is same-origin.
41
+ */
42
+ export function ensureDracoDecoder() {
43
+ if (!pending)
44
+ pending = installDracoDecoder();
45
+ return pending;
46
+ }
47
+ async function installDracoDecoder() {
48
+ if (typeof window === 'undefined')
49
+ return;
50
+ DracoCompression.DefaultNumWorkers = isTouchDevice() ? 0 : 1;
51
+ let lastError;
52
+ for (const origin of candidateOrigins()) {
53
+ const dir = `${origin}${DECODER_DIR}`;
54
+ try {
55
+ const wasmUrl = await blobUrl(`${dir}/draco_wasm_wrapper_gltf.js`, 'text/javascript');
56
+ const wasmBinaryUrl = await blobUrl(`${dir}/draco_decoder_gltf.wasm`, 'application/wasm');
57
+ let fallbackUrl;
58
+ try {
59
+ fallbackUrl = await blobUrl(`${dir}/draco_decoder_gltf.js`, 'text/javascript');
60
+ }
61
+ catch {
62
+ fallbackUrl = undefined;
63
+ }
64
+ DracoCompression.Configuration = {
65
+ decoder: { wasmUrl, wasmBinaryUrl, fallbackUrl },
66
+ };
67
+ return;
68
+ }
69
+ catch (err) {
70
+ lastError = err;
71
+ }
72
+ }
73
+ // Fail closed: never fall back to the Babylon CDN (hangs the lobby).
74
+ DracoCompression.Configuration = {
75
+ decoder: {
76
+ wasmUrl: '',
77
+ wasmBinaryUrl: '',
78
+ },
79
+ };
80
+ console.warn('[lobby-sdk] local Draco decoder missing; compressed GLBs will fail fast', lastError);
81
+ }
82
+ //# sourceMappingURL=draco.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draco.js","sourceRoot":"","sources":["../src/draco.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { AnimationGroup } from '@babylonjs/core';
2
+ import type { LobbyAnimationState } from './protocol';
3
+ import type { AvatarInstance } from './avatar-instance';
4
+ export declare class HumanoidAnimator {
5
+ private avatar;
6
+ private time;
7
+ private phase;
8
+ private walkWeight;
9
+ private runWeight;
10
+ private airWeight;
11
+ private slideWeight;
12
+ private speed;
13
+ private pendingContacts;
14
+ private clipStepAcc;
15
+ private slideMode;
16
+ private walkSpeedRef;
17
+ private runSpeedRef;
18
+ private readonly pose;
19
+ private readonly gait;
20
+ private groups;
21
+ private activeClip;
22
+ constructor(avatar: AvatarInstance, animationGroups?: AnimationGroup[]);
23
+ setSlideMode(on: boolean): void;
24
+ /** Lets cadence be normalised against the lobby's configured move speeds. */
25
+ setSpeedReference(walkSpeed: number, runSpeed: number): void;
26
+ /**
27
+ * @param speed horizontal speed in units/s; drives stride cadence so the feet
28
+ * cannot scrub the floor. Omit to fall back to nominal speeds.
29
+ */
30
+ update(dt: number, state: LobbyAnimationState, grounded: boolean, speed?: number): void;
31
+ /** True on each visual foot plant (walk / run), for footstep audio. */
32
+ takeFootPlant(state: LobbyAnimationState, dt?: number): boolean;
33
+ private playClip;
34
+ }
35
+ //# sourceMappingURL=humanoid-animator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanoid-animator.d.ts","sourceRoot":"","sources":["../src/humanoid-animator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA8DxD,qBAAa,gBAAgB;IAmBzB,OAAO,CAAC,MAAM;IAlBhB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IACzD,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,UAAU,CAA+B;gBAGvC,MAAM,EAAE,cAAc,EAC9B,eAAe,CAAC,EAAE,cAAc,EAAE;IAMpC,YAAY,CAAC,EAAE,EAAE,OAAO;IAIxB,6EAA6E;IAC7E,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAKrD;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM;IAwEhF,uEAAuE;IACvE,aAAa,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,SAAS;IAsBrD,OAAO,CAAC,QAAQ;CAwBjB"}