reze-engine 0.13.1 → 0.13.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/dist/model.d.ts +9 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +52 -6
- package/package.json +1 -1
- package/src/model.ts +57 -6
package/dist/model.d.ts
CHANGED
|
@@ -96,6 +96,10 @@ export declare class Model {
|
|
|
96
96
|
private _name;
|
|
97
97
|
get name(): string;
|
|
98
98
|
setName(value: string): void;
|
|
99
|
+
get position(): Vec3;
|
|
100
|
+
get rotation(): Quat;
|
|
101
|
+
setPosition(position: Vec3): void;
|
|
102
|
+
setRotation(rotation: Quat): void;
|
|
99
103
|
private vertexData;
|
|
100
104
|
private baseVertexData;
|
|
101
105
|
private vertexCount;
|
|
@@ -110,6 +114,11 @@ export declare class Model {
|
|
|
110
114
|
private runtimeSkeleton;
|
|
111
115
|
private runtimeMorph;
|
|
112
116
|
private morphsDirty;
|
|
117
|
+
private _position;
|
|
118
|
+
private _rotation;
|
|
119
|
+
private rootMatrixValues;
|
|
120
|
+
private rootMatrixDirty;
|
|
121
|
+
private rootIsIdentity;
|
|
113
122
|
private skinMatricesArray?;
|
|
114
123
|
private tweenState;
|
|
115
124
|
private tweenTimeMs;
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAkC,MAAM,QAAQ,CAAA;AAEzE,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAI5C,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EAOlB,MAAM,aAAa,CAAA;AAIpB,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAGD,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,IAAI,CAAA;IACf,QAAQ,CAAC,EAAE,IAAI,CAAA;CAChB;AAGD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAGD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,IAAI,CAAA;IAChB,aAAa,EAAE,IAAI,CAAA;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,mBAAmB,EAAE,YAAY,CAAA;CAClC;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,UAAU,CAAA;CACpB;AAGD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACzC;AAGD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAGD,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,iBAAiB,EAAE,CAAA;IAClC,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAA;CACxC;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,aAAa,EAAE,YAAY,CAAA;CAC5B;AAGD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,cAAc,EAAE,IAAI,EAAE,CAAA;IACtB,iBAAiB,EAAE,IAAI,EAAE,CAAA;IACzB,aAAa,EAAE,IAAI,EAAE,CAAA;IACrB,WAAW,CAAC,EAAE,WAAW,EAAE,CAAA;IAC3B,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;CACvB;AAGD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,OAAO,EAAE,YAAY,CAAA;CACtB;AA2BD,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAa;IAE1B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO5B,IAAI,QAAQ,IAAI,IAAI,CAEnB;IAED,IAAI,QAAQ,IAAI,IAAI,CAEnB;IAED,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAKjC,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAKjC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,SAAS,CAAiB;IAElC,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,QAAQ,CAAU;IAG1B,OAAO,CAAC,QAAQ,CAAU;IAG1B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,MAAM,CAAc;IAG5B,OAAO,CAAC,eAAe,CAAkB;IAGzC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAiB;IAMpC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,gBAAgB,CAAuE;IAC/F,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,cAAc,CAAgB;IAGtC,OAAO,CAAC,iBAAiB,CAAC,CAAc;IAExC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAY;IAG/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IACtD,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,eAAe,CAA6B;IAEpD,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,aAAa,CAAK;IAE1B,iHAAiH;IACjH,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;gBAM1D,UAAU,EAAE,YAAY,CAAC,WAAW,CAAC,EACrC,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,EACnC,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,WAAW,GAAE,SAAS,EAAO,EAC7B,MAAM,GAAE,KAAK,EAAO;IAyBtB,OAAO,CAAC,yBAAyB;IA2BjC,OAAO,CAAC,mBAAmB;IAoC3B,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,YAAY;IA6EpB,WAAW,IAAI,YAAY,CAAC,WAAW,CAAC;IAIxC,WAAW,IAAI,OAAO,EAAE;IAIxB,YAAY,IAAI,QAAQ,EAAE;IAI1B,UAAU,IAAI,WAAW,CAAC,WAAW,CAAC;IAItC,WAAW,IAAI,QAAQ;IAKvB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAMnD,WAAW,IAAI,QAAQ;IAIvB,cAAc,IAAI,SAAS,EAAE;IAI7B,SAAS,IAAI,KAAK,EAAE;IAIpB,WAAW,IAAI,QAAQ;IAIvB,eAAe,IAAI,YAAY;IAM/B,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAmD3E,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAqD5E,OAAO,CAAC,4BAA4B;IA2DpC,gBAAgB,IAAI,IAAI,EAAE;IAI1B,oBAAoB,IAAI,YAAY;IAWpC,0BAA0B,IAAI,YAAY;IAI1C,eAAe,IAAI,YAAY;IA2C/B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IA6CvE,OAAO,CAAC,WAAW;IAiEnB,OAAO,CAAC,yBAAyB;IA0DjC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B3D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAIjD,aAAa,IAAI,IAAI;IAWrB,cAAc,IAAI,IAAI;IAStB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAI3C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAMpC,IAAI,IAAI,IAAI;IACZ,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO;IAW3D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOxB,aAAa,IAAI,IAAI;IAIrB,KAAK,IAAI,IAAI;IAKb,cAAc,IAAI,IAAI;IAItB,IAAI,IAAI,IAAI;IAKZ,aAAa,IAAI,IAAI;IAKrB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK3B,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIpC,oBAAoB,IAAI,iBAAiB;IAazC,OAAO,CAAC,MAAM,CAAC,UAAU;IAWzB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,iBAAiB;IAyFzB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO;IAkCtD,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,aAAa,CAAyB;IAI9C,OAAO,CAAC,4BAA4B;IAiHpC,oBAAoB,IAAI,IAAI;CA8F7B"}
|
package/dist/model.js
CHANGED
|
@@ -13,6 +13,23 @@ export class Model {
|
|
|
13
13
|
setName(value) {
|
|
14
14
|
this._name = value;
|
|
15
15
|
}
|
|
16
|
+
// Root transform public API. Instant setters — no tween baked in; wrap in
|
|
17
|
+
// your own lerp if you need smoothing. Changes are applied on the next
|
|
18
|
+
// getSkinMatrices() call (once per frame during rendering).
|
|
19
|
+
get position() {
|
|
20
|
+
return this._position;
|
|
21
|
+
}
|
|
22
|
+
get rotation() {
|
|
23
|
+
return this._rotation;
|
|
24
|
+
}
|
|
25
|
+
setPosition(position) {
|
|
26
|
+
this._position.set(position);
|
|
27
|
+
this.rootMatrixDirty = true;
|
|
28
|
+
}
|
|
29
|
+
setRotation(rotation) {
|
|
30
|
+
this._rotation.set(rotation);
|
|
31
|
+
this.rootMatrixDirty = true;
|
|
32
|
+
}
|
|
16
33
|
/** Called by Engine when registering the model; enables loadVmd to resolve relative paths for folder uploads. */
|
|
17
34
|
setAssetContext(reader, basePath) {
|
|
18
35
|
this.assetReader = reader;
|
|
@@ -26,6 +43,15 @@ export class Model {
|
|
|
26
43
|
this.rigidbodies = [];
|
|
27
44
|
this.joints = [];
|
|
28
45
|
this.morphsDirty = false; // Flag indicating if morphs need to be applied
|
|
46
|
+
// Root transform — model's placement in world space, independent of bones.
|
|
47
|
+
// Folded into skin matrices (see getSkinMatrices) so every pass (main VS,
|
|
48
|
+
// shadow VS, any future skinned pass) sees it without per-shader plumbing.
|
|
49
|
+
// Skip-when-identity flag avoids the extra mat mul per bone when unused.
|
|
50
|
+
this._position = Vec3.zeros();
|
|
51
|
+
this._rotation = Quat.identity();
|
|
52
|
+
this.rootMatrixValues = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
|
|
53
|
+
this.rootMatrixDirty = false;
|
|
54
|
+
this.rootIsIdentity = true;
|
|
29
55
|
this.tweenTimeMs = 0; // Time tracking for tweens (milliseconds)
|
|
30
56
|
// Animation: state and multiple slots (idle, walk, attack, etc.); commit/rollback for action-game style
|
|
31
57
|
this.animationState = new AnimationState();
|
|
@@ -423,12 +449,32 @@ export class Model {
|
|
|
423
449
|
this.skinMatricesArray = new Float32Array(boneCount * 16);
|
|
424
450
|
}
|
|
425
451
|
const skinMatrices = this.skinMatricesArray;
|
|
426
|
-
//
|
|
427
|
-
|
|
428
|
-
const
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
452
|
+
// Rebuild root matrix + cache identity-shortcut flag only when pos/rot changed.
|
|
453
|
+
if (this.rootMatrixDirty) {
|
|
454
|
+
const p = this._position, r = this._rotation;
|
|
455
|
+
Mat4.fromPositionRotationInto(p.x, p.y, p.z, r.x, r.y, r.z, r.w, this.rootMatrixValues);
|
|
456
|
+
this.rootIsIdentity =
|
|
457
|
+
p.x === 0 && p.y === 0 && p.z === 0 &&
|
|
458
|
+
r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1;
|
|
459
|
+
this.rootMatrixDirty = false;
|
|
460
|
+
}
|
|
461
|
+
if (this.rootIsIdentity) {
|
|
462
|
+
// skinMatrix = worldMatrix × inverseBindMatrix
|
|
463
|
+
for (let i = 0; i < boneCount; i++) {
|
|
464
|
+
const off = i * 16;
|
|
465
|
+
Mat4.multiplyArrays(worldMats[i].values, 0, invBindMats, off, skinMatrices, off);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
// skinMatrix = rootMatrix × worldMatrix × inverseBindMatrix
|
|
470
|
+
// Two-mul path. scratchMat4Values[1] — [0] is owned by computeWorldMatrices.
|
|
471
|
+
const rootVals = this.rootMatrixValues;
|
|
472
|
+
const tmp = scratchMat4Values[1];
|
|
473
|
+
for (let i = 0; i < boneCount; i++) {
|
|
474
|
+
const off = i * 16;
|
|
475
|
+
Mat4.multiplyArrays(rootVals, 0, worldMats[i].values, 0, tmp, 0);
|
|
476
|
+
Mat4.multiplyArrays(tmp, 0, invBindMats, off, skinMatrices, off);
|
|
477
|
+
}
|
|
432
478
|
}
|
|
433
479
|
return skinMatrices;
|
|
434
480
|
}
|
package/package.json
CHANGED
package/src/model.ts
CHANGED
|
@@ -167,6 +167,27 @@ export class Model {
|
|
|
167
167
|
this._name = value
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
+
// Root transform public API. Instant setters — no tween baked in; wrap in
|
|
171
|
+
// your own lerp if you need smoothing. Changes are applied on the next
|
|
172
|
+
// getSkinMatrices() call (once per frame during rendering).
|
|
173
|
+
get position(): Vec3 {
|
|
174
|
+
return this._position
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
get rotation(): Quat {
|
|
178
|
+
return this._rotation
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
setPosition(position: Vec3): void {
|
|
182
|
+
this._position.set(position)
|
|
183
|
+
this.rootMatrixDirty = true
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
setRotation(rotation: Quat): void {
|
|
187
|
+
this._rotation.set(rotation)
|
|
188
|
+
this.rootMatrixDirty = true
|
|
189
|
+
}
|
|
190
|
+
|
|
170
191
|
private vertexData: Float32Array<ArrayBuffer>
|
|
171
192
|
private baseVertexData: Float32Array<ArrayBuffer> // Original vertex data before morphing
|
|
172
193
|
private vertexCount: number
|
|
@@ -191,6 +212,16 @@ export class Model {
|
|
|
191
212
|
private runtimeMorph!: MorphRuntime
|
|
192
213
|
private morphsDirty: boolean = false // Flag indicating if morphs need to be applied
|
|
193
214
|
|
|
215
|
+
// Root transform — model's placement in world space, independent of bones.
|
|
216
|
+
// Folded into skin matrices (see getSkinMatrices) so every pass (main VS,
|
|
217
|
+
// shadow VS, any future skinned pass) sees it without per-shader plumbing.
|
|
218
|
+
// Skip-when-identity flag avoids the extra mat mul per bone when unused.
|
|
219
|
+
private _position: Vec3 = Vec3.zeros()
|
|
220
|
+
private _rotation: Quat = Quat.identity()
|
|
221
|
+
private rootMatrixValues: Float32Array = new Float32Array([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1])
|
|
222
|
+
private rootMatrixDirty: boolean = false
|
|
223
|
+
private rootIsIdentity: boolean = true
|
|
224
|
+
|
|
194
225
|
// Cached skin matrices array to avoid allocations in getSkinMatrices
|
|
195
226
|
private skinMatricesArray?: Float32Array
|
|
196
227
|
|
|
@@ -683,12 +714,32 @@ export class Model {
|
|
|
683
714
|
|
|
684
715
|
const skinMatrices = this.skinMatricesArray
|
|
685
716
|
|
|
686
|
-
//
|
|
687
|
-
|
|
688
|
-
const
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
717
|
+
// Rebuild root matrix + cache identity-shortcut flag only when pos/rot changed.
|
|
718
|
+
if (this.rootMatrixDirty) {
|
|
719
|
+
const p = this._position, r = this._rotation
|
|
720
|
+
Mat4.fromPositionRotationInto(p.x, p.y, p.z, r.x, r.y, r.z, r.w, this.rootMatrixValues)
|
|
721
|
+
this.rootIsIdentity =
|
|
722
|
+
p.x === 0 && p.y === 0 && p.z === 0 &&
|
|
723
|
+
r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1
|
|
724
|
+
this.rootMatrixDirty = false
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
if (this.rootIsIdentity) {
|
|
728
|
+
// skinMatrix = worldMatrix × inverseBindMatrix
|
|
729
|
+
for (let i = 0; i < boneCount; i++) {
|
|
730
|
+
const off = i * 16
|
|
731
|
+
Mat4.multiplyArrays(worldMats[i].values, 0, invBindMats, off, skinMatrices, off)
|
|
732
|
+
}
|
|
733
|
+
} else {
|
|
734
|
+
// skinMatrix = rootMatrix × worldMatrix × inverseBindMatrix
|
|
735
|
+
// Two-mul path. scratchMat4Values[1] — [0] is owned by computeWorldMatrices.
|
|
736
|
+
const rootVals = this.rootMatrixValues
|
|
737
|
+
const tmp = scratchMat4Values[1]
|
|
738
|
+
for (let i = 0; i < boneCount; i++) {
|
|
739
|
+
const off = i * 16
|
|
740
|
+
Mat4.multiplyArrays(rootVals, 0, worldMats[i].values, 0, tmp, 0)
|
|
741
|
+
Mat4.multiplyArrays(tmp, 0, invBindMats, off, skinMatrices, off)
|
|
742
|
+
}
|
|
692
743
|
}
|
|
693
744
|
|
|
694
745
|
return skinMatrices
|