@hello-terrain/three 0.0.0-alpha.6 → 0.0.0-alpha.8

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.cts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BufferGeometry } from 'three';
2
2
  import * as three_webgpu from 'three/webgpu';
3
- import { InstancedMesh, NodeMaterial, Node, WebGPURenderer, StorageBufferAttribute, StorageBufferNode, UniformNode, Vector3, Vector3Like, ConstNode } from 'three/webgpu';
3
+ import { InstancedMesh, NodeMaterial, Node, WebGPURenderer, StorageArrayTexture, StorageTexture, StorageBufferAttribute, StorageBufferNode, UniformNode, Vector3, Vector3Like, ConstNode } from 'three/webgpu';
4
4
  import * as three_src_nodes_TSL_js from 'three/src/nodes/TSL.js';
5
5
  import { ShaderCallNodeInternal } from 'three/src/nodes/TSL.js';
6
6
  import * as _hello_terrain_work from '@hello-terrain/work';
7
- import { TaskRef } from '@hello-terrain/work';
7
+ import { TaskRef, Graph } from '@hello-terrain/work';
8
8
  import Node$1 from 'three/src/nodes/core/Node.js';
9
9
  import * as three_tsl from 'three/tsl';
10
10
 
@@ -114,7 +114,7 @@ declare class TerrainMesh extends InstancedMesh {
114
114
  type ComputeStageCallback = (nodeIndex: Node, globalVertexIndex: Node, uv: Node, localCoordinates: Node, texelSize: Node) => void;
115
115
  type ComputePipeline = ComputeStageCallback[];
116
116
 
117
- /** Default compile task — uses normalFieldStageTask as the leaf. */
117
+ /** Default compile task — uses terrainFieldStageTask as the leaf. */
118
118
  declare const compileComputeTask: _hello_terrain_work.Task<{
119
119
  execute: (renderer: WebGPURenderer, instanceCount: number) => void;
120
120
  }, string, unknown>;
@@ -390,6 +390,45 @@ type CubeSphereSurfaceConfig = {
390
390
  */
391
391
  declare function createCubeSphereSurface(_cfg: CubeSphereSurfaceConfig): Surface;
392
392
 
393
+ type TerrainFieldStorageBackendType = "array-texture" | "atlas" | "texture-3d";
394
+ type TerrainFieldStorageFormat = "rgba16float" | "rgba32float";
395
+ type TerrainFieldStorageOptions = {
396
+ backend?: TerrainFieldStorageBackendType;
397
+ filter?: "nearest" | "linear";
398
+ format?: TerrainFieldStorageFormat;
399
+ };
400
+ interface TerrainFieldStorage {
401
+ readonly backendType: TerrainFieldStorageBackendType;
402
+ readonly edgeVertexCount: number;
403
+ readonly tileCount: number;
404
+ readonly texture: StorageArrayTexture | StorageTexture;
405
+ uv(ix: Node, iy: Node, tileIndex: Node): Node;
406
+ texel(ix: Node, iy: Node, tileIndex: Node): Node;
407
+ /** UV-based filtered sample. `u, v` in [0, 1] tile-local space. */
408
+ sample(u: Node, v: Node, tileIndex: Node): Node;
409
+ resize(width: number, height: number, tileCount: number): void;
410
+ }
411
+ declare function ArrayTextureBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
412
+ declare function AtlasBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
413
+ /**
414
+ * Placeholder backend for future true 3D storage-texture support in Three.js.
415
+ * We keep it present to preserve the backend API shape.
416
+ */
417
+ declare function Texture3DBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
418
+ declare function createTerrainFieldStorage(edgeVertexCount: number, tileCount: number, renderer?: WebGPURenderer, options?: TerrainFieldStorageOptions): TerrainFieldStorage;
419
+ declare function storeTerrainField(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node, value: Node): Node;
420
+ declare function loadTerrainField(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
421
+ declare function loadTerrainFieldElevation(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
422
+ declare function loadTerrainFieldNormal(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
423
+ /**
424
+ * UV-based filtered sample. `u, v` are in [0, 1] tile-local space.
425
+ * Respects the filter mode (nearest / linear) set on the storage.
426
+ */
427
+ declare function sampleTerrainField(storage: TerrainFieldStorage, u: Node, v: Node, tileIndex: Node): Node;
428
+ declare function sampleTerrainFieldElevation(storage: TerrainFieldStorage, u: Node, v: Node, tileIndex: Node): Node;
429
+ declare function sampleTerrainFieldNormal(storage: TerrainFieldStorage, u: Node, v: Node, tileIndex: Node): Node;
430
+ declare function packTerrainFieldSample(height: Node, normalXZ: Node, extra?: Node): Node;
431
+
393
432
  interface TerrainUniformsParams {
394
433
  rootSize: number;
395
434
  rootOrigin: Vector3Like;
@@ -431,11 +470,6 @@ interface ElevationFieldContext {
431
470
  attribute: StorageBufferAttribute;
432
471
  node: StorageBufferNode;
433
472
  }
434
- interface NormalFieldContext {
435
- data: Uint32Array<ArrayBuffer>;
436
- attribute: StorageBufferAttribute;
437
- node: StorageBufferNode;
438
- }
439
473
  /** Task refs for the standard terrain pipeline. */
440
474
  interface TerrainTasks {
441
475
  instanceId: TaskRef<string>;
@@ -449,14 +483,17 @@ interface TerrainTasks {
449
483
  positionNode: TaskRef<ShaderCallNodeInternal>;
450
484
  createElevationFieldContext: TaskRef<ElevationFieldContext>;
451
485
  createTileNodes: TaskRef<ReturnType<typeof createTileCompute>>;
452
- createNormalFieldContext: TaskRef<NormalFieldContext>;
486
+ createTerrainFieldTexture: TaskRef<TerrainFieldStorage>;
453
487
  elevationFieldStage: TaskRef<ComputePipeline>;
454
- normalFieldStage: TaskRef<ComputePipeline>;
488
+ terrainFieldStage: TaskRef<ComputePipeline>;
455
489
  compileCompute: TaskRef<{
456
490
  execute: (renderer: WebGPURenderer, instanceCount: number) => void;
457
491
  }>;
458
492
  executeCompute: TaskRef<void | (() => void)>;
459
493
  }
494
+ type TerrainGraph = Graph<string, {
495
+ renderer: WebGPURenderer;
496
+ }>;
460
497
 
461
498
  declare const createElevationFieldContextTask: _hello_terrain_work.Task<{
462
499
  data: Float32Array<ArrayBuffer>;
@@ -479,11 +516,9 @@ declare const elevationFieldStageTask: _hello_terrain_work.Task<ComputePipeline,
479
516
  /** Generates a unique instance ID per graph (cached once). */
480
517
  declare const instanceIdTask: _hello_terrain_work.Task<`${string}-${string}-${string}-${string}-${string}`, string, unknown>;
481
518
 
482
- declare const createNormalFieldContextTask: _hello_terrain_work.Task<{
483
- data: Uint32Array<ArrayBuffer>;
484
- attribute: StorageBufferAttribute;
485
- node: three_webgpu.StorageBufferNode;
486
- }, string, unknown>;
519
+ declare const createTerrainFieldTextureTask: _hello_terrain_work.Task<any, string, {
520
+ renderer: WebGPURenderer;
521
+ }>;
487
522
  /**
488
523
  * Normal field compute stage — reads height neighbors from the elevation field
489
524
  * buffer, computes surface normals via central differences, packs XZ
@@ -492,7 +527,7 @@ declare const createNormalFieldContextTask: _hello_terrain_work.Task<{
492
527
  *
493
528
  * Accumulates the upstream elevation pipeline via `get(elevationFieldStageTask)`.
494
529
  */
495
- declare const normalFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
530
+ declare const terrainFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
496
531
 
497
532
  interface ElevationParams {
498
533
  worldPosition: Node$1;
@@ -516,7 +551,7 @@ declare const origin: _hello_terrain_work.ParamRef<{
516
551
  }>;
517
552
  /**
518
553
  * Number of segments per inner tile edge.
519
- * 13 is the max tiles we can support for 256 workgroups (13 + 3 === 16.. 16x16)
554
+ * Effective edge vertex count is `innerTileSegments + 3`.
520
555
  */
521
556
  declare const innerTileSegments: _hello_terrain_work.ParamRef<number>;
522
557
  /** Skirt scale factor. */
@@ -531,6 +566,8 @@ declare const maxLevel: _hello_terrain_work.ParamRef<number>;
531
566
  declare const quadtreeUpdate: _hello_terrain_work.ParamRef<UpdateParams>;
532
567
  /** Optional custom terrain surface; defaults to bounded flat surface when null. */
533
568
  declare const surface: _hello_terrain_work.ParamRef<Surface | null>;
569
+ /** Terrain field texture filter mode. */
570
+ declare const terrainFieldFilter: _hello_terrain_work.ParamRef<"nearest" | "linear">;
534
571
  /** Terrain elevation control function (per vertex, in gpu compute) */
535
572
  declare const elevationFn: _hello_terrain_work.ParamRef<ElevationCallback>;
536
573
 
@@ -538,11 +575,10 @@ declare const elevationFn: _hello_terrain_work.ParamRef<ElevationCallback>;
538
575
  * Builds the TSL position node for the terrain shader.
539
576
  *
540
577
  * Depends on leafStorageTask (buffer objects), createUniformsTask
541
- * (uniform nodes), createElevationFieldContextTask (elevation field storage),
542
- * and createNormalFieldContextTask (normal field storage).
578
+ * (uniform nodes), and createTerrainFieldTextureTask (combined terrain field storage).
543
579
  *
544
- * The position node also reads normals from the normal field buffer
545
- * per-vertex (using vertexIndex) and assigns them to the vNormal
580
+ * The position node reads packed terrain samples (height + normal.xz)
581
+ * per-vertex and assigns them to the vNormal
546
582
  * varying for use in the fragment shader.
547
583
  *
548
584
  * These only change when their GPU resources are recreated
@@ -591,9 +627,7 @@ declare const createUniformsTask: _hello_terrain_work.Task<TerrainUniformsContex
591
627
  */
592
628
  declare const updateUniformsTask: _hello_terrain_work.Task<TerrainUniformsContext, string, unknown>;
593
629
 
594
- declare function terrainGraph(): _hello_terrain_work.Graph<string, {
595
- renderer: WebGPURenderer;
596
- }>;
630
+ declare function terrainGraph(): TerrainGraph;
597
631
  /** All terrain task refs for direct access. */
598
632
  declare const terrainTasks: {
599
633
  readonly instanceId: _hello_terrain_work.Task<`${string}-${string}-${string}-${string}-${string}`, string, unknown>;
@@ -625,13 +659,11 @@ declare const terrainTasks: {
625
659
  rootUVCompute: three_src_nodes_TSL_js.ShaderNodeFn<[number | three_webgpu.Node, number | three_webgpu.Node, number | three_webgpu.Node]>;
626
660
  tileVertexWorldPositionCompute: three_src_nodes_TSL_js.ShaderNodeFn<[number | three_webgpu.Node, number | three_webgpu.Node, number | three_webgpu.Node]>;
627
661
  }, string, unknown>;
628
- readonly createNormalFieldContext: _hello_terrain_work.Task<{
629
- data: Uint32Array<ArrayBuffer>;
630
- attribute: three_webgpu.StorageBufferAttribute;
631
- node: three_webgpu.StorageBufferNode;
632
- }, string, unknown>;
662
+ readonly createTerrainFieldTexture: _hello_terrain_work.Task<any, string, {
663
+ renderer: WebGPURenderer;
664
+ }>;
633
665
  readonly elevationFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
634
- readonly normalFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
666
+ readonly terrainFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
635
667
  readonly compileCompute: _hello_terrain_work.Task<{
636
668
  execute: (renderer: WebGPURenderer, instanceCount: number) => void;
637
669
  }, string, unknown>;
@@ -640,6 +672,13 @@ declare const terrainTasks: {
640
672
  }>;
641
673
  };
642
674
 
675
+ type ComputeDeviceLimits = {
676
+ maxWorkgroupSizeX: number;
677
+ maxWorkgroupSizeY: number;
678
+ maxWorkgroupInvocations: number;
679
+ };
680
+ declare function getDeviceComputeLimits(renderer: WebGPURenderer): ComputeDeviceLimits;
681
+
643
682
  /**
644
683
  * Maps a value or node from texture space [0, 1] to vector space [-1, 1].
645
684
  *
@@ -712,5 +751,5 @@ declare const voronoiCells: three_src_nodes_TSL_js.ShaderNodeFn<[three_tsl.Proxi
712
751
  uv: Node;
713
752
  }>]>;
714
753
 
715
- export { Dir, TerrainGeometry, TerrainMesh, U32_EMPTY, allocLeafSet, allocSeamTable, beginUpdate, blendAngleCorrectedNormals, buildLeafIndex, buildSeams2to1, compileComputeTask, createComputePipelineTasks, createCubeSphereSurface, createElevationFieldContextTask, createFlatSurface, createInfiniteFlatSurface, createNormalFieldContextTask, createSpatialIndex, createState, createTerrainUniforms, createUniformsTask, deriveNormalZ, elevationFieldStageTask, elevationFn, elevationScale, executeComputeTask, innerTileSegments, instanceIdTask, isSkirtUV, isSkirtVertex, leafGpuBufferTask, leafStorageTask, maxLevel, maxNodes, normalFieldStageTask, origin, positionNodeTask, quadtreeConfigTask, quadtreeUpdate, quadtreeUpdateTask, resetLeafSet, resetSeamTable, rootSize, skirtScale, surface, surfaceTask, terrainGraph, terrainTasks, textureSpaceToVectorSpace, tileNodesTask, update, updateUniformsTask, vElevation, vGlobalVertexIndex, vectorSpaceToTextureSpace, voronoiCells };
716
- export type { ComputePipeline, ComputeStageCallback, CubeSphereSurfaceConfig, ElevationCallback, ElevationFieldContext, ElevationParams, FlatSurfaceConfig, InfiniteFlatSurfaceConfig, IntNodeInput, LeafGpuBufferState, LeafSet, LeafStorageState, LodMode, NormalFieldContext, QuadtreeConfig, QuadtreeConfigState, QuadtreeState, SeamTable, SpatialIndex, Surface, TerrainTasks, TerrainUniformsContext, TerrainUniformsParams, TileBounds, TileId, UpdateParams };
754
+ export { ArrayTextureBackend, AtlasBackend, Dir, TerrainGeometry, TerrainMesh, Texture3DBackend, U32_EMPTY, allocLeafSet, allocSeamTable, beginUpdate, blendAngleCorrectedNormals, buildLeafIndex, buildSeams2to1, compileComputeTask, createComputePipelineTasks, createCubeSphereSurface, createElevationFieldContextTask, createFlatSurface, createInfiniteFlatSurface, createSpatialIndex, createState, createTerrainFieldStorage, createTerrainFieldTextureTask, createTerrainUniforms, createUniformsTask, deriveNormalZ, elevationFieldStageTask, elevationFn, elevationScale, executeComputeTask, getDeviceComputeLimits, innerTileSegments, instanceIdTask, isSkirtUV, isSkirtVertex, leafGpuBufferTask, leafStorageTask, loadTerrainField, loadTerrainFieldElevation, loadTerrainFieldNormal, maxLevel, maxNodes, origin, packTerrainFieldSample, positionNodeTask, quadtreeConfigTask, quadtreeUpdate, quadtreeUpdateTask, resetLeafSet, resetSeamTable, rootSize, sampleTerrainField, sampleTerrainFieldElevation, sampleTerrainFieldNormal, skirtScale, storeTerrainField, surface, surfaceTask, terrainFieldFilter, terrainFieldStageTask, terrainGraph, terrainTasks, textureSpaceToVectorSpace, tileNodesTask, update, updateUniformsTask, vElevation, vGlobalVertexIndex, vectorSpaceToTextureSpace, voronoiCells };
755
+ export type { ComputePipeline, ComputeStageCallback, CubeSphereSurfaceConfig, ElevationCallback, ElevationFieldContext, ElevationParams, FlatSurfaceConfig, InfiniteFlatSurfaceConfig, IntNodeInput, LeafGpuBufferState, LeafSet, LeafStorageState, LodMode, QuadtreeConfig, QuadtreeConfigState, QuadtreeState, SeamTable, SpatialIndex, Surface, TerrainFieldStorage, TerrainFieldStorageBackendType, TerrainFieldStorageFormat, TerrainFieldStorageOptions, TerrainGraph, TerrainTasks, TerrainUniformsContext, TerrainUniformsParams, TileBounds, TileId, UpdateParams };
package/dist/index.d.mts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BufferGeometry } from 'three';
2
2
  import * as three_webgpu from 'three/webgpu';
3
- import { InstancedMesh, NodeMaterial, Node, WebGPURenderer, StorageBufferAttribute, StorageBufferNode, UniformNode, Vector3, Vector3Like, ConstNode } from 'three/webgpu';
3
+ import { InstancedMesh, NodeMaterial, Node, WebGPURenderer, StorageArrayTexture, StorageTexture, StorageBufferAttribute, StorageBufferNode, UniformNode, Vector3, Vector3Like, ConstNode } from 'three/webgpu';
4
4
  import * as three_src_nodes_TSL_js from 'three/src/nodes/TSL.js';
5
5
  import { ShaderCallNodeInternal } from 'three/src/nodes/TSL.js';
6
6
  import * as _hello_terrain_work from '@hello-terrain/work';
7
- import { TaskRef } from '@hello-terrain/work';
7
+ import { TaskRef, Graph } from '@hello-terrain/work';
8
8
  import Node$1 from 'three/src/nodes/core/Node.js';
9
9
  import * as three_tsl from 'three/tsl';
10
10
 
@@ -114,7 +114,7 @@ declare class TerrainMesh extends InstancedMesh {
114
114
  type ComputeStageCallback = (nodeIndex: Node, globalVertexIndex: Node, uv: Node, localCoordinates: Node, texelSize: Node) => void;
115
115
  type ComputePipeline = ComputeStageCallback[];
116
116
 
117
- /** Default compile task — uses normalFieldStageTask as the leaf. */
117
+ /** Default compile task — uses terrainFieldStageTask as the leaf. */
118
118
  declare const compileComputeTask: _hello_terrain_work.Task<{
119
119
  execute: (renderer: WebGPURenderer, instanceCount: number) => void;
120
120
  }, string, unknown>;
@@ -390,6 +390,45 @@ type CubeSphereSurfaceConfig = {
390
390
  */
391
391
  declare function createCubeSphereSurface(_cfg: CubeSphereSurfaceConfig): Surface;
392
392
 
393
+ type TerrainFieldStorageBackendType = "array-texture" | "atlas" | "texture-3d";
394
+ type TerrainFieldStorageFormat = "rgba16float" | "rgba32float";
395
+ type TerrainFieldStorageOptions = {
396
+ backend?: TerrainFieldStorageBackendType;
397
+ filter?: "nearest" | "linear";
398
+ format?: TerrainFieldStorageFormat;
399
+ };
400
+ interface TerrainFieldStorage {
401
+ readonly backendType: TerrainFieldStorageBackendType;
402
+ readonly edgeVertexCount: number;
403
+ readonly tileCount: number;
404
+ readonly texture: StorageArrayTexture | StorageTexture;
405
+ uv(ix: Node, iy: Node, tileIndex: Node): Node;
406
+ texel(ix: Node, iy: Node, tileIndex: Node): Node;
407
+ /** UV-based filtered sample. `u, v` in [0, 1] tile-local space. */
408
+ sample(u: Node, v: Node, tileIndex: Node): Node;
409
+ resize(width: number, height: number, tileCount: number): void;
410
+ }
411
+ declare function ArrayTextureBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
412
+ declare function AtlasBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
413
+ /**
414
+ * Placeholder backend for future true 3D storage-texture support in Three.js.
415
+ * We keep it present to preserve the backend API shape.
416
+ */
417
+ declare function Texture3DBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
418
+ declare function createTerrainFieldStorage(edgeVertexCount: number, tileCount: number, renderer?: WebGPURenderer, options?: TerrainFieldStorageOptions): TerrainFieldStorage;
419
+ declare function storeTerrainField(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node, value: Node): Node;
420
+ declare function loadTerrainField(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
421
+ declare function loadTerrainFieldElevation(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
422
+ declare function loadTerrainFieldNormal(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
423
+ /**
424
+ * UV-based filtered sample. `u, v` are in [0, 1] tile-local space.
425
+ * Respects the filter mode (nearest / linear) set on the storage.
426
+ */
427
+ declare function sampleTerrainField(storage: TerrainFieldStorage, u: Node, v: Node, tileIndex: Node): Node;
428
+ declare function sampleTerrainFieldElevation(storage: TerrainFieldStorage, u: Node, v: Node, tileIndex: Node): Node;
429
+ declare function sampleTerrainFieldNormal(storage: TerrainFieldStorage, u: Node, v: Node, tileIndex: Node): Node;
430
+ declare function packTerrainFieldSample(height: Node, normalXZ: Node, extra?: Node): Node;
431
+
393
432
  interface TerrainUniformsParams {
394
433
  rootSize: number;
395
434
  rootOrigin: Vector3Like;
@@ -431,11 +470,6 @@ interface ElevationFieldContext {
431
470
  attribute: StorageBufferAttribute;
432
471
  node: StorageBufferNode;
433
472
  }
434
- interface NormalFieldContext {
435
- data: Uint32Array<ArrayBuffer>;
436
- attribute: StorageBufferAttribute;
437
- node: StorageBufferNode;
438
- }
439
473
  /** Task refs for the standard terrain pipeline. */
440
474
  interface TerrainTasks {
441
475
  instanceId: TaskRef<string>;
@@ -449,14 +483,17 @@ interface TerrainTasks {
449
483
  positionNode: TaskRef<ShaderCallNodeInternal>;
450
484
  createElevationFieldContext: TaskRef<ElevationFieldContext>;
451
485
  createTileNodes: TaskRef<ReturnType<typeof createTileCompute>>;
452
- createNormalFieldContext: TaskRef<NormalFieldContext>;
486
+ createTerrainFieldTexture: TaskRef<TerrainFieldStorage>;
453
487
  elevationFieldStage: TaskRef<ComputePipeline>;
454
- normalFieldStage: TaskRef<ComputePipeline>;
488
+ terrainFieldStage: TaskRef<ComputePipeline>;
455
489
  compileCompute: TaskRef<{
456
490
  execute: (renderer: WebGPURenderer, instanceCount: number) => void;
457
491
  }>;
458
492
  executeCompute: TaskRef<void | (() => void)>;
459
493
  }
494
+ type TerrainGraph = Graph<string, {
495
+ renderer: WebGPURenderer;
496
+ }>;
460
497
 
461
498
  declare const createElevationFieldContextTask: _hello_terrain_work.Task<{
462
499
  data: Float32Array<ArrayBuffer>;
@@ -479,11 +516,9 @@ declare const elevationFieldStageTask: _hello_terrain_work.Task<ComputePipeline,
479
516
  /** Generates a unique instance ID per graph (cached once). */
480
517
  declare const instanceIdTask: _hello_terrain_work.Task<`${string}-${string}-${string}-${string}-${string}`, string, unknown>;
481
518
 
482
- declare const createNormalFieldContextTask: _hello_terrain_work.Task<{
483
- data: Uint32Array<ArrayBuffer>;
484
- attribute: StorageBufferAttribute;
485
- node: three_webgpu.StorageBufferNode;
486
- }, string, unknown>;
519
+ declare const createTerrainFieldTextureTask: _hello_terrain_work.Task<any, string, {
520
+ renderer: WebGPURenderer;
521
+ }>;
487
522
  /**
488
523
  * Normal field compute stage — reads height neighbors from the elevation field
489
524
  * buffer, computes surface normals via central differences, packs XZ
@@ -492,7 +527,7 @@ declare const createNormalFieldContextTask: _hello_terrain_work.Task<{
492
527
  *
493
528
  * Accumulates the upstream elevation pipeline via `get(elevationFieldStageTask)`.
494
529
  */
495
- declare const normalFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
530
+ declare const terrainFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
496
531
 
497
532
  interface ElevationParams {
498
533
  worldPosition: Node$1;
@@ -516,7 +551,7 @@ declare const origin: _hello_terrain_work.ParamRef<{
516
551
  }>;
517
552
  /**
518
553
  * Number of segments per inner tile edge.
519
- * 13 is the max tiles we can support for 256 workgroups (13 + 3 === 16.. 16x16)
554
+ * Effective edge vertex count is `innerTileSegments + 3`.
520
555
  */
521
556
  declare const innerTileSegments: _hello_terrain_work.ParamRef<number>;
522
557
  /** Skirt scale factor. */
@@ -531,6 +566,8 @@ declare const maxLevel: _hello_terrain_work.ParamRef<number>;
531
566
  declare const quadtreeUpdate: _hello_terrain_work.ParamRef<UpdateParams>;
532
567
  /** Optional custom terrain surface; defaults to bounded flat surface when null. */
533
568
  declare const surface: _hello_terrain_work.ParamRef<Surface | null>;
569
+ /** Terrain field texture filter mode. */
570
+ declare const terrainFieldFilter: _hello_terrain_work.ParamRef<"nearest" | "linear">;
534
571
  /** Terrain elevation control function (per vertex, in gpu compute) */
535
572
  declare const elevationFn: _hello_terrain_work.ParamRef<ElevationCallback>;
536
573
 
@@ -538,11 +575,10 @@ declare const elevationFn: _hello_terrain_work.ParamRef<ElevationCallback>;
538
575
  * Builds the TSL position node for the terrain shader.
539
576
  *
540
577
  * Depends on leafStorageTask (buffer objects), createUniformsTask
541
- * (uniform nodes), createElevationFieldContextTask (elevation field storage),
542
- * and createNormalFieldContextTask (normal field storage).
578
+ * (uniform nodes), and createTerrainFieldTextureTask (combined terrain field storage).
543
579
  *
544
- * The position node also reads normals from the normal field buffer
545
- * per-vertex (using vertexIndex) and assigns them to the vNormal
580
+ * The position node reads packed terrain samples (height + normal.xz)
581
+ * per-vertex and assigns them to the vNormal
546
582
  * varying for use in the fragment shader.
547
583
  *
548
584
  * These only change when their GPU resources are recreated
@@ -591,9 +627,7 @@ declare const createUniformsTask: _hello_terrain_work.Task<TerrainUniformsContex
591
627
  */
592
628
  declare const updateUniformsTask: _hello_terrain_work.Task<TerrainUniformsContext, string, unknown>;
593
629
 
594
- declare function terrainGraph(): _hello_terrain_work.Graph<string, {
595
- renderer: WebGPURenderer;
596
- }>;
630
+ declare function terrainGraph(): TerrainGraph;
597
631
  /** All terrain task refs for direct access. */
598
632
  declare const terrainTasks: {
599
633
  readonly instanceId: _hello_terrain_work.Task<`${string}-${string}-${string}-${string}-${string}`, string, unknown>;
@@ -625,13 +659,11 @@ declare const terrainTasks: {
625
659
  rootUVCompute: three_src_nodes_TSL_js.ShaderNodeFn<[number | three_webgpu.Node, number | three_webgpu.Node, number | three_webgpu.Node]>;
626
660
  tileVertexWorldPositionCompute: three_src_nodes_TSL_js.ShaderNodeFn<[number | three_webgpu.Node, number | three_webgpu.Node, number | three_webgpu.Node]>;
627
661
  }, string, unknown>;
628
- readonly createNormalFieldContext: _hello_terrain_work.Task<{
629
- data: Uint32Array<ArrayBuffer>;
630
- attribute: three_webgpu.StorageBufferAttribute;
631
- node: three_webgpu.StorageBufferNode;
632
- }, string, unknown>;
662
+ readonly createTerrainFieldTexture: _hello_terrain_work.Task<any, string, {
663
+ renderer: WebGPURenderer;
664
+ }>;
633
665
  readonly elevationFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
634
- readonly normalFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
666
+ readonly terrainFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
635
667
  readonly compileCompute: _hello_terrain_work.Task<{
636
668
  execute: (renderer: WebGPURenderer, instanceCount: number) => void;
637
669
  }, string, unknown>;
@@ -640,6 +672,13 @@ declare const terrainTasks: {
640
672
  }>;
641
673
  };
642
674
 
675
+ type ComputeDeviceLimits = {
676
+ maxWorkgroupSizeX: number;
677
+ maxWorkgroupSizeY: number;
678
+ maxWorkgroupInvocations: number;
679
+ };
680
+ declare function getDeviceComputeLimits(renderer: WebGPURenderer): ComputeDeviceLimits;
681
+
643
682
  /**
644
683
  * Maps a value or node from texture space [0, 1] to vector space [-1, 1].
645
684
  *
@@ -712,5 +751,5 @@ declare const voronoiCells: three_src_nodes_TSL_js.ShaderNodeFn<[three_tsl.Proxi
712
751
  uv: Node;
713
752
  }>]>;
714
753
 
715
- export { Dir, TerrainGeometry, TerrainMesh, U32_EMPTY, allocLeafSet, allocSeamTable, beginUpdate, blendAngleCorrectedNormals, buildLeafIndex, buildSeams2to1, compileComputeTask, createComputePipelineTasks, createCubeSphereSurface, createElevationFieldContextTask, createFlatSurface, createInfiniteFlatSurface, createNormalFieldContextTask, createSpatialIndex, createState, createTerrainUniforms, createUniformsTask, deriveNormalZ, elevationFieldStageTask, elevationFn, elevationScale, executeComputeTask, innerTileSegments, instanceIdTask, isSkirtUV, isSkirtVertex, leafGpuBufferTask, leafStorageTask, maxLevel, maxNodes, normalFieldStageTask, origin, positionNodeTask, quadtreeConfigTask, quadtreeUpdate, quadtreeUpdateTask, resetLeafSet, resetSeamTable, rootSize, skirtScale, surface, surfaceTask, terrainGraph, terrainTasks, textureSpaceToVectorSpace, tileNodesTask, update, updateUniformsTask, vElevation, vGlobalVertexIndex, vectorSpaceToTextureSpace, voronoiCells };
716
- export type { ComputePipeline, ComputeStageCallback, CubeSphereSurfaceConfig, ElevationCallback, ElevationFieldContext, ElevationParams, FlatSurfaceConfig, InfiniteFlatSurfaceConfig, IntNodeInput, LeafGpuBufferState, LeafSet, LeafStorageState, LodMode, NormalFieldContext, QuadtreeConfig, QuadtreeConfigState, QuadtreeState, SeamTable, SpatialIndex, Surface, TerrainTasks, TerrainUniformsContext, TerrainUniformsParams, TileBounds, TileId, UpdateParams };
754
+ export { ArrayTextureBackend, AtlasBackend, Dir, TerrainGeometry, TerrainMesh, Texture3DBackend, U32_EMPTY, allocLeafSet, allocSeamTable, beginUpdate, blendAngleCorrectedNormals, buildLeafIndex, buildSeams2to1, compileComputeTask, createComputePipelineTasks, createCubeSphereSurface, createElevationFieldContextTask, createFlatSurface, createInfiniteFlatSurface, createSpatialIndex, createState, createTerrainFieldStorage, createTerrainFieldTextureTask, createTerrainUniforms, createUniformsTask, deriveNormalZ, elevationFieldStageTask, elevationFn, elevationScale, executeComputeTask, getDeviceComputeLimits, innerTileSegments, instanceIdTask, isSkirtUV, isSkirtVertex, leafGpuBufferTask, leafStorageTask, loadTerrainField, loadTerrainFieldElevation, loadTerrainFieldNormal, maxLevel, maxNodes, origin, packTerrainFieldSample, positionNodeTask, quadtreeConfigTask, quadtreeUpdate, quadtreeUpdateTask, resetLeafSet, resetSeamTable, rootSize, sampleTerrainField, sampleTerrainFieldElevation, sampleTerrainFieldNormal, skirtScale, storeTerrainField, surface, surfaceTask, terrainFieldFilter, terrainFieldStageTask, terrainGraph, terrainTasks, textureSpaceToVectorSpace, tileNodesTask, update, updateUniformsTask, vElevation, vGlobalVertexIndex, vectorSpaceToTextureSpace, voronoiCells };
755
+ export type { ComputePipeline, ComputeStageCallback, CubeSphereSurfaceConfig, ElevationCallback, ElevationFieldContext, ElevationParams, FlatSurfaceConfig, InfiniteFlatSurfaceConfig, IntNodeInput, LeafGpuBufferState, LeafSet, LeafStorageState, LodMode, QuadtreeConfig, QuadtreeConfigState, QuadtreeState, SeamTable, SpatialIndex, Surface, TerrainFieldStorage, TerrainFieldStorageBackendType, TerrainFieldStorageFormat, TerrainFieldStorageOptions, TerrainGraph, TerrainTasks, TerrainUniformsContext, TerrainUniformsParams, TileBounds, TileId, UpdateParams };
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BufferGeometry } from 'three';
2
2
  import * as three_webgpu from 'three/webgpu';
3
- import { InstancedMesh, NodeMaterial, Node, WebGPURenderer, StorageBufferAttribute, StorageBufferNode, UniformNode, Vector3, Vector3Like, ConstNode } from 'three/webgpu';
3
+ import { InstancedMesh, NodeMaterial, Node, WebGPURenderer, StorageArrayTexture, StorageTexture, StorageBufferAttribute, StorageBufferNode, UniformNode, Vector3, Vector3Like, ConstNode } from 'three/webgpu';
4
4
  import * as three_src_nodes_TSL_js from 'three/src/nodes/TSL.js';
5
5
  import { ShaderCallNodeInternal } from 'three/src/nodes/TSL.js';
6
6
  import * as _hello_terrain_work from '@hello-terrain/work';
7
- import { TaskRef } from '@hello-terrain/work';
7
+ import { TaskRef, Graph } from '@hello-terrain/work';
8
8
  import Node$1 from 'three/src/nodes/core/Node.js';
9
9
  import * as three_tsl from 'three/tsl';
10
10
 
@@ -114,7 +114,7 @@ declare class TerrainMesh extends InstancedMesh {
114
114
  type ComputeStageCallback = (nodeIndex: Node, globalVertexIndex: Node, uv: Node, localCoordinates: Node, texelSize: Node) => void;
115
115
  type ComputePipeline = ComputeStageCallback[];
116
116
 
117
- /** Default compile task — uses normalFieldStageTask as the leaf. */
117
+ /** Default compile task — uses terrainFieldStageTask as the leaf. */
118
118
  declare const compileComputeTask: _hello_terrain_work.Task<{
119
119
  execute: (renderer: WebGPURenderer, instanceCount: number) => void;
120
120
  }, string, unknown>;
@@ -390,6 +390,45 @@ type CubeSphereSurfaceConfig = {
390
390
  */
391
391
  declare function createCubeSphereSurface(_cfg: CubeSphereSurfaceConfig): Surface;
392
392
 
393
+ type TerrainFieldStorageBackendType = "array-texture" | "atlas" | "texture-3d";
394
+ type TerrainFieldStorageFormat = "rgba16float" | "rgba32float";
395
+ type TerrainFieldStorageOptions = {
396
+ backend?: TerrainFieldStorageBackendType;
397
+ filter?: "nearest" | "linear";
398
+ format?: TerrainFieldStorageFormat;
399
+ };
400
+ interface TerrainFieldStorage {
401
+ readonly backendType: TerrainFieldStorageBackendType;
402
+ readonly edgeVertexCount: number;
403
+ readonly tileCount: number;
404
+ readonly texture: StorageArrayTexture | StorageTexture;
405
+ uv(ix: Node, iy: Node, tileIndex: Node): Node;
406
+ texel(ix: Node, iy: Node, tileIndex: Node): Node;
407
+ /** UV-based filtered sample. `u, v` in [0, 1] tile-local space. */
408
+ sample(u: Node, v: Node, tileIndex: Node): Node;
409
+ resize(width: number, height: number, tileCount: number): void;
410
+ }
411
+ declare function ArrayTextureBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
412
+ declare function AtlasBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
413
+ /**
414
+ * Placeholder backend for future true 3D storage-texture support in Three.js.
415
+ * We keep it present to preserve the backend API shape.
416
+ */
417
+ declare function Texture3DBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
418
+ declare function createTerrainFieldStorage(edgeVertexCount: number, tileCount: number, renderer?: WebGPURenderer, options?: TerrainFieldStorageOptions): TerrainFieldStorage;
419
+ declare function storeTerrainField(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node, value: Node): Node;
420
+ declare function loadTerrainField(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
421
+ declare function loadTerrainFieldElevation(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
422
+ declare function loadTerrainFieldNormal(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
423
+ /**
424
+ * UV-based filtered sample. `u, v` are in [0, 1] tile-local space.
425
+ * Respects the filter mode (nearest / linear) set on the storage.
426
+ */
427
+ declare function sampleTerrainField(storage: TerrainFieldStorage, u: Node, v: Node, tileIndex: Node): Node;
428
+ declare function sampleTerrainFieldElevation(storage: TerrainFieldStorage, u: Node, v: Node, tileIndex: Node): Node;
429
+ declare function sampleTerrainFieldNormal(storage: TerrainFieldStorage, u: Node, v: Node, tileIndex: Node): Node;
430
+ declare function packTerrainFieldSample(height: Node, normalXZ: Node, extra?: Node): Node;
431
+
393
432
  interface TerrainUniformsParams {
394
433
  rootSize: number;
395
434
  rootOrigin: Vector3Like;
@@ -431,11 +470,6 @@ interface ElevationFieldContext {
431
470
  attribute: StorageBufferAttribute;
432
471
  node: StorageBufferNode;
433
472
  }
434
- interface NormalFieldContext {
435
- data: Uint32Array<ArrayBuffer>;
436
- attribute: StorageBufferAttribute;
437
- node: StorageBufferNode;
438
- }
439
473
  /** Task refs for the standard terrain pipeline. */
440
474
  interface TerrainTasks {
441
475
  instanceId: TaskRef<string>;
@@ -449,14 +483,17 @@ interface TerrainTasks {
449
483
  positionNode: TaskRef<ShaderCallNodeInternal>;
450
484
  createElevationFieldContext: TaskRef<ElevationFieldContext>;
451
485
  createTileNodes: TaskRef<ReturnType<typeof createTileCompute>>;
452
- createNormalFieldContext: TaskRef<NormalFieldContext>;
486
+ createTerrainFieldTexture: TaskRef<TerrainFieldStorage>;
453
487
  elevationFieldStage: TaskRef<ComputePipeline>;
454
- normalFieldStage: TaskRef<ComputePipeline>;
488
+ terrainFieldStage: TaskRef<ComputePipeline>;
455
489
  compileCompute: TaskRef<{
456
490
  execute: (renderer: WebGPURenderer, instanceCount: number) => void;
457
491
  }>;
458
492
  executeCompute: TaskRef<void | (() => void)>;
459
493
  }
494
+ type TerrainGraph = Graph<string, {
495
+ renderer: WebGPURenderer;
496
+ }>;
460
497
 
461
498
  declare const createElevationFieldContextTask: _hello_terrain_work.Task<{
462
499
  data: Float32Array<ArrayBuffer>;
@@ -479,11 +516,9 @@ declare const elevationFieldStageTask: _hello_terrain_work.Task<ComputePipeline,
479
516
  /** Generates a unique instance ID per graph (cached once). */
480
517
  declare const instanceIdTask: _hello_terrain_work.Task<`${string}-${string}-${string}-${string}-${string}`, string, unknown>;
481
518
 
482
- declare const createNormalFieldContextTask: _hello_terrain_work.Task<{
483
- data: Uint32Array<ArrayBuffer>;
484
- attribute: StorageBufferAttribute;
485
- node: three_webgpu.StorageBufferNode;
486
- }, string, unknown>;
519
+ declare const createTerrainFieldTextureTask: _hello_terrain_work.Task<any, string, {
520
+ renderer: WebGPURenderer;
521
+ }>;
487
522
  /**
488
523
  * Normal field compute stage — reads height neighbors from the elevation field
489
524
  * buffer, computes surface normals via central differences, packs XZ
@@ -492,7 +527,7 @@ declare const createNormalFieldContextTask: _hello_terrain_work.Task<{
492
527
  *
493
528
  * Accumulates the upstream elevation pipeline via `get(elevationFieldStageTask)`.
494
529
  */
495
- declare const normalFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
530
+ declare const terrainFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
496
531
 
497
532
  interface ElevationParams {
498
533
  worldPosition: Node$1;
@@ -516,7 +551,7 @@ declare const origin: _hello_terrain_work.ParamRef<{
516
551
  }>;
517
552
  /**
518
553
  * Number of segments per inner tile edge.
519
- * 13 is the max tiles we can support for 256 workgroups (13 + 3 === 16.. 16x16)
554
+ * Effective edge vertex count is `innerTileSegments + 3`.
520
555
  */
521
556
  declare const innerTileSegments: _hello_terrain_work.ParamRef<number>;
522
557
  /** Skirt scale factor. */
@@ -531,6 +566,8 @@ declare const maxLevel: _hello_terrain_work.ParamRef<number>;
531
566
  declare const quadtreeUpdate: _hello_terrain_work.ParamRef<UpdateParams>;
532
567
  /** Optional custom terrain surface; defaults to bounded flat surface when null. */
533
568
  declare const surface: _hello_terrain_work.ParamRef<Surface | null>;
569
+ /** Terrain field texture filter mode. */
570
+ declare const terrainFieldFilter: _hello_terrain_work.ParamRef<"nearest" | "linear">;
534
571
  /** Terrain elevation control function (per vertex, in gpu compute) */
535
572
  declare const elevationFn: _hello_terrain_work.ParamRef<ElevationCallback>;
536
573
 
@@ -538,11 +575,10 @@ declare const elevationFn: _hello_terrain_work.ParamRef<ElevationCallback>;
538
575
  * Builds the TSL position node for the terrain shader.
539
576
  *
540
577
  * Depends on leafStorageTask (buffer objects), createUniformsTask
541
- * (uniform nodes), createElevationFieldContextTask (elevation field storage),
542
- * and createNormalFieldContextTask (normal field storage).
578
+ * (uniform nodes), and createTerrainFieldTextureTask (combined terrain field storage).
543
579
  *
544
- * The position node also reads normals from the normal field buffer
545
- * per-vertex (using vertexIndex) and assigns them to the vNormal
580
+ * The position node reads packed terrain samples (height + normal.xz)
581
+ * per-vertex and assigns them to the vNormal
546
582
  * varying for use in the fragment shader.
547
583
  *
548
584
  * These only change when their GPU resources are recreated
@@ -591,9 +627,7 @@ declare const createUniformsTask: _hello_terrain_work.Task<TerrainUniformsContex
591
627
  */
592
628
  declare const updateUniformsTask: _hello_terrain_work.Task<TerrainUniformsContext, string, unknown>;
593
629
 
594
- declare function terrainGraph(): _hello_terrain_work.Graph<string, {
595
- renderer: WebGPURenderer;
596
- }>;
630
+ declare function terrainGraph(): TerrainGraph;
597
631
  /** All terrain task refs for direct access. */
598
632
  declare const terrainTasks: {
599
633
  readonly instanceId: _hello_terrain_work.Task<`${string}-${string}-${string}-${string}-${string}`, string, unknown>;
@@ -625,13 +659,11 @@ declare const terrainTasks: {
625
659
  rootUVCompute: three_src_nodes_TSL_js.ShaderNodeFn<[number | three_webgpu.Node, number | three_webgpu.Node, number | three_webgpu.Node]>;
626
660
  tileVertexWorldPositionCompute: three_src_nodes_TSL_js.ShaderNodeFn<[number | three_webgpu.Node, number | three_webgpu.Node, number | three_webgpu.Node]>;
627
661
  }, string, unknown>;
628
- readonly createNormalFieldContext: _hello_terrain_work.Task<{
629
- data: Uint32Array<ArrayBuffer>;
630
- attribute: three_webgpu.StorageBufferAttribute;
631
- node: three_webgpu.StorageBufferNode;
632
- }, string, unknown>;
662
+ readonly createTerrainFieldTexture: _hello_terrain_work.Task<any, string, {
663
+ renderer: WebGPURenderer;
664
+ }>;
633
665
  readonly elevationFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
634
- readonly normalFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
666
+ readonly terrainFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
635
667
  readonly compileCompute: _hello_terrain_work.Task<{
636
668
  execute: (renderer: WebGPURenderer, instanceCount: number) => void;
637
669
  }, string, unknown>;
@@ -640,6 +672,13 @@ declare const terrainTasks: {
640
672
  }>;
641
673
  };
642
674
 
675
+ type ComputeDeviceLimits = {
676
+ maxWorkgroupSizeX: number;
677
+ maxWorkgroupSizeY: number;
678
+ maxWorkgroupInvocations: number;
679
+ };
680
+ declare function getDeviceComputeLimits(renderer: WebGPURenderer): ComputeDeviceLimits;
681
+
643
682
  /**
644
683
  * Maps a value or node from texture space [0, 1] to vector space [-1, 1].
645
684
  *
@@ -712,5 +751,5 @@ declare const voronoiCells: three_src_nodes_TSL_js.ShaderNodeFn<[three_tsl.Proxi
712
751
  uv: Node;
713
752
  }>]>;
714
753
 
715
- export { Dir, TerrainGeometry, TerrainMesh, U32_EMPTY, allocLeafSet, allocSeamTable, beginUpdate, blendAngleCorrectedNormals, buildLeafIndex, buildSeams2to1, compileComputeTask, createComputePipelineTasks, createCubeSphereSurface, createElevationFieldContextTask, createFlatSurface, createInfiniteFlatSurface, createNormalFieldContextTask, createSpatialIndex, createState, createTerrainUniforms, createUniformsTask, deriveNormalZ, elevationFieldStageTask, elevationFn, elevationScale, executeComputeTask, innerTileSegments, instanceIdTask, isSkirtUV, isSkirtVertex, leafGpuBufferTask, leafStorageTask, maxLevel, maxNodes, normalFieldStageTask, origin, positionNodeTask, quadtreeConfigTask, quadtreeUpdate, quadtreeUpdateTask, resetLeafSet, resetSeamTable, rootSize, skirtScale, surface, surfaceTask, terrainGraph, terrainTasks, textureSpaceToVectorSpace, tileNodesTask, update, updateUniformsTask, vElevation, vGlobalVertexIndex, vectorSpaceToTextureSpace, voronoiCells };
716
- export type { ComputePipeline, ComputeStageCallback, CubeSphereSurfaceConfig, ElevationCallback, ElevationFieldContext, ElevationParams, FlatSurfaceConfig, InfiniteFlatSurfaceConfig, IntNodeInput, LeafGpuBufferState, LeafSet, LeafStorageState, LodMode, NormalFieldContext, QuadtreeConfig, QuadtreeConfigState, QuadtreeState, SeamTable, SpatialIndex, Surface, TerrainTasks, TerrainUniformsContext, TerrainUniformsParams, TileBounds, TileId, UpdateParams };
754
+ export { ArrayTextureBackend, AtlasBackend, Dir, TerrainGeometry, TerrainMesh, Texture3DBackend, U32_EMPTY, allocLeafSet, allocSeamTable, beginUpdate, blendAngleCorrectedNormals, buildLeafIndex, buildSeams2to1, compileComputeTask, createComputePipelineTasks, createCubeSphereSurface, createElevationFieldContextTask, createFlatSurface, createInfiniteFlatSurface, createSpatialIndex, createState, createTerrainFieldStorage, createTerrainFieldTextureTask, createTerrainUniforms, createUniformsTask, deriveNormalZ, elevationFieldStageTask, elevationFn, elevationScale, executeComputeTask, getDeviceComputeLimits, innerTileSegments, instanceIdTask, isSkirtUV, isSkirtVertex, leafGpuBufferTask, leafStorageTask, loadTerrainField, loadTerrainFieldElevation, loadTerrainFieldNormal, maxLevel, maxNodes, origin, packTerrainFieldSample, positionNodeTask, quadtreeConfigTask, quadtreeUpdate, quadtreeUpdateTask, resetLeafSet, resetSeamTable, rootSize, sampleTerrainField, sampleTerrainFieldElevation, sampleTerrainFieldNormal, skirtScale, storeTerrainField, surface, surfaceTask, terrainFieldFilter, terrainFieldStageTask, terrainGraph, terrainTasks, textureSpaceToVectorSpace, tileNodesTask, update, updateUniformsTask, vElevation, vGlobalVertexIndex, vectorSpaceToTextureSpace, voronoiCells };
755
+ export type { ComputePipeline, ComputeStageCallback, CubeSphereSurfaceConfig, ElevationCallback, ElevationFieldContext, ElevationParams, FlatSurfaceConfig, InfiniteFlatSurfaceConfig, IntNodeInput, LeafGpuBufferState, LeafSet, LeafStorageState, LodMode, QuadtreeConfig, QuadtreeConfigState, QuadtreeState, SeamTable, SpatialIndex, Surface, TerrainFieldStorage, TerrainFieldStorageBackendType, TerrainFieldStorageFormat, TerrainFieldStorageOptions, TerrainGraph, TerrainTasks, TerrainUniformsContext, TerrainUniformsParams, TileBounds, TileId, UpdateParams };