reze-engine 0.15.1 → 0.16.0
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/camera.d.ts +2 -0
- package/dist/camera.d.ts.map +1 -1
- package/dist/camera.js +8 -3
- package/dist/engine.d.ts +19 -4
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +294 -27
- package/dist/ik-solver.d.ts.map +1 -1
- package/dist/ik-solver.js +13 -7
- package/dist/math.d.ts +2 -0
- package/dist/math.d.ts.map +1 -1
- package/dist/math.js +65 -46
- package/dist/model.d.ts +28 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +259 -75
- package/dist/physics/physics.d.ts +3 -0
- package/dist/physics/physics.d.ts.map +1 -1
- package/dist/physics/physics.js +55 -4
- package/dist/pmx-loader.d.ts.map +1 -1
- package/dist/pmx-loader.js +2 -30
- package/dist/shaders/materials/body.d.ts +1 -1
- package/dist/shaders/materials/body.d.ts.map +1 -1
- package/dist/shaders/materials/body.js +3 -1
- package/dist/shaders/materials/cloth_rough.d.ts +1 -1
- package/dist/shaders/materials/cloth_rough.d.ts.map +1 -1
- package/dist/shaders/materials/cloth_rough.js +3 -1
- package/dist/shaders/materials/cloth_smooth.d.ts +1 -1
- package/dist/shaders/materials/cloth_smooth.d.ts.map +1 -1
- package/dist/shaders/materials/common.d.ts +2 -2
- package/dist/shaders/materials/common.d.ts.map +1 -1
- package/dist/shaders/materials/common.js +8 -0
- package/dist/shaders/materials/default.d.ts +1 -1
- package/dist/shaders/materials/default.d.ts.map +1 -1
- package/dist/shaders/materials/eye.d.ts +1 -1
- package/dist/shaders/materials/eye.d.ts.map +1 -1
- package/dist/shaders/materials/face.d.ts +1 -1
- package/dist/shaders/materials/face.d.ts.map +1 -1
- package/dist/shaders/materials/face.js +4 -1
- package/dist/shaders/materials/hair.d.ts +1 -1
- package/dist/shaders/materials/hair.d.ts.map +1 -1
- package/dist/shaders/materials/metal.d.ts +1 -1
- package/dist/shaders/materials/metal.d.ts.map +1 -1
- package/dist/shaders/materials/stockings.d.ts +1 -1
- package/dist/shaders/materials/stockings.d.ts.map +1 -1
- package/dist/shaders/materials/stockings.js +13 -9
- package/dist/shaders/passes/composite.d.ts +1 -1
- package/dist/shaders/passes/composite.d.ts.map +1 -1
- package/dist/shaders/passes/composite.js +18 -12
- package/dist/shaders/passes/morph.d.ts +2 -0
- package/dist/shaders/passes/morph.d.ts.map +1 -0
- package/dist/shaders/passes/morph.js +49 -0
- package/package.json +1 -1
- package/src/camera.ts +9 -3
- package/src/engine.ts +336 -29
- package/src/ik-solver.ts +14 -7
- package/src/math.ts +41 -51
- package/src/model.ts +288 -91
- package/src/physics/physics.ts +56 -13
- package/src/pmx-loader.ts +2 -35
- package/src/shaders/materials/body.ts +3 -1
- package/src/shaders/materials/cloth_rough.ts +3 -1
- package/src/shaders/materials/common.ts +8 -0
- package/src/shaders/materials/face.ts +4 -1
- package/src/shaders/materials/stockings.ts +13 -9
- package/src/shaders/passes/composite.ts +18 -12
- package/src/shaders/passes/morph.ts +50 -0
package/dist/camera.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ export declare class Camera {
|
|
|
27
27
|
maxZ: number;
|
|
28
28
|
lowerBetaLimit: number;
|
|
29
29
|
upperBetaLimit: number;
|
|
30
|
+
private _viewMat;
|
|
31
|
+
private _projMat;
|
|
30
32
|
constructor(alpha: number, beta: number, radius: number, target: Vec3, fov?: number);
|
|
31
33
|
getPosition(): Vec3;
|
|
32
34
|
getViewMatrix(): Mat4;
|
package/dist/camera.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAMnC,qBAAa,MAAM;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,IAAI,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAI;IAClB,IAAI,EAAE,MAAM,CAAO;IACnB,GAAG,EAAE,MAAM,CAAU;IAGrB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,oBAAoB,CAAY;IAGxC,kBAAkB,EAAE,MAAM,CAAQ;IAClC,cAAc,EAAE,MAAM,CAAS;IAC/B,cAAc,EAAE,MAAM,CAAO;IAC7B,cAAc,EAAE,MAAM,CAAO;IAC7B,IAAI,EAAE,MAAM,CAAO;IACnB,IAAI,EAAE,MAAM,CAAU;IACtB,cAAc,EAAE,MAAM,CAAQ;IAC9B,cAAc,EAAE,MAAM,CAAkB;
|
|
1
|
+
{"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAMnC,qBAAa,MAAM;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,IAAI,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAI;IAClB,IAAI,EAAE,MAAM,CAAO;IACnB,GAAG,EAAE,MAAM,CAAU;IAGrB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,oBAAoB,CAAY;IAGxC,kBAAkB,EAAE,MAAM,CAAQ;IAClC,cAAc,EAAE,MAAM,CAAS;IAC/B,cAAc,EAAE,MAAM,CAAO;IAC7B,cAAc,EAAE,MAAM,CAAO;IAC7B,IAAI,EAAE,MAAM,CAAO;IACnB,IAAI,EAAE,MAAM,CAAU;IACtB,cAAc,EAAE,MAAM,CAAQ;IAC9B,cAAc,EAAE,MAAM,CAAkB;IAGxC,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,QAAQ,CAAiC;gBAErC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAE,MAAoB;IAmBhG,WAAW,IAAI,IAAI;IAQnB,aAAa,IAAI,IAAI;IASrB,OAAO,CAAC,gBAAgB;IA0CxB,OAAO,CAAC,SAAS;IAiBjB,kFAAkF;IAClF,OAAO,CAAC,mBAAmB;IAK3B,mBAAmB,IAAI,IAAI;IAM3B,aAAa,CAAC,MAAM,EAAE,iBAAiB;IAiBvC,aAAa;IAkBb,cAAc,CAAC,MAAM,EAAE,OAAO;IAS9B,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IA8BpB,OAAO,CAAC,WAAW;IAiFnB,OAAO,CAAC,UAAU;CA+BnB"}
|
package/dist/camera.js
CHANGED
|
@@ -28,6 +28,9 @@ export class Camera {
|
|
|
28
28
|
this.maxZ = FAR_CAP;
|
|
29
29
|
this.lowerBetaLimit = 0.001;
|
|
30
30
|
this.upperBetaLimit = Math.PI - 0.001;
|
|
31
|
+
// Reused each frame so getViewMatrix/getProjectionMatrix don't allocate a Mat4 per call.
|
|
32
|
+
this._viewMat = new Mat4(new Float32Array(16));
|
|
33
|
+
this._projMat = new Mat4(new Float32Array(16));
|
|
31
34
|
this.alpha = alpha;
|
|
32
35
|
this.beta = beta;
|
|
33
36
|
this.radius = radius;
|
|
@@ -53,8 +56,9 @@ export class Camera {
|
|
|
53
56
|
}
|
|
54
57
|
getViewMatrix() {
|
|
55
58
|
const eye = this.getPosition();
|
|
56
|
-
const
|
|
57
|
-
|
|
59
|
+
const t = this.target;
|
|
60
|
+
Mat4.lookAtInto(this._viewMat.values, eye.x, eye.y, eye.z, t.x, t.y, t.z, 0, 1, 0);
|
|
61
|
+
return this._viewMat;
|
|
58
62
|
}
|
|
59
63
|
// Get camera's right and up vectors for panning
|
|
60
64
|
// Uses a more robust calculation similar to BabylonJS
|
|
@@ -114,7 +118,8 @@ export class Camera {
|
|
|
114
118
|
}
|
|
115
119
|
getProjectionMatrix() {
|
|
116
120
|
this.updateFarFromRadius();
|
|
117
|
-
|
|
121
|
+
Mat4.perspectiveInto(this._projMat.values, this.fov, this.aspect, this.near, this.far);
|
|
122
|
+
return this._projMat;
|
|
118
123
|
}
|
|
119
124
|
attachControl(canvas) {
|
|
120
125
|
this.canvas = canvas;
|
package/dist/engine.d.ts
CHANGED
|
@@ -107,6 +107,9 @@ export declare const DEFAULT_ENGINE_OPTIONS: {
|
|
|
107
107
|
export interface EngineStats {
|
|
108
108
|
fps: number;
|
|
109
109
|
frameTime: number;
|
|
110
|
+
frameTimeMax: number;
|
|
111
|
+
fps1PercentLow: number;
|
|
112
|
+
jitter: number;
|
|
110
113
|
}
|
|
111
114
|
export declare class Engine {
|
|
112
115
|
private static instance;
|
|
@@ -195,6 +198,8 @@ export declare class Engine {
|
|
|
195
198
|
private compositePassDescriptor;
|
|
196
199
|
private compositePipelineIdentity;
|
|
197
200
|
private compositePipelineGamma;
|
|
201
|
+
private morphComputePipeline;
|
|
202
|
+
private morphComputeBindGroupLayout;
|
|
198
203
|
private compositeBindGroupLayout;
|
|
199
204
|
private compositeBindGroup;
|
|
200
205
|
private compositeUniformBuffer;
|
|
@@ -228,6 +233,9 @@ export declare class Engine {
|
|
|
228
233
|
private shadowMapDepthView;
|
|
229
234
|
private brdfLutTexture;
|
|
230
235
|
private brdfLutView;
|
|
236
|
+
private filmicLutTexture;
|
|
237
|
+
private filmicLutView;
|
|
238
|
+
private static readonly FILMIC_LUT_WIDTH;
|
|
231
239
|
private static readonly SHADOW_MAP_SIZE;
|
|
232
240
|
private shadowDepthPipeline;
|
|
233
241
|
private shadowLightVPBuffer;
|
|
@@ -258,14 +266,17 @@ export declare class Engine {
|
|
|
258
266
|
private _nextDefaultModelId;
|
|
259
267
|
private ikEnabled;
|
|
260
268
|
private physicsEnabled;
|
|
269
|
+
private useGpuMorphs;
|
|
261
270
|
private cameraTargetModel;
|
|
262
271
|
private cameraTargetBoneName;
|
|
263
272
|
private cameraTargetOffset;
|
|
264
|
-
private lastFpsUpdate;
|
|
265
|
-
private framesSinceLastUpdate;
|
|
266
273
|
private lastFrameTime;
|
|
267
|
-
private
|
|
268
|
-
private
|
|
274
|
+
private static readonly STATS_WINDOW;
|
|
275
|
+
private static readonly STATS_REFRESH_MS;
|
|
276
|
+
private frameIntervals;
|
|
277
|
+
private frameIntervalWrite;
|
|
278
|
+
private frameIntervalFilled;
|
|
279
|
+
private lastStatsCompute;
|
|
269
280
|
private stats;
|
|
270
281
|
private animationFrameId;
|
|
271
282
|
private renderLoopCallback;
|
|
@@ -285,6 +296,7 @@ export declare class Engine {
|
|
|
285
296
|
private writeBloomUniforms;
|
|
286
297
|
init(): Promise<void>;
|
|
287
298
|
private bakeBrdfLut;
|
|
299
|
+
private bakeFilmicLut;
|
|
288
300
|
private createRenderPipeline;
|
|
289
301
|
private createPipelines;
|
|
290
302
|
private setupResize;
|
|
@@ -358,6 +370,7 @@ export declare class Engine {
|
|
|
358
370
|
toggleMaterialVisible(modelName: string, materialName: string): void;
|
|
359
371
|
isMaterialVisible(modelName: string, materialName: string): boolean;
|
|
360
372
|
setIKEnabled(enabled: boolean): void;
|
|
373
|
+
setGpuMorphsEnabled(enabled: boolean): void;
|
|
361
374
|
getIKEnabled(): boolean;
|
|
362
375
|
setPhysicsEnabled(enabled: boolean): void;
|
|
363
376
|
getPhysicsEnabled(): boolean;
|
|
@@ -365,7 +378,9 @@ export declare class Engine {
|
|
|
365
378
|
private forEachInstance;
|
|
366
379
|
private updateInstances;
|
|
367
380
|
private updateVertexBuffer;
|
|
381
|
+
private dispatchMorphCompute;
|
|
368
382
|
private setupModelInstance;
|
|
383
|
+
private createGpuMorph;
|
|
369
384
|
private createGroundGeometry;
|
|
370
385
|
private createShadowGroundResources;
|
|
371
386
|
private shadowLightVPDirty;
|
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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Camera } from "./camera";
|
|
2
2
|
import { Mat4, Quat, Vec3 } from "./math";
|
|
3
|
+
import { MORPH_COMPUTE_WGSL } from "./shaders/passes/morph";
|
|
3
4
|
import { PmxLoader } from "./pmx-loader";
|
|
4
5
|
import { RezePhysics } from "./physics";
|
|
5
6
|
import { createFetchAssetReader, createFileMapAssetReader, deriveBasePathFromPmxPath, fileListToMap, findFirstPmxFileInList, joinAssetPath, normalizeAssetPath, } from "./asset-reader";
|
|
@@ -116,18 +117,23 @@ export class Engine {
|
|
|
116
117
|
// IK and physics enabled at engine level (same for all models)
|
|
117
118
|
this.ikEnabled = true;
|
|
118
119
|
this.physicsEnabled = true;
|
|
120
|
+
// GPU vertex-morph path. Set false BEFORE loadModel to fall back to the CPU path (A/B).
|
|
121
|
+
this.useGpuMorphs = true;
|
|
119
122
|
// Camera target binding (Babylon/Three style: camera follows model)
|
|
120
123
|
this.cameraTargetModel = null;
|
|
121
124
|
this.cameraTargetBoneName = "全ての親";
|
|
122
125
|
this.cameraTargetOffset = new Vec3(0, 0, 0);
|
|
123
|
-
this.lastFpsUpdate = performance.now();
|
|
124
|
-
this.framesSinceLastUpdate = 0;
|
|
125
126
|
this.lastFrameTime = performance.now();
|
|
126
|
-
this.
|
|
127
|
-
this.
|
|
127
|
+
this.frameIntervals = new Float32Array(Engine.STATS_WINDOW);
|
|
128
|
+
this.frameIntervalWrite = 0;
|
|
129
|
+
this.frameIntervalFilled = 0;
|
|
130
|
+
this.lastStatsCompute = performance.now();
|
|
128
131
|
this.stats = {
|
|
129
132
|
fps: 0,
|
|
130
133
|
frameTime: 0,
|
|
134
|
+
frameTimeMax: 0,
|
|
135
|
+
fps1PercentLow: 0,
|
|
136
|
+
jitter: 0,
|
|
131
137
|
};
|
|
132
138
|
this.animationFrameId = null;
|
|
133
139
|
this.renderLoopCallback = null;
|
|
@@ -571,6 +577,87 @@ export class Engine {
|
|
|
571
577
|
this.device.queue.submit([enc.finish()]);
|
|
572
578
|
ltcTemp.destroy();
|
|
573
579
|
}
|
|
580
|
+
// Bake the Blender 3.6 Filmic MHC tone curve into a WIDTH×1 r16float LUT sampled by the
|
|
581
|
+
// composite pass. The 14 anchors are the same as the old inline array; we fit a monotone
|
|
582
|
+
// cubic (Fritsch–Carlson) through them so the curve is C1-continuous (no Mach banding in
|
|
583
|
+
// smooth gradients) while still passing through every anchor (look preserved) and staying
|
|
584
|
+
// monotone (no tonemap overshoot/ringing). Domain is uniform in log2 space: anchor k sits
|
|
585
|
+
// at t=k, k=0..13 (t = log2(linear)+10). See composite.ts::filmic for the sampling map.
|
|
586
|
+
bakeFilmicLut() {
|
|
587
|
+
const anchors = [
|
|
588
|
+
0.0028, 0.0068, 0.0151, 0.0313, 0.061, 0.112, 0.192, 0.306, 0.459, 0.631, 0.82, 0.907, 0.962, 0.989,
|
|
589
|
+
];
|
|
590
|
+
const n = anchors.length;
|
|
591
|
+
// Secant slopes (unit spacing, so d_k = y_{k+1} - y_k).
|
|
592
|
+
const d = new Array(n - 1);
|
|
593
|
+
for (let k = 0; k < n - 1; k++)
|
|
594
|
+
d[k] = anchors[k + 1] - anchors[k];
|
|
595
|
+
// Endpoint + interior tangents.
|
|
596
|
+
const m = new Array(n);
|
|
597
|
+
m[0] = d[0];
|
|
598
|
+
m[n - 1] = d[n - 2];
|
|
599
|
+
for (let k = 1; k < n - 1; k++)
|
|
600
|
+
m[k] = (d[k - 1] + d[k]) * 0.5;
|
|
601
|
+
// Fritsch–Carlson monotonicity clamp.
|
|
602
|
+
for (let k = 0; k < n - 1; k++) {
|
|
603
|
+
if (d[k] === 0) {
|
|
604
|
+
m[k] = 0;
|
|
605
|
+
m[k + 1] = 0;
|
|
606
|
+
continue;
|
|
607
|
+
}
|
|
608
|
+
const a = m[k] / d[k];
|
|
609
|
+
const b = m[k + 1] / d[k];
|
|
610
|
+
const s = a * a + b * b;
|
|
611
|
+
if (s > 9) {
|
|
612
|
+
const tau = 3 / Math.sqrt(s);
|
|
613
|
+
m[k] = tau * a * d[k];
|
|
614
|
+
m[k + 1] = tau * b * d[k];
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
const W = Engine.FILMIC_LUT_WIDTH;
|
|
618
|
+
const values = new Float32Array(W);
|
|
619
|
+
for (let j = 0; j < W; j++) {
|
|
620
|
+
const t = ((n - 1) * j) / (W - 1); // t ∈ [0, n-1]
|
|
621
|
+
const k = Math.min(Math.floor(t), n - 2);
|
|
622
|
+
const s = t - k; // local param in [0,1], unit-spaced segment
|
|
623
|
+
const s2 = s * s;
|
|
624
|
+
const s3 = s2 * s;
|
|
625
|
+
// Hermite basis (h=1).
|
|
626
|
+
const h00 = 2 * s3 - 3 * s2 + 1;
|
|
627
|
+
const h10 = s3 - 2 * s2 + s;
|
|
628
|
+
const h01 = -2 * s3 + 3 * s2;
|
|
629
|
+
const h11 = s3 - s2;
|
|
630
|
+
values[j] = h00 * anchors[k] + h10 * m[k] + h01 * anchors[k + 1] + h11 * m[k + 1];
|
|
631
|
+
}
|
|
632
|
+
// f32 → f16 bits (same conversion as bakeBrdfLut).
|
|
633
|
+
const half = new Uint16Array(W);
|
|
634
|
+
const f32 = new Float32Array(1);
|
|
635
|
+
const u32 = new Uint32Array(f32.buffer);
|
|
636
|
+
for (let j = 0; j < W; j++) {
|
|
637
|
+
f32[0] = values[j];
|
|
638
|
+
const x = u32[0];
|
|
639
|
+
const sign = (x >>> 16) & 0x8000;
|
|
640
|
+
const exp = ((x >>> 23) & 0xff) - 127 + 15;
|
|
641
|
+
const mant = x & 0x7fffff;
|
|
642
|
+
if (exp <= 0) {
|
|
643
|
+
half[j] = sign;
|
|
644
|
+
}
|
|
645
|
+
else if (exp >= 31) {
|
|
646
|
+
half[j] = sign | 0x7c00;
|
|
647
|
+
}
|
|
648
|
+
else {
|
|
649
|
+
half[j] = sign | (exp << 10) | (mant >>> 13);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
this.filmicLutTexture = this.device.createTexture({
|
|
653
|
+
label: "Filmic tone LUT",
|
|
654
|
+
size: [W, 1],
|
|
655
|
+
format: "r16float",
|
|
656
|
+
usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
|
|
657
|
+
});
|
|
658
|
+
this.filmicLutView = this.filmicLutTexture.createView();
|
|
659
|
+
this.device.queue.writeTexture({ texture: this.filmicLutTexture }, half, { bytesPerRow: W * 2, rowsPerImage: 1 }, { width: W, height: 1, depthOrArrayLayers: 1 });
|
|
660
|
+
}
|
|
574
661
|
createRenderPipeline(config) {
|
|
575
662
|
const targets = config.fragmentTargets ?? (config.fragmentTarget ? [config.fragmentTarget] : undefined);
|
|
576
663
|
return this.device.createRenderPipeline({
|
|
@@ -953,6 +1040,7 @@ export class Engine {
|
|
|
953
1040
|
this.shadowMapDepthView = this.shadowMapTexture.createView();
|
|
954
1041
|
// One-shot bake of Blender EEVEE's combined BRDF LUT (DFG + LTC packed rgba8unorm).
|
|
955
1042
|
this.bakeBrdfLut();
|
|
1043
|
+
this.bakeFilmicLut();
|
|
956
1044
|
// Now that shadow resources exist, create the main per-frame bind group
|
|
957
1045
|
this.perFrameBindGroup = this.device.createBindGroup({
|
|
958
1046
|
label: "main per-frame bind group",
|
|
@@ -1217,6 +1305,8 @@ export class Engine {
|
|
|
1217
1305
|
// Aux mask/alpha texture — composite reads .g to reconstruct the alpha that
|
|
1218
1306
|
// used to live in the HDR target before the rg11b10ufloat switch.
|
|
1219
1307
|
{ binding: 4, visibility: GPUShaderStage.FRAGMENT, texture: {} },
|
|
1308
|
+
// Filmic tone LUT (r16float, filterable) — sampled with the binding-2 sampler.
|
|
1309
|
+
{ binding: 5, visibility: GPUShaderStage.FRAGMENT, texture: {} },
|
|
1220
1310
|
],
|
|
1221
1311
|
});
|
|
1222
1312
|
const compositeShader = this.device.createShaderModule({
|
|
@@ -1240,6 +1330,30 @@ export class Engine {
|
|
|
1240
1330
|
});
|
|
1241
1331
|
this.compositePipelineIdentity = makeCompositePipeline(false, "composite pipeline (gamma=1)");
|
|
1242
1332
|
this.compositePipelineGamma = makeCompositePipeline(true, "composite pipeline (gamma!=1)");
|
|
1333
|
+
// GPU vertex-morph compute pipeline (shared by all models; per-model bind groups).
|
|
1334
|
+
// Bindings: 0-4 read-only storage (base pos, CSR rowStart/colMorph/colOffset, weights),
|
|
1335
|
+
// 5 read-write storage (vertex buffer), 6 uniform (params).
|
|
1336
|
+
const roStorage = { type: "read-only-storage" };
|
|
1337
|
+
this.morphComputeBindGroupLayout = this.device.createBindGroupLayout({
|
|
1338
|
+
label: "morph compute bind group layout",
|
|
1339
|
+
entries: [
|
|
1340
|
+
{ binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: roStorage },
|
|
1341
|
+
{ binding: 1, visibility: GPUShaderStage.COMPUTE, buffer: roStorage },
|
|
1342
|
+
{ binding: 2, visibility: GPUShaderStage.COMPUTE, buffer: roStorage },
|
|
1343
|
+
{ binding: 3, visibility: GPUShaderStage.COMPUTE, buffer: roStorage },
|
|
1344
|
+
{ binding: 4, visibility: GPUShaderStage.COMPUTE, buffer: roStorage },
|
|
1345
|
+
{ binding: 5, visibility: GPUShaderStage.COMPUTE, buffer: { type: "storage" } },
|
|
1346
|
+
{ binding: 6, visibility: GPUShaderStage.COMPUTE, buffer: { type: "uniform" } },
|
|
1347
|
+
],
|
|
1348
|
+
});
|
|
1349
|
+
this.morphComputePipeline = this.device.createComputePipeline({
|
|
1350
|
+
label: "morph compute pipeline",
|
|
1351
|
+
layout: this.device.createPipelineLayout({ bindGroupLayouts: [this.morphComputeBindGroupLayout] }),
|
|
1352
|
+
compute: {
|
|
1353
|
+
module: this.device.createShaderModule({ label: "morph compute shader", code: MORPH_COMPUTE_WGSL }),
|
|
1354
|
+
entryPoint: "cs",
|
|
1355
|
+
},
|
|
1356
|
+
});
|
|
1243
1357
|
this.bloomPassDescriptor = {
|
|
1244
1358
|
label: "bloom pass",
|
|
1245
1359
|
colorAttachments: [
|
|
@@ -1529,6 +1643,7 @@ export class Engine {
|
|
|
1529
1643
|
{ binding: 2, resource: this.bloomSampler },
|
|
1530
1644
|
{ binding: 3, resource: { buffer: this.compositeUniformBuffer } },
|
|
1531
1645
|
{ binding: 4, resource: this.maskResolveView },
|
|
1646
|
+
{ binding: 5, resource: this.filmicLutView },
|
|
1532
1647
|
],
|
|
1533
1648
|
});
|
|
1534
1649
|
}
|
|
@@ -2029,6 +2144,10 @@ export class Engine {
|
|
|
2029
2144
|
setIKEnabled(enabled) {
|
|
2030
2145
|
this.ikEnabled = enabled;
|
|
2031
2146
|
}
|
|
2147
|
+
// Toggle the GPU vertex-morph path. Only affects models loaded afterwards.
|
|
2148
|
+
setGpuMorphsEnabled(enabled) {
|
|
2149
|
+
this.useGpuMorphs = enabled;
|
|
2150
|
+
}
|
|
2032
2151
|
getIKEnabled() {
|
|
2033
2152
|
return this.ikEnabled;
|
|
2034
2153
|
}
|
|
@@ -2056,8 +2175,24 @@ export class Engine {
|
|
|
2056
2175
|
updateInstances(deltaTime) {
|
|
2057
2176
|
this.forEachInstance((inst) => {
|
|
2058
2177
|
const verticesChanged = inst.model.update(deltaTime, this.ikEnabled);
|
|
2059
|
-
if (
|
|
2178
|
+
if (inst.gpuMorph) {
|
|
2179
|
+
// GPU path: on a weight change, upload effective weights (thresholding tiny values
|
|
2180
|
+
// to 0 to match the CPU skip) and flag the compute dispatch for this frame.
|
|
2181
|
+
if (inst.model.consumeMorphWeightsDirty()) {
|
|
2182
|
+
const eff = inst.model.getEffectiveMorphWeights();
|
|
2183
|
+
const wd = inst.gpuMorph.weightsData;
|
|
2184
|
+
const n = Math.min(wd.length, eff.length);
|
|
2185
|
+
for (let i = 0; i < n; i++) {
|
|
2186
|
+
const w = eff[i];
|
|
2187
|
+
wd[i] = w < 0.0001 ? 0 : w;
|
|
2188
|
+
}
|
|
2189
|
+
this.device.queue.writeBuffer(inst.gpuMorph.weightsBuffer, 0, wd);
|
|
2190
|
+
inst.gpuMorph.dispatchNeeded = true;
|
|
2191
|
+
}
|
|
2192
|
+
}
|
|
2193
|
+
else if (verticesChanged) {
|
|
2060
2194
|
inst.vertexBufferNeedsUpdate = true;
|
|
2195
|
+
}
|
|
2061
2196
|
if (inst.physics && this.physicsEnabled) {
|
|
2062
2197
|
inst.physics.step(deltaTime, inst.model.getWorldMatrices(), inst.model.getBoneInverseBindMatrices());
|
|
2063
2198
|
}
|
|
@@ -2066,12 +2201,48 @@ export class Engine {
|
|
|
2066
2201
|
});
|
|
2067
2202
|
}
|
|
2068
2203
|
updateVertexBuffer(inst) {
|
|
2204
|
+
// GPU-morph models never CPU-upload the vertex buffer after load — the compute pass
|
|
2205
|
+
// owns the position slots. Ignore any stray dirty flag (e.g. from markVertexBufferDirty).
|
|
2206
|
+
if (inst.gpuMorph) {
|
|
2207
|
+
inst.vertexBufferNeedsUpdate = false;
|
|
2208
|
+
return;
|
|
2209
|
+
}
|
|
2069
2210
|
const vertices = inst.model.getVertices();
|
|
2070
2211
|
if (!vertices?.length)
|
|
2071
2212
|
return;
|
|
2072
|
-
|
|
2213
|
+
// Vertex morphs touch only a subset of verts (typically the face), so upload just the
|
|
2214
|
+
// changed [minVert, maxVert] slice when the model can report one; null = full upload.
|
|
2215
|
+
const range = inst.model.consumeVertexUploadRange();
|
|
2216
|
+
if (range) {
|
|
2217
|
+
const STRIDE = 8; // floats per vertex (pos3 + normal3 + uv2)
|
|
2218
|
+
const firstFloat = range.minVert * STRIDE;
|
|
2219
|
+
const floatLen = (range.maxVert - range.minVert + 1) * STRIDE;
|
|
2220
|
+
const byteOffset = firstFloat * 4;
|
|
2221
|
+
this.device.queue.writeBuffer(inst.vertexBuffer, byteOffset, vertices.buffer, vertices.byteOffset + byteOffset, floatLen * 4);
|
|
2222
|
+
}
|
|
2223
|
+
else {
|
|
2224
|
+
this.device.queue.writeBuffer(inst.vertexBuffer, 0, vertices);
|
|
2225
|
+
}
|
|
2073
2226
|
inst.vertexBufferNeedsUpdate = false;
|
|
2074
2227
|
}
|
|
2228
|
+
// One compute pass covering every model whose morph weights changed this frame.
|
|
2229
|
+
dispatchMorphCompute(encoder) {
|
|
2230
|
+
let pass = null;
|
|
2231
|
+
for (const inst of this.modelInstances.values()) {
|
|
2232
|
+
const gm = inst.gpuMorph;
|
|
2233
|
+
if (!gm || !gm.dispatchNeeded)
|
|
2234
|
+
continue;
|
|
2235
|
+
if (!pass) {
|
|
2236
|
+
pass = encoder.beginComputePass({ label: "morph compute" });
|
|
2237
|
+
pass.setPipeline(this.morphComputePipeline);
|
|
2238
|
+
}
|
|
2239
|
+
pass.setBindGroup(0, gm.bindGroup);
|
|
2240
|
+
pass.dispatchWorkgroups(gm.workgroups);
|
|
2241
|
+
gm.dispatchNeeded = false;
|
|
2242
|
+
}
|
|
2243
|
+
if (pass)
|
|
2244
|
+
pass.end();
|
|
2245
|
+
}
|
|
2075
2246
|
async setupModelInstance(name, model, basePath, assetReader) {
|
|
2076
2247
|
const vertices = model.getVertices();
|
|
2077
2248
|
const skinning = model.getSkinning();
|
|
@@ -2081,7 +2252,8 @@ export class Engine {
|
|
|
2081
2252
|
const vertexBuffer = this.device.createBuffer({
|
|
2082
2253
|
label: `${name}: vertex buffer`,
|
|
2083
2254
|
size: vertices.byteLength,
|
|
2084
|
-
|
|
2255
|
+
// STORAGE so the morph compute pass can write morphed positions in place.
|
|
2256
|
+
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE,
|
|
2085
2257
|
});
|
|
2086
2258
|
this.device.queue.writeBuffer(vertexBuffer, 0, vertices);
|
|
2087
2259
|
const jointsBuffer = this.device.createBuffer({
|
|
@@ -2131,6 +2303,7 @@ export class Engine {
|
|
|
2131
2303
|
entries: [{ binding: 0, resource: { buffer: skinMatrixBuffer } }],
|
|
2132
2304
|
});
|
|
2133
2305
|
const gpuBuffers = [vertexBuffer, indexBuffer, jointsBuffer, weightsBuffer, skinMatrixBuffer];
|
|
2306
|
+
const gpuMorph = this.createGpuMorph(name, model, vertexBuffer, gpuBuffers);
|
|
2134
2307
|
const inst = {
|
|
2135
2308
|
name,
|
|
2136
2309
|
model,
|
|
@@ -2153,10 +2326,71 @@ export class Engine {
|
|
|
2153
2326
|
materialPresets: undefined,
|
|
2154
2327
|
physics,
|
|
2155
2328
|
vertexBufferNeedsUpdate: false,
|
|
2329
|
+
gpuMorph,
|
|
2156
2330
|
};
|
|
2157
2331
|
await this.setupMaterialsForInstance(inst);
|
|
2158
2332
|
this.modelInstances.set(name, inst);
|
|
2159
2333
|
}
|
|
2334
|
+
// Build the per-model GPU vertex-morph state. Returns null (and leaves the model on the
|
|
2335
|
+
// CPU morph path) when the model has no vertex morphs. Created buffers are pushed into
|
|
2336
|
+
// gpuBuffers so they're released with the instance.
|
|
2337
|
+
createGpuMorph(name, model, vertexBuffer, gpuBuffers) {
|
|
2338
|
+
if (!this.useGpuMorphs)
|
|
2339
|
+
return null;
|
|
2340
|
+
const data = model.buildMorphComputeData();
|
|
2341
|
+
if (!data)
|
|
2342
|
+
return null;
|
|
2343
|
+
const RO = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST;
|
|
2344
|
+
const mkStorage = (label, arr) => {
|
|
2345
|
+
const buf = this.device.createBuffer({
|
|
2346
|
+
label: `${name}: morph ${label}`,
|
|
2347
|
+
size: Math.max(arr.byteLength, 4),
|
|
2348
|
+
usage: RO,
|
|
2349
|
+
});
|
|
2350
|
+
this.device.queue.writeBuffer(buf, 0, arr);
|
|
2351
|
+
gpuBuffers.push(buf);
|
|
2352
|
+
return buf;
|
|
2353
|
+
};
|
|
2354
|
+
const baseBuf = mkStorage("basePositions", data.basePositions);
|
|
2355
|
+
const rowBuf = mkStorage("rowStart", data.rowStart);
|
|
2356
|
+
const colMorphBuf = mkStorage("colMorph", data.colMorph);
|
|
2357
|
+
const colOffsetBuf = mkStorage("colOffset", data.colOffset);
|
|
2358
|
+
// Weights are zero-initialized by WebGPU; the first weight change uploads real values.
|
|
2359
|
+
const weightsBuffer = this.device.createBuffer({
|
|
2360
|
+
label: `${name}: morph weights`,
|
|
2361
|
+
size: Math.max(data.morphCount * 4, 4),
|
|
2362
|
+
usage: RO,
|
|
2363
|
+
});
|
|
2364
|
+
gpuBuffers.push(weightsBuffer);
|
|
2365
|
+
const paramsBuffer = this.device.createBuffer({
|
|
2366
|
+
label: `${name}: morph params`,
|
|
2367
|
+
size: 16,
|
|
2368
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
2369
|
+
});
|
|
2370
|
+
this.device.queue.writeBuffer(paramsBuffer, 0, new Uint32Array([data.vertexCount, 0, 0, 0]));
|
|
2371
|
+
gpuBuffers.push(paramsBuffer);
|
|
2372
|
+
const bindGroup = this.device.createBindGroup({
|
|
2373
|
+
label: `${name}: morph compute bind group`,
|
|
2374
|
+
layout: this.morphComputeBindGroupLayout,
|
|
2375
|
+
entries: [
|
|
2376
|
+
{ binding: 0, resource: { buffer: baseBuf } },
|
|
2377
|
+
{ binding: 1, resource: { buffer: rowBuf } },
|
|
2378
|
+
{ binding: 2, resource: { buffer: colMorphBuf } },
|
|
2379
|
+
{ binding: 3, resource: { buffer: colOffsetBuf } },
|
|
2380
|
+
{ binding: 4, resource: { buffer: weightsBuffer } },
|
|
2381
|
+
{ binding: 5, resource: { buffer: vertexBuffer } },
|
|
2382
|
+
{ binding: 6, resource: { buffer: paramsBuffer } },
|
|
2383
|
+
],
|
|
2384
|
+
});
|
|
2385
|
+
model.enableGpuMorphs();
|
|
2386
|
+
return {
|
|
2387
|
+
bindGroup,
|
|
2388
|
+
weightsBuffer,
|
|
2389
|
+
weightsData: new Float32Array(data.morphCount),
|
|
2390
|
+
workgroups: Math.ceil(data.vertexCount / 64),
|
|
2391
|
+
dispatchNeeded: false, // vertex buffer already holds base; dispatch on first weight change
|
|
2392
|
+
};
|
|
2393
|
+
}
|
|
2160
2394
|
createGroundGeometry(width = 100, height = 100) {
|
|
2161
2395
|
const halfWidth = width / 2;
|
|
2162
2396
|
const halfHeight = height / 2;
|
|
@@ -2848,6 +3082,10 @@ export class Engine {
|
|
|
2848
3082
|
this.updateCameraUniforms();
|
|
2849
3083
|
this.updateShadowLightVP();
|
|
2850
3084
|
const encoder = this.device.createCommandEncoder();
|
|
3085
|
+
// GPU vertex morphs: write morphed positions into vertex buffers before any pass reads
|
|
3086
|
+
// them. WebGPU inserts the storage→vertex barrier between this pass and the render passes.
|
|
3087
|
+
if (hasModels)
|
|
3088
|
+
this.dispatchMorphCompute(encoder);
|
|
2851
3089
|
if (hasModels) {
|
|
2852
3090
|
const sp = encoder.beginRenderPass({
|
|
2853
3091
|
colorAttachments: [],
|
|
@@ -2928,7 +3166,9 @@ export class Engine {
|
|
|
2928
3166
|
const dpr = window.devicePixelRatio || 1;
|
|
2929
3167
|
this.resolvePickResult(pick.x / dpr, pick.y / dpr);
|
|
2930
3168
|
}
|
|
2931
|
-
|
|
3169
|
+
// Feed the true vsync-to-vsync interval (deltaTime, computed at frame start), not the
|
|
3170
|
+
// CPU time spent in render() — that's what actually reflects perceived smoothness.
|
|
3171
|
+
this.updateStats(deltaTime * 1000);
|
|
2932
3172
|
}
|
|
2933
3173
|
drawInstanceShadow(sp, inst) {
|
|
2934
3174
|
sp.setBindGroup(0, inst.shadowBindGroup);
|
|
@@ -3065,27 +3305,48 @@ export class Engine {
|
|
|
3065
3305
|
this.device.queue.writeBuffer(inst.skinMatrixBuffer, 0, skinMatrices.buffer, skinMatrices.byteOffset, skinMatrices.byteLength);
|
|
3066
3306
|
});
|
|
3067
3307
|
}
|
|
3068
|
-
|
|
3069
|
-
|
|
3070
|
-
|
|
3071
|
-
|
|
3072
|
-
|
|
3073
|
-
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
this.
|
|
3077
|
-
this.frameTimeCount = maxSamples;
|
|
3078
|
-
}
|
|
3079
|
-
this.stats.frameTime = Math.round((this.frameTimeSum / this.frameTimeCount) * 100) / 100;
|
|
3080
|
-
// FPS tracking
|
|
3308
|
+
// frameIntervalMs is the true vsync-to-vsync frame interval (render dt), NOT the CPU
|
|
3309
|
+
// time spent in render() — the latter misses GPU cost and pacing, so it can read fast
|
|
3310
|
+
// while the scene stutters. Metrics are derived from a ring buffer of these intervals.
|
|
3311
|
+
updateStats(frameIntervalMs) {
|
|
3312
|
+
const w = Engine.STATS_WINDOW;
|
|
3313
|
+
this.frameIntervals[this.frameIntervalWrite] = frameIntervalMs;
|
|
3314
|
+
this.frameIntervalWrite = (this.frameIntervalWrite + 1) % w;
|
|
3315
|
+
if (this.frameIntervalFilled < w)
|
|
3316
|
+
this.frameIntervalFilled++;
|
|
3081
3317
|
const now = performance.now();
|
|
3082
|
-
this.
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3086
|
-
|
|
3087
|
-
|
|
3318
|
+
if (now - this.lastStatsCompute < Engine.STATS_REFRESH_MS)
|
|
3319
|
+
return;
|
|
3320
|
+
this.lastStatsCompute = now;
|
|
3321
|
+
const n = this.frameIntervalFilled;
|
|
3322
|
+
if (n === 0)
|
|
3323
|
+
return;
|
|
3324
|
+
let sum = 0;
|
|
3325
|
+
let max = 0;
|
|
3326
|
+
for (let i = 0; i < n; i++) {
|
|
3327
|
+
const v = this.frameIntervals[i];
|
|
3328
|
+
sum += v;
|
|
3329
|
+
if (v > max)
|
|
3330
|
+
max = v;
|
|
3331
|
+
}
|
|
3332
|
+
const mean = sum / n;
|
|
3333
|
+
let varSum = 0;
|
|
3334
|
+
for (let i = 0; i < n; i++) {
|
|
3335
|
+
const d = this.frameIntervals[i] - mean;
|
|
3336
|
+
varSum += d * d;
|
|
3088
3337
|
}
|
|
3338
|
+
const stddev = Math.sqrt(varSum / n);
|
|
3339
|
+
// 99th-percentile frame interval → "1% low" fps. TypedArray.sort is numeric.
|
|
3340
|
+
const sorted = this.frameIntervals.slice(0, n).sort();
|
|
3341
|
+
const p99 = sorted[Math.min(n - 1, Math.floor(n * 0.99))];
|
|
3342
|
+
// fps from the MEAN interval is inherently bounded by the real refresh (a vsync-locked
|
|
3343
|
+
// interval can't average below the refresh period), so this never reads above the
|
|
3344
|
+
// monitor rate — fixing the old frame-count/window off-by-one (61 on 60Hz, 241 on 240Hz).
|
|
3345
|
+
this.stats.fps = mean > 0 ? Math.round(1000 / mean) : 0;
|
|
3346
|
+
this.stats.frameTime = Math.round(mean * 100) / 100;
|
|
3347
|
+
this.stats.frameTimeMax = Math.round(max * 100) / 100;
|
|
3348
|
+
this.stats.fps1PercentLow = p99 > 0 ? Math.round(1000 / p99) : 0;
|
|
3349
|
+
this.stats.jitter = Math.round(stddev * 100) / 100;
|
|
3089
3350
|
}
|
|
3090
3351
|
}
|
|
3091
3352
|
Engine.instance = null;
|
|
@@ -3111,4 +3372,10 @@ Engine.STENCIL_EYE_VALUE = 1;
|
|
|
3111
3372
|
* rg8unorm at 4× MSAA is 8 bytes/texel — still fits Apple TBDR tile memory comfortably. */
|
|
3112
3373
|
Engine.BLOOM_MASK_FORMAT = "rg8unorm";
|
|
3113
3374
|
Engine.BLOOM_MAX_LEVELS = 5;
|
|
3375
|
+
// Width of the baked Filmic tone LUT (composite.ts FILMIC_LUT_W must match).
|
|
3376
|
+
Engine.FILMIC_LUT_WIDTH = 256;
|
|
3114
3377
|
Engine.SHADOW_MAP_SIZE = 2048;
|
|
3378
|
+
// Smoothness metrics are computed over a ring buffer of true frame intervals
|
|
3379
|
+
// (vsync-to-vsync), recomputed at STATS_REFRESH_MS so the readout doesn't flicker.
|
|
3380
|
+
Engine.STATS_WINDOW = 120;
|
|
3381
|
+
Engine.STATS_REFRESH_MS = 500;
|
package/dist/ik-solver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ik-solver.d.ts","sourceRoot":"","sources":["../src/ik-solver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,IAAI,EAAU,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAG7D,MAAM,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"ik-solver.d.ts","sourceRoot":"","sources":["../src/ik-solver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,IAAI,EAAU,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAG7D,MAAM,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;AAwF/E,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAS;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAExD,MAAM,CAAC,KAAK,CACV,SAAS,EAAE,QAAQ,EAAE,EACrB,KAAK,EAAE,IAAI,EAAE,EACb,cAAc,EAAE,IAAI,EAAE,EACtB,iBAAiB,EAAE,IAAI,EAAE,EACzB,aAAa,EAAE,IAAI,EAAE,EACrB,WAAW,EAAE,WAAW,EAAE,EAC1B,iBAAiB,CAAC,EAAE,mBAAmB,GACtC,IAAI;IAMP,OAAO,CAAC,MAAM,CAAC,OAAO;IAqFtB,OAAO,CAAC,MAAM,CAAC,UAAU;IA4HzB,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAOjC;IAED,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAsCrC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAMnC,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAyB3C,OAAO,CAAC,MAAM,CAAC,gCAAgC;IAkB/C,OAAO,CAAC,MAAM,CAAC,iBAAiB;CA2CjC"}
|