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.
Files changed (61) hide show
  1. package/dist/effect-points.d.ts +30 -0
  2. package/dist/effect-points.d.ts.map +1 -0
  3. package/dist/effect-points.js +49 -0
  4. package/dist/engine.d.ts +30 -1
  5. package/dist/engine.d.ts.map +1 -1
  6. package/dist/engine.js +149 -19
  7. package/dist/light-grid.d.ts +25 -0
  8. package/dist/light-grid.d.ts.map +1 -0
  9. package/dist/light-grid.js +91 -0
  10. package/dist/model.d.ts +9 -0
  11. package/dist/model.d.ts.map +1 -1
  12. package/dist/model.js +6 -0
  13. package/dist/pmx-loader.d.ts.map +1 -1
  14. package/dist/pmx-loader.js +11 -6
  15. package/dist/shaders/cast-api.d.ts +1 -1
  16. package/dist/shaders/cast-layout.d.ts +5 -3
  17. package/dist/shaders/cast-layout.d.ts.map +1 -1
  18. package/dist/shaders/cast-layout.js +5 -3
  19. package/dist/shaders/directives.d.ts +3 -0
  20. package/dist/shaders/directives.d.ts.map +1 -1
  21. package/dist/shaders/directives.js +5 -0
  22. package/dist/shaders/lights.d.ts +16 -19
  23. package/dist/shaders/lights.d.ts.map +1 -1
  24. package/dist/shaders/lights.js +121 -88
  25. package/dist/shaders/materials/common.d.ts.map +1 -1
  26. package/dist/shaders/materials/common.js +3 -17
  27. package/dist/shaders/passes/composite.d.ts +1 -1
  28. package/dist/shaders/passes/composite.d.ts.map +1 -1
  29. package/dist/shaders/passes/composite.js +4 -0
  30. package/dist/shaders/passes/grid.d.ts.map +1 -1
  31. package/dist/shaders/passes/grid.js +4 -0
  32. package/dist/shaders/passes/particles.d.ts +4 -0
  33. package/dist/shaders/passes/particles.d.ts.map +1 -1
  34. package/dist/shaders/passes/particles.js +13 -1
  35. package/dist/shaders/passes/trails.d.ts.map +1 -1
  36. package/dist/shaders/passes/trails.js +3 -1
  37. package/dist/shaders/points-api.d.ts +11 -0
  38. package/dist/shaders/points-api.d.ts.map +1 -0
  39. package/dist/shaders/points-api.js +58 -0
  40. package/dist/shaders/scene-light-api.d.ts +42 -0
  41. package/dist/shaders/scene-light-api.d.ts.map +1 -0
  42. package/dist/shaders/scene-light-api.js +144 -0
  43. package/dist/shaders/shadow-api.d.ts +29 -0
  44. package/dist/shaders/shadow-api.d.ts.map +1 -0
  45. package/dist/shaders/shadow-api.js +112 -0
  46. package/package.json +1 -1
  47. package/src/effect-points.ts +67 -0
  48. package/src/engine.ts +163 -18
  49. package/src/light-grid.ts +139 -0
  50. package/src/model.ts +12 -0
  51. package/src/pmx-loader.ts +13 -6
  52. package/src/shaders/cast-layout.ts +5 -3
  53. package/src/shaders/directives.ts +8 -0
  54. package/src/shaders/lights.ts +121 -88
  55. package/src/shaders/materials/common.ts +3 -17
  56. package/src/shaders/passes/composite.ts +4 -0
  57. package/src/shaders/passes/grid.ts +4 -0
  58. package/src/shaders/passes/particles.ts +14 -1
  59. package/src/shaders/passes/trails.ts +3 -1
  60. package/src/shaders/points-api.ts +66 -0
  61. 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
- /** Just the header, for rewriting the total without touching a record. */
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. Zero-filled,
6040
- // and float 0 is a count of 0.
6041
- this.lightsData = new Float32Array(LIGHTS_FLOATS);
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
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
package/dist/model.js CHANGED
@@ -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];
@@ -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;IA2KlB,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"}
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"}
@@ -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
- // tail offset vec3
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
  }