distark-render 1.1.15 → 1.1.17
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 +0 -0
- package/assets/KidB.json +2088 -0
- package/assets/tank.json +0 -0
- package/dist/cli/animate.d.ts +0 -0
- package/dist/cli/animate.d.ts.map +0 -0
- package/dist/cli/animate.js +0 -0
- package/dist/cli/animate.js.map +0 -0
- package/dist/cli/diff.d.ts +0 -0
- package/dist/cli/diff.d.ts.map +0 -0
- package/dist/cli/diff.js +0 -0
- package/dist/cli/diff.js.map +0 -0
- package/dist/cli/distark-check.d.ts +1 -0
- package/dist/cli/distark-check.d.ts.map +1 -1
- package/dist/cli/distark-check.js +6 -0
- package/dist/cli/distark-check.js.map +1 -1
- package/dist/cli/explode.d.ts +8 -0
- package/dist/cli/explode.d.ts.map +1 -0
- package/dist/cli/explode.js +282 -0
- package/dist/cli/explode.js.map +1 -0
- package/dist/cli/query.d.ts +0 -0
- package/dist/cli/query.d.ts.map +0 -0
- package/dist/cli/query.js +0 -0
- package/dist/cli/query.js.map +0 -0
- package/dist/cli/record.d.ts +0 -0
- package/dist/cli/record.d.ts.map +0 -0
- package/dist/cli/record.js +0 -0
- package/dist/cli/record.js.map +0 -0
- package/dist/cli/render.d.ts +0 -0
- package/dist/cli/render.d.ts.map +0 -0
- package/dist/cli/render.js +0 -0
- package/dist/cli/render.js.map +0 -0
- package/dist/cli/scene.d.ts +0 -0
- package/dist/cli/scene.d.ts.map +0 -0
- package/dist/cli/scene.js +16 -16
- package/dist/cli/scene.js.map +0 -0
- package/dist/cli/shared.d.ts +0 -0
- package/dist/cli/shared.d.ts.map +0 -0
- package/dist/cli/shared.js +0 -0
- package/dist/cli/shared.js.map +0 -0
- package/dist/cli/test.d.ts +0 -0
- package/dist/cli/test.d.ts.map +0 -0
- package/dist/cli/test.js +0 -0
- package/dist/cli/test.js.map +0 -0
- package/dist/cli/verify.d.ts +0 -0
- package/dist/cli/verify.d.ts.map +0 -0
- package/dist/cli/verify.js +0 -0
- package/dist/cli/verify.js.map +0 -0
- package/dist/modules/adapters/p5Renderer.d.ts +0 -0
- package/dist/modules/adapters/p5Renderer.d.ts.map +1 -1
- package/dist/modules/adapters/p5Renderer.js +54 -12
- package/dist/modules/adapters/p5Renderer.js.map +1 -1
- package/dist/modules/adapters/skiaRenderer.d.ts +0 -0
- package/dist/modules/adapters/skiaRenderer.d.ts.map +1 -1
- package/dist/modules/adapters/skiaRenderer.js +24 -4
- package/dist/modules/adapters/skiaRenderer.js.map +1 -1
- package/dist/modules/animationDiff.d.ts +0 -0
- package/dist/modules/animationDiff.d.ts.map +0 -0
- package/dist/modules/animationDiff.js +0 -0
- package/dist/modules/animationDiff.js.map +0 -0
- package/dist/modules/browserSceneRenderer.d.ts +0 -0
- package/dist/modules/browserSceneRenderer.d.ts.map +0 -0
- package/dist/modules/browserSceneRenderer.js +0 -0
- package/dist/modules/browserSceneRenderer.js.map +0 -0
- package/dist/modules/characterValidator.d.ts +2 -1
- package/dist/modules/characterValidator.d.ts.map +1 -1
- package/dist/modules/characterValidator.js +2 -41
- package/dist/modules/characterValidator.js.map +1 -1
- package/dist/modules/eyeSystem.d.ts +46 -14
- package/dist/modules/eyeSystem.d.ts.map +1 -1
- package/dist/modules/eyeSystem.js +167 -111
- package/dist/modules/eyeSystem.js.map +1 -1
- package/dist/modules/imageLoad.d.ts +50 -0
- package/dist/modules/imageLoad.d.ts.map +1 -1
- package/dist/modules/imageLoad.js +262 -18
- package/dist/modules/imageLoad.js.map +1 -1
- package/dist/modules/mouthSystem.d.ts +0 -0
- package/dist/modules/mouthSystem.d.ts.map +0 -0
- package/dist/modules/mouthSystem.js +0 -0
- package/dist/modules/mouthSystem.js.map +0 -0
- package/dist/modules/renderRig.d.ts +0 -0
- package/dist/modules/renderRig.d.ts.map +0 -0
- package/dist/modules/renderRig.js +0 -0
- package/dist/modules/renderRig.js.map +0 -0
- package/dist/modules/sceneRenderer.d.ts +0 -0
- package/dist/modules/sceneRenderer.d.ts.map +0 -0
- package/dist/modules/sceneRenderer.js +0 -0
- package/dist/modules/sceneRenderer.js.map +0 -0
- package/dist/tests/helpers.d.ts +0 -0
- package/dist/tests/helpers.d.ts.map +0 -0
- package/dist/tests/helpers.js +0 -0
- package/dist/tests/helpers.js.map +0 -0
- package/dist/tests/test-angle-swap.d.ts +0 -0
- package/dist/tests/test-angle-swap.d.ts.map +0 -0
- package/dist/tests/test-angle-swap.js +0 -0
- package/dist/tests/test-angle-swap.js.map +0 -0
- package/dist/tests/test-animation-diff-rendering.d.ts +0 -0
- package/dist/tests/test-animation-diff-rendering.d.ts.map +0 -0
- package/dist/tests/test-animation-diff-rendering.js +0 -0
- package/dist/tests/test-animation-diff-rendering.js.map +0 -0
- package/dist/tests/test-animation-diff.d.ts +0 -0
- package/dist/tests/test-animation-diff.d.ts.map +0 -0
- package/dist/tests/test-animation-diff.js +0 -0
- package/dist/tests/test-animation-diff.js.map +0 -0
- package/dist/tests/test-auto-eye-movement-e2e.d.ts +24 -0
- package/dist/tests/test-auto-eye-movement-e2e.d.ts.map +1 -0
- package/dist/tests/test-auto-eye-movement-e2e.js +514 -0
- package/dist/tests/test-auto-eye-movement-e2e.js.map +1 -0
- package/dist/tests/test-autofit.d.ts +0 -0
- package/dist/tests/test-autofit.d.ts.map +0 -0
- package/dist/tests/test-autofit.js +0 -0
- package/dist/tests/test-autofit.js.map +0 -0
- package/dist/tests/test-base-autofit.d.ts +0 -0
- package/dist/tests/test-base-autofit.d.ts.map +0 -0
- package/dist/tests/test-base-autofit.js +0 -0
- package/dist/tests/test-base-autofit.js.map +0 -0
- package/dist/tests/test-browser-scene.d.ts +0 -0
- package/dist/tests/test-browser-scene.d.ts.map +0 -0
- package/dist/tests/test-browser-scene.js +0 -0
- package/dist/tests/test-browser-scene.js.map +0 -0
- package/dist/tests/test-character-validator.d.ts +0 -0
- package/dist/tests/test-character-validator.d.ts.map +0 -0
- package/dist/tests/test-character-validator.js +0 -32
- package/dist/tests/test-character-validator.js.map +1 -1
- package/dist/tests/test-cli.d.ts +0 -0
- package/dist/tests/test-cli.d.ts.map +0 -0
- package/dist/tests/test-cli.js +0 -0
- package/dist/tests/test-cli.js.map +0 -0
- package/dist/tests/test-eye-extremes-visual.d.ts +22 -0
- package/dist/tests/test-eye-extremes-visual.d.ts.map +1 -0
- package/dist/tests/test-eye-extremes-visual.js +281 -0
- package/dist/tests/test-eye-extremes-visual.js.map +1 -0
- package/dist/tests/test-eye-system-reset.d.ts +15 -0
- package/dist/tests/test-eye-system-reset.d.ts.map +1 -0
- package/dist/tests/test-eye-system-reset.js +148 -0
- package/dist/tests/test-eye-system-reset.js.map +1 -0
- package/dist/tests/test-image-loading.d.ts +0 -0
- package/dist/tests/test-image-loading.d.ts.map +0 -0
- package/dist/tests/test-image-loading.js +0 -0
- package/dist/tests/test-image-loading.js.map +0 -0
- package/dist/tests/test-joint-movement.d.ts +0 -0
- package/dist/tests/test-joint-movement.d.ts.map +0 -0
- package/dist/tests/test-joint-movement.js +0 -0
- package/dist/tests/test-joint-movement.js.map +0 -0
- package/dist/tests/test-p5-image-types.d.ts +0 -0
- package/dist/tests/test-p5-image-types.d.ts.map +0 -0
- package/dist/tests/test-p5-image-types.js +0 -0
- package/dist/tests/test-p5-image-types.js.map +0 -0
- package/dist/tests/test-render-cache-visual.d.ts +0 -0
- package/dist/tests/test-render-cache-visual.d.ts.map +0 -0
- package/dist/tests/test-render-cache-visual.js +0 -0
- package/dist/tests/test-render-cache-visual.js.map +0 -0
- package/dist/tests/test-render-cache.d.ts +0 -0
- package/dist/tests/test-render-cache.d.ts.map +0 -0
- package/dist/tests/test-render-cache.js +0 -0
- package/dist/tests/test-render-cache.js.map +0 -0
- package/dist/tests/test-scene-object-svg-rerasterization.d.ts +0 -0
- package/dist/tests/test-scene-object-svg-rerasterization.d.ts.map +0 -0
- package/dist/tests/test-scene-object-svg-rerasterization.js +0 -0
- package/dist/tests/test-scene-object-svg-rerasterization.js.map +0 -0
- package/dist/tests/test-scene.d.ts +0 -0
- package/dist/tests/test-scene.d.ts.map +0 -0
- package/dist/tests/test-scene.js +0 -0
- package/dist/tests/test-scene.js.map +0 -0
- package/dist/tests/test-skia.d.ts +0 -0
- package/dist/tests/test-skia.d.ts.map +0 -0
- package/dist/tests/test-skia.js +0 -0
- package/dist/tests/test-skia.js.map +0 -0
- package/dist/tests/test-svg-parallax.d.ts +0 -0
- package/dist/tests/test-svg-parallax.d.ts.map +0 -0
- package/dist/tests/test-svg-parallax.js +0 -0
- package/dist/tests/test-svg-parallax.js.map +0 -0
- package/dist/tests/test-svg-rerasterization.d.ts +0 -0
- package/dist/tests/test-svg-rerasterization.d.ts.map +0 -0
- package/dist/tests/test-svg-rerasterization.js +194 -4
- package/dist/tests/test-svg-rerasterization.js.map +1 -1
- package/dist/tests/test-teen-tank-rig.d.ts +12 -0
- package/dist/tests/test-teen-tank-rig.d.ts.map +1 -0
- package/dist/tests/test-teen-tank-rig.js +122 -0
- package/dist/tests/test-teen-tank-rig.js.map +1 -0
- package/dist/tests/test-torso-pivot.d.ts +0 -0
- package/dist/tests/test-torso-pivot.d.ts.map +0 -0
- package/dist/tests/test-torso-pivot.js +0 -0
- package/dist/tests/test-torso-pivot.js.map +0 -0
- package/dist/tests/test-visual-verification.d.ts +0 -0
- package/dist/tests/test-visual-verification.d.ts.map +0 -0
- package/dist/tests/test-visual-verification.js +0 -0
- package/dist/tests/test-visual-verification.js.map +0 -0
- package/dist/types.d.ts +0 -0
- package/dist/types.d.ts.map +0 -0
- package/dist/types.js +0 -0
- package/dist/types.js.map +0 -0
- package/package.json +104 -106
- package/assets/presets/jumping-jack.json +0 -194
package/assets/tank.json
CHANGED
|
File without changes
|
package/dist/cli/animate.d.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/cli/animate.js
CHANGED
|
File without changes
|
package/dist/cli/animate.js.map
CHANGED
|
File without changes
|
package/dist/cli/diff.d.ts
CHANGED
|
File without changes
|
package/dist/cli/diff.d.ts.map
CHANGED
|
File without changes
|
package/dist/cli/diff.js
CHANGED
|
File without changes
|
package/dist/cli/diff.js.map
CHANGED
|
File without changes
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Commands:
|
|
6
6
|
* render <rig.json> Render rig to PNG + JSON report
|
|
7
7
|
* verify <rig.json> Math-based sanity checks (no rendering)
|
|
8
|
+
* explode <rig.json> Render exploded rig-view PNG
|
|
8
9
|
* animate <rig.json> <animation.json> Render animation frames + manifest
|
|
9
10
|
* diff <before.png> <after.png> Pixel-diff two images
|
|
10
11
|
* query <image|rig> --prompt "..." Send to Gemini for visual analysis
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distark-check.d.ts","sourceRoot":"","sources":["../../cli/distark-check.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"distark-check.d.ts","sourceRoot":"","sources":["../../cli/distark-check.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Commands:
|
|
6
6
|
* render <rig.json> Render rig to PNG + JSON report
|
|
7
7
|
* verify <rig.json> Math-based sanity checks (no rendering)
|
|
8
|
+
* explode <rig.json> Render exploded rig-view PNG
|
|
8
9
|
* animate <rig.json> <animation.json> Render animation frames + manifest
|
|
9
10
|
* diff <before.png> <after.png> Pixel-diff two images
|
|
10
11
|
* query <image|rig> --prompt "..." Send to Gemini for visual analysis
|
|
@@ -17,10 +18,12 @@ import { runQuery } from './query.js';
|
|
|
17
18
|
import { runRecord } from './record.js';
|
|
18
19
|
import { runTest } from './test.js';
|
|
19
20
|
import { runScene } from './scene.js';
|
|
21
|
+
import { runExplode } from './explode.js';
|
|
20
22
|
const USAGE = `distark-check - CLI tool for LLM-driven rig testing
|
|
21
23
|
|
|
22
24
|
Commands:
|
|
23
25
|
render <rig.json> [-o out.png] [--width N] [--height N] [--report]
|
|
26
|
+
explode <rig.json> [-o out.png] [--strength N] [--padding N] [--gap N] [--width N] [--height N]
|
|
24
27
|
verify <rig.json> [--checks all|bounds,visibility,proportions,zorder]
|
|
25
28
|
animate <rig.json> <animation.json> [-o frames/] [--width N] [--height N]
|
|
26
29
|
scene <world.json> [--time 0] [--chars a.json,b.json] [-o out.png] [--report]
|
|
@@ -45,6 +48,9 @@ async function main() {
|
|
|
45
48
|
case 'verify':
|
|
46
49
|
await runVerify(commandArgs);
|
|
47
50
|
break;
|
|
51
|
+
case 'explode':
|
|
52
|
+
await runExplode(commandArgs);
|
|
53
|
+
break;
|
|
48
54
|
case 'animate':
|
|
49
55
|
await runAnimate(commandArgs);
|
|
50
56
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distark-check.js","sourceRoot":"","sources":["../../cli/distark-check.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"distark-check.js","sourceRoot":"","sources":["../../cli/distark-check.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;CAiBb,CAAC;AAEF,KAAK,UAAU,IAAI;IACf,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAElC,QAAQ,OAAO,EAAE,CAAC;QACd,KAAK,QAAQ;YACT,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7B,MAAM;QACV,KAAK,QAAQ;YACT,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7B,MAAM;QACV,KAAK,SAAS;YACV,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9B,MAAM;QACV,KAAK,SAAS;YACV,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9B,MAAM;QACV,KAAK,MAAM;YACP,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;YAC3B,MAAM;QACV,KAAK,OAAO;YACR,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC5B,MAAM;QACV,KAAK,OAAO;YACR,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC5B,MAAM;QACV,KAAK,QAAQ;YACT,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7B,MAAM;QACV,KAAK,MAAM;YACP,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;YAC3B,MAAM;QACV;YACI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* explode command - Render an exploded rig view to PNG
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* distark-check explode <rig.json> [-o output.png] [--strength N] [--padding N] [--gap N] [--width N] [--height N]
|
|
6
|
+
*/
|
|
7
|
+
export declare function runExplode(args: string[]): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=explode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explode.d.ts","sourceRoot":"","sources":["../../cli/explode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkSH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C9D"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* explode command - Render an exploded rig view to PNG
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* distark-check explode <rig.json> [-o output.png] [--strength N] [--padding N] [--gap N] [--width N] [--height N]
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from 'fs/promises';
|
|
8
|
+
import { SkiaRenderer } from '../modules/adapters/skiaRenderer.js';
|
|
9
|
+
function computeBounds(objects) {
|
|
10
|
+
let minX = Infinity;
|
|
11
|
+
let minY = Infinity;
|
|
12
|
+
let maxX = -Infinity;
|
|
13
|
+
let maxY = -Infinity;
|
|
14
|
+
for (const obj of objects) {
|
|
15
|
+
const left = obj.x - obj.width * obj.anchorX;
|
|
16
|
+
const top = obj.y - obj.height * obj.anchorY;
|
|
17
|
+
const right = left + obj.width;
|
|
18
|
+
const bottom = top + obj.height;
|
|
19
|
+
if (left < minX)
|
|
20
|
+
minX = left;
|
|
21
|
+
if (top < minY)
|
|
22
|
+
minY = top;
|
|
23
|
+
if (right > maxX)
|
|
24
|
+
maxX = right;
|
|
25
|
+
if (bottom > maxY)
|
|
26
|
+
maxY = bottom;
|
|
27
|
+
}
|
|
28
|
+
return { minX, minY, maxX, maxY };
|
|
29
|
+
}
|
|
30
|
+
function getObjectCenter(obj) {
|
|
31
|
+
return {
|
|
32
|
+
x: obj.x + (0.5 - obj.anchorX) * obj.width,
|
|
33
|
+
y: obj.y + (0.5 - obj.anchorY) * obj.height,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function setObjectCenter(obj, cx, cy) {
|
|
37
|
+
return {
|
|
38
|
+
...obj,
|
|
39
|
+
x: cx - (0.5 - obj.anchorX) * obj.width,
|
|
40
|
+
y: cy - (0.5 - obj.anchorY) * obj.height,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function isLegPart(name) {
|
|
44
|
+
return /thigh|leg|foot/i.test(name);
|
|
45
|
+
}
|
|
46
|
+
const LEVEL_ALIGNED_PAIRS = [
|
|
47
|
+
['leftUpperArm', 'rightUpperArm'],
|
|
48
|
+
['leftForearm', 'rightForearm'],
|
|
49
|
+
['leftHand', 'rightHand'],
|
|
50
|
+
['leftThigh', 'rightThigh'],
|
|
51
|
+
['leftLeg', 'rightLeg'],
|
|
52
|
+
];
|
|
53
|
+
function createLevelLockedNameSet() {
|
|
54
|
+
const locked = new Set();
|
|
55
|
+
for (const [left, right] of LEVEL_ALIGNED_PAIRS) {
|
|
56
|
+
locked.add(left);
|
|
57
|
+
locked.add(right);
|
|
58
|
+
}
|
|
59
|
+
return locked;
|
|
60
|
+
}
|
|
61
|
+
function enforcePairLevelAlignment(objects, pairs) {
|
|
62
|
+
const byName = new Map();
|
|
63
|
+
objects.forEach((obj, idx) => byName.set(obj.name, idx));
|
|
64
|
+
for (const [leftName, rightName] of pairs) {
|
|
65
|
+
const leftIdx = byName.get(leftName);
|
|
66
|
+
const rightIdx = byName.get(rightName);
|
|
67
|
+
if (leftIdx === undefined || rightIdx === undefined)
|
|
68
|
+
continue;
|
|
69
|
+
const left = objects[leftIdx];
|
|
70
|
+
const right = objects[rightIdx];
|
|
71
|
+
const leftCenter = getObjectCenter(left);
|
|
72
|
+
const rightCenter = getObjectCenter(right);
|
|
73
|
+
const sharedY = (leftCenter.y + rightCenter.y) / 2;
|
|
74
|
+
objects[leftIdx] = setObjectCenter(left, leftCenter.x, sharedY);
|
|
75
|
+
objects[rightIdx] = setObjectCenter(right, rightCenter.x, sharedY);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function stackChainVertically(objectMap, names, centerX, startCenterY, gap, outputCenters) {
|
|
79
|
+
let cursorY = startCenterY;
|
|
80
|
+
for (let i = 0; i < names.length; i++) {
|
|
81
|
+
const current = objectMap.get(names[i]);
|
|
82
|
+
if (!current)
|
|
83
|
+
continue;
|
|
84
|
+
if (i > 0) {
|
|
85
|
+
const prev = objectMap.get(names[i - 1]);
|
|
86
|
+
if (prev) {
|
|
87
|
+
cursorY += prev.height / 2 + current.height / 2 + gap;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
outputCenters.set(current.name, { x: centerX, y: cursorY });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function buildSemanticCenters(objects, strength, minGap) {
|
|
94
|
+
const byName = new Map(objects.map(obj => [obj.name, obj]));
|
|
95
|
+
const centers = new Map();
|
|
96
|
+
const torso = byName.get('torso');
|
|
97
|
+
const baseBounds = computeBounds(objects);
|
|
98
|
+
const globalCenterX = (baseBounds.minX + baseBounds.maxX) / 2;
|
|
99
|
+
const globalCenterY = (baseBounds.minY + baseBounds.maxY) / 2;
|
|
100
|
+
const torsoCenter = torso ? getObjectCenter(torso) : { x: globalCenterX, y: globalCenterY };
|
|
101
|
+
const torsoHalfW = torso?.width ? torso.width / 2 : (baseBounds.maxX - baseBounds.minX) * 0.2;
|
|
102
|
+
const torsoHalfH = torso?.height ? torso.height / 2 : (baseBounds.maxY - baseBounds.minY) * 0.2;
|
|
103
|
+
const torsoTop = torsoCenter.y - torsoHalfH;
|
|
104
|
+
const torsoBottom = torsoCenter.y + torsoHalfH;
|
|
105
|
+
const chainGap = minGap + strength * 0.08;
|
|
106
|
+
// Keep torso as anchor in the middle of the exploded diagram.
|
|
107
|
+
if (torso) {
|
|
108
|
+
centers.set('torso', torsoCenter);
|
|
109
|
+
}
|
|
110
|
+
// Head sits directly above torso.
|
|
111
|
+
const head = byName.get('head');
|
|
112
|
+
let newHeadCenter = null;
|
|
113
|
+
if (head) {
|
|
114
|
+
newHeadCenter = {
|
|
115
|
+
x: torsoCenter.x,
|
|
116
|
+
y: torsoTop - head.height / 2 - (minGap + strength * 0.25),
|
|
117
|
+
};
|
|
118
|
+
centers.set('head', newHeadCenter);
|
|
119
|
+
}
|
|
120
|
+
// Keep face parts aligned with head by preserving their original local offset.
|
|
121
|
+
if (head && newHeadCenter) {
|
|
122
|
+
const oldHeadCenter = getObjectCenter(head);
|
|
123
|
+
const faceParts = ['mouth', 'leftEye', 'rightEye', 'leftIris', 'rightIris', 'leftEyeLid', 'rightEyeLid'];
|
|
124
|
+
for (const name of faceParts) {
|
|
125
|
+
const part = byName.get(name);
|
|
126
|
+
if (!part)
|
|
127
|
+
continue;
|
|
128
|
+
const oldCenter = getObjectCenter(part);
|
|
129
|
+
centers.set(name, {
|
|
130
|
+
x: newHeadCenter.x + (oldCenter.x - oldHeadCenter.x),
|
|
131
|
+
y: newHeadCenter.y + (oldCenter.y - oldHeadCenter.y),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Arms as two aligned vertical chains.
|
|
136
|
+
const leftArm = ['leftUpperArm', 'leftForearm', 'leftHand'];
|
|
137
|
+
const rightArm = ['rightUpperArm', 'rightForearm', 'rightHand'];
|
|
138
|
+
const armOffset = torsoHalfW + minGap + strength * 0.9;
|
|
139
|
+
const armStartY = torsoTop + (byName.get('leftUpperArm')?.height || byName.get('rightUpperArm')?.height || 120) / 2;
|
|
140
|
+
stackChainVertically(byName, leftArm, torsoCenter.x + armOffset, armStartY, chainGap, centers);
|
|
141
|
+
stackChainVertically(byName, rightArm, torsoCenter.x - armOffset, armStartY, chainGap, centers);
|
|
142
|
+
// Legs as two aligned vertical chains below torso.
|
|
143
|
+
const leftLeg = ['leftThigh', 'leftLeg'];
|
|
144
|
+
const rightLeg = ['rightThigh', 'rightLeg'];
|
|
145
|
+
const legOffset = Math.max(50, torsoHalfW * 0.4) + strength * 0.2;
|
|
146
|
+
const firstLegHeight = byName.get('leftThigh')?.height || byName.get('rightThigh')?.height || 160;
|
|
147
|
+
const legStartY = torsoBottom + minGap + strength * 0.3 + firstLegHeight / 2;
|
|
148
|
+
stackChainVertically(byName, leftLeg, torsoCenter.x - legOffset, legStartY, chainGap, centers);
|
|
149
|
+
stackChainVertically(byName, rightLeg, torsoCenter.x + legOffset, legStartY, chainGap, centers);
|
|
150
|
+
return centers;
|
|
151
|
+
}
|
|
152
|
+
function separateOverlaps(objects, minGap, iterations, levelLockedNames) {
|
|
153
|
+
const epsilon = 0.05;
|
|
154
|
+
for (let pass = 0; pass < iterations; pass++) {
|
|
155
|
+
let moved = false;
|
|
156
|
+
for (let i = 0; i < objects.length; i++) {
|
|
157
|
+
for (let j = i + 1; j < objects.length; j++) {
|
|
158
|
+
const a = objects[i];
|
|
159
|
+
const b = objects[j];
|
|
160
|
+
const ca = getObjectCenter(a);
|
|
161
|
+
const cb = getObjectCenter(b);
|
|
162
|
+
const dx = cb.x - ca.x;
|
|
163
|
+
const dy = cb.y - ca.y;
|
|
164
|
+
const requiredX = (a.width + b.width) / 2 + minGap;
|
|
165
|
+
const requiredY = (a.height + b.height) / 2 + minGap;
|
|
166
|
+
const penX = requiredX - Math.abs(dx);
|
|
167
|
+
const penY = requiredY - Math.abs(dy);
|
|
168
|
+
if (penX <= 0 || penY <= 0) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const preferVertical = (isLegPart(a.name) || isLegPart(b.name)) && penY > 0;
|
|
172
|
+
const yLocked = levelLockedNames.has(a.name) || levelLockedNames.has(b.name);
|
|
173
|
+
const resolveY = !yLocked && (preferVertical || penY < penX);
|
|
174
|
+
if (resolveY) {
|
|
175
|
+
const dirY = dy === 0 ? (j % 2 === 0 ? 1 : -1) : Math.sign(dy);
|
|
176
|
+
const shift = penY / 2 + epsilon;
|
|
177
|
+
a.y -= dirY * shift;
|
|
178
|
+
b.y += dirY * shift;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const dirX = dx === 0 ? (j % 2 === 0 ? 1 : -1) : Math.sign(dx);
|
|
182
|
+
const shift = penX / 2 + epsilon;
|
|
183
|
+
a.x -= dirX * shift;
|
|
184
|
+
b.x += dirX * shift;
|
|
185
|
+
}
|
|
186
|
+
moved = true;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (!moved) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function createExplodedLayout(objects, strength, padding, minGap) {
|
|
195
|
+
if (objects.length === 0) {
|
|
196
|
+
return {
|
|
197
|
+
objects: [],
|
|
198
|
+
canvasWidth: Math.max(1, Math.round(padding * 2)),
|
|
199
|
+
canvasHeight: Math.max(1, Math.round(padding * 2)),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
const semanticCenters = buildSemanticCenters(objects, strength, minGap);
|
|
203
|
+
const levelLockedNames = createLevelLockedNameSet();
|
|
204
|
+
const exploded = objects.map((obj, index) => {
|
|
205
|
+
const target = semanticCenters.get(obj.name);
|
|
206
|
+
if (target) {
|
|
207
|
+
return setObjectCenter(obj, target.x, target.y);
|
|
208
|
+
}
|
|
209
|
+
// Fallback for unknown parts: radial spread away from global center.
|
|
210
|
+
const bounds = computeBounds(objects);
|
|
211
|
+
const centerX = (bounds.minX + bounds.maxX) / 2;
|
|
212
|
+
const centerY = (bounds.minY + bounds.maxY) / 2;
|
|
213
|
+
const current = getObjectCenter(obj);
|
|
214
|
+
const dx = current.x - centerX;
|
|
215
|
+
const dy = current.y - centerY;
|
|
216
|
+
const length = Math.hypot(dx, dy);
|
|
217
|
+
const angle = (Math.PI * 2 * index) / Math.max(1, objects.length);
|
|
218
|
+
const dirX = length > 0.0001 ? dx / length : Math.cos(angle);
|
|
219
|
+
const dirY = length > 0.0001 ? dy / length : Math.sin(angle);
|
|
220
|
+
return setObjectCenter(obj, current.x + dirX * strength, current.y + dirY * strength);
|
|
221
|
+
});
|
|
222
|
+
// Guarantee a minimum visual spacing between object AABBs.
|
|
223
|
+
separateOverlaps(exploded, minGap, 240, levelLockedNames);
|
|
224
|
+
enforcePairLevelAlignment(exploded, LEVEL_ALIGNED_PAIRS);
|
|
225
|
+
// Re-run with Y-lock to preserve left/right alignment while resolving residual overlaps.
|
|
226
|
+
separateOverlaps(exploded, minGap, 60, levelLockedNames);
|
|
227
|
+
const explodedBounds = computeBounds(exploded);
|
|
228
|
+
const translateX = padding - explodedBounds.minX;
|
|
229
|
+
const translateY = padding - explodedBounds.minY;
|
|
230
|
+
const translatedObjects = exploded.map(obj => ({
|
|
231
|
+
...obj,
|
|
232
|
+
x: obj.x + translateX,
|
|
233
|
+
y: obj.y + translateY,
|
|
234
|
+
}));
|
|
235
|
+
return {
|
|
236
|
+
objects: translatedObjects,
|
|
237
|
+
canvasWidth: Math.max(1, Math.ceil(explodedBounds.maxX - explodedBounds.minX + padding * 2)),
|
|
238
|
+
canvasHeight: Math.max(1, Math.ceil(explodedBounds.maxY - explodedBounds.minY + padding * 2)),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
export async function runExplode(args) {
|
|
242
|
+
const inputFile = args.find(a => !a.startsWith('-')) || '';
|
|
243
|
+
if (!inputFile) {
|
|
244
|
+
console.error('Usage: distark-check explode <rig.json> [-o output.png] [--strength N] [--padding N] [--gap N] [--width N] [--height N]');
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
const outputIdx = args.indexOf('-o');
|
|
248
|
+
const outputFile = outputIdx !== -1 ? args[outputIdx + 1] : inputFile.replace(/\.json$/, '.exploded.png');
|
|
249
|
+
const strength = parseFloat(args[args.indexOf('--strength') + 1]) || 60;
|
|
250
|
+
const padding = parseInt(args[args.indexOf('--padding') + 1], 10) || 40;
|
|
251
|
+
const minGap = parseInt(args[args.indexOf('--gap') + 1], 10) || 24;
|
|
252
|
+
const width = parseInt(args[args.indexOf('--width') + 1], 10) || 1000;
|
|
253
|
+
const height = parseInt(args[args.indexOf('--height') + 1], 10) || 1000;
|
|
254
|
+
const rigData = JSON.parse(await readFile(inputFile, 'utf-8'));
|
|
255
|
+
// Redirect console.log to stderr during image loading (SkiaImageLoader logs progress).
|
|
256
|
+
const origLog = console.log;
|
|
257
|
+
console.log = (...a) => console.error(...a);
|
|
258
|
+
try {
|
|
259
|
+
const renderer = new SkiaRenderer();
|
|
260
|
+
await renderer.loadImages(rigData);
|
|
261
|
+
const fit = renderer.computeAutoFit(rigData, {
|
|
262
|
+
canvasWidth: width,
|
|
263
|
+
canvasHeight: height,
|
|
264
|
+
loadedImages: renderer.getLoadedImages(),
|
|
265
|
+
});
|
|
266
|
+
const exploded = createExplodedLayout(fit.renderData.objects, strength, padding, minGap);
|
|
267
|
+
const canvas = await renderer.createCanvas(exploded.canvasWidth, exploded.canvasHeight);
|
|
268
|
+
const ctx = canvas.getContext('2d');
|
|
269
|
+
ctx.fillStyle = '#f0f0f0';
|
|
270
|
+
ctx.fillRect(0, 0, exploded.canvasWidth, exploded.canvasHeight);
|
|
271
|
+
renderer.renderObjects(ctx, exploded.objects, false, []);
|
|
272
|
+
const buffer = await canvas.toBuffer('image/png');
|
|
273
|
+
const fs = await import('fs/promises');
|
|
274
|
+
await fs.writeFile(outputFile, buffer);
|
|
275
|
+
console.error(`Exploded render: ${outputFile} (${exploded.canvasWidth}x${exploded.canvasHeight}, strength=${strength}, gap=${minGap})`);
|
|
276
|
+
}
|
|
277
|
+
finally {
|
|
278
|
+
// Restore console.log
|
|
279
|
+
console.log = origLog;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=explode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explode.js","sourceRoot":"","sources":["../../cli/explode.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/query.d.ts
CHANGED
|
File without changes
|
package/dist/cli/query.d.ts.map
CHANGED
|
File without changes
|
package/dist/cli/query.js
CHANGED
|
File without changes
|
package/dist/cli/query.js.map
CHANGED
|
File without changes
|
package/dist/cli/record.d.ts
CHANGED
|
File without changes
|
package/dist/cli/record.d.ts.map
CHANGED
|
File without changes
|
package/dist/cli/record.js
CHANGED
|
File without changes
|
package/dist/cli/record.js.map
CHANGED
|
File without changes
|
package/dist/cli/render.d.ts
CHANGED
|
File without changes
|
package/dist/cli/render.d.ts.map
CHANGED
|
File without changes
|
package/dist/cli/render.js
CHANGED
|
File without changes
|
package/dist/cli/render.js.map
CHANGED
|
File without changes
|
package/dist/cli/scene.d.ts
CHANGED
|
File without changes
|
package/dist/cli/scene.d.ts.map
CHANGED
|
File without changes
|
package/dist/cli/scene.js
CHANGED
|
@@ -71,22 +71,22 @@ async function loadRigDataMap(world, charsArg) {
|
|
|
71
71
|
export async function runScene(args) {
|
|
72
72
|
const inputFile = args.find(a => !a.startsWith('-')) || '';
|
|
73
73
|
if (!inputFile) {
|
|
74
|
-
console.error(`Usage:
|
|
75
|
-
distark-check scene <world.json> [--time 0] [-o output.png] [--report]
|
|
76
|
-
distark-check scene <world.json> --keyframes [--frames 5] [-o frames/]
|
|
77
|
-
distark-check scene <world.json> --video [-o output.mp4] [--fps 30]
|
|
78
|
-
|
|
79
|
-
Options:
|
|
80
|
-
--time <seconds> Time to evaluate (default: 0)
|
|
81
|
-
--chars <files> Comma-separated rig files: id=path or path (optional if embedded)
|
|
82
|
-
--keyframes Render key frames across scene duration
|
|
83
|
-
--video Render all frames and assemble into MP4 via ffmpeg
|
|
84
|
-
--frames <count> Key frame count (default: 5, used with --keyframes)
|
|
85
|
-
--fps <number> Frames per second for --video (default: 30)
|
|
86
|
-
--width <pixels> Output width (default: 2560)
|
|
87
|
-
--height <pixels> Output height (default: 1440)
|
|
88
|
-
-o <path> Output file or directory
|
|
89
|
-
--state Print scene state as JSON (no rendering)
|
|
74
|
+
console.error(`Usage:
|
|
75
|
+
distark-check scene <world.json> [--time 0] [-o output.png] [--report]
|
|
76
|
+
distark-check scene <world.json> --keyframes [--frames 5] [-o frames/]
|
|
77
|
+
distark-check scene <world.json> --video [-o output.mp4] [--fps 30]
|
|
78
|
+
|
|
79
|
+
Options:
|
|
80
|
+
--time <seconds> Time to evaluate (default: 0)
|
|
81
|
+
--chars <files> Comma-separated rig files: id=path or path (optional if embedded)
|
|
82
|
+
--keyframes Render key frames across scene duration
|
|
83
|
+
--video Render all frames and assemble into MP4 via ffmpeg
|
|
84
|
+
--frames <count> Key frame count (default: 5, used with --keyframes)
|
|
85
|
+
--fps <number> Frames per second for --video (default: 30)
|
|
86
|
+
--width <pixels> Output width (default: 2560)
|
|
87
|
+
--height <pixels> Output height (default: 1440)
|
|
88
|
+
-o <path> Output file or directory
|
|
89
|
+
--state Print scene state as JSON (no rendering)
|
|
90
90
|
--report Save report JSON alongside output`);
|
|
91
91
|
process.exit(1);
|
|
92
92
|
}
|
package/dist/cli/scene.js.map
CHANGED
|
File without changes
|
package/dist/cli/shared.d.ts
CHANGED
|
File without changes
|
package/dist/cli/shared.d.ts.map
CHANGED
|
File without changes
|
package/dist/cli/shared.js
CHANGED
|
File without changes
|
package/dist/cli/shared.js.map
CHANGED
|
File without changes
|
package/dist/cli/test.d.ts
CHANGED
|
File without changes
|
package/dist/cli/test.d.ts.map
CHANGED
|
File without changes
|
package/dist/cli/test.js
CHANGED
|
File without changes
|
package/dist/cli/test.js.map
CHANGED
|
File without changes
|
package/dist/cli/verify.d.ts
CHANGED
|
File without changes
|
package/dist/cli/verify.d.ts.map
CHANGED
|
File without changes
|
package/dist/cli/verify.js
CHANGED
|
File without changes
|
package/dist/cli/verify.js.map
CHANGED
|
File without changes
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"p5Renderer.d.ts","sourceRoot":"","sources":["../../../modules/adapters/p5Renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5E,KAAK,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAEhF;;;GAGG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC1C,OAAO,CAAC,EAAE,CAAM;gBAEJ,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM;IAK9C;;;OAGG;IACH,SAAS,CACL,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,EACxC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,KAAK,IAAI,GACvD,IAAI;
|
|
1
|
+
{"version":3,"file":"p5Renderer.d.ts","sourceRoot":"","sources":["../../../modules/adapters/p5Renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5E,KAAK,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAEhF;;;GAGG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC1C,OAAO,CAAC,EAAE,CAAM;gBAEJ,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM;IAK9C;;;OAGG;IACH,SAAS,CACL,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,EACxC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,KAAK,IAAI,GACvD,IAAI;IAyGP;;;;OAIG;IACG,gBAAgB,CAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,GAAE,OAAc,EACxB,UAAU,CAAC,EAAE,gBAAgB,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAwClC;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAW,SAAQ,oBAAoB;IAChD,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,OAAO,CAAkB;gBAErB,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM;IAM9C;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjD;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa;IAe1E;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,UAAU,GAAE,OAAe,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI;IAyCrF;;;;;;OAMG;IACH,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,UAAU,GAAE,OAAe,GAAG,IAAI;IAKhG;;OAEG;IACH,KAAK,IAAI,OAAO;IAIhB;;OAEG;IACH,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAGzC"}
|
|
@@ -35,11 +35,33 @@ export class P5ImageLoader extends ImageLoader {
|
|
|
35
35
|
try {
|
|
36
36
|
const prepared = await this.prepareResolvedAsset(imageUrl);
|
|
37
37
|
if (prepared?.kind === 'svg') {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
// Primary path: rasterize SVG to canvas so Body can attach pose handles.
|
|
39
|
+
// If canvas creation fails (e.g. complex SVG, jsdom limitations), fall back
|
|
40
|
+
// to p5.loadImage with an inline data URI so the SVG metadata is preserved
|
|
41
|
+
// even when the offscreen-canvas route is unavailable.
|
|
42
|
+
try {
|
|
43
|
+
const canvas = await this.createSvgCanvas(prepared.svgSource, prepared.intrinsicWidth, prepared.intrinsicHeight);
|
|
44
|
+
this.attachSvgMetadata(canvas, prepared.svgSource, prepared.intrinsicWidth, prepared.intrinsicHeight, prepared.intrinsicWidth, prepared.intrinsicHeight);
|
|
45
|
+
this.cacheImage(key, canvas);
|
|
46
|
+
if (onLoad)
|
|
47
|
+
onLoad(key, canvas);
|
|
48
|
+
}
|
|
49
|
+
catch (svgCanvasErr) {
|
|
50
|
+
// createSvgCanvas failed — fall back to p5.loadImage with a data URI
|
|
51
|
+
// so the SVG source is preserved as __distarkSvgSource for pose morphing.
|
|
52
|
+
console.warn(`createSvgCanvas failed for ${key}, falling back to p5.loadImage with SVG data URI:`, svgCanvasErr instanceof Error ? svgCanvasErr.message : svgCanvasErr);
|
|
53
|
+
const svgDataUri = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(prepared.svgSource)}`;
|
|
54
|
+
this.p5.loadImage(svgDataUri, (img) => {
|
|
55
|
+
this.attachSvgMetadata(img, prepared.svgSource, prepared.intrinsicWidth, prepared.intrinsicHeight, prepared.intrinsicWidth, prepared.intrinsicHeight);
|
|
56
|
+
this.cacheImage(key, img);
|
|
57
|
+
if (onLoad)
|
|
58
|
+
onLoad(key, img);
|
|
59
|
+
}, (p5SvgErr) => {
|
|
60
|
+
console.error(`Failed to load SVG for ${key} via p5.loadImage:`, p5SvgErr);
|
|
61
|
+
if (onError)
|
|
62
|
+
onError(key, p5SvgErr);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
43
65
|
return;
|
|
44
66
|
}
|
|
45
67
|
const loadUrl = prepared?.kind === 'blob' ? prepared.objectUrl : imageUrl;
|
|
@@ -50,19 +72,29 @@ export class P5ImageLoader extends ImageLoader {
|
|
|
50
72
|
}
|
|
51
73
|
if (onLoad)
|
|
52
74
|
onLoad(key, img);
|
|
53
|
-
}, (
|
|
75
|
+
}, (loadErr) => {
|
|
54
76
|
if (prepared?.kind === 'blob') {
|
|
55
77
|
URL.revokeObjectURL(prepared.objectUrl);
|
|
56
78
|
}
|
|
57
|
-
console.error(`Failed to load ${key}:`,
|
|
79
|
+
console.error(`Failed to load ${key}:`, loadErr);
|
|
58
80
|
if (onError)
|
|
59
|
-
onError(key,
|
|
81
|
+
onError(key, loadErr);
|
|
60
82
|
});
|
|
61
83
|
}
|
|
62
84
|
catch (err) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
85
|
+
// prepareResolvedAsset failed (e.g. fetch blocked by CORS on a CDN redirect).
|
|
86
|
+
// Fall back to p5.loadImage which uses a DOM Image element and may succeed
|
|
87
|
+
// where fetch() cannot (different CORS handling, SVG rendered by the browser).
|
|
88
|
+
console.warn(`prepareResolvedAsset failed for ${key}, falling back to p5.loadImage:`, err instanceof Error ? err.message : err);
|
|
89
|
+
this.p5.loadImage(imageUrl, (img) => {
|
|
90
|
+
this.cacheImage(key, img);
|
|
91
|
+
if (onLoad)
|
|
92
|
+
onLoad(key, img);
|
|
93
|
+
}, (fallbackErr) => {
|
|
94
|
+
console.error(`Failed to load ${key} (both fetch and p5.loadImage failed):`, fallbackErr);
|
|
95
|
+
if (onError)
|
|
96
|
+
onError(key, fallbackErr instanceof Error ? fallbackErr.message : fallbackErr);
|
|
97
|
+
});
|
|
66
98
|
}
|
|
67
99
|
})();
|
|
68
100
|
}
|
|
@@ -163,7 +195,17 @@ export class P5Renderer extends CharacterRigRenderer {
|
|
|
163
195
|
this.p5.scale(obj.scaleX, obj.scaleY);
|
|
164
196
|
const drawX = -obj.width * obj.anchorX;
|
|
165
197
|
const drawY = -obj.height * obj.anchorY;
|
|
166
|
-
|
|
198
|
+
// p5.js v2 silently ignores raw HTMLCanvasElement / HTMLImageElement passed to
|
|
199
|
+
// p5.image(). Use the underlying 2D context directly — it inherits the current
|
|
200
|
+
// transform matrix already applied by translate/rotate/scale above.
|
|
201
|
+
const imgData = obj.imageData;
|
|
202
|
+
if ((typeof HTMLCanvasElement !== 'undefined' && imgData instanceof HTMLCanvasElement) ||
|
|
203
|
+
(typeof HTMLImageElement !== 'undefined' && imgData instanceof HTMLImageElement)) {
|
|
204
|
+
this.p5.drawingContext.drawImage(imgData, drawX, drawY, obj.width, obj.height);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
this.p5.image(imgData, drawX, drawY, obj.width, obj.height);
|
|
208
|
+
}
|
|
167
209
|
this.p5.pop();
|
|
168
210
|
});
|
|
169
211
|
// Draw pivot points if requested
|