reze-engine 0.58.0 → 0.58.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/effect-points.d.ts +30 -0
- package/dist/effect-points.d.ts.map +1 -0
- package/dist/effect-points.js +49 -0
- package/dist/engine.d.ts +30 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +149 -19
- package/dist/light-grid.d.ts +25 -0
- package/dist/light-grid.d.ts.map +1 -0
- package/dist/light-grid.js +91 -0
- package/dist/model.d.ts +9 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +6 -0
- package/dist/pmx-loader.d.ts.map +1 -1
- package/dist/pmx-loader.js +11 -6
- package/dist/shaders/cast-api.d.ts +1 -1
- package/dist/shaders/cast-layout.d.ts +5 -3
- package/dist/shaders/cast-layout.d.ts.map +1 -1
- package/dist/shaders/cast-layout.js +5 -3
- package/dist/shaders/directives.d.ts +3 -0
- package/dist/shaders/directives.d.ts.map +1 -1
- package/dist/shaders/directives.js +5 -0
- package/dist/shaders/lights.d.ts +16 -19
- package/dist/shaders/lights.d.ts.map +1 -1
- package/dist/shaders/lights.js +121 -88
- package/dist/shaders/materials/common.d.ts.map +1 -1
- package/dist/shaders/materials/common.js +3 -17
- 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 +4 -0
- package/dist/shaders/passes/grid.d.ts.map +1 -1
- package/dist/shaders/passes/grid.js +4 -0
- package/dist/shaders/passes/particles.d.ts +4 -0
- package/dist/shaders/passes/particles.d.ts.map +1 -1
- package/dist/shaders/passes/particles.js +13 -1
- package/dist/shaders/passes/trails.d.ts.map +1 -1
- package/dist/shaders/passes/trails.js +3 -1
- package/dist/shaders/points-api.d.ts +11 -0
- package/dist/shaders/points-api.d.ts.map +1 -0
- package/dist/shaders/points-api.js +58 -0
- package/dist/shaders/scene-light-api.d.ts +42 -0
- package/dist/shaders/scene-light-api.d.ts.map +1 -0
- package/dist/shaders/scene-light-api.js +144 -0
- package/dist/shaders/shadow-api.d.ts +29 -0
- package/dist/shaders/shadow-api.d.ts.map +1 -0
- package/dist/shaders/shadow-api.js +112 -0
- package/package.json +1 -1
- package/src/effect-points.ts +67 -0
- package/src/engine.ts +163 -18
- package/src/light-grid.ts +139 -0
- package/src/model.ts +12 -0
- package/src/pmx-loader.ts +13 -6
- package/src/shaders/cast-layout.ts +5 -3
- package/src/shaders/directives.ts +8 -0
- package/src/shaders/lights.ts +121 -88
- package/src/shaders/materials/common.ts +3 -17
- package/src/shaders/passes/composite.ts +4 -0
- package/src/shaders/passes/grid.ts +4 -0
- package/src/shaders/passes/particles.ts +14 -1
- package/src/shaders/passes/trails.ts +3 -1
- package/src/shaders/points-api.ts +66 -0
- package/src/shaders/scene-light-api.ts +148 -0
package/dist/engine.js
CHANGED
|
@@ -29,7 +29,8 @@ import { packHalf } from "./hdr";
|
|
|
29
29
|
import { evalIrradianceSH, projectIrradianceSH, gradientIrradianceSH } from "./ibl";
|
|
30
30
|
import { LYRIC_ATLAS_MAX_H, LYRIC_ATLAS_MAX_W, LYRICS_FLOATS, packLyrics } from "./shaders/lyrics-api";
|
|
31
31
|
import { sceneTargets as sceneTargetsFor, sceneColorFormats, setMrtIds, mrtIdsEnabled, SCENE_ID_FORMAT, } from "./shaders/passes/scene-contract";
|
|
32
|
-
import { LIGHT_HEADER, LIGHT_STRIDE, LIGHTS_FLOATS, MAX_LIGHTS, buildLightEmitShader, hasLightEmit, } from "./shaders/lights";
|
|
32
|
+
import { LIGHT_GRID_BASE, LIGHT_HEADER, LIGHT_STRIDE, LIGHTS_FLOATS, MAX_LIGHTS, buildLightEmitShader, hasLightEmit, } from "./shaders/lights";
|
|
33
|
+
import { buildLightGrid } from "./light-grid";
|
|
33
34
|
import { groundShaderWgsl, GROUND_NOISE_BAKE_WGSL, GROUND_NOISE_SIZE } from "./shaders/passes/ground";
|
|
34
35
|
import { outlineShaderWgsl, RZ_OUTLINE_DISSOLVE_OFFSET } from "./shaders/passes/outline";
|
|
35
36
|
import { transparentDepthPrepassWgsl } from "./shaders/passes/depth-prepass";
|
|
@@ -41,7 +42,9 @@ import { boneOverlay, boneMarkerPositions, buildOverlayShapes, jointOverlay, lin
|
|
|
41
42
|
import { BLOOM_BLIT_SHADER_WGSL, BLOOM_DOWNSAMPLE_SHADER_WGSL, BLOOM_UPSAMPLE_SHADER_WGSL, } from "./shaders/passes/bloom";
|
|
42
43
|
import { AGX_LUT_GZ, AGX_LUT_SIZE } from "./shaders/agx-lut";
|
|
43
44
|
import { buildCompositeShader, EFFECT_SCENE_API, buildFieldShader, EFFECT_ANCHORS, EFFECT_SUBJECTS, EFFECT_TRAIL_BASE, EFFECT_TRAIL_SAMPLES, } from "./shaders/passes/composite";
|
|
44
|
-
import { buildParticleComputeShader, buildParticleRenderShader, particleEntryPoints, PARTICLE_STRIDE, } from "./shaders/passes/particles";
|
|
45
|
+
import { buildParticleComputeShader, buildParticleRenderShader, PARTICLE_LIGHT_BINDING, PARTICLE_POINTS_BINDING, particleEntryPoints, PARTICLE_STRIDE, } from "./shaders/passes/particles";
|
|
46
|
+
import { MAX_EFFECT_POINTS, POINTS_FLOATS } from "./shaders/points-api";
|
|
47
|
+
import { bonesWithPrefix, pointsData, writeBonePoint } from "./effect-points";
|
|
45
48
|
import { SIM_FORMAT, GRID_MAX, buildSimShader, gridEntryPoint, } from "./shaders/passes/grid";
|
|
46
49
|
import { buildCastResolveShader, buildCastSeedShader, buildCastStepShader, castDistanceUsed, CAST_COVERAGE_FORMAT, CAST_DIST_FORMAT, CAST_FIELD_DIV, CAST_SEED_FORMAT, } from "./shaders/passes/cast-distance";
|
|
47
50
|
import { buildTrailShader, trailEntryPoints, TRAIL_SUBDIVISIONS } from "./shaders/passes/trails";
|
|
@@ -1077,8 +1080,17 @@ export class Engine {
|
|
|
1077
1080
|
* effect is on 今汐" into a bit the shaders can read. */
|
|
1078
1081
|
this.castSlotOf = new Map();
|
|
1079
1082
|
this.effects = [];
|
|
1080
|
-
/**
|
|
1083
|
+
/** Per model, per prefix, the bones `#points` matched. A rig's bones never
|
|
1084
|
+
* change after load, so the names are walked once rather than every frame. */
|
|
1085
|
+
this.pointBones = new WeakMap();
|
|
1086
|
+
/** The CPU copy, from construction rather than init: a host sets a scene's
|
|
1087
|
+
* lamps as soon as its state exists, which can be before the device. */
|
|
1088
|
+
this.lightsData = new Float32Array(LIGHTS_FLOATS);
|
|
1089
|
+
/** The same bytes as words — the grid's lamp bits are u32, not floats. */
|
|
1090
|
+
this.lightsWords = new Uint32Array(this.lightsData.buffer);
|
|
1091
|
+
/** Just the header: the counts and the grid's placement. */
|
|
1081
1092
|
this.lightHeader = new Float32Array(LIGHT_HEADER);
|
|
1093
|
+
this.lightHeaderWords = new Uint32Array(this.lightHeader.buffer);
|
|
1082
1094
|
/** How many of the slots belong to the DOCUMENT. Effects get what follows. */
|
|
1083
1095
|
this.docLightCount = 0;
|
|
1084
1096
|
/** Last frame's anchor world positions, for velocity. Keyed model id → slot. */
|
|
@@ -1309,6 +1321,9 @@ export class Engine {
|
|
|
1309
1321
|
* without rebuilding the floor. */
|
|
1310
1322
|
this.groundBaseColor = new Vec3(1, 1, 1);
|
|
1311
1323
|
this.groundBaseNoise = 0;
|
|
1324
|
+
/** The caster sphere as last written after the cascade matrices; NaN so the
|
|
1325
|
+
* first frame always writes. */
|
|
1326
|
+
this.shadowCastersWritten = new Float32Array([NaN, NaN, NaN, NaN]);
|
|
1312
1327
|
/** Set by the first getGpuTimings() call. See it for why asking is the switch. */
|
|
1313
1328
|
this.timestampsWanted = false;
|
|
1314
1329
|
this.groundMirrorPipeline = null;
|
|
@@ -3565,6 +3580,7 @@ export class Engine {
|
|
|
3565
3580
|
paramsBuffer?.destroy();
|
|
3566
3581
|
particles?.buffer.destroy();
|
|
3567
3582
|
particles?.uniform.destroy();
|
|
3583
|
+
particles?.points?.buffer.destroy();
|
|
3568
3584
|
grid?.textures[0].destroy();
|
|
3569
3585
|
grid?.textures[1].destroy();
|
|
3570
3586
|
grid?.uniform.destroy();
|
|
@@ -3920,6 +3936,17 @@ export class Engine {
|
|
|
3920
3936
|
cover: particleEntryPoints(wgsl).cover,
|
|
3921
3937
|
};
|
|
3922
3938
|
const prepass = src.blend === "cutout" && src.cover;
|
|
3939
|
+
const points = d.points
|
|
3940
|
+
? {
|
|
3941
|
+
prefix: d.points,
|
|
3942
|
+
buffer: this.device.createBuffer({
|
|
3943
|
+
label: `points "${d.points}"`,
|
|
3944
|
+
size: POINTS_FLOATS * 4,
|
|
3945
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
3946
|
+
}),
|
|
3947
|
+
data: pointsData(),
|
|
3948
|
+
}
|
|
3949
|
+
: null;
|
|
3923
3950
|
// Sparks want to spawn where a trail is, so the particle stages see the same
|
|
3924
3951
|
// cast buffer the trail draw reads.
|
|
3925
3952
|
const cast = {
|
|
@@ -3945,11 +3972,15 @@ export class Engine {
|
|
|
3945
3972
|
return diagnostics.length ? diagnostics : module;
|
|
3946
3973
|
};
|
|
3947
3974
|
const computeModule = await compile(buildParticleComputeShader(src, cast), "particle compute");
|
|
3948
|
-
if (Array.isArray(computeModule))
|
|
3975
|
+
if (Array.isArray(computeModule)) {
|
|
3976
|
+
points?.buffer.destroy();
|
|
3949
3977
|
return { ok: false, diagnostics: computeModule };
|
|
3978
|
+
}
|
|
3950
3979
|
const renderModule = await compile(buildParticleRenderShader(src, cast), "particle render");
|
|
3951
|
-
if (Array.isArray(renderModule))
|
|
3980
|
+
if (Array.isArray(renderModule)) {
|
|
3981
|
+
points?.buffer.destroy();
|
|
3952
3982
|
return { ok: false, diagnostics: renderModule };
|
|
3983
|
+
}
|
|
3953
3984
|
// COPY_DST so a scheduled effect can empty its pool when its window starts.
|
|
3954
3985
|
const buffer = this.device.createBuffer({
|
|
3955
3986
|
label: "particle pool",
|
|
@@ -3972,7 +4003,7 @@ export class Engine {
|
|
|
3972
4003
|
// Declaring one set of flags for both layouts is what made the pipeline
|
|
3973
4004
|
// layout invalid, and the error surfaces later and unhelpfully as "invalid
|
|
3974
4005
|
// due to a previous error".
|
|
3975
|
-
const layoutFor = (storage, visibility) => this.device.createBindGroupLayout({
|
|
4006
|
+
const layoutFor = (storage, visibility, shadow) => this.device.createBindGroupLayout({
|
|
3976
4007
|
entries: [
|
|
3977
4008
|
{ binding: 0, visibility, buffer: { type: storage } },
|
|
3978
4009
|
{ binding: 1, visibility, buffer: { type: "uniform" } },
|
|
@@ -3991,13 +4022,28 @@ export class Engine {
|
|
|
3991
4022
|
// author calls it or not. With no grid it is the 1x1 of zeroes.
|
|
3992
4023
|
{ binding: 8, visibility, texture: { sampleType: "float" } },
|
|
3993
4024
|
{ binding: 9, visibility, sampler: { type: "filtering" } },
|
|
4025
|
+
// The named points, ALWAYS, for the grid's reason: the accessor is
|
|
4026
|
+
// compiled in whether or not the effect declared #points.
|
|
4027
|
+
{ binding: PARTICLE_POINTS_BINDING, visibility, buffer: { type: "read-only-storage" } },
|
|
4028
|
+
// The scene's light, for rzShadow and rzWorldAmbient — the shading
|
|
4029
|
+
// stage only; the compute module compiles the stubs. See
|
|
4030
|
+
// scene-light-api.ts.
|
|
4031
|
+
...(shadow
|
|
4032
|
+
? [
|
|
4033
|
+
{ binding: PARTICLE_LIGHT_BINDING, visibility: GPUShaderStage.FRAGMENT, buffer: { type: "uniform" } },
|
|
4034
|
+
{ binding: PARTICLE_LIGHT_BINDING + 1, visibility: GPUShaderStage.FRAGMENT, buffer: { type: "uniform" } },
|
|
4035
|
+
{ binding: PARTICLE_LIGHT_BINDING + 2, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "depth" } },
|
|
4036
|
+
{ binding: PARTICLE_LIGHT_BINDING + 3, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "depth" } },
|
|
4037
|
+
{ binding: PARTICLE_LIGHT_BINDING + 4, visibility: GPUShaderStage.FRAGMENT, sampler: { type: "comparison" } },
|
|
4038
|
+
]
|
|
4039
|
+
: []),
|
|
3994
4040
|
],
|
|
3995
4041
|
});
|
|
3996
4042
|
/** One per GRID PARITY, for the reason rebuildFieldBindGroup gives: the grid
|
|
3997
4043
|
* alternates which texture is current, and rebuilding a single group every
|
|
3998
4044
|
* frame is waste for a change that only ever toggles between two known
|
|
3999
4045
|
* states. Both entries are the same view when there is no grid. */
|
|
4000
|
-
const bindFor = (layout, camera) => [0, 1].map((parity) => this.device.createBindGroup({
|
|
4046
|
+
const bindFor = (layout, camera, shadow) => [0, 1].map((parity) => this.device.createBindGroup({
|
|
4001
4047
|
layout,
|
|
4002
4048
|
entries: [
|
|
4003
4049
|
{ binding: 0, resource: { buffer } },
|
|
@@ -4010,10 +4056,20 @@ export class Engine {
|
|
|
4010
4056
|
...(params.buffer ? [{ binding: 7, resource: { buffer: params.buffer } }] : []),
|
|
4011
4057
|
{ binding: 8, resource: grid ? grid.read[parity] : this.simFallbackView },
|
|
4012
4058
|
{ binding: 9, resource: this.simSampler },
|
|
4059
|
+
{ binding: PARTICLE_POINTS_BINDING, resource: { buffer: points?.buffer ?? this.pointsFallback } },
|
|
4060
|
+
...(shadow
|
|
4061
|
+
? [
|
|
4062
|
+
{ binding: PARTICLE_LIGHT_BINDING, resource: { buffer: this.lightUniformBuffer } },
|
|
4063
|
+
{ binding: PARTICLE_LIGHT_BINDING + 1, resource: { buffer: this.shadowLightVPBuffer } },
|
|
4064
|
+
{ binding: PARTICLE_LIGHT_BINDING + 2, resource: this.shadowMapDepthViews[0] },
|
|
4065
|
+
{ binding: PARTICLE_LIGHT_BINDING + 3, resource: this.shadowMapDepthViews[SHADOW_CASCADES.length - 1] },
|
|
4066
|
+
{ binding: PARTICLE_LIGHT_BINDING + 4, resource: this.shadowComparisonSampler },
|
|
4067
|
+
]
|
|
4068
|
+
: []),
|
|
4013
4069
|
],
|
|
4014
4070
|
}));
|
|
4015
|
-
const computeLayout = layoutFor("storage", GPUShaderStage.COMPUTE);
|
|
4016
|
-
const renderLayout = layoutFor("read-only-storage", GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT);
|
|
4071
|
+
const computeLayout = layoutFor("storage", GPUShaderStage.COMPUTE, false);
|
|
4072
|
+
const renderLayout = layoutFor("read-only-storage", GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, true);
|
|
4017
4073
|
// Additive keeps the destination and adds to it, and leaves alpha alone, so
|
|
4018
4074
|
// a glow does not claim coverage it never occluded. The MASK sums with it —
|
|
4019
4075
|
// otherwise an additive effect could never reach the bloom gate. Both live
|
|
@@ -4072,6 +4128,7 @@ export class Engine {
|
|
|
4072
4128
|
if (scoped) {
|
|
4073
4129
|
buffer.destroy();
|
|
4074
4130
|
uniform.destroy();
|
|
4131
|
+
points?.buffer.destroy();
|
|
4075
4132
|
return { ok: false, diagnostics: [scoped.message] };
|
|
4076
4133
|
}
|
|
4077
4134
|
return {
|
|
@@ -4087,17 +4144,18 @@ export class Engine {
|
|
|
4087
4144
|
counts: uniformView.uints,
|
|
4088
4145
|
compute,
|
|
4089
4146
|
computeLayout,
|
|
4090
|
-
computeBinds: bindFor(computeLayout, this.cameraUniformBuffer),
|
|
4147
|
+
computeBinds: bindFor(computeLayout, this.cameraUniformBuffer, false),
|
|
4091
4148
|
depth,
|
|
4092
4149
|
render,
|
|
4093
4150
|
renderLayout,
|
|
4094
|
-
renderBinds: bindFor(renderLayout, this.cameraUniformBuffer),
|
|
4095
|
-
mirrorRenderBinds: bindFor(renderLayout, this.mirrorCameraBuffer),
|
|
4151
|
+
renderBinds: bindFor(renderLayout, this.cameraUniformBuffer, true),
|
|
4152
|
+
mirrorRenderBinds: bindFor(renderLayout, this.mirrorCameraBuffer, true),
|
|
4096
4153
|
rebind: () => ({
|
|
4097
|
-
computeBinds: bindFor(computeLayout, this.cameraUniformBuffer),
|
|
4098
|
-
renderBinds: bindFor(renderLayout, this.cameraUniformBuffer),
|
|
4099
|
-
mirrorRenderBinds: bindFor(renderLayout, this.mirrorCameraBuffer),
|
|
4154
|
+
computeBinds: bindFor(computeLayout, this.cameraUniformBuffer, false),
|
|
4155
|
+
renderBinds: bindFor(renderLayout, this.cameraUniformBuffer, true),
|
|
4156
|
+
mirrorRenderBinds: bindFor(renderLayout, this.mirrorCameraBuffer, true),
|
|
4100
4157
|
}),
|
|
4158
|
+
points,
|
|
4101
4159
|
},
|
|
4102
4160
|
};
|
|
4103
4161
|
}
|
|
@@ -4105,6 +4163,7 @@ export class Engine {
|
|
|
4105
4163
|
await this.device.popErrorScope();
|
|
4106
4164
|
buffer.destroy();
|
|
4107
4165
|
uniform.destroy();
|
|
4166
|
+
points?.buffer.destroy();
|
|
4108
4167
|
return { ok: false, diagnostics: [e instanceof Error ? e.message : String(e)] };
|
|
4109
4168
|
}
|
|
4110
4169
|
}
|
|
@@ -4225,6 +4284,7 @@ export class Engine {
|
|
|
4225
4284
|
this.device.queue.writeBuffer(e.lights.uniform, 0, e.lights.data.buffer);
|
|
4226
4285
|
}
|
|
4227
4286
|
this.lightHeader[0] = Math.min(next, MAX_LIGHTS);
|
|
4287
|
+
this.lightHeader[1] = this.docLightCount;
|
|
4228
4288
|
this.device.queue.writeBuffer(this.lightsBuffer, 0, this.lightHeader);
|
|
4229
4289
|
}
|
|
4230
4290
|
/** Run every effect's lightEmit, before the pass that reads the result. */
|
|
@@ -4287,6 +4347,8 @@ export class Engine {
|
|
|
4287
4347
|
p.counts[2] = p.count;
|
|
4288
4348
|
p.counts[3] = this.particleFrame++;
|
|
4289
4349
|
this.device.queue.writeBuffer(p.uniform, 0, p.data.buffer);
|
|
4350
|
+
if (p.points)
|
|
4351
|
+
this.writePoints(p.points);
|
|
4290
4352
|
const cp = encoder.beginComputePass({ label: "particles" });
|
|
4291
4353
|
cp.setPipeline(p.compute);
|
|
4292
4354
|
cp.setBindGroup(0, p.computeBinds[e.grid?.parity ?? 0]);
|
|
@@ -4294,6 +4356,39 @@ export class Engine {
|
|
|
4294
4356
|
cp.end();
|
|
4295
4357
|
}
|
|
4296
4358
|
}
|
|
4359
|
+
/**
|
|
4360
|
+
* Every bone matching an effect's `#points` prefix, on every visible model,
|
|
4361
|
+
* posed and placed this frame. Every frame rather than on load: a candle a
|
|
4362
|
+
* character carries moves with the hand, and a stage can be moved.
|
|
4363
|
+
*
|
|
4364
|
+
* The order is the models' order, then rig order — stable while nothing is
|
|
4365
|
+
* added or removed, so particle i stays on point i and a flame does not
|
|
4366
|
+
* jump to another wick between frames.
|
|
4367
|
+
*/
|
|
4368
|
+
writePoints(points) {
|
|
4369
|
+
let n = 0;
|
|
4370
|
+
for (const inst of this.modelInstances.values()) {
|
|
4371
|
+
const m = inst.model;
|
|
4372
|
+
if (!m.visible)
|
|
4373
|
+
continue;
|
|
4374
|
+
let byPrefix = this.pointBones.get(m);
|
|
4375
|
+
if (!byPrefix)
|
|
4376
|
+
this.pointBones.set(m, (byPrefix = new Map()));
|
|
4377
|
+
let bones = byPrefix.get(points.prefix);
|
|
4378
|
+
const rig = m.getSkeleton().bones;
|
|
4379
|
+
if (!bones)
|
|
4380
|
+
byPrefix.set(points.prefix, (bones = bonesWithPrefix(rig, points.prefix)));
|
|
4381
|
+
for (const i of bones) {
|
|
4382
|
+
if (n >= MAX_EFFECT_POINTS)
|
|
4383
|
+
break;
|
|
4384
|
+
const world = m.getBoneWorldMatrixAt(i);
|
|
4385
|
+
if (world)
|
|
4386
|
+
writeBonePoint(points.data, n++, world, rig[i].tail, m);
|
|
4387
|
+
}
|
|
4388
|
+
}
|
|
4389
|
+
points.data[0] = n;
|
|
4390
|
+
this.device.queue.writeBuffer(points.buffer, 0, points.data.buffer, 0, (4 + n * 8) * 4);
|
|
4391
|
+
}
|
|
4297
4392
|
/** Draw the pool. Inside the scene pass, so it is depth-tested and pre-bloom. */
|
|
4298
4393
|
renderParticles(pass, view) {
|
|
4299
4394
|
for (const e of this.effects) {
|
|
@@ -4675,6 +4770,7 @@ export class Engine {
|
|
|
4675
4770
|
for (const e of this.effects) {
|
|
4676
4771
|
e.particles?.buffer.destroy();
|
|
4677
4772
|
e.particles?.uniform.destroy();
|
|
4773
|
+
e.particles?.points?.buffer.destroy();
|
|
4678
4774
|
e.particles = null;
|
|
4679
4775
|
}
|
|
4680
4776
|
}
|
|
@@ -5965,8 +6061,10 @@ export class Engine {
|
|
|
5965
6061
|
targets: sceneTargetsFor("depth-prepass", this.sceneFormats),
|
|
5966
6062
|
},
|
|
5967
6063
|
});
|
|
6064
|
+
// The matrices, then one vec4: the caster sphere, which effects' rzShadow
|
|
6065
|
+
// tests before any tap. The materials and the ground bind the matrices only.
|
|
5968
6066
|
this.shadowLightVPBuffer = this.device.createBuffer({
|
|
5969
|
-
size: 64 * SHADOW_CASCADES.length,
|
|
6067
|
+
size: 64 * SHADOW_CASCADES.length + 16,
|
|
5970
6068
|
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
5971
6069
|
});
|
|
5972
6070
|
this.shadowCascadeVPBuffers = SHADOW_CASCADES.map((_, i) => this.device.createBuffer({
|
|
@@ -6036,15 +6134,21 @@ export class Engine {
|
|
|
6036
6134
|
this.bakeFilmicLut();
|
|
6037
6135
|
// BEFORE the bind group below, which binds it. Full size from the start:
|
|
6038
6136
|
// every material pipeline binds this, so sizing it to the light count would
|
|
6039
|
-
// mean rebuilding bind groups whenever a scene gained a lamp.
|
|
6040
|
-
//
|
|
6041
|
-
|
|
6137
|
+
// mean rebuilding bind groups whenever a scene gained a lamp. Uploaded from
|
|
6138
|
+
// the CPU copy, which holds any lamps set before the device existed; the
|
|
6139
|
+
// header after it, from the one writer that owns it.
|
|
6042
6140
|
this.lightsBuffer = this.device.createBuffer({
|
|
6043
6141
|
label: "positional lights",
|
|
6044
6142
|
size: this.lightsData.byteLength,
|
|
6045
6143
|
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
6046
6144
|
});
|
|
6047
6145
|
this.device.queue.writeBuffer(this.lightsBuffer, 0, this.lightsData);
|
|
6146
|
+
this.allocateLightSlots();
|
|
6147
|
+
this.pointsFallback = this.device.createBuffer({
|
|
6148
|
+
label: "no points",
|
|
6149
|
+
size: 16,
|
|
6150
|
+
usage: GPUBufferUsage.STORAGE,
|
|
6151
|
+
});
|
|
6048
6152
|
// BEFORE the per-frame groups, which bind it. The composite needs this 1x1
|
|
6049
6153
|
// stand-in too, and it used to be created with the composite's own
|
|
6050
6154
|
// resources further down — far enough down that a material group built up
|
|
@@ -8392,10 +8496,23 @@ export class Engine {
|
|
|
8392
8496
|
this.lightsData[b + 14] = 0;
|
|
8393
8497
|
this.lightsData[b + 15] = 0;
|
|
8394
8498
|
}
|
|
8499
|
+
// The grid, from the records as STORED — normalised aim, clamped reach, the
|
|
8500
|
+
// cosines in f32 — so it indexes exactly what the shader will evaluate.
|
|
8501
|
+
const grid = buildLightGrid(list.map((_, i) => {
|
|
8502
|
+
const b = LIGHT_HEADER + i * LIGHT_STRIDE;
|
|
8503
|
+
const d = this.lightsData;
|
|
8504
|
+
return { x: d[b], y: d[b + 1], z: d[b + 2], radius: d[b + 3], ax: d[b + 8], ay: d[b + 9], az: d[b + 10], cosOuter: d[b + 11] };
|
|
8505
|
+
}));
|
|
8506
|
+
this.lightHeader.set(grid.origin, 4);
|
|
8507
|
+
this.lightHeader[7] = 1 / grid.cell;
|
|
8508
|
+
this.lightHeaderWords.set(grid.dims, 8);
|
|
8509
|
+
this.lightHeaderWords.set(grid.outside, 12);
|
|
8510
|
+
this.lightsWords.set(grid.cells, LIGHT_GRID_BASE);
|
|
8395
8511
|
// The CPU copy is written either way; only the upload needs a device. A
|
|
8396
8512
|
// scene whose lamps arrive before init keeps them, and init uploads them.
|
|
8397
8513
|
if (list.length && this.device && this.lightsBuffer) {
|
|
8398
8514
|
this.device.queue.writeBuffer(this.lightsBuffer, LIGHT_HEADER * 4, this.lightsData.buffer, LIGHT_HEADER * 4, list.length * LIGHT_STRIDE * 4);
|
|
8515
|
+
this.device.queue.writeBuffer(this.lightsBuffer, LIGHT_GRID_BASE * 4, this.lightsData.buffer, LIGHT_GRID_BASE * 4, grid.cells.byteLength);
|
|
8399
8516
|
}
|
|
8400
8517
|
// The effects' bases move when the document's count does; the header —
|
|
8401
8518
|
// count included — is written there.
|
|
@@ -10537,6 +10654,18 @@ export class Engine {
|
|
|
10537
10654
|
this.device.queue.writeBuffer(this.groundShadowMaterialBuffer, 0, gb.subarray(0, 3));
|
|
10538
10655
|
this.device.queue.writeBuffer(this.groundShadowMaterialBuffer, 40, gb.subarray(10, 11));
|
|
10539
10656
|
}
|
|
10657
|
+
/**
|
|
10658
|
+
* The same sphere, into the cascade block after its matrices — rzShadow's
|
|
10659
|
+
* copy. There whether or not a ground exists: a lawn is often the only floor.
|
|
10660
|
+
*/
|
|
10661
|
+
writeShadowCasters() {
|
|
10662
|
+
const w = this.shadowCastersWritten;
|
|
10663
|
+
const c = this.casterSphere;
|
|
10664
|
+
if (w[0] === c[0] && w[1] === c[1] && w[2] === c[2] && w[3] === c[3])
|
|
10665
|
+
return;
|
|
10666
|
+
w.set(c);
|
|
10667
|
+
this.device.queue.writeBuffer(this.shadowLightVPBuffer, 64 * SHADOW_CASCADES.length, c);
|
|
10668
|
+
}
|
|
10540
10669
|
/**
|
|
10541
10670
|
* Push this frame's caster sphere into the ground's uniform.
|
|
10542
10671
|
*
|
|
@@ -13110,6 +13239,7 @@ export class Engine {
|
|
|
13110
13239
|
this.dispatchCull(encoder);
|
|
13111
13240
|
// After the cull, which is what recomputes the spheres it unions.
|
|
13112
13241
|
this.writeGroundCasterSphere();
|
|
13242
|
+
this.writeShadowCasters();
|
|
13113
13243
|
this.writeGroundDress();
|
|
13114
13244
|
// After the cull, because a rebuild there can reallocate the argument
|
|
13115
13245
|
// buffers and a bundle captures the buffer it recorded against.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** One document lamp, as the grid sees it. */
|
|
2
|
+
export type GridLamp = {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
z: number;
|
|
6
|
+
radius: number;
|
|
7
|
+
/** Unit aim, away from the lamp. Zero for a point lamp. */
|
|
8
|
+
ax: number;
|
|
9
|
+
ay: number;
|
|
10
|
+
az: number;
|
|
11
|
+
/** Cosine of the half-angle. -1 for a point lamp, which covers everything. */
|
|
12
|
+
cosOuter: number;
|
|
13
|
+
};
|
|
14
|
+
export type LightGrid = {
|
|
15
|
+
origin: [number, number, number];
|
|
16
|
+
/** Edge length of one cubic cell, world units. */
|
|
17
|
+
cell: number;
|
|
18
|
+
dims: [number, number, number];
|
|
19
|
+
/** The lamps that reach past the box, for fragments outside it. */
|
|
20
|
+
outside: Uint32Array;
|
|
21
|
+
/** LIGHT_MASK_WORDS words per cell, x fastest, then y, then z. */
|
|
22
|
+
cells: Uint32Array;
|
|
23
|
+
};
|
|
24
|
+
export declare function buildLightGrid(lamps: GridLamp[], maxCells?: number): LightGrid;
|
|
25
|
+
//# sourceMappingURL=light-grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"light-grid.d.ts","sourceRoot":"","sources":["../src/light-grid.ts"],"names":[],"mappings":"AA2BA,8CAA8C;AAC9C,MAAM,MAAM,QAAQ,GAAG;IACrB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,MAAM,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,mEAAmE;IACnE,OAAO,EAAE,WAAW,CAAA;IACpB,kEAAkE;IAClE,KAAK,EAAE,WAAW,CAAA;CACnB,CAAA;AAMD,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,SAAmB,GAAG,SAAS,CAkFxF"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { LIGHT_GRID_CELLS, LIGHT_MASK_WORDS } from "./shaders/lights";
|
|
2
|
+
function setBit(words, base, lamp) {
|
|
3
|
+
words[base + (lamp >> 5)] |= 1 << (lamp & 31);
|
|
4
|
+
}
|
|
5
|
+
export function buildLightGrid(lamps, maxCells = LIGHT_GRID_CELLS) {
|
|
6
|
+
const outside = new Uint32Array(LIGHT_MASK_WORDS);
|
|
7
|
+
const live = lamps
|
|
8
|
+
.map((l, i) => ({ l, i }))
|
|
9
|
+
.filter(({ l }) => l.radius > 0 && [l.x, l.y, l.z, l.radius].every(Number.isFinite));
|
|
10
|
+
if (!live.length)
|
|
11
|
+
return { origin: [0, 0, 0], cell: 1, dims: [0, 0, 0], outside, cells: new Uint32Array(0) };
|
|
12
|
+
const radii = live.map(({ l }) => l.radius).sort((a, b) => a - b);
|
|
13
|
+
const pad = radii[radii.length >> 1];
|
|
14
|
+
const min = [Infinity, Infinity, Infinity];
|
|
15
|
+
const max = [-Infinity, -Infinity, -Infinity];
|
|
16
|
+
for (const { l } of live) {
|
|
17
|
+
const p = [l.x, l.y, l.z];
|
|
18
|
+
for (let k = 0; k < 3; k++) {
|
|
19
|
+
min[k] = Math.min(min[k], p[k] - pad);
|
|
20
|
+
max[k] = Math.max(max[k], p[k] + pad);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const extent = [max[0] - min[0], max[1] - min[1], max[2] - min[2]];
|
|
24
|
+
let cell = Math.cbrt((extent[0] * extent[1] * extent[2]) / maxCells);
|
|
25
|
+
let dims;
|
|
26
|
+
// ceil() rounds every axis up, so the first guess can overshoot the budget by
|
|
27
|
+
// a few percent; widen the cell until it fits.
|
|
28
|
+
for (;;) {
|
|
29
|
+
dims = [0, 1, 2].map((k) => Math.max(1, Math.ceil(extent[k] / cell)));
|
|
30
|
+
if (dims[0] * dims[1] * dims[2] <= maxCells)
|
|
31
|
+
break;
|
|
32
|
+
cell *= 1.02;
|
|
33
|
+
}
|
|
34
|
+
const cells = new Uint32Array(dims[0] * dims[1] * dims[2] * LIGHT_MASK_WORDS);
|
|
35
|
+
// Half the cell's diagonal: the sphere a spot's cone is tested against.
|
|
36
|
+
const halfDiagonal = (cell * Math.sqrt(3)) / 2;
|
|
37
|
+
for (const { l, i } of live) {
|
|
38
|
+
// A hair of slack on the reach: the shader finds its cell in f32 from a
|
|
39
|
+
// reciprocal, the builder in f64 from a division, and a fragment on a cell
|
|
40
|
+
// face may land in either neighbour.
|
|
41
|
+
const r = l.radius + cell * 1e-4;
|
|
42
|
+
const p = [l.x, l.y, l.z];
|
|
43
|
+
const lo = [0, 0, 0];
|
|
44
|
+
const hi = [0, 0, 0];
|
|
45
|
+
let leaves = false;
|
|
46
|
+
for (let k = 0; k < 3; k++) {
|
|
47
|
+
const a = Math.floor((p[k] - r - min[k]) / cell);
|
|
48
|
+
const b = Math.floor((p[k] + r - min[k]) / cell);
|
|
49
|
+
if (a < 0 || b >= dims[k])
|
|
50
|
+
leaves = true;
|
|
51
|
+
lo[k] = Math.max(a, 0);
|
|
52
|
+
hi[k] = Math.min(b, dims[k] - 1);
|
|
53
|
+
}
|
|
54
|
+
if (leaves)
|
|
55
|
+
setBit(outside, 0, i);
|
|
56
|
+
if (lo[0] > hi[0] || lo[1] > hi[1] || lo[2] > hi[2])
|
|
57
|
+
continue;
|
|
58
|
+
const spot = l.cosOuter > -1;
|
|
59
|
+
const outer = Math.acos(Math.min(Math.max(l.cosOuter, -1), 1));
|
|
60
|
+
for (let z = lo[2]; z <= hi[2]; z++) {
|
|
61
|
+
for (let y = lo[1]; y <= hi[1]; y++) {
|
|
62
|
+
for (let x = lo[0]; x <= hi[0]; x++) {
|
|
63
|
+
const b0 = [min[0] + x * cell, min[1] + y * cell, min[2] + z * cell];
|
|
64
|
+
// The sphere against the cell's box: the nearest point of the box.
|
|
65
|
+
let d2 = 0;
|
|
66
|
+
for (let k = 0; k < 3; k++) {
|
|
67
|
+
const q = Math.min(Math.max(p[k], b0[k]), b0[k] + cell);
|
|
68
|
+
d2 += (q - p[k]) * (q - p[k]);
|
|
69
|
+
}
|
|
70
|
+
if (d2 > r * r)
|
|
71
|
+
continue;
|
|
72
|
+
if (spot) {
|
|
73
|
+
// The cone against the cell's bounding sphere: the cell can be lit
|
|
74
|
+
// when the angle to its centre is within the cone's half-angle plus
|
|
75
|
+
// the angle that sphere subtends.
|
|
76
|
+
const v = [b0[0] + cell / 2 - p[0], b0[1] + cell / 2 - p[1], b0[2] + cell / 2 - p[2]];
|
|
77
|
+
const len = Math.hypot(v[0], v[1], v[2]);
|
|
78
|
+
if (len > halfDiagonal) {
|
|
79
|
+
const limit = outer + Math.asin(halfDiagonal / len);
|
|
80
|
+
const cos = (v[0] * l.ax + v[1] * l.ay + v[2] * l.az) / len;
|
|
81
|
+
if (limit < Math.PI && Math.acos(Math.min(Math.max(cos, -1), 1)) > limit)
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
setBit(cells, ((z * dims[1] + y) * dims[0] + x) * LIGHT_MASK_WORDS, i);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { origin: [min[0], min[1], min[2]], cell, dims, outside, cells };
|
|
91
|
+
}
|
package/dist/model.d.ts
CHANGED
|
@@ -69,6 +69,11 @@ export interface Bone {
|
|
|
69
69
|
appendMove?: boolean;
|
|
70
70
|
/** 軸制限: this bone rotates ONLY about this axis (the twist bones use it). */
|
|
71
71
|
fixedAxis?: [number, number, number];
|
|
72
|
+
/** Where the bone's tail sits at rest, as an offset from its head — the
|
|
73
|
+
* direction a PMX editor draws it pointing. PMX states it either as that
|
|
74
|
+
* offset or as another bone to point at; both arrive here as the offset.
|
|
75
|
+
* An effect reading named points takes it as the point's length and way. */
|
|
76
|
+
tail?: [number, number, number];
|
|
72
77
|
/** 変形階層: MMD poses whole layers in order, not bones in array order.
|
|
73
78
|
* Parsed but not yet honoured — distinct from Model's `deformOrder`, which is
|
|
74
79
|
* this engine's parent-before-child traversal. */
|
|
@@ -373,6 +378,10 @@ export declare class Model {
|
|
|
373
378
|
/** A bone's posed matrix — model space, column-major, the live array rather
|
|
374
379
|
* than a copy. Null for a name this rig does not have. */
|
|
375
380
|
getBoneWorldMatrix(boneName: string): Float32Array | null;
|
|
381
|
+
/** A bone's posed matrix by INDEX — model space, column-major, the live
|
|
382
|
+
* array. For walking bones that share a name, which the name lookup
|
|
383
|
+
* collapses to one. Null past the end. */
|
|
384
|
+
getBoneWorldMatrixAt(index: number): Float32Array | null;
|
|
376
385
|
getBoneWorldPosition(boneName: string): Vec3 | null;
|
|
377
386
|
/**
|
|
378
387
|
* A bone's forward axis, normalised — which way a foot points, where a head
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAA6C,MAAM,QAAQ,CAAA;AAEpF,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAG5C,OAAO,EAAa,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EAEjB,UAAU,EASX,MAAM,aAAa,CAAA;AAgCpB,oCAAoC;AACpC,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;yDACqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAaD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;2EAE2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,CAAC,EAAE,MAAM,EAAE,CAAA;IACX,CAAC,EAAE,MAAM,EAAE,CAAA;CACZ;AAOD,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;IAGxB,UAAU,EAAE,OAAO,CAAA;IACnB,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;IACnB;;;;;;;;;OASG;IACH,IAAI,EAAE,MAAM,CAAA;CACb;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,4EAA4E;IAC5E,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC;;uDAEmD;IACnD,WAAW,CAAC,EAAE,MAAM,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;AAID,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,wCAAwC;IACxC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAC3C;AAED,8FAA8F;AAC9F,eAAO,MAAM,uBAAuB,IAAI,CAAA;AACxC,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAInC,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAA;IACrB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9C,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAC5C;AAKD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,yDAAyD;IACzD,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACzC;AAGD,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,iBAAiB,EAAE,CAAA;IAClC,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACvC,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;IAC/B,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACvC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAA;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB;AAGD,UAAU,gBAAgB;IACxB,aAAa,EAAE,YAAY,CAAA;IAC3B,QAAQ,EAAE,WAAW,CAAA;IACrB,QAAQ,EAAE,WAAW,CAAA;IACrB,SAAS,EAAE,YAAY,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AA2CD,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,2EAA2E;IAC3E,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;6DACyD;IACzD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAKjC,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAKjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC;;iFAE6E;IAC7E,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI;IAQhD,aAAa,IAAI,YAAY,GAAG,IAAI;IAIpC;4EACwE;IACxE,aAAa,IAAI,YAAY;IAK7B,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAA0B;IAG3C,OAAO,CAAC,qBAAqB,CAAC,CAAc;IAC5C,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,eAAe,CAAO;IAG9B,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,iBAAiB,CAAQ;IACjC,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,YAAY,CAAe;IAGnC,OAAO,CAAC,eAAe,CAAkB;IAGzC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAiB;IAKpC,OAAO,CAAC,aAAa,CAAqF;IAK1G,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,gBAAgB,CAAQ;IAChC,4EAA4E;IAC5E,OAAO,CAAC,SAAS,CAAQ;IAGzB,OAAO,CAAC,aAAa,CAAO;IAM5B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,gBAAgB,CAAuE;IAC/F,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,cAAc,CAAgB;IACtC;;;;;iCAK6B;IAC7B,OAAO,CAAC,UAAU,CAA4B;IAC9C;;;;;;kCAM8B;IAC9B,OAAO,CAAC,eAAe,CAAsC;IAG7D,OAAO,CAAC,iBAAiB,CAAC,CAAc;IAMxC,OAAO,CAAC,WAAW,CAAa;IAChC,4FAA4F;IAC5F,OAAO,CAAC,aAAa,CAA0B;IAC/C,oFAAoF;IACpF,OAAO,CAAC,kBAAkB,CAA0B;IACpD,kFAAkF;IAClF,OAAO,CAAC,oBAAoB,CAA0B;IACtD,kFAAkF;IAClF,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,oBAAoB,CAA0B;IAKtD,OAAO,CAAC,YAAY,CAAe;IAEnC,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;IAKpD,OAAO,CAAC,OAAO,CASA;IACf,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAClD;iFAC6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiG;IAC5H,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4D;IAK3F,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,SAAS,CAAoH;IACrI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoD;IACrF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoD;IAGtF,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,eAAe,CAAI;IAE3B,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,EACpB,YAAY,GAAE,MAAM,EAAO;IA0B7B,gEAAgE;IAChE,OAAO,CAAC,cAAc,CAA2D;IAEjF,OAAO,CAAC,yBAAyB;IAuCjC,OAAO,CAAC,mBAAmB;IA2C3B,OAAO,CAAC,gBAAgB;IAuDxB,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,sBAAsB;IA+B9B;;;;;;;;OAQG;IACH;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,eAAe;IA8BvB;;+CAE2C;IAC3C,oBAAoB,IAAI,OAAO;IAM/B;;;;;;;;;;;OAWG;IACH,wBAAwB,IAAI,MAAM,EAAE;IA8BpC,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;;;;;;;;OAQG;IACH,WAAW,IAAI;QAAE,SAAS,EAAE,YAAY,CAAC;QAAC,GAAG,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE;IAgBnF,WAAW,IAAI,QAAQ;IAIvB;;;;;OAKG;IACH,kBAAkB,CAAC,OAAO,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,EAAE,GAAG,IAAI;IAa5G,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI7C,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAShD,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI;IAWzD,OAAO,CAAC,kBAAkB,CAAQ;IAClC,qBAAqB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAG/C,oBAAoB,IAAI,OAAO;IAI/B;+DAC2D;IAC3D,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAOzD,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAMnD;;;;;;;OAOG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IASlD,WAAW,IAAI,QAAQ;IAOvB,cAAc,IAAI,OAAO;IAKzB,eAAe,IAAI,SAAS,MAAM,EAAE;IAIpC,kFAAkF;IAClF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA0B;IAG9D,8EAA8E;IAC9E,OAAO,CAAC,WAAW,CAAmD;IACtE;kEAC8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,aAAa,CAAQ;IAC7B;gDAC4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,SAAS,CAA0B;IAC3C;mEAC+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,UAAU,CAAQ;IAC1B;2DACuD;IACvD,OAAO,CAAC,YAAY,CAAQ;IAE5B;;;;;;;;;;;;;;;OAeG;IACH,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI;IAkBxD,cAAc,IAAI,OAAO;IAIzB;;;;;;;;;;;OAWG;IACH,OAAO,IAAI,IAAI,GAAG,IAAI;IAqCtB;sEACkE;IAClE,aAAa,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;IAUxC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,SAAS;IAsEjB;;;oDAGgD;IAChD,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO;IAQvE,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;IAwD5E,OAAO,CAAC,4BAA4B;IA0CpC,gBAAgB,IAAI,IAAI,EAAE;IAI1B,oBAAoB,IAAI,YAAY;IAWpC,0BAA0B,IAAI,YAAY;IAI1C,eAAe,IAAI,YAAY;IAoC/B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAkDvE,OAAO,CAAC,WAAW;IAoGnB,eAAe,IAAI,IAAI;IAMvB,wBAAwB,IAAI,OAAO;IAQnC,wBAAwB,IAAI,YAAY;IAQxC,qBAAqB,IAAI,gBAAgB,GAAG,IAAI;IA6DhD,wBAAwB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAavE,OAAO,CAAC,yBAAyB;IA0DjC;;;;;;;;;OASG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDpG;;8DAE0D;IAC1D,OAAO,CAAC,kBAAkB;IAS1B,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;;;;;;;;;;;8EAW0E;IAC1E,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,iBAAiB,GAAG,IAAI;IAgC5F,mEAAmE;IACnE,OAAO,CAAC,MAAM,CAAC,WAAW;IAU1B;;;;;;;;;OASG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,iBAAiB,CAAA;KAAE,GAAG,WAAW;IAM9E,IAAI,IAAI,IAAI;IACZ,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO;IAgB3D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASxB;;;;2DAIuD;IACvD,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAMzC,cAAc,IAAI,IAAI;IAItB;;;iFAG6E;IAC7E,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,OAAO;IAWvG,+EAA+E;IAC/E,aAAa,CAAC,OAAO,SAAM,GAAG,IAAI;IAUlC,4CAA4C;IAC5C,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B;;;;mDAI+C;IAC/C,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,IAAI;IAc5H,OAAO,CAAC,cAAc;IAYtB;yEACqE;IACrE,OAAO,CAAC,gBAAgB;IAWxB;;;mFAG+E;IAC/E,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO;IAoBjF,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAOZ;;uEAEmE;IACnE,cAAc,IAAI,IAAI;IAQtB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM3B,oBAAoB,IAAI,iBAAiB;IAazC,OAAO,CAAC,MAAM,CAAC,UAAU;IAWzB,OAAO,CAAC,iBAAiB;IAczB;;;;;;OAMG;IACH,OAAO,CAAC,UAAU,CAAoB;IAEtC;8EAC0E;IAC1E,OAAO,CAAC,eAAe;IAevB;;;;8BAI0B;IAC1B,OAAO,CAAC,mBAAmB;IA2C3B,8FAA8F;IAC9F,OAAO,CAAC,gBAAgB;IAkBxB;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,iBAAiB;IAiCzB;;;;yEAIqE;IACrE,OAAO,CAAC,gBAAgB;IAuIxB;sFACkF;IAClF,OAAO,CAAC,YAAY;IAmDpB;;2EAEuE;IACvE,OAAO,CAAC,cAAc;IA0CtB;;;;;;;;;OASG;IACH,MAAM,IAAI,OAAO;IAiBjB,qDAAqD;IACrD,OAAO,CAAC,eAAe;IAQvB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,UAAO,GAAG,OAAO;IAuHpD,OAAO,CAAC,aAAa;IAyCrB,OAAO,CAAC,aAAa,CAAyB;IAI9C,OAAO,CAAC,4BAA4B;IA4HpC;;;;;;;;;;;;;;;;;OAiBG;IACH,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;IAkDlD;kFAC8E;IAC9E,oBAAoB,IAAI,MAAM,EAAE;IAIhC;;;;;;;;;;;;;;;OAeG;IACH,kBAAkB,IAAI,IAAI;IA4C1B,oBAAoB,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI;CA0GhD"}
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|
package/dist/model.js
CHANGED
|
@@ -758,6 +758,12 @@ export class Model {
|
|
|
758
758
|
return null;
|
|
759
759
|
return this.runtimeSkeleton.worldMatrices[idx].values;
|
|
760
760
|
}
|
|
761
|
+
/** A bone's posed matrix by INDEX — model space, column-major, the live
|
|
762
|
+
* array. For walking bones that share a name, which the name lookup
|
|
763
|
+
* collapses to one. Null past the end. */
|
|
764
|
+
getBoneWorldMatrixAt(index) {
|
|
765
|
+
return this.runtimeSkeleton.worldMatrices[index]?.values ?? null;
|
|
766
|
+
}
|
|
761
767
|
// World bone origin (world matrix col3); unknown name → null
|
|
762
768
|
getBoneWorldPosition(boneName) {
|
|
763
769
|
const idx = this.runtimeSkeleton.nameIndex[boneName];
|
package/dist/pmx-loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pmx-loader.d.ts","sourceRoot":"","sources":["../src/pmx-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAcN,MAAM,SAAS,CAAA;AAGhB,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEzE,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,mBAAmB,CAAI;IAC/B,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,kBAAkB,CAAI;IAC9B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAe;IAE/B,OAAO;IAQP,OAAO,CAAC,IAAI;WAMC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAI9C,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK;WAIpC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAKxF,OAAO,CAAC,KAAK;IAiBb,OAAO,CAAC,WAAW;IAwDnB,OAAO,CAAC,aAAa;IA+FrB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,cAAc;IAsEtB,OAAO,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"pmx-loader.d.ts","sourceRoot":"","sources":["../src/pmx-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAcN,MAAM,SAAS,CAAA;AAGhB,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEzE,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,mBAAmB,CAAI;IAC/B,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,kBAAkB,CAAI;IAC9B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAe;IAE/B,OAAO;IAQP,OAAO,CAAC,IAAI;WAMC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAI9C,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK;WAIpC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAKxF,OAAO,CAAC,KAAK;IAiBb,OAAO,CAAC,WAAW;IAwDnB,OAAO,CAAC,aAAa;IA+FrB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,cAAc;IAsEtB,OAAO,CAAC,UAAU;IAkLlB,OAAO,CAAC,WAAW;IAgMnB,OAAO,CAAC,iBAAiB;IAgDzB,OAAO,CAAC,gBAAgB;IA+FxB,OAAO,CAAC,WAAW;IAmGnB,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,OAAO;IAkJf,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,OAAO;IAwBf,OAAO,CAAC,QAAQ;CAIjB"}
|
package/dist/pmx-loader.js
CHANGED
|
@@ -305,15 +305,15 @@ export class PmxLoader {
|
|
|
305
305
|
const parentIndex = this.getNonVertexIndex(this.boneIndexSize);
|
|
306
306
|
const deformLayer = this.getInt32(); // 変形階層
|
|
307
307
|
const flags = this.getUint16();
|
|
308
|
-
// Tail: bone index or offset vector3
|
|
308
|
+
// Tail: bone index or offset vector3. Kept either way — the bone it
|
|
309
|
+
// names is resolved to an offset once every head is known.
|
|
310
|
+
let tailOffset;
|
|
311
|
+
let tailBone;
|
|
309
312
|
if ((flags & FLAG_TAIL_IS_BONE) !== 0) {
|
|
310
|
-
this.getNonVertexIndex(this.boneIndexSize);
|
|
313
|
+
tailBone = this.getNonVertexIndex(this.boneIndexSize);
|
|
311
314
|
}
|
|
312
315
|
else {
|
|
313
|
-
|
|
314
|
-
this.getFloat32();
|
|
315
|
-
this.getFloat32();
|
|
316
|
-
this.getFloat32();
|
|
316
|
+
tailOffset = [this.getFloat32(), this.getFloat32(), this.getFloat32()];
|
|
317
317
|
}
|
|
318
318
|
// Append transform (inherit/ratio)
|
|
319
319
|
let appendParent = undefined;
|
|
@@ -398,10 +398,14 @@ export class PmxLoader {
|
|
|
398
398
|
ikIteration,
|
|
399
399
|
ikLimitAngle,
|
|
400
400
|
ikLinks,
|
|
401
|
+
tailOffset,
|
|
402
|
+
tailBone,
|
|
401
403
|
};
|
|
402
404
|
}
|
|
403
405
|
for (let i = 0; i < count; i++) {
|
|
404
406
|
const a = abs[i];
|
|
407
|
+
const to = a.tailBone !== undefined && a.tailBone >= 0 && a.tailBone < count ? abs[a.tailBone] : null;
|
|
408
|
+
const tail = to ? [to.x - a.x, to.y - a.y, to.z - a.z] : a.tailOffset;
|
|
405
409
|
const boneData = {
|
|
406
410
|
name: a.name,
|
|
407
411
|
parentIndex: a.parent,
|
|
@@ -419,6 +423,7 @@ export class PmxLoader {
|
|
|
419
423
|
ikIteration: a.ikIteration,
|
|
420
424
|
ikLimitAngle: a.ikLimitAngle,
|
|
421
425
|
ikLinks: a.ikLinks,
|
|
426
|
+
...(tail ? { tail } : {}),
|
|
422
427
|
};
|
|
423
428
|
bones.push(boneData);
|
|
424
429
|
}
|