@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.
- package/README.md +46 -0
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/audio/mixer.d.ts +75 -0
- package/dist/audio/mixer.d.ts.map +1 -0
- package/dist/audio/mixer.js +345 -0
- package/dist/audio/mixer.js.map +1 -0
- package/dist/audio/player.d.ts +67 -0
- package/dist/audio/player.d.ts.map +1 -0
- package/dist/audio/player.js +337 -0
- package/dist/audio/player.js.map +1 -0
- package/dist/audio/spatial.d.ts +50 -0
- package/dist/audio/spatial.d.ts.map +1 -0
- package/dist/audio/spatial.js +166 -0
- package/dist/audio/spatial.js.map +1 -0
- package/dist/audio/voices.d.ts +11 -0
- package/dist/audio/voices.d.ts.map +1 -0
- package/dist/audio/voices.js +22 -0
- package/dist/audio/voices.js.map +1 -0
- package/dist/audio.d.ts +6 -38
- package/dist/audio.d.ts.map +1 -1
- package/dist/audio.js +3 -226
- package/dist/audio.js.map +1 -1
- package/dist/browser.d.ts +2 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -5
- package/dist/browser.js.map +1 -1
- package/dist/browser3d.d.ts +2 -0
- package/dist/browser3d.d.ts.map +1 -0
- package/dist/browser3d.js +2 -0
- package/dist/browser3d.js.map +1 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +29 -19
- package/dist/build.js.map +1 -1
- package/dist/build3d.d.ts +11 -0
- package/dist/build3d.d.ts.map +1 -0
- package/dist/build3d.js +126 -0
- package/dist/build3d.js.map +1 -0
- package/dist/canvas2d.d.ts +12 -3
- package/dist/canvas2d.d.ts.map +1 -1
- package/dist/canvas2d.js +59 -12
- package/dist/canvas2d.js.map +1 -1
- package/dist/fixed-tick-host.d.ts +10 -0
- package/dist/fixed-tick-host.d.ts.map +1 -0
- package/dist/fixed-tick-host.js +29 -0
- package/dist/fixed-tick-host.js.map +1 -0
- package/dist/frame-budget.d.ts +34 -0
- package/dist/frame-budget.d.ts.map +1 -0
- package/dist/frame-budget.js +52 -0
- package/dist/frame-budget.js.map +1 -0
- package/dist/frame.d.ts +20 -1
- package/dist/frame.d.ts.map +1 -1
- package/dist/frame.js +69 -1
- package/dist/frame.js.map +1 -1
- package/dist/game3d-capture-page.js +5834 -0
- package/dist/game3d-player.js +6001 -0
- package/dist/imageDiff.d.ts +9 -0
- package/dist/imageDiff.d.ts.map +1 -0
- package/dist/imageDiff.js +30 -0
- package/dist/imageDiff.js.map +1 -0
- package/dist/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/input-bindings.d.ts +76 -0
- package/dist/input-bindings.d.ts.map +1 -0
- package/dist/input-bindings.js +377 -0
- package/dist/input-bindings.js.map +1 -0
- package/dist/input.d.ts +1 -1
- package/dist/input.d.ts.map +1 -1
- package/dist/input.js +1 -14
- package/dist/input.js.map +1 -1
- package/dist/input3d.d.ts +3 -0
- package/dist/input3d.d.ts.map +1 -0
- package/dist/input3d.js +3 -0
- package/dist/input3d.js.map +1 -0
- package/dist/node.d.ts +5 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +28 -11
- package/dist/node.js.map +1 -1
- package/dist/node3d.d.ts +29 -0
- package/dist/node3d.d.ts.map +1 -0
- package/dist/node3d.js +160 -0
- package/dist/node3d.js.map +1 -0
- package/dist/particles/curves.d.ts +16 -0
- package/dist/particles/curves.d.ts.map +1 -0
- package/dist/particles/curves.js +49 -0
- package/dist/particles/curves.js.map +1 -0
- package/dist/particles/index.d.ts +6 -0
- package/dist/particles/index.d.ts.map +1 -0
- package/dist/particles/index.js +6 -0
- package/dist/particles/index.js.map +1 -0
- package/dist/particles/random.d.ts +10 -0
- package/dist/particles/random.d.ts.map +1 -0
- package/dist/particles/random.js +26 -0
- package/dist/particles/random.js.map +1 -0
- package/dist/particles/render2d.d.ts +40 -0
- package/dist/particles/render2d.d.ts.map +1 -0
- package/dist/particles/render2d.js +70 -0
- package/dist/particles/render2d.js.map +1 -0
- package/dist/particles/shapes.d.ts +18 -0
- package/dist/particles/shapes.d.ts.map +1 -0
- package/dist/particles/shapes.js +92 -0
- package/dist/particles/shapes.js.map +1 -0
- package/dist/particles/simulator.d.ts +88 -0
- package/dist/particles/simulator.d.ts.map +1 -0
- package/dist/particles/simulator.js +371 -0
- package/dist/particles/simulator.js.map +1 -0
- package/dist/player-v1.js +2502 -0
- package/dist/preparation3d.d.ts +3 -0
- package/dist/preparation3d.d.ts.map +1 -0
- package/dist/preparation3d.js +3 -0
- package/dist/preparation3d.js.map +1 -0
- package/dist/renderPipeline.d.ts +12 -0
- package/dist/renderPipeline.d.ts.map +1 -0
- package/dist/renderPipeline.js +17 -0
- package/dist/renderPipeline.js.map +1 -0
- package/dist/renderer3d/animation/index.d.ts +11 -0
- package/dist/renderer3d/animation/index.d.ts.map +1 -0
- package/dist/renderer3d/animation/index.js +212 -0
- package/dist/renderer3d/animation/index.js.map +1 -0
- package/dist/renderer3d/assets/cache.d.ts +14 -0
- package/dist/renderer3d/assets/cache.d.ts.map +1 -0
- package/dist/renderer3d/assets/cache.js +74 -0
- package/dist/renderer3d/assets/cache.js.map +1 -0
- package/dist/renderer3d/assets/dispose.d.ts +4 -0
- package/dist/renderer3d/assets/dispose.d.ts.map +1 -0
- package/dist/renderer3d/assets/dispose.js +41 -0
- package/dist/renderer3d/assets/dispose.js.map +1 -0
- package/dist/renderer3d/assets/hdri-contract.d.ts +23 -0
- package/dist/renderer3d/assets/hdri-contract.d.ts.map +1 -0
- package/dist/renderer3d/assets/hdri-contract.js +2 -0
- package/dist/renderer3d/assets/hdri-contract.js.map +1 -0
- package/dist/renderer3d/assets/instances.d.ts +5 -0
- package/dist/renderer3d/assets/instances.d.ts.map +1 -0
- package/dist/renderer3d/assets/instances.js +86 -0
- package/dist/renderer3d/assets/instances.js.map +1 -0
- package/dist/renderer3d/capture-driver-types.d.ts +42 -0
- package/dist/renderer3d/capture-driver-types.d.ts.map +1 -0
- package/dist/renderer3d/capture-driver-types.js +2 -0
- package/dist/renderer3d/capture-driver-types.js.map +1 -0
- package/dist/renderer3d/capture-page.d.ts +36 -0
- package/dist/renderer3d/capture-page.d.ts.map +1 -0
- package/dist/renderer3d/capture-page.js +68 -0
- package/dist/renderer3d/capture-page.js.map +1 -0
- package/dist/renderer3d/culling.d.ts +10 -0
- package/dist/renderer3d/culling.d.ts.map +1 -0
- package/dist/renderer3d/culling.js +27 -0
- package/dist/renderer3d/culling.js.map +1 -0
- package/dist/renderer3d/environment/index.d.ts +4 -0
- package/dist/renderer3d/environment/index.d.ts.map +1 -0
- package/dist/renderer3d/environment/index.js +9 -0
- package/dist/renderer3d/environment/index.js.map +1 -0
- package/dist/renderer3d/environment/sky.d.ts +45 -0
- package/dist/renderer3d/environment/sky.d.ts.map +1 -0
- package/dist/renderer3d/environment/sky.js +221 -0
- package/dist/renderer3d/environment/sky.js.map +1 -0
- package/dist/renderer3d/hud/fonts.d.ts +13 -0
- package/dist/renderer3d/hud/fonts.d.ts.map +1 -0
- package/dist/renderer3d/hud/fonts.js +69 -0
- package/dist/renderer3d/hud/fonts.js.map +1 -0
- package/dist/renderer3d/hud/paint.d.ts +4 -0
- package/dist/renderer3d/hud/paint.d.ts.map +1 -0
- package/dist/renderer3d/hud/paint.js +22 -0
- package/dist/renderer3d/hud/paint.js.map +1 -0
- package/dist/renderer3d/import.d.ts +34 -0
- package/dist/renderer3d/import.d.ts.map +1 -0
- package/dist/renderer3d/import.js +408 -0
- package/dist/renderer3d/import.js.map +1 -0
- package/dist/renderer3d/index.d.ts +74 -0
- package/dist/renderer3d/index.d.ts.map +1 -0
- package/dist/renderer3d/index.js +338 -0
- package/dist/renderer3d/index.js.map +1 -0
- package/dist/renderer3d/lights/index.d.ts +7 -0
- package/dist/renderer3d/lights/index.d.ts.map +1 -0
- package/dist/renderer3d/lights/index.js +67 -0
- package/dist/renderer3d/lights/index.js.map +1 -0
- package/dist/renderer3d/materials/index.d.ts +4 -0
- package/dist/renderer3d/materials/index.d.ts.map +1 -0
- package/dist/renderer3d/materials/index.js +8 -0
- package/dist/renderer3d/materials/index.js.map +1 -0
- package/dist/renderer3d/passes/post-processing.d.ts +44 -0
- package/dist/renderer3d/passes/post-processing.d.ts.map +1 -0
- package/dist/renderer3d/passes/post-processing.js +213 -0
- package/dist/renderer3d/passes/post-processing.js.map +1 -0
- package/dist/renderer3d/pipeline.d.ts +15 -0
- package/dist/renderer3d/pipeline.d.ts.map +1 -0
- package/dist/renderer3d/pipeline.js +10 -0
- package/dist/renderer3d/pipeline.js.map +1 -0
- package/dist/renderer3d/playwright-contract.d.ts +3 -0
- package/dist/renderer3d/playwright-contract.d.ts.map +1 -0
- package/dist/renderer3d/playwright-contract.js +4 -0
- package/dist/renderer3d/playwright-contract.js.map +1 -0
- package/dist/renderer3d/preparation.d.ts +79 -0
- package/dist/renderer3d/preparation.d.ts.map +1 -0
- package/dist/renderer3d/preparation.js +458 -0
- package/dist/renderer3d/preparation.js.map +1 -0
- package/dist/renderer3d/scene-sync.d.ts +8 -0
- package/dist/renderer3d/scene-sync.d.ts.map +1 -0
- package/dist/renderer3d/scene-sync.js +96 -0
- package/dist/renderer3d/scene-sync.js.map +1 -0
- package/dist/renderer3d/shadows/cascades.d.ts +40 -0
- package/dist/renderer3d/shadows/cascades.d.ts.map +1 -0
- package/dist/renderer3d/shadows/cascades.js +244 -0
- package/dist/renderer3d/shadows/cascades.js.map +1 -0
- package/dist/renderer3d/shadows/index.d.ts +44 -0
- package/dist/renderer3d/shadows/index.d.ts.map +1 -0
- package/dist/renderer3d/shadows/index.js +129 -0
- package/dist/renderer3d/shadows/index.js.map +1 -0
- package/dist/renderer3d/types.d.ts +18 -0
- package/dist/renderer3d/types.d.ts.map +1 -0
- package/dist/renderer3d/types.js +2 -0
- package/dist/renderer3d/types.js.map +1 -0
- package/dist/smoke.d.ts +15 -0
- package/dist/smoke.d.ts.map +1 -0
- package/dist/smoke.js +138 -0
- package/dist/smoke.js.map +1 -0
- package/dist/standalone-player.d.ts +11 -1
- package/dist/standalone-player.d.ts.map +1 -1
- package/dist/standalone-player.js +67 -41
- package/dist/standalone-player.js.map +1 -1
- package/dist/standalone-player3d.d.ts +14 -0
- package/dist/standalone-player3d.d.ts.map +1 -0
- package/dist/standalone-player3d.js +255 -0
- package/dist/standalone-player3d.js.map +1 -0
- package/dist/touch-controls.d.ts +22 -8
- package/dist/touch-controls.d.ts.map +1 -1
- package/dist/touch-controls.js +88 -21
- package/dist/touch-controls.js.map +1 -1
- package/dist/ui/controller.d.ts +59 -0
- package/dist/ui/controller.d.ts.map +1 -0
- package/dist/ui/controller.js +201 -0
- package/dist/ui/controller.js.map +1 -0
- package/dist/ui/hud2d.d.ts +11 -0
- package/dist/ui/hud2d.d.ts.map +1 -0
- package/dist/ui/hud2d.js +25 -0
- package/dist/ui/hud2d.js.map +1 -0
- package/dist/ui/layout.d.ts +42 -0
- package/dist/ui/layout.d.ts.map +1 -0
- package/dist/ui/layout.js +182 -0
- package/dist/ui/layout.js.map +1 -0
- package/dist/ui/paint.d.ts +45 -0
- package/dist/ui/paint.d.ts.map +1 -0
- package/dist/ui/paint.js +121 -0
- package/dist/ui/paint.js.map +1 -0
- package/dist/webgpu/effects.d.ts +22 -0
- package/dist/webgpu/effects.d.ts.map +1 -0
- package/dist/webgpu/effects.js +69 -0
- package/dist/webgpu/effects.js.map +1 -0
- package/dist/webgpu/hud.d.ts +4 -0
- package/dist/webgpu/hud.d.ts.map +1 -0
- package/dist/webgpu/hud.js +27 -0
- package/dist/webgpu/hud.js.map +1 -0
- package/dist/webgpu/lighting.d.ts +4 -0
- package/dist/webgpu/lighting.d.ts.map +1 -0
- package/dist/webgpu/lighting.js +47 -0
- package/dist/webgpu/lighting.js.map +1 -0
- package/dist/webgpu/pipeline.d.ts +11 -0
- package/dist/webgpu/pipeline.d.ts.map +1 -0
- package/dist/webgpu/pipeline.js +11 -0
- package/dist/webgpu/pipeline.js.map +1 -0
- package/dist/webgpu/sprites.d.ts +6 -0
- package/dist/webgpu/sprites.d.ts.map +1 -0
- package/dist/webgpu/sprites.js +74 -0
- package/dist/webgpu/sprites.js.map +1 -0
- package/dist/webgpu/types.d.ts +14 -0
- package/dist/webgpu/types.d.ts.map +1 -0
- package/dist/webgpu/types.js +2 -0
- package/dist/webgpu/types.js.map +1 -0
- package/dist/webgpu.d.ts +4 -3
- package/dist/webgpu.d.ts.map +1 -1
- package/dist/webgpu.js +119 -279
- package/dist/webgpu.js.map +1 -1
- package/package.json +47 -10
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|