@hello-terrain/three 0.0.0-alpha.7 → 0.0.0-alpha.9

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
@@ -404,6 +404,8 @@ interface TerrainFieldStorage {
404
404
  readonly texture: StorageArrayTexture | StorageTexture;
405
405
  uv(ix: Node, iy: Node, tileIndex: Node): Node;
406
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;
407
409
  resize(width: number, height: number, tileCount: number): void;
408
410
  }
409
411
  declare function ArrayTextureBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
@@ -418,6 +420,13 @@ declare function storeTerrainField(storage: TerrainFieldStorage, ix: Node, iy: N
418
420
  declare function loadTerrainField(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
419
421
  declare function loadTerrainFieldElevation(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
420
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;
421
430
  declare function packTerrainFieldSample(height: Node, normalXZ: Node, extra?: Node): Node;
422
431
 
423
432
  interface TerrainUniformsParams {
@@ -449,6 +458,41 @@ declare function createTileCompute(leafStorage: LeafStorageState, uniforms: Terr
449
458
  tileVertexWorldPositionCompute: three_src_nodes_TSL_js.ShaderNodeFn<[number | Node, number | Node, number | Node]>;
450
459
  };
451
460
 
461
+ interface ElevationParams {
462
+ worldPosition: Node$1;
463
+ rootSize: Node$1;
464
+ rootUV: Node$1;
465
+ tileUV: Node$1;
466
+ tileLevel: Node$1;
467
+ tileSize: Node$1;
468
+ tileOriginVec2: Node$1;
469
+ nodeIndex: Node$1;
470
+ }
471
+ type ElevationCallback = (params: ElevationParams) => Node$1;
472
+
473
+ interface GpuSpatialIndexContext {
474
+ data: Uint32Array<ArrayBuffer>;
475
+ size: number;
476
+ mask: number;
477
+ stampGen: UniformNode<number>;
478
+ attribute: StorageBufferAttribute;
479
+ node: StorageBufferNode;
480
+ }
481
+ interface TerrainSampler {
482
+ sampleElevation: (worldX: Node, worldZ: Node) => Node;
483
+ sampleNormal: (worldX: Node, worldZ: Node) => Node;
484
+ sampleTerrain: (worldX: Node, worldZ: Node) => Node;
485
+ sampleValidity: (worldX: Node, worldZ: Node) => Node;
486
+ evaluateElevation: (worldX: Node, worldZ: Node) => Node;
487
+ evaluateNormal: (worldX: Node, worldZ: Node, epsilon?: Node) => Node;
488
+ }
489
+ interface CreateTerrainSamplerParams {
490
+ terrainFieldStorage: TerrainFieldStorage;
491
+ spatialIndex: GpuSpatialIndexContext;
492
+ uniforms: TerrainUniformsContext;
493
+ elevationCallback: ElevationCallback;
494
+ }
495
+
452
496
  interface QuadtreeConfigState {
453
497
  state: QuadtreeState;
454
498
  surface: Surface;
@@ -469,12 +513,15 @@ interface TerrainTasks {
469
513
  surface: TaskRef<Surface>;
470
514
  leafStorage: TaskRef<LeafStorageState>;
471
515
  leafGpuBuffer: TaskRef<LeafGpuBufferState>;
516
+ gpuSpatialIndexStorage: TaskRef<GpuSpatialIndexContext>;
517
+ gpuSpatialIndexUpload: TaskRef<GpuSpatialIndexContext>;
472
518
  createUniforms: TaskRef<TerrainUniformsContext>;
473
519
  updateUniforms: TaskRef<TerrainUniformsContext>;
474
520
  positionNode: TaskRef<ShaderCallNodeInternal>;
475
521
  createElevationFieldContext: TaskRef<ElevationFieldContext>;
476
522
  createTileNodes: TaskRef<ReturnType<typeof createTileCompute>>;
477
523
  createTerrainFieldTexture: TaskRef<TerrainFieldStorage>;
524
+ createTerrainSampler: TaskRef<TerrainSampler>;
478
525
  elevationFieldStage: TaskRef<ComputePipeline>;
479
526
  terrainFieldStage: TaskRef<ComputePipeline>;
480
527
  compileCompute: TaskRef<{
@@ -504,6 +551,9 @@ declare const tileNodesTask: _hello_terrain_work.Task<{
504
551
  */
505
552
  declare const elevationFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
506
553
 
554
+ declare const gpuSpatialIndexStorageTask: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
555
+ declare const gpuSpatialIndexUploadTask: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
556
+
507
557
  /** Generates a unique instance ID per graph (cached once). */
508
558
  declare const instanceIdTask: _hello_terrain_work.Task<`${string}-${string}-${string}-${string}-${string}`, string, unknown>;
509
559
 
@@ -520,17 +570,7 @@ declare const createTerrainFieldTextureTask: _hello_terrain_work.Task<any, strin
520
570
  */
521
571
  declare const terrainFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
522
572
 
523
- interface ElevationParams {
524
- worldPosition: Node$1;
525
- rootSize: Node$1;
526
- rootUV: Node$1;
527
- tileUV: Node$1;
528
- tileLevel: Node$1;
529
- tileSize: Node$1;
530
- tileOriginVec2: Node$1;
531
- nodeIndex: Node$1;
532
- }
533
- type ElevationCallback = (params: ElevationParams) => Node$1;
573
+ declare const createTerrainSamplerTask: _hello_terrain_work.Task<TerrainSampler, string, unknown>;
534
574
 
535
575
  /** Root tile size in world units. */
536
576
  declare const rootSize: _hello_terrain_work.ParamRef<number>;
@@ -557,6 +597,8 @@ declare const maxLevel: _hello_terrain_work.ParamRef<number>;
557
597
  declare const quadtreeUpdate: _hello_terrain_work.ParamRef<UpdateParams>;
558
598
  /** Optional custom terrain surface; defaults to bounded flat surface when null. */
559
599
  declare const surface: _hello_terrain_work.ParamRef<Surface | null>;
600
+ /** Terrain field texture filter mode. */
601
+ declare const terrainFieldFilter: _hello_terrain_work.ParamRef<"nearest" | "linear">;
560
602
  /** Terrain elevation control function (per vertex, in gpu compute) */
561
603
  declare const elevationFn: _hello_terrain_work.ParamRef<ElevationCallback>;
562
604
 
@@ -633,6 +675,8 @@ declare const terrainTasks: {
633
675
  attribute: three_webgpu.StorageBufferAttribute;
634
676
  node: three_webgpu.StorageBufferNode;
635
677
  }, string, unknown>;
678
+ readonly gpuSpatialIndexStorage: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
679
+ readonly gpuSpatialIndexUpload: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
636
680
  readonly createUniforms: _hello_terrain_work.Task<TerrainUniformsContext, string, unknown>;
637
681
  readonly updateUniforms: _hello_terrain_work.Task<TerrainUniformsContext, string, unknown>;
638
682
  readonly positionNode: _hello_terrain_work.Task<three_src_nodes_TSL_js.ShaderCallNodeInternal, string, unknown>;
@@ -651,6 +695,7 @@ declare const terrainTasks: {
651
695
  readonly createTerrainFieldTexture: _hello_terrain_work.Task<any, string, {
652
696
  renderer: WebGPURenderer;
653
697
  }>;
698
+ readonly createTerrainSampler: _hello_terrain_work.Task<TerrainSampler, string, unknown>;
654
699
  readonly elevationFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
655
700
  readonly terrainFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
656
701
  readonly compileCompute: _hello_terrain_work.Task<{
@@ -668,6 +713,8 @@ type ComputeDeviceLimits = {
668
713
  };
669
714
  declare function getDeviceComputeLimits(renderer: WebGPURenderer): ComputeDeviceLimits;
670
715
 
716
+ declare function createTerrainSampler(params: CreateTerrainSamplerParams): TerrainSampler;
717
+
671
718
  /**
672
719
  * Maps a value or node from texture space [0, 1] to vector space [-1, 1].
673
720
  *
@@ -740,5 +787,5 @@ declare const voronoiCells: three_src_nodes_TSL_js.ShaderNodeFn<[three_tsl.Proxi
740
787
  uv: Node;
741
788
  }>]>;
742
789
 
743
- 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, skirtScale, storeTerrainField, surface, surfaceTask, terrainFieldStageTask, terrainGraph, terrainTasks, textureSpaceToVectorSpace, tileNodesTask, update, updateUniformsTask, vElevation, vGlobalVertexIndex, vectorSpaceToTextureSpace, voronoiCells };
744
- 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 };
790
+ 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, createTerrainSampler, createTerrainSamplerTask, createTerrainUniforms, createUniformsTask, deriveNormalZ, elevationFieldStageTask, elevationFn, elevationScale, executeComputeTask, getDeviceComputeLimits, gpuSpatialIndexStorageTask, gpuSpatialIndexUploadTask, 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 };
791
+ export type { ComputePipeline, ComputeStageCallback, CreateTerrainSamplerParams, CubeSphereSurfaceConfig, ElevationCallback, ElevationFieldContext, ElevationParams, FlatSurfaceConfig, GpuSpatialIndexContext, InfiniteFlatSurfaceConfig, IntNodeInput, LeafGpuBufferState, LeafSet, LeafStorageState, LodMode, QuadtreeConfig, QuadtreeConfigState, QuadtreeState, SeamTable, SpatialIndex, Surface, TerrainFieldStorage, TerrainFieldStorageBackendType, TerrainFieldStorageFormat, TerrainFieldStorageOptions, TerrainGraph, TerrainSampler, TerrainTasks, TerrainUniformsContext, TerrainUniformsParams, TileBounds, TileId, UpdateParams };
package/dist/index.d.mts CHANGED
@@ -404,6 +404,8 @@ interface TerrainFieldStorage {
404
404
  readonly texture: StorageArrayTexture | StorageTexture;
405
405
  uv(ix: Node, iy: Node, tileIndex: Node): Node;
406
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;
407
409
  resize(width: number, height: number, tileCount: number): void;
408
410
  }
409
411
  declare function ArrayTextureBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
@@ -418,6 +420,13 @@ declare function storeTerrainField(storage: TerrainFieldStorage, ix: Node, iy: N
418
420
  declare function loadTerrainField(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
419
421
  declare function loadTerrainFieldElevation(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
420
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;
421
430
  declare function packTerrainFieldSample(height: Node, normalXZ: Node, extra?: Node): Node;
422
431
 
423
432
  interface TerrainUniformsParams {
@@ -449,6 +458,41 @@ declare function createTileCompute(leafStorage: LeafStorageState, uniforms: Terr
449
458
  tileVertexWorldPositionCompute: three_src_nodes_TSL_js.ShaderNodeFn<[number | Node, number | Node, number | Node]>;
450
459
  };
451
460
 
461
+ interface ElevationParams {
462
+ worldPosition: Node$1;
463
+ rootSize: Node$1;
464
+ rootUV: Node$1;
465
+ tileUV: Node$1;
466
+ tileLevel: Node$1;
467
+ tileSize: Node$1;
468
+ tileOriginVec2: Node$1;
469
+ nodeIndex: Node$1;
470
+ }
471
+ type ElevationCallback = (params: ElevationParams) => Node$1;
472
+
473
+ interface GpuSpatialIndexContext {
474
+ data: Uint32Array<ArrayBuffer>;
475
+ size: number;
476
+ mask: number;
477
+ stampGen: UniformNode<number>;
478
+ attribute: StorageBufferAttribute;
479
+ node: StorageBufferNode;
480
+ }
481
+ interface TerrainSampler {
482
+ sampleElevation: (worldX: Node, worldZ: Node) => Node;
483
+ sampleNormal: (worldX: Node, worldZ: Node) => Node;
484
+ sampleTerrain: (worldX: Node, worldZ: Node) => Node;
485
+ sampleValidity: (worldX: Node, worldZ: Node) => Node;
486
+ evaluateElevation: (worldX: Node, worldZ: Node) => Node;
487
+ evaluateNormal: (worldX: Node, worldZ: Node, epsilon?: Node) => Node;
488
+ }
489
+ interface CreateTerrainSamplerParams {
490
+ terrainFieldStorage: TerrainFieldStorage;
491
+ spatialIndex: GpuSpatialIndexContext;
492
+ uniforms: TerrainUniformsContext;
493
+ elevationCallback: ElevationCallback;
494
+ }
495
+
452
496
  interface QuadtreeConfigState {
453
497
  state: QuadtreeState;
454
498
  surface: Surface;
@@ -469,12 +513,15 @@ interface TerrainTasks {
469
513
  surface: TaskRef<Surface>;
470
514
  leafStorage: TaskRef<LeafStorageState>;
471
515
  leafGpuBuffer: TaskRef<LeafGpuBufferState>;
516
+ gpuSpatialIndexStorage: TaskRef<GpuSpatialIndexContext>;
517
+ gpuSpatialIndexUpload: TaskRef<GpuSpatialIndexContext>;
472
518
  createUniforms: TaskRef<TerrainUniformsContext>;
473
519
  updateUniforms: TaskRef<TerrainUniformsContext>;
474
520
  positionNode: TaskRef<ShaderCallNodeInternal>;
475
521
  createElevationFieldContext: TaskRef<ElevationFieldContext>;
476
522
  createTileNodes: TaskRef<ReturnType<typeof createTileCompute>>;
477
523
  createTerrainFieldTexture: TaskRef<TerrainFieldStorage>;
524
+ createTerrainSampler: TaskRef<TerrainSampler>;
478
525
  elevationFieldStage: TaskRef<ComputePipeline>;
479
526
  terrainFieldStage: TaskRef<ComputePipeline>;
480
527
  compileCompute: TaskRef<{
@@ -504,6 +551,9 @@ declare const tileNodesTask: _hello_terrain_work.Task<{
504
551
  */
505
552
  declare const elevationFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
506
553
 
554
+ declare const gpuSpatialIndexStorageTask: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
555
+ declare const gpuSpatialIndexUploadTask: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
556
+
507
557
  /** Generates a unique instance ID per graph (cached once). */
508
558
  declare const instanceIdTask: _hello_terrain_work.Task<`${string}-${string}-${string}-${string}-${string}`, string, unknown>;
509
559
 
@@ -520,17 +570,7 @@ declare const createTerrainFieldTextureTask: _hello_terrain_work.Task<any, strin
520
570
  */
521
571
  declare const terrainFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
522
572
 
523
- interface ElevationParams {
524
- worldPosition: Node$1;
525
- rootSize: Node$1;
526
- rootUV: Node$1;
527
- tileUV: Node$1;
528
- tileLevel: Node$1;
529
- tileSize: Node$1;
530
- tileOriginVec2: Node$1;
531
- nodeIndex: Node$1;
532
- }
533
- type ElevationCallback = (params: ElevationParams) => Node$1;
573
+ declare const createTerrainSamplerTask: _hello_terrain_work.Task<TerrainSampler, string, unknown>;
534
574
 
535
575
  /** Root tile size in world units. */
536
576
  declare const rootSize: _hello_terrain_work.ParamRef<number>;
@@ -557,6 +597,8 @@ declare const maxLevel: _hello_terrain_work.ParamRef<number>;
557
597
  declare const quadtreeUpdate: _hello_terrain_work.ParamRef<UpdateParams>;
558
598
  /** Optional custom terrain surface; defaults to bounded flat surface when null. */
559
599
  declare const surface: _hello_terrain_work.ParamRef<Surface | null>;
600
+ /** Terrain field texture filter mode. */
601
+ declare const terrainFieldFilter: _hello_terrain_work.ParamRef<"nearest" | "linear">;
560
602
  /** Terrain elevation control function (per vertex, in gpu compute) */
561
603
  declare const elevationFn: _hello_terrain_work.ParamRef<ElevationCallback>;
562
604
 
@@ -633,6 +675,8 @@ declare const terrainTasks: {
633
675
  attribute: three_webgpu.StorageBufferAttribute;
634
676
  node: three_webgpu.StorageBufferNode;
635
677
  }, string, unknown>;
678
+ readonly gpuSpatialIndexStorage: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
679
+ readonly gpuSpatialIndexUpload: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
636
680
  readonly createUniforms: _hello_terrain_work.Task<TerrainUniformsContext, string, unknown>;
637
681
  readonly updateUniforms: _hello_terrain_work.Task<TerrainUniformsContext, string, unknown>;
638
682
  readonly positionNode: _hello_terrain_work.Task<three_src_nodes_TSL_js.ShaderCallNodeInternal, string, unknown>;
@@ -651,6 +695,7 @@ declare const terrainTasks: {
651
695
  readonly createTerrainFieldTexture: _hello_terrain_work.Task<any, string, {
652
696
  renderer: WebGPURenderer;
653
697
  }>;
698
+ readonly createTerrainSampler: _hello_terrain_work.Task<TerrainSampler, string, unknown>;
654
699
  readonly elevationFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
655
700
  readonly terrainFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
656
701
  readonly compileCompute: _hello_terrain_work.Task<{
@@ -668,6 +713,8 @@ type ComputeDeviceLimits = {
668
713
  };
669
714
  declare function getDeviceComputeLimits(renderer: WebGPURenderer): ComputeDeviceLimits;
670
715
 
716
+ declare function createTerrainSampler(params: CreateTerrainSamplerParams): TerrainSampler;
717
+
671
718
  /**
672
719
  * Maps a value or node from texture space [0, 1] to vector space [-1, 1].
673
720
  *
@@ -740,5 +787,5 @@ declare const voronoiCells: three_src_nodes_TSL_js.ShaderNodeFn<[three_tsl.Proxi
740
787
  uv: Node;
741
788
  }>]>;
742
789
 
743
- 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, skirtScale, storeTerrainField, surface, surfaceTask, terrainFieldStageTask, terrainGraph, terrainTasks, textureSpaceToVectorSpace, tileNodesTask, update, updateUniformsTask, vElevation, vGlobalVertexIndex, vectorSpaceToTextureSpace, voronoiCells };
744
- 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 };
790
+ 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, createTerrainSampler, createTerrainSamplerTask, createTerrainUniforms, createUniformsTask, deriveNormalZ, elevationFieldStageTask, elevationFn, elevationScale, executeComputeTask, getDeviceComputeLimits, gpuSpatialIndexStorageTask, gpuSpatialIndexUploadTask, 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 };
791
+ export type { ComputePipeline, ComputeStageCallback, CreateTerrainSamplerParams, CubeSphereSurfaceConfig, ElevationCallback, ElevationFieldContext, ElevationParams, FlatSurfaceConfig, GpuSpatialIndexContext, InfiniteFlatSurfaceConfig, IntNodeInput, LeafGpuBufferState, LeafSet, LeafStorageState, LodMode, QuadtreeConfig, QuadtreeConfigState, QuadtreeState, SeamTable, SpatialIndex, Surface, TerrainFieldStorage, TerrainFieldStorageBackendType, TerrainFieldStorageFormat, TerrainFieldStorageOptions, TerrainGraph, TerrainSampler, TerrainTasks, TerrainUniformsContext, TerrainUniformsParams, TileBounds, TileId, UpdateParams };
package/dist/index.d.ts CHANGED
@@ -404,6 +404,8 @@ interface TerrainFieldStorage {
404
404
  readonly texture: StorageArrayTexture | StorageTexture;
405
405
  uv(ix: Node, iy: Node, tileIndex: Node): Node;
406
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;
407
409
  resize(width: number, height: number, tileCount: number): void;
408
410
  }
409
411
  declare function ArrayTextureBackend(edgeVertexCount: number, tileCount: number, options: Required<Pick<TerrainFieldStorageOptions, "format" | "filter">>): TerrainFieldStorage;
@@ -418,6 +420,13 @@ declare function storeTerrainField(storage: TerrainFieldStorage, ix: Node, iy: N
418
420
  declare function loadTerrainField(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
419
421
  declare function loadTerrainFieldElevation(storage: TerrainFieldStorage, ix: Node, iy: Node, tileIndex: Node): Node;
420
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;
421
430
  declare function packTerrainFieldSample(height: Node, normalXZ: Node, extra?: Node): Node;
422
431
 
423
432
  interface TerrainUniformsParams {
@@ -449,6 +458,41 @@ declare function createTileCompute(leafStorage: LeafStorageState, uniforms: Terr
449
458
  tileVertexWorldPositionCompute: three_src_nodes_TSL_js.ShaderNodeFn<[number | Node, number | Node, number | Node]>;
450
459
  };
451
460
 
461
+ interface ElevationParams {
462
+ worldPosition: Node$1;
463
+ rootSize: Node$1;
464
+ rootUV: Node$1;
465
+ tileUV: Node$1;
466
+ tileLevel: Node$1;
467
+ tileSize: Node$1;
468
+ tileOriginVec2: Node$1;
469
+ nodeIndex: Node$1;
470
+ }
471
+ type ElevationCallback = (params: ElevationParams) => Node$1;
472
+
473
+ interface GpuSpatialIndexContext {
474
+ data: Uint32Array<ArrayBuffer>;
475
+ size: number;
476
+ mask: number;
477
+ stampGen: UniformNode<number>;
478
+ attribute: StorageBufferAttribute;
479
+ node: StorageBufferNode;
480
+ }
481
+ interface TerrainSampler {
482
+ sampleElevation: (worldX: Node, worldZ: Node) => Node;
483
+ sampleNormal: (worldX: Node, worldZ: Node) => Node;
484
+ sampleTerrain: (worldX: Node, worldZ: Node) => Node;
485
+ sampleValidity: (worldX: Node, worldZ: Node) => Node;
486
+ evaluateElevation: (worldX: Node, worldZ: Node) => Node;
487
+ evaluateNormal: (worldX: Node, worldZ: Node, epsilon?: Node) => Node;
488
+ }
489
+ interface CreateTerrainSamplerParams {
490
+ terrainFieldStorage: TerrainFieldStorage;
491
+ spatialIndex: GpuSpatialIndexContext;
492
+ uniforms: TerrainUniformsContext;
493
+ elevationCallback: ElevationCallback;
494
+ }
495
+
452
496
  interface QuadtreeConfigState {
453
497
  state: QuadtreeState;
454
498
  surface: Surface;
@@ -469,12 +513,15 @@ interface TerrainTasks {
469
513
  surface: TaskRef<Surface>;
470
514
  leafStorage: TaskRef<LeafStorageState>;
471
515
  leafGpuBuffer: TaskRef<LeafGpuBufferState>;
516
+ gpuSpatialIndexStorage: TaskRef<GpuSpatialIndexContext>;
517
+ gpuSpatialIndexUpload: TaskRef<GpuSpatialIndexContext>;
472
518
  createUniforms: TaskRef<TerrainUniformsContext>;
473
519
  updateUniforms: TaskRef<TerrainUniformsContext>;
474
520
  positionNode: TaskRef<ShaderCallNodeInternal>;
475
521
  createElevationFieldContext: TaskRef<ElevationFieldContext>;
476
522
  createTileNodes: TaskRef<ReturnType<typeof createTileCompute>>;
477
523
  createTerrainFieldTexture: TaskRef<TerrainFieldStorage>;
524
+ createTerrainSampler: TaskRef<TerrainSampler>;
478
525
  elevationFieldStage: TaskRef<ComputePipeline>;
479
526
  terrainFieldStage: TaskRef<ComputePipeline>;
480
527
  compileCompute: TaskRef<{
@@ -504,6 +551,9 @@ declare const tileNodesTask: _hello_terrain_work.Task<{
504
551
  */
505
552
  declare const elevationFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
506
553
 
554
+ declare const gpuSpatialIndexStorageTask: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
555
+ declare const gpuSpatialIndexUploadTask: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
556
+
507
557
  /** Generates a unique instance ID per graph (cached once). */
508
558
  declare const instanceIdTask: _hello_terrain_work.Task<`${string}-${string}-${string}-${string}-${string}`, string, unknown>;
509
559
 
@@ -520,17 +570,7 @@ declare const createTerrainFieldTextureTask: _hello_terrain_work.Task<any, strin
520
570
  */
521
571
  declare const terrainFieldStageTask: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
522
572
 
523
- interface ElevationParams {
524
- worldPosition: Node$1;
525
- rootSize: Node$1;
526
- rootUV: Node$1;
527
- tileUV: Node$1;
528
- tileLevel: Node$1;
529
- tileSize: Node$1;
530
- tileOriginVec2: Node$1;
531
- nodeIndex: Node$1;
532
- }
533
- type ElevationCallback = (params: ElevationParams) => Node$1;
573
+ declare const createTerrainSamplerTask: _hello_terrain_work.Task<TerrainSampler, string, unknown>;
534
574
 
535
575
  /** Root tile size in world units. */
536
576
  declare const rootSize: _hello_terrain_work.ParamRef<number>;
@@ -557,6 +597,8 @@ declare const maxLevel: _hello_terrain_work.ParamRef<number>;
557
597
  declare const quadtreeUpdate: _hello_terrain_work.ParamRef<UpdateParams>;
558
598
  /** Optional custom terrain surface; defaults to bounded flat surface when null. */
559
599
  declare const surface: _hello_terrain_work.ParamRef<Surface | null>;
600
+ /** Terrain field texture filter mode. */
601
+ declare const terrainFieldFilter: _hello_terrain_work.ParamRef<"nearest" | "linear">;
560
602
  /** Terrain elevation control function (per vertex, in gpu compute) */
561
603
  declare const elevationFn: _hello_terrain_work.ParamRef<ElevationCallback>;
562
604
 
@@ -633,6 +675,8 @@ declare const terrainTasks: {
633
675
  attribute: three_webgpu.StorageBufferAttribute;
634
676
  node: three_webgpu.StorageBufferNode;
635
677
  }, string, unknown>;
678
+ readonly gpuSpatialIndexStorage: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
679
+ readonly gpuSpatialIndexUpload: _hello_terrain_work.Task<GpuSpatialIndexContext, string, unknown>;
636
680
  readonly createUniforms: _hello_terrain_work.Task<TerrainUniformsContext, string, unknown>;
637
681
  readonly updateUniforms: _hello_terrain_work.Task<TerrainUniformsContext, string, unknown>;
638
682
  readonly positionNode: _hello_terrain_work.Task<three_src_nodes_TSL_js.ShaderCallNodeInternal, string, unknown>;
@@ -651,6 +695,7 @@ declare const terrainTasks: {
651
695
  readonly createTerrainFieldTexture: _hello_terrain_work.Task<any, string, {
652
696
  renderer: WebGPURenderer;
653
697
  }>;
698
+ readonly createTerrainSampler: _hello_terrain_work.Task<TerrainSampler, string, unknown>;
654
699
  readonly elevationFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
655
700
  readonly terrainFieldStage: _hello_terrain_work.Task<ComputePipeline, string, unknown>;
656
701
  readonly compileCompute: _hello_terrain_work.Task<{
@@ -668,6 +713,8 @@ type ComputeDeviceLimits = {
668
713
  };
669
714
  declare function getDeviceComputeLimits(renderer: WebGPURenderer): ComputeDeviceLimits;
670
715
 
716
+ declare function createTerrainSampler(params: CreateTerrainSamplerParams): TerrainSampler;
717
+
671
718
  /**
672
719
  * Maps a value or node from texture space [0, 1] to vector space [-1, 1].
673
720
  *
@@ -740,5 +787,5 @@ declare const voronoiCells: three_src_nodes_TSL_js.ShaderNodeFn<[three_tsl.Proxi
740
787
  uv: Node;
741
788
  }>]>;
742
789
 
743
- 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, skirtScale, storeTerrainField, surface, surfaceTask, terrainFieldStageTask, terrainGraph, terrainTasks, textureSpaceToVectorSpace, tileNodesTask, update, updateUniformsTask, vElevation, vGlobalVertexIndex, vectorSpaceToTextureSpace, voronoiCells };
744
- 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 };
790
+ 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, createTerrainSampler, createTerrainSamplerTask, createTerrainUniforms, createUniformsTask, deriveNormalZ, elevationFieldStageTask, elevationFn, elevationScale, executeComputeTask, getDeviceComputeLimits, gpuSpatialIndexStorageTask, gpuSpatialIndexUploadTask, 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 };
791
+ export type { ComputePipeline, ComputeStageCallback, CreateTerrainSamplerParams, CubeSphereSurfaceConfig, ElevationCallback, ElevationFieldContext, ElevationParams, FlatSurfaceConfig, GpuSpatialIndexContext, InfiniteFlatSurfaceConfig, IntNodeInput, LeafGpuBufferState, LeafSet, LeafStorageState, LodMode, QuadtreeConfig, QuadtreeConfigState, QuadtreeState, SeamTable, SpatialIndex, Surface, TerrainFieldStorage, TerrainFieldStorageBackendType, TerrainFieldStorageFormat, TerrainFieldStorageOptions, TerrainGraph, TerrainSampler, TerrainTasks, TerrainUniformsContext, TerrainUniformsParams, TileBounds, TileId, UpdateParams };