reze-engine 0.2.10 → 0.2.11
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/engine.d.ts +2 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +13 -1
- package/package.json +1 -1
- package/src/engine.ts +15 -2
- package/src/physics.ts +752 -752
package/dist/engine.d.ts
CHANGED
|
@@ -98,6 +98,8 @@ export declare class Engine {
|
|
|
98
98
|
private animationFrames;
|
|
99
99
|
private animationTimeouts;
|
|
100
100
|
private gpuMemoryMB;
|
|
101
|
+
private hasAnimation;
|
|
102
|
+
private playingAnimation;
|
|
101
103
|
constructor(canvas: HTMLCanvasElement, options?: EngineOptions);
|
|
102
104
|
init(): Promise<void>;
|
|
103
105
|
private createPipelines;
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.js
CHANGED
|
@@ -53,6 +53,8 @@ export class Engine {
|
|
|
53
53
|
this.animationFrames = [];
|
|
54
54
|
this.animationTimeouts = [];
|
|
55
55
|
this.gpuMemoryMB = 0;
|
|
56
|
+
this.hasAnimation = false; // Set to true when loadAnimation is called
|
|
57
|
+
this.playingAnimation = false; // Set to true when playAnimation is called
|
|
56
58
|
this.canvas = canvas;
|
|
57
59
|
if (options) {
|
|
58
60
|
this.ambient = options.ambient ?? 1.0;
|
|
@@ -1264,11 +1266,13 @@ export class Engine {
|
|
|
1264
1266
|
async loadAnimation(url) {
|
|
1265
1267
|
const frames = await VMDLoader.load(url);
|
|
1266
1268
|
this.animationFrames = frames;
|
|
1269
|
+
this.hasAnimation = true;
|
|
1267
1270
|
}
|
|
1268
1271
|
playAnimation() {
|
|
1269
1272
|
if (this.animationFrames.length === 0)
|
|
1270
1273
|
return;
|
|
1271
1274
|
this.stopAnimation();
|
|
1275
|
+
this.playingAnimation = true;
|
|
1272
1276
|
const allBoneKeyFrames = [];
|
|
1273
1277
|
for (const keyFrame of this.animationFrames) {
|
|
1274
1278
|
for (const boneFrame of keyFrame.boneFrames) {
|
|
@@ -1318,9 +1322,9 @@ export class Engine {
|
|
|
1318
1322
|
const identityQuats = new Array(bonesToReset.length).fill(identityQuat);
|
|
1319
1323
|
this.rotateBones(bonesToReset, identityQuats, 0);
|
|
1320
1324
|
}
|
|
1321
|
-
this.currentModel.evaluatePose();
|
|
1322
1325
|
// Reset physics immediately and upload matrices to prevent A-pose flash
|
|
1323
1326
|
if (this.physics) {
|
|
1327
|
+
this.currentModel.evaluatePose();
|
|
1324
1328
|
const worldMats = this.currentModel.getBoneWorldMatrices();
|
|
1325
1329
|
this.physics.reset(worldMats, this.currentModel.getBoneInverseBindMatrices());
|
|
1326
1330
|
// Upload matrices immediately so next frame shows correct pose
|
|
@@ -1362,6 +1366,7 @@ export class Engine {
|
|
|
1362
1366
|
clearTimeout(timeoutId);
|
|
1363
1367
|
}
|
|
1364
1368
|
this.animationTimeouts = [];
|
|
1369
|
+
this.playingAnimation = false;
|
|
1365
1370
|
}
|
|
1366
1371
|
getStats() {
|
|
1367
1372
|
return { ...this.stats };
|
|
@@ -1766,6 +1771,13 @@ export class Engine {
|
|
|
1766
1771
|
// Use single encoder for both compute and render (reduces sync points)
|
|
1767
1772
|
const encoder = this.device.createCommandEncoder();
|
|
1768
1773
|
this.updateModelPose(deltaTime, encoder);
|
|
1774
|
+
// Hide model if animation is loaded but not playing yet (prevents A-pose flash)
|
|
1775
|
+
// Still update physics and poses, just don't render visually
|
|
1776
|
+
if (this.hasAnimation && !this.playingAnimation) {
|
|
1777
|
+
// Submit encoder to ensure matrices are uploaded and physics initializes
|
|
1778
|
+
this.device.queue.submit([encoder.finish()]);
|
|
1779
|
+
return;
|
|
1780
|
+
}
|
|
1769
1781
|
const pass = encoder.beginRenderPass(this.renderPassDescriptor);
|
|
1770
1782
|
pass.setVertexBuffer(0, this.vertexBuffer);
|
|
1771
1783
|
pass.setVertexBuffer(1, this.jointsBuffer);
|
package/package.json
CHANGED
package/src/engine.ts
CHANGED
|
@@ -137,6 +137,8 @@ export class Engine {
|
|
|
137
137
|
private animationFrames: VMDKeyFrame[] = []
|
|
138
138
|
private animationTimeouts: number[] = []
|
|
139
139
|
private gpuMemoryMB: number = 0
|
|
140
|
+
private hasAnimation = false // Set to true when loadAnimation is called
|
|
141
|
+
private playingAnimation = false // Set to true when playAnimation is called
|
|
140
142
|
|
|
141
143
|
constructor(canvas: HTMLCanvasElement, options?: EngineOptions) {
|
|
142
144
|
this.canvas = canvas
|
|
@@ -1415,12 +1417,14 @@ export class Engine {
|
|
|
1415
1417
|
public async loadAnimation(url: string) {
|
|
1416
1418
|
const frames = await VMDLoader.load(url)
|
|
1417
1419
|
this.animationFrames = frames
|
|
1420
|
+
this.hasAnimation = true
|
|
1418
1421
|
}
|
|
1419
1422
|
|
|
1420
1423
|
public playAnimation() {
|
|
1421
1424
|
if (this.animationFrames.length === 0) return
|
|
1422
1425
|
|
|
1423
1426
|
this.stopAnimation()
|
|
1427
|
+
this.playingAnimation = true
|
|
1424
1428
|
|
|
1425
1429
|
const allBoneKeyFrames: BoneKeyFrame[] = []
|
|
1426
1430
|
for (const keyFrame of this.animationFrames) {
|
|
@@ -1478,10 +1482,10 @@ export class Engine {
|
|
|
1478
1482
|
this.rotateBones(bonesToReset, identityQuats, 0)
|
|
1479
1483
|
}
|
|
1480
1484
|
|
|
1481
|
-
this.currentModel.evaluatePose()
|
|
1482
|
-
|
|
1483
1485
|
// Reset physics immediately and upload matrices to prevent A-pose flash
|
|
1484
1486
|
if (this.physics) {
|
|
1487
|
+
this.currentModel.evaluatePose()
|
|
1488
|
+
|
|
1485
1489
|
const worldMats = this.currentModel.getBoneWorldMatrices()
|
|
1486
1490
|
this.physics.reset(worldMats, this.currentModel.getBoneInverseBindMatrices())
|
|
1487
1491
|
|
|
@@ -1532,6 +1536,7 @@ export class Engine {
|
|
|
1532
1536
|
clearTimeout(timeoutId)
|
|
1533
1537
|
}
|
|
1534
1538
|
this.animationTimeouts = []
|
|
1539
|
+
this.playingAnimation = false
|
|
1535
1540
|
}
|
|
1536
1541
|
|
|
1537
1542
|
public getStats(): EngineStats {
|
|
@@ -2007,6 +2012,14 @@ export class Engine {
|
|
|
2007
2012
|
|
|
2008
2013
|
this.updateModelPose(deltaTime, encoder)
|
|
2009
2014
|
|
|
2015
|
+
// Hide model if animation is loaded but not playing yet (prevents A-pose flash)
|
|
2016
|
+
// Still update physics and poses, just don't render visually
|
|
2017
|
+
if (this.hasAnimation && !this.playingAnimation) {
|
|
2018
|
+
// Submit encoder to ensure matrices are uploaded and physics initializes
|
|
2019
|
+
this.device.queue.submit([encoder.finish()])
|
|
2020
|
+
return
|
|
2021
|
+
}
|
|
2022
|
+
|
|
2010
2023
|
const pass = encoder.beginRenderPass(this.renderPassDescriptor)
|
|
2011
2024
|
|
|
2012
2025
|
pass.setVertexBuffer(0, this.vertexBuffer)
|