@flighthq/skeleton3d 0.3.1-next.794.0bfc53e → 0.3.1-next.837.46a9259
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skinVertices.d.ts","sourceRoot":"","sources":["../src/skinVertices.ts"],"names":[],"mappings":"AAkBA,wBAAgB,YAAY,CAC1B,WAAW,EAAE,YAAY,EACzB,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EACnC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC/B,aAAa,EAAE,QAAQ,CAAC,YAAY,CAAC,GACpC,IAAI,
|
|
1
|
+
{"version":3,"file":"skinVertices.d.ts","sourceRoot":"","sources":["../src/skinVertices.ts"],"names":[],"mappings":"AAkBA,wBAAgB,YAAY,CAC1B,WAAW,EAAE,YAAY,EACzB,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EACnC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC/B,aAAa,EAAE,QAAQ,CAAC,YAAY,CAAC,GACpC,IAAI,CAyCN;AAiBD,wBAAgB,YAAY,CAC1B,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,YAAY,EACxB,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC,EACjC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC/B,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EACnC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC/B,aAAa,EAAE,QAAQ,CAAC,YAAY,CAAC,EACrC,cAAc,EAAE,QAAQ,CAAC,YAAY,CAAC,GACrC,IAAI,CA8DN"}
|
package/dist/skinVertices.js
CHANGED
|
@@ -27,10 +27,12 @@ export function skinTangents(outTangents, tangents, joints, weights, jointMatric
|
|
|
27
27
|
let otx = 0;
|
|
28
28
|
let oty = 0;
|
|
29
29
|
let otz = 0;
|
|
30
|
+
let influenced = false;
|
|
30
31
|
for (let k = 0; k < 4; k++) {
|
|
31
32
|
const weight = weights[t + k];
|
|
32
33
|
if (weight === 0)
|
|
33
34
|
continue;
|
|
35
|
+
influenced = true;
|
|
34
36
|
const m = joints[t + k] * 16;
|
|
35
37
|
const m0 = jointMatrices[m];
|
|
36
38
|
const m1 = jointMatrices[m + 1];
|
|
@@ -45,9 +47,10 @@ export function skinTangents(outTangents, tangents, joints, weights, jointMatric
|
|
|
45
47
|
oty += weight * (m1 * tx + m5 * ty + m9 * tz);
|
|
46
48
|
otz += weight * (m2 * tx + m6 * ty + m10 * tz);
|
|
47
49
|
}
|
|
48
|
-
|
|
49
|
-
outTangents[t
|
|
50
|
-
outTangents[t +
|
|
50
|
+
// No influence means bind pose, not the origin — see the position path for the contract.
|
|
51
|
+
outTangents[t] = influenced ? otx : tx;
|
|
52
|
+
outTangents[t + 1] = influenced ? oty : ty;
|
|
53
|
+
outTangents[t + 2] = influenced ? otz : tz;
|
|
51
54
|
outTangents[t + 3] = handedness;
|
|
52
55
|
}
|
|
53
56
|
}
|
|
@@ -82,11 +85,13 @@ export function skinVertices(outPositions, outNormals, positions, normals, joint
|
|
|
82
85
|
let onx = 0;
|
|
83
86
|
let ony = 0;
|
|
84
87
|
let onz = 0;
|
|
88
|
+
let influenced = false;
|
|
85
89
|
const w = v * 4;
|
|
86
90
|
for (let k = 0; k < 4; k++) {
|
|
87
91
|
const weight = weights[w + k];
|
|
88
92
|
if (weight === 0)
|
|
89
93
|
continue;
|
|
94
|
+
influenced = true;
|
|
90
95
|
const m = joints[w + k] * 16;
|
|
91
96
|
const m0 = jointMatrices[m];
|
|
92
97
|
const m1 = jointMatrices[m + 1];
|
|
@@ -109,12 +114,17 @@ export function skinVertices(outPositions, outNormals, positions, normals, joint
|
|
|
109
114
|
ony += weight * (normalMatrices[n + 1] * nx + normalMatrices[n + 5] * ny + normalMatrices[n + 9] * nz);
|
|
110
115
|
onz += weight * (normalMatrices[n + 2] * nx + normalMatrices[n + 6] * ny + normalMatrices[n + 10] * nz);
|
|
111
116
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
// A vertex with no influence stays at its BIND POSE. That is the packer's documented contract —
|
|
118
|
+
// packSkinInfluences says a vertex with no influence "keeps all weights zero (it stays at its bind
|
|
119
|
+
// position)" — and accumulating from zero instead collapsed it onto the origin with a zero normal.
|
|
120
|
+
// Not a rounding error: an unweighted vertex teleported to (0,0,0) and dragged its triangle with it,
|
|
121
|
+
// and the skin bounds computed from these positions inherited the collapse.
|
|
122
|
+
outPositions[p] = influenced ? opx : px;
|
|
123
|
+
outPositions[p + 1] = influenced ? opy : py;
|
|
124
|
+
outPositions[p + 2] = influenced ? opz : pz;
|
|
125
|
+
outNormals[p] = influenced ? onx : nx;
|
|
126
|
+
outNormals[p + 1] = influenced ? ony : ny;
|
|
127
|
+
outNormals[p + 2] = influenced ? onz : nz;
|
|
118
128
|
}
|
|
119
129
|
}
|
|
120
130
|
//# sourceMappingURL=skinVertices.js.map
|
package/dist/skinVertices.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skinVertices.js","sourceRoot":"","sources":["../src/skinVertices.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,EAAE;AACF,mGAAmG;AACnG,sGAAsG;AACtG,qGAAqG;AACrG,kGAAkG;AAClG,EAAE;AACF,uGAAuG;AACvG,yGAAyG;AACzG,gGAAgG;AAChG,sGAAsG;AACtG,sGAAsG;AACtG,wGAAwG;AACxG,uGAAuG;AACvG,yBAAyB;AACzB,EAAE;AACF,mGAAmG;AACnG,wGAAwG;AACxG,MAAM,UAAU,YAAY,CAC1B,WAAyB,EACzB,QAAgC,EAChC,MAAmC,EACnC,OAA+B,EAC/B,aAAqC;IAErC,MAAM,WAAW,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEnC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"skinVertices.js","sourceRoot":"","sources":["../src/skinVertices.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/skeleton3d",
|
|
3
|
-
"version": "0.3.1-next.
|
|
3
|
+
"version": "0.3.1-next.837.46a9259",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/entity": "0.3.1-next.
|
|
42
|
-
"@flighthq/geometry": "0.3.1-next.
|
|
43
|
-
"@flighthq/mesh": "0.3.1-next.
|
|
44
|
-
"@flighthq/node": "0.3.1-next.
|
|
45
|
-
"@flighthq/types": "0.3.1-next.
|
|
41
|
+
"@flighthq/entity": "0.3.1-next.837.46a9259",
|
|
42
|
+
"@flighthq/geometry": "0.3.1-next.837.46a9259",
|
|
43
|
+
"@flighthq/mesh": "0.3.1-next.837.46a9259",
|
|
44
|
+
"@flighthq/node": "0.3.1-next.837.46a9259",
|
|
45
|
+
"@flighthq/types": "0.3.1-next.837.46a9259"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@flighthq/scene3d": "*",
|
package/src/skinVertices.test.ts
CHANGED
|
@@ -42,6 +42,21 @@ function translation(tx: number, ty: number, tz: number): number[] {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
describe('skinTangents', () => {
|
|
45
|
+
// Same contract as the position path: no influence means bind pose. A zero tangent collapses the
|
|
46
|
+
// TBN basis the shader reconstructs the bitangent from.
|
|
47
|
+
it('leaves an uninfluenced tangent at its bind pose rather than zero', () => {
|
|
48
|
+
const tangents = new Float32Array([1, 0, 0, -1]);
|
|
49
|
+
const joints = new Uint16Array([0, 0, 0, 0]);
|
|
50
|
+
const weights = new Float32Array([0, 0, 0, 0]);
|
|
51
|
+
const palette = new Float32Array(identity());
|
|
52
|
+
palette[0] = 9;
|
|
53
|
+
const out = new Float32Array(4);
|
|
54
|
+
|
|
55
|
+
skinTangents(out, tangents, joints, weights, palette);
|
|
56
|
+
|
|
57
|
+
expect(Array.from(out)).toEqual([1, 0, 0, -1]);
|
|
58
|
+
});
|
|
59
|
+
|
|
45
60
|
// A 90-degree rotation about Z, column-major. A pure rotation is used deliberately: N·T = 0 survives
|
|
46
61
|
// skinning exactly only under a rigid transform, where transforming the tangent as a vector by M and
|
|
47
62
|
// the normal as a covector by M⁻ᵀ coincide. Under non-uniform scale they diverge and orthogonality is
|
|
@@ -155,6 +170,36 @@ describe('skinTangents', () => {
|
|
|
155
170
|
});
|
|
156
171
|
|
|
157
172
|
describe('skinVertices', () => {
|
|
173
|
+
// packSkinInfluences documents that a vertex with no influence "keeps all weights zero (it stays at
|
|
174
|
+
// its bind position)". Accumulating the weighted sum from zero instead collapsed such a vertex onto
|
|
175
|
+
// the ORIGIN with a zero normal — it teleported and dragged its triangle with it, and the skin bounds
|
|
176
|
+
// computed from these positions inherited the collapse. The palette here is a translation, so a
|
|
177
|
+
// bind-pose pass-through and a "moved by the joint" answer cannot be confused.
|
|
178
|
+
it('leaves an uninfluenced vertex at its bind pose rather than the origin', () => {
|
|
179
|
+
const positions = new Float32Array([5, 6, 7]);
|
|
180
|
+
const normals = new Float32Array([0, 1, 0]);
|
|
181
|
+
const joints = new Uint16Array([0, 0, 0, 0]);
|
|
182
|
+
const weights = new Float32Array([0, 0, 0, 0]);
|
|
183
|
+
const palette = new Float32Array(identity());
|
|
184
|
+
palette[12] = 100;
|
|
185
|
+
const outPositions = new Float32Array(3);
|
|
186
|
+
const outNormals = new Float32Array(3);
|
|
187
|
+
|
|
188
|
+
skinVertices(
|
|
189
|
+
outPositions,
|
|
190
|
+
outNormals,
|
|
191
|
+
positions,
|
|
192
|
+
normals,
|
|
193
|
+
joints,
|
|
194
|
+
weights,
|
|
195
|
+
palette,
|
|
196
|
+
normalPaletteFor([...palette]),
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
expect(Array.from(outPositions)).toEqual([5, 6, 7]);
|
|
200
|
+
expect(Array.from(outNormals)).toEqual([0, 1, 0]);
|
|
201
|
+
});
|
|
202
|
+
|
|
158
203
|
it('passes vertices through unchanged when the only weighted joint is identity', () => {
|
|
159
204
|
const positions = new Float32Array([2, 3, 4]);
|
|
160
205
|
const normals = new Float32Array([0, 1, 0]);
|