three-low-poly 0.9.24 → 0.9.26

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
@@ -1,6 +1,5 @@
1
1
  import { BoxGeometry } from 'three';
2
2
  import { BufferGeometry } from 'three';
3
- import { Camera } from 'three';
4
3
  import { Color } from 'three';
5
4
  import { ColorRepresentation } from 'three';
6
5
  import { DataTexture } from 'three';
@@ -16,13 +15,17 @@ import { MeshPhongMaterial } from 'three';
16
15
  import { MeshPhysicalMaterial } from 'three';
17
16
  import { MeshStandardMaterial } from 'three';
18
17
  import { Object3D } from 'three';
18
+ import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
19
19
  import { ParametricGeometry } from 'three-stdlib';
20
20
  import { PerspectiveCamera } from 'three';
21
+ import { Plane } from 'three';
21
22
  import { PlaneGeometry } from 'three';
22
23
  import { PointLight } from 'three';
23
24
  import { Points } from 'three';
25
+ import { Quaternion } from 'three';
24
26
  import { ShaderMaterial } from 'three';
25
27
  import { Shape } from 'three';
28
+ import { ShapeGeometry } from 'three';
26
29
  import { SphereGeometry } from 'three';
27
30
  import * as THREE from 'three';
28
31
  import { Uniform } from 'three';
@@ -166,6 +169,124 @@ export declare function alignToRow<T extends Object3D>(objects: T[], direction?:
166
169
  */
167
170
  export declare function appendSphericalCurve(sphereRadiusX: number, sphereRadiusY: number, sphereStartY: number, holeTopRadius?: number, holeBottomRadius?: number, segments?: number): Vector2[];
168
171
 
172
+ export declare function applySnapshot(camera: PerspectiveCamera, controls: OrbitControls | undefined, snapshot: CameraSnapshot): void;
173
+
174
+ declare interface ArchedDiamondLatticePartOptions {
175
+ width: number;
176
+ rectHeight: number;
177
+ archHeight?: number;
178
+ centerY?: number;
179
+ grid: DiamondLatticeGrid;
180
+ leadThickness: number;
181
+ leadDepth: number;
182
+ /**
183
+ * Shrink the opening the cames are clipped to (positioning stays on the full
184
+ * grid). Set to the frame thickness so came ends tuck under the frame ring
185
+ * instead of poking past the outer silhouette. Defaults to `0`.
186
+ */
187
+ clipInset?: number;
188
+ }
189
+
190
+ /**
191
+ * Arched diamond lattice window — diagonal lead cames analytically clipped to a
192
+ * Tudor head opening, with an extruded frame ring. The lattice is real trimmed
193
+ * geometry (no stencil mask), so it casts a correct arch-shaped shadow and any
194
+ * collider derived from the mesh matches what's drawn.
195
+ *
196
+ * Local frame: centered on the opening, XY plane facing +Z. Lead is centered on
197
+ * `z = 0`; optional glass sits in the same plane (both faces).
198
+ */
199
+ export declare class ArchedDiamondLatticeWindow extends Group {
200
+ readonly lattice: Mesh<ArchedDiamondLatticeWindowGeometry, MeshStandardMaterial>;
201
+ readonly frame: Mesh;
202
+ readonly glass?: Mesh<ShapeGeometry, MeshPhysicalMaterial>;
203
+ readonly cellsX: number;
204
+ readonly cellsY: number;
205
+ readonly fittedGrid: DiamondLatticeGrid;
206
+ readonly opening: ArchedOpeningMetrics;
207
+ constructor({ leadColor, glass, glassColor, glassEmissive, glassEmissiveIntensity, width, rectHeight, archHeight, centerY, leadThickness, leadDepth, ...geometryOptions }?: ArchedDiamondLatticeWindowOptions);
208
+ }
209
+
210
+ /**
211
+ * Diamond cames analytically clipped to the arched (rect-plus-Tudor-head)
212
+ * opening — real trimmed geometry, no stencil, so it shadows and raycasts
213
+ * correctly. Frame is a separate extruded ring on {@link ArchedDiamondLatticeWindow}.
214
+ */
215
+ export declare class ArchedDiamondLatticeWindowGeometry extends BufferGeometry {
216
+ readonly cellsX: number;
217
+ readonly cellsY: number;
218
+ readonly fittedGrid: DiamondLatticeGrid;
219
+ readonly opening: ArchedOpeningMetrics;
220
+ constructor({ width, rectHeight, archHeight, leadThickness, leadDepth, cellsX, cellsY, centerY, }?: ArchedDiamondLatticeWindowGeometryOptions);
221
+ }
222
+
223
+ declare interface ArchedDiamondLatticeWindowGeometryOptions {
224
+ /** Opening width (world units). */
225
+ width?: number;
226
+ /** Height of the straight-sided lower section. */
227
+ rectHeight?: number;
228
+ /** Arch rise from the spring line to the apex. Defaults to `width / 2`. */
229
+ archHeight?: number;
230
+ /** Lead came thickness (cross-section). Defaults to `0.055`. */
231
+ leadThickness?: number;
232
+ /** Lead depth (Z extent). Defaults to `0.11`. */
233
+ leadDepth?: number;
234
+ /** Quarrels spanning east–west across the bounding opening. Defaults to `10`. */
235
+ cellsX?: number;
236
+ /** Quarrels spanning north–south across the bounding opening. Defaults to `12`. */
237
+ cellsY?: number;
238
+ /** Vertical center of the full opening. Defaults to `0`. */
239
+ centerY?: number;
240
+ }
241
+
242
+ declare interface ArchedDiamondLatticeWindowOptions extends ArchedDiamondLatticeWindowGeometryOptions {
243
+ /** Lead + outer frame tint. Defaults to `#0c0f14`. */
244
+ leadColor?: ColorRepresentation;
245
+ /** Optional glass pane centered in the lead depth (`z = 0`), visible from both sides. */
246
+ glass?: boolean;
247
+ glassColor?: ColorRepresentation;
248
+ glassEmissive?: ColorRepresentation;
249
+ glassEmissiveIntensity?: number;
250
+ }
251
+
252
+ /** Rectangular lower section plus circular arch head. */
253
+ export declare interface ArchedOpeningBounds {
254
+ width: number;
255
+ /** Height of the straight-sided lower section. */
256
+ rectHeight: number;
257
+ /** Arch rise from the spring line to the apex. Defaults to `width / 2` (semicircle). */
258
+ archHeight?: number;
259
+ /** Vertical center of the full opening. Defaults to `0`. */
260
+ centerY?: number;
261
+ }
262
+
263
+ export declare interface ArchedOpeningMetrics {
264
+ hw: number;
265
+ ymin: number;
266
+ ymax: number;
267
+ rectTopY: number;
268
+ /** Circle center Y — lies on or below the spring line. */
269
+ archCy: number;
270
+ /** Circular arc radius derived from `width` and `archHeight`. */
271
+ archRadius: number;
272
+ archHeight: number;
273
+ totalHeight: number;
274
+ centerY: number;
275
+ }
276
+
277
+ /**
278
+ * Circular arc through `(-width/2, springY)` and `(width/2, springY)` with rise
279
+ * `archHeight`. Frame, glass, and lattice clip all use this same arc.
280
+ */
281
+ export declare function archedOpeningMetrics({ width, rectHeight, archHeight, centerY, }: ArchedOpeningBounds): ArchedOpeningMetrics;
282
+
283
+ declare interface ArchedOutlineTarget {
284
+ moveTo(x: number, y: number): unknown;
285
+ lineTo(x: number, y: number): unknown;
286
+ absarc(x: number, y: number, radius: number, startAngle: number, endAngle: number, clockwise: boolean): unknown;
287
+ closePath(): unknown;
288
+ }
289
+
169
290
  /**
170
291
  * Atmospheric scattering shader.
171
292
  *
@@ -392,10 +513,6 @@ export declare const Axis: {
392
513
  XYZ: Vector3;
393
514
  };
394
515
 
395
- export declare class BifurcatedStaircaseGeometry extends BufferGeometry {
396
- constructor(stepWidth?: number, stepHeight?: number, stepDepth?: number, numStepsCentral?: number, numStepsBranch?: number, branchAngle?: number);
397
- }
398
-
399
516
  declare interface BloomTransitionOptions extends SceneTransitionFXOptions {
400
517
  maxBloom?: number;
401
518
  }
@@ -441,57 +558,93 @@ export declare class BoneGeometry extends BufferGeometry {
441
558
  }
442
559
 
443
560
  /**
444
- * Book prefab
561
+ * Book prefab — cover shell and page block with separate material groups.
445
562
  *
446
- * Material indices:
447
- * 0. cover
448
- * 1. page
563
+ * Local frame: spine at X=0, fore-edge at +X, sits on the Y=0 plane.
449
564
  */
450
565
  export declare class Book extends Mesh<BookGeometry, MeshStandardMaterial[]> {
451
- constructor({ width, height, depth, coverThickness, pageIndent, coverColor, pageColor, }?: {
452
- width?: number | undefined;
453
- height?: number | undefined;
454
- depth?: number | undefined;
455
- coverThickness?: number | undefined;
456
- pageIndent?: number | undefined;
457
- coverColor?: number | undefined;
458
- pageColor?: number | undefined;
459
- });
566
+ readonly width: number;
567
+ readonly height: number;
568
+ readonly depth: number;
569
+ readonly coverThickness: number;
570
+ readonly pageIndent: number;
571
+ constructor({ coverColor, pageColor, ...geometryOptions }?: BookOptions);
460
572
  }
461
573
 
462
574
  /**
463
- * Book
575
+ * Closed book — cover shell (group 0) and page block (group 1).
464
576
  *
465
- * Group indices:
466
- * 0. cover
467
- * 1. page
577
+ * Local frame: spine at X=0, fore-edge at +X, sits on the Y=0 plane.
468
578
  */
469
579
  export declare class BookGeometry extends BufferGeometry {
470
- constructor(width?: number, height?: number, depth?: number, coverThickness?: number, pageIndent?: number);
580
+ readonly width: number;
581
+ readonly height: number;
582
+ readonly depth: number;
583
+ readonly coverThickness: number;
584
+ readonly pageIndent: number;
585
+ constructor({ width, height, depth, coverThickness, pageIndent, }?: BookGeometryOptions);
586
+ }
587
+
588
+ export declare interface BookGeometryOptions {
589
+ /** Cover width (spine to fore-edge). Defaults to `1`. */
590
+ width?: number;
591
+ /** Cover height. Defaults to `1.5`. */
592
+ height?: number;
593
+ /** Spine depth (cover to cover). Defaults to `0.5`. */
594
+ depth?: number;
595
+ /** Cover board thickness. Defaults to `0.05`. */
596
+ coverThickness?: number;
597
+ /** Inset of the page block from the cover edges. Defaults to `0.05`. */
598
+ pageIndent?: number;
599
+ }
600
+
601
+ export declare interface BookOptions extends BookGeometryOptions {
602
+ /** Cover tint. Defaults to `#8b0000`. */
603
+ coverColor?: ColorRepresentation;
604
+ /** Page block tint. Defaults to `#ffffff`. */
605
+ pageColor?: ColorRepresentation;
471
606
  }
472
607
 
608
+ /**
609
+ * Bookshelf prefab — framed shelving unit.
610
+ */
473
611
  export declare class Bookshelf extends Mesh<BookshelfGeometry, MeshStandardMaterial> {
474
- constructor({ width, //
475
- height, depth, shelves, frameThickness, open, }?: {
476
- width?: number | undefined;
477
- height?: number | undefined;
478
- depth?: number | undefined;
479
- shelves?: number | undefined;
480
- frameThickness?: number | undefined;
481
- open?: boolean | undefined;
482
- });
612
+ readonly width: number;
613
+ readonly height: number;
614
+ constructor({ color, ...geometryOptions }?: BookshelfOptions);
483
615
  }
484
616
 
617
+ /**
618
+ * Bookshelf frame with optional back panel and evenly spaced shelves.
619
+ *
620
+ * Local frame: sits on the Y=0 plane, centered on X/Z.
621
+ */
485
622
  export declare class BookshelfGeometry extends BufferGeometry {
486
- constructor({ width, //
487
- height, depth, shelves, frameThickness, open, }?: {
488
- width?: number | undefined;
489
- height?: number | undefined;
490
- depth?: number | undefined;
491
- shelves?: number | undefined;
492
- frameThickness?: number | undefined;
493
- open?: boolean | undefined;
494
- });
623
+ readonly width: number;
624
+ readonly height: number;
625
+ readonly depth: number;
626
+ readonly shelves: number;
627
+ constructor({ width, height, depth, shelves, frameThickness, open, }?: BookshelfGeometryOptions);
628
+ }
629
+
630
+ export declare interface BookshelfGeometryOptions {
631
+ /** Overall width. Defaults to `5`. */
632
+ width?: number;
633
+ /** Overall height. Defaults to `8`. */
634
+ height?: number;
635
+ /** Shelf depth. Defaults to `1`. */
636
+ depth?: number;
637
+ /** Number of interior shelves. Defaults to `4`. */
638
+ shelves?: number;
639
+ /** Frame board thickness. Defaults to `0.1`. */
640
+ frameThickness?: number;
641
+ /** Omit the back panel when `true`. Defaults to `false`. */
642
+ open?: boolean;
643
+ }
644
+
645
+ export declare interface BookshelfOptions extends BookshelfGeometryOptions {
646
+ /** Frame tint. Defaults to `#8b4513`. */
647
+ color?: ColorRepresentation;
495
648
  }
496
649
 
497
650
  export declare enum BoxSide {
@@ -504,50 +657,72 @@ export declare enum BoxSide {
504
657
  }
505
658
 
506
659
  /**
507
- * Single brick geometry for low-poly aesthetic.
508
- * Default dimensions approximate standard brick proportions (in feet scale).
660
+ * Diagonal cames only, each segment analytically clipped to the rect-plus-arch
661
+ * opening no outer frame, no stencil. Bar ends land as real vertices on the
662
+ * arc, so the merged geometry casts a correct shadow and matches any collider.
509
663
  */
510
- export declare class BrickGeometry extends BufferGeometry {
511
- constructor({ width, height, depth, }?: {
512
- width?: number | undefined;
513
- height?: number | undefined;
514
- depth?: number | undefined;
515
- });
516
- }
664
+ export declare function buildArchedDiamondLatticeCameParts({ width, rectHeight, archHeight, centerY, grid, leadThickness: barT, leadDepth: barD, clipInset, }: ArchedDiamondLatticePartOptions): BoxGeometry[];
517
665
 
518
- export declare interface BrickWallOptions {
519
- wallWidth?: number;
520
- wallHeight?: number;
521
- brickWidth?: number;
522
- brickHeight?: number;
523
- brickDepth?: number;
524
- mortarGap?: number;
525
- offsetPattern?: boolean;
526
- brickColors?: number[];
527
- colorVariation?: boolean;
528
- positionVariation?: number;
529
- rotationVariation?: number;
530
- material?: Material;
531
- }
666
+ /** Extruded frame ring following the arched opening perimeter. */
667
+ export declare function buildArchedDiamondLatticeFrameGeometry(metrics: ArchedOpeningMetrics, barThickness: number, barDepth: number): ExtrudeGeometry;
668
+
669
+ /** Outer frame (rect sides + circular arch head) and clipped diagonal cames. */
670
+ export declare function buildArchedDiamondLatticeParts(options: ArchedDiamondLatticePartOptions): BoxGeometry[];
671
+
672
+ /** Diagonal cames only — no outer frame (for stencil-masked openings). */
673
+ export declare function buildDiamondLatticeCameParts(options: DiamondLatticePartOptions): BoxGeometry[];
674
+
675
+ /**
676
+ * Build merged box geometries for the outer frame and diagonal lead cames.
677
+ * Diagonal bars are trimmed to the rectangular opening (segment clip, not stencil).
678
+ */
679
+ export declare function buildDiamondLatticeParts({ width, height, centerY, grid, leadThickness: barT, leadDepth: barD, }: DiamondLatticePartOptions): BoxGeometry[];
680
+
681
+ /**
682
+ * Build merged box geometries for the outer frame and interior mullions.
683
+ * Orthogonal grid — no clipping required; counts guarantee full panes.
684
+ */
685
+ export declare function buildGregorianLatticeParts({ width, height, centerY, cellsX, cellsY, mullionThickness: barT, mullionDepth: barD, }: GregorianLatticePartOptions): BoxGeometry[];
686
+
687
+ /** Outer frame bars — shared topology across lattice window openings. */
688
+ export declare function buildRingLatticeFrameParts({ width, height, centerY, frameThickness: barT, frameDepth: barD, }: RingLatticeFramePartOptions): BoxGeometry[];
532
689
 
533
690
  export declare class BunsenBurner extends Group {
534
691
  constructor();
535
692
  }
536
693
 
537
- export declare class Burst extends Mesh {
538
- constructor({ sides, innerRadius, outerRadius, depth }?: {
539
- sides?: number | undefined;
540
- innerRadius?: number | undefined;
541
- outerRadius?: number | undefined;
542
- depth?: number | undefined;
543
- });
694
+ /**
695
+ * Burst shape prefab.
696
+ */
697
+ export declare class Burst extends Mesh<BurstGeometry, MeshStandardMaterial> {
698
+ constructor({ color, emissive, emissiveIntensity, ...geometryOptions }?: BurstOptions);
544
699
  }
545
700
 
546
701
  /**
547
- * Extrude geometry of Burst Shape.
702
+ * Extruded burst / starburst prism.
548
703
  */
549
704
  export declare class BurstGeometry extends ExtrudeGeometry {
550
- constructor(sides?: number, innerRadius?: number, outerRadius?: number, depth?: number);
705
+ constructor({ sides, innerRadius, outerRadius, depth, }?: BurstGeometryOptions);
706
+ }
707
+
708
+ export declare interface BurstGeometryOptions {
709
+ /** Number of burst rays. Defaults to `5`. */
710
+ sides?: number;
711
+ /** Inner vertex radius. Defaults to `0.5`. */
712
+ innerRadius?: number;
713
+ /** Outer vertex radius. Defaults to `1`. */
714
+ outerRadius?: number;
715
+ /** Extrusion depth. Defaults to `0.25`. */
716
+ depth?: number;
717
+ }
718
+
719
+ export declare interface BurstOptions extends BurstGeometryOptions {
720
+ /** Surface tint. Defaults to `#ffff00`. */
721
+ color?: ColorRepresentation;
722
+ /** Emissive tint. Defaults to `#ffd700`. */
723
+ emissive?: ColorRepresentation;
724
+ /** Emissive strength. Defaults to `0.25`. */
725
+ emissiveIntensity?: number;
551
726
  }
552
727
 
553
728
  export declare class BurstShape extends Shape {
@@ -606,74 +781,84 @@ export declare function calculateXFromSlopeIntercept(x1: number, y1: number, x2:
606
781
  */
607
782
  export declare function calculateYFromSlopeIntercept(x1: number, y1: number, x2: number, y2: number, x: number): number;
608
783
 
609
- /**
610
- * Dolly backward
611
- *
612
- * Example:
613
- * ```
614
- * cameraDollyAnimation(camera, 5, 3000, () => {
615
- * console.log("Dolly animation complete");
616
- * });
617
- * ```
618
- */
619
- export declare function cameraDollyAnimation(camera: Camera, distance: number, duration: number, onComplete?: () => void): void;
784
+ export declare interface CameraClip {
785
+ readonly label: string;
786
+ readonly duration: number;
787
+ start(runtime: ClipRuntime): void;
788
+ update(runtime: ClipRuntime, dt: number): ClipPhase;
789
+ /** Called when playback is cancelled mid-clip. */
790
+ cancel?(runtime: ClipRuntime): void;
791
+ }
620
792
 
621
- /**
622
- * The camera flies through a sequence of points, ideal for showcasing specific elements in the scene.
623
- *
624
- * Example:
625
- * ```
626
- * cameraFlythroughAnimation(
627
- * camera,
628
- * [
629
- * new THREE.Vector3(0, 5, 5),
630
- * new THREE.Vector3(0, 5, -25.5),
631
- * new THREE.Vector3(-20.5, 5, 0),
632
- * ],
633
- * 6000,
634
- * () => {
635
- * console.log("Flythrough animation complete");
636
- * }
637
- * );
638
- * ```
639
- */
640
- export declare function cameraFlythroughAnimation(camera: Camera, waypoints: Vector3[], duration: number, onComplete?: () => void): void;
793
+ declare interface CameraClipTiming {
794
+ /** Duration in seconds. */
795
+ duration: number;
796
+ /** Progress easing for normalized time `t` in [0, 1]. Defaults to smoothstep. */
797
+ ease?: EasingFunction;
798
+ }
641
799
 
642
800
  /**
643
- * Orbit around a target
801
+ * Single director for camera showcase clips — Unity demo-scene style playback.
644
802
  *
645
- * Example:
646
- * ```
647
- * cameraOrbitAnimation(camera, new THREE.Vector3(0, 0, 0), 10, 5000, () => {
648
- * console.log("Orbit animation complete");
649
- * });
650
- * ```
651
- */
652
- export declare function cameraOrbitAnimation(camera: Camera, target: Vector3, radius: number, duration: number, onComplete?: () => void): void;
653
-
654
- /**
655
- * The camera swings back and forth like a pendulum.
803
+ * One active clip at a time, driven by {@link update} with elapsed seconds (`dt`),
804
+ * not nested `requestAnimationFrame` loops. Disables OrbitControls while playing;
805
+ * re-enables and syncs `controls.target` to the clip focus on complete.
656
806
  *
657
- * Example:
658
- * ```
659
- * cameraPendulumAnimation(camera, new THREE.Vector3(0, 5, 5), 0.5, 9000, 3, () => {
660
- * console.log("Pendulum animation complete");
661
- * });
662
- * ```
663
- */
664
- export declare function cameraPendulumAnimation(camera: Camera, center: Vector3, radius: number, duration: number, oscillations: number, onComplete?: () => void): void;
665
-
666
- /**
667
- * The camera spirals upward, perfect for revealing a large scene or structure.
807
+ * @example
808
+ * ```ts
809
+ * const playback = new CameraPlayback(camera, controls);
810
+ * playback.setRest(); // snapshot current pose as Reset target
668
811
  *
669
- * Example:
670
- * ```
671
- * cameraSpiralAscensionAnimation(camera, new THREE.Vector3(0, 0, 0), 10, 300, 7, 12000, () => {
672
- * console.log("Spiral ascension animation complete");
812
+ * onFrame((dt) => {
813
+ * playback.update(dt);
814
+ * controls.update();
815
+ * renderer.render(scene, camera);
673
816
  * });
817
+ *
818
+ * playback.play(createOrbitClip({ target, radius: 10, duration: 8 }));
674
819
  * ```
675
820
  */
676
- export declare function cameraSpiralAscensionAnimation(camera: Camera, center: Vector3, radius: number, height: number, revolutions: number, duration: number, onComplete?: () => void): void;
821
+ export declare class CameraPlayback {
822
+ private readonly camera;
823
+ private readonly controls?;
824
+ private active;
825
+ private elapsed;
826
+ private readonly focus;
827
+ private rest;
828
+ constructor(camera: PerspectiveCamera, controls?: OrbitControls | undefined);
829
+ /** Whether a clip is actively playing. */
830
+ get isPlaying(): boolean;
831
+ /** Snapshot the current camera + controls pose as the Reset/rest pose. */
832
+ setRest(): void;
833
+ /** Replace the rest pose without stopping playback. */
834
+ setRestSnapshot(snapshot: CameraSnapshot): void;
835
+ /**
836
+ * Begin a clip. Cancels any active clip first.
837
+ * OrbitControls are disabled until the clip completes or {@link stop} is called.
838
+ */
839
+ play(clip: CameraClip): void;
840
+ /** Cancel the active clip and restore the rest pose. */
841
+ stop(): void;
842
+ /** Alias for {@link stop} — return to the rest pose. */
843
+ reset(): void;
844
+ /**
845
+ * Advance the active clip. Call from the scene `onFrame` callback each frame.
846
+ * @param dt Elapsed seconds since last frame.
847
+ */
848
+ update(dt: number): void;
849
+ /** Release references; call from example dispose. */
850
+ dispose(): void;
851
+ private cancelActive;
852
+ private runtime;
853
+ }
854
+
855
+ /** Rest pose captured when playback is constructed or reset. */
856
+ export declare interface CameraSnapshot {
857
+ position: Vector3;
858
+ quaternion: Quaternion;
859
+ fov: number;
860
+ target: Vector3;
861
+ }
677
862
 
678
863
  /**
679
864
  * CameraTransition provides smooth animated transitions between perspective and orthographic cameras.
@@ -757,62 +942,52 @@ export declare interface CameraTransitionOptions {
757
942
  }
758
943
 
759
944
  /**
760
- * Add a slight random wobble for intensity or realism (e.g., during an explosion).
761
- *
762
- * Example:
763
- * ```
764
- * cameraWobbleAnimation(camera, 0.5, 1000, () => {
765
- * console.log("Wobble animation complete");
766
- * });
767
- * ```
768
- */
769
- export declare function cameraWobbleAnimation(camera: Camera, intensity: number, duration: number, onComplete?: () => void): void;
770
-
771
- /**
772
- * The camera smoothly zooms in toward a target, focusing attention on a specific point,
773
- * and resets to its original FOV after completion.
774
- *
775
- * Example:
776
- * ```
777
- * cameraZoomInAnimation(camera, new THREE.Vector3(0, 0, 0), 120, 75, 2000, () => {
778
- * console.log("Zoom in animation complete");
779
- * });
780
- * ```
781
- */
782
- export declare function cameraZoomInAnimation(camera: PerspectiveCamera, target: Vector3, startFov: number, endFov: number, duration: number, onComplete?: () => void): void;
783
-
784
- /**
785
- * Material indices
786
- * 0: Stick
787
- * 1: Flame
945
+ * Candle prefab wax stick and emissive flame (separate material groups).
788
946
  */
789
947
  export declare class Candle extends Mesh<CandleGeometry, MeshStandardMaterial[]> {
790
- constructor({ radiusTop, //
791
- radiusBottom, height, flameHeight, flameRadius, segments, }?: {
792
- radiusTop?: number | undefined;
793
- radiusBottom?: number | undefined;
794
- height?: number | undefined;
795
- flameHeight?: number | undefined;
796
- flameRadius?: number | undefined;
797
- segments?: number | undefined;
798
- });
948
+ readonly height: number;
949
+ constructor({ stickColor, flameColor, flameEmissive, flameEmissiveIntensity, ...geometryOptions }?: CandleOptions);
799
950
  }
800
951
 
801
952
  /**
802
- * Group indices
803
- * 0: Stick
804
- * 1: Flame
953
+ * Candle stick and flame — group 0 stick, group 1 flame.
954
+ *
955
+ * Local frame: base at Y=0.
805
956
  */
806
957
  export declare class CandleGeometry extends BufferGeometry {
807
- constructor({ radiusTop, //
808
- radiusBottom, height, flameHeight, flameRadius, segments, }?: {
809
- radiusTop?: number | undefined;
810
- radiusBottom?: number | undefined;
811
- height?: number | undefined;
812
- flameHeight?: number | undefined;
813
- flameRadius?: number | undefined;
814
- segments?: number | undefined;
815
- });
958
+ readonly radiusTop: number;
959
+ readonly radiusBottom: number;
960
+ readonly height: number;
961
+ readonly flameHeight: number;
962
+ readonly flameRadius: number;
963
+ readonly segments: number;
964
+ constructor({ radiusTop, radiusBottom, height, flameHeight, flameRadius, segments, }?: CandleGeometryOptions);
965
+ }
966
+
967
+ export declare interface CandleGeometryOptions {
968
+ /** Stick top radius. Defaults to `0.2`. */
969
+ radiusTop?: number;
970
+ /** Stick bottom radius. Defaults to `0.2`. */
971
+ radiusBottom?: number;
972
+ /** Stick height. Defaults to `1`. */
973
+ height?: number;
974
+ /** Flame tip height. Defaults to `0.25`. */
975
+ flameHeight?: number;
976
+ /** Flame base radius. Defaults to `0.05`. */
977
+ flameRadius?: number;
978
+ /** Circumference segments. Defaults to `16`. */
979
+ segments?: number;
980
+ }
981
+
982
+ export declare interface CandleOptions extends CandleGeometryOptions {
983
+ /** Wax stick tint. Defaults to `#ffffff`. */
984
+ stickColor?: ColorRepresentation;
985
+ /** Flame surface tint. Defaults to `#ffd700`. */
986
+ flameColor?: ColorRepresentation;
987
+ /** Flame emissive tint. Defaults to `#ffa500`. */
988
+ flameEmissive?: ColorRepresentation;
989
+ /** Flame emissive strength. Defaults to `0.35`. */
990
+ flameEmissiveIntensity?: number;
816
991
  }
817
992
 
818
993
  /**
@@ -821,6 +996,8 @@ export declare class CandleGeometry extends BufferGeometry {
821
996
  */
822
997
  export declare const capHeightFromRadius: (radius: number, thetaLength: number) => number;
823
998
 
999
+ export declare function captureSnapshot(camera: PerspectiveCamera, controls?: OrbitControls): CameraSnapshot;
1000
+
824
1001
  /**
825
1002
  * Calculate the width of a spherical cap.
826
1003
  * w = 2 * R * sin(thetaLength)
@@ -887,6 +1064,29 @@ export declare function centerObjectGeometry<T extends Object3D>(object: T, targ
887
1064
  */
888
1065
  export declare const checkerboardTexture: (size: number) => DataTexture;
889
1066
 
1067
+ export declare type ClipPhase = "running" | "complete";
1068
+
1069
+ /** Per-frame mutable state shared with the active clip. */
1070
+ export declare interface ClipRuntime {
1071
+ camera: PerspectiveCamera;
1072
+ controls: OrbitControls | null;
1073
+ /** Seconds elapsed in the active clip. */
1074
+ elapsed: number;
1075
+ /** Clip duration in seconds. */
1076
+ duration: number;
1077
+ /** Look-at point the clip is focused on — synced to OrbitControls on complete. */
1078
+ focus: Vector3;
1079
+ }
1080
+
1081
+ /** Clip a segment to an axis-aligned rectangle; returns endpoints inside the opening. */
1082
+ export declare function clipSegmentToAabb(x1: number, y1: number, x2: number, y2: number, minX: number, minY: number, maxX: number, maxY: number): [number, number, number, number] | null;
1083
+
1084
+ /**
1085
+ * Clip a segment to a rect-plus-semicircle opening (analytic, same family as
1086
+ * {@link clipSegmentToAabb}).
1087
+ */
1088
+ export declare function clipSegmentToArchedOpening(x1: number, y1: number, x2: number, y2: number, bounds: ArchedOpeningBounds): [number, number, number, number] | null;
1089
+
890
1090
  export declare const ColorPalette: {
891
1091
  CADMIUM_RED: number;
892
1092
  CARDINAL_RED: number;
@@ -959,22 +1159,6 @@ export declare const ColorPalette: {
959
1159
  TITANIUM_WHITE: number;
960
1160
  };
961
1161
 
962
- /**
963
- * Creates an instanced mesh brick wall with running bond pattern.
964
- *
965
- * @example
966
- * ```ts
967
- * const wall = createBrickWall({
968
- * wallWidth: 10,
969
- * wallHeight: 8,
970
- * brickColors: [0x8b4513, 0xa0522d, 0x6b3410],
971
- * colorVariation: true
972
- * });
973
- * scene.add(wall);
974
- * ```
975
- */
976
- export declare function createBrickWall({ wallWidth, wallHeight, brickWidth, brickHeight, brickDepth, mortarGap, offsetPattern, brickColors, colorVariation, positionVariation, rotationVariation, material, }?: BrickWallOptions): InstancedMesh;
977
-
978
1162
  /**
979
1163
  * Function to create cubic Bezier curve points
980
1164
  *
@@ -1010,6 +1194,9 @@ export declare const createCubicCurvePoints: (start: Vector2, control1: Vector2,
1010
1194
  */
1011
1195
  export declare const createDampedCurvePoints: (start: Vector2, end: Vector2, damping: number, segments?: number) => Vector2[];
1012
1196
 
1197
+ /** Dolly in or out along the current view direction. */
1198
+ export declare function createDollyClip(options: DollyClipOptions): CameraClip;
1199
+
1013
1200
  /**
1014
1201
  * Function to create exponential curve points
1015
1202
  *
@@ -1028,6 +1215,9 @@ export declare const createDampedCurvePoints: (start: Vector2, end: Vector2, dam
1028
1215
  */
1029
1216
  export declare const createExponentialCurvePoints: (start: Vector2, end: Vector2, base: number, factor: number, segments?: number) => Vector2[];
1030
1217
 
1218
+ /** Waypoint tour through a sequence of positions. */
1219
+ export declare function createFlythroughClip(options: FlythroughClipOptions): CameraClip;
1220
+
1031
1221
  /**
1032
1222
  * Hexagonal tile pattern factory with density control.
1033
1223
  *
@@ -1084,6 +1274,15 @@ export declare function createHexagonalTilesByRadius(options: HexagonalTileRadiu
1084
1274
  */
1085
1275
  export declare const createLogarithmicCurvePoints: (start: Vector2, end: Vector2, base: number, factor: number, segments?: number) => Vector2[];
1086
1276
 
1277
+ /**
1278
+ * Four clipping planes for a rectangular opening (shadow + mesh clip).
1279
+ * Fragments are discarded when `dot(normal, position) > constant`.
1280
+ */
1281
+ export declare function createOpeningClippingPlanes(width: number, height: number, centerY?: number): Plane[];
1282
+
1283
+ /** Circle the scene — showcase reel orbit. */
1284
+ export declare function createOrbitClip(options: OrbitClipOptions): CameraClip;
1285
+
1087
1286
  /**
1088
1287
  * Function to create parabolic curve points
1089
1288
  *
@@ -1103,6 +1302,12 @@ export declare const createLogarithmicCurvePoints: (start: Vector2, end: Vector2
1103
1302
  */
1104
1303
  export declare const createParabolicCurvePoints: (start: Vector2, end: Vector2, a: number, b: number, c: number, segments?: number) => Vector2[];
1105
1304
 
1305
+ /**
1306
+ * Atmospheric focus drift — slow Ken Burns sway while locked on a subject.
1307
+ * Not a full orbit; subtle back-and-forth for mood and screen capture.
1308
+ */
1309
+ export declare function createPendulumClip(options: PendulumClipOptions): CameraClip;
1310
+
1106
1311
  /**
1107
1312
  * Generates vertices for two triangles based upon a quad.
1108
1313
  *
@@ -1173,6 +1378,17 @@ p2: [number, number, number], p3: [number, number, number], p4: [number, number,
1173
1378
  */
1174
1379
  export declare const createQuadraticCurvePoints: (start: Vector2, control: Vector2, end: Vector2, segments?: number) => Vector2[];
1175
1380
 
1381
+ /**
1382
+ * Create a random source.
1383
+ *
1384
+ * - **No seed** — wraps `Math.random()`. Unique every runtime; default for examples.
1385
+ * - **With seed** — {@link mulberry32} stream. Same seed ⇒ same sequence.
1386
+ */
1387
+ export declare function createRandom(seed?: number): RandomSource;
1388
+
1389
+ /** Hollow square profile extruded for one lattice ring (local XY, facing +Z). */
1390
+ export declare function createRingLatticeGeometry(outer: number, wall: number, depth: number): ExtrudeGeometry;
1391
+
1176
1392
  /**
1177
1393
  * Function to create sigmoid curve points
1178
1394
  *
@@ -1189,6 +1405,23 @@ export declare const createQuadraticCurvePoints: (start: Vector2, control: Vecto
1189
1405
  */
1190
1406
  export declare const createSigmoidCurvePoints: (start: Vector2, end: Vector2, a: number, segments?: number) => Vector2[];
1191
1407
 
1408
+ /**
1409
+ * Scene-transition spiral — orbit upward while looking down at the scene.
1410
+ * Camera rises and optionally widens its orbit; `lookAt` stays on the ground
1411
+ * target so the view pitches into a bird's-eye survey (not a horizontal orbit).
1412
+ */
1413
+ export declare function createSpiralClip(options: SpiralClipOptions): CameraClip;
1414
+
1415
+ /**
1416
+ * Impact wobble — short head-shake / recovery shake (gameplay feedback).
1417
+ * Decaying sinusoidal offset, not random noise. For showcase orbit rigs use
1418
+ * {@link createPendulumClip} instead.
1419
+ */
1420
+ export declare function createWobbleClip(options: WobbleClipOptions): CameraClip;
1421
+
1422
+ /** Focus punch — smooth FOV narrow toward a target. Restores FOV on cancel; keeps end FOV on complete. */
1423
+ export declare function createZoomClip(options: ZoomClipOptions): CameraClip;
1424
+
1192
1425
  export declare const crossfadeShader: {
1193
1426
  uniforms: {
1194
1427
  tDiffuseA: {
@@ -1205,20 +1438,43 @@ export declare const crossfadeShader: {
1205
1438
  fragmentShader: string;
1206
1439
  };
1207
1440
 
1441
+ /**
1442
+ * Cross headstone prefab.
1443
+ */
1208
1444
  export declare class CrossHeadstone extends Mesh<CrossHeadstoneGeometry, MeshStandardMaterial> {
1209
- constructor({ width, height, depth, }?: CrossHeadstoneOptions);
1445
+ readonly width: number;
1446
+ readonly height: number;
1447
+ constructor({ color, roughness, ...geometryOptions }?: CrossHeadstoneOptions);
1210
1448
  }
1211
1449
 
1450
+ /**
1451
+ * Cross headstone — vertical shaft and horizontal arm.
1452
+ *
1453
+ * Local frame: base on Y=0, centered on X/Z.
1454
+ */
1212
1455
  export declare class CrossHeadstoneGeometry extends BufferGeometry {
1213
- constructor(width?: number, height?: number, depth?: number);
1456
+ readonly width: number;
1457
+ readonly height: number;
1458
+ readonly depth: number;
1459
+ constructor({ width, height, depth }?: CrossHeadstoneGeometryOptions);
1214
1460
  }
1215
1461
 
1216
- declare interface CrossHeadstoneOptions {
1462
+ export declare interface CrossHeadstoneGeometryOptions {
1463
+ /** Overall cross width (arm span). Defaults to `0.4`. */
1217
1464
  width?: number;
1465
+ /** Total height. Defaults to `1.2`. */
1218
1466
  height?: number;
1467
+ /** Slab depth. Defaults to `0.2`. */
1219
1468
  depth?: number;
1220
1469
  }
1221
1470
 
1471
+ export declare interface CrossHeadstoneOptions extends CrossHeadstoneGeometryOptions {
1472
+ /** Stone tint. Defaults to `#777777`. */
1473
+ color?: ColorRepresentation;
1474
+ /** Surface roughness. Defaults to `0.8`. */
1475
+ roughness?: number;
1476
+ }
1477
+
1222
1478
  /**
1223
1479
  * Cubic UV Mapping
1224
1480
  * Applies a texture by projecting UVs along each face of a cube.
@@ -1297,6 +1553,22 @@ export declare interface DaySkyUniforms {
1297
1553
  bottomColor: Uniform<Color>;
1298
1554
  }
1299
1555
 
1556
+ /**
1557
+ * Derive an independent sub-stream seed from a master seed and domain salt.
1558
+ *
1559
+ * XOR the salt before mixing so each subsystem gets its own mulberry32 stream
1560
+ * without sequential `seed + 1` collision risk. Use stable hex constants per
1561
+ * domain (`0x101` books, `0x202` fog, `0x303` windows, …).
1562
+ *
1563
+ * @example
1564
+ * ```ts
1565
+ * const master = 1337;
1566
+ * const bookRng = createRandom(deriveSubSeed(master, 0x101));
1567
+ * const fogRng = createRandom(deriveSubSeed(master, 0x202));
1568
+ * ```
1569
+ */
1570
+ export declare function deriveSubSeed(masterSeed: number, salt: number): number;
1571
+
1300
1572
  /**
1301
1573
  * Material indices:
1302
1574
  * 0. Desk surface
@@ -1315,41 +1587,114 @@ export declare class DeskGeometry extends BufferGeometry {
1315
1587
  constructor();
1316
1588
  }
1317
1589
 
1590
+ /** Derive uniform cell size from center-to-corner periods. Legacy — prefer grid counts. */
1591
+ export declare function diamondLatticeCellFromCount(width: number, height: number, cellsAcross: number): number;
1592
+
1593
+ /**
1594
+ * Perpendicular distance from the window center to a corner along the diamond
1595
+ * grid axis (45° families share this spacing when square).
1596
+ */
1597
+ export declare function diamondLatticeCornerSpan(width: number, height: number): number;
1598
+
1599
+ /**
1600
+ * Axis-aligned diamond lattice
1601
+ */
1602
+ export declare interface DiamondLatticeGrid {
1603
+ /** Horizontal half-diagonal of each quarrel (east–west point spacing). */
1604
+ a: number;
1605
+ /** Vertical half-diagonal of each quarrel (north–south point spacing). */
1606
+ b: number;
1607
+ /**
1608
+ * Came angle from +X; the two families run at `+angle` and `−angle`.
1609
+ * Equals 45° only when `a === b`.
1610
+ */
1611
+ angle: number;
1612
+ /** Shared perpendicular spacing for both came families. */
1613
+ spacing: number;
1614
+ }
1615
+
1318
1616
  /**
1319
- * A diorama with a floor and walls.
1617
+ * Build an axis-aligned diamond grid from cell counts.
1320
1618
  *
1321
- * Material indices:
1322
- * 0: Interior walls
1323
- * 1: Floor
1324
- * 2: Exterior walls
1619
+ * `cellsX` quarrels span the width (east–west); `cellsY` span the height.
1620
+ * Equal counts on a square opening yield square diamonds; `5×10` elongates them
1621
+ * vertically while keeping north/south tips on the same vertical axis.
1622
+ */
1623
+ export declare function diamondLatticeGridFromCells(width: number, height: number, cellsX: number, cellsY: number): DiamondLatticeGrid;
1624
+
1625
+ declare interface DiamondLatticePartOptions {
1626
+ width: number;
1627
+ height: number;
1628
+ /** Center Y of the opening in local space. Defaults to `0`. */
1629
+ centerY?: number;
1630
+ grid: DiamondLatticeGrid;
1631
+ leadThickness: number;
1632
+ leadDepth: number;
1633
+ }
1634
+
1635
+ /** Spring-to-apex Y shift that snaps the lattice phase to the rect/arch junction. */
1636
+ export declare function diamondLatticeSpringPhaseShift(ymin: number, rectTopY: number, grid: DiamondLatticeGrid): number;
1637
+
1638
+ /**
1639
+ * Diamond lattice window — diagonal lead cames with axis-aligned quarrels (`<>`).
1640
+ *
1641
+ * Local frame: centered on the opening, XY plane facing +Z. Lead is centered on
1642
+ * `z = 0`; optional glass sits in the same plane (both faces). Pair with
1643
+ * a scene-owned backing plane behind the wall.
1325
1644
  */
1326
- export declare class Diorama extends Mesh<DioramaGeometry, MeshStandardMaterial[]> {
1327
- constructor({ width, height, depth, wallThickness, interiorColor, floorColor, exteriorColor, }?: {
1328
- width?: number | undefined;
1329
- height?: number | undefined;
1330
- depth?: number | undefined;
1331
- wallThickness?: number | undefined;
1332
- interiorColor?: number | undefined;
1333
- floorColor?: number | undefined;
1334
- exteriorColor?: number | undefined;
1335
- });
1645
+ export declare class DiamondLatticeWindow extends Group {
1646
+ readonly lattice: Mesh<DiamondLatticeWindowGeometry, MeshStandardMaterial>;
1647
+ readonly glass?: Mesh<PlaneGeometry, MeshPhysicalMaterial>;
1648
+ readonly cellsX: number;
1649
+ readonly cellsY: number;
1650
+ readonly fittedGrid: DiamondLatticeGrid;
1651
+ constructor({ leadColor, glass, glassColor, glassEmissive, glassEmissiveIntensity, centerY, leadDepth, ...geometryOptions }?: DiamondLatticeWindowOptions);
1336
1652
  }
1337
1653
 
1338
1654
  /**
1339
- * Geometry for a diorama with a floor and walls.
1655
+ * Diamond lattice window outer frame plus diagonal cames.
1656
+ * Quarrel tips align to the vertical and horizontal axes (`<>`).
1657
+ * Built in the XY plane facing +Z.
1340
1658
  *
1341
- * Group indices:
1342
- * 0: Interior walls
1343
- * 1: Floor
1344
- * 2: Exterior walls
1659
+ * Glass is a separate pane on {@link DiamondLatticeWindow} — this geometry is
1660
+ * lead and frame only (casts shadow; glass typically does not).
1345
1661
  */
1346
- export declare class DioramaGeometry extends BufferGeometry {
1347
- constructor({ width, height, depth, wallThickness }?: {
1348
- width?: number | undefined;
1349
- height?: number | undefined;
1350
- depth?: number | undefined;
1351
- wallThickness?: number | undefined;
1352
- });
1662
+ export declare class DiamondLatticeWindowGeometry extends BufferGeometry {
1663
+ readonly cellsX: number;
1664
+ readonly cellsY: number;
1665
+ readonly fittedGrid: DiamondLatticeGrid;
1666
+ constructor({ width, height, leadThickness, leadDepth, cellsX, cellsY, centerY, }?: DiamondLatticeWindowGeometryOptions);
1667
+ }
1668
+
1669
+ declare interface DiamondLatticeWindowGeometryOptions {
1670
+ /** Opening width (world units). */
1671
+ width?: number;
1672
+ /** Opening height (world units). */
1673
+ height?: number;
1674
+ /** Lead came thickness (cross-section). Defaults to `0.055`. */
1675
+ leadThickness?: number;
1676
+ /** Lead depth (Z extent). Defaults to `0.11`. */
1677
+ leadDepth?: number;
1678
+ /** Quarrels spanning east–west across the opening. Defaults to `10`. */
1679
+ cellsX?: number;
1680
+ /** Quarrels spanning north–south across the opening. Defaults to `10`. */
1681
+ cellsY?: number;
1682
+ /** Vertical center of the opening in local geometry space. Defaults to `0`. */
1683
+ centerY?: number;
1684
+ }
1685
+
1686
+ declare interface DiamondLatticeWindowOptions extends DiamondLatticeWindowGeometryOptions {
1687
+ /** Lead + outer frame tint. Defaults to `#0c0f14`. */
1688
+ leadColor?: ColorRepresentation;
1689
+ /**
1690
+ * Optional glass pane centered in the lead depth (`z = 0`), visible from both sides.
1691
+ * Mad-science uses an emissive sky mesh in the scene instead.
1692
+ */
1693
+ glass?: boolean;
1694
+ glassColor?: ColorRepresentation;
1695
+ /** Glass emissive for moonlit / storm backlight. Defaults to off. */
1696
+ glassEmissive?: ColorRepresentation;
1697
+ glassEmissiveIntensity?: number;
1353
1698
  }
1354
1699
 
1355
1700
  /**
@@ -1432,6 +1777,12 @@ export declare const Direction: {
1432
1777
  */
1433
1778
  export declare const displacementBrush: <T extends BufferGeometry>(geometry: T, position: Vector3, radius: number, strength: number, direction?: Vector3, falloffFn?: (distance: number, radius: number) => number) => void;
1434
1779
 
1780
+ export declare interface DollyClipOptions extends CameraClipTiming {
1781
+ /** Distance along view axis — positive pulls back, negative pushes in. */
1782
+ distance: number;
1783
+ ease?: EasingFunction;
1784
+ }
1785
+
1435
1786
  /**
1436
1787
  * Easing functions for interpolating values over time.
1437
1788
  *
@@ -1637,26 +1988,42 @@ export declare interface EmissivePulseEffectOptions {
1637
1988
 
1638
1989
  export declare type EmissivePulseMaterial = MeshStandardMaterial | MeshPhysicalMaterial | MeshLambertMaterial | MeshPhongMaterial;
1639
1990
 
1991
+ /**
1992
+ * Erlenmeyer flask prefab — translucent glass vessel.
1993
+ */
1640
1994
  export declare class ErlenmeyerFlask extends Mesh<ErlenmeyerFlaskGeometry, MeshPhysicalMaterial> {
1641
- constructor({ flaskRadius, //
1642
- neckRadius, height, neckHeight, radialSegments, }?: {
1643
- flaskRadius?: number | undefined;
1644
- neckRadius?: number | undefined;
1645
- height?: number | undefined;
1646
- neckHeight?: number | undefined;
1647
- radialSegments?: number | undefined;
1648
- });
1995
+ constructor({ color, opacity, ...geometryOptions }?: ErlenmeyerFlaskOptions);
1649
1996
  }
1650
1997
 
1998
+ /**
1999
+ * Erlenmeyer flask profile — conical body with straight neck and lip.
2000
+ *
2001
+ * Local frame: base at Y=0.
2002
+ */
1651
2003
  export declare class ErlenmeyerFlaskGeometry extends BufferGeometry {
1652
- constructor({ flaskRadius, //
1653
- neckRadius, height, neckHeight, radialSegments, }?: {
1654
- flaskRadius?: number | undefined;
1655
- neckRadius?: number | undefined;
1656
- height?: number | undefined;
1657
- neckHeight?: number | undefined;
1658
- radialSegments?: number | undefined;
1659
- });
2004
+ readonly flaskRadius: number;
2005
+ readonly height: number;
2006
+ constructor({ flaskRadius, neckRadius, height, neckHeight, radialSegments, }?: ErlenmeyerFlaskGeometryOptions);
2007
+ }
2008
+
2009
+ export declare interface ErlenmeyerFlaskGeometryOptions {
2010
+ /** Flask body radius. Defaults to `1`. */
2011
+ flaskRadius?: number;
2012
+ /** Neck radius. Defaults to `0.3`. */
2013
+ neckRadius?: number;
2014
+ /** Body height before the neck. Defaults to `2.5`. */
2015
+ height?: number;
2016
+ /** Neck height. Defaults to `1`. */
2017
+ neckHeight?: number;
2018
+ /** Lathe segments. Defaults to `16`. */
2019
+ radialSegments?: number;
2020
+ }
2021
+
2022
+ export declare interface ErlenmeyerFlaskOptions extends ErlenmeyerFlaskGeometryOptions {
2023
+ /** Glass tint. Defaults to `#88ccff`. */
2024
+ color?: ColorRepresentation;
2025
+ /** Glass opacity. Defaults to `0.4`. */
2026
+ opacity?: number;
1660
2027
  }
1661
2028
 
1662
2029
  export declare const fadeShader: {
@@ -1732,13 +2099,23 @@ export declare function findClosestColorChannelWise(inputColor: number, dataset:
1732
2099
  */
1733
2100
  export declare function findClosestPoint(point: Vector3, mesh: Mesh): Vector3;
1734
2101
 
2102
+ /**
2103
+ * Snap cell size so diagonal cames align symmetrically at all four frame edges.
2104
+ * Legacy single-spacing helper — prefer {@link diamondLatticeGridFromCells}.
2105
+ */
2106
+ export declare function fitDiamondLatticeCell(width: number, height: number, preferredCell: number): number;
2107
+
2108
+ /**
2109
+ * Emissive flame prefab — parametric teardrop volume for candles and lanterns.
2110
+ *
2111
+ * Local frame: base at Y=0, tip at Y=`height`.
2112
+ */
1735
2113
  export declare class Flame extends Mesh<FlameGeometry, MeshStandardMaterial> {
1736
- constructor({ height, radius, segmentsU, segmentsV }?: {
1737
- height?: number | undefined;
1738
- radius?: number | undefined;
1739
- segmentsU?: number | undefined;
1740
- segmentsV?: number | undefined;
1741
- });
2114
+ readonly height: number;
2115
+ readonly radius: number;
2116
+ readonly segmentsU: number;
2117
+ readonly segmentsV: number;
2118
+ constructor({ color, emissive, emissiveIntensity, ...geometryOptions }?: FlameOptions);
1742
2119
  }
1743
2120
 
1744
2121
  /**
@@ -1788,13 +2165,37 @@ export declare interface FlameFlickerEffectOptions {
1788
2165
  haloOpacity?: number;
1789
2166
  }
1790
2167
 
2168
+ /**
2169
+ * Teardrop flame volume — parametric surface tapering to a point at the top.
2170
+ *
2171
+ * Local frame: base at Y=0, tip at Y=`height`.
2172
+ */
1791
2173
  export declare class FlameGeometry extends ParametricGeometry {
1792
- constructor({ height, radius, segmentsU, segmentsV }?: {
1793
- height?: number | undefined;
1794
- radius?: number | undefined;
1795
- segmentsU?: number | undefined;
1796
- segmentsV?: number | undefined;
1797
- });
2174
+ readonly height: number;
2175
+ readonly radius: number;
2176
+ readonly segmentsU: number;
2177
+ readonly segmentsV: number;
2178
+ constructor({ height, radius, segmentsU, segmentsV, }?: FlameGeometryOptions);
2179
+ }
2180
+
2181
+ export declare interface FlameGeometryOptions {
2182
+ /** Flame tip height. Defaults to `0.25`. */
2183
+ height?: number;
2184
+ /** Base radius at the widest point. Defaults to `0.05`. */
2185
+ radius?: number;
2186
+ /** Parametric segments around the circumference. Defaults to `16`. */
2187
+ segmentsU?: number;
2188
+ /** Parametric segments along the height. Defaults to `16`. */
2189
+ segmentsV?: number;
2190
+ }
2191
+
2192
+ export declare interface FlameOptions extends FlameGeometryOptions {
2193
+ /** Surface tint. Defaults to `#ffd700`. */
2194
+ color?: ColorRepresentation;
2195
+ /** Emissive tint. Defaults to `#ffa500`. */
2196
+ emissive?: ColorRepresentation;
2197
+ /** Emissive strength. Defaults to `0.35`. */
2198
+ emissiveIntensity?: number;
1798
2199
  }
1799
2200
 
1800
2201
  /**
@@ -1810,26 +2211,49 @@ export declare class FlorenceFlaskGeometry extends BufferGeometry {
1810
2211
  constructor();
1811
2212
  }
1812
2213
 
1813
- export declare class Gear extends Mesh {
1814
- constructor({ sides, innerRadius, outerRadius, holeSides, holeRadius, depth }?: {
1815
- sides?: number | undefined;
1816
- innerRadius?: number | undefined;
1817
- outerRadius?: number | undefined;
1818
- holeSides?: number | undefined;
1819
- holeRadius?: number | undefined;
1820
- depth?: number | undefined;
1821
- });
2214
+ export declare interface FlythroughClipOptions extends CameraClipTiming {
2215
+ waypoints: Vector3[];
2216
+ /** Optional look-at points per waypoint; defaults to next waypoint. */
2217
+ lookAt?: Vector3[];
2218
+ ease?: EasingFunction;
1822
2219
  }
1823
2220
 
1824
2221
  /**
1825
- * Extrude geometry of Gear Shape.
2222
+ * Gear shape prefab.
1826
2223
  */
1827
- export declare class GearGeometry extends ExtrudeGeometry {
1828
- constructor(sides?: number, innerRadius?: number, outerRadius?: number, holeSides?: number, holeRadius?: number, depth?: number);
2224
+ export declare class Gear extends Mesh<GearGeometry, MeshStandardMaterial> {
2225
+ constructor({ color, ...geometryOptions }?: GearOptions);
1829
2226
  }
1830
2227
 
1831
- export declare class GearShape extends Shape {
1832
- constructor(sides?: number, innerRadius?: number, outerRadius?: number, holeSides?: number, holeRadius?: number);
2228
+ /**
2229
+ * Extruded gear profile with center hole.
2230
+ */
2231
+ export declare class GearGeometry extends ExtrudeGeometry {
2232
+ constructor({ sides, innerRadius, outerRadius, holeSides, holeRadius, depth, }?: GearGeometryOptions);
2233
+ }
2234
+
2235
+ export declare interface GearGeometryOptions {
2236
+ /** Number of gear teeth. Defaults to `5`. */
2237
+ sides?: number;
2238
+ /** Inner tooth valley radius. Defaults to `0.5`. */
2239
+ innerRadius?: number;
2240
+ /** Outer tooth tip radius. Defaults to `1`. */
2241
+ outerRadius?: number;
2242
+ /** Center hole sides. Defaults to `5`. */
2243
+ holeSides?: number;
2244
+ /** Center hole radius. Defaults to `0.25`. */
2245
+ holeRadius?: number;
2246
+ /** Extrusion depth. Defaults to `0.25`. */
2247
+ depth?: number;
2248
+ }
2249
+
2250
+ export declare interface GearOptions extends GearGeometryOptions {
2251
+ /** Metal tint. Defaults to `#aaaaaa`. */
2252
+ color?: ColorRepresentation;
2253
+ }
2254
+
2255
+ export declare class GearShape extends Shape {
2256
+ constructor(sides?: number, innerRadius?: number, outerRadius?: number, holeSides?: number, holeRadius?: number);
1833
2257
  }
1834
2258
 
1835
2259
  /**
@@ -1876,6 +2300,86 @@ export declare interface GlowHaloOptions {
1876
2300
  opacity?: number;
1877
2301
  }
1878
2302
 
2303
+ /** Pane dimensions derived from opening size and cell counts. */
2304
+ export declare interface GregorianLatticeGrid {
2305
+ /** Width of each rectangular pane. */
2306
+ paneWidth: number;
2307
+ /** Height of each rectangular pane. */
2308
+ paneHeight: number;
2309
+ }
2310
+
2311
+ /**
2312
+ * Derive pane size from cell counts.
2313
+ *
2314
+ * `cellsX` panes span the opening width; `cellsY` span the height. Mullions
2315
+ * divide the opening evenly so every segment is a full rectangle.
2316
+ */
2317
+ export declare function gregorianLatticeGridFromCells(width: number, height: number, cellsX: number, cellsY: number): GregorianLatticeGrid;
2318
+
2319
+ declare interface GregorianLatticePartOptions {
2320
+ width: number;
2321
+ height: number;
2322
+ /** Center Y of the opening in local space. Defaults to `0`. */
2323
+ centerY?: number;
2324
+ cellsX: number;
2325
+ cellsY: number;
2326
+ mullionThickness: number;
2327
+ mullionDepth: number;
2328
+ }
2329
+
2330
+ /**
2331
+ * Gregorian lattice window — rectangular pane grid with orthogonal mullions.
2332
+ *
2333
+ * Local frame: centered on the opening, XY plane facing +Z. Mullions and
2334
+ * optional glass share `z = 0`.
2335
+ */
2336
+ export declare class GregorianLatticeWindow extends Group {
2337
+ readonly mullions: Mesh<GregorianLatticeWindowGeometry, MeshStandardMaterial>;
2338
+ readonly glass?: Mesh<PlaneGeometry, MeshPhysicalMaterial>;
2339
+ readonly cellsX: number;
2340
+ readonly cellsY: number;
2341
+ readonly fittedGrid: GregorianLatticeGrid;
2342
+ constructor({ mullionColor, glass, glassColor, glassEmissive, glassEmissiveIntensity, ...geometryOptions }?: GregorianLatticeWindowOptions);
2343
+ }
2344
+
2345
+ /**
2346
+ * Gregorian lattice window — outer frame plus orthogonal mullions in a rectangular grid.
2347
+ * Built in the XY plane facing +Z.
2348
+ */
2349
+ export declare class GregorianLatticeWindowGeometry extends BufferGeometry {
2350
+ readonly cellsX: number;
2351
+ readonly cellsY: number;
2352
+ readonly fittedGrid: GregorianLatticeGrid;
2353
+ constructor({ width, height, mullionThickness, mullionDepth, cellsX, cellsY, centerY, }?: GregorianLatticeWindowGeometryOptions);
2354
+ }
2355
+
2356
+ declare interface GregorianLatticeWindowGeometryOptions {
2357
+ /** Opening width (world units). */
2358
+ width?: number;
2359
+ /** Opening height (world units). */
2360
+ height?: number;
2361
+ /** Mullion thickness (cross-section). Defaults to `0.055`. */
2362
+ mullionThickness?: number;
2363
+ /** Mullion depth (Z extent). Defaults to `0.11`. */
2364
+ mullionDepth?: number;
2365
+ /** Rectangular panes across the opening width. Defaults to `4`. */
2366
+ cellsX?: number;
2367
+ /** Rectangular panes up the opening height. Defaults to `6`. */
2368
+ cellsY?: number;
2369
+ /** Vertical center of the opening in local geometry space. Defaults to `0`. */
2370
+ centerY?: number;
2371
+ }
2372
+
2373
+ declare interface GregorianLatticeWindowOptions extends GregorianLatticeWindowGeometryOptions {
2374
+ /** Frame + mullion tint. Defaults to `#5c4033` (wood). */
2375
+ mullionColor?: ColorRepresentation;
2376
+ /** Optional glass pane coplanar with the mullions (same Z center). */
2377
+ glass?: boolean;
2378
+ glassColor?: ColorRepresentation;
2379
+ glassEmissive?: ColorRepresentation;
2380
+ glassEmissiveIntensity?: number;
2381
+ }
2382
+
1879
2383
  /**
1880
2384
  * Creeping ground mist — soft horizontal cards drifting above the floor.
1881
2385
  * Interior patches wrap toroidally within `area`; optional perimeter patches
@@ -1906,7 +2410,7 @@ export declare interface GroundFogEffectOptions {
1906
2410
  * horizons opposite the camera. Defaults to `0` (interior only).
1907
2411
  */
1908
2412
  perimeterCount?: number;
1909
- /** Half-extent of the inner bounded plot (fence, wall, diorama edge, etc.). Defaults to `12`. */
2413
+ /** Half-extent of the inner bounded plot (fence, wall, scene edge, etc.). Defaults to `12`. */
1910
2414
  plotHalf?: number;
1911
2415
  /** Terrain half-extent; perimeter cards spill outward toward this edge. Defaults to `16`. */
1912
2416
  terrainHalf?: number;
@@ -1927,32 +2431,135 @@ export declare interface GroundFogEffectOptions {
1927
2431
  heightAt?: (x: number, z: number) => number;
1928
2432
  }
1929
2433
 
1930
- export declare class Heart extends Mesh {
1931
- constructor({ size, width, height, tipDepth, depth }?: {
1932
- size?: number | undefined;
1933
- width?: number | undefined;
1934
- height?: number | undefined;
1935
- tipDepth?: number | undefined;
1936
- depth?: number | undefined;
1937
- });
2434
+ /**
2435
+ * Hanging wrought-iron lantern open cage struts around a solid emissive
2436
+ * inner octahedron (glass-pane lamp). Mount, cage, and lamp use separate
2437
+ * material groups. Pair {@link GlowHalo} and {@link FlameFlickerEffect} at
2438
+ * `cageCenterY` for bloom and flicker.
2439
+ *
2440
+ * Local frame: origin at the chain top (hang point).
2441
+ */
2442
+ export declare class HangingLantern extends Mesh<HangingLanternGeometry, MeshStandardMaterial[]> {
2443
+ readonly drop: number;
2444
+ readonly cageCenterY: number;
2445
+ constructor({ color, mountColor, cageColor, lampColor, lampEmissiveIntensity, lampOpacity, inner, ...geometryOptions }?: HangingLanternOptions);
2446
+ }
2447
+
2448
+ /**
2449
+ * Wrought-iron hanging lantern frame — chain, cap, and open octahedron cage
2450
+ * built from edge struts.
2451
+ *
2452
+ * Material groups: `0` mount (chain + cap), `1` cage struts, `2` inner lamp
2453
+ * (solid octahedron).
2454
+ *
2455
+ * Local frame: origin at the chain top (hang point). The cage top vertex
2456
+ * attaches at the cap center, optionally lowered by `cageGap`.
2457
+ */
2458
+ export declare class HangingLanternGeometry extends BufferGeometry {
2459
+ readonly drop: number;
2460
+ readonly chainWidth: number;
2461
+ readonly capWidth: number;
2462
+ readonly capHeight: number;
2463
+ readonly capDepth: number;
2464
+ readonly capOffset: number;
2465
+ readonly cageRadius: number;
2466
+ readonly cageStretch: number;
2467
+ readonly cageGap: number;
2468
+ readonly cageBarWidth: number;
2469
+ readonly innerScale: number;
2470
+ readonly inner: boolean;
2471
+ /** Y of the cage center in local space (negative, below the hang point). */
2472
+ readonly cageCenterY: number;
2473
+ constructor({ drop, chainWidth, capWidth, capHeight, capDepth, capOffset, cageRadius, cageStretch, cageGap, cageBarWidth, innerScale, inner, }?: HangingLanternGeometryOptions);
2474
+ }
2475
+
2476
+ export declare interface HangingLanternGeometryOptions {
2477
+ /** Chain length from the hang point. Defaults to `3`. */
2478
+ drop?: number;
2479
+ /** Chain link cross-section. Defaults to `0.05`. */
2480
+ chainWidth?: number;
2481
+ /** Cap width (X). Defaults to `0.18`. */
2482
+ capWidth?: number;
2483
+ /** Cap height (Y). Defaults to `0.16`. */
2484
+ capHeight?: number;
2485
+ /** Cap depth (Z). Defaults to `0.18`. */
2486
+ capDepth?: number;
2487
+ /** Cap center offset below the chain bottom. Defaults to `0.02`. */
2488
+ capOffset?: number;
2489
+ /** Cage vertex radius before stretch. Defaults to `0.42`. */
2490
+ cageRadius?: number;
2491
+ /** Vertical stretch on the cage. Defaults to `1.4`. */
2492
+ cageStretch?: number;
2493
+ /** Extra downward offset below the cap-center cage attach. Defaults to `0`. */
2494
+ cageGap?: number;
2495
+ /** Cage strut thickness. Defaults to `0.03`. */
2496
+ cageBarWidth?: number;
2497
+ /** Inner lamp scale relative to the cage (inset to sit inside struts). Defaults to `0.96`. */
2498
+ innerScale?: number;
2499
+ /** Include the solid inner octahedron lamp volume. Defaults to `true`. */
2500
+ inner?: boolean;
2501
+ }
2502
+
2503
+ export declare interface HangingLanternOptions extends HangingLanternGeometryOptions {
2504
+ /** Wrought-iron tint for mount and cage. Defaults to `#171a1f`. */
2505
+ color?: ColorRepresentation;
2506
+ /** Mount iron tint (chain + cap). Defaults to `color`. */
2507
+ mountColor?: ColorRepresentation;
2508
+ /** Cage strut tint. Defaults to `color`. */
2509
+ cageColor?: ColorRepresentation;
2510
+ /** Inner lamp tint (emissive octahedron). Defaults to `#ffb45a`. */
2511
+ lampColor?: ColorRepresentation;
2512
+ /** Inner lamp emissive strength. Defaults to `1.4`. */
2513
+ lampEmissiveIntensity?: number;
2514
+ /** Inner lamp opacity for a glass-pane read. Defaults to `0.88`. */
2515
+ lampOpacity?: number;
1938
2516
  }
1939
2517
 
1940
2518
  /**
1941
- * Extrude geometry of Heart Shape.
2519
+ * Heart shape prefab.
2520
+ */
2521
+ export declare class Heart extends Mesh<HeartGeometry, MeshStandardMaterial> {
2522
+ constructor({ color, emissive, emissiveIntensity, ...geometryOptions }?: HeartOptions);
2523
+ }
2524
+
2525
+ /**
2526
+ * Extruded heart prism.
1942
2527
  */
1943
2528
  export declare class HeartGeometry extends ExtrudeGeometry {
1944
- constructor(size?: number, width?: number, height?: number, tipDepth?: number, depth?: number);
2529
+ constructor({ size, width, height, tipDepth, depth, }?: HeartGeometryOptions);
2530
+ }
2531
+
2532
+ export declare interface HeartGeometryOptions {
2533
+ /** Overall scale factor. Defaults to `1`. */
2534
+ size?: number;
2535
+ /** Heart width. Defaults to `2.1`. */
2536
+ width?: number;
2537
+ /** Heart height. Defaults to `1.4`. */
2538
+ height?: number;
2539
+ /** Tip depth. Defaults to `1.6`. */
2540
+ tipDepth?: number;
2541
+ /** Extrusion depth. Defaults to `0.25`. */
2542
+ depth?: number;
2543
+ }
2544
+
2545
+ export declare interface HeartOptions extends HeartGeometryOptions {
2546
+ /** Surface tint. Defaults to `#c62828`. */
2547
+ color?: ColorRepresentation;
2548
+ /** Emissive tint. Defaults to `#c61416`. */
2549
+ emissive?: ColorRepresentation;
2550
+ /** Emissive strength. Defaults to `0.25`. */
2551
+ emissiveIntensity?: number;
1945
2552
  }
1946
2553
 
1947
2554
  export declare class HeartShape extends Shape {
1948
2555
  constructor(size?: number, width?: number, height?: number, tipDepth?: number);
1949
2556
  }
1950
2557
 
1951
- export declare class Hexagon extends Mesh {
1952
- constructor({ radius, depth }?: {
1953
- radius?: number | undefined;
1954
- depth?: number | undefined;
1955
- });
2558
+ /**
2559
+ * Hexagon tile prefab.
2560
+ */
2561
+ export declare class Hexagon extends Mesh<HexagonGeometry, MeshStandardMaterial> {
2562
+ constructor({ color, emissive, emissiveIntensity, ...geometryOptions }?: HexagonOptions);
1956
2563
  }
1957
2564
 
1958
2565
  export declare interface HexagonalTileCountOptions {
@@ -1974,10 +2581,28 @@ export declare interface HexagonalTileRadiusOptions {
1974
2581
  }
1975
2582
 
1976
2583
  /**
1977
- * Extrude geometry of Hexagon Shape.
2584
+ * Extruded regular hexagon prism.
1978
2585
  */
1979
2586
  export declare class HexagonGeometry extends ExtrudeGeometry {
1980
- constructor(radius?: number, depth?: number);
2587
+ readonly radius: number;
2588
+ readonly depth: number;
2589
+ constructor({ radius, depth }?: HexagonGeometryOptions);
2590
+ }
2591
+
2592
+ export declare interface HexagonGeometryOptions {
2593
+ /** Hex circumradius. Defaults to `1`. */
2594
+ radius?: number;
2595
+ /** Extrusion depth. Defaults to `0.01`. */
2596
+ depth?: number;
2597
+ }
2598
+
2599
+ export declare interface HexagonOptions extends HexagonGeometryOptions {
2600
+ /** Surface tint. Defaults to `#ffffff`. */
2601
+ color?: ColorRepresentation;
2602
+ /** Emissive tint. Defaults to `#ffffff`. */
2603
+ emissive?: ColorRepresentation;
2604
+ /** Emissive strength. Defaults to `0.1`. */
2605
+ emissiveIntensity?: number;
1981
2606
  }
1982
2607
 
1983
2608
  export declare class HexagonShape extends Shape {
@@ -1992,28 +2617,42 @@ export declare function hexToHsl(hex: number): [number, number, number];
1992
2617
  */
1993
2618
  export declare function hexToRgb(hex: number): [number, number, number];
1994
2619
 
2620
+ /**
2621
+ * Hill prefab — hemispherical terrain mound.
2622
+ */
1995
2623
  export declare class Hill extends Mesh<HillGeometry, MeshStandardMaterial> {
1996
- constructor({ radius, //
1997
- height, widthSegments, heightSegments, phiStart, phiLength, }?: {
1998
- radius?: number | undefined;
1999
- height?: number | undefined;
2000
- widthSegments?: number | undefined;
2001
- heightSegments?: number | undefined;
2002
- phiStart?: number | undefined;
2003
- phiLength?: number | undefined;
2004
- });
2624
+ readonly radius: number;
2625
+ readonly height: number;
2626
+ constructor({ color, ...geometryOptions }?: HillOptions);
2005
2627
  }
2006
2628
 
2629
+ /**
2630
+ * Hemispherical hill — a sphere cap scaled on Y, base on the Y=0 plane.
2631
+ */
2007
2632
  export declare class HillGeometry extends BufferGeometry {
2008
- constructor({ radius, //
2009
- height, widthSegments, heightSegments, phiStart, phiLength, }?: {
2010
- radius?: number | undefined;
2011
- height?: number | undefined;
2012
- widthSegments?: number | undefined;
2013
- heightSegments?: number | undefined;
2014
- phiStart?: number | undefined;
2015
- phiLength?: number | undefined;
2016
- });
2633
+ readonly radius: number;
2634
+ readonly height: number;
2635
+ constructor({ radius, height, widthSegments, heightSegments, phiStart, phiLength, }?: HillGeometryOptions);
2636
+ }
2637
+
2638
+ export declare interface HillGeometryOptions {
2639
+ /** Base sphere radius before vertical squash. Defaults to `3`. */
2640
+ radius?: number;
2641
+ /** Peak height. Defaults to `0.6`. */
2642
+ height?: number;
2643
+ /** Horizontal segments. Defaults to `64`. */
2644
+ widthSegments?: number;
2645
+ /** Vertical segments. Defaults to `16`. */
2646
+ heightSegments?: number;
2647
+ /** Azimuth start angle (radians). Defaults to `0`. */
2648
+ phiStart?: number;
2649
+ /** Azimuth sweep (radians). Defaults to `2π`. */
2650
+ phiLength?: number;
2651
+ }
2652
+
2653
+ export declare interface HillOptions extends HillGeometryOptions {
2654
+ /** Surface tint. Defaults to `#00ff00`. */
2655
+ color?: ColorRepresentation;
2017
2656
  }
2018
2657
 
2019
2658
  /**
@@ -2030,6 +2669,9 @@ export declare function hslToHex(h: number, s: number, l: number): [number, numb
2030
2669
 
2031
2670
  export declare function hslToRgb(h: number, s: number, l: number): [number, number, number];
2032
2671
 
2672
+ /** Inset opening for frame ring inner edge (uniform `inset` wall thickness). */
2673
+ export declare function insetArchedOpeningMetrics(outer: ArchedOpeningMetrics, inset: number): ArchedOpeningMetrics;
2674
+
2033
2675
  /**
2034
2676
  * Generates an array of interpolated 2D points using an easing function.
2035
2677
  * @param curveFunction - The easing function to apply to the normalized value.
@@ -2062,8 +2704,110 @@ export declare class JarGeometry extends BufferGeometry {
2062
2704
  constructor();
2063
2705
  }
2064
2706
 
2065
- export declare class Lantern extends Group {
2066
- constructor(height?: number, baseWidth?: number);
2707
+ /**
2708
+ * Tabletop lantern — frame around an emissive glass body. Geometry only; add
2709
+ * {@link GlowHalo} and {@link FlameFlickerEffect} at `lampCenterY` in the
2710
+ * scene.
2711
+ *
2712
+ * Local frame: sits on the Y=0 plane.
2713
+ */
2714
+ export declare class Lantern extends Mesh<LanternGeometry, MeshStandardMaterial[]> {
2715
+ readonly lampCenterY: number;
2716
+ constructor({ color, lampColor, lampEmissiveIntensity, lampOpacity, inner, ...geometryOptions }?: LanternOptions);
2717
+ }
2718
+
2719
+ /**
2720
+ * Tabletop lantern — wood/metal base, roof, and handle framing an emissive
2721
+ * glass body.
2722
+ *
2723
+ * Material groups: `0` frame (base + roof + handle), `1` glass body.
2724
+ *
2725
+ * Local frame: sits on the Y=0 plane; lamp center at `lampCenterY`.
2726
+ */
2727
+ export declare class LanternGeometry extends BufferGeometry {
2728
+ readonly baseWidth: number;
2729
+ readonly bodyHeight: number;
2730
+ readonly baseHeight: number;
2731
+ readonly innerScale: number;
2732
+ readonly inner: boolean;
2733
+ readonly lampCenterY: number;
2734
+ constructor({ baseWidth, bodyHeight, baseHeight, roofHeight, roofRadius, glassRadiusScale, innerScale, handleRadius, handleTubeRadius, handleLift, segments, inner, }?: LanternGeometryOptions);
2735
+ }
2736
+
2737
+ export declare interface LanternGeometryOptions {
2738
+ /** Base / foot radius. Defaults to `0.5`. */
2739
+ baseWidth?: number;
2740
+ /** Glass body height. Defaults to `1.3`. */
2741
+ bodyHeight?: number;
2742
+ /** Base height. Defaults to `0.2`. */
2743
+ baseHeight?: number;
2744
+ /** Roof cone height. Defaults to `0.5`. */
2745
+ roofHeight?: number;
2746
+ /** Roof cone radius. Defaults to `baseWidth * 1.1`. */
2747
+ roofRadius?: number;
2748
+ /** Glass radius relative to `baseWidth`. Defaults to `0.9`. */
2749
+ glassRadiusScale?: number;
2750
+ /** Glass height inset relative to `bodyHeight`. Defaults to `0.96`. */
2751
+ innerScale?: number;
2752
+ /** Carry-handle major radius. Defaults to `baseWidth * 0.8`. */
2753
+ handleRadius?: number;
2754
+ /** Carry-handle tube radius. Defaults to `0.05`. */
2755
+ handleTubeRadius?: number;
2756
+ /** Gap above the roof to the handle center. Defaults to `0.35`. */
2757
+ handleLift?: number;
2758
+ /** Radial segments on round parts. Defaults to `8`. */
2759
+ segments?: number;
2760
+ /** Include the emissive glass body. Defaults to `true`. */
2761
+ inner?: boolean;
2762
+ }
2763
+
2764
+ export declare interface LanternOptions extends LanternGeometryOptions {
2765
+ /** Frame tint (base, roof, handle). Defaults to `#8b4513`. */
2766
+ color?: ColorRepresentation;
2767
+ /** Glass lamp tint. Defaults to `#ffd700`. */
2768
+ lampColor?: ColorRepresentation;
2769
+ /** Glass emissive strength. Defaults to `1.2`. */
2770
+ lampEmissiveIntensity?: number;
2771
+ /** Glass opacity. Defaults to `0.75`. */
2772
+ lampOpacity?: number;
2773
+ }
2774
+
2775
+ /**
2776
+ * Folded autumn leaf prefab — {@link LeafGeometry} with flat-shaded double-sided
2777
+ * material matching the graveyard blowing-leaves look.
2778
+ *
2779
+ * Local frame: tip at +Y, base at −Y, fold rises along +Z.
2780
+ */
2781
+ export declare class Leaf extends Mesh<LeafGeometry, MeshStandardMaterial> {
2782
+ readonly size: number;
2783
+ readonly lift: number;
2784
+ constructor({ color, ...geometryOptions }?: LeafOptions);
2785
+ }
2786
+
2787
+ /**
2788
+ * Low-poly folded leaf — a pointed ellipse with a gently raised midrib so it
2789
+ * catches rim light instead of reading as a flat sliver. Spine vertices sit
2790
+ * slightly above the mirrored rim outline, giving a soft V cross-section under
2791
+ * flat shading.
2792
+ *
2793
+ * Local frame: tip at +Y, base at −Y, fold rises along +Z.
2794
+ */
2795
+ export declare class LeafGeometry extends BufferGeometry {
2796
+ readonly size: number;
2797
+ readonly lift: number;
2798
+ constructor({ size, lift }?: LeafGeometryOptions);
2799
+ }
2800
+
2801
+ export declare interface LeafGeometryOptions {
2802
+ /** Overall leaf scale. Defaults to `0.13`. */
2803
+ size?: number;
2804
+ /** Midrib rise above the rim as a fraction of size. Defaults to `0.22`. */
2805
+ lift?: number;
2806
+ }
2807
+
2808
+ export declare interface LeafOptions extends LeafGeometryOptions {
2809
+ /** Leaf tint. Defaults to `#a8702c`. */
2810
+ color?: ColorRepresentation;
2067
2811
  }
2068
2812
 
2069
2813
  export declare class LeverPanel extends Group {
@@ -2142,7 +2886,7 @@ export declare const LineEquations: {
2142
2886
  * @param {number} [max=1] - Maximum value of the range.
2143
2887
  * @returns {number} A random number between `min` and `max`, skewed towards `max`.
2144
2888
  */
2145
- export declare function logarithmicRandomMax(exponent?: number, min?: number, max?: number): number;
2889
+ export declare function logarithmicRandomMax(exponent?: number, min?: number, max?: number, source?: RandomSource): number;
2146
2890
 
2147
2891
  /**
2148
2892
  * Generates a random number skewed towards the minimum value.
@@ -2154,10 +2898,56 @@ export declare function logarithmicRandomMax(exponent?: number, min?: number, ma
2154
2898
  * @param {number} [max=1] - Maximum value of the range.
2155
2899
  * @returns {number} A random number between `min` and `max`, skewed towards `min`.
2156
2900
  */
2157
- export declare function logarithmicRandomMin(exponent?: number, min?: number, max?: number): number;
2901
+ export declare function logarithmicRandomMin(exponent?: number, min?: number, max?: number, source?: RandomSource): number;
2158
2902
 
2903
+ /**
2904
+ * L-shaped staircase prefab — two flights with a square width × width landing.
2905
+ */
2906
+ export declare class LShapedStaircase extends Mesh<LShapedStaircaseGeometry, MeshStandardMaterial> {
2907
+ readonly width: number;
2908
+ readonly riserHeight: number;
2909
+ readonly treadDepth: number;
2910
+ readonly stepsPerFlight: number;
2911
+ readonly landingSize: number;
2912
+ readonly flightRun: number;
2913
+ readonly totalHeight: number;
2914
+ constructor({ color, ...geometryOptions }?: LShapedStaircaseOptions);
2915
+ }
2916
+
2917
+ /**
2918
+ * L-shaped staircase with a square landing (width × width) at the 90° turn.
2919
+ *
2920
+ * Local frame:
2921
+ * - First flight climbs +Z, centered on X = 0.
2922
+ * - Landing is a width² platform starting at the last tread (no cantilever over
2923
+ * the lower flight) and extending forward at the turn.
2924
+ * - Second flight climbs −X from the left edge of the landing.
2925
+ */
2159
2926
  export declare class LShapedStaircaseGeometry extends BufferGeometry {
2160
- constructor(stepWidth?: number, stepHeight?: number, stepDepth?: number, numStepsPerFlight?: number, landingDepth?: number);
2927
+ readonly width: number;
2928
+ readonly riserHeight: number;
2929
+ readonly treadDepth: number;
2930
+ readonly stepsPerFlight: number;
2931
+ readonly landingSize: number;
2932
+ readonly flightRun: number;
2933
+ readonly totalHeight: number;
2934
+ constructor({ width, riserHeight, treadDepth, stepsPerFlight, }?: LShapedStaircaseGeometryOptions);
2935
+ }
2936
+
2937
+ export declare interface LShapedStaircaseGeometryOptions {
2938
+ /** Stair width (tread left–right extent). Defaults to `2`. */
2939
+ width?: number;
2940
+ /** Vertical rise per step (riser). Defaults to `0.3`. */
2941
+ riserHeight?: number;
2942
+ /** Horizontal run per step (tread depth). Defaults to `0.5`. */
2943
+ treadDepth?: number;
2944
+ /** Steps in each flight (before and after the landing). Defaults to `5`. */
2945
+ stepsPerFlight?: number;
2946
+ }
2947
+
2948
+ export declare interface LShapedStaircaseOptions extends LShapedStaircaseGeometryOptions {
2949
+ /** Tread and riser tint. Defaults to `#8b4513`. */
2950
+ color?: ColorRepresentation;
2161
2951
  }
2162
2952
 
2163
2953
  /**
@@ -2188,24 +2978,6 @@ export declare class Microscope extends Group {
2188
2978
  constructor();
2189
2979
  }
2190
2980
 
2191
- export declare class Moon extends Mesh<SphereGeometry, ShaderMaterial> {
2192
- constructor();
2193
- }
2194
-
2195
- /**
2196
- * Moon shader
2197
- * Simple moon effect with noise
2198
- */
2199
- export declare const moonShader: {
2200
- uniforms: {
2201
- time: {
2202
- value: number;
2203
- };
2204
- };
2205
- vertexShader: string;
2206
- fragmentShader: string;
2207
- };
2208
-
2209
2981
  export declare class MortarAndPestle extends Group {
2210
2982
  constructor();
2211
2983
  }
@@ -2215,81 +2987,92 @@ export declare class MortarGeometry extends BufferGeometry {
2215
2987
  }
2216
2988
 
2217
2989
  /**
2218
- * Material indices:
2219
- * 0. Rocks
2220
- * 1. Moss
2990
+ * Mossy rock prefab — grey stone with a translucent green moss shell.
2991
+ *
2992
+ * Material groups: `0` rock, `1` moss.
2221
2993
  */
2222
- export declare class MossyRocks extends Mesh<MossyRocksGeometry, MeshStandardMaterial[]> {
2223
- constructor();
2994
+ export declare class MossyRock extends Mesh<MossyRockGeometry, MeshStandardMaterial[]> {
2995
+ constructor({ rockColor, mossColor, mossOpacity, ...geometryOptions }?: MossyRockOptions);
2224
2996
  }
2225
2997
 
2226
2998
  /**
2227
- * Group indices:
2228
- * 0. Rocks
2229
- * 1. Moss
2999
+ * Mossy rock — dodecahedron body with a smaller, flatter moss shell (group 1).
3000
+ *
3001
+ * Material groups: `0` rock, `1` moss.
3002
+ *
3003
+ * Local frame: centered on the rock body.
2230
3004
  */
2231
- export declare class MossyRocksGeometry extends BufferGeometry {
2232
- constructor();
3005
+ export declare class MossyRockGeometry extends BufferGeometry {
3006
+ readonly radius: number;
3007
+ readonly detail: number;
3008
+ constructor({ radius, detail, mossScaleXZ, mossScaleY, mossOffsetY, }?: MossyRockGeometryOptions);
3009
+ }
3010
+
3011
+ export declare interface MossyRockGeometryOptions {
3012
+ /** Rock dodecahedron radius. Defaults to `1`. */
3013
+ radius?: number;
3014
+ /** Dodecahedron detail level. Defaults to `0`. */
3015
+ detail?: number;
3016
+ /** Moss horizontal scale relative to the rock. Defaults to `0.9`. */
3017
+ mossScaleXZ?: number;
3018
+ /** Moss vertical scale relative to the rock. Defaults to `0.5`. */
3019
+ mossScaleY?: number;
3020
+ /** Moss center offset above the rock origin. Defaults to `0.3`. */
3021
+ mossOffsetY?: number;
3022
+ }
3023
+
3024
+ export declare interface MossyRockOptions extends MossyRockGeometryOptions {
3025
+ /** Rock tint. Defaults to `#808080`. */
3026
+ rockColor?: ColorRepresentation;
3027
+ /** Moss tint. Defaults to `#4b8b3b`. */
3028
+ mossColor?: ColorRepresentation;
3029
+ /** Moss opacity. Defaults to `0.8`. */
3030
+ mossOpacity?: number;
2233
3031
  }
2234
3032
 
2235
3033
  /**
2236
- * Mound-like mesh with a flat top.
2237
- *
2238
- * To create a radius based on a desired width:
2239
- * ```
2240
- * const mound = new Mound({
2241
- * radius: radiusFromCapWidth(5, Math.PI / 10),
2242
- * }
2243
- * ```
2244
- *
2245
- * To create a radius based on a desired height:
2246
- * ```
2247
- * const mound = new Mound({
2248
- * radius: radiusFromCapHeight(5, Math.PI / 10),
2249
- * }
2250
- * ```
3034
+ * Mound prefab flat-topped terrain cap.
2251
3035
  */
2252
3036
  export declare class Mound extends Mesh<MoundGeometry, MeshStandardMaterial> {
2253
- constructor({ radius, //
2254
- widthSegments, heightSegments, phiStart, phiLength, thetaLength, }?: {
2255
- radius?: number | undefined;
2256
- widthSegments?: number | undefined;
2257
- heightSegments?: number | undefined;
2258
- phiStart?: number | undefined;
2259
- phiLength?: number | undefined;
2260
- thetaLength?: number | undefined;
2261
- });
3037
+ readonly radius: number;
3038
+ constructor({ color, radius, ...geometryOptions }?: MoundOptions);
2262
3039
  }
2263
3040
 
2264
3041
  /**
2265
- * Mound-like geometry with a flat top.
2266
- *
2267
- * To create a radius based on a desired width:
2268
- * ```
2269
- * const moundGeometry = new MoundGeometry({
2270
- * radius: radiusFromCapWidth(5, Math.PI / 10),
2271
- * }
2272
- * ```
2273
- *
2274
- * To create a radius based on a desired height:
2275
- * ```
2276
- * const moundGeometry = new MoundGeometry({
2277
- * radius: radiusFromCapHeight(5, Math.PI / 10),
2278
- * }
2279
- * ```
3042
+ * Mound-like geometry with a flat top — sphere cap, base on Y=0.
2280
3043
  */
2281
3044
  export declare class MoundGeometry extends BufferGeometry {
2282
- constructor({ radius, //
2283
- widthSegments, heightSegments, phiStart, phiLength, thetaLength, }?: {
2284
- radius?: number | undefined;
2285
- widthSegments?: number | undefined;
2286
- heightSegments?: number | undefined;
2287
- phiStart?: number | undefined;
2288
- phiLength?: number | undefined;
2289
- thetaLength?: number | undefined;
2290
- });
3045
+ readonly radius: number;
3046
+ readonly thetaLength: number;
3047
+ constructor({ radius, widthSegments, heightSegments, phiStart, phiLength, thetaLength, }?: MoundGeometryOptions);
3048
+ }
3049
+
3050
+ export declare interface MoundGeometryOptions {
3051
+ /** Sphere radius. Defaults to a cap width of `5` at `thetaLength`. */
3052
+ radius?: number;
3053
+ /** Horizontal segments. Defaults to `64`. */
3054
+ widthSegments?: number;
3055
+ /** Vertical segments. Defaults to `32`. */
3056
+ heightSegments?: number;
3057
+ /** Azimuth start angle (radians). Defaults to `0`. */
3058
+ phiStart?: number;
3059
+ /** Azimuth sweep (radians). Defaults to `2π`. */
3060
+ phiLength?: number;
3061
+ /** Polar sweep from the north pole (radians). Defaults to `π/10`. */
3062
+ thetaLength?: number;
3063
+ }
3064
+
3065
+ export declare interface MoundOptions extends MoundGeometryOptions {
3066
+ /** Surface tint. Defaults to `#00ff00`. */
3067
+ color?: ColorRepresentation;
2291
3068
  }
2292
3069
 
3070
+ /**
3071
+ * Fast seeded PRNG — portfolio Gotham/Water parity.
3072
+ * Returns a closure yielding floats in [0, 1).
3073
+ */
3074
+ export declare function mulberry32(seed: number): RandomStream;
3075
+
2293
3076
  export declare class NightSkybox extends Mesh {
2294
3077
  geometry: SphereGeometry;
2295
3078
  material: ShaderMaterial & {
@@ -2376,17 +3159,47 @@ export declare function normalizeUV(uv: [number, number], minU: number, maxU: nu
2376
3159
  */
2377
3160
  export declare function normalizeUVBatch(uvs: [number, number][], minBounds: [number, number], maxBounds: [number, number]): [number, number][];
2378
3161
 
3162
+ /**
3163
+ * Obelisk headstone prefab.
3164
+ */
2379
3165
  export declare class ObeliskHeadstone extends Mesh<ObeliskHeadstoneGeometry, MeshStandardMaterial> {
2380
- constructor({ totalHeight, baseWidth }?: ObeliskHeadstoneOptions);
3166
+ readonly totalHeight: number;
3167
+ constructor({ color, roughness, ...geometryOptions }?: ObeliskHeadstoneOptions);
2381
3168
  }
2382
3169
 
3170
+ /**
3171
+ * Tiered obelisk headstone with pyramid cap.
3172
+ *
3173
+ * Local frame: base on Y=0, centered on X/Z.
3174
+ */
2383
3175
  export declare class ObeliskHeadstoneGeometry extends BufferGeometry {
2384
- constructor(totalHeight?: number, baseWidth?: number);
3176
+ readonly totalHeight: number;
3177
+ readonly baseWidth: number;
3178
+ constructor({ totalHeight, baseWidth }?: ObeliskHeadstoneGeometryOptions);
2385
3179
  }
2386
3180
 
2387
- declare interface ObeliskHeadstoneOptions {
2388
- baseWidth?: number;
3181
+ export declare interface ObeliskHeadstoneGeometryOptions {
3182
+ /** Total monument height. Defaults to `1.75`. */
2389
3183
  totalHeight?: number;
3184
+ /** Base platform width. Defaults to `0.75`. */
3185
+ baseWidth?: number;
3186
+ }
3187
+
3188
+ export declare interface ObeliskHeadstoneOptions extends ObeliskHeadstoneGeometryOptions {
3189
+ /** Stone tint. Defaults to `#777777`. */
3190
+ color?: ColorRepresentation;
3191
+ /** Surface roughness. Defaults to `0.8`. */
3192
+ roughness?: number;
3193
+ }
3194
+
3195
+ export declare interface OrbitClipOptions extends CameraClipTiming {
3196
+ target: Vector3;
3197
+ /** Horizontal distance from target. Defaults to current camera distance. */
3198
+ radius?: number;
3199
+ /** Elevation above target Y in radians. Defaults to current camera elevation. */
3200
+ elevation?: number;
3201
+ /** Revolutions over the clip. Defaults to `1`. */
3202
+ revolutions?: number;
2390
3203
  }
2391
3204
 
2392
3205
  /**
@@ -2456,6 +3269,17 @@ export declare const ParametricCurveUtils: {
2456
3269
  */
2457
3270
  export declare function parseHexCode(hex: string): [number, number, number];
2458
3271
 
3272
+ export declare interface PendulumClipOptions extends CameraClipTiming {
3273
+ target: Vector3;
3274
+ /** Distance from target. Defaults to current camera distance. */
3275
+ distance?: number;
3276
+ /** Peak azimuth swing in radians — keep small for Ken Burns mood (e.g. `0.12`). */
3277
+ azimuthAmplitude?: number;
3278
+ /** Slow back-and-forth cycles over the clip. Defaults to `2`. */
3279
+ oscillations?: number;
3280
+ ease?: EasingFunction;
3281
+ }
3282
+
2459
3283
  /**
2460
3284
  * Soft, slow-drifting petals (or leaves) falling through a bounded volume —
2461
3285
  * cherry-blossom float rather than stiff tumble. Each instance drifts downward
@@ -2710,18 +3534,126 @@ export declare interface RainEffectOptions {
2710
3534
  intensity?: number;
2711
3535
  }
2712
3536
 
3537
+ /**
3538
+ * Grouped exports — same function API, namespace import like {@link Easing}.
3539
+ *
3540
+ * @example
3541
+ * ```ts
3542
+ * import { Random } from "three-low-poly";
3543
+ * const rng = Random.create(deriveSubSeed(1337, 0x101));
3544
+ * ```
3545
+ */
3546
+ export declare const Random: {
3547
+ readonly create: typeof createRandom;
3548
+ readonly mulberry32: typeof mulberry32;
3549
+ readonly splitmix32: typeof splitmix32;
3550
+ readonly deriveSubSeed: typeof deriveSubSeed;
3551
+ readonly range: typeof randomRange;
3552
+ readonly pick: typeof randomPick;
3553
+ };
3554
+
2713
3555
  /**
2714
3556
  * Generates a random number between `min` and `max`.
2715
3557
  */
2716
- export declare function randomFloat(min?: number, max?: number): number;
3558
+ export declare function randomFloat(min?: number, max?: number, source?: RandomSource): number;
2717
3559
 
2718
3560
  /**
2719
3561
  * Generates a random integer between `min` and `max`.
2720
3562
  */
2721
- export declare function randomInteger(min?: number, max?: number): number;
3563
+ export declare function randomInteger(min?: number, max?: number, source?: RandomSource): number;
3564
+
3565
+ /** Pick from a non-empty array using any stream — website `pick()` parity. */
3566
+ export declare function randomPick<T>(stream: RandomStream, arr: readonly T[]): T;
3567
+
3568
+ /** Float in [min, max) from any stream — website `range()` parity. */
3569
+ export declare function randomRange(stream: RandomStream, min: number, max: number): number;
3570
+
3571
+ /**
3572
+ * Random source — a stream plus distribution helpers.
3573
+ * Returned by {@link createRandom}; also accepted by {@link RandomNumberUtils}.
3574
+ */
3575
+ export declare interface RandomSource {
3576
+ /** `true` when backed by {@link mulberry32}; `false` when using `Math.random()`. */
3577
+ readonly seeded: boolean;
3578
+ /** Next float in [0, 1). */
3579
+ next(): number;
3580
+ /** Float in [min, max). */
3581
+ float(min?: number, max?: number): number;
3582
+ /** Integer in [min, max] (inclusive). */
3583
+ int(min?: number, max?: number): number;
3584
+ /** Uniform element from a non-empty array. */
3585
+ pick<T>(arr: readonly T[]): T;
3586
+ /** `true` with given probability (default 0.5). */
3587
+ boolean(probability?: number): boolean;
3588
+ /**
3589
+ * Skew toward `max`. Lower `exponent` = stronger bias.
3590
+ * Mirrors {@link logarithmicRandomMax}.
3591
+ */
3592
+ skewMax(exponent?: number, min?: number, max?: number): number;
3593
+ /**
3594
+ * Skew toward `min`. Lower `exponent` = stronger bias.
3595
+ * Mirrors {@link logarithmicRandomMin}.
3596
+ */
3597
+ skewMin(exponent?: number, min?: number, max?: number): number;
3598
+ }
3599
+
3600
+ /**
3601
+ * Randomness for procedural generation — unseeded by default, reproducible on demand.
3602
+ *
3603
+ * ---
3604
+ *
3605
+ * ### Layer 1 — stream primitive (portfolio parity)
3606
+ *
3607
+ * - {@link mulberry32} — fast seeded PRNG; returns a `() => number` closure yielding
3608
+ * floats in `[0, 1)`. Same algorithm as Gotham/Water on the portfolio site.
3609
+ *
3610
+ * ### Seed mixing
3611
+ *
3612
+ * - {@link splitmix32} — mixer only, **not** a stream. Maps one 32-bit value to another.
3613
+ * - {@link deriveSubSeed} — `splitmix32(masterSeed ^ salt)`. Fan one user-facing master
3614
+ * seed into independent sub-streams per subsystem. Use stable hex salts per domain
3615
+ * (`0x101` books, `0x202` fog, `0x303` windows, …) instead of `seed + n` offsets.
3616
+ *
3617
+ * ### Layer 2 — library ergonomics
3618
+ *
3619
+ * - {@link createRandom} — **no seed** → wraps `Math.random()`, unique every runtime
3620
+ * (showcase default). **With seed** → {@link mulberry32} stream, same seed ⇒ same sequence.
3621
+ * - Returns a {@link RandomSource}: `next`, `float`, `int`, `pick`, `boolean`, `skewMax`, `skewMin`.
3622
+ * - {@link Random} namespace — grouped exports, same API as standalone functions (like {@link Easing}).
3623
+ *
3624
+ * ### Layer 3 — {@link RandomNumberUtils}
3625
+ *
3626
+ * Existing helpers (`randomFloat`, `logarithmicRandomMax`, …) accept an optional
3627
+ * {@link RandomSource} as their last argument. Omit it for unseeded default behavior.
3628
+ *
3629
+ * ---
3630
+ *
3631
+ * @example Unique runtime (default)
3632
+ * ```ts
3633
+ * const rng = createRandom();
3634
+ * rng.float(0, 10); // different every page load
3635
+ * ```
3636
+ *
3637
+ * @example Reproducible layout with sub-seeds
3638
+ * ```ts
3639
+ * const master = 1337;
3640
+ * const books = createRandom(deriveSubSeed(master, 0x101));
3641
+ * const fog = createRandom(deriveSubSeed(master, 0x202));
3642
+ * ```
3643
+ *
3644
+ * @example Namespace import
3645
+ * ```ts
3646
+ * const rng = Random.create(deriveSubSeed(1337, 0x101));
3647
+ * ```
3648
+ */
3649
+ /** Callable stream returning floats in [0, 1). */
3650
+ export declare type RandomStream = () => number;
2722
3651
 
2723
3652
  export declare function randomTransformVertices<T extends BufferGeometry>(geometry: T, axis?: Vector3, minScale?: number, maxScale?: number): T;
2724
3653
 
3654
+ /** Resolve uniform ring spacing — `cell` wins over the `cellsX` density hint. */
3655
+ export declare function resolveRingLatticeCell(width: number, _height: number, cell?: number, cellsX?: number): number;
3656
+
2725
3657
  export declare function rgbToHex(r: number, g: number, b: number): number;
2726
3658
 
2727
3659
  /**
@@ -2736,20 +3668,133 @@ export declare function rgbToHex(r: number, g: number, b: number): number;
2736
3668
  */
2737
3669
  export declare function rgbToHsl(r: number, g: number, b: number): [number, number, number];
2738
3670
 
3671
+ /** Ring-spacing factor — overlap tightens as this approaches 1. */
3672
+ export declare const RING_LATTICE_SPACING_FACTOR = 0.96;
3673
+
3674
+ declare interface RingLatticeFramePartOptions {
3675
+ width: number;
3676
+ height: number;
3677
+ centerY?: number;
3678
+ frameThickness: number;
3679
+ frameDepth: number;
3680
+ }
3681
+
3682
+ export declare interface RingLatticeGrid {
3683
+ /** Requested ring-center spacing before the overlap factor. */
3684
+ cell: number;
3685
+ /** Effective center spacing (`cell × 0.96`). */
3686
+ latticeCell: number;
3687
+ /** Outer half-extent of each square ring profile. */
3688
+ ringOuter: number;
3689
+ /** Ring instance count. */
3690
+ count: number;
3691
+ }
3692
+
3693
+ declare interface RingLatticeSpotOptions {
3694
+ width: number;
3695
+ height: number;
3696
+ centerY?: number;
3697
+ cell: number;
3698
+ }
3699
+
3700
+ /** Ring-center positions overscanning the opening (stencil trims the excess). */
3701
+ export declare function ringLatticeSpots({ width, height, centerY, cell, }: RingLatticeSpotOptions): {
3702
+ spots: [number, number][];
3703
+ grid: RingLatticeGrid;
3704
+ };
3705
+
3706
+ /**
3707
+ * Ring lattice window — overlapping square rings on a uniform grid (diaper /
3708
+ * trellis fretwork), stencil-clipped to a rectangular opening.
3709
+ */
3710
+ export declare class RingLatticeWindow extends Group {
3711
+ readonly lattice: InstancedMesh;
3712
+ readonly frame: Mesh;
3713
+ readonly glass?: Mesh<PlaneGeometry, MeshPhysicalMaterial>;
3714
+ readonly cell: number;
3715
+ readonly fittedGrid: RingLatticeGrid;
3716
+ private readonly clipPlanesLocal;
3717
+ private readonly clipPlanesWorld;
3718
+ constructor({ width, height, cell: cellOption, cellsX, centerY, ringThickness, ringDepth, frameThickness, frameDepth, latticeColor, glass, glassColor, glassEmissive, glassEmissiveIntensity, }?: RingLatticeWindowOptions);
3719
+ }
3720
+
3721
+ declare interface RingLatticeWindowOptions {
3722
+ /** Opening width (world units). */
3723
+ width?: number;
3724
+ /** Opening height (world units). */
3725
+ height?: number;
3726
+ /** Uniform ring-center spacing. Overrides `cellsX` when set. Defaults to `0.55`. */
3727
+ cell?: number;
3728
+ /** Density hint — `cell = width / cellsX` when `cell` is omitted. */
3729
+ cellsX?: number;
3730
+ /** Wall thickness of each square ring profile. Defaults to `0.05`. */
3731
+ ringThickness?: number;
3732
+ /** Extrusion depth of each ring. Defaults to `0.06`. */
3733
+ ringDepth?: number;
3734
+ /** Outer frame bar thickness. Defaults to `0.055`. */
3735
+ frameThickness?: number;
3736
+ /** Outer frame depth (Z). Defaults to `0.11`. */
3737
+ frameDepth?: number;
3738
+ /** Vertical center of the opening in local space. Defaults to `0`. */
3739
+ centerY?: number;
3740
+ /** Lattice + frame tint. Defaults to `#0c0f14`. */
3741
+ latticeColor?: ColorRepresentation;
3742
+ /** Optional glass pane recessed slightly on −Z. */
3743
+ glass?: boolean;
3744
+ glassColor?: ColorRepresentation;
3745
+ glassEmissive?: ColorRepresentation;
3746
+ glassEmissiveIntensity?: number;
3747
+ }
3748
+
3749
+ /**
3750
+ * Single rock prefab — noisy sphere mesh.
3751
+ */
2739
3752
  export declare class Rock extends Mesh<RockGeometry, MeshStandardMaterial> {
2740
- constructor(radius?: number, widthSegments?: number, heightSegments?: number);
3753
+ constructor({ color, ...geometryOptions }?: RockOptions);
2741
3754
  }
2742
3755
 
3756
+ /**
3757
+ * Low-poly rock — sphere with randomized vertex offsets, then centered.
3758
+ */
2743
3759
  export declare class RockGeometry extends BufferGeometry {
2744
- constructor(radius?: number, widthSegments?: number, heightSegments?: number);
3760
+ readonly radius: number;
3761
+ readonly widthSegments: number;
3762
+ readonly heightSegments: number;
3763
+ constructor({ radius, widthSegments, heightSegments, }?: RockGeometryOptions);
2745
3764
  }
2746
3765
 
2747
- export declare class Rocks extends Mesh<RocksGeometry, MeshStandardMaterial> {
2748
- constructor();
3766
+ export declare interface RockGeometryOptions {
3767
+ /** Base sphere radius before vertex noise. Defaults to `1`. */
3768
+ radius?: number;
3769
+ /** Horizontal segments. Defaults to `4`. */
3770
+ widthSegments?: number;
3771
+ /** Vertical segments. Defaults to `4`. */
3772
+ heightSegments?: number;
2749
3773
  }
2750
3774
 
2751
- export declare class RocksGeometry extends BufferGeometry {
2752
- constructor();
3775
+ export declare interface RockOptions extends RockGeometryOptions {
3776
+ /** Stone tint. Defaults to `#808080`. */
3777
+ color?: ColorRepresentation;
3778
+ }
3779
+
3780
+ export declare interface RockScatterBounds {
3781
+ /** Scatter extent along X (centered on origin). Defaults to `4`. */
3782
+ width?: number;
3783
+ /** Scatter extent along Z (centered on origin). Defaults to `4`. */
3784
+ depth?: number;
3785
+ /** Max random Y offset above the ground plane. Defaults to `0`. */
3786
+ heightJitter?: number;
3787
+ }
3788
+
3789
+ export declare interface RockScatterPlacementOptions extends RockScatterBounds {
3790
+ /** Number of instances. Defaults to `5`. */
3791
+ count?: number;
3792
+ /** Min per-axis instance scale. Defaults to `0.8`. */
3793
+ scaleMin?: number;
3794
+ /** Max per-axis instance scale. Defaults to `1.2`. */
3795
+ scaleMax?: number;
3796
+ /** Optional seed for reproducible scatter. Omit for unique runtime. */
3797
+ seed?: number;
2753
3798
  }
2754
3799
 
2755
3800
  export declare class RoundedHeadstone extends Mesh<RoundedHeadstoneGeometry, MeshStandardMaterial> {
@@ -2763,25 +3808,27 @@ export declare class RoundedHeadstoneGeometry extends BufferGeometry {
2763
3808
  /**
2764
3809
  * Creates a row of books with a given count.
2765
3810
  */
2766
- export declare function rowOfBooksByCount<T extends Material>({ coverMaterial, pagesMaterial, count, scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax, }: RowOfBooksOptions<T>): InstancedMesh;
3811
+ export declare function rowOfBooksByCount<T extends Material>({ coverMaterial, pagesMaterial, count, scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax, seed, }: RowOfBooksOptions<T>): InstancedMesh;
2767
3812
 
2768
3813
  /**
2769
3814
  * Creates a row of books with a total length.
2770
3815
  */
2771
- export declare function rowOfBooksByLength<T extends Material>({ coverMaterial, pagesMaterial, length, scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax, }: RowOfBooksOptions<T>): InstancedMesh;
3816
+ export declare function rowOfBooksByLength<T extends Material>({ coverMaterial, pagesMaterial, length, scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax, seed, }: RowOfBooksOptions<T>): InstancedMesh;
2772
3817
 
2773
3818
  /**
2774
3819
  * Creates a row of books from the scales array of Vector3.
2775
3820
  */
2776
- export declare function rowOfBooksByScales<T extends Material>({ coverMaterial, pagesMaterial, scales, }: RowOfBooksByScalesOptions<T>): InstancedMesh;
3821
+ export declare function rowOfBooksByScales<T extends Material>({ coverMaterial, pagesMaterial, scales, source, }: RowOfBooksByScalesOptions<T>): InstancedMesh;
2777
3822
 
2778
3823
  declare interface RowOfBooksByScalesOptions<T extends Material = Material> {
2779
3824
  coverMaterial: T;
2780
3825
  pagesMaterial: T;
2781
3826
  scales: Vector3[];
3827
+ /** Shared stream for shelf jitter — must be the same source that built `scales`. */
3828
+ source: RandomSource;
2782
3829
  }
2783
3830
 
2784
- declare interface RowOfBooksOptions<T extends Material = Material> {
3831
+ export declare interface RowOfBooksOptions<T extends Material = Material> {
2785
3832
  coverMaterial: T;
2786
3833
  pagesMaterial: T;
2787
3834
  count?: number;
@@ -2792,6 +3839,53 @@ declare interface RowOfBooksOptions<T extends Material = Material> {
2792
3839
  scaleYMax?: number;
2793
3840
  scaleZMin?: number;
2794
3841
  scaleZMax?: number;
3842
+ /** Optional seed for reproducible layout. Omit for unique runtime. */
3843
+ seed?: number;
3844
+ }
3845
+
3846
+ /**
3847
+ * Scatter instanced mossy rocks inside a horizontal bounds region.
3848
+ *
3849
+ * Uses two material groups (rock + moss) on a shared {@link InstancedMesh}.
3850
+ */
3851
+ export declare function scatterMossyRocks({ count, width, depth, heightJitter, scaleMin, scaleMax, seed, radius, detail, mossScaleXZ, mossScaleY, mossOffsetY, rockMaterial, mossMaterial, rockColor, mossColor, mossOpacity, }?: ScatterMossyRocksOptions): InstancedMesh;
3852
+
3853
+ export declare interface ScatterMossyRocksOptions extends RockScatterPlacementOptions {
3854
+ /** Dodecahedron radius for each instance geometry. Defaults to `1`. */
3855
+ radius?: number;
3856
+ detail?: number;
3857
+ mossScaleXZ?: number;
3858
+ mossScaleY?: number;
3859
+ mossOffsetY?: number;
3860
+ rockMaterial?: Material;
3861
+ mossMaterial?: Material;
3862
+ /** Rock tint when `rockMaterial` is omitted. Defaults to `#808080`. */
3863
+ rockColor?: ColorRepresentation;
3864
+ /** Moss tint when `mossMaterial` is omitted. Defaults to `#4b8b3b`. */
3865
+ mossColor?: ColorRepresentation;
3866
+ /** Moss opacity when `mossMaterial` is omitted. Defaults to `0.8`. */
3867
+ mossOpacity?: number;
3868
+ }
3869
+
3870
+ /**
3871
+ * Scatter instanced rocks inside a horizontal bounds region.
3872
+ *
3873
+ * @example
3874
+ * ```ts
3875
+ * const rocks = scatterRocks({ count: 12, width: 8, depth: 8, seed: 1337 });
3876
+ * scene.add(rocks);
3877
+ * ```
3878
+ */
3879
+ export declare function scatterRocks({ count, width, depth, heightJitter, scaleMin, scaleMax, seed, radius, widthSegments, heightSegments, material, color, }?: ScatterRocksOptions): InstancedMesh;
3880
+
3881
+ export declare interface ScatterRocksOptions extends RockScatterPlacementOptions {
3882
+ /** Base sphere radius for each instance geometry. Defaults to `1`. */
3883
+ radius?: number;
3884
+ widthSegments?: number;
3885
+ heightSegments?: number;
3886
+ material?: Material;
3887
+ /** Stone tint when `material` is omitted. Defaults to `#808080`. */
3888
+ color?: ColorRepresentation;
2795
3889
  }
2796
3890
 
2797
3891
  /**
@@ -3108,14 +4202,89 @@ export declare function sphericalUVMapping(vertices: [number, number, number][])
3108
4202
  */
3109
4203
  export declare const spikeBrush: <T extends BufferGeometry>(geometry: T, position: Vector3, radius: number, strength: number, inward?: boolean, falloffFn?: (distance: number, radius: number) => number) => void;
3110
4204
 
4205
+ export declare interface SpiralClipOptions extends CameraClipTiming {
4206
+ /** Ground point to look down at (typically scene center, `y = 0`). */
4207
+ target: Vector3;
4208
+ /** Orbit radius at the start of the clip. */
4209
+ radius: number;
4210
+ /** Optional wider radius at the end — pulls back as you rise. Defaults to `radius`. */
4211
+ endRadius?: number;
4212
+ /** Total vertical rise over the clip. */
4213
+ height: number;
4214
+ revolutions: number;
4215
+ ease?: EasingFunction;
4216
+ }
4217
+
4218
+ /**
4219
+ * Turret-style spiral staircase prefab — wraps {@link SpiralStaircaseGeometry}.
4220
+ */
4221
+ export declare class SpiralStaircase extends Mesh<SpiralStaircaseGeometry, MeshStandardMaterial> {
4222
+ readonly innerRadius: number;
4223
+ readonly width: number;
4224
+ readonly outerRadius: number;
4225
+ readonly treadDepth: number;
4226
+ readonly riserHeight: number;
4227
+ readonly stepCount: number;
4228
+ readonly stepAngle: number;
4229
+ readonly totalHeight: number;
4230
+ readonly totalTurn: number;
4231
+ constructor({ color, ...geometryOptions }?: SpiralStaircaseOptions);
4232
+ }
4233
+
4234
+ /**
4235
+ * Turret-style spiral staircase — trapezoidal treads between an inner newel radius
4236
+ * and an outer wall radius, ascending counter-clockwise when viewed from above.
4237
+ *
4238
+ * Each step is a four-sided tread (no pinched center point). Step angle is
4239
+ * derived from tread depth at the mid-radius so treads meet without overlapping.
4240
+ */
3111
4241
  export declare class SpiralStaircaseGeometry extends BufferGeometry {
3112
- constructor(stepWidth?: number, stepDepth?: number, stepHeight?: number, numSteps?: number, radius?: number, angleIncrement?: number);
4242
+ readonly innerRadius: number;
4243
+ readonly width: number;
4244
+ readonly outerRadius: number;
4245
+ readonly treadDepth: number;
4246
+ readonly riserHeight: number;
4247
+ readonly stepCount: number;
4248
+ readonly startAngle: number;
4249
+ readonly stepAngle: number;
4250
+ readonly totalHeight: number;
4251
+ readonly totalTurn: number;
4252
+ constructor({ innerRadius, width, treadDepth, riserHeight, stepCount, startAngle, stepAngle: stepAngleOption, }?: SpiralStaircaseGeometryOptions);
4253
+ }
4254
+
4255
+ export declare interface SpiralStaircaseGeometryOptions {
4256
+ /** Newel / center-hole radius (inner edge of every tread). Defaults to `0.45`. */
4257
+ innerRadius?: number;
4258
+ /** Radial tread width (outer − inner radius). Defaults to `1.95`. */
4259
+ width?: number;
4260
+ /** Arc run per step at the walking line (mid-radius). Defaults to `0.45`. */
4261
+ treadDepth?: number;
4262
+ /** Vertical rise per step (riser). Defaults to `0.2`. */
4263
+ riserHeight?: number;
4264
+ /** Number of steps. Defaults to `20`. */
4265
+ stepCount?: number;
4266
+ /** Spiral start angle in radians (+X = 0, CCW). Defaults to `0`. */
4267
+ startAngle?: number;
4268
+ /** Override step angle (radians). When omitted, derived from `treadDepth`. */
4269
+ stepAngle?: number;
4270
+ }
4271
+
4272
+ export declare interface SpiralStaircaseOptions extends SpiralStaircaseGeometryOptions {
4273
+ /** Tread and riser tint. Defaults to `#8b4513`. */
4274
+ color?: ColorRepresentation;
3113
4275
  }
3114
4276
 
3115
4277
  export declare class SpiralTube extends Group {
3116
4278
  constructor();
3117
4279
  }
3118
4280
 
4281
+ /**
4282
+ * Seed mixer — maps one 32-bit value to another well-distributed value.
4283
+ * Use with {@link deriveSubSeed}, not as a drop-in stream replacement for
4284
+ * {@link mulberry32}.
4285
+ */
4286
+ export declare function splitmix32(seed: number): number;
4287
+
3119
4288
  export declare class SquareHeadstone extends Mesh<SquareHeadstoneGeometry, MeshStandardMaterial> {
3120
4289
  constructor(width?: number, height?: number, depth?: number);
3121
4290
  }
@@ -3124,39 +4293,140 @@ export declare class SquareHeadstoneGeometry extends BufferGeometry {
3124
4293
  constructor(width?: number, height?: number, depth?: number);
3125
4294
  }
3126
4295
 
4296
+ /**
4297
+ * Stack of books on the floor — each book lays flat on its cover; count sets stack height.
4298
+ * Each layer is laid flat (+90° X), then given a small in-plane spin (world Y)
4299
+ * around the book's geometric center — not the spine corner.
4300
+ *
4301
+ * Local frame: bottom of the stack at Y=0, centered on X/Z.
4302
+ *
4303
+ * @example
4304
+ * ```ts
4305
+ * const stack = stackOfBooks({
4306
+ * coverMaterial,
4307
+ * pagesMaterial,
4308
+ * count: 8,
4309
+ * yawMax: 0.6,
4310
+ * seed: 1337,
4311
+ * });
4312
+ * scene.add(stack);
4313
+ * ```
4314
+ */
4315
+ export declare function stackOfBooks<T extends Material>({ coverMaterial, pagesMaterial, count, scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax, yawMax, offsetMax, seed, }: StackOfBooksOptions<T>): InstancedMesh;
4316
+
4317
+ export declare interface StackOfBooksOptions<T extends Material = Material> {
4318
+ coverMaterial: T;
4319
+ pagesMaterial: T;
4320
+ /** Number of books in the stack. Defaults to `6`. */
4321
+ count?: number;
4322
+ scaleXMin?: number;
4323
+ scaleXMax?: number;
4324
+ scaleYMin?: number;
4325
+ scaleYMax?: number;
4326
+ scaleZMin?: number;
4327
+ scaleZMax?: number;
4328
+ /**
4329
+ * Max in-plane spin (world Y, radians) once the book is laid flat — a lazy
4330
+ * turn on the floor, not a tilt. Defaults to `0.55` (~31°).
4331
+ */
4332
+ yawMax?: number;
4333
+ /** Max horizontal drift per layer on X/Z. Defaults to `0.06`. */
4334
+ offsetMax?: number;
4335
+ /** Optional seed for reproducible layout. Omit for unique runtime. */
4336
+ seed?: number;
4337
+ }
4338
+
4339
+ /**
4340
+ * Straight run staircase prefab — {@link StaircaseGeometry} with a wood-tone
4341
+ * default material.
4342
+ *
4343
+ * Local frame: centered on width, rises along +Y, runs along +Z.
4344
+ */
4345
+ export declare class Staircase extends Mesh<StaircaseGeometry, MeshStandardMaterial> {
4346
+ readonly width: number;
4347
+ readonly riserHeight: number;
4348
+ readonly treadDepth: number;
4349
+ readonly stepCount: number;
4350
+ readonly totalHeight: number;
4351
+ readonly totalDepth: number;
4352
+ constructor({ color, ...geometryOptions }?: StaircaseOptions);
4353
+ }
4354
+
4355
+ /**
4356
+ * Straight run staircase — open risers and treads (no side stringers yet).
4357
+ *
4358
+ * Local frame: centered on width, rises along +Y, runs along +Z. Each step
4359
+ * emits a front riser (+Z) and a top tread (+Y). UVs are normalized per face
4360
+ * (0–1) so materials can tile per step.
4361
+ */
3127
4362
  export declare class StaircaseGeometry extends BufferGeometry {
3128
- constructor(width?: number, stepHeight?: number, stepDepth?: number, numSteps?: number);
4363
+ readonly width: number;
4364
+ readonly riserHeight: number;
4365
+ readonly treadDepth: number;
4366
+ readonly stepCount: number;
4367
+ readonly totalHeight: number;
4368
+ readonly totalDepth: number;
4369
+ constructor({ width, riserHeight, treadDepth, stepCount, }?: StaircaseGeometryOptions);
3129
4370
  }
3130
4371
 
4372
+ export declare interface StaircaseGeometryOptions {
4373
+ /** Stair width (tread left–right extent). Defaults to `2`. */
4374
+ width?: number;
4375
+ /** Vertical rise per step (riser). Defaults to `0.3`. */
4376
+ riserHeight?: number;
4377
+ /** Horizontal run per step (tread depth). Defaults to `0.5`. */
4378
+ treadDepth?: number;
4379
+ /** Number of steps. Defaults to `10`. */
4380
+ stepCount?: number;
4381
+ }
4382
+
4383
+ export declare interface StaircaseOptions extends StaircaseGeometryOptions {
4384
+ /** Tread and riser tint. Defaults to `#8b4513`. */
4385
+ color?: ColorRepresentation;
4386
+ }
4387
+
4388
+ /**
4389
+ * Laboratory stand prefab — ring and legs.
4390
+ */
3131
4391
  export declare class Stand extends Mesh<StandGeometry, MeshStandardMaterial> {
3132
- constructor({ radius, //
3133
- height, count, thickness, radialSegments, }?: {
3134
- radius?: number | undefined;
3135
- height?: number | undefined;
3136
- count?: number | undefined;
3137
- thickness?: number | undefined;
3138
- radialSegments?: number | undefined;
3139
- });
4392
+ constructor({ color, ...geometryOptions }?: StandOptions);
3140
4393
  }
3141
4394
 
4395
+ /**
4396
+ * Tripod-style stand — torus ring with radial legs.
4397
+ *
4398
+ * Local frame: legs on Y=0.
4399
+ */
3142
4400
  export declare class StandGeometry extends BufferGeometry {
3143
- constructor({ radius, //
3144
- height, count, thickness, radialSegments, }?: {
3145
- radius?: number | undefined;
3146
- height?: number | undefined;
3147
- count?: number | undefined;
3148
- thickness?: number | undefined;
3149
- radialSegments?: number | undefined;
3150
- });
4401
+ readonly radius: number;
4402
+ readonly height: number;
4403
+ readonly count: number;
4404
+ constructor({ radius, height, count, thickness, radialSegments, }?: StandGeometryOptions);
3151
4405
  }
3152
4406
 
3153
- export declare class Star extends Mesh {
3154
- constructor({ points, innerRadius, outerRadius, depth }?: {
3155
- points?: number | undefined;
3156
- innerRadius?: number | undefined;
3157
- outerRadius?: number | undefined;
3158
- depth?: number | undefined;
3159
- });
4407
+ export declare interface StandGeometryOptions {
4408
+ /** Ring radius. Defaults to `0.3`. */
4409
+ radius?: number;
4410
+ /** Leg height. Defaults to `0.4`. */
4411
+ height?: number;
4412
+ /** Number of legs. Defaults to `3`. */
4413
+ count?: number;
4414
+ /** Ring tube thickness. Defaults to `0.03`. */
4415
+ thickness?: number;
4416
+ /** Circumference segments. Defaults to `16`. */
4417
+ radialSegments?: number;
4418
+ }
4419
+
4420
+ export declare interface StandOptions extends StandGeometryOptions {
4421
+ /** Metal tint. Defaults to `#888888`. */
4422
+ color?: ColorRepresentation;
4423
+ }
4424
+
4425
+ /**
4426
+ * Star shape prefab.
4427
+ */
4428
+ export declare class Star extends Mesh<StarGeometry, MeshStandardMaterial> {
4429
+ constructor({ color, emissive, emissiveIntensity, ...geometryOptions }?: StarOptions);
3160
4430
  }
3161
4431
 
3162
4432
  export declare interface StarBurstShapeOptions {
@@ -3275,29 +4545,62 @@ export declare interface StarFieldEffectOptions {
3275
4545
  }
3276
4546
 
3277
4547
  /**
3278
- * Extrude geometry of Star Shape.
4548
+ * Extruded star prism.
3279
4549
  */
3280
4550
  export declare class StarGeometry extends ExtrudeGeometry {
3281
- constructor(points?: number, innerRadius?: number, outerRadius?: number, depth?: number);
4551
+ constructor({ points, innerRadius, outerRadius, depth, }?: StarGeometryOptions);
4552
+ }
4553
+
4554
+ export declare interface StarGeometryOptions {
4555
+ /** Number of star points. Defaults to `5`. */
4556
+ points?: number;
4557
+ /** Inner vertex radius. Defaults to `0.5`. */
4558
+ innerRadius?: number;
4559
+ /** Outer vertex radius. Defaults to `1`. */
4560
+ outerRadius?: number;
4561
+ /** Extrusion depth. Defaults to `0.25`. */
4562
+ depth?: number;
4563
+ }
4564
+
4565
+ export declare interface StarOptions extends StarGeometryOptions {
4566
+ /** Surface tint. Defaults to `#ffff00`. */
4567
+ color?: ColorRepresentation;
4568
+ /** Emissive tint. Defaults to `#ffd700`. */
4569
+ emissive?: ColorRepresentation;
4570
+ /** Emissive strength. Defaults to `0.25`. */
4571
+ emissiveIntensity?: number;
3282
4572
  }
3283
4573
 
3284
4574
  export declare class StarShape extends Shape {
3285
4575
  constructor(points?: number, innerRadius?: number, outerRadius?: number);
3286
4576
  }
3287
4577
 
4578
+ /**
4579
+ * Stone fence post prefab.
4580
+ */
3288
4581
  export declare class StoneFencePost extends Mesh<StoneFencePostGeometry, MeshStandardMaterial> {
3289
- constructor({ height }?: {
3290
- height?: number | undefined;
3291
- });
4582
+ readonly height: number;
4583
+ constructor({ color, ...geometryOptions }?: StoneFencePostOptions);
3292
4584
  }
3293
4585
 
3294
4586
  /**
3295
- * Fence Column Geometry, a stone slab fence column shape
4587
+ * Stone fence post wide base, column, and cap.
4588
+ *
4589
+ * Local frame: base on Y=0.
3296
4590
  */
3297
4591
  export declare class StoneFencePostGeometry extends BufferGeometry {
3298
- constructor({ height }?: {
3299
- height?: number | undefined;
3300
- });
4592
+ readonly height: number;
4593
+ constructor({ height }?: StoneFencePostGeometryOptions);
4594
+ }
4595
+
4596
+ export declare interface StoneFencePostGeometryOptions {
4597
+ /** Main column height (excluding base and cap). Defaults to `2.25`. */
4598
+ height?: number;
4599
+ }
4600
+
4601
+ export declare interface StoneFencePostOptions extends StoneFencePostGeometryOptions {
4602
+ /** Stone tint. Defaults to `#8b7d7b`. */
4603
+ color?: ColorRepresentation;
3301
4604
  }
3302
4605
 
3303
4606
  /**
@@ -3327,14 +4630,15 @@ export declare class TestTubeGeometry extends BufferGeometry {
3327
4630
  }
3328
4631
 
3329
4632
  /**
3330
- * Wooden rack with instanced test tubes and emissive liquid fills.
4633
+ * Wooden rack with test tubes and emissive liquid fills.
3331
4634
  *
3332
4635
  * Glass shells use `DoubleSide` and `depthWrite: false`; liquid draws first
3333
4636
  * (`renderOrder` 1), glass second (`renderOrder` 2) so fills stay visible at
3334
4637
  * most camera angles.
3335
4638
  */
3336
4639
  export declare class TestTubeRack extends Group {
3337
- constructor(count?: number, colors?: ColorRepresentation[]);
4640
+ readonly count: number;
4641
+ constructor({ count, colors, }?: TestTubeRackOptions);
3338
4642
  }
3339
4643
 
3340
4644
  export declare interface TestTubeRackOptions {
@@ -3359,60 +4663,60 @@ export declare interface TestTubeRackOptions {
3359
4663
  */
3360
4664
  export declare const thetaLengthForRadius: (sphereRadius: number, holeRadius: number) => number;
3361
4665
 
4666
+ /** Trace the shared rect-plus-arch outline (glass, stencil mask, frame outer edge). */
4667
+ export declare function traceArchedOpeningOutline(target: ArchedOutlineTarget, metrics: ArchedOpeningMetrics, { hole }?: {
4668
+ hole?: boolean;
4669
+ }): void;
4670
+
3362
4671
  /**
3363
- * Material indices:
3364
- * 0. Trunk
3365
- * 1. leafSize
3366
- *
3367
- * Example usage:
3368
- * ```
3369
- * const tree = new Tree({
3370
- * trunkRadiusTop: 0.25,
3371
- * trunkRadiusBottom: 0.4,
3372
- * trunkHeight: 2.5,
3373
- * trunkSegments: 14,
3374
- * trunkColor: 0x8b4513,
3375
- * leafSize: 0.8,
3376
- * leafCount: 6,
3377
- * leafDetail: 0,
3378
- * leafSpreadRadius: 1.5,
3379
- * leafColor: 0x228b22,
3380
- * });
3381
- * ```
4672
+ * Low-poly tree prefab — trunk and leaf clusters with separate material groups.
3382
4673
  */
3383
4674
  export declare class Tree extends Mesh<TreeGeometry, MeshStandardMaterial[]> {
3384
- constructor({ trunkRadiusTop, trunkRadiusBottom, trunkHeight, trunkSegments, trunkColor, leafSize, leafCount, leafDetail, leafSpreadRadius, leafColor, }?: {
3385
- trunkRadiusTop?: number | undefined;
3386
- trunkRadiusBottom?: number | undefined;
3387
- trunkHeight?: number | undefined;
3388
- trunkSegments?: number | undefined;
3389
- trunkColor?: number | undefined;
3390
- leafSize?: number | undefined;
3391
- leafCount?: number | undefined;
3392
- leafDetail?: number | undefined;
3393
- leafSpreadRadius?: number | undefined;
3394
- leafColor?: number | undefined;
3395
- });
4675
+ readonly trunkHeight: number;
4676
+ constructor({ trunkColor, leafColor, ...geometryOptions }?: TreeOptions);
3396
4677
  }
3397
4678
 
3398
4679
  /**
3399
- * Tree geometry, consisting of a trunk and leaves.
4680
+ * Low-poly tree trunk (group 0) and leaf clusters (group 1).
3400
4681
  *
3401
- * Group order:
3402
- * - Trunk Material
3403
- * - Leaf Material
4682
+ * Local frame: trunk base at Y=0. Leaf positions use `Math.random()` each build.
3404
4683
  */
3405
4684
  export declare class TreeGeometry extends BufferGeometry {
3406
- constructor({ trunkRadiusTop, trunkRadiusBottom, trunkHeight, trunkSegments, leafSize, leafCount, leafDetail, leafSpreadRadius, }?: {
3407
- trunkRadiusTop?: number | undefined;
3408
- trunkRadiusBottom?: number | undefined;
3409
- trunkHeight?: number | undefined;
3410
- trunkSegments?: number | undefined;
3411
- leafSize?: number | undefined;
3412
- leafCount?: number | undefined;
3413
- leafDetail?: number | undefined;
3414
- leafSpreadRadius?: number | undefined;
3415
- });
4685
+ readonly trunkRadiusTop: number;
4686
+ readonly trunkRadiusBottom: number;
4687
+ readonly trunkHeight: number;
4688
+ readonly trunkSegments: number;
4689
+ readonly leafSize: number;
4690
+ readonly leafCount: number;
4691
+ readonly leafDetail: number;
4692
+ readonly leafSpreadRadius: number;
4693
+ constructor({ trunkRadiusTop, trunkRadiusBottom, trunkHeight, trunkSegments, leafSize, leafCount, leafDetail, leafSpreadRadius, }?: TreeGeometryOptions);
4694
+ }
4695
+
4696
+ export declare interface TreeGeometryOptions {
4697
+ /** Trunk top radius. Defaults to `0.25`. */
4698
+ trunkRadiusTop?: number;
4699
+ /** Trunk bottom radius. Defaults to `0.4`. */
4700
+ trunkRadiusBottom?: number;
4701
+ /** Trunk height. Defaults to `2.5`. */
4702
+ trunkHeight?: number;
4703
+ /** Trunk circumference segments. Defaults to `14`. */
4704
+ trunkSegments?: number;
4705
+ /** Leaf dodecahedron radius. Defaults to `0.8`. */
4706
+ leafSize?: number;
4707
+ /** Number of leaf clusters. Defaults to `6`. */
4708
+ leafCount?: number;
4709
+ /** Leaf dodecahedron detail level. Defaults to `0`. */
4710
+ leafDetail?: number;
4711
+ /** Horizontal spread of leaf placement. Defaults to `1.5`. */
4712
+ leafSpreadRadius?: number;
4713
+ }
4714
+
4715
+ export declare interface TreeOptions extends TreeGeometryOptions {
4716
+ /** Trunk tint. Defaults to `#8b4513`. */
4717
+ trunkColor?: ColorRepresentation;
4718
+ /** Leaf tint. Defaults to `#228b22`. */
4719
+ leafColor?: ColorRepresentation;
3416
4720
  }
3417
4721
 
3418
4722
  /**
@@ -3434,18 +4738,141 @@ export declare function updateNoiseDisplacementTime<T extends Material>(material
3434
4738
  */
3435
4739
  export declare function updateWaterDisplacementTime<T extends Material>(material: T, deltaTime: number): void;
3436
4740
 
4741
+ /**
4742
+ * Wall-mounted oil-lamp sconce — iron mount and cap/bowl frame around an
4743
+ * emissive glass chimney. Pair {@link GlowHalo} and {@link FlameFlickerEffect}
4744
+ * at `(lightCenterX, lightCenterY, lightCenterZ)` for bloom and flicker.
4745
+ *
4746
+ * Local frame: faces +X from a −X wall.
4747
+ */
4748
+ export declare class WallSconce extends Mesh<WallSconceGeometry, MeshStandardMaterial[]> {
4749
+ readonly lightCenterX: number;
4750
+ readonly lightCenterY: number;
4751
+ readonly lightCenterZ: number;
4752
+ constructor({ color, mountColor, frameColor, lampColor, lampEmissiveIntensity, lampOpacity, inner, ...geometryOptions }?: WallSconceOptions);
4753
+ }
4754
+
4755
+ /**
4756
+ * Wall-mounted oil-lamp sconce — iron mount, cap, and bowl framing an emissive
4757
+ * glass chimney.
4758
+ *
4759
+ * Material groups: `0` mount (plate + bracket), `1` iron frame (cap + bowl),
4760
+ * `2` glass chimney.
4761
+ *
4762
+ * Local frame: faces +X from a −X wall; lamp center at
4763
+ * `(bodyOffsetX, chimneyCenterY, 0)`.
4764
+ */
4765
+ export declare class WallSconceGeometry extends BufferGeometry {
4766
+ readonly bodyOffsetX: number;
4767
+ readonly chimneyCenterY: number;
4768
+ readonly innerScale: number;
4769
+ readonly inner: boolean;
4770
+ readonly lightCenterX: number;
4771
+ readonly lightCenterY: number;
4772
+ readonly lightCenterZ: number;
4773
+ constructor({ plateThickness, plateHeight, plateDepth, plateOffsetX, bracketLength, bracketHeight, bracketDepth, bracketOffsetX, bracketOffsetY, bodyOffsetX, chimneyHeight, chimneyTopRadius, chimneyBottomRadius, chimneyCenterY, capRadius, capHeight, capCenterY, bowlTopRadius, bowlBottomRadius, bowlHeight, bowlCenterY, radialSegments, innerScale, inner, }?: WallSconceGeometryOptions);
4774
+ }
4775
+
4776
+ export declare interface WallSconceGeometryOptions {
4777
+ /** Wall-plate thickness (X). Defaults to `0.05`. */
4778
+ plateThickness?: number;
4779
+ /** Wall-plate height (Y). Defaults to `0.22`. */
4780
+ plateHeight?: number;
4781
+ /** Wall-plate depth (Z). Defaults to `0.28`. */
4782
+ plateDepth?: number;
4783
+ /** Wall-plate center X (negative = into the wall). Defaults to `-0.055`. */
4784
+ plateOffsetX?: number;
4785
+ /** Bracket length into the room (X). Defaults to `0.1`. */
4786
+ bracketLength?: number;
4787
+ /** Bracket height (Y). Defaults to `0.05`. */
4788
+ bracketHeight?: number;
4789
+ /** Bracket depth (Z). Defaults to `0.07`. */
4790
+ bracketDepth?: number;
4791
+ /** Bracket center X. Defaults to `-0.005`. */
4792
+ bracketOffsetX?: number;
4793
+ /** Bracket center Y. Defaults to `0.1`. */
4794
+ bracketOffsetY?: number;
4795
+ /** Chimney / lamp body center X. Defaults to `0.06`. */
4796
+ bodyOffsetX?: number;
4797
+ /** Chimney height. Defaults to `0.3`. */
4798
+ chimneyHeight?: number;
4799
+ /** Chimney top radius. Defaults to `0.1`. */
4800
+ chimneyTopRadius?: number;
4801
+ /** Chimney bottom radius. Defaults to `0.105`. */
4802
+ chimneyBottomRadius?: number;
4803
+ /** Chimney center Y. Defaults to `-0.05`. */
4804
+ chimneyCenterY?: number;
4805
+ /** Cap radius. Defaults to `0.115`. */
4806
+ capRadius?: number;
4807
+ /** Cap height. Defaults to `0.05`. */
4808
+ capHeight?: number;
4809
+ /** Cap center Y. Defaults to `0.12`. */
4810
+ capCenterY?: number;
4811
+ /** Bowl top radius. Defaults to `0.09`. */
4812
+ bowlTopRadius?: number;
4813
+ /** Bowl bottom radius. Defaults to `0.11`. */
4814
+ bowlBottomRadius?: number;
4815
+ /** Bowl height. Defaults to `0.05`. */
4816
+ bowlHeight?: number;
4817
+ /** Bowl center Y. Defaults to `-0.22`. */
4818
+ bowlCenterY?: number;
4819
+ /** Radial segments on cylinders. Defaults to `8`. */
4820
+ radialSegments?: number;
4821
+ /** Glass chimney scale relative to the frame opening. Defaults to `0.96`. */
4822
+ innerScale?: number;
4823
+ /** Include the emissive glass chimney. Defaults to `true`. */
4824
+ inner?: boolean;
4825
+ }
4826
+
4827
+ export declare interface WallSconceOptions extends WallSconceGeometryOptions {
4828
+ /** Wrought-iron tint for mount and frame. Defaults to `#1c1e24`. */
4829
+ color?: ColorRepresentation;
4830
+ /** Mount iron tint (plate + bracket). Defaults to `color`. */
4831
+ mountColor?: ColorRepresentation;
4832
+ /** Frame iron tint (cap + bowl). Defaults to `color`. */
4833
+ frameColor?: ColorRepresentation;
4834
+ /** Glass chimney tint. Defaults to `#e8a058`. */
4835
+ lampColor?: ColorRepresentation;
4836
+ /** Glass emissive strength. Defaults to `1.4`. */
4837
+ lampEmissiveIntensity?: number;
4838
+ /** Glass opacity. Defaults to `0.88`. */
4839
+ lampOpacity?: number;
4840
+ }
4841
+
4842
+ /**
4843
+ * Wine bottle prefab — translucent green glass.
4844
+ */
3437
4845
  export declare class WineBottle extends Mesh<WineBottleGeometry, MeshPhysicalMaterial> {
3438
- constructor();
4846
+ constructor({ color, ...geometryOptions }?: WineBottleOptions);
3439
4847
  }
3440
4848
 
4849
+ /**
4850
+ * Wine bottle — cylindrical body, shoulder taper, and neck.
4851
+ *
4852
+ * Local frame: base at Y=0.
4853
+ */
3441
4854
  export declare class WineBottleGeometry extends BufferGeometry {
3442
- constructor({ radius, neckRadius, height, neckHeight, segments }?: {
3443
- radius?: number | undefined;
3444
- neckRadius?: number | undefined;
3445
- height?: number | undefined;
3446
- neckHeight?: number | undefined;
3447
- segments?: number | undefined;
3448
- });
4855
+ readonly radius: number;
4856
+ readonly height: number;
4857
+ constructor({ radius, neckRadius, height, neckHeight, segments, }?: WineBottleGeometryOptions);
4858
+ }
4859
+
4860
+ export declare interface WineBottleGeometryOptions {
4861
+ /** Body radius. Defaults to `0.5`. */
4862
+ radius?: number;
4863
+ /** Neck radius. Defaults to `0.2`. */
4864
+ neckRadius?: number;
4865
+ /** Total height including neck. Defaults to `3`. */
4866
+ height?: number;
4867
+ /** Neck height. Defaults to `1`. */
4868
+ neckHeight?: number;
4869
+ /** Circumference segments. Defaults to `16`. */
4870
+ segments?: number;
4871
+ }
4872
+
4873
+ export declare interface WineBottleOptions extends WineBottleGeometryOptions {
4874
+ /** Glass tint. Defaults to `#556b2f`. */
4875
+ color?: ColorRepresentation;
3449
4876
  }
3450
4877
 
3451
4878
  /**
@@ -3530,65 +4957,104 @@ export declare interface WispEffectOptions {
3530
4957
  lightPulseSpeed?: number;
3531
4958
  }
3532
4959
 
4960
+ export declare interface WobbleClipOptions extends CameraClipTiming {
4961
+ /** Peak positional shake in world units. */
4962
+ intensity: number;
4963
+ ease?: EasingFunction;
4964
+ }
4965
+
4966
+ /**
4967
+ * Wrought-iron fence post prefab.
4968
+ */
3533
4969
  export declare class WroughtIronBar extends Mesh<WroughtIronBarGeometry, MeshStandardMaterial> {
3534
- constructor({ barHeight, //
3535
- barRadius, spikeHeight, spikeRadius, spikeScaleZ, radialSegments, }?: {
3536
- barHeight?: number | undefined;
3537
- barRadius?: number | undefined;
3538
- spikeHeight?: number | undefined;
3539
- spikeRadius?: number | undefined;
3540
- spikeScaleZ?: number | undefined;
3541
- radialSegments?: number | undefined;
3542
- });
4970
+ readonly barHeight: number;
4971
+ constructor({ color, ...geometryOptions }?: WroughtIronBarOptions);
3543
4972
  }
3544
4973
 
3545
4974
  /**
3546
- * Wrought Iron Bar Geometry, a simple wrought iron bar shape
4975
+ * Wrought-iron fence post cylinder bar with a decorative spike.
4976
+ *
4977
+ * Local frame: base at Y=0.
3547
4978
  */
3548
4979
  export declare class WroughtIronBarGeometry extends BufferGeometry {
3549
- constructor({ barHeight, //
3550
- barRadius, spikeHeight, spikeRadius, spikeScaleZ, radialSegments, }?: {
3551
- barHeight?: number | undefined;
3552
- barRadius?: number | undefined;
3553
- spikeHeight?: number | undefined;
3554
- spikeRadius?: number | undefined;
3555
- spikeScaleZ?: number | undefined;
3556
- radialSegments?: number | undefined;
3557
- });
4980
+ readonly barHeight: number;
4981
+ constructor({ barHeight, barRadius, spikeHeight, spikeRadius, spikeScaleZ, radialSegments, }?: WroughtIronBarGeometryOptions);
4982
+ }
4983
+
4984
+ export declare interface WroughtIronBarGeometryOptions {
4985
+ /** Vertical bar height. Defaults to `2`. */
4986
+ barHeight?: number;
4987
+ /** Bar cylinder radius. Defaults to `0.05`. */
4988
+ barRadius?: number;
4989
+ /** Spike cone height. Defaults to `0.3`. */
4990
+ spikeHeight?: number;
4991
+ /** Spike base radius. Defaults to `0.075`. */
4992
+ spikeRadius?: number;
4993
+ /** Spike depth scale on Z. Defaults to `1`. */
4994
+ spikeScaleZ?: number;
4995
+ /** Circumference segments. Defaults to `8`. */
4996
+ radialSegments?: number;
4997
+ }
4998
+
4999
+ export declare interface WroughtIronBarOptions extends WroughtIronBarGeometryOptions {
5000
+ /** Iron tint. Defaults to `#333333`. */
5001
+ color?: ColorRepresentation;
3558
5002
  }
3559
5003
 
5004
+ /**
5005
+ * Wrought-iron fence run prefab.
5006
+ */
3560
5007
  export declare class WroughtIronFence extends Mesh<WroughtIronFenceGeometry, MeshStandardMaterial> {
3561
- constructor({ count, //
3562
- spacing, barHeight, barRadius, spikeHeight, spikeRadius, spikeScaleZ, railHeight, railDepth, railOffset, radialSegments, }?: {
3563
- count?: number | undefined;
3564
- spacing?: number | undefined;
3565
- barHeight?: number | undefined;
3566
- barRadius?: number | undefined;
3567
- spikeHeight?: number | undefined;
3568
- spikeRadius?: number | undefined;
3569
- spikeScaleZ?: number | undefined;
3570
- railHeight?: number | undefined;
3571
- railDepth?: number | undefined;
3572
- railOffset?: number | undefined;
3573
- radialSegments?: number | undefined;
3574
- });
5008
+ readonly count: number;
5009
+ constructor({ color, ...geometryOptions }?: WroughtIronFenceOptions);
3575
5010
  }
3576
5011
 
5012
+ /**
5013
+ * Wrought-iron fence run — repeated posts with top and bottom rails.
5014
+ *
5015
+ * Local frame: first post at the origin, extending along +X.
5016
+ */
3577
5017
  export declare class WroughtIronFenceGeometry extends BufferGeometry {
3578
- constructor({ count, //
3579
- spacing, barHeight, barRadius, spikeHeight, spikeRadius, spikeScaleZ, railHeight, railDepth, railOffset, radialSegments, }?: {
3580
- count?: number | undefined;
3581
- spacing?: number | undefined;
3582
- barHeight?: number | undefined;
3583
- barRadius?: number | undefined;
3584
- spikeHeight?: number | undefined;
3585
- spikeRadius?: number | undefined;
3586
- spikeScaleZ?: number | undefined;
3587
- railHeight?: number | undefined;
3588
- railDepth?: number | undefined;
3589
- railOffset?: number | undefined;
3590
- radialSegments?: number | undefined;
3591
- });
5018
+ readonly count: number;
5019
+ readonly spacing: number;
5020
+ constructor({ count, spacing, barHeight, barRadius, spikeHeight, spikeRadius, spikeScaleZ, railHeight, railDepth, railOffset, radialSegments, }?: WroughtIronFenceGeometryOptions);
5021
+ }
5022
+
5023
+ export declare interface WroughtIronFenceGeometryOptions {
5024
+ /** Number of posts. Defaults to `20`. */
5025
+ count?: number;
5026
+ /** Center-to-center post spacing. Defaults to `0.4`. */
5027
+ spacing?: number;
5028
+ /** Post bar height. Defaults to `2`. */
5029
+ barHeight?: number;
5030
+ /** Post bar radius. Defaults to `0.05`. */
5031
+ barRadius?: number;
5032
+ /** Post spike height. Defaults to `0.3`. */
5033
+ spikeHeight?: number;
5034
+ /** Post spike radius. Defaults to `0.075`. */
5035
+ spikeRadius?: number;
5036
+ /** Post spike Z scale. Defaults to `1`. */
5037
+ spikeScaleZ?: number;
5038
+ /** Horizontal rail thickness. Defaults to `0.1`. */
5039
+ railHeight?: number;
5040
+ /** Horizontal rail depth. Defaults to `0.05`. */
5041
+ railDepth?: number;
5042
+ /** Top rail offset below the spike tip. Defaults to `0`. */
5043
+ railOffset?: number;
5044
+ /** Post circumference segments. Defaults to `8`. */
5045
+ radialSegments?: number;
5046
+ }
5047
+
5048
+ export declare interface WroughtIronFenceOptions extends WroughtIronFenceGeometryOptions {
5049
+ /** Iron tint. Defaults to `#333333`. */
5050
+ color?: ColorRepresentation;
5051
+ }
5052
+
5053
+ export declare interface ZoomClipOptions extends CameraClipTiming {
5054
+ target: Vector3;
5055
+ /** Narrower FOV at the end of the clip (e.g. `35` from `75`). */
5056
+ endFov: number;
5057
+ ease?: EasingFunction;
3592
5058
  }
3593
5059
 
3594
5060
  export { }