reze-engine 0.3.4 → 0.3.5

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,4 +1,3 @@
1
1
  import type { AmmoInstance } from "@fred3d/ammo";
2
2
  export declare function loadAmmo(): Promise<AmmoInstance>;
3
- export declare function getAmmoInstance(): AmmoInstance | null;
4
3
  //# sourceMappingURL=ammo-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ammo-loader.d.ts","sourceRoot":"","sources":["../src/ammo-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAKhD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,CAyBtD;AAED,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD"}
1
+ {"version":3,"file":"ammo-loader.d.ts","sourceRoot":"","sources":["../src/ammo-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAKhD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,CAyBtD"}
@@ -24,6 +24,3 @@ export async function loadAmmo() {
24
24
  })();
25
25
  return ammoPromise;
26
26
  }
27
- export function getAmmoInstance() {
28
- return ammoInstance;
29
- }
@@ -13,14 +13,13 @@ export declare class IKSolverSystem {
13
13
  /**
14
14
  * Solve all IK chains
15
15
  */
16
- static solve(ikSolvers: IKSolver[], bones: Bone[], localRotations: Float32Array, localTranslations: Float32Array, worldMatrices: Float32Array, ikChainInfo: IKChainInfo[], usePhysics?: boolean): void;
16
+ static solve(ikSolvers: IKSolver[], bones: Bone[], localRotations: Float32Array, localTranslations: Float32Array, worldMatrices: Float32Array, ikChainInfo: IKChainInfo[]): void;
17
17
  private static solveIK;
18
18
  private static solveChain;
19
19
  private static limitAngle;
20
20
  private static getWorldTranslation;
21
21
  private static getParentWorldRotationMatrix;
22
22
  private static transformNormal;
23
- private static updateWorldMatrixWithIK;
24
23
  private static updateWorldMatrix;
25
24
  }
26
25
  //# sourceMappingURL=ik-solver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ik-solver.d.ts","sourceRoot":"","sources":["../src/ik-solver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,IAAI,EAAU,QAAQ,EAAE,WAAW,EAAiC,MAAM,SAAS,CAAA;AAoE5F;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAS;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAExD;;OAEG;WACW,KAAK,CACjB,SAAS,EAAE,QAAQ,EAAE,EACrB,KAAK,EAAE,IAAI,EAAE,EACb,cAAc,EAAE,YAAY,EAC5B,iBAAiB,EAAE,YAAY,EAC/B,aAAa,EAAE,YAAY,EAC3B,WAAW,EAAE,WAAW,EAAE,EAC1B,UAAU,GAAE,OAAe,GAC1B,IAAI;IASP,OAAO,CAAC,MAAM,CAAC,OAAO;IAgGtB,OAAO,CAAC,MAAM,CAAC,UAAU;IAoKzB,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAKlC,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAe3C,OAAO,CAAC,MAAM,CAAC,eAAe;IAS9B,OAAO,CAAC,MAAM,CAAC,uBAAuB;IA8CtC,OAAO,CAAC,MAAM,CAAC,iBAAiB;CAsCjC"}
1
+ {"version":3,"file":"ik-solver.d.ts","sourceRoot":"","sources":["../src/ik-solver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,IAAI,EAAU,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAoE7D;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAS;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAExD;;OAEG;WACW,KAAK,CACjB,SAAS,EAAE,QAAQ,EAAE,EACrB,KAAK,EAAE,IAAI,EAAE,EACb,cAAc,EAAE,YAAY,EAC5B,iBAAiB,EAAE,YAAY,EAC/B,aAAa,EAAE,YAAY,EAC3B,WAAW,EAAE,WAAW,EAAE,GACzB,IAAI;IAMP,OAAO,CAAC,MAAM,CAAC,OAAO;IAgGtB,OAAO,CAAC,MAAM,CAAC,UAAU;IAoKzB,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAKlC,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAe3C,OAAO,CAAC,MAAM,CAAC,eAAe;IAS9B,OAAO,CAAC,MAAM,CAAC,iBAAiB;CAiDjC"}
package/dist/ik-solver.js CHANGED
@@ -74,11 +74,8 @@ export class IKSolverSystem {
74
74
  /**
75
75
  * Solve all IK chains
76
76
  */
77
- static solve(ikSolvers, bones, localRotations, localTranslations, worldMatrices, ikChainInfo, usePhysics = false) {
77
+ static solve(ikSolvers, bones, localRotations, localTranslations, worldMatrices, ikChainInfo) {
78
78
  for (const solver of ikSolvers) {
79
- if (usePhysics && solver.canSkipWhenPhysicsEnabled) {
80
- continue;
81
- }
82
79
  this.solveIK(solver, bones, localRotations, localTranslations, worldMatrices, ikChainInfo);
83
80
  }
84
81
  }
@@ -106,9 +103,9 @@ export class IKSolverSystem {
106
103
  }
107
104
  // Update chain bones and target bone world matrices (initial state, no IK yet)
108
105
  for (let i = chains.length - 1; i >= 0; i--) {
109
- this.updateWorldMatrix(chains[i].boneIndex, bones, localRotations, localTranslations, worldMatrices);
106
+ this.updateWorldMatrix(chains[i].boneIndex, bones, localRotations, localTranslations, worldMatrices, undefined);
110
107
  }
111
- this.updateWorldMatrix(targetBoneIndex, bones, localRotations, localTranslations, worldMatrices);
108
+ this.updateWorldMatrix(targetBoneIndex, bones, localRotations, localTranslations, worldMatrices, undefined);
112
109
  // Re-read positions after initial update
113
110
  const updatedIkPosition = this.getWorldTranslation(ikBoneIndex, worldMatrices);
114
111
  const updatedTargetPosition = this.getWorldTranslation(targetBoneIndex, worldMatrices);
@@ -273,9 +270,9 @@ export class IKSolverSystem {
273
270
  // Update world matrices for affected bones (using IK-modified rotations)
274
271
  for (let i = chainIndex; i >= 0; i--) {
275
272
  const link = solver.links[i];
276
- this.updateWorldMatrixWithIK(link.boneIndex, bones, localRotations, localTranslations, worldMatrices, ikChainInfo);
273
+ this.updateWorldMatrix(link.boneIndex, bones, localRotations, localTranslations, worldMatrices, ikChainInfo);
277
274
  }
278
- this.updateWorldMatrix(targetBoneIndex, bones, localRotations, localTranslations, worldMatrices);
275
+ this.updateWorldMatrix(targetBoneIndex, bones, localRotations, localTranslations, worldMatrices, undefined);
279
276
  }
280
277
  static limitAngle(angle, min, max, useAxis) {
281
278
  if (angle < min) {
@@ -313,16 +310,19 @@ export class IKSolverSystem {
313
310
  const m = matrix.values;
314
311
  return new Vec3(m[0] * normal.x + m[4] * normal.y + m[8] * normal.z, m[1] * normal.x + m[5] * normal.y + m[9] * normal.z, m[2] * normal.x + m[6] * normal.y + m[10] * normal.z);
315
312
  }
316
- static updateWorldMatrixWithIK(boneIndex, bones, localRotations, localTranslations, worldMatrices, ikChainInfo) {
313
+ static updateWorldMatrix(boneIndex, bones, localRotations, localTranslations, worldMatrices, ikChainInfo) {
317
314
  const bone = bones[boneIndex];
318
315
  const qi = boneIndex * 4;
319
316
  const ti = boneIndex * 3;
320
- // Use IK-modified rotation if available
317
+ // Get local rotation
321
318
  const localRot = new Quat(localRotations[qi], localRotations[qi + 1], localRotations[qi + 2], localRotations[qi + 3]);
322
- const chainInfo = ikChainInfo[boneIndex];
319
+ // Apply IK rotation if available
323
320
  let finalRot = localRot;
324
- if (chainInfo && chainInfo.ikRotation) {
325
- finalRot = chainInfo.ikRotation.multiply(localRot).normalize();
321
+ if (ikChainInfo) {
322
+ const chainInfo = ikChainInfo[boneIndex];
323
+ if (chainInfo && chainInfo.ikRotation) {
324
+ finalRot = chainInfo.ikRotation.multiply(localRot).normalize();
325
+ }
326
326
  }
327
327
  const rotateM = Mat4.fromQuat(finalRot.x, finalRot.y, finalRot.z, finalRot.w);
328
328
  const localTx = localTranslations[ti];
@@ -343,30 +343,6 @@ export class IKSolverSystem {
343
343
  worldMatrices.subarray(worldOffset, worldOffset + 16).set(localM.values);
344
344
  }
345
345
  }
346
- static updateWorldMatrix(boneIndex, bones, localRotations, localTranslations, worldMatrices) {
347
- const bone = bones[boneIndex];
348
- const qi = boneIndex * 4;
349
- const ti = boneIndex * 3;
350
- const localRot = new Quat(localRotations[qi], localRotations[qi + 1], localRotations[qi + 2], localRotations[qi + 3]);
351
- const rotateM = Mat4.fromQuat(localRot.x, localRot.y, localRot.z, localRot.w);
352
- const localTx = localTranslations[ti];
353
- const localTy = localTranslations[ti + 1];
354
- const localTz = localTranslations[ti + 2];
355
- const localM = Mat4.identity()
356
- .translateInPlace(bone.bindTranslation[0], bone.bindTranslation[1], bone.bindTranslation[2])
357
- .multiply(rotateM)
358
- .translateInPlace(localTx, localTy, localTz);
359
- const worldOffset = boneIndex * 16;
360
- if (bone.parentIndex >= 0) {
361
- const parentOffset = bone.parentIndex * 16;
362
- const parentMat = new Mat4(worldMatrices.subarray(parentOffset, parentOffset + 16));
363
- const worldMat = parentMat.multiply(localM);
364
- worldMatrices.subarray(worldOffset, worldOffset + 16).set(worldMat.values);
365
- }
366
- else {
367
- worldMatrices.subarray(worldOffset, worldOffset + 16).set(localM.values);
368
- }
369
- }
370
346
  }
371
347
  IKSolverSystem.EPSILON = 1.0e-8;
372
348
  IKSolverSystem.THRESHOLD = (88 * Math.PI) / 180;
package/dist/math.d.ts CHANGED
@@ -27,7 +27,6 @@ export declare class Quat {
27
27
  length(): number;
28
28
  normalize(): Quat;
29
29
  rotateVec(v: Vec3): Vec3;
30
- rotate(v: Vec3): Vec3;
31
30
  static fromTo(from: Vec3, to: Vec3): Quat;
32
31
  static fromAxisAngle(axis: Vec3, angle: number): Quat;
33
32
  toArray(): [number, number, number, number];
@@ -53,4 +52,14 @@ export declare class Mat4 {
53
52
  translateInPlace(tx: number, ty: number, tz: number): this;
54
53
  inverse(): Mat4;
55
54
  }
55
+ /**
56
+ * Bezier interpolation function
57
+ * @param x1 First control point X (0-127, normalized to 0-1)
58
+ * @param x2 Second control point X (0-127, normalized to 0-1)
59
+ * @param y1 First control point Y (0-127, normalized to 0-1)
60
+ * @param y2 Second control point Y (0-127, normalized to 0-1)
61
+ * @param t Interpolation parameter (0-1)
62
+ * @returns Interpolated value (0-1)
63
+ */
64
+ export declare function bezierInterpolate(x1: number, x2: number, y1: number, y2: number, t: number): number;
56
65
  //# sourceMappingURL=math.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"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"}
package/dist/math.js CHANGED
@@ -81,13 +81,6 @@ export class Quat {
81
81
  // result = v + q.w * t + cross(q.xyz, t)
82
82
  return new Vec3(vx + qw * tx + (qy * tz - qz * ty), vy + qw * ty + (qz * tx - qx * tz), vz + qw * tz + (qx * ty - qy * tx));
83
83
  }
84
- // Rotate a vector by this quaternion (Babylon.js style naming)
85
- rotate(v) {
86
- const qv = new Vec3(this.x, this.y, this.z);
87
- const uv = qv.cross(v);
88
- const uuv = qv.cross(uv);
89
- return v.add(uv.scale(2 * this.w)).add(uuv.scale(2));
90
- }
91
84
  // Static method: create quaternion that rotates from one direction to another
92
85
  static fromTo(from, to) {
93
86
  const dot = from.dot(to);
@@ -431,3 +424,39 @@ export class Mat4 {
431
424
  return new Mat4(out);
432
425
  }
433
426
  }
427
+ /**
428
+ * Bezier interpolation function
429
+ * @param x1 First control point X (0-127, normalized to 0-1)
430
+ * @param x2 Second control point X (0-127, normalized to 0-1)
431
+ * @param y1 First control point Y (0-127, normalized to 0-1)
432
+ * @param y2 Second control point Y (0-127, normalized to 0-1)
433
+ * @param t Interpolation parameter (0-1)
434
+ * @returns Interpolated value (0-1)
435
+ */
436
+ export function bezierInterpolate(x1, x2, y1, y2, t) {
437
+ // Clamp t to [0, 1]
438
+ t = Math.max(0, Math.min(1, t));
439
+ // Binary search for the t value that gives us the desired x
440
+ // We're solving for t in the Bezier curve: x(t) = 3*(1-t)^2*t*x1 + 3*(1-t)*t^2*x2 + t^3
441
+ let start = 0;
442
+ let end = 1;
443
+ let mid = 0.5;
444
+ // Iterate until we find the t value that gives us the desired x
445
+ for (let i = 0; i < 15; i++) {
446
+ // Evaluate Bezier curve at mid point
447
+ const x = 3 * (1 - mid) * (1 - mid) * mid * x1 + 3 * (1 - mid) * mid * mid * x2 + mid * mid * mid;
448
+ if (Math.abs(x - t) < 0.0001) {
449
+ break;
450
+ }
451
+ if (x < t) {
452
+ start = mid;
453
+ }
454
+ else {
455
+ end = mid;
456
+ }
457
+ mid = (start + end) / 2;
458
+ }
459
+ // Now evaluate the y value at this t
460
+ const y = 3 * (1 - mid) * (1 - mid) * mid * y1 + 3 * (1 - mid) * mid * mid * y2 + mid * mid * mid;
461
+ return y;
462
+ }
package/dist/model.d.ts CHANGED
@@ -42,20 +42,6 @@ export interface IKLink {
42
42
  hasLimit: boolean;
43
43
  minAngle?: Vec3;
44
44
  maxAngle?: Vec3;
45
- rotationOrder?: EulerRotationOrder;
46
- solveAxis?: SolveAxis;
47
- }
48
- export declare enum EulerRotationOrder {
49
- YXZ = 0,
50
- ZYX = 1,
51
- XZY = 2
52
- }
53
- export declare enum SolveAxis {
54
- None = 0,
55
- Fixed = 1,
56
- X = 2,
57
- Y = 3,
58
- Z = 4
59
45
  }
60
46
  export interface IKSolver {
61
47
  index: number;
@@ -64,7 +50,6 @@ export interface IKSolver {
64
50
  iterationCount: number;
65
51
  limitAngle: number;
66
52
  links: IKLink[];
67
- canSkipWhenPhysicsEnabled: boolean;
68
53
  }
69
54
  export interface IKChainInfo {
70
55
  ikRotation: Quat;
@@ -101,7 +86,6 @@ export interface SkeletonRuntime {
101
86
  localRotations: Float32Array;
102
87
  localTranslations: Float32Array;
103
88
  worldMatrices: Float32Array;
104
- computedBones: boolean[];
105
89
  ikChainInfo?: IKChainInfo[];
106
90
  ikSolvers?: IKSolver[];
107
91
  }
@@ -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":"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"}
package/dist/model.js CHANGED
@@ -1,22 +1,6 @@
1
1
  import { Mat4, Quat, Vec3, easeInOut } from "./math";
2
2
  import { IKSolverSystem } from "./ik-solver";
3
3
  const VERTEX_STRIDE = 8;
4
- // Euler rotation order for angle constraints
5
- export var EulerRotationOrder;
6
- (function (EulerRotationOrder) {
7
- EulerRotationOrder[EulerRotationOrder["YXZ"] = 0] = "YXZ";
8
- EulerRotationOrder[EulerRotationOrder["ZYX"] = 1] = "ZYX";
9
- EulerRotationOrder[EulerRotationOrder["XZY"] = 2] = "XZY";
10
- })(EulerRotationOrder || (EulerRotationOrder = {}));
11
- // Solve axis optimization
12
- export var SolveAxis;
13
- (function (SolveAxis) {
14
- SolveAxis[SolveAxis["None"] = 0] = "None";
15
- SolveAxis[SolveAxis["Fixed"] = 1] = "Fixed";
16
- SolveAxis[SolveAxis["X"] = 2] = "X";
17
- SolveAxis[SolveAxis["Y"] = 3] = "Y";
18
- SolveAxis[SolveAxis["Z"] = 4] = "Z";
19
- })(SolveAxis || (SolveAxis = {}));
20
4
  export class Model {
21
5
  constructor(vertexData, indexData, textures, materials, skeleton, skinning, morphing, rigidbodies = [], joints = []) {
22
6
  this.textures = [];
@@ -59,7 +43,6 @@ export class Model {
59
43
  acc[bone.name] = index;
60
44
  return acc;
61
45
  }, {}),
62
- computedBones: new Array(boneCount).fill(false),
63
46
  };
64
47
  const rotations = this.runtimeSkeleton.localRotations;
65
48
  for (let i = 0; i < this.skeleton.bones.length; i++) {
@@ -91,17 +74,6 @@ export class Model {
91
74
  for (let i = 0; i < boneCount; i++) {
92
75
  const bone = bones[i];
93
76
  if (bone.ikTargetIndex !== undefined && bone.ikLinks && bone.ikLinks.length > 0) {
94
- // Check if all links are affected by physics (for optimization)
95
- let canSkipWhenPhysicsEnabled = true;
96
- for (const link of bone.ikLinks) {
97
- // For now, assume no bones are physics-controlled (can be enhanced later)
98
- // If a bone has a rigidbody attached, it's physics-controlled
99
- const hasPhysics = this.rigidbodies.some((rb) => rb.boneIndex === link.boneIndex);
100
- if (!hasPhysics) {
101
- canSkipWhenPhysicsEnabled = false;
102
- break;
103
- }
104
- }
105
77
  const solver = {
106
78
  index: solverIndex++,
107
79
  ikBoneIndex: i,
@@ -109,7 +81,6 @@ export class Model {
109
81
  iterationCount: bone.ikIteration ?? 1,
110
82
  limitAngle: bone.ikLimitAngle ?? Math.PI,
111
83
  links: bone.ikLinks,
112
- canSkipWhenPhysicsEnabled,
113
84
  };
114
85
  ikSolvers.push(solver);
115
86
  }
@@ -302,14 +273,10 @@ export class Model {
302
273
  const startQuat = new Quat(state.startQuat[qi], state.startQuat[qi + 1], state.startQuat[qi + 2], state.startQuat[qi + 3]);
303
274
  const targetQuat = new Quat(state.targetQuat[qi], state.targetQuat[qi + 1], state.targetQuat[qi + 2], state.targetQuat[qi + 3]);
304
275
  const result = Quat.slerp(startQuat, targetQuat, e);
305
- const cx = result.x;
306
- const cy = result.y;
307
- const cz = result.z;
308
- const cw = result.w;
309
- sx = cx;
310
- sy = cy;
311
- sz = cz;
312
- sw = cw;
276
+ sx = result.x;
277
+ sy = result.y;
278
+ sz = result.z;
279
+ sw = result.w;
313
280
  }
314
281
  state.startQuat[qi] = sx;
315
282
  state.startQuat[qi + 1] = sy;
@@ -434,9 +401,8 @@ export class Model {
434
401
  // Animated change
435
402
  const state = this.morphTweenState;
436
403
  const now = performance.now();
437
- const currentWeight = this.runtimeMorph.weights[idx];
438
404
  // If already tweening, start from current interpolated value
439
- let startWeight = currentWeight;
405
+ let startWeight = this.runtimeMorph.weights[idx];
440
406
  if (state.active[idx] === 1) {
441
407
  const startMs = state.startTimeMs[idx];
442
408
  const prevDur = Math.max(1, state.durationMs[idx]);
@@ -517,11 +483,11 @@ export class Model {
517
483
  if (hasActiveMorphTweens) {
518
484
  this.applyMorphs();
519
485
  }
520
- // Compute initial world matrices (needed for IK solving)
486
+ // Compute initial world matrices (needed for IK solving to read bone positions)
521
487
  this.computeWorldMatrices();
522
- // Solve IK chains (modifies localRotations)
488
+ // Solve IK chains (modifies localRotations with final IK rotations)
523
489
  this.solveIKChains();
524
- // Recompute world matrices with IK rotations applied
490
+ // Recompute world matrices with final IK rotations applied to localRotations
525
491
  this.computeWorldMatrices();
526
492
  return hasActiveMorphTweens;
527
493
  }
@@ -532,18 +498,18 @@ export class Model {
532
498
  const ikChainInfo = this.runtimeSkeleton.ikChainInfo;
533
499
  if (!ikChainInfo)
534
500
  return;
535
- IKSolverSystem.solve(ikSolvers, this.skeleton.bones, this.runtimeSkeleton.localRotations, this.runtimeSkeleton.localTranslations, this.runtimeSkeleton.worldMatrices, ikChainInfo, false // usePhysics - can be enhanced later
536
- );
501
+ IKSolverSystem.solve(ikSolvers, this.skeleton.bones, this.runtimeSkeleton.localRotations, this.runtimeSkeleton.localTranslations, this.runtimeSkeleton.worldMatrices, ikChainInfo);
537
502
  }
538
503
  computeWorldMatrices() {
539
504
  const bones = this.skeleton.bones;
540
505
  const localRot = this.runtimeSkeleton.localRotations;
541
506
  const localTrans = this.runtimeSkeleton.localTranslations;
542
507
  const worldBuf = this.runtimeSkeleton.worldMatrices;
543
- const computed = this.runtimeSkeleton.computedBones.fill(false);
544
508
  const boneCount = bones.length;
545
509
  if (boneCount === 0)
546
510
  return;
511
+ // Local computed array (avoids instance field overhead)
512
+ const computed = new Array(boneCount).fill(false);
547
513
  const computeWorld = (i) => {
548
514
  if (computed[i])
549
515
  return;
@@ -574,14 +540,9 @@ export class Model {
574
540
  ay = -ay;
575
541
  az = -az;
576
542
  }
577
- const identityQuat = new Quat(0, 0, 0, 1);
578
543
  const appendQuat = new Quat(ax, ay, az, aw);
579
- const result = Quat.slerp(identityQuat, appendQuat, absRatio);
580
- const rx = result.x;
581
- const ry = result.y;
582
- const rz = result.z;
583
- const rw = result.w;
584
- rotateM = Mat4.fromQuat(rx, ry, rz, rw).multiply(rotateM);
544
+ const result = Quat.slerp(new Quat(0, 0, 0, 1), appendQuat, absRatio);
545
+ rotateM = Mat4.fromQuat(result.x, result.y, result.z, result.w).multiply(rotateM);
585
546
  }
586
547
  if (b.appendMove) {
587
548
  const appendRatio = b.appendRatio ?? 1;
@@ -1 +1 @@
1
- {"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../src/player.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAGnC,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAChC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACnC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,MAAM;IAEjB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,UAAU,CAAwE;IAC1F,OAAO,CAAC,WAAW,CAA0E;IAC7F,OAAO,CAAC,QAAQ,CAAY;IAG5B,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,WAAW,CAAY;IAG/B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,cAAc,CAAY;IAElC;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5C;;OAEG;IACH,OAAO,CAAC,aAAa;IAwErB;;;OAGG;IACH,IAAI,IAAI,IAAI;IAiBZ;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWxB;;;OAGG;IACH,MAAM,CAAC,eAAe,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAwBrD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IA+I1C;;OAEG;IACH,WAAW,IAAI,iBAAiB;IAQhC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB"}
1
+ {"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../src/player.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAqB,MAAM,QAAQ,CAAA;AAGtD,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAChC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACnC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,MAAM;IAEjB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,UAAU,CAAwE;IAC1F,OAAO,CAAC,WAAW,CAA0E;IAC7F,OAAO,CAAC,QAAQ,CAAY;IAG5B,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,WAAW,CAAY;IAG/B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,cAAc,CAAY;IAElC;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5C;;OAEG;IACH,OAAO,CAAC,aAAa;IAwErB;;;OAGG;IACH,IAAI,IAAI,IAAI;IAiBZ;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWxB;;;OAGG;IACH,MAAM,CAAC,eAAe,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAwBrD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IA+I1C;;OAEG;IACH,WAAW,IAAI,iBAAiB;IAQhC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB"}
package/dist/player.js CHANGED
@@ -1,5 +1,4 @@
1
- import { bezierInterpolate } from "./bezier-interpolate";
2
- import { Quat, Vec3 } from "./math";
1
+ import { Quat, Vec3, bezierInterpolate } from "./math";
3
2
  import { VMDLoader } from "./vmd-loader";
4
3
  export class Player {
5
4
  constructor() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reze-engine",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "description": "A WebGPU-based MMD model renderer",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -29,7 +29,3 @@ export async function loadAmmo(): Promise<AmmoInstance> {
29
29
 
30
30
  return ammoPromise
31
31
  }
32
-
33
- export function getAmmoInstance(): AmmoInstance | null {
34
- return ammoInstance
35
- }
package/src/ik-solver.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  import { Mat4, Quat, Vec3 } from "./math"
8
- import { Bone, IKLink, IKSolver, IKChainInfo, EulerRotationOrder, SolveAxis } from "./model"
8
+ import { Bone, IKLink, IKSolver, IKChainInfo } from "./model"
9
9
 
10
10
  const enum InternalEulerRotationOrder {
11
11
  YXZ = 0,
@@ -89,13 +89,9 @@ export class IKSolverSystem {
89
89
  localRotations: Float32Array,
90
90
  localTranslations: Float32Array,
91
91
  worldMatrices: Float32Array,
92
- ikChainInfo: IKChainInfo[],
93
- usePhysics: boolean = false
92
+ ikChainInfo: IKChainInfo[]
94
93
  ): void {
95
94
  for (const solver of ikSolvers) {
96
- if (usePhysics && solver.canSkipWhenPhysicsEnabled) {
97
- continue
98
- }
99
95
  this.solveIK(solver, bones, localRotations, localTranslations, worldMatrices, ikChainInfo)
100
96
  }
101
97
  }
@@ -135,9 +131,9 @@ export class IKSolverSystem {
135
131
 
136
132
  // Update chain bones and target bone world matrices (initial state, no IK yet)
137
133
  for (let i = chains.length - 1; i >= 0; i--) {
138
- this.updateWorldMatrix(chains[i].boneIndex, bones, localRotations, localTranslations, worldMatrices)
134
+ this.updateWorldMatrix(chains[i].boneIndex, bones, localRotations, localTranslations, worldMatrices, undefined)
139
135
  }
140
- this.updateWorldMatrix(targetBoneIndex, bones, localRotations, localTranslations, worldMatrices)
136
+ this.updateWorldMatrix(targetBoneIndex, bones, localRotations, localTranslations, worldMatrices, undefined)
141
137
 
142
138
  // Re-read positions after initial update
143
139
  const updatedIkPosition = this.getWorldTranslation(ikBoneIndex, worldMatrices)
@@ -355,9 +351,9 @@ export class IKSolverSystem {
355
351
  // Update world matrices for affected bones (using IK-modified rotations)
356
352
  for (let i = chainIndex; i >= 0; i--) {
357
353
  const link = solver.links[i]
358
- this.updateWorldMatrixWithIK(link.boneIndex, bones, localRotations, localTranslations, worldMatrices, ikChainInfo)
354
+ this.updateWorldMatrix(link.boneIndex, bones, localRotations, localTranslations, worldMatrices, ikChainInfo)
359
355
  }
360
- this.updateWorldMatrix(targetBoneIndex, bones, localRotations, localTranslations, worldMatrices)
356
+ this.updateWorldMatrix(targetBoneIndex, bones, localRotations, localTranslations, worldMatrices, undefined)
361
357
  }
362
358
 
363
359
  private static limitAngle(angle: number, min: number, max: number, useAxis: boolean): number {
@@ -401,29 +397,33 @@ export class IKSolverSystem {
401
397
  )
402
398
  }
403
399
 
404
- private static updateWorldMatrixWithIK(
400
+ private static updateWorldMatrix(
405
401
  boneIndex: number,
406
402
  bones: Bone[],
407
403
  localRotations: Float32Array,
408
404
  localTranslations: Float32Array,
409
405
  worldMatrices: Float32Array,
410
- ikChainInfo: IKChainInfo[]
406
+ ikChainInfo?: IKChainInfo[]
411
407
  ): void {
412
408
  const bone = bones[boneIndex]
413
409
  const qi = boneIndex * 4
414
410
  const ti = boneIndex * 3
415
411
 
416
- // Use IK-modified rotation if available
412
+ // Get local rotation
417
413
  const localRot = new Quat(
418
414
  localRotations[qi],
419
415
  localRotations[qi + 1],
420
416
  localRotations[qi + 2],
421
417
  localRotations[qi + 3]
422
418
  )
423
- const chainInfo = ikChainInfo[boneIndex]
419
+
420
+ // Apply IK rotation if available
424
421
  let finalRot = localRot
425
- if (chainInfo && chainInfo.ikRotation) {
426
- finalRot = chainInfo.ikRotation.multiply(localRot).normalize()
422
+ if (ikChainInfo) {
423
+ const chainInfo = ikChainInfo[boneIndex]
424
+ if (chainInfo && chainInfo.ikRotation) {
425
+ finalRot = chainInfo.ikRotation.multiply(localRot).normalize()
426
+ }
427
427
  }
428
428
  const rotateM = Mat4.fromQuat(finalRot.x, finalRot.y, finalRot.z, finalRot.w)
429
429
 
@@ -446,43 +446,4 @@ export class IKSolverSystem {
446
446
  worldMatrices.subarray(worldOffset, worldOffset + 16).set(localM.values)
447
447
  }
448
448
  }
449
-
450
- private static updateWorldMatrix(
451
- boneIndex: number,
452
- bones: Bone[],
453
- localRotations: Float32Array,
454
- localTranslations: Float32Array,
455
- worldMatrices: Float32Array
456
- ): void {
457
- const bone = bones[boneIndex]
458
- const qi = boneIndex * 4
459
- const ti = boneIndex * 3
460
-
461
- const localRot = new Quat(
462
- localRotations[qi],
463
- localRotations[qi + 1],
464
- localRotations[qi + 2],
465
- localRotations[qi + 3]
466
- )
467
- const rotateM = Mat4.fromQuat(localRot.x, localRot.y, localRot.z, localRot.w)
468
-
469
- const localTx = localTranslations[ti]
470
- const localTy = localTranslations[ti + 1]
471
- const localTz = localTranslations[ti + 2]
472
-
473
- const localM = Mat4.identity()
474
- .translateInPlace(bone.bindTranslation[0], bone.bindTranslation[1], bone.bindTranslation[2])
475
- .multiply(rotateM)
476
- .translateInPlace(localTx, localTy, localTz)
477
-
478
- const worldOffset = boneIndex * 16
479
- if (bone.parentIndex >= 0) {
480
- const parentOffset = bone.parentIndex * 16
481
- const parentMat = new Mat4(worldMatrices.subarray(parentOffset, parentOffset + 16))
482
- const worldMat = parentMat.multiply(localM)
483
- worldMatrices.subarray(worldOffset, worldOffset + 16).set(worldMat.values)
484
- } else {
485
- worldMatrices.subarray(worldOffset, worldOffset + 16).set(localM.values)
486
- }
487
- }
488
449
  }
package/src/math.ts CHANGED
@@ -127,14 +127,6 @@ export class Quat {
127
127
  )
128
128
  }
129
129
 
130
- // Rotate a vector by this quaternion (Babylon.js style naming)
131
- rotate(v: Vec3): Vec3 {
132
- const qv = new Vec3(this.x, this.y, this.z)
133
- const uv = qv.cross(v)
134
- const uuv = qv.cross(uv)
135
- return v.add(uv.scale(2 * this.w)).add(uuv.scale(2))
136
- }
137
-
138
130
  // Static method: create quaternion that rotates from one direction to another
139
131
  static fromTo(from: Vec3, to: Vec3): Quat {
140
132
  const dot = from.dot(to)
@@ -557,3 +549,46 @@ export class Mat4 {
557
549
  return new Mat4(out)
558
550
  }
559
551
  }
552
+
553
+ /**
554
+ * Bezier interpolation function
555
+ * @param x1 First control point X (0-127, normalized to 0-1)
556
+ * @param x2 Second control point X (0-127, normalized to 0-1)
557
+ * @param y1 First control point Y (0-127, normalized to 0-1)
558
+ * @param y2 Second control point Y (0-127, normalized to 0-1)
559
+ * @param t Interpolation parameter (0-1)
560
+ * @returns Interpolated value (0-1)
561
+ */
562
+ export function bezierInterpolate(x1: number, x2: number, y1: number, y2: number, t: number): number {
563
+ // Clamp t to [0, 1]
564
+ t = Math.max(0, Math.min(1, t))
565
+
566
+ // Binary search for the t value that gives us the desired x
567
+ // We're solving for t in the Bezier curve: x(t) = 3*(1-t)^2*t*x1 + 3*(1-t)*t^2*x2 + t^3
568
+ let start = 0
569
+ let end = 1
570
+ let mid = 0.5
571
+
572
+ // Iterate until we find the t value that gives us the desired x
573
+ for (let i = 0; i < 15; i++) {
574
+ // Evaluate Bezier curve at mid point
575
+ const x = 3 * (1 - mid) * (1 - mid) * mid * x1 + 3 * (1 - mid) * mid * mid * x2 + mid * mid * mid
576
+
577
+ if (Math.abs(x - t) < 0.0001) {
578
+ break
579
+ }
580
+
581
+ if (x < t) {
582
+ start = mid
583
+ } else {
584
+ end = mid
585
+ }
586
+
587
+ mid = (start + end) / 2
588
+ }
589
+
590
+ // Now evaluate the y value at this t
591
+ const y = 3 * (1 - mid) * (1 - mid) * mid * y1 + 3 * (1 - mid) * mid * mid * y2 + mid * mid * mid
592
+
593
+ return y
594
+ }