@flighthq/skeleton3d 0.2.1-next.738.07b221d → 0.2.1-next.841.373388f
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/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/prepareScene3DSkinning.d.ts +4 -0
- package/dist/prepareScene3DSkinning.d.ts.map +1 -0
- package/dist/{prepareSceneSkinning.js → prepareScene3DSkinning.js} +8 -8
- package/dist/prepareScene3DSkinning.js.map +1 -0
- package/dist/skeleton3d.d.ts +3 -3
- package/dist/skeleton3d.d.ts.map +1 -1
- package/dist/skeleton3d.js +1 -1
- package/dist/skeleton3d.js.map +1 -1
- package/dist/skinMeshGeometry.js +1 -1
- package/dist/skinMeshGeometry.js.map +1 -1
- package/dist/updateMeshDeformation.js +1 -1
- package/dist/updateMeshDeformation.js.map +1 -1
- package/dist/updateMeshSkin.js +1 -1
- package/dist/updateMeshSkin.js.map +1 -1
- package/package.json +7 -7
- package/src/{prepareSceneSkinning.test.ts → prepareScene3DSkinning.test.ts} +10 -10
- package/src/skeleton3d.test.ts +28 -28
- package/src/skinMeshGeometry.test.ts +3 -3
- package/src/updateMeshDeformation.test.ts +3 -3
- package/src/updateMeshSkin.test.ts +3 -3
- package/dist/prepareSceneSkinning.d.ts +0 -4
- package/dist/prepareSceneSkinning.d.ts.map +0 -1
- package/dist/prepareSceneSkinning.js.map +0 -1
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareScene3DSkinning.d.ts","sourceRoot":"","sources":["../src/prepareScene3DSkinning.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAe,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAwBlE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAoB9D;AAcD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAcrE"}
|
|
@@ -21,7 +21,7 @@ import { captureMeshSkinBindPose } from './skinMeshGeometry';
|
|
|
21
21
|
// The sweep is joint-driven, not per-vertex: getMeshSkinConservativeBounds unions the rest box
|
|
22
22
|
// transformed by each referenced joint's palette matrix, costing one box-transform per joint rather
|
|
23
23
|
// than an O(vertices) pass — cheap enough to run before the cull, which is the only ordering that culls
|
|
24
|
-
// a posed mesh correctly. This is the per-mesh primitive;
|
|
24
|
+
// a posed mesh correctly. This is the per-mesh primitive; prepareScene3DSkinning drives a whole scene.
|
|
25
25
|
export function prepareMeshSkinning(mesh) {
|
|
26
26
|
const skin = mesh.skin;
|
|
27
27
|
if (skin == null)
|
|
@@ -42,18 +42,18 @@ export function prepareMeshSkinning(mesh) {
|
|
|
42
42
|
getMeshSkinConservativeBounds(bounds, bindPose, skin.skeleton);
|
|
43
43
|
}
|
|
44
44
|
// Runs prepareMeshSkinning over every enabled mesh in the subtree rooted at `scene` — the per-frame
|
|
45
|
-
// skinning-prep pass. Call it BEFORE
|
|
45
|
+
// skinning-prep pass. Call it BEFORE prepareScene3DRender: the render prepare pass culls against the
|
|
46
46
|
// posed bounds this writes, so driving it afterwards would cull one frame stale. A skinned+morphed app
|
|
47
|
-
// also calls the morph pass (
|
|
47
|
+
// also calls the morph pass (prepareScene3DMorph in @flighthq/scene3d); the two are independent so each
|
|
48
48
|
// deformer's consumers pay only for the pass they use — a morph-only app never imports this package.
|
|
49
49
|
//
|
|
50
|
-
// This is a separate caller-invoked pass rather than something
|
|
50
|
+
// This is a separate caller-invoked pass rather than something prepareScene3DRender does itself so that
|
|
51
51
|
// @flighthq/render never depends on @flighthq/skeleton3d: cull consumes the posed bounds as plain data
|
|
52
52
|
// off the node runtime, and a rigid or 2D bundle pays nothing for skinning it does not use. The walk
|
|
53
53
|
// itself needs only @flighthq/node + @flighthq/mesh (both already skeleton3d dependencies), so it
|
|
54
|
-
// carries no @flighthq/
|
|
54
|
+
// carries no @flighthq/scene3d dependency at all. A scene with no skinned meshes may skip this call; it
|
|
55
55
|
// is a no-op for rigid meshes, and disabled subtrees are skipped whole (matching the render walk).
|
|
56
|
-
export function
|
|
56
|
+
export function prepareScene3DSkinning(scene) {
|
|
57
57
|
if (!scene.enabled)
|
|
58
58
|
return;
|
|
59
59
|
// Structural mesh test (carries geometry), so it holds for meshes created with a custom kind — the
|
|
@@ -64,8 +64,8 @@ export function prepareSceneSkinning(scene) {
|
|
|
64
64
|
const children = getNodeRuntime(scene).children;
|
|
65
65
|
if (children !== null) {
|
|
66
66
|
for (let i = 0; i < children.length; i++) {
|
|
67
|
-
|
|
67
|
+
prepareScene3DSkinning(children[i]);
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
//# sourceMappingURL=
|
|
71
|
+
//# sourceMappingURL=prepareScene3DSkinning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareScene3DSkinning.js","sourceRoot":"","sources":["../src/prepareScene3DSkinning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,sGAAsG;AACtG,uGAAuG;AACvG,uFAAuF;AACvF,gGAAgG;AAChG,0FAA0F;AAC1F,EAAE;AACF,sGAAsG;AACtG,uGAAuG;AACvG,wGAAwG;AACxG,qGAAqG;AACrG,uGAAuG;AACvG,oGAAoG;AACpG,sDAAsD;AACtD,EAAE;AACF,+FAA+F;AAC/F,oGAAoG;AACpG,wGAAwG;AACxG,uGAAuG;AACvG,MAAM,UAAU,mBAAmB,CAAC,IAAoB;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO;IAEzB,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,QAAQ,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAC7C,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAe,CAAgB,CAAC;IAC/D,IAAI,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IACzC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,GAAG,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,mBAAmB,GAAG,MAAM,CAAC;IACvC,CAAC;IACD,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,oGAAoG;AACpG,qGAAqG;AACrG,uGAAuG;AACvG,wGAAwG;AACxG,qGAAqG;AACrG,EAAE;AACF,wGAAwG;AACxG,uGAAuG;AACvG,qGAAqG;AACrG,kGAAkG;AAClG,wGAAwG;AACxG,mGAAmG;AACnG,MAAM,UAAU,sBAAsB,CAAC,KAAwB;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO;IAE3B,mGAAmG;IACnG,iDAAiD;IACjD,MAAM,IAAI,GAAG,KAAwB,CAAC;IACtC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI;QAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;IAChD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/skeleton3d.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { Matrix4Like,
|
|
1
|
+
import type { Matrix4Like, Node3D, Skeleton3D, Skeleton3DValidationDiagnostic } from '@flighthq/types';
|
|
2
2
|
export declare function cloneSkeleton3D(skeleton: Readonly<Skeleton3D>): Skeleton3D;
|
|
3
|
-
export declare function cloneSkeleton3DJointHierarchy(skeleton: Readonly<Skeleton3D>, cloneJoint: (joint: Readonly<
|
|
3
|
+
export declare function cloneSkeleton3DJointHierarchy(skeleton: Readonly<Skeleton3D>, cloneJoint: (joint: Readonly<Node3D>, jointIndex: number) => Node3D): Skeleton3D;
|
|
4
4
|
export declare function computeSkeleton3DJointMatrices(skeleton: Readonly<Skeleton3D>): void;
|
|
5
|
-
export declare function createSkeleton3D(joints:
|
|
5
|
+
export declare function createSkeleton3D(joints: Node3D[], inverseBindMatrices?: Float32Array, names?: readonly string[] | null): Skeleton3D;
|
|
6
6
|
export declare function disposeSkeleton3D(skeleton: Skeleton3D): void;
|
|
7
7
|
export declare function equalsSkeleton3D(a: Readonly<Skeleton3D>, b: Readonly<Skeleton3D>): boolean;
|
|
8
8
|
export declare function getSkeleton3DJointIndexByName(skeleton: Readonly<Skeleton3D>, name: string): number;
|
package/dist/skeleton3d.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skeleton3d.d.ts","sourceRoot":"","sources":["../src/skeleton3d.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"skeleton3d.d.ts","sourceRoot":"","sources":["../src/skeleton3d.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAEvG,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,UAAU,CAQ1E;AAOD,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC9B,UAAU,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,GAClE,UAAU,CAsBZ;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAQnF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EAAE,EAChB,mBAAmB,CAAC,EAAE,YAAY,EAClC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAC/B,UAAU,CAUZ;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAG5D;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,OAAO,CAe1F;AAED,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlG;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAKT;AAED,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC9B,IAAI,EAAE,MAAM,GACX,OAAO,CAET;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAM1E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,8BAA8B,GAAG,IAAI,CAWxG"}
|
package/dist/skeleton3d.js
CHANGED
|
@@ -10,7 +10,7 @@ export function cloneSkeleton3D(skeleton) {
|
|
|
10
10
|
});
|
|
11
11
|
return clone;
|
|
12
12
|
}
|
|
13
|
-
// Clones a skeleton and its joint-to-joint hierarchy without assuming that every
|
|
13
|
+
// Clones a skeleton and its joint-to-joint hierarchy without assuming that every Node3D kind is
|
|
14
14
|
// generically cloneable. `cloneJoint` is the one narrow policy seam: it must return a fresh detached
|
|
15
15
|
// node carrying the source joint's local pose/data. Parent links whose parent is another skeleton
|
|
16
16
|
// joint are rebuilt over the cloned nodes; a parent outside the joint set is intentionally left to
|
package/dist/skeleton3d.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skeleton3d.js","sourceRoot":"","sources":["../src/skeleton3d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGlF,MAAM,UAAU,eAAe,CAAC,QAA8B;IAC5D,MAAM,KAAK,GAAG,YAAY,CAAC;QACzB,mBAAmB,EAAE,IAAI,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACnE,aAAa,EAAE,IAAI,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC;QACvD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE;QAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE;KAC1G,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"skeleton3d.js","sourceRoot":"","sources":["../src/skeleton3d.ts"],"names":[],"mappings":"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"}
|
package/dist/skinMeshGeometry.js
CHANGED
|
@@ -60,7 +60,7 @@ export function captureMeshSkinBindPose(geometry) {
|
|
|
60
60
|
// first) into the bind pose's scratch, writes the skinned positions/normals back into the interleaved
|
|
61
61
|
// `geometry.vertices`, and bumps `geometry.version` so the backends re-upload. `bindPose` is the
|
|
62
62
|
// capture the caller holds on the geometry runtime; only the position/normal channels are rewritten,
|
|
63
|
-
// so tangent/uv0/joints0/weights0 stay intact.
|
|
63
|
+
// so tangent/uv0/joints0/weights0 stay intact. Scene3D-free by design — the node-level glue that owns
|
|
64
64
|
// the runtime slot and drives the palette is updateMeshSkin, beside this file.
|
|
65
65
|
export function skinMeshGeometry(geometry, skeleton, bindPose) {
|
|
66
66
|
skinVertices(bindPose.skinnedPositions, bindPose.skinnedNormals, bindPose.positions, bindPose.normals, bindPose.joints, bindPose.weights, skeleton.jointMatrices);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skinMeshGeometry.js","sourceRoot":"","sources":["../src/skinMeshGeometry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"skinMeshGeometry.js","sourceRoot":"","sources":["../src/skinMeshGeometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { updateMeshSkin } from './updateMeshSkin';
|
|
|
6
6
|
//
|
|
7
7
|
// Both halves are same-layer primitives: morph needs only geometry, so it lives in @flighthq/mesh;
|
|
8
8
|
// skin needs the joint palette, so it lives here. Composing them here — at the upper of the two —
|
|
9
|
-
// keeps skeleton3d below @flighthq/
|
|
9
|
+
// keeps skeleton3d below @flighthq/scene3d with no cycle.
|
|
10
10
|
// Backends using GPU skinning should continue to update morph CPU-side and upload the joint palette,
|
|
11
11
|
// rather than calling this CPU skin path and then skinning again in the shader.
|
|
12
12
|
export function updateMeshDeformation(mesh) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateMeshDeformation.js","sourceRoot":"","sources":["../src/updateMeshDeformation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,oGAAoG;AACpG,sGAAsG;AACtG,sGAAsG;AACtG,EAAE;AACF,mGAAmG;AACnG,kGAAkG;AAClG,
|
|
1
|
+
{"version":3,"file":"updateMeshDeformation.js","sourceRoot":"","sources":["../src/updateMeshDeformation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,oGAAoG;AACpG,sGAAsG;AACtG,sGAAsG;AACtG,EAAE;AACF,mGAAmG;AACnG,kGAAkG;AAClG,0DAA0D;AAC1D,qGAAqG;AACrG,gFAAgF;AAChF,MAAM,UAAU,qBAAqB,CAAC,IAAoB;IACxD,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,cAAc,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC"}
|
package/dist/updateMeshSkin.js
CHANGED
|
@@ -10,7 +10,7 @@ import { captureMeshSkinBindPose, skinMeshGeometry, updateMeshSkinBindPoseDeform
|
|
|
10
10
|
// onto the geometry runtime and reused every frame, so steady-state skinning allocates nothing. The
|
|
11
11
|
// version bump alone drives the backend re-upload — no per-frame destroy* of GPU data is needed.
|
|
12
12
|
//
|
|
13
|
-
// Lives here (with a mesh dep) rather than in @flighthq/
|
|
13
|
+
// Lives here (with a mesh dep) rather than in @flighthq/scene3d: its only dependencies are the skinning
|
|
14
14
|
// primitives above and mesh's runtime-slot accessors — it never touches the scene graph or animation,
|
|
15
15
|
// so pairing it with the skinning it drives keeps skeleton3d below scene with no cycle.
|
|
16
16
|
export function updateMeshSkin(mesh) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateMeshSkin.js","sourceRoot":"","sources":["../src/updateMeshSkin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAG1F,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAElH,+FAA+F;AAC/F,gGAAgG;AAChG,+FAA+F;AAC/F,0FAA0F;AAC1F,8FAA8F;AAC9F,oGAAoG;AACpG,oGAAoG;AACpG,iGAAiG;AACjG,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"updateMeshSkin.js","sourceRoot":"","sources":["../src/updateMeshSkin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAG1F,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAElH,+FAA+F;AAC/F,gGAAgG;AAChG,+FAA+F;AAC/F,0FAA0F;AAC1F,8FAA8F;AAC9F,oGAAoG;AACpG,oGAAoG;AACpG,iGAAiG;AACjG,EAAE;AACF,wGAAwG;AACxG,sGAAsG;AACtG,wFAAwF;AACxF,MAAM,UAAU,cAAc,CAAC,IAAoB;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO;IAEzB,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,QAAQ,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAC7C,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;QAC9B,4FAA4F;QAC5F,iGAAiG;QACjG,iCAAiC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpD,oGAAoG;IACpG,qGAAqG;IACrG,yFAAyF;AAC3F,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/skeleton3d",
|
|
3
|
-
"version": "0.2.1-next.
|
|
3
|
+
"version": "0.2.1-next.841.373388f",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -32,14 +32,14 @@
|
|
|
32
32
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@flighthq/entity": "0.2.1-next.
|
|
36
|
-
"@flighthq/geometry": "0.2.1-next.
|
|
37
|
-
"@flighthq/mesh": "0.2.1-next.
|
|
38
|
-
"@flighthq/node": "0.2.1-next.
|
|
39
|
-
"@flighthq/types": "0.2.1-next.
|
|
35
|
+
"@flighthq/entity": "0.2.1-next.841.373388f",
|
|
36
|
+
"@flighthq/geometry": "0.2.1-next.841.373388f",
|
|
37
|
+
"@flighthq/mesh": "0.2.1-next.841.373388f",
|
|
38
|
+
"@flighthq/node": "0.2.1-next.841.373388f",
|
|
39
|
+
"@flighthq/types": "0.2.1-next.841.373388f"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@flighthq/
|
|
42
|
+
"@flighthq/scene3d": "*",
|
|
43
43
|
"typescript": "^5.3.0"
|
|
44
44
|
},
|
|
45
45
|
"description": "3D skeleton: joint bind poses and skin-palette (jointWorld * inverseBind) computation over animated SceneNode bones",
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
getMeshGeometrySkinBindPose,
|
|
6
6
|
} from '@flighthq/mesh';
|
|
7
7
|
import { addNodeChild, getNodeRuntime, invalidateNodeLocalTransform } from '@flighthq/node';
|
|
8
|
-
import { createMesh,
|
|
8
|
+
import { createMesh, createNode3D } from '@flighthq/scene3d';
|
|
9
9
|
import type { MeshRuntime } from '@flighthq/types';
|
|
10
10
|
import { describe, expect, it } from 'vitest';
|
|
11
11
|
|
|
12
|
-
import { prepareMeshSkinning,
|
|
12
|
+
import { prepareMeshSkinning, prepareScene3DSkinning } from './prepareScene3DSkinning';
|
|
13
13
|
import { createSkeleton3D } from './skeleton3d';
|
|
14
14
|
|
|
15
15
|
function createOneVertexSkinnedMesh() {
|
|
@@ -28,7 +28,7 @@ function deformedBounds(mesh: ReturnType<typeof createOneVertexSkinnedMesh>) {
|
|
|
28
28
|
describe('prepareMeshSkinning', () => {
|
|
29
29
|
it('captures the bind pose and writes posed conservative bounds without CPU-posing the vertices', () => {
|
|
30
30
|
const mesh = createOneVertexSkinnedMesh();
|
|
31
|
-
const joint =
|
|
31
|
+
const joint = createNode3D();
|
|
32
32
|
mesh.skin = { skeleton: createSkeleton3D([joint]) };
|
|
33
33
|
setVector3(joint.position, 0, 5, 0);
|
|
34
34
|
invalidateNodeLocalTransform(joint);
|
|
@@ -59,7 +59,7 @@ describe('prepareMeshSkinning', () => {
|
|
|
59
59
|
|
|
60
60
|
it('reuses the same bounds AABB instance across frames', () => {
|
|
61
61
|
const mesh = createOneVertexSkinnedMesh();
|
|
62
|
-
const joint =
|
|
62
|
+
const joint = createNode3D();
|
|
63
63
|
mesh.skin = { skeleton: createSkeleton3D([joint]) };
|
|
64
64
|
setVector3(joint.position, 0, 5, 0);
|
|
65
65
|
invalidateNodeLocalTransform(joint);
|
|
@@ -71,23 +71,23 @@ describe('prepareMeshSkinning', () => {
|
|
|
71
71
|
});
|
|
72
72
|
});
|
|
73
73
|
|
|
74
|
-
describe('
|
|
74
|
+
describe('prepareScene3DSkinning', () => {
|
|
75
75
|
it('poses every skinned mesh in the subtree and skips disabled subtrees', () => {
|
|
76
|
-
const scene =
|
|
76
|
+
const scene = createNode3D();
|
|
77
77
|
const skinned = createOneVertexSkinnedMesh();
|
|
78
|
-
const joint =
|
|
78
|
+
const joint = createNode3D();
|
|
79
79
|
skinned.skin = { skeleton: createSkeleton3D([joint]) };
|
|
80
80
|
setVector3(joint.position, 0, 5, 0);
|
|
81
81
|
invalidateNodeLocalTransform(joint);
|
|
82
82
|
addNodeChild(scene, skinned);
|
|
83
83
|
|
|
84
|
-
const disabledGroup =
|
|
84
|
+
const disabledGroup = createNode3D(undefined, { enabled: false });
|
|
85
85
|
const hidden = createOneVertexSkinnedMesh();
|
|
86
|
-
hidden.skin = { skeleton: createSkeleton3D([
|
|
86
|
+
hidden.skin = { skeleton: createSkeleton3D([createNode3D()]) };
|
|
87
87
|
addNodeChild(disabledGroup, hidden);
|
|
88
88
|
addNodeChild(scene, disabledGroup);
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
prepareScene3DSkinning(scene);
|
|
91
91
|
|
|
92
92
|
expect(deformedBounds(skinned)).not.toBeNull();
|
|
93
93
|
// A disabled subtree is skipped whole, so its skinned mesh is never posed.
|
package/src/skeleton3d.test.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createMatrix4, getMatrix4Element, setVector3 } from '@flighthq/geometry';
|
|
2
2
|
import { addNodeChild, getNodeParent, invalidateNodeLocalTransform, setNodeTransform3D } from '@flighthq/node';
|
|
3
|
-
import {
|
|
3
|
+
import { createNode3D } from '@flighthq/scene3d';
|
|
4
4
|
import { EntityRuntimeKey } from '@flighthq/types';
|
|
5
5
|
|
|
6
6
|
import {
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
|
|
20
20
|
describe('cloneSkeleton3D', () => {
|
|
21
21
|
it('copies buffers and arrays into a new identity while sharing joint nodes', () => {
|
|
22
|
-
const joint =
|
|
22
|
+
const joint = createNode3D();
|
|
23
23
|
setVector3(joint.position, 5, 0, 0);
|
|
24
24
|
invalidateNodeLocalTransform(joint);
|
|
25
25
|
const skeleton = createSkeleton3D([joint], undefined, ['root']);
|
|
@@ -38,15 +38,15 @@ describe('cloneSkeleton3D', () => {
|
|
|
38
38
|
});
|
|
39
39
|
|
|
40
40
|
it('preserves a null names field', () => {
|
|
41
|
-
const clone = cloneSkeleton3D(createSkeleton3D([
|
|
41
|
+
const clone = cloneSkeleton3D(createSkeleton3D([createNode3D()]));
|
|
42
42
|
expect(clone.names).toBeNull();
|
|
43
43
|
});
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
describe('cloneSkeleton3DJointHierarchy', () => {
|
|
47
47
|
it('rebuilds joint parentage over fresh nodes and isolates pose updates', () => {
|
|
48
|
-
const root =
|
|
49
|
-
const child =
|
|
48
|
+
const root = createNode3D();
|
|
49
|
+
const child = createNode3D();
|
|
50
50
|
setVector3(root.position, 1, 0, 0);
|
|
51
51
|
setVector3(child.position, 0, 2, 0);
|
|
52
52
|
invalidateNodeLocalTransform(root);
|
|
@@ -55,7 +55,7 @@ describe('cloneSkeleton3DJointHierarchy', () => {
|
|
|
55
55
|
const source = createSkeleton3D([root, child], undefined, ['root', 'child']);
|
|
56
56
|
|
|
57
57
|
const clone = cloneSkeleton3DJointHierarchy(source, (joint) => {
|
|
58
|
-
const out =
|
|
58
|
+
const out = createNode3D(joint.kind, joint);
|
|
59
59
|
setNodeTransform3D(out, joint);
|
|
60
60
|
return out;
|
|
61
61
|
});
|
|
@@ -81,7 +81,7 @@ describe('cloneSkeleton3DJointHierarchy', () => {
|
|
|
81
81
|
|
|
82
82
|
describe('computeSkeleton3DJointMatrices', () => {
|
|
83
83
|
it('encodes the joint delta from its bind pose', () => {
|
|
84
|
-
const joint =
|
|
84
|
+
const joint = createNode3D();
|
|
85
85
|
setVector3(joint.position, 5, 0, 0);
|
|
86
86
|
invalidateNodeLocalTransform(joint);
|
|
87
87
|
const skeleton = createSkeleton3D([joint]); // binds at (5, 0, 0)
|
|
@@ -95,8 +95,8 @@ describe('computeSkeleton3DJointMatrices', () => {
|
|
|
95
95
|
});
|
|
96
96
|
|
|
97
97
|
it('is alias-safe when jointMatrices and inverseBindMatrices share the same buffer', () => {
|
|
98
|
-
const joint0 =
|
|
99
|
-
const joint1 =
|
|
98
|
+
const joint0 = createNode3D();
|
|
99
|
+
const joint1 = createNode3D();
|
|
100
100
|
setVector3(joint0.position, 0, 0, 0);
|
|
101
101
|
invalidateNodeLocalTransform(joint0);
|
|
102
102
|
setVector3(joint1.position, 3, 0, 0);
|
|
@@ -119,9 +119,9 @@ describe('computeSkeleton3DJointMatrices', () => {
|
|
|
119
119
|
});
|
|
120
120
|
|
|
121
121
|
it('propagates correctly through a 3-joint chain', () => {
|
|
122
|
-
const joint0 =
|
|
123
|
-
const joint1 =
|
|
124
|
-
const joint2 =
|
|
122
|
+
const joint0 = createNode3D();
|
|
123
|
+
const joint1 = createNode3D();
|
|
124
|
+
const joint2 = createNode3D();
|
|
125
125
|
setVector3(joint0.position, 1, 0, 0);
|
|
126
126
|
invalidateNodeLocalTransform(joint0);
|
|
127
127
|
setVector3(joint1.position, 0, 1, 0);
|
|
@@ -149,7 +149,7 @@ describe('computeSkeleton3DJointMatrices', () => {
|
|
|
149
149
|
});
|
|
150
150
|
|
|
151
151
|
it('yields identity when a joint is at its bind pose', () => {
|
|
152
|
-
const joint =
|
|
152
|
+
const joint = createNode3D();
|
|
153
153
|
setVector3(joint.position, 5, 0, 0);
|
|
154
154
|
invalidateNodeLocalTransform(joint);
|
|
155
155
|
const skeleton = createSkeleton3D([joint]);
|
|
@@ -164,7 +164,7 @@ describe('computeSkeleton3DJointMatrices', () => {
|
|
|
164
164
|
|
|
165
165
|
describe('createSkeleton3D', () => {
|
|
166
166
|
it('allocates a palette sized to the joint count when no inverse-bind is given', () => {
|
|
167
|
-
const skeleton = createSkeleton3D([
|
|
167
|
+
const skeleton = createSkeleton3D([createNode3D(), createNode3D()]);
|
|
168
168
|
expect(skeleton.jointMatrices.length).toBe(32);
|
|
169
169
|
expect(skeleton.inverseBindMatrices.length).toBe(32);
|
|
170
170
|
expect(EntityRuntimeKey in skeleton).toBe(true);
|
|
@@ -173,7 +173,7 @@ describe('createSkeleton3D', () => {
|
|
|
173
173
|
|
|
174
174
|
describe('disposeSkeleton3D', () => {
|
|
175
175
|
it('drops joint references and clears names', () => {
|
|
176
|
-
const skeleton = createSkeleton3D([
|
|
176
|
+
const skeleton = createSkeleton3D([createNode3D(), createNode3D()], undefined, ['a', 'b']);
|
|
177
177
|
disposeSkeleton3D(skeleton);
|
|
178
178
|
expect(skeleton.joints.length).toBe(0);
|
|
179
179
|
expect(skeleton.names).toBeNull();
|
|
@@ -182,7 +182,7 @@ describe('disposeSkeleton3D', () => {
|
|
|
182
182
|
|
|
183
183
|
describe('equalsSkeleton3D', () => {
|
|
184
184
|
it('is reflexive and compares clones as equal', () => {
|
|
185
|
-
const joint =
|
|
185
|
+
const joint = createNode3D();
|
|
186
186
|
setVector3(joint.position, 2, 0, 0);
|
|
187
187
|
invalidateNodeLocalTransform(joint);
|
|
188
188
|
const skeleton = createSkeleton3D([joint], undefined, ['root']);
|
|
@@ -191,18 +191,18 @@ describe('equalsSkeleton3D', () => {
|
|
|
191
191
|
});
|
|
192
192
|
|
|
193
193
|
it('differs on joint count, inverse-bind contents, and names', () => {
|
|
194
|
-
const j0 =
|
|
194
|
+
const j0 = createNode3D();
|
|
195
195
|
setVector3(j0.position, 1, 0, 0);
|
|
196
196
|
invalidateNodeLocalTransform(j0);
|
|
197
197
|
const a = createSkeleton3D([j0]);
|
|
198
198
|
|
|
199
|
-
const j1 =
|
|
199
|
+
const j1 = createNode3D();
|
|
200
200
|
setVector3(j1.position, 9, 0, 0);
|
|
201
201
|
invalidateNodeLocalTransform(j1);
|
|
202
202
|
const differentBind = createSkeleton3D([j1]);
|
|
203
203
|
expect(equalsSkeleton3D(a, differentBind)).toBe(false);
|
|
204
204
|
|
|
205
|
-
const extra = createSkeleton3D([
|
|
205
|
+
const extra = createSkeleton3D([createNode3D(), createNode3D()]);
|
|
206
206
|
expect(equalsSkeleton3D(a, extra)).toBe(false);
|
|
207
207
|
|
|
208
208
|
const named = createSkeleton3D([j0], a.inverseBindMatrices, ['root']);
|
|
@@ -214,16 +214,16 @@ describe('equalsSkeleton3D', () => {
|
|
|
214
214
|
|
|
215
215
|
describe('getSkeleton3DJointIndexByName', () => {
|
|
216
216
|
it('returns the joint index or -1 when unnamed or missing', () => {
|
|
217
|
-
const skeleton = createSkeleton3D([
|
|
217
|
+
const skeleton = createSkeleton3D([createNode3D(), createNode3D()], undefined, ['hip', 'spine']);
|
|
218
218
|
expect(getSkeleton3DJointIndexByName(skeleton, 'spine')).toBe(1);
|
|
219
219
|
expect(getSkeleton3DJointIndexByName(skeleton, 'missing')).toBe(-1);
|
|
220
|
-
expect(getSkeleton3DJointIndexByName(createSkeleton3D([
|
|
220
|
+
expect(getSkeleton3DJointIndexByName(createSkeleton3D([createNode3D()]), 'hip')).toBe(-1);
|
|
221
221
|
});
|
|
222
222
|
});
|
|
223
223
|
|
|
224
224
|
describe('getSkeleton3DJointWorldMatrix', () => {
|
|
225
225
|
it('reads the joint world matrix into out and returns true', () => {
|
|
226
|
-
const joint =
|
|
226
|
+
const joint = createNode3D();
|
|
227
227
|
setVector3(joint.position, 5, 3, 0);
|
|
228
228
|
invalidateNodeLocalTransform(joint);
|
|
229
229
|
const skeleton = createSkeleton3D([joint]);
|
|
@@ -235,7 +235,7 @@ describe('getSkeleton3DJointWorldMatrix', () => {
|
|
|
235
235
|
});
|
|
236
236
|
|
|
237
237
|
it('returns false and leaves out untouched for an out-of-range index', () => {
|
|
238
|
-
const skeleton = createSkeleton3D([
|
|
238
|
+
const skeleton = createSkeleton3D([createNode3D()]);
|
|
239
239
|
const out = createMatrix4();
|
|
240
240
|
expect(getSkeleton3DJointWorldMatrix(out, skeleton, 5)).toBe(false);
|
|
241
241
|
expect(getSkeleton3DJointWorldMatrix(out, skeleton, -1)).toBe(false);
|
|
@@ -245,8 +245,8 @@ describe('getSkeleton3DJointWorldMatrix', () => {
|
|
|
245
245
|
|
|
246
246
|
describe('getSkeleton3DJointWorldMatrixByName', () => {
|
|
247
247
|
it('resolves the joint by name and reads its world matrix', () => {
|
|
248
|
-
const hip =
|
|
249
|
-
const hand =
|
|
248
|
+
const hip = createNode3D();
|
|
249
|
+
const hand = createNode3D();
|
|
250
250
|
setVector3(hand.position, 7, 0, 0);
|
|
251
251
|
invalidateNodeLocalTransform(hand);
|
|
252
252
|
const skeleton = createSkeleton3D([hip, hand], undefined, ['hip', 'hand']);
|
|
@@ -260,7 +260,7 @@ describe('getSkeleton3DJointWorldMatrixByName', () => {
|
|
|
260
260
|
|
|
261
261
|
describe('setSkeleton3DBindPose', () => {
|
|
262
262
|
it('rebinds so the current pose becomes the rest pose', () => {
|
|
263
|
-
const joint =
|
|
263
|
+
const joint = createNode3D();
|
|
264
264
|
const skeleton = createSkeleton3D([joint]);
|
|
265
265
|
setVector3(joint.position, 2, 0, 0);
|
|
266
266
|
invalidateNodeLocalTransform(joint);
|
|
@@ -274,11 +274,11 @@ describe('setSkeleton3DBindPose', () => {
|
|
|
274
274
|
|
|
275
275
|
describe('validateSkeleton3D', () => {
|
|
276
276
|
it('returns null for a well-formed skeleton', () => {
|
|
277
|
-
expect(validateSkeleton3D(createSkeleton3D([
|
|
277
|
+
expect(validateSkeleton3D(createSkeleton3D([createNode3D(), createNode3D()]))).toBeNull();
|
|
278
278
|
});
|
|
279
279
|
|
|
280
280
|
it('returns a diagnostic when inverseBindMatrices length does not match jointCount * 16', () => {
|
|
281
|
-
const skeleton = createSkeleton3D([
|
|
281
|
+
const skeleton = createSkeleton3D([createNode3D(), createNode3D()]);
|
|
282
282
|
skeleton.inverseBindMatrices = new Float32Array(16);
|
|
283
283
|
|
|
284
284
|
const diagnostic = validateSkeleton3D(skeleton);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { setVector3 } from '@flighthq/geometry';
|
|
2
2
|
import { CANONICAL_SKINNED_MESH_GEOMETRY_LAYOUT, createMeshGeometry } from '@flighthq/mesh';
|
|
3
3
|
import { invalidateNodeLocalTransform } from '@flighthq/node';
|
|
4
|
-
import {
|
|
4
|
+
import { createNode3D } from '@flighthq/scene3d';
|
|
5
5
|
import type { MeshGeometry, VertexAttributeLayout } from '@flighthq/types';
|
|
6
6
|
import { describe, expect, it } from 'vitest';
|
|
7
7
|
|
|
@@ -77,7 +77,7 @@ describe('captureMeshSkinBindPose', () => {
|
|
|
77
77
|
describe('skinMeshGeometry', () => {
|
|
78
78
|
it('leaves the vertex at its bind position when the palette is identity', () => {
|
|
79
79
|
const geometry = createOneVertexSkinnedGeometry([1, 0, 0], [0, 1, 0], [0, 0, 0, 0], [1, 0, 0, 0]);
|
|
80
|
-
const joint =
|
|
80
|
+
const joint = createNode3D();
|
|
81
81
|
const skeleton = createSkeleton3D([joint]);
|
|
82
82
|
const bindPose = captureMeshSkinBindPose(geometry);
|
|
83
83
|
const versionBefore = geometry.version;
|
|
@@ -93,7 +93,7 @@ describe('skinMeshGeometry', () => {
|
|
|
93
93
|
|
|
94
94
|
it('translates the vertex by a translated joint and preserves the untouched channels', () => {
|
|
95
95
|
const geometry = createOneVertexSkinnedGeometry([1, 0, 0], [0, 1, 0], [0, 0, 0, 0], [1, 0, 0, 0]);
|
|
96
|
-
const joint =
|
|
96
|
+
const joint = createNode3D();
|
|
97
97
|
// Bind pose is captured with the joint at the origin (inverse-bind = identity), then the joint moves.
|
|
98
98
|
const skeleton = createSkeleton3D([joint]);
|
|
99
99
|
const bindPose = captureMeshSkinBindPose(geometry);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { setVector3 } from '@flighthq/geometry';
|
|
2
2
|
import { CANONICAL_SKINNED_MESH_GEOMETRY_LAYOUT, createMeshGeometry } from '@flighthq/mesh';
|
|
3
3
|
import { invalidateNodeLocalTransform } from '@flighthq/node';
|
|
4
|
-
import { createMesh,
|
|
4
|
+
import { createMesh, createNode3D } from '@flighthq/scene3d';
|
|
5
5
|
import type { MeshMorph } from '@flighthq/types';
|
|
6
6
|
import { describe, expect, it } from 'vitest';
|
|
7
7
|
|
|
@@ -20,7 +20,7 @@ describe('updateMeshDeformation', () => {
|
|
|
20
20
|
weights: new Float32Array([1]),
|
|
21
21
|
};
|
|
22
22
|
mesh.morph = morph;
|
|
23
|
-
const joint =
|
|
23
|
+
const joint = createNode3D();
|
|
24
24
|
mesh.skin = { skeleton: createSkeleton3D([joint]) };
|
|
25
25
|
setVector3(joint.position, 0, 5, 0);
|
|
26
26
|
invalidateNodeLocalTransform(joint);
|
|
@@ -53,7 +53,7 @@ describe('updateMeshDeformation', () => {
|
|
|
53
53
|
createMeshGeometry({ layout: CANONICAL_SKINNED_MESH_GEOMETRY_LAYOUT, vertices: skinVertices }),
|
|
54
54
|
[],
|
|
55
55
|
);
|
|
56
|
-
const joint =
|
|
56
|
+
const joint = createNode3D();
|
|
57
57
|
skinMesh.skin = { skeleton: createSkeleton3D([joint]) };
|
|
58
58
|
setVector3(joint.position, 0, 2, 0);
|
|
59
59
|
invalidateNodeLocalTransform(joint);
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
getMeshGeometrySkinBindPose,
|
|
7
7
|
} from '@flighthq/mesh';
|
|
8
8
|
import { invalidateNodeLocalTransform } from '@flighthq/node';
|
|
9
|
-
import { createMesh,
|
|
9
|
+
import { createMesh, createNode3D } from '@flighthq/scene3d';
|
|
10
10
|
import { describe, expect, it } from 'vitest';
|
|
11
11
|
|
|
12
12
|
import { createSkeleton3D } from './skeleton3d';
|
|
@@ -24,7 +24,7 @@ function createOneVertexSkinnedMesh() {
|
|
|
24
24
|
describe('updateMeshSkin', () => {
|
|
25
25
|
it('deforms the mesh, bumps the version, and lazily captures the bind pose onto the runtime', () => {
|
|
26
26
|
const mesh = createOneVertexSkinnedMesh();
|
|
27
|
-
const joint =
|
|
27
|
+
const joint = createNode3D();
|
|
28
28
|
mesh.skin = { skeleton: createSkeleton3D([joint]) };
|
|
29
29
|
setVector3(joint.position, 0, 5, 0);
|
|
30
30
|
invalidateNodeLocalTransform(joint);
|
|
@@ -45,7 +45,7 @@ describe('updateMeshSkin', () => {
|
|
|
45
45
|
|
|
46
46
|
it('reuses the captured bind pose across frames rather than recapturing', () => {
|
|
47
47
|
const mesh = createOneVertexSkinnedMesh();
|
|
48
|
-
const joint =
|
|
48
|
+
const joint = createNode3D();
|
|
49
49
|
mesh.skin = { skeleton: createSkeleton3D([joint]) };
|
|
50
50
|
|
|
51
51
|
updateMeshSkin(mesh);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prepareSceneSkinning.d.ts","sourceRoot":"","sources":["../src/prepareSceneSkinning.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAe,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAwBlE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAoB9D;AAcD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAcnE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prepareSceneSkinning.js","sourceRoot":"","sources":["../src/prepareSceneSkinning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,sGAAsG;AACtG,uGAAuG;AACvG,uFAAuF;AACvF,gGAAgG;AAChG,0FAA0F;AAC1F,EAAE;AACF,sGAAsG;AACtG,uGAAuG;AACvG,wGAAwG;AACxG,qGAAqG;AACrG,uGAAuG;AACvG,oGAAoG;AACpG,sDAAsD;AACtD,EAAE;AACF,+FAA+F;AAC/F,oGAAoG;AACpG,wGAAwG;AACxG,qGAAqG;AACrG,MAAM,UAAU,mBAAmB,CAAC,IAAoB;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO;IAEzB,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,QAAQ,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAC7C,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAe,CAAgB,CAAC;IAC/D,IAAI,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IACzC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,GAAG,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,mBAAmB,GAAG,MAAM,CAAC;IACvC,CAAC;IACD,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,oGAAoG;AACpG,mGAAmG;AACnG,uGAAuG;AACvG,oGAAoG;AACpG,qGAAqG;AACrG,EAAE;AACF,sGAAsG;AACtG,uGAAuG;AACvG,qGAAqG;AACrG,kGAAkG;AAClG,sGAAsG;AACtG,mGAAmG;AACnG,MAAM,UAAU,oBAAoB,CAAC,KAAwB;IAC3D,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO;IAE3B,mGAAmG;IACnG,iDAAiD;IACjD,MAAM,IAAI,GAAG,KAAwB,CAAC;IACtC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI;QAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;IAChD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC"}
|