genshin-engine 4.5.0 → 4.6.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/index.d.ts CHANGED
@@ -4,7 +4,6 @@ import { IndirectStorageBufferAttribute, LightingModel, LightingModelDirectInput
4
4
  import { CSMShadowNode, CSMShadowNodeData } from "three/examples/jsm/csm/CSMShadowNode.js";
5
5
  import { Capsule } from "three/examples/jsm/math/Capsule.js";
6
6
  import GTAONode from "three/examples/jsm/tsl/display/GTAONode.js";
7
- import BloomNode from "three/examples/jsm/tsl/display/BloomNode.js";
8
7
  import GodraysNode from "three/examples/jsm/tsl/display/GodraysNode.js";
9
8
  export interface SkyUniforms {
10
9
  cloudCoverage: UniformNode<"float", number>;
@@ -1358,6 +1357,18 @@ export interface PlantCullingOptions {
1358
1357
  }
1359
1358
  export declare const createOutlineMaterial: (colorNode: Node<"vec4">, thicknessNode: Node<"float">, instanceMatrix?: Node<"mat4">) => NodeMaterial;
1360
1359
  export declare const createGameOutlineMaterial: (colorNode: Node<"vec4">, widthNode: Node<"float">, offsetNode: Node<"float">) => NodeMaterial;
1360
+ declare module "three/webgpu" {
1361
+ interface NodeBuilder {
1362
+ getSharedContext: () => Record<string, unknown>;
1363
+ }
1364
+ }
1365
+ export declare class GameBloomNode extends Node<"vec4"> {
1366
+ #private;
1367
+ constructor(inputNode: Node<"vec4">);
1368
+ override dispose(): void;
1369
+ override setup(builder: NodeBuilder): Node<"vec4">;
1370
+ override updateBefore(frame: NodeFrame): boolean | undefined;
1371
+ }
1361
1372
  export declare const getGameOutlineOffset: (viewPosition: Vector3, blue: number, blockBChannel: number, size: number) => Vector3;
1362
1373
  export interface Impostor {
1363
1374
  albedoTarget: RenderTarget;
@@ -1486,7 +1497,6 @@ export interface GradeOptions {
1486
1497
  size: number;
1487
1498
  }
1488
1499
  export interface PostPipeline {
1489
- bloomNode?: BloomNode;
1490
1500
  compileAsync: () => Promise<void>;
1491
1501
  dispose: () => void;
1492
1502
  godraysNode?: GodraysNode;
@@ -1576,6 +1586,7 @@ export interface TileStreamer<TTile> {
1576
1586
  fail: (key: number) => boolean;
1577
1587
  get: (key: number) => TTile | undefined;
1578
1588
  has: (key: number) => boolean;
1589
+ pendingCount: () => number;
1579
1590
  receive: (key: number, tile: TTile) => void;
1580
1591
  refresh: (checkIsChanged: (key: number) => boolean) => void;
1581
1592
  update: (wanted: TerrainSelection, drawn: TerrainSelection, surrounding: TerrainSelection) => void;
@@ -1768,6 +1779,7 @@ export declare const createSimplexNoise: (seed: number) => ((x: number, y: numbe
1768
1779
  export declare const getSpectralBin: (column: number, row: number, width: number, height: number) => number | undefined;
1769
1780
  export declare const synthesizeSpectralNoise: ({ channels, height, width }: SpectralNoiseProfile, random: () => number) => Float32Array[];
1770
1781
  export declare const transformFourierGrid: (real: Float64Array, imaginary: Float64Array, width: number, height: number) => void;
1782
+ export declare const computeBloomPrefilter: (channel: number) => number;
1771
1783
  export declare const computeGradeLut: ({ contrast, highlightTint, saturation, shadowTint, size }: GradeOptions) => Uint8Array;
1772
1784
  export declare const computeWhiteBalance: ({ temperature, tint }: WhiteBalance, whiteBalance?: Matrix3) => Matrix3;
1773
1785
  export declare const createFogUniforms: () => FogUniforms;
@@ -1790,6 +1802,11 @@ export declare const GENSHIN_TONE_EXPOSURE = 1;
1790
1802
  export declare const TONE_CONTRAST_OFFSET = .01;
1791
1803
  export declare const TONE_CURVE_LIFT = 1e-4;
1792
1804
  export declare const TONE_CURVE_FLOOR: number;
1805
+ export declare const GENSHIN_BLOOM_THRESHOLD = .75;
1806
+ export declare const GENSHIN_BLOOM_SCALER = 2.5;
1807
+ export declare const GENSHIN_BLOOM_INTENSITY = .75;
1808
+ export declare const GENSHIN_BLOOM_WEIGHTS: readonly number[];
1809
+ export declare const BLOOM_BLUR_TEXELS: readonly number[];
1793
1810
  export declare const createGenshinRenderer: (canvas: HTMLCanvasElement) => WebGPURenderer;
1794
1811
  export declare const createInstancedMesh: <TGeometry extends BufferGeometry, TMaterial extends Material | Material[]>(geometry: TGeometry, material: TMaterial, count: number) => InstancedMesh<TGeometry, TMaterial>;
1795
1812
  export declare const getScreenDirection: ({ aspect, fov, pitch, yaw }: ScreenCamera, [x, y]: [number, number]) => Vector3;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { A as TERRAIN_RING_INITIAL_TILE_COUNT, C as getTerrainTileColumn, D as TERRAIN_CELL_SIZE, E as GAUSSIAN_REACH_WIDTHS, F as GroundLayer, I as GroundLayers, L as createSeededRandom, M as TILE_INDEX_SPAN, N as createSimplexNoise, O as TERRAIN_HEIGHT_PADDING, P as TerrainFeatureKind, S as getTerrainTileRow, T as getTerrainTileLevel, _ as getSegmentBounds, a as createTerrainFeaturesBlend, b as fileByCell, c as getPlateauBlend, d as createResidualHeight, f as sampleTerrainResidualFade, g as measureSegment, h as sampleGroundLayerField, i as createTerrainFeaturesHeight, j as TILE_INDEX_OFFSET, k as TERRAIN_LAYER, l as getCliffBlend, m as createGroundLayerWeights, n as createTerrainShapeHeight, o as TerrainFeatureKindBlendMap, p as createGroundPaintColor, r as getTerrainShapeLevel, s as getRidgeBlend, t as computeScatterPoints, u as getTerrainFeatureBounds, v as createGaussianHillsHeight, w as blendGridNodes, x as computeTerrainTile, y as getGaussianHillBlend } from "./terrainWorker-JpiYqzu_.js";
2
2
  import { AdditiveBlending, BackSide, Bone, Box3, BoxGeometry, BufferAttribute, BufferGeometry, CanvasTexture, ClampToEdgeWrapping, Color, CylinderGeometry, Data3DTexture, DataTexture, DataUtils, DirectionalLight, DoubleSide, Euler, Float32BufferAttribute, FloatType, FrontSide, HalfFloatType, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, InterleavedBufferAttribute, LinearFilter, LinearMipmapLinearFilter, MathUtils, Matrix3, Matrix4, Mesh, NearestFilter, NoColorSpace, NoToneMapping, OrthographicCamera, PerspectiveCamera, Quaternion, RGBAFormat, RedFormat, RepeatWrapping, SRGBColorSpace, Scene, Skeleton, SkinnedMesh, Sphere, Sprite, Texture, UnsignedByteType, Vector2, Vector3 } from "three";
3
- import { Fn, If, abs, acos, asin, atan, atomicAdd, atomicStore, attribute, cameraFar, cameraNear, cameraPosition, cameraProjectionMatrix, cameraViewMatrix, clamp, color, cos, cross, diffuseColor, distance, dot, exp, exp2, float, fract, getNormalFromDepth, getViewPosition, hash, instanceIndex, instancedBufferAttribute, interleavedGradientNoise, luminance, mat4, max, min, mix, mod, modelViewMatrix, modelWorldMatrix, modelWorldMatrixInverse, mrt, mx_cell_noise_float, mx_fractal_noise_float, mx_noise_float, normalGeometry, normalLocal, normalView, normalViewGeometry, normalWorld, normalWorldGeometry, normalize, output, pass, perspectiveDepthToViewZ, positionGeometry, positionLocal, positionView, positionViewDirection, positionWorld, pow, reflect, renderOutput, sample, saturate, screenCoordinate, screenUV, select, sin, smoothstep, step, storage, tangentLocal, texture, texture3D, time, transformNormal, transformNormalToView, uint, uniform, uniformArray, uv, varying, vec2, vec3, vec4, velocity, vertexColor, viewportDepthTexture, viewportSharedTexture } from "three/tsl";
4
- import { IndirectStorageBufferAttribute, LightingModel, MeshBasicNodeMaterial, MeshToonNodeMaterial, NodeMaterial, RenderPipeline, RenderTarget, SpriteNodeMaterial, StorageBufferAttribute, StorageInstancedBufferAttribute, ToonOutlinePassNode, WebGPURenderer } from "three/webgpu";
3
+ import { Fn, If, abs, acos, asin, atan, atomicAdd, atomicStore, attribute, cameraFar, cameraNear, cameraPosition, cameraProjectionMatrix, cameraViewMatrix, clamp, color, context, cos, cross, diffuseColor, distance, dot, exp, exp2, float, fract, getNormalFromDepth, getViewPosition, hash, instanceIndex, instancedBufferAttribute, interleavedGradientNoise, luminance, mat4, max, min, mix, mod, modelViewMatrix, modelWorldMatrix, modelWorldMatrixInverse, mrt, mx_cell_noise_float, mx_fractal_noise_float, mx_noise_float, normalGeometry, normalLocal, normalView, normalViewGeometry, normalWorld, normalWorldGeometry, normalize, output, pass, perspectiveDepthToViewZ, positionGeometry, positionLocal, positionView, positionViewDirection, positionWorld, pow, reflect, renderOutput, sample, saturate, screenCoordinate, screenUV, select, sin, smoothstep, step, storage, tangentLocal, texture, texture3D, time, transformNormal, transformNormalToView, uint, uniform, uniformArray, uv, varying, vec2, vec3, vec4, velocity, vertexColor, viewportDepthTexture, viewportSharedTexture } from "three/tsl";
4
+ import { IndirectStorageBufferAttribute, LightingModel, MeshBasicNodeMaterial, MeshToonNodeMaterial, Node, NodeMaterial, NodeUpdateType, QuadMesh, RenderPipeline, RenderTarget, RendererUtils, SpriteNodeMaterial, StorageBufferAttribute, StorageInstancedBufferAttribute, ToonOutlinePassNode, WebGPURenderer } from "three/webgpu";
5
5
  import { CSMShadowNode } from "three/examples/jsm/csm/CSMShadowNode.js";
6
6
  import { MeshBVH } from "three-mesh-bvh";
7
7
  import { Capsule } from "three/examples/jsm/math/Capsule.js";
@@ -10,7 +10,6 @@ import { mergeGeometries } from "three/examples/jsm/utils/BufferGeometryUtils.js
10
10
  import { voronoi2d } from "three/examples/jsm/tsl/math/voronoiNoise.js";
11
11
  import GTAONode from "three/examples/jsm/tsl/display/GTAONode.js";
12
12
  import { bilateralBlur } from "three/examples/jsm/tsl/display/BilateralBlurNode.js";
13
- import { bloom } from "three/examples/jsm/tsl/display/BloomNode.js";
14
13
  import { depthAwareBlend } from "three/examples/jsm/tsl/display/depthAwareBlend.js";
15
14
  import { godrays } from "three/examples/jsm/tsl/display/GodraysNode.js";
16
15
  import { lut3D } from "three/examples/jsm/tsl/display/Lut3DNode.js";
@@ -221,6 +220,16 @@ const GENSHIN_TONE_EXPOSURE = 1;
221
220
  const TONE_CONTRAST_OFFSET = .01;
222
221
  const TONE_CURVE_LIFT = 1e-4;
223
222
  const TONE_CURVE_FLOOR = -Math.log2(1.0001) / 1;
223
+ const GENSHIN_BLOOM_THRESHOLD = .75;
224
+ const GENSHIN_BLOOM_SCALER = 2.5;
225
+ const GENSHIN_BLOOM_INTENSITY = .75;
226
+ const GENSHIN_BLOOM_WEIGHTS = [
227
+ .3,
228
+ .3,
229
+ .26,
230
+ .15
231
+ ];
232
+ const BLOOM_BLUR_TEXELS = [.25, .96];
224
233
  // src/post/toSceneColor.ts
225
234
  const toSceneChannel = (channel) => -Math.log2(1.0001 - Math.min(Math.max(channel, 0), 1) ** (1 / .51)) / 1;
226
235
  const toSceneColor = (displayColor, sceneColor = new Color()) => sceneColor.setRGB(toSceneChannel(displayColor.r), toSceneChannel(displayColor.g), toSceneChannel(displayColor.b));
@@ -4342,6 +4351,135 @@ const createGameOutlineMaterial = (colorNode, widthNode, offsetNode) => {
4342
4351
  material.colorNode = colorNode;
4343
4352
  return material;
4344
4353
  };
4354
+ // src/models/nodes/GameBloomNode.ts
4355
+ const BLUR_TAP_WEIGHT = 1 / (2 * BLOOM_BLUR_TEXELS.length);
4356
+ const DOWNSAMPLE_TAP_OFFSETS = [
4357
+ [-.5, -.5],
4358
+ [.5, -.5],
4359
+ [-.5, .5],
4360
+ [.5, .5]
4361
+ ];
4362
+ const BLUR_ROW_DIRECTION = new Vector2(1, 0);
4363
+ const BLUR_COLUMN_DIRECTION = new Vector2(0, 1);
4364
+ const createRenderTarget = (name) => {
4365
+ const renderTarget = new RenderTarget(1, 1, {
4366
+ depthBuffer: false,
4367
+ type: HalfFloatType
4368
+ });
4369
+ renderTarget.texture.name = name;
4370
+ renderTarget.texture.generateMipmaps = false;
4371
+ return renderTarget;
4372
+ };
4373
+ var GameBloomNode = class extends Node {
4374
+ #blurDirection = uniform(new Vector2(1, 0));
4375
+ #blurInverseSize = uniform(new Vector2());
4376
+ #blurMaterial = new NodeMaterial();
4377
+ #blurTexture = texture();
4378
+ #composeMaterial = new NodeMaterial();
4379
+ #composeTarget = createRenderTarget("GameBloom.compose");
4380
+ #downsampleInverseSize = uniform(new Vector2());
4381
+ #downsampleMaterial = new NodeMaterial();
4382
+ #downsampleTexture = texture();
4383
+ #levels;
4384
+ #materials;
4385
+ #output;
4386
+ #prefilterMaterial = new NodeMaterial();
4387
+ #prefilterTarget = createRenderTarget("GameBloom.prefilter");
4388
+ #quad = new QuadMesh(new NodeMaterial());
4389
+ #rendererState;
4390
+ #size = new Vector2();
4391
+ constructor(inputNode) {
4392
+ super("vec4");
4393
+ this.updateBeforeType = NodeUpdateType.FRAME;
4394
+ this.#levels = GENSHIN_BLOOM_WEIGHTS.map((weight, index) => ({
4395
+ blurred: createRenderTarget(`GameBloom.blurred${index}`),
4396
+ downsampled: createRenderTarget(`GameBloom.downsampled${index}`),
4397
+ horizontal: createRenderTarget(`GameBloom.horizontal${index}`),
4398
+ sampled: texture(),
4399
+ weight
4400
+ }));
4401
+ const prefilter = max(inputNode.rgb.sub(float(GENSHIN_BLOOM_THRESHOLD)), vec3(0)).mul(float(GENSHIN_BLOOM_SCALER));
4402
+ this.#prefilterMaterial.fragmentNode = vec4(prefilter, 1);
4403
+ const downsampled = DOWNSAMPLE_TAP_OFFSETS.map(([x, y]) => this.#downsampleTexture.sample(uv().add(this.#downsampleInverseSize.mul(vec2(x, y)))).rgb).reduce((sum, tap) => sum.add(tap)).mul(float(1 / DOWNSAMPLE_TAP_OFFSETS.length));
4404
+ this.#downsampleMaterial.fragmentNode = vec4(downsampled, 1);
4405
+ const blurred = BLOOM_BLUR_TEXELS.flatMap((distance) => [distance, -distance]).map((distance) => this.#blurTexture.sample(uv().add(this.#blurDirection.mul(this.#blurInverseSize).mul(float(distance)))).rgb).reduce((sum, tap) => sum.add(tap)).mul(float(BLUR_TAP_WEIGHT));
4406
+ this.#blurMaterial.fragmentNode = vec4(blurred, 1);
4407
+ const composed = this.#levels.map(({ sampled, weight }) => sampled.sample(uv()).rgb.mul(float(weight))).reduce((sum, level) => sum.add(level)).mul(float(GENSHIN_BLOOM_INTENSITY));
4408
+ this.#composeMaterial.fragmentNode = vec4(composed, 0);
4409
+ this.#materials = [
4410
+ this.#prefilterMaterial,
4411
+ this.#downsampleMaterial,
4412
+ this.#blurMaterial,
4413
+ this.#composeMaterial
4414
+ ];
4415
+ }
4416
+ dispose() {
4417
+ super.dispose();
4418
+ for (const renderTarget of [
4419
+ this.#prefilterTarget,
4420
+ this.#composeTarget,
4421
+ ...this.#levels.flatMap(({ blurred, downsampled, horizontal }) => [
4422
+ blurred,
4423
+ downsampled,
4424
+ horizontal
4425
+ ])
4426
+ ]) renderTarget.dispose();
4427
+ for (const material of this.#materials) material.dispose();
4428
+ }
4429
+ setup(builder) {
4430
+ const sharedContext = context(builder.getSharedContext());
4431
+ for (const material of this.#materials) {
4432
+ material.contextNode = sharedContext;
4433
+ material.needsUpdate = true;
4434
+ }
4435
+ this.#output ??= texture(this.#composeTarget.texture);
4436
+ return this.#output;
4437
+ }
4438
+ updateBefore(frame) {
4439
+ const { renderer } = frame;
4440
+ if (!renderer) return void 0;
4441
+ this.#rendererState = RendererUtils.saveRendererState(renderer, this.#rendererState);
4442
+ const size = renderer.getDrawingBufferSize(this.#size);
4443
+ this.#setSize(size.width, size.height);
4444
+ this.#renderPass(renderer, this.#prefilterTarget, this.#prefilterMaterial);
4445
+ let input = this.#prefilterTarget;
4446
+ for (const level of this.#levels) {
4447
+ this.#downsampleTexture.value = input.texture;
4448
+ this.#downsampleInverseSize.value.set(1 / input.width, 1 / input.height);
4449
+ this.#renderPass(renderer, level.downsampled, this.#downsampleMaterial);
4450
+ this.#renderBlur(renderer, level.downsampled, level.horizontal, BLUR_ROW_DIRECTION);
4451
+ this.#renderBlur(renderer, level.horizontal, level.blurred, BLUR_COLUMN_DIRECTION);
4452
+ input = level.blurred;
4453
+ }
4454
+ for (const level of this.#levels) level.sampled.value = level.blurred.texture;
4455
+ this.#renderPass(renderer, this.#composeTarget, this.#composeMaterial);
4456
+ RendererUtils.restoreRendererState(renderer, this.#rendererState);
4457
+ }
4458
+ #renderBlur(renderer, source, target, direction) {
4459
+ this.#blurTexture.value = source.texture;
4460
+ this.#blurDirection.value.copy(direction);
4461
+ this.#blurInverseSize.value.set(1 / source.width, 1 / source.height);
4462
+ this.#renderPass(renderer, target, this.#blurMaterial);
4463
+ }
4464
+ #renderPass(renderer, target, material) {
4465
+ this.#quad.material = material;
4466
+ renderer.setRenderTarget(target);
4467
+ this.#quad.render(renderer);
4468
+ }
4469
+ #setSize(width, height) {
4470
+ this.#prefilterTarget.setSize(width, height);
4471
+ this.#composeTarget.setSize(width, height);
4472
+ let levelWidth = width;
4473
+ let levelHeight = height;
4474
+ for (const level of this.#levels) {
4475
+ levelWidth = Math.max(1, Math.floor(levelWidth / 2));
4476
+ levelHeight = Math.max(1, Math.floor(levelHeight / 2));
4477
+ level.downsampled.setSize(levelWidth, levelHeight);
4478
+ level.horizontal.setSize(levelWidth, levelHeight);
4479
+ level.blurred.setSize(levelWidth, levelHeight);
4480
+ }
4481
+ }
4482
+ };
4345
4483
  // src/models/nodes/getGameOutlineOffset.ts
4346
4484
  const getGameOutlineOffset = (viewPosition, blue, blockBChannel, size) => {
4347
4485
  const scale = blockBChannel < .5 ? blue - .5 : 1;
@@ -5041,6 +5179,8 @@ const setObjectSurface = (object, color, detail) => {
5041
5179
  const texelsPerMetre = detail ? 1 / detail.metresPerTexel : 0;
5042
5180
  object.userData[OBJECT_SURFACE_KEY] = new ObjectSurface(new Color(color), amplitudes, texelsPerMetre);
5043
5181
  };
5182
+ // src/post/computeBloomPrefilter.ts
5183
+ const computeBloomPrefilter = (channel) => Math.max(channel - GENSHIN_BLOOM_THRESHOLD, 0) * GENSHIN_BLOOM_SCALER;
5044
5184
  // src/post/computeGradeLut.ts
5045
5185
  const RED_LUMINANCE = .2126;
5046
5186
  const GREEN_LUMINANCE = .7152;
@@ -5184,9 +5324,6 @@ const createSightNode = (colorNode, depthNode, camera, litPass, { origin, radius
5184
5324
  // src/post/toneMapGenshinNode.ts
5185
5325
  const toneMapGenshinNode = (sceneColor) => min(max(vec3(1.0001).sub(exp2(sceneColor.mul(-1))), 0).pow(.51), 1);
5186
5326
  // src/post/createPostPipeline.ts
5187
- const BLOOM_STRENGTH = .35;
5188
- const BLOOM_RADIUS = .4;
5189
- const BLOOM_THRESHOLD = .85;
5190
5327
  const MIN_VIEW_DISTANCE = .001;
5191
5328
  const createPostPipeline = ({ camera, fogUniforms, godraysLight, gradeLutTexture, isBloomed = true, occlusionRadius, postUniforms: { godraysColor, gradeIntensity, outlineColor, outlineFadeDistance, outlineThickness, whiteBalance }, qualityTierSettings: { antialiasingMode, godraysStepCount, isBloomEnabled, isOcclusionEnabled }, renderer, scene, sight, stoneLight }) => {
5192
5329
  const renderPipeline = new RenderPipeline(renderer);
@@ -5237,10 +5374,9 @@ const createPostPipeline = ({ camera, fogUniforms, godraysLight, gradeLutTexture
5237
5374
  }
5238
5375
  let bloomedNode = sightedNode;
5239
5376
  if (isBloomed && isBloomEnabled) {
5240
- const bloomNode = bloom(sightedNode, BLOOM_STRENGTH, BLOOM_RADIUS, BLOOM_THRESHOLD);
5377
+ const bloomNode = new GameBloomNode(sightedNode);
5241
5378
  passNodes.push(bloomNode);
5242
5379
  bloomedNode = sightedNode.add(bloomNode);
5243
- postPipeline.bloomNode = bloomNode;
5244
5380
  }
5245
5381
  let resolvedNode = bloomedNode;
5246
5382
  if (isTraa) {
@@ -5366,6 +5502,7 @@ const createTileStreamer = ({ disposeTile, maxCachedCount, maxPendingCount, requ
5366
5502
  const pendingWantedFrameMap = /* @__PURE__ */ new Map();
5367
5503
  const failedAttemptMap = /* @__PURE__ */ new Map();
5368
5504
  const givenUpKeySet = /* @__PURE__ */ new Set();
5505
+ const retryKeySet = /* @__PURE__ */ new Set();
5369
5506
  const stalePendingKeySet = /* @__PURE__ */ new Set();
5370
5507
  let frame = 0;
5371
5508
  let isDisposed = false;
@@ -5396,6 +5533,7 @@ const createTileStreamer = ({ disposeTile, maxCachedCount, maxPendingCount, requ
5396
5533
  pendingWantedFrameMap.clear();
5397
5534
  failedAttemptMap.clear();
5398
5535
  givenUpKeySet.clear();
5536
+ retryKeySet.clear();
5399
5537
  stalePendingKeySet.clear();
5400
5538
  },
5401
5539
  fail: (key) => {
@@ -5403,12 +5541,16 @@ const createTileStreamer = ({ disposeTile, maxCachedCount, maxPendingCount, requ
5403
5541
  stalePendingKeySet.delete(key);
5404
5542
  const attempts = (failedAttemptMap.get(key) ?? 0) + 1;
5405
5543
  failedAttemptMap.set(key, attempts);
5406
- if (attempts < 3) return false;
5544
+ if (attempts < 3) {
5545
+ retryKeySet.add(key);
5546
+ return false;
5547
+ }
5407
5548
  givenUpKeySet.add(key);
5408
5549
  return true;
5409
5550
  },
5410
5551
  get: (key) => cachedTileMap.get(key)?.tile,
5411
5552
  has: (key) => cachedTileMap.has(key),
5553
+ pendingCount: () => pendingWantedFrameMap.size + retryKeySet.size,
5412
5554
  receive: (key, tile) => {
5413
5555
  const lastWantedFrame = pendingWantedFrameMap.get(key) ?? frame;
5414
5556
  pendingWantedFrameMap.delete(key);
@@ -5432,6 +5574,8 @@ const createTileStreamer = ({ disposeTile, maxCachedCount, maxPendingCount, requ
5432
5574
  },
5433
5575
  update: (wanted, drawn, surrounding) => {
5434
5576
  frame++;
5577
+ const failedKeys = [...retryKeySet];
5578
+ retryKeySet.clear();
5435
5579
  for (const { count, keys } of [
5436
5580
  wanted,
5437
5581
  drawn,
@@ -5455,6 +5599,7 @@ const createTileStreamer = ({ disposeTile, maxCachedCount, maxPendingCount, requ
5455
5599
  requestTile(key);
5456
5600
  }
5457
5601
  }
5602
+ for (const key of failedKeys) if ([wanted, surrounding].some(({ count, keys }) => keys.subarray(0, count).includes(key)) && !checkIsSettled(key) && !pendingWantedFrameMap.has(key)) retryKeySet.add(key);
5458
5603
  }
5459
5604
  };
5460
5605
  };
@@ -6452,4 +6597,4 @@ const computeOutlineDistance = (outline, x, z) => {
6452
6597
  }
6453
6598
  return isInside ? 0 : Math.sqrt(nearestSquared);
6454
6599
  };
6455
- export { A4_FREQUENCY, A4_PITCH, AIR_LOCOMOTION_STATES, AnchoredCascadeShadowNode, AntialiasingMode, BEND_FOAM_FULL_RADIUS_WIDTHS, CLIMB_JUMP_STAMINA_COST, CLIMB_LOCOMOTION_STATES, CLIMB_REGRAB_SECONDS, CLIMB_STAMINA_PER_SECOND, CLIMB_START_STAMINA, COOL_RAMP_ROW_BASE, CULLING_FRUSTUM_MARGIN, CULLING_INDEX_COUNT_INDEX, CULLING_INDIRECT_ARGUMENT_COUNT, CULLING_INSTANCE_COUNT_INDEX, CULLING_MATRIX_COLUMN_COUNT, CULLING_MATRIX_ELEMENT_COUNT, CULLING_MIN_SIZE, CharacterMaterialKind, DASH_STAMINA_COST, DEFAULT_LIGHT_AREA, DEFAULT_RAMP_WIDTH, DEFAULT_SKY_GRADIENT, DEFAULT_SKY_SHAPE, DESATURATION_WEIGHTS, EMISSION_ALPHA_FLOOR, FIELD_SELECTOR, FLAT_LIGHT_MAP, FLOWER_BEND_PER_WIND, FLOWER_COLOR_ATTRIBUTE_NAME, FLOWER_MATRIX_ATTRIBUTE_NAMES, FOCUS_KEY_CODES, FOLLOW_CAMERA_ARM_STEP, FOLLOW_CAMERA_CLEARANCE, FOLLOW_CAMERA_DEFAULT_SETTINGS, FOLLOW_CAMERA_DISTANCE_PER_ZOOM_STEP, FOLLOW_CAMERA_EASE_OUT_SPEED, FOLLOW_CAMERA_FOV, FOLLOW_CAMERA_MAX_DISTANCE, FOLLOW_CAMERA_MAX_PITCH, FOLLOW_CAMERA_MIN_DISTANCE, FOLLOW_CAMERA_MIN_PITCH, FOLLOW_CAMERA_NEUTRAL_SENSITIVITY, FOLLOW_CAMERA_PIVOT_SHARE, FOLLOW_CAMERA_SLOPE_PITCH_SPEED, FREE_CAMERA_BASE_SPEED, FREE_CAMERA_CLEARANCE, FREE_CAMERA_MAX_PITCH, FREE_CAMERA_SPEED_PER_HEIGHT, GAMEPAD_BUTTONS, GAMEPAD_LOOK_RADIANS_PER_SECOND, GAMEPAD_STICK_DEADZONE, GAME_MINUTES_PER_SECOND, GAUSSIAN_REACH_WIDTHS, GENSHIN_TONE_CONTRAST, GENSHIN_TONE_EXPOSURE, GENSHIN_TONE_MAPPING, GLIDE_STAMINA_PER_SECOND, GRASS_BEND_PER_WIND, GRASS_DIP_PER_BEND, GRASS_TRAIL_BEND_SHARE, GRASS_TRAIL_EXTENT, GRASS_TRAIL_FADE_END_SHARE, GRASS_TRAIL_FADE_SECONDS, GRASS_TRAIL_FADE_START_SHARE, GRASS_TRAIL_STAMP_RADIUS, GRASS_TRAIL_TEXELS, GRASS_TRAIL_TEXEL_SIZE, GROUND_CONTACT_DISTANCE, GROUND_LOCOMOTION_STATES, GROUND_NORMAL_SPAN, GROUND_PRESS_SPEED, GamepadButton, GroundLayer, GroundLayers, HALF_LAMBERT_OFFSET, HALF_LAMBERT_SCALE, IMPOSTOR_CROSSFADE_SHARE, IMPOSTOR_RESOLUTION, IMPOSTOR_SWITCH_HEIGHTS, InputAction, InputActionBindingMap, InputActions, KEY_CODE_BACKWARD, KEY_CODE_DOWN, KEY_CODE_FORWARD, KEY_CODE_LEFT, KEY_CODE_RIGHT, KEY_CODE_UP, LEAF_SHAPE_KEPT_SHARE, LEAF_SHAPE_WIDTH, LEAST_DIVISOR, LIGHTNING_BOLT_BRIGHTNESS, LIGHTNING_BOLT_COLOR, LIGHTNING_BOLT_OPTIONS, LIGHTNING_FLASH_AMBIENT, LIGHTNING_FLASH_COLOR, LIGHTNING_FLASH_DECAY_SECONDS, LIGHTNING_FLASH_END, LIGHTNING_FLASH_PULSES, LIGHTNING_FLASH_SKY, LIGHTNING_MAX_DISTANCE, LIGHTNING_MIN_DISTANCE, LocomotionState, MAXIMUM_FACE_THRESHOLD, MAXIMUM_WINDOW_FLOOR, MAX_BYTE, MAX_STEPS_PER_FRAME, MAX_TILE_ATTEMPTS, MIDI_VELOCITY_MAX, MINIMUM_FACE_THRESHOLD, MINIMUM_OUTLINE_KNOT_SPAN, MINIMUM_RAMP_WIDTH_VERTEX, MINUTES_PER_DAY, MMD_BONE_NAME_MAP, MOUSE_BUTTONS, MOUSE_LOOK_MAX_PIXELS_PER_EVENT, MOUSE_LOOK_RADIANS_PER_PIXEL, MUSIC_EXPRESSION_WINDOW_SECONDS, MUSIC_LOOKAHEAD_SECONDS, MUSIC_NOISE_BAND_CENTRES, MUSIC_NOISE_LENGTH, MUSIC_SCHEDULE_INTERVAL_MS, MmdBoneName, MouseButton, NEUTRAL_LIGHT_MAP_GREEN, OBJECT_FADE_KEY, OBJECT_SURFACE_KEY, OUTLINE_MAIN_TEXTURE_SHARE, OUTLINE_PROJECTION_SCALE, OUTLINE_WIDTH_SCALE, ObjectSurface, POSE_AIR_STANCES, POSE_ARM_BEND_RADIANS, POSE_ARM_CHAINS, POSE_ARM_LOWER_RADIANS, POSE_BREATH_SECONDS, POSE_CHEST_BREATH_RADIANS, POSE_CROSSFADE_SECONDS, POSE_GAITS, POSE_SHOULDER_BREATH_RADIANS, PRECIPITATION_COUNT, PRECIPITATION_SETTINGS_MAP, PRECIPITATION_SWAY_SPEED, PRECIPITATION_VOLUME_HEIGHT, PRECIPITATION_VOLUME_SIZE, PmxBoneFlag, PmxJointKind, PmxMaterialFlag, PmxMorphKind, PmxPhysicsMode, PmxReader, PmxRigidBodyShape, PmxSphereMode, PmxTextEncoding, PmxWeightDeform, PrecipitationKind, QualityTier, QualityTierSettingsMap, RAMP_ROW_BASE, RAMP_ROW_STEP, REGION_FLOORS, RELEASE_TIME_CONSTANTS, RIVER_BEND_FOAM_ATTRIBUTE, RampLayout, RoofKind, SHARED_TOON_RAMP_SHADES, SOUND_EFFECT_BAND_EDGES, SOUND_EFFECT_FRAME_LENGTH, SPECTRAL_ANGULAR_BIN_COUNT, SPECTRAL_RADIAL_BIN_COUNT, SPHERE_CAST_STRIDE_SHARE, SPLASH_COUNT, SPLASH_LIFETIME, SPLASH_LIFT, SPLASH_OPACITY, SPLASH_RADIUS, SPLASH_SIZE, SPRINT_STAMINA_PER_SECOND, STAMINA_MAX, STAMINA_REFILL_DELAY_SECONDS, STAMINA_REFILL_PER_SECOND, STAMINA_REFILL_STATES, STEEP_SLIDE_SPEED, STONE_DARKENING_TOP, STONE_HARMONIC_COUNT, STONE_HEIGHT_FALLOFF, STONE_MASK_OUTPUT, STONE_RAMP_KNOT_COUNT, STONE_SHADOW_EXPONENT, SUN_REDRAW_COSINE, SURFACE_DETAIL_BAND_SIGMAS, SURFACE_OCTAVE_RESPONSES, SURFACE_OCTAVE_TEXEL_FREQUENCIES, SWIM_DASH_STAMINA_COST, SWIM_DASH_STAMINA_PER_SECOND, SWIM_STROKE_SECONDS, SWIM_STROKE_STAMINA_COST, SharedToonOutlinePassNode, StoneLightingModel, StoneNodeMaterial, TERRAIN_CELL_SIZE, TERRAIN_HEIGHT_PADDING, TERRAIN_LAYER, TERRAIN_RING_INITIAL_TILE_COUNT, TILE_INDEX_OFFSET, TILE_INDEX_SPAN, TONE_CONTRAST_OFFSET, TONE_CURVE_FLOOR, TONE_CURVE_LIFT, TOON_HIGH, TOON_LOW, TerrainFeatureKind, TerrainFeatureKindBlendMap, ToonNodeMaterial, UNIT_OUTLINE_WIDTH_KNOTS, WALK_MOVE_MAGNITUDE, WALL_PRESS_SPEED, WALL_PROBE_DISTANCE, WATER_LOCOMOTION_STATES, WEATHER_SETTINGS_MAP, WEATHER_TRANSITION_SECONDS, WET_DARKENING, WET_SHEEN_POWER, WET_SHEEN_STRENGTH, WeatherKind, addSmoothLoop, advanceGameClock, advanceStridePhase, applyLightningFlash, applyPrecipitationSettings, applySkyState, applyStoneLight, applyWeatherState, bakeImpostor, blendGridNodes, blendWeatherState, checkIsPmxSphereDrawn, checkSunTurned, checkTerrainBoundsOverlap, checkTerrainDrawsChanged, checkTerrainTileCasts, checkTransparentTexels, collectMusicNotes, collectMusicSegments, computeCharacterPose, computeGradeLut, computeGrassBlade, computeGrassTrailCell, computeGrassTrailTexel, computeGrassTrailTexelIndex, computeImpostorFade, computeLeafCards, computeLightningBolt, computeLightningFlash, computeLocomotionState, computeNoiseSamples, computeOriginShift, computeOutlineDistance, computeRampValues, computeScatterPoints, computeSoundEffectSamples, computeStatueSurface, computeStoneDarkening, computeStoneHarmonics, computeStoneRampCoordinate, computeSunDirection, computeSurfaceOctaves, computeTerrainIndices, computeTerrainTile, computeTreeTubes, computeWhiteBalance, computeWindGust, createBoxesGeometry, createBuildingGeometry, createCausticsNode, createCharacterController, createCharacterMaterial, createCharacterPoseRotations, createCharacterPoser, createCharacterShadingInputs, createCharacterShadingNode, createCloudAtlasTexture, createCloudBandSprite, createCloudLayerNode, createCloudLayerProfileTexture, createCloudLayerTexture, createCloudLayerTextures, createCloudLayerUniforms, createDitherFadeNode, createFaceDraw, createFaceShadeNode, createFixedStepLoop, createFlowerGeometry, createFlowerMaterial, createFlowerTileGeometry, createFogUniforms, createFollowCamera, createFreeCamera, createFrustumVisibility, createGameOutlineMaterial, createGaussianHillsHeight, createGenshinRenderer, createGodraysLight, createGradeLutTexture, createGrassBladePoint, createGrassCell, createGrassCulling, createGrassGeometry, createGrassMaterial, createGrassTrail, createGroundCapture, createGroundLayerWeights, createGroundPaintColor, createGroundQuery, createHeightFogNode, createIdleInputState, createImpostorMaterial, createIndexedGeometry, createInput, createInstanceCulling, createInstanceMatrixBuffer, createInstanceMatrixNode, createInstancedGeometry, createInstancedMesh, createInstrumentWave, createLandmarkCollider, createLatheStackGeometry, createLeafMaterial, createLeafShapeNode, createLightUniforms, createLightningBoltGeometry, createLightningBoltMaterial, createMaterialDetailNode, createMusicPlayer, createNoiseBuffer, createObjectFadeNode, createObjectSurfaceNode, createOcclusionNode, createOutlineColorNode, createOutlineMaterial, createOutlineScaleNode, createPavingGeometry, createPavingStoneGeometry, createPlantCulling, createPmxGeometry, createPmxMesh, createPmxSkeleton, createPmxTexture, createPmxToonTexture, createPostPipeline, createPostUniforms, createPrecipitationGeometry, createPrecipitationMaterial, createPrecipitationUniforms, createRampColumnNode, createRampTexture, createRampUvNode, createResidualHeight, createRimNode, createRiverGeometry, createRiverMaterial, createSeededRandom, createShadingRegionNode, createSightNode, createSightUniforms, createSimplexNoise, createSkyColorNode, createSkyGradientTexture, createSkyNode, createSkyState, createSkyUniforms, createSoundEffectBuffer, createSplashMaterial, createStamina, createStatueGeometries, createStoneGlowNode, createStoneLightUniforms, createStoneMaterial, createSunLight, createSunVisibilityNode, createSurfaceDetailNode, createSurvivorIndices, createTerrainFeaturesBlend, createTerrainFeaturesHeight, createTerrainMaterial, createTerrainRing, createTerrainSelection, createTerrainShapeHeight, createTerrainTileGeometry, createTileStreamer, createToneNode, createToonMaterial, createToonThresholdNode, createTreeGeometry, createUnderwaterFogState, createWaterFlowUniforms, createWaterMaterial, createWaterUniforms, createWaterfallGeometry, createWaterfallMaterial, createWetDarkeningNode, createWetSheenNode, createWindNode, createWindUniforms, fileByCell, findSkinnedMesh, getCliffBlend, getCloudAtlasColumns, getCloudSunColors, getDesaturatedColour, getGameOutlineOffset, getGaussianHillBlend, getMusicRecordingGain, getMusicRecordingRate, getOutlineDepth, getOutlineScale, getParentTerrainTileKey, getPlateauBlend, getRampColumn, getRampRow, getRampWidth, getRidgeBlend, getScreenDirection, getSegmentBounds, getShadingRegion, getSharedToonRamp, getSoundEffectBandBins, getSpectralBin, getTerrainFeatureBounds, getTerrainMorphStart, getTerrainOverlayBounds, getTerrainShapeLevel, getTerrainTileBounds, getTerrainTileColumn, getTerrainTileKey, getTerrainTileLevel, getTerrainTileRow, getToneColour, getToonThreshold, measureSegment, mergeGeometryParts, orderByViewDepth, parsePmx, parsePmxBones, parsePmxJoints, parsePmxMaterials, parsePmxMorphs, parsePmxRigidBodies, parsePmxVertices, placeCloudBand, renderGroundCapture, renderMusicSegment, resolveTerrainDraws, sampleGrassTrail, sampleGroundCapture, sampleGroundLayerField, sampleSkyState, sampleTerrainResidualFade, sampleTreeNormalField, scheduleMusicExpression, scheduleMusicNote, scheduleMusicRecording, selectMusicSample, selectRegionNode, selectTerrainTiles, setObjectFade, setObjectSurface, stepGrassTrail, synthesizeCloudLayerTextures, synthesizeSpectralNoise, toAxis, toClamped, toDeadzoned, toSceneColor, toneMapGenshin, toneMapGenshinNode, transformFourier, transformFourierGrid, updateFaceDraw, updateUnderwaterFog, writeCloudLayerTexture, writeQuadIndices, writeTerrainRingIndices, writeTerrainRingTile };
6600
+ export { A4_FREQUENCY, A4_PITCH, AIR_LOCOMOTION_STATES, AnchoredCascadeShadowNode, AntialiasingMode, BEND_FOAM_FULL_RADIUS_WIDTHS, BLOOM_BLUR_TEXELS, CLIMB_JUMP_STAMINA_COST, CLIMB_LOCOMOTION_STATES, CLIMB_REGRAB_SECONDS, CLIMB_STAMINA_PER_SECOND, CLIMB_START_STAMINA, COOL_RAMP_ROW_BASE, CULLING_FRUSTUM_MARGIN, CULLING_INDEX_COUNT_INDEX, CULLING_INDIRECT_ARGUMENT_COUNT, CULLING_INSTANCE_COUNT_INDEX, CULLING_MATRIX_COLUMN_COUNT, CULLING_MATRIX_ELEMENT_COUNT, CULLING_MIN_SIZE, CharacterMaterialKind, DASH_STAMINA_COST, DEFAULT_LIGHT_AREA, DEFAULT_RAMP_WIDTH, DEFAULT_SKY_GRADIENT, DEFAULT_SKY_SHAPE, DESATURATION_WEIGHTS, EMISSION_ALPHA_FLOOR, FIELD_SELECTOR, FLAT_LIGHT_MAP, FLOWER_BEND_PER_WIND, FLOWER_COLOR_ATTRIBUTE_NAME, FLOWER_MATRIX_ATTRIBUTE_NAMES, FOCUS_KEY_CODES, FOLLOW_CAMERA_ARM_STEP, FOLLOW_CAMERA_CLEARANCE, FOLLOW_CAMERA_DEFAULT_SETTINGS, FOLLOW_CAMERA_DISTANCE_PER_ZOOM_STEP, FOLLOW_CAMERA_EASE_OUT_SPEED, FOLLOW_CAMERA_FOV, FOLLOW_CAMERA_MAX_DISTANCE, FOLLOW_CAMERA_MAX_PITCH, FOLLOW_CAMERA_MIN_DISTANCE, FOLLOW_CAMERA_MIN_PITCH, FOLLOW_CAMERA_NEUTRAL_SENSITIVITY, FOLLOW_CAMERA_PIVOT_SHARE, FOLLOW_CAMERA_SLOPE_PITCH_SPEED, FREE_CAMERA_BASE_SPEED, FREE_CAMERA_CLEARANCE, FREE_CAMERA_MAX_PITCH, FREE_CAMERA_SPEED_PER_HEIGHT, GAMEPAD_BUTTONS, GAMEPAD_LOOK_RADIANS_PER_SECOND, GAMEPAD_STICK_DEADZONE, GAME_MINUTES_PER_SECOND, GAUSSIAN_REACH_WIDTHS, GENSHIN_BLOOM_INTENSITY, GENSHIN_BLOOM_SCALER, GENSHIN_BLOOM_THRESHOLD, GENSHIN_BLOOM_WEIGHTS, GENSHIN_TONE_CONTRAST, GENSHIN_TONE_EXPOSURE, GENSHIN_TONE_MAPPING, GLIDE_STAMINA_PER_SECOND, GRASS_BEND_PER_WIND, GRASS_DIP_PER_BEND, GRASS_TRAIL_BEND_SHARE, GRASS_TRAIL_EXTENT, GRASS_TRAIL_FADE_END_SHARE, GRASS_TRAIL_FADE_SECONDS, GRASS_TRAIL_FADE_START_SHARE, GRASS_TRAIL_STAMP_RADIUS, GRASS_TRAIL_TEXELS, GRASS_TRAIL_TEXEL_SIZE, GROUND_CONTACT_DISTANCE, GROUND_LOCOMOTION_STATES, GROUND_NORMAL_SPAN, GROUND_PRESS_SPEED, GameBloomNode, GamepadButton, GroundLayer, GroundLayers, HALF_LAMBERT_OFFSET, HALF_LAMBERT_SCALE, IMPOSTOR_CROSSFADE_SHARE, IMPOSTOR_RESOLUTION, IMPOSTOR_SWITCH_HEIGHTS, InputAction, InputActionBindingMap, InputActions, KEY_CODE_BACKWARD, KEY_CODE_DOWN, KEY_CODE_FORWARD, KEY_CODE_LEFT, KEY_CODE_RIGHT, KEY_CODE_UP, LEAF_SHAPE_KEPT_SHARE, LEAF_SHAPE_WIDTH, LEAST_DIVISOR, LIGHTNING_BOLT_BRIGHTNESS, LIGHTNING_BOLT_COLOR, LIGHTNING_BOLT_OPTIONS, LIGHTNING_FLASH_AMBIENT, LIGHTNING_FLASH_COLOR, LIGHTNING_FLASH_DECAY_SECONDS, LIGHTNING_FLASH_END, LIGHTNING_FLASH_PULSES, LIGHTNING_FLASH_SKY, LIGHTNING_MAX_DISTANCE, LIGHTNING_MIN_DISTANCE, LocomotionState, MAXIMUM_FACE_THRESHOLD, MAXIMUM_WINDOW_FLOOR, MAX_BYTE, MAX_STEPS_PER_FRAME, MAX_TILE_ATTEMPTS, MIDI_VELOCITY_MAX, MINIMUM_FACE_THRESHOLD, MINIMUM_OUTLINE_KNOT_SPAN, MINIMUM_RAMP_WIDTH_VERTEX, MINUTES_PER_DAY, MMD_BONE_NAME_MAP, MOUSE_BUTTONS, MOUSE_LOOK_MAX_PIXELS_PER_EVENT, MOUSE_LOOK_RADIANS_PER_PIXEL, MUSIC_EXPRESSION_WINDOW_SECONDS, MUSIC_LOOKAHEAD_SECONDS, MUSIC_NOISE_BAND_CENTRES, MUSIC_NOISE_LENGTH, MUSIC_SCHEDULE_INTERVAL_MS, MmdBoneName, MouseButton, NEUTRAL_LIGHT_MAP_GREEN, OBJECT_FADE_KEY, OBJECT_SURFACE_KEY, OUTLINE_MAIN_TEXTURE_SHARE, OUTLINE_PROJECTION_SCALE, OUTLINE_WIDTH_SCALE, ObjectSurface, POSE_AIR_STANCES, POSE_ARM_BEND_RADIANS, POSE_ARM_CHAINS, POSE_ARM_LOWER_RADIANS, POSE_BREATH_SECONDS, POSE_CHEST_BREATH_RADIANS, POSE_CROSSFADE_SECONDS, POSE_GAITS, POSE_SHOULDER_BREATH_RADIANS, PRECIPITATION_COUNT, PRECIPITATION_SETTINGS_MAP, PRECIPITATION_SWAY_SPEED, PRECIPITATION_VOLUME_HEIGHT, PRECIPITATION_VOLUME_SIZE, PmxBoneFlag, PmxJointKind, PmxMaterialFlag, PmxMorphKind, PmxPhysicsMode, PmxReader, PmxRigidBodyShape, PmxSphereMode, PmxTextEncoding, PmxWeightDeform, PrecipitationKind, QualityTier, QualityTierSettingsMap, RAMP_ROW_BASE, RAMP_ROW_STEP, REGION_FLOORS, RELEASE_TIME_CONSTANTS, RIVER_BEND_FOAM_ATTRIBUTE, RampLayout, RoofKind, SHARED_TOON_RAMP_SHADES, SOUND_EFFECT_BAND_EDGES, SOUND_EFFECT_FRAME_LENGTH, SPECTRAL_ANGULAR_BIN_COUNT, SPECTRAL_RADIAL_BIN_COUNT, SPHERE_CAST_STRIDE_SHARE, SPLASH_COUNT, SPLASH_LIFETIME, SPLASH_LIFT, SPLASH_OPACITY, SPLASH_RADIUS, SPLASH_SIZE, SPRINT_STAMINA_PER_SECOND, STAMINA_MAX, STAMINA_REFILL_DELAY_SECONDS, STAMINA_REFILL_PER_SECOND, STAMINA_REFILL_STATES, STEEP_SLIDE_SPEED, STONE_DARKENING_TOP, STONE_HARMONIC_COUNT, STONE_HEIGHT_FALLOFF, STONE_MASK_OUTPUT, STONE_RAMP_KNOT_COUNT, STONE_SHADOW_EXPONENT, SUN_REDRAW_COSINE, SURFACE_DETAIL_BAND_SIGMAS, SURFACE_OCTAVE_RESPONSES, SURFACE_OCTAVE_TEXEL_FREQUENCIES, SWIM_DASH_STAMINA_COST, SWIM_DASH_STAMINA_PER_SECOND, SWIM_STROKE_SECONDS, SWIM_STROKE_STAMINA_COST, SharedToonOutlinePassNode, StoneLightingModel, StoneNodeMaterial, TERRAIN_CELL_SIZE, TERRAIN_HEIGHT_PADDING, TERRAIN_LAYER, TERRAIN_RING_INITIAL_TILE_COUNT, TILE_INDEX_OFFSET, TILE_INDEX_SPAN, TONE_CONTRAST_OFFSET, TONE_CURVE_FLOOR, TONE_CURVE_LIFT, TOON_HIGH, TOON_LOW, TerrainFeatureKind, TerrainFeatureKindBlendMap, ToonNodeMaterial, UNIT_OUTLINE_WIDTH_KNOTS, WALK_MOVE_MAGNITUDE, WALL_PRESS_SPEED, WALL_PROBE_DISTANCE, WATER_LOCOMOTION_STATES, WEATHER_SETTINGS_MAP, WEATHER_TRANSITION_SECONDS, WET_DARKENING, WET_SHEEN_POWER, WET_SHEEN_STRENGTH, WeatherKind, addSmoothLoop, advanceGameClock, advanceStridePhase, applyLightningFlash, applyPrecipitationSettings, applySkyState, applyStoneLight, applyWeatherState, bakeImpostor, blendGridNodes, blendWeatherState, checkIsPmxSphereDrawn, checkSunTurned, checkTerrainBoundsOverlap, checkTerrainDrawsChanged, checkTerrainTileCasts, checkTransparentTexels, collectMusicNotes, collectMusicSegments, computeBloomPrefilter, computeCharacterPose, computeGradeLut, computeGrassBlade, computeGrassTrailCell, computeGrassTrailTexel, computeGrassTrailTexelIndex, computeImpostorFade, computeLeafCards, computeLightningBolt, computeLightningFlash, computeLocomotionState, computeNoiseSamples, computeOriginShift, computeOutlineDistance, computeRampValues, computeScatterPoints, computeSoundEffectSamples, computeStatueSurface, computeStoneDarkening, computeStoneHarmonics, computeStoneRampCoordinate, computeSunDirection, computeSurfaceOctaves, computeTerrainIndices, computeTerrainTile, computeTreeTubes, computeWhiteBalance, computeWindGust, createBoxesGeometry, createBuildingGeometry, createCausticsNode, createCharacterController, createCharacterMaterial, createCharacterPoseRotations, createCharacterPoser, createCharacterShadingInputs, createCharacterShadingNode, createCloudAtlasTexture, createCloudBandSprite, createCloudLayerNode, createCloudLayerProfileTexture, createCloudLayerTexture, createCloudLayerTextures, createCloudLayerUniforms, createDitherFadeNode, createFaceDraw, createFaceShadeNode, createFixedStepLoop, createFlowerGeometry, createFlowerMaterial, createFlowerTileGeometry, createFogUniforms, createFollowCamera, createFreeCamera, createFrustumVisibility, createGameOutlineMaterial, createGaussianHillsHeight, createGenshinRenderer, createGodraysLight, createGradeLutTexture, createGrassBladePoint, createGrassCell, createGrassCulling, createGrassGeometry, createGrassMaterial, createGrassTrail, createGroundCapture, createGroundLayerWeights, createGroundPaintColor, createGroundQuery, createHeightFogNode, createIdleInputState, createImpostorMaterial, createIndexedGeometry, createInput, createInstanceCulling, createInstanceMatrixBuffer, createInstanceMatrixNode, createInstancedGeometry, createInstancedMesh, createInstrumentWave, createLandmarkCollider, createLatheStackGeometry, createLeafMaterial, createLeafShapeNode, createLightUniforms, createLightningBoltGeometry, createLightningBoltMaterial, createMaterialDetailNode, createMusicPlayer, createNoiseBuffer, createObjectFadeNode, createObjectSurfaceNode, createOcclusionNode, createOutlineColorNode, createOutlineMaterial, createOutlineScaleNode, createPavingGeometry, createPavingStoneGeometry, createPlantCulling, createPmxGeometry, createPmxMesh, createPmxSkeleton, createPmxTexture, createPmxToonTexture, createPostPipeline, createPostUniforms, createPrecipitationGeometry, createPrecipitationMaterial, createPrecipitationUniforms, createRampColumnNode, createRampTexture, createRampUvNode, createResidualHeight, createRimNode, createRiverGeometry, createRiverMaterial, createSeededRandom, createShadingRegionNode, createSightNode, createSightUniforms, createSimplexNoise, createSkyColorNode, createSkyGradientTexture, createSkyNode, createSkyState, createSkyUniforms, createSoundEffectBuffer, createSplashMaterial, createStamina, createStatueGeometries, createStoneGlowNode, createStoneLightUniforms, createStoneMaterial, createSunLight, createSunVisibilityNode, createSurfaceDetailNode, createSurvivorIndices, createTerrainFeaturesBlend, createTerrainFeaturesHeight, createTerrainMaterial, createTerrainRing, createTerrainSelection, createTerrainShapeHeight, createTerrainTileGeometry, createTileStreamer, createToneNode, createToonMaterial, createToonThresholdNode, createTreeGeometry, createUnderwaterFogState, createWaterFlowUniforms, createWaterMaterial, createWaterUniforms, createWaterfallGeometry, createWaterfallMaterial, createWetDarkeningNode, createWetSheenNode, createWindNode, createWindUniforms, fileByCell, findSkinnedMesh, getCliffBlend, getCloudAtlasColumns, getCloudSunColors, getDesaturatedColour, getGameOutlineOffset, getGaussianHillBlend, getMusicRecordingGain, getMusicRecordingRate, getOutlineDepth, getOutlineScale, getParentTerrainTileKey, getPlateauBlend, getRampColumn, getRampRow, getRampWidth, getRidgeBlend, getScreenDirection, getSegmentBounds, getShadingRegion, getSharedToonRamp, getSoundEffectBandBins, getSpectralBin, getTerrainFeatureBounds, getTerrainMorphStart, getTerrainOverlayBounds, getTerrainShapeLevel, getTerrainTileBounds, getTerrainTileColumn, getTerrainTileKey, getTerrainTileLevel, getTerrainTileRow, getToneColour, getToonThreshold, measureSegment, mergeGeometryParts, orderByViewDepth, parsePmx, parsePmxBones, parsePmxJoints, parsePmxMaterials, parsePmxMorphs, parsePmxRigidBodies, parsePmxVertices, placeCloudBand, renderGroundCapture, renderMusicSegment, resolveTerrainDraws, sampleGrassTrail, sampleGroundCapture, sampleGroundLayerField, sampleSkyState, sampleTerrainResidualFade, sampleTreeNormalField, scheduleMusicExpression, scheduleMusicNote, scheduleMusicRecording, selectMusicSample, selectRegionNode, selectTerrainTiles, setObjectFade, setObjectSurface, stepGrassTrail, synthesizeCloudLayerTextures, synthesizeSpectralNoise, toAxis, toClamped, toDeadzoned, toSceneColor, toneMapGenshin, toneMapGenshinNode, transformFourier, transformFourierGrid, updateFaceDraw, updateUnderwaterFog, writeCloudLayerTexture, writeQuadIndices, writeTerrainRingIndices, writeTerrainRingTile };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "genshin-engine",
3
- "version": "4.5.0",
3
+ "version": "4.6.0",
4
4
  "description": "An anime-style open-world engine for the browser on three.js WebGPU — toon materials, outlines, post-processing, streamed terrain, parametric world kits and a Web Audio synthesizer, as plain TypeScript and TSL modules.",
5
5
  "keywords": [
6
6
  "anime",
@@ -54,15 +54,15 @@
54
54
  "three-mesh-bvh": "^0.9.18"
55
55
  },
56
56
  "devDependencies": {
57
- "@esposter/configuration": "4.5.0",
58
- "@esposter/shared-node": "4.5.0",
57
+ "@esposter/configuration": "4.6.0",
58
+ "@esposter/shared-node": "4.6.0",
59
59
  "@types/node": "^26.6.6",
60
60
  "@types/three": "^0.187.0",
61
- "tsdown": "^0.23.5",
62
- "vite": "^8.3.5"
61
+ "tsdown": "^0.23.7",
62
+ "vite": "^8.3.6"
63
63
  },
64
64
  "peerDependencies": {
65
65
  "three": "^0.187.0"
66
66
  },
67
- "gitHead": "e30c001f3b4b15693e75fb53092d62a97ade4d2b"
67
+ "gitHead": "0ceea3ffbe12ca69413ea5db2d3cfad197a63cba"
68
68
  }