@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,580 @@
1
+ import { Color3, Material, Mesh, Texture, } from '@babylonjs/core';
2
+ import { isTouchDevice, shouldTrimAvatarDetailMaps, } from './quality';
3
+ import { assetCacheKey } from './avatar-asset-manager';
4
+ export function readTintFromConfig(config) {
5
+ if (!config)
6
+ return undefined;
7
+ for (const key of ['tintColor', 'bodyColor', 'skinColor']) {
8
+ const v = config[key];
9
+ if (typeof v === 'string' && /^#[0-9a-fA-F]{6}$/.test(v))
10
+ return v;
11
+ }
12
+ return undefined;
13
+ }
14
+ /** Recolor avatar body meshes only — never the nametag billboard. */
15
+ export function applyAvatarTint(root, hex) {
16
+ if (!root)
17
+ return;
18
+ let tint = null;
19
+ if (hex && /^#[0-9a-fA-F]{6}$/.test(hex)) {
20
+ try {
21
+ tint = Color3.FromHexString(hex);
22
+ }
23
+ catch {
24
+ tint = null;
25
+ }
26
+ }
27
+ const preferred = root.metadata?.tintMeshes?.filter(Boolean);
28
+ let meshes = preferred?.length
29
+ ? preferred
30
+ : (() => {
31
+ try {
32
+ return root.getChildMeshes?.(true) ?? [];
33
+ }
34
+ catch {
35
+ return [];
36
+ }
37
+ })();
38
+ meshes = meshes.filter((mesh) => {
39
+ if (!mesh || mesh.name?.includes('nametag'))
40
+ return false;
41
+ const meta = mesh.metadata;
42
+ if (meta?.isNameTag)
43
+ return false;
44
+ const matMeta = mesh.material?.metadata;
45
+ if (matMeta?.isNameTag)
46
+ return false;
47
+ // Nametag uses unlit dynamic texture — skip any unlit billboard text planes.
48
+ const mat = mesh.material;
49
+ if (mat?.disableLighting && mat?.diffuseTexture?.name?.includes('nametag'))
50
+ return false;
51
+ return true;
52
+ });
53
+ const visitMaterial = (mat) => {
54
+ if (!mat)
55
+ return;
56
+ try {
57
+ const anyMat = mat;
58
+ if (anyMat.metadata?.isNameTag)
59
+ return;
60
+ if (anyMat.disableLighting && anyMat.diffuseTexture?.name?.includes('nametag'))
61
+ return;
62
+ if (Array.isArray(anyMat.subMaterials)) {
63
+ for (const sub of anyMat.subMaterials)
64
+ visitMaterial(sub);
65
+ return;
66
+ }
67
+ const meta = (anyMat.metadata ?? {});
68
+ if (anyMat.albedoColor && !meta.baseAlbedo)
69
+ meta.baseAlbedo = anyMat.albedoColor.clone();
70
+ if (anyMat.diffuseColor && !meta.baseDiffuse)
71
+ meta.baseDiffuse = anyMat.diffuseColor.clone();
72
+ if (anyMat.emissiveColor && !meta.baseEmissive)
73
+ meta.baseEmissive = anyMat.emissiveColor.clone();
74
+ if (typeof anyMat.emissiveIntensity === 'number' && meta.baseEmissiveIntensity === undefined) {
75
+ meta.baseEmissiveIntensity = anyMat.emissiveIntensity;
76
+ }
77
+ anyMat.metadata = meta;
78
+ if (tint) {
79
+ // albedoColor multiplies albedoTexture on PBR — this is the real body recolor.
80
+ if (anyMat.albedoColor)
81
+ anyMat.albedoColor.copyFrom(tint);
82
+ else if (anyMat.diffuseColor)
83
+ anyMat.diffuseColor.copyFrom(tint);
84
+ if (anyMat.emissiveColor && !anyMat.disableLighting) {
85
+ anyMat.emissiveColor.copyFrom(tint.scale(0.2));
86
+ if (typeof anyMat.emissiveIntensity === 'number')
87
+ anyMat.emissiveIntensity = 0.25;
88
+ }
89
+ }
90
+ else {
91
+ if (anyMat.albedoColor && meta.baseAlbedo)
92
+ anyMat.albedoColor.copyFrom(meta.baseAlbedo);
93
+ if (anyMat.diffuseColor && meta.baseDiffuse)
94
+ anyMat.diffuseColor.copyFrom(meta.baseDiffuse);
95
+ if (anyMat.emissiveColor && meta.baseEmissive)
96
+ anyMat.emissiveColor.copyFrom(meta.baseEmissive);
97
+ if (typeof anyMat.emissiveIntensity === 'number' && meta.baseEmissiveIntensity !== undefined) {
98
+ anyMat.emissiveIntensity = meta.baseEmissiveIntensity;
99
+ }
100
+ }
101
+ anyMat.markAsDirty?.();
102
+ }
103
+ catch {
104
+ // skip broken materials
105
+ }
106
+ };
107
+ for (const mesh of meshes) {
108
+ visitMaterial(mesh.material);
109
+ }
110
+ root.metadata = { ...(root.metadata ?? {}), tintColor: hex ?? null };
111
+ }
112
+ /** Same file on :3000/uploads vs :3001/uploads must share one GPU copy. */
113
+ // assetCacheKey lives in AvatarAssetManager (shared with GLB container cache).
114
+ function absoluteAssetUrl(url) {
115
+ if (typeof window === 'undefined')
116
+ return url;
117
+ if (!url.startsWith('/'))
118
+ return url;
119
+ // Prefer platform origin when lobby runs inside a game iframe on another host.
120
+ try {
121
+ const ref = document.referrer ? new URL(document.referrer).origin : '';
122
+ if (ref && ref !== window.location.origin) {
123
+ return `${ref}${url}`;
124
+ }
125
+ }
126
+ catch {
127
+ // ignore
128
+ }
129
+ return `${window.location.origin}${url}`;
130
+ }
131
+ function readColorVariantTexture(customConfig) {
132
+ if (!customConfig)
133
+ return null;
134
+ const variants = customConfig.colorVariants;
135
+ if (!Array.isArray(variants) || variants.length === 0)
136
+ return null;
137
+ const selectedKey = typeof customConfig.colorVariantKey === 'string' && customConfig.colorVariantKey.trim()
138
+ ? customConfig.colorVariantKey.trim()
139
+ : typeof customConfig.defaultColorVariantKey === 'string' &&
140
+ customConfig.defaultColorVariantKey.trim()
141
+ ? customConfig.defaultColorVariantKey.trim()
142
+ : null;
143
+ let hit = null;
144
+ if (selectedKey) {
145
+ for (const entry of variants) {
146
+ if (!entry || typeof entry !== 'object')
147
+ continue;
148
+ const src = entry;
149
+ if (src.key === selectedKey) {
150
+ hit = src;
151
+ break;
152
+ }
153
+ }
154
+ }
155
+ if (!hit) {
156
+ const first = variants[0];
157
+ if (first && typeof first === 'object')
158
+ hit = first;
159
+ }
160
+ if (!hit)
161
+ return null;
162
+ if (hit.appliesToBase === false)
163
+ return null;
164
+ if (typeof hit.textureUrl === 'string' && hit.textureUrl.trim()) {
165
+ return hit.textureUrl.trim();
166
+ }
167
+ return null;
168
+ }
169
+ /** Read base-body albedo: preset colorVariants first, then accessory appliesToBase. */
170
+ export function readBaseAlbedoUrlFromConfig(customConfig) {
171
+ const fromPalette = readColorVariantTexture(customConfig);
172
+ if (fromPalette)
173
+ return fromPalette;
174
+ const raw = customConfig?.accessories;
175
+ if (!Array.isArray(raw))
176
+ return null;
177
+ for (const entry of raw) {
178
+ if (!entry || typeof entry !== 'object')
179
+ continue;
180
+ const src = entry;
181
+ if (src.appliesToBase !== true)
182
+ continue;
183
+ if (typeof src.textureUrl === 'string' && src.textureUrl.trim()) {
184
+ return src.textureUrl.trim();
185
+ }
186
+ }
187
+ return null;
188
+ }
189
+ /**
190
+ * One GPU texture per URL per scene. A 1K albedo costs ~5MB of VRAM, so a lobby
191
+ * of players wearing the same colour used to pay that cost once per avatar.
192
+ */
193
+ const albedoTextureCache = new WeakMap();
194
+ function sharedAlbedoTexture(scene, url, invertY, like) {
195
+ let byUrl = albedoTextureCache.get(scene);
196
+ if (!byUrl) {
197
+ byUrl = new Map();
198
+ albedoTextureCache.set(scene, byUrl);
199
+ scene.onDisposeObservable.addOnce(() => albedoTextureCache.delete(scene));
200
+ }
201
+ // UV transform is part of the identity: two materials that sample the same
202
+ // file differently must not share one instance.
203
+ const uv = like
204
+ ? [like.wrapU, like.wrapV, like.uScale, like.vScale, like.uOffset, like.vOffset].join(',')
205
+ : 'default';
206
+ const key = `${assetCacheKey(url)}|${invertY ? 1 : 0}|${uv}`;
207
+ // Disposal removes its own entry below, so anything still cached is alive.
208
+ const cached = byUrl.get(key);
209
+ if (cached)
210
+ return cached;
211
+ const texture = new Texture(url, scene, false, invertY, Texture.TRILINEAR_SAMPLINGMODE);
212
+ texture.name = `avatar-albedo-${url.slice(-48)}`;
213
+ // Match glTF albedo sampling (linear UV, gamma color).
214
+ texture.gammaSpace = true;
215
+ texture.metadata = { ...(texture.metadata ?? {}), sharedAvatarAlbedo: true };
216
+ forceOpaqueTexture(texture);
217
+ if (like) {
218
+ texture.wrapU = like.wrapU;
219
+ texture.wrapV = like.wrapV;
220
+ texture.uScale = like.uScale;
221
+ texture.vScale = like.vScale;
222
+ texture.uOffset = like.uOffset;
223
+ texture.vOffset = like.vOffset;
224
+ }
225
+ // Shared across avatars: disposing one avatar must not blank the others.
226
+ texture.onDisposeObservable.add(() => byUrl?.delete(key));
227
+ byUrl.set(key, texture);
228
+ return texture;
229
+ }
230
+ function collectAlbedoMaterials(rootMat) {
231
+ if (!rootMat)
232
+ return [];
233
+ const out = [];
234
+ const visit = (mat) => {
235
+ if (!mat)
236
+ return;
237
+ const anyMat = mat;
238
+ if (anyMat.metadata?.isNameTag)
239
+ return;
240
+ if (Array.isArray(anyMat.subMaterials) && anyMat.subMaterials.length) {
241
+ for (const sub of anyMat.subMaterials)
242
+ visit(sub);
243
+ return;
244
+ }
245
+ out.push(anyMat);
246
+ };
247
+ visit(rootMat);
248
+ return out;
249
+ }
250
+ export function applyAvatarBaseAlbedo(root, textureUrl) {
251
+ if (!root)
252
+ return;
253
+ const preferred = root.metadata?.tintMeshes?.filter(Boolean);
254
+ let meshes = preferred?.length
255
+ ? preferred
256
+ : (() => {
257
+ try {
258
+ return root.getChildMeshes?.(true) ?? [];
259
+ }
260
+ catch {
261
+ return [];
262
+ }
263
+ })();
264
+ meshes = meshes.filter((mesh) => {
265
+ if (!mesh || mesh.name?.includes('nametag'))
266
+ return false;
267
+ const meta = mesh.metadata;
268
+ if (meta?.isNameTag)
269
+ return false;
270
+ return true;
271
+ });
272
+ const absolute = textureUrl ? absoluteAssetUrl(textureUrl) : null;
273
+ const scene = root.getScene?.();
274
+ let swapped = 0;
275
+ for (const mesh of meshes) {
276
+ for (const mat of collectAlbedoMaterials(mesh.material)) {
277
+ const hasMap = !!(mat.albedoTexture || mat.diffuseTexture);
278
+ // Only swap materials that already carry an albedo map (clothing), not flat skin mats.
279
+ if (!hasMap && absolute)
280
+ continue;
281
+ const meta = (mat.metadata ?? {});
282
+ if (mat.albedoTexture && meta.baseAlbedoTexture === undefined) {
283
+ meta.baseAlbedoTexture = mat.albedoTexture;
284
+ }
285
+ if (mat.diffuseTexture && meta.baseDiffuseTexture === undefined) {
286
+ meta.baseDiffuseTexture = mat.diffuseTexture;
287
+ }
288
+ mat.metadata = meta;
289
+ if (absolute && scene) {
290
+ const prev = (mat.albedoTexture ?? mat.diffuseTexture);
291
+ const invertY = prev && typeof prev.invertY === 'boolean' ? prev.invertY : false;
292
+ const next = sharedAlbedoTexture(scene, absolute, invertY, prev);
293
+ if ('albedoTexture' in mat)
294
+ mat.albedoTexture = next;
295
+ else if ('diffuseTexture' in mat)
296
+ mat.diffuseTexture = next;
297
+ forceOpaqueTexture(next, mat);
298
+ mat.alpha = 1;
299
+ mat.transparencyMode = Material.MATERIAL_OPAQUE;
300
+ mat.alphaMode = 0;
301
+ if ('useAlphaFromAlbedoTexture' in mat) {
302
+ mat.useAlphaFromAlbedoTexture =
303
+ false;
304
+ }
305
+ if ('useAlphaFromDiffuseTexture' in mat) {
306
+ mat.useAlphaFromDiffuseTexture =
307
+ false;
308
+ }
309
+ // Texture variants must not be multiplied by leftover whole-avatar tint.
310
+ if (mat.albedoColor)
311
+ mat.albedoColor.set(1, 1, 1);
312
+ if (mat.diffuseColor)
313
+ mat.diffuseColor.set(1, 1, 1);
314
+ if (mat.emissiveColor)
315
+ mat.emissiveColor.set(0, 0, 0);
316
+ if (typeof mat.emissiveIntensity === 'number')
317
+ mat.emissiveIntensity = 0;
318
+ swapped += 1;
319
+ }
320
+ else {
321
+ if ('albedoTexture' in mat && meta.baseAlbedoTexture !== undefined) {
322
+ mat.albedoTexture = meta.baseAlbedoTexture;
323
+ }
324
+ if ('diffuseTexture' in mat && meta.baseDiffuseTexture !== undefined) {
325
+ mat.diffuseTexture = meta.baseDiffuseTexture;
326
+ }
327
+ }
328
+ mat.markAsDirty?.();
329
+ }
330
+ }
331
+ if (absolute && swapped === 0) {
332
+ console.warn('[lobby-sdk] base albedo: no textured materials found to swap', absolute);
333
+ }
334
+ else if (absolute) {
335
+ console.info('[lobby-sdk] base albedo applied', { url: absolute, materials: swapped });
336
+ }
337
+ root.metadata = { ...(root.metadata ?? {}), baseAlbedoUrl: absolute, tintColor: null };
338
+ }
339
+ /**
340
+ * Keep albedo on the opaque path. glTF/PNG often sets hasAlpha=true after the
341
+ * async decode finishes — that re-enters alpha blending and the body looks
342
+ * see-through in front of plaza buildings.
343
+ */
344
+ function forceOpaqueTexture(tex, mat) {
345
+ if (!tex)
346
+ return;
347
+ const lock = () => {
348
+ tex.hasAlpha = false;
349
+ tex.getAlphaFromRGB = false;
350
+ if (mat) {
351
+ mat.alpha = 1;
352
+ mat.transparencyMode = Material.MATERIAL_OPAQUE;
353
+ mat.alphaMode = 0;
354
+ mat.disableDepthWrite = false;
355
+ mat.useAlphaFromAlbedoTexture = false;
356
+ mat.useAlphaFromDiffuseTexture = false;
357
+ mat.markAsDirty(Material.AllDirtyFlag);
358
+ }
359
+ };
360
+ lock();
361
+ const meta = (tex.metadata ?? {});
362
+ if (meta.lobbyForceOpaque)
363
+ return;
364
+ tex.metadata = { ...meta, lobbyForceOpaque: true };
365
+ const obs = tex
366
+ .onLoadObservable;
367
+ obs?.add(lock);
368
+ }
369
+ export function lobbyQualityOf(scene) {
370
+ const value = scene.metadata?.lobbyQuality;
371
+ return value === 'low' || value === 'high' ? value : 'medium';
372
+ }
373
+ function countLobbyAvatars(scene) {
374
+ const tagged = scene.metadata?.lobbyAvatarCount;
375
+ if (typeof tagged === 'number' && tagged > 0)
376
+ return tagged;
377
+ let count = 0;
378
+ for (const node of scene.transformNodes) {
379
+ if (node.metadata?.isLobbyAvatarRoot)
380
+ count++;
381
+ }
382
+ return count;
383
+ }
384
+ function stripCloneSuffix(name) {
385
+ return (name ?? '').replace(/__a\d+$/, '');
386
+ }
387
+ function isImportRootName(name) {
388
+ const base = stripCloneSuffix(name).toLowerCase();
389
+ return base === '__root__' || base === 'world';
390
+ }
391
+ export function trimDetailMapsOnMaterials(meshes) {
392
+ for (const mesh of meshes) {
393
+ if (isImportRootName(mesh.name))
394
+ continue;
395
+ const rootMat = mesh?.material;
396
+ if (!rootMat)
397
+ continue;
398
+ const subs = rootMat.subMaterials;
399
+ const materials = Array.isArray(subs) && subs.length ? subs : [rootMat];
400
+ for (const mat of materials) {
401
+ if (!mat)
402
+ continue;
403
+ const anyMat = mat;
404
+ for (const slot of ['bumpTexture', 'metallicTexture', 'ambientTexture', 'reflectivityTexture']) {
405
+ if (anyMat[slot])
406
+ anyMat[slot] = null;
407
+ }
408
+ anyMat.markAsDirty?.();
409
+ }
410
+ }
411
+ }
412
+ /**
413
+ * Normal and metallic-roughness maps double an avatar's texture memory for
414
+ * detail nobody can see on a phone-sized character. Low-tier devices ran out of
415
+ * GPU memory and lost the WebGL context (a white screen) because of them.
416
+ */
417
+ export function trimAvatarMapsForLowEndDevices(scene, meshes) {
418
+ if (!shouldTrimAvatarDetailMaps({
419
+ quality: lobbyQualityOf(scene),
420
+ touch: isTouchDevice(),
421
+ avatarCount: countLobbyAvatars(scene) + 1,
422
+ })) {
423
+ return;
424
+ }
425
+ trimDetailMapsOnMaterials(meshes);
426
+ }
427
+ function excludeAvatarFromGlow(scene, meshes) {
428
+ const glow = scene.metadata
429
+ ?.plazaGlow;
430
+ if (!glow)
431
+ return;
432
+ for (const mesh of meshes) {
433
+ if (mesh instanceof Mesh)
434
+ glow.addExcludedMesh(mesh);
435
+ }
436
+ }
437
+ /**
438
+ * Strip Meshy/glTF PBR extras that inflate the vertex shader UBO count.
439
+ * WebGL2 guarantees only 12 vertex uniform blocks; plaza PointLights + skinning
440
+ * + clearcoat pushes past that and the mesh silently disappears (nametag only).
441
+ * Same-GLB remotes share one compiled Effect so they "work"; a second unique
442
+ * material recompiles and dies — that was the different-avatar invisibility bug.
443
+ */
444
+ function stripHeavyPbrFeatures(mat) {
445
+ const anyMat = mat;
446
+ // Hemi + directional are enough for lobby bodies; plaza lamps stay on scenery.
447
+ anyMat.maxSimultaneousLights = 2;
448
+ anyMat._maxSimultaneousLights = 2;
449
+ if (anyMat.clearCoat)
450
+ anyMat.clearCoat.isEnabled = false;
451
+ if (anyMat.sheen)
452
+ anyMat.sheen.isEnabled = false;
453
+ if (anyMat.anisotropy)
454
+ anyMat.anisotropy.isEnabled = false;
455
+ if (anyMat.iridescence)
456
+ anyMat.iridescence.isEnabled = false;
457
+ if (anyMat.subSurface) {
458
+ anyMat.subSurface.isScatteringEnabled = false;
459
+ anyMat.subSurface.isRefractionEnabled = false;
460
+ anyMat.subSurface.isTranslucencyEnabled = false;
461
+ }
462
+ // No per-avatar reflections — scene pipeline owns bloom; mirrors look translucent.
463
+ const pbr = anyMat;
464
+ if (pbr.reflectionTexture)
465
+ pbr.reflectionTexture = null;
466
+ if (typeof pbr.environmentIntensity === 'number')
467
+ pbr.environmentIntensity = 0;
468
+ anyMat._markAllSubMeshesAsLightsDirty?.();
469
+ anyMat._markAllSubMeshesAsTexturesDirty?.();
470
+ }
471
+ function excludeAvatarFromPrePass(scene, meshes) {
472
+ try {
473
+ const prepass = scene.prePassRenderer;
474
+ if (!prepass?.excludedSkinnedMesh)
475
+ return;
476
+ for (const mesh of meshes) {
477
+ if (!(mesh instanceof Mesh) || !mesh.skeleton)
478
+ continue;
479
+ if (prepass.excludedSkinnedMesh.indexOf(mesh) === -1) {
480
+ prepass.excludedSkinnedMesh.push(mesh);
481
+ }
482
+ }
483
+ }
484
+ catch {
485
+ // ignore
486
+ }
487
+ }
488
+ /**
489
+ * Meshy/glTF looks hollow because albedo PNG alpha + __root__ Z-flip + culling.
490
+ * Force opaque + double-sided. Do not flipFaces, do not replace PBR.
491
+ * Do not forceDepthWrite — that punches holes in the plaza when two avatars overlap.
492
+ */
493
+ export function hardenAvatarMaterials(meshes) {
494
+ const scene = meshes[0]?.getScene?.();
495
+ if (scene) {
496
+ excludeAvatarFromGlow(scene, meshes);
497
+ excludeAvatarFromPrePass(scene, meshes);
498
+ }
499
+ for (const mesh of meshes) {
500
+ if (!mesh || isImportRootName(mesh.name))
501
+ continue;
502
+ mesh.visibility = 1;
503
+ mesh.metadata = { ...(mesh.metadata ?? {}), isLobbyAvatar: true };
504
+ // Skinned AABBs are unreliable; remotes without this get frustum-culled.
505
+ mesh.alwaysSelectAsActiveMesh = true;
506
+ mesh.renderingGroupId = 0;
507
+ mesh.receiveShadows = false;
508
+ if (mesh instanceof Mesh) {
509
+ mesh.sideOrientation = Mesh.DOUBLESIDE;
510
+ mesh.overrideMaterialSideOrientation = Mesh.DOUBLESIDE;
511
+ }
512
+ const rootMat = mesh.material;
513
+ if (!rootMat)
514
+ continue;
515
+ const materials = [rootMat];
516
+ const subs = rootMat.subMaterials;
517
+ if (Array.isArray(subs)) {
518
+ for (const sub of subs)
519
+ if (sub)
520
+ materials.push(sub);
521
+ }
522
+ for (const mat of materials) {
523
+ mat.backFaceCulling = false;
524
+ mat.alpha = 1;
525
+ mat.transparencyMode = Material.MATERIAL_OPAQUE;
526
+ mat.alphaMode = 0;
527
+ mat.separateCullingPass = false;
528
+ // Opaque path already depth-writes; forceDepthWrite punches plaza holes on overlap.
529
+ mat.forceDepthWrite = false;
530
+ mat.disableDepthWrite = false;
531
+ mat.needDepthPrePass = false;
532
+ stripHeavyPbrFeatures(mat);
533
+ const anyMat = mat;
534
+ if ('useAlphaFromAlbedoTexture' in anyMat)
535
+ anyMat.useAlphaFromAlbedoTexture = false;
536
+ if ('useAlphaFromDiffuseTexture' in anyMat)
537
+ anyMat.useAlphaFromDiffuseTexture = false;
538
+ if ('twoSidedLighting' in anyMat)
539
+ anyMat.twoSidedLighting = true;
540
+ // KHR_materials_specular specularFactor:0 lands here and makes the body a hole.
541
+ if (typeof anyMat.metallicF0Factor === 'number' && anyMat.metallicF0Factor < 0.5) {
542
+ anyMat.metallicF0Factor = 1;
543
+ }
544
+ forceOpaqueTexture(anyMat.albedoTexture, mat);
545
+ forceOpaqueTexture(anyMat.diffuseTexture, mat);
546
+ if (anyMat.opacityTexture)
547
+ anyMat.opacityTexture = null;
548
+ if (anyMat.reflectionTexture)
549
+ anyMat.reflectionTexture = null;
550
+ if (typeof anyMat.environmentIntensity === 'number')
551
+ anyMat.environmentIntensity = 0;
552
+ anyMat.markAsDirty?.();
553
+ }
554
+ }
555
+ }
556
+ /** Facade over avatar material / texture helpers. */
557
+ export class AvatarMaterialPipeline {
558
+ static harden(meshes) {
559
+ hardenAvatarMaterials(meshes);
560
+ }
561
+ static applyTint(root, hex) {
562
+ applyAvatarTint(root, hex);
563
+ }
564
+ static applyBaseAlbedo(root, textureUrl) {
565
+ applyAvatarBaseAlbedo(root, textureUrl);
566
+ }
567
+ static trimForLowEnd(scene, meshes) {
568
+ trimAvatarMapsForLowEndDevices(scene, meshes);
569
+ }
570
+ static trimDetailMapsOnMaterials(meshes) {
571
+ trimDetailMapsOnMaterials(meshes);
572
+ }
573
+ static readTintFromConfig(config) {
574
+ return readTintFromConfig(config);
575
+ }
576
+ static readBaseAlbedoUrlFromConfig(customConfig) {
577
+ return readBaseAlbedoUrlFromConfig(customConfig);
578
+ }
579
+ }
580
+ //# sourceMappingURL=avatar-material-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar-material-pipeline.js","sourceRoot":"","sources":["../src/avatar-material-pipeline.ts"],"names":[],"mappings":"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"}