@nodetool-ai/game-renderer 0.8.1 → 0.8.2

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 (273) hide show
  1. package/README.md +46 -0
  2. package/dist/.nodetool-build-stamp +1 -1
  3. package/dist/audio/mixer.d.ts +75 -0
  4. package/dist/audio/mixer.d.ts.map +1 -0
  5. package/dist/audio/mixer.js +345 -0
  6. package/dist/audio/mixer.js.map +1 -0
  7. package/dist/audio/player.d.ts +67 -0
  8. package/dist/audio/player.d.ts.map +1 -0
  9. package/dist/audio/player.js +337 -0
  10. package/dist/audio/player.js.map +1 -0
  11. package/dist/audio/spatial.d.ts +50 -0
  12. package/dist/audio/spatial.d.ts.map +1 -0
  13. package/dist/audio/spatial.js +166 -0
  14. package/dist/audio/spatial.js.map +1 -0
  15. package/dist/audio/voices.d.ts +11 -0
  16. package/dist/audio/voices.d.ts.map +1 -0
  17. package/dist/audio/voices.js +22 -0
  18. package/dist/audio/voices.js.map +1 -0
  19. package/dist/audio.d.ts +6 -38
  20. package/dist/audio.d.ts.map +1 -1
  21. package/dist/audio.js +3 -226
  22. package/dist/audio.js.map +1 -1
  23. package/dist/browser.d.ts +2 -1
  24. package/dist/browser.d.ts.map +1 -1
  25. package/dist/browser.js +5 -5
  26. package/dist/browser.js.map +1 -1
  27. package/dist/browser3d.d.ts +2 -0
  28. package/dist/browser3d.d.ts.map +1 -0
  29. package/dist/browser3d.js +2 -0
  30. package/dist/browser3d.js.map +1 -0
  31. package/dist/build.d.ts.map +1 -1
  32. package/dist/build.js +29 -19
  33. package/dist/build.js.map +1 -1
  34. package/dist/build3d.d.ts +11 -0
  35. package/dist/build3d.d.ts.map +1 -0
  36. package/dist/build3d.js +126 -0
  37. package/dist/build3d.js.map +1 -0
  38. package/dist/canvas2d.d.ts +12 -3
  39. package/dist/canvas2d.d.ts.map +1 -1
  40. package/dist/canvas2d.js +59 -12
  41. package/dist/canvas2d.js.map +1 -1
  42. package/dist/fixed-tick-host.d.ts +10 -0
  43. package/dist/fixed-tick-host.d.ts.map +1 -0
  44. package/dist/fixed-tick-host.js +29 -0
  45. package/dist/fixed-tick-host.js.map +1 -0
  46. package/dist/frame-budget.d.ts +34 -0
  47. package/dist/frame-budget.d.ts.map +1 -0
  48. package/dist/frame-budget.js +52 -0
  49. package/dist/frame-budget.js.map +1 -0
  50. package/dist/frame.d.ts +20 -1
  51. package/dist/frame.d.ts.map +1 -1
  52. package/dist/frame.js +69 -1
  53. package/dist/frame.js.map +1 -1
  54. package/dist/game3d-capture-page.js +5834 -0
  55. package/dist/game3d-player.js +6001 -0
  56. package/dist/imageDiff.d.ts +9 -0
  57. package/dist/imageDiff.d.ts.map +1 -0
  58. package/dist/imageDiff.js +30 -0
  59. package/dist/imageDiff.js.map +1 -0
  60. package/dist/index.d.ts +12 -1
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +9 -0
  63. package/dist/index.js.map +1 -1
  64. package/dist/input-bindings.d.ts +76 -0
  65. package/dist/input-bindings.d.ts.map +1 -0
  66. package/dist/input-bindings.js +377 -0
  67. package/dist/input-bindings.js.map +1 -0
  68. package/dist/input.d.ts +1 -1
  69. package/dist/input.d.ts.map +1 -1
  70. package/dist/input.js +1 -14
  71. package/dist/input.js.map +1 -1
  72. package/dist/input3d.d.ts +3 -0
  73. package/dist/input3d.d.ts.map +1 -0
  74. package/dist/input3d.js +3 -0
  75. package/dist/input3d.js.map +1 -0
  76. package/dist/node.d.ts +5 -0
  77. package/dist/node.d.ts.map +1 -1
  78. package/dist/node.js +28 -11
  79. package/dist/node.js.map +1 -1
  80. package/dist/node3d.d.ts +29 -0
  81. package/dist/node3d.d.ts.map +1 -0
  82. package/dist/node3d.js +160 -0
  83. package/dist/node3d.js.map +1 -0
  84. package/dist/particles/curves.d.ts +16 -0
  85. package/dist/particles/curves.d.ts.map +1 -0
  86. package/dist/particles/curves.js +49 -0
  87. package/dist/particles/curves.js.map +1 -0
  88. package/dist/particles/index.d.ts +6 -0
  89. package/dist/particles/index.d.ts.map +1 -0
  90. package/dist/particles/index.js +6 -0
  91. package/dist/particles/index.js.map +1 -0
  92. package/dist/particles/random.d.ts +10 -0
  93. package/dist/particles/random.d.ts.map +1 -0
  94. package/dist/particles/random.js +26 -0
  95. package/dist/particles/random.js.map +1 -0
  96. package/dist/particles/render2d.d.ts +40 -0
  97. package/dist/particles/render2d.d.ts.map +1 -0
  98. package/dist/particles/render2d.js +70 -0
  99. package/dist/particles/render2d.js.map +1 -0
  100. package/dist/particles/shapes.d.ts +18 -0
  101. package/dist/particles/shapes.d.ts.map +1 -0
  102. package/dist/particles/shapes.js +92 -0
  103. package/dist/particles/shapes.js.map +1 -0
  104. package/dist/particles/simulator.d.ts +88 -0
  105. package/dist/particles/simulator.d.ts.map +1 -0
  106. package/dist/particles/simulator.js +371 -0
  107. package/dist/particles/simulator.js.map +1 -0
  108. package/dist/player-v1.js +2502 -0
  109. package/dist/preparation3d.d.ts +3 -0
  110. package/dist/preparation3d.d.ts.map +1 -0
  111. package/dist/preparation3d.js +3 -0
  112. package/dist/preparation3d.js.map +1 -0
  113. package/dist/renderPipeline.d.ts +12 -0
  114. package/dist/renderPipeline.d.ts.map +1 -0
  115. package/dist/renderPipeline.js +17 -0
  116. package/dist/renderPipeline.js.map +1 -0
  117. package/dist/renderer3d/animation/index.d.ts +11 -0
  118. package/dist/renderer3d/animation/index.d.ts.map +1 -0
  119. package/dist/renderer3d/animation/index.js +212 -0
  120. package/dist/renderer3d/animation/index.js.map +1 -0
  121. package/dist/renderer3d/assets/cache.d.ts +14 -0
  122. package/dist/renderer3d/assets/cache.d.ts.map +1 -0
  123. package/dist/renderer3d/assets/cache.js +74 -0
  124. package/dist/renderer3d/assets/cache.js.map +1 -0
  125. package/dist/renderer3d/assets/dispose.d.ts +4 -0
  126. package/dist/renderer3d/assets/dispose.d.ts.map +1 -0
  127. package/dist/renderer3d/assets/dispose.js +41 -0
  128. package/dist/renderer3d/assets/dispose.js.map +1 -0
  129. package/dist/renderer3d/assets/hdri-contract.d.ts +23 -0
  130. package/dist/renderer3d/assets/hdri-contract.d.ts.map +1 -0
  131. package/dist/renderer3d/assets/hdri-contract.js +2 -0
  132. package/dist/renderer3d/assets/hdri-contract.js.map +1 -0
  133. package/dist/renderer3d/assets/instances.d.ts +5 -0
  134. package/dist/renderer3d/assets/instances.d.ts.map +1 -0
  135. package/dist/renderer3d/assets/instances.js +86 -0
  136. package/dist/renderer3d/assets/instances.js.map +1 -0
  137. package/dist/renderer3d/capture-driver-types.d.ts +42 -0
  138. package/dist/renderer3d/capture-driver-types.d.ts.map +1 -0
  139. package/dist/renderer3d/capture-driver-types.js +2 -0
  140. package/dist/renderer3d/capture-driver-types.js.map +1 -0
  141. package/dist/renderer3d/capture-page.d.ts +36 -0
  142. package/dist/renderer3d/capture-page.d.ts.map +1 -0
  143. package/dist/renderer3d/capture-page.js +68 -0
  144. package/dist/renderer3d/capture-page.js.map +1 -0
  145. package/dist/renderer3d/culling.d.ts +10 -0
  146. package/dist/renderer3d/culling.d.ts.map +1 -0
  147. package/dist/renderer3d/culling.js +27 -0
  148. package/dist/renderer3d/culling.js.map +1 -0
  149. package/dist/renderer3d/environment/index.d.ts +4 -0
  150. package/dist/renderer3d/environment/index.d.ts.map +1 -0
  151. package/dist/renderer3d/environment/index.js +9 -0
  152. package/dist/renderer3d/environment/index.js.map +1 -0
  153. package/dist/renderer3d/environment/sky.d.ts +45 -0
  154. package/dist/renderer3d/environment/sky.d.ts.map +1 -0
  155. package/dist/renderer3d/environment/sky.js +221 -0
  156. package/dist/renderer3d/environment/sky.js.map +1 -0
  157. package/dist/renderer3d/hud/fonts.d.ts +13 -0
  158. package/dist/renderer3d/hud/fonts.d.ts.map +1 -0
  159. package/dist/renderer3d/hud/fonts.js +69 -0
  160. package/dist/renderer3d/hud/fonts.js.map +1 -0
  161. package/dist/renderer3d/hud/paint.d.ts +4 -0
  162. package/dist/renderer3d/hud/paint.d.ts.map +1 -0
  163. package/dist/renderer3d/hud/paint.js +22 -0
  164. package/dist/renderer3d/hud/paint.js.map +1 -0
  165. package/dist/renderer3d/import.d.ts +34 -0
  166. package/dist/renderer3d/import.d.ts.map +1 -0
  167. package/dist/renderer3d/import.js +408 -0
  168. package/dist/renderer3d/import.js.map +1 -0
  169. package/dist/renderer3d/index.d.ts +74 -0
  170. package/dist/renderer3d/index.d.ts.map +1 -0
  171. package/dist/renderer3d/index.js +338 -0
  172. package/dist/renderer3d/index.js.map +1 -0
  173. package/dist/renderer3d/lights/index.d.ts +7 -0
  174. package/dist/renderer3d/lights/index.d.ts.map +1 -0
  175. package/dist/renderer3d/lights/index.js +67 -0
  176. package/dist/renderer3d/lights/index.js.map +1 -0
  177. package/dist/renderer3d/materials/index.d.ts +4 -0
  178. package/dist/renderer3d/materials/index.d.ts.map +1 -0
  179. package/dist/renderer3d/materials/index.js +8 -0
  180. package/dist/renderer3d/materials/index.js.map +1 -0
  181. package/dist/renderer3d/passes/post-processing.d.ts +44 -0
  182. package/dist/renderer3d/passes/post-processing.d.ts.map +1 -0
  183. package/dist/renderer3d/passes/post-processing.js +213 -0
  184. package/dist/renderer3d/passes/post-processing.js.map +1 -0
  185. package/dist/renderer3d/pipeline.d.ts +15 -0
  186. package/dist/renderer3d/pipeline.d.ts.map +1 -0
  187. package/dist/renderer3d/pipeline.js +10 -0
  188. package/dist/renderer3d/pipeline.js.map +1 -0
  189. package/dist/renderer3d/playwright-contract.d.ts +3 -0
  190. package/dist/renderer3d/playwright-contract.d.ts.map +1 -0
  191. package/dist/renderer3d/playwright-contract.js +4 -0
  192. package/dist/renderer3d/playwright-contract.js.map +1 -0
  193. package/dist/renderer3d/preparation.d.ts +79 -0
  194. package/dist/renderer3d/preparation.d.ts.map +1 -0
  195. package/dist/renderer3d/preparation.js +458 -0
  196. package/dist/renderer3d/preparation.js.map +1 -0
  197. package/dist/renderer3d/scene-sync.d.ts +8 -0
  198. package/dist/renderer3d/scene-sync.d.ts.map +1 -0
  199. package/dist/renderer3d/scene-sync.js +96 -0
  200. package/dist/renderer3d/scene-sync.js.map +1 -0
  201. package/dist/renderer3d/shadows/cascades.d.ts +40 -0
  202. package/dist/renderer3d/shadows/cascades.d.ts.map +1 -0
  203. package/dist/renderer3d/shadows/cascades.js +244 -0
  204. package/dist/renderer3d/shadows/cascades.js.map +1 -0
  205. package/dist/renderer3d/shadows/index.d.ts +44 -0
  206. package/dist/renderer3d/shadows/index.d.ts.map +1 -0
  207. package/dist/renderer3d/shadows/index.js +129 -0
  208. package/dist/renderer3d/shadows/index.js.map +1 -0
  209. package/dist/renderer3d/types.d.ts +18 -0
  210. package/dist/renderer3d/types.d.ts.map +1 -0
  211. package/dist/renderer3d/types.js +2 -0
  212. package/dist/renderer3d/types.js.map +1 -0
  213. package/dist/smoke.d.ts +15 -0
  214. package/dist/smoke.d.ts.map +1 -0
  215. package/dist/smoke.js +138 -0
  216. package/dist/smoke.js.map +1 -0
  217. package/dist/standalone-player.d.ts +11 -1
  218. package/dist/standalone-player.d.ts.map +1 -1
  219. package/dist/standalone-player.js +67 -41
  220. package/dist/standalone-player.js.map +1 -1
  221. package/dist/standalone-player3d.d.ts +14 -0
  222. package/dist/standalone-player3d.d.ts.map +1 -0
  223. package/dist/standalone-player3d.js +255 -0
  224. package/dist/standalone-player3d.js.map +1 -0
  225. package/dist/touch-controls.d.ts +22 -8
  226. package/dist/touch-controls.d.ts.map +1 -1
  227. package/dist/touch-controls.js +88 -21
  228. package/dist/touch-controls.js.map +1 -1
  229. package/dist/ui/controller.d.ts +59 -0
  230. package/dist/ui/controller.d.ts.map +1 -0
  231. package/dist/ui/controller.js +201 -0
  232. package/dist/ui/controller.js.map +1 -0
  233. package/dist/ui/hud2d.d.ts +11 -0
  234. package/dist/ui/hud2d.d.ts.map +1 -0
  235. package/dist/ui/hud2d.js +25 -0
  236. package/dist/ui/hud2d.js.map +1 -0
  237. package/dist/ui/layout.d.ts +42 -0
  238. package/dist/ui/layout.d.ts.map +1 -0
  239. package/dist/ui/layout.js +182 -0
  240. package/dist/ui/layout.js.map +1 -0
  241. package/dist/ui/paint.d.ts +45 -0
  242. package/dist/ui/paint.d.ts.map +1 -0
  243. package/dist/ui/paint.js +121 -0
  244. package/dist/ui/paint.js.map +1 -0
  245. package/dist/webgpu/effects.d.ts +22 -0
  246. package/dist/webgpu/effects.d.ts.map +1 -0
  247. package/dist/webgpu/effects.js +69 -0
  248. package/dist/webgpu/effects.js.map +1 -0
  249. package/dist/webgpu/hud.d.ts +4 -0
  250. package/dist/webgpu/hud.d.ts.map +1 -0
  251. package/dist/webgpu/hud.js +27 -0
  252. package/dist/webgpu/hud.js.map +1 -0
  253. package/dist/webgpu/lighting.d.ts +4 -0
  254. package/dist/webgpu/lighting.d.ts.map +1 -0
  255. package/dist/webgpu/lighting.js +47 -0
  256. package/dist/webgpu/lighting.js.map +1 -0
  257. package/dist/webgpu/pipeline.d.ts +11 -0
  258. package/dist/webgpu/pipeline.d.ts.map +1 -0
  259. package/dist/webgpu/pipeline.js +11 -0
  260. package/dist/webgpu/pipeline.js.map +1 -0
  261. package/dist/webgpu/sprites.d.ts +6 -0
  262. package/dist/webgpu/sprites.d.ts.map +1 -0
  263. package/dist/webgpu/sprites.js +74 -0
  264. package/dist/webgpu/sprites.js.map +1 -0
  265. package/dist/webgpu/types.d.ts +14 -0
  266. package/dist/webgpu/types.d.ts.map +1 -0
  267. package/dist/webgpu/types.js +2 -0
  268. package/dist/webgpu/types.js.map +1 -0
  269. package/dist/webgpu.d.ts +4 -3
  270. package/dist/webgpu.d.ts.map +1 -1
  271. package/dist/webgpu.js +119 -279
  272. package/dist/webgpu.js.map +1 -1
  273. package/package.json +47 -10
@@ -0,0 +1,3 @@
1
+ export * from "./renderer3d/preparation.js";
2
+ export * from "./renderer3d/import.js";
3
+ //# sourceMappingURL=preparation3d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preparation3d.d.ts","sourceRoot":"","sources":["../src/preparation3d.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./renderer3d/preparation.js";
2
+ export * from "./renderer3d/import.js";
3
+ //# sourceMappingURL=preparation3d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preparation3d.js","sourceRoot":"","sources":["../src/preparation3d.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface GameRenderPass<Context> {
2
+ readonly name: string;
3
+ readonly order: number;
4
+ readonly render: (context: Context) => void | Promise<void>;
5
+ }
6
+ /** Runs named presentation passes in registration order within each numeric order. */
7
+ export declare class GameRenderPipeline<Context> {
8
+ private readonly passes;
9
+ register(pass: GameRenderPass<Context>): void;
10
+ render(context: Context): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=renderPipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderPipeline.d.ts","sourceRoot":"","sources":["../src/renderPipeline.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc,CAAC,OAAO;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,sFAAsF;AACtF,qBAAa,kBAAkB,CAAC,OAAO;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IAExD,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,IAAI,CAM5C;IAEK,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5C;CACF"}
@@ -0,0 +1,17 @@
1
+ /** Runs named presentation passes in registration order within each numeric order. */
2
+ export class GameRenderPipeline {
3
+ passes = [];
4
+ register(pass) {
5
+ if (this.passes.some((entry) => entry.name === pass.name)) {
6
+ throw new Error(`Render pass ${pass.name} is already registered`);
7
+ }
8
+ this.passes.push(pass);
9
+ this.passes.sort((first, second) => first.order - second.order);
10
+ }
11
+ async render(context) {
12
+ for (const pass of this.passes) {
13
+ await pass.render(context);
14
+ }
15
+ }
16
+ }
17
+ //# sourceMappingURL=renderPipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderPipeline.js","sourceRoot":"","sources":["../src/renderPipeline.ts"],"names":[],"mappings":"AAMA,sFAAsF;AACtF,MAAM,OAAO,kBAAkB;IACZ,MAAM,GAA8B,EAAE,CAAC;IAExD,QAAQ,CAAC,IAA6B;QACpC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,IAAI,wBAAwB,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAgB;QAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;IACjE,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import * as THREE from "three";
2
+ import type { GameAnimationPose3D, GameAnimationState3D } from "@nodetool-ai/protocol";
3
+ /** Evaluates cosmetic clips from an explicit simulation tick without accumulating wall-clock deltas. */
4
+ export declare function sampleGameAnimation3D(mixer: THREE.AnimationMixer, clips: readonly THREE.AnimationClip[], state: GameAnimationState3D, tick: number): void;
5
+ /**
6
+ * Applies a graph pose from an explicit simulation tick. Each call starts from the rest pose captured when the
7
+ * instance was first sampled. The root retains its simulation transform. Override layers blend toward their
8
+ * sampled pose by layer weight. Additive layers add each clip's offset from its first keyframe.
9
+ */
10
+ export declare function sampleGameAnimationPose3D(root: THREE.Object3D, clips: readonly THREE.AnimationClip[], pose: GameAnimationPose3D, tick: number): void;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/renderer3d/animation/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACvF,wGAAwG;AACxG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAmBzJ;AAoGD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA4DpJ"}
@@ -0,0 +1,212 @@
1
+ import * as THREE from "three";
2
+ /** Evaluates cosmetic clips from an explicit simulation tick without accumulating wall-clock deltas. */
3
+ export function sampleGameAnimation3D(mixer, clips, state, tick) {
4
+ mixer.stopAllAction();
5
+ const elapsed = Math.max(0, tick - state.startTick);
6
+ const transition = state.previousClipId !== undefined && (state.transitionTicks ?? 0) > 0
7
+ ? Math.min(1, elapsed / (state.transitionTicks ?? 1)) : 1;
8
+ const sample = (id, startTick, weight) => {
9
+ const match = /^clip:(\d+)$/.exec(id);
10
+ const clip = match ? clips[Number(match[1])] : undefined;
11
+ if (!clip) {
12
+ throw new Error(`Prepared animation clip ${id} does not exist`);
13
+ }
14
+ const time = Math.max(0, tick - startTick) / 60 * state.playbackRate;
15
+ const action = mixer.clipAction(clip);
16
+ action.reset().setEffectiveWeight(weight).setEffectiveTimeScale(0).play();
17
+ action.loop = state.loop ? THREE.LoopRepeat : THREE.LoopOnce;
18
+ action.clampWhenFinished = !state.loop;
19
+ action.time = state.loop && clip.duration > 0 ? time % clip.duration : Math.min(time, clip.duration);
20
+ };
21
+ if (state.previousClipId !== undefined && transition < 1) {
22
+ sample(state.previousClipId, state.previousStartTick ?? state.startTick, 1 - transition);
23
+ }
24
+ sample(state.clipId, state.startTick, transition);
25
+ mixer.update(0);
26
+ }
27
+ const channelCache = new WeakMap();
28
+ const restCache = new WeakMap();
29
+ const maskCache = new WeakMap();
30
+ const POSE_PROPERTIES = ["position", "quaternion", "scale"];
31
+ function preparedClip(clips, id) {
32
+ const match = /^clip:(\d+)$/.exec(id);
33
+ const clip = match ? clips[Number(match[1])] : undefined;
34
+ if (!clip) {
35
+ throw new Error(`Prepared animation clip ${id} does not exist`);
36
+ }
37
+ return clip;
38
+ }
39
+ function poseChannels(root, clip) {
40
+ let byClip = channelCache.get(root);
41
+ if (!byClip) {
42
+ byClip = new Map();
43
+ channelCache.set(root, byClip);
44
+ }
45
+ let channels = byClip.get(clip);
46
+ if (!channels) {
47
+ channels = [];
48
+ for (const track of clip.tracks) {
49
+ const parsed = THREE.PropertyBinding.parseTrackName(track.name);
50
+ if (parsed.objectName || parsed.propertyIndex !== undefined) {
51
+ continue;
52
+ }
53
+ const node = THREE.PropertyBinding.findNode(root, parsed.nodeName);
54
+ const property = POSE_PROPERTIES.find((candidate) => candidate === parsed.propertyName);
55
+ if (!(node instanceof THREE.Object3D) || !property) {
56
+ continue;
57
+ }
58
+ // KeyframeTrack assigns createInterpolant per interpolation mode, and GLTFLoader replaces it for cubic splines.
59
+ const interpolant = "createInterpolant" in track && typeof track.createInterpolant === "function" ? track.createInterpolant() : undefined;
60
+ if (!(interpolant instanceof THREE.Interpolant)) {
61
+ throw new Error(`Animation track ${track.name} has no interpolant`);
62
+ }
63
+ channels.push({ node, property, interpolant, reference: Array.from(track.values.slice(0, track.getValueSize())) });
64
+ }
65
+ byClip.set(clip, channels);
66
+ }
67
+ return channels;
68
+ }
69
+ function restPose(root) {
70
+ let rest = restCache.get(root);
71
+ if (!rest) {
72
+ const captured = new Map();
73
+ root.traverse((node) => {
74
+ if (node === root) {
75
+ return;
76
+ }
77
+ captured.set(node, { position: node.position.clone(), quaternion: node.quaternion.clone(), scale: node.scale.clone() });
78
+ });
79
+ rest = captured;
80
+ restCache.set(root, rest);
81
+ }
82
+ return rest;
83
+ }
84
+ function maskedNodes(root, mask) {
85
+ let byKey = maskCache.get(root);
86
+ if (!byKey) {
87
+ byKey = new Map();
88
+ maskCache.set(root, byKey);
89
+ }
90
+ const key = mask.join("\n");
91
+ let nodes = byKey.get(key);
92
+ if (!nodes) {
93
+ const selected = new Set();
94
+ root.traverse((node) => {
95
+ if (typeof node.userData.gameNodeId === "string" && mask.includes(node.userData.gameNodeId)) {
96
+ node.traverse((child) => selected.add(child));
97
+ }
98
+ });
99
+ nodes = selected;
100
+ byKey.set(key, nodes);
101
+ }
102
+ return nodes;
103
+ }
104
+ /** Clip times for one motion. Blended clips share one normalized phase so strides stay aligned. */
105
+ function motionTimes(clips, sample, tick, scale) {
106
+ const resolved = sample.clips.map((entry) => ({ clip: preparedClip(clips, entry.clipId), weight: entry.weight * scale }));
107
+ const elapsed = Math.max(0, tick - sample.startTick) / 60 * sample.rate;
108
+ const total = resolved.reduce((sum, entry) => sum + entry.weight, 0);
109
+ const duration = total > 0 ? resolved.reduce((sum, entry) => sum + entry.weight * entry.clip.duration, 0) / total : 0;
110
+ const phase = duration <= 0 ? 0 : sample.loop ? (elapsed / duration) % 1 : Math.min(1, elapsed / duration);
111
+ return resolved.map((entry) => ({ ...entry, time: entry.clip.duration * phase }));
112
+ }
113
+ /**
114
+ * Applies a graph pose from an explicit simulation tick. Each call starts from the rest pose captured when the
115
+ * instance was first sampled. The root retains its simulation transform. Override layers blend toward their
116
+ * sampled pose by layer weight. Additive layers add each clip's offset from its first keyframe.
117
+ */
118
+ export function sampleGameAnimationPose3D(root, clips, pose, tick) {
119
+ for (const [node, rest] of restPose(root)) {
120
+ node.position.copy(rest.position);
121
+ node.quaternion.copy(rest.quaternion);
122
+ node.scale.copy(rest.scale);
123
+ }
124
+ const value = new THREE.Vector3();
125
+ const rotation = new THREE.Quaternion();
126
+ const reference = new THREE.Quaternion();
127
+ for (const layer of pose.layers) {
128
+ const alpha = layer.previous && layer.transitionTicks ? Math.max(0, Math.min(1, (tick - layer.current.startTick) / layer.transitionTicks)) : 1;
129
+ const contributions = [...motionTimes(clips, layer.current, tick, alpha), ...(layer.previous && alpha < 1 ? motionTimes(clips, layer.previous, tick, 1 - alpha) : [])];
130
+ const mask = layer.mask ? maskedNodes(root, layer.mask) : undefined;
131
+ const additive = layer.mode === "additive";
132
+ const accumulators = new Map();
133
+ for (const contribution of contributions) {
134
+ if (contribution.weight <= 0) {
135
+ continue;
136
+ }
137
+ for (const channel of poseChannels(root, contribution.clip)) {
138
+ if (mask && !mask.has(channel.node)) {
139
+ continue;
140
+ }
141
+ let accumulator = accumulators.get(channel.node);
142
+ if (!accumulator) {
143
+ accumulator = { position: new THREE.Vector3(), quaternion: new THREE.Quaternion(0, 0, 0, 0), scale: new THREE.Vector3(), positionWeight: 0, quaternionWeight: 0, scaleWeight: 0 };
144
+ accumulators.set(channel.node, accumulator);
145
+ }
146
+ const sampled = channel.interpolant.evaluate(contribution.time);
147
+ const weight = contribution.weight;
148
+ if (channel.property === "quaternion") {
149
+ rotation.fromArray(sampled);
150
+ if (additive) {
151
+ rotation.premultiply(reference.fromArray(channel.reference).invert());
152
+ }
153
+ const sign = accumulator.quaternionWeight > 0 && accumulator.quaternion.dot(rotation) < 0 ? -1 : 1;
154
+ accumulator.quaternion.set(accumulator.quaternion.x + rotation.x * weight * sign, accumulator.quaternion.y + rotation.y * weight * sign, accumulator.quaternion.z + rotation.z * weight * sign, accumulator.quaternion.w + rotation.w * weight * sign);
155
+ accumulator.quaternionWeight += weight;
156
+ }
157
+ else {
158
+ value.fromArray(sampled);
159
+ if (additive) {
160
+ if (channel.property === "position") {
161
+ value.sub(new THREE.Vector3().fromArray(channel.reference));
162
+ }
163
+ else {
164
+ value.divide(new THREE.Vector3().fromArray(channel.reference.map((component) => component === 0 ? 1 : component)));
165
+ }
166
+ }
167
+ if (channel.property === "position") {
168
+ accumulator.position.addScaledVector(value, weight);
169
+ accumulator.positionWeight += weight;
170
+ }
171
+ else {
172
+ accumulator.scale.addScaledVector(value, weight);
173
+ accumulator.scaleWeight += weight;
174
+ }
175
+ }
176
+ }
177
+ }
178
+ for (const [node, accumulator] of accumulators) {
179
+ if (accumulator.positionWeight > 0) {
180
+ const amount = layer.weight * Math.min(1, accumulator.positionWeight);
181
+ value.copy(accumulator.position).divideScalar(accumulator.positionWeight);
182
+ if (additive) {
183
+ node.position.addScaledVector(value, amount);
184
+ }
185
+ else {
186
+ node.position.lerp(value, amount);
187
+ }
188
+ }
189
+ if (accumulator.quaternionWeight > 0) {
190
+ const amount = layer.weight * Math.min(1, accumulator.quaternionWeight);
191
+ rotation.copy(accumulator.quaternion).normalize();
192
+ if (additive) {
193
+ node.quaternion.multiply(reference.identity().slerp(rotation, amount));
194
+ }
195
+ else {
196
+ node.quaternion.slerp(rotation, amount);
197
+ }
198
+ }
199
+ if (accumulator.scaleWeight > 0) {
200
+ const amount = layer.weight * Math.min(1, accumulator.scaleWeight);
201
+ value.copy(accumulator.scale).divideScalar(accumulator.scaleWeight);
202
+ if (additive) {
203
+ node.scale.multiply(value.lerp(new THREE.Vector3(1, 1, 1), 1 - amount));
204
+ }
205
+ else {
206
+ node.scale.lerp(value, amount);
207
+ }
208
+ }
209
+ }
210
+ }
211
+ }
212
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/renderer3d/animation/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CachedModel } from "../types.js";
2
+ import type { CreateGameRenderer3DOptions } from "../index.js";
3
+ export declare class GameModelCache3D {
4
+ private readonly options;
5
+ private readonly controller;
6
+ private readonly models;
7
+ readonly loadedModels: Set<CachedModel>;
8
+ modelLoadMs: number;
9
+ constructor(options: CreateGameRenderer3DOptions, controller: AbortController);
10
+ get(id: string): Promise<CachedModel>;
11
+ invalidate(slot: string): Promise<void>;
12
+ dispose(): void;
13
+ }
14
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/renderer3d/assets/cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAG/D,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAA+B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAH9F,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,QAAQ,CAAC,YAAY,mBAA0B;IAC/C,WAAW,SAAK;IAChB,YAA6B,OAAO,EAAE,2BAA2B,EAAmB,UAAU,EAAE,eAAe,EAAI;IAC7G,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgC1C;IACK,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5C;IACD,OAAO,IAAI,IAAI,CAId;CACF"}
@@ -0,0 +1,74 @@
1
+ import * as THREE from "three";
2
+ import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
3
+ import { prepareGameModel } from "../preparation.js";
4
+ import { releaseModel } from "./dispose.js";
5
+ export class GameModelCache3D {
6
+ options;
7
+ controller;
8
+ models = new Map();
9
+ loadedModels = new Set();
10
+ modelLoadMs = 0;
11
+ constructor(options, controller) {
12
+ this.options = options;
13
+ this.controller = controller;
14
+ }
15
+ async get(id) {
16
+ let pending = this.models.get(id);
17
+ if (!pending) {
18
+ pending = (async () => {
19
+ const started = performance.now();
20
+ const source = await this.options.resolveModel?.(id, this.controller.signal);
21
+ this.controller.signal.throwIfAborted();
22
+ if (!source) {
23
+ throw new Error(`Model asset ${id} is missing`);
24
+ }
25
+ const checked = await prepareGameModel(source.bytes, { expectedDigest: source.digest, signal: this.controller.signal });
26
+ if (!checked.ok) {
27
+ throw new Error(`Model ${id} failed preparation: ${checked.diagnostics.map((entry) => entry.message).join("; ")}`);
28
+ }
29
+ const manager = new THREE.LoadingManager();
30
+ manager.setURLModifier((url) => {
31
+ if (!url.startsWith("blob:")) {
32
+ throw new Error("Prepared model attempted an external resource request");
33
+ }
34
+ return url;
35
+ });
36
+ const loader = new GLTFLoader(manager);
37
+ loader.register((parser) => ({ name: "NODETOOL_game_node_ids",
38
+ loadNode: async (index) => {
39
+ const node = await parser.loadNode(index);
40
+ node.userData.gameNodeId = `node:${index}`;
41
+ return node;
42
+ } }));
43
+ const gltf = await loader.parseAsync(new Uint8Array(checked.model.bytes).buffer, "");
44
+ const cached = { prepared: checked.model, gltf };
45
+ if (this.controller.signal.aborted) {
46
+ releaseModel(cached);
47
+ this.controller.signal.throwIfAborted();
48
+ }
49
+ this.loadedModels.add(cached);
50
+ this.modelLoadMs += performance.now() - started;
51
+ return cached;
52
+ })();
53
+ this.models.set(id, pending);
54
+ }
55
+ return pending;
56
+ }
57
+ async invalidate(slot) {
58
+ const pending = this.models.get(slot);
59
+ this.models.delete(slot);
60
+ if (pending) {
61
+ const cached = await pending.catch(() => null);
62
+ if (cached) {
63
+ releaseModel(cached);
64
+ this.loadedModels.delete(cached);
65
+ }
66
+ }
67
+ }
68
+ dispose() {
69
+ this.loadedModels.forEach(releaseModel);
70
+ this.loadedModels.clear();
71
+ this.models.clear();
72
+ }
73
+ }
74
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/renderer3d/assets/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CachedModel, RenderInstance } from "../types.js";
2
+ export declare function releaseInstance(instance: RenderInstance): void;
3
+ export declare function releaseModel(model: CachedModel): void;
4
+ //# sourceMappingURL=dispose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispose.d.ts","sourceRoot":"","sources":["../../../src/renderer3d/assets/dispose.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAS9D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAoBrD"}
@@ -0,0 +1,41 @@
1
+ import * as THREE from "three";
2
+ export function releaseInstance(instance) {
3
+ instance.mixer?.stopAllAction();
4
+ instance.mixer?.uncacheRoot(instance.object);
5
+ const skeletons = new Set();
6
+ instance.object.traverse((object) => { if (object instanceof THREE.SkinnedMesh) {
7
+ skeletons.add(object.skeleton);
8
+ } });
9
+ skeletons.forEach((skeleton) => skeleton.dispose());
10
+ instance.materials.forEach((material) => material.dispose());
11
+ instance.primitiveGeometry?.dispose();
12
+ instance.object.removeFromParent();
13
+ }
14
+ export function releaseModel(model) {
15
+ const geometries = new Set();
16
+ const materials = new Set();
17
+ const textures = new Set();
18
+ model.gltf.scenes.forEach((scene) => scene.traverse((object) => {
19
+ if (object instanceof THREE.Mesh) {
20
+ geometries.add(object.geometry);
21
+ (Array.isArray(object.material) ? object.material : [object.material]).forEach((material) => {
22
+ materials.add(material);
23
+ for (const value of Object.values(material)) {
24
+ if (value instanceof THREE.Texture) {
25
+ textures.add(value);
26
+ }
27
+ }
28
+ });
29
+ }
30
+ }));
31
+ geometries.forEach((geometry) => geometry.dispose());
32
+ materials.forEach((material) => material.dispose());
33
+ textures.forEach((texture) => {
34
+ const image = texture.source.data;
35
+ if (typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap) {
36
+ image.close();
37
+ }
38
+ texture.dispose();
39
+ });
40
+ }
41
+ //# sourceMappingURL=dispose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispose.js","sourceRoot":"","sources":["../../../src/renderer3d/assets/dispose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,UAAU,eAAe,CAAC,QAAwB;IACtD,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,MAAM,YAAY,KAAK,CAAC,WAAW,EAAE,CAAC;QAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvH,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,QAAQ,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC7C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAwB,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;QAC7D,IAAI,MAAM,YAAY,KAAK,CAAC,IAAI,EAAE,CAAC;YACjC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC1F,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAAC,IAAI,KAAK,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC;wBAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAAC,CAAC;gBAAC,CAAC;YAC/G,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IACJ,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAY,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAC3C,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAC1F,OAAO,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { DataTexture } from "three";
2
+ import type { GameAssetBinding3D } from "@nodetool-ai/protocol";
3
+ import type { GameModelDiagnostic } from "../preparation.js";
4
+ export interface PreparedGameHdri3D {
5
+ readonly bytes: Uint8Array;
6
+ readonly binding: Extract<GameAssetBinding3D, {
7
+ mediaKind: "hdri";
8
+ }>;
9
+ }
10
+ export interface PrepareGameHdriOptions3D {
11
+ readonly assetId: string;
12
+ readonly expectedDigest?: string;
13
+ readonly signal?: AbortSignal;
14
+ }
15
+ export type PrepareGameHdriBinding3D = (bytes: Uint8Array, options: PrepareGameHdriOptions3D) => Promise<{
16
+ readonly ok: true;
17
+ readonly hdri: PreparedGameHdri3D;
18
+ } | {
19
+ readonly ok: false;
20
+ readonly diagnostics: readonly GameModelDiagnostic[];
21
+ }>;
22
+ export type DecodeGameHdri3D = (hdri: PreparedGameHdri3D, signal: AbortSignal) => Promise<DataTexture>;
23
+ //# sourceMappingURL=hdri-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hdri-contract.d.ts","sourceRoot":"","sources":["../../../src/renderer3d/assets/hdri-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtE;AACD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AACD,MAAM,MAAM,wBAAwB,GAAG,CACrC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,wBAAwB,KACjD,OAAO,CACR;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAA;CAAE,CAC/E,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,WAAW,KAC1C,OAAO,CAAC,WAAW,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hdri-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hdri-contract.js","sourceRoot":"","sources":["../../../src/renderer3d/assets/hdri-contract.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { GamePrimitive3D, GameModel3D } from "@nodetool-ai/protocol";
2
+ import type { CachedModel, RenderInstance } from "../types.js";
3
+ export declare function primitiveInstance(primitive: GamePrimitive3D): RenderInstance;
4
+ export declare function modelInstance(model: GameModel3D, cached: CachedModel): RenderInstance;
5
+ //# sourceMappingURL=instances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instances.d.ts","sourceRoot":"","sources":["../../../src/renderer3d/assets/instances.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,eAAe,GAAG,cAAc,CAY5E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,cAAc,CAqCrF"}
@@ -0,0 +1,86 @@
1
+ import * as THREE from "three";
2
+ import { clone as cloneSkeleton } from "three/addons/utils/SkeletonUtils.js";
3
+ import { createPrimitiveMaterial } from "../materials/index.js";
4
+ export function primitiveInstance(primitive) {
5
+ const size = primitive.dimensions;
6
+ let geometry;
7
+ if (primitive.kind === "box") {
8
+ geometry = new THREE.BoxGeometry(size.x, size.y, size.z);
9
+ }
10
+ else if (primitive.kind === "sphere") {
11
+ geometry = new THREE.SphereGeometry(0.5, 24, 16);
12
+ geometry.scale(size.x, size.y, size.z);
13
+ }
14
+ else if (primitive.kind === "capsule") {
15
+ geometry = new THREE.CapsuleGeometry(size.x / 2, Math.max(0, size.y - size.x), 8, 16);
16
+ geometry.scale(1, 1, size.z / size.x);
17
+ }
18
+ else {
19
+ geometry = new THREE.PlaneGeometry(size.x, size.z);
20
+ geometry.rotateX(-Math.PI / 2);
21
+ }
22
+ const material = createPrimitiveMaterial(primitive.material, primitive.kind === "plane");
23
+ const object = new THREE.Mesh(geometry, material);
24
+ object.castShadow = primitive.castShadow;
25
+ object.receiveShadow = primitive.receiveShadow;
26
+ return { descriptor: JSON.stringify(primitive), object, materials: [material], primitiveGeometry: geometry };
27
+ }
28
+ export function modelInstance(model, cached) {
29
+ // SkeletonUtils duplicates the skin's bones and bind state while retaining immutable geometry/texture resources.
30
+ const object = cloneSkeleton(cached.gltf.scene);
31
+ let selected;
32
+ if (model.nodeId !== undefined) {
33
+ object.traverse((child) => { if (child.userData.gameNodeId === model.nodeId) {
34
+ selected = child;
35
+ } });
36
+ if (!selected) {
37
+ throw new Error(`Prepared model node ${model.nodeId} does not exist`);
38
+ }
39
+ }
40
+ const selectedNodes = new Set();
41
+ selected?.traverse((child) => selectedNodes.add(child));
42
+ const materials = [];
43
+ object.traverse((child) => {
44
+ if (!(child instanceof THREE.Mesh)) {
45
+ return;
46
+ }
47
+ child.visible = selected === undefined || selectedNodes.has(child);
48
+ child.castShadow = model.castShadow;
49
+ child.receiveShadow = model.receiveShadow;
50
+ const original = Array.isArray(child.material) ? child.material : [child.material];
51
+ const cloned = original.map((material) => {
52
+ const copy = material.clone();
53
+ if (copy instanceof THREE.MeshStandardMaterial && model.material) {
54
+ const override = model.material;
55
+ if (override.color !== undefined) {
56
+ copy.color.set(override.color);
57
+ }
58
+ if (override.emissive !== undefined) {
59
+ copy.emissive.set(override.emissive);
60
+ }
61
+ if (override.metalness !== undefined) {
62
+ copy.metalness = override.metalness;
63
+ }
64
+ if (override.roughness !== undefined) {
65
+ copy.roughness = override.roughness;
66
+ }
67
+ if (override.opacity !== undefined) {
68
+ copy.opacity = override.opacity;
69
+ }
70
+ if (override.alphaMode !== undefined) {
71
+ copy.transparent = override.alphaMode === "blend";
72
+ }
73
+ if (override.alphaCutoff !== undefined && override.alphaMode === "mask") {
74
+ copy.alphaTest = override.alphaCutoff;
75
+ }
76
+ }
77
+ copy.userData.baseOpacity = copy.opacity;
78
+ copy.userData.baseTransparent = copy.transparent;
79
+ materials.push(copy);
80
+ return copy;
81
+ });
82
+ child.material = Array.isArray(child.material) ? cloned : cloned[0] ?? child.material;
83
+ });
84
+ return { descriptor: JSON.stringify(model), object, materials, mixer: new THREE.AnimationMixer(object), clips: cached.gltf.animations };
85
+ }
86
+ //# sourceMappingURL=instances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instances.js","sourceRoot":"","sources":["../../../src/renderer3d/assets/instances.ts"],"names":[],"mappings":"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"}