three-low-poly 0.9.24 → 0.9.25

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,11 +15,14 @@ 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';
26
28
  import { SphereGeometry } from 'three';
@@ -166,6 +168,8 @@ export declare function alignToRow<T extends Object3D>(objects: T[], direction?:
166
168
  */
167
169
  export declare function appendSphericalCurve(sphereRadiusX: number, sphereRadiusY: number, sphereStartY: number, holeTopRadius?: number, holeBottomRadius?: number, segments?: number): Vector2[];
168
170
 
171
+ export declare function applySnapshot(camera: PerspectiveCamera, controls: OrbitControls | undefined, snapshot: CameraSnapshot): void;
172
+
169
173
  /**
170
174
  * Atmospheric scattering shader.
171
175
  *
@@ -392,10 +396,6 @@ export declare const Axis: {
392
396
  XYZ: Vector3;
393
397
  };
394
398
 
395
- export declare class BifurcatedStaircaseGeometry extends BufferGeometry {
396
- constructor(stepWidth?: number, stepHeight?: number, stepDepth?: number, numStepsCentral?: number, numStepsBranch?: number, branchAngle?: number);
397
- }
398
-
399
399
  declare interface BloomTransitionOptions extends SceneTransitionFXOptions {
400
400
  maxBloom?: number;
401
401
  }
@@ -504,31 +504,19 @@ export declare enum BoxSide {
504
504
  }
505
505
 
506
506
  /**
507
- * Single brick geometry for low-poly aesthetic.
508
- * Default dimensions approximate standard brick proportions (in feet scale).
507
+ * Build merged box geometries for the outer frame and diagonal lead cames.
508
+ * Diagonal bars are trimmed to the rectangular opening (segment clip, not stencil).
509
509
  */
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
- }
510
+ export declare function buildDiamondLatticeParts({ width, height, centerY, grid, leadThickness: barT, leadDepth: barD, }: DiamondLatticePartOptions): BoxGeometry[];
517
511
 
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
- }
512
+ /**
513
+ * Build merged box geometries for the outer frame and interior mullions.
514
+ * Orthogonal grid — no clipping required; counts guarantee full panes.
515
+ */
516
+ export declare function buildGregorianLatticeParts({ width, height, centerY, cellsX, cellsY, mullionThickness: barT, mullionDepth: barD, }: GregorianLatticePartOptions): BoxGeometry[];
517
+
518
+ /** Outer frame bars — shared topology across lattice window openings. */
519
+ export declare function buildRingLatticeFrameParts({ width, height, centerY, frameThickness: barT, frameDepth: barD, }: RingLatticeFramePartOptions): BoxGeometry[];
532
520
 
533
521
  export declare class BunsenBurner extends Group {
534
522
  constructor();
@@ -606,74 +594,84 @@ export declare function calculateXFromSlopeIntercept(x1: number, y1: number, x2:
606
594
  */
607
595
  export declare function calculateYFromSlopeIntercept(x1: number, y1: number, x2: number, y2: number, x: number): number;
608
596
 
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;
597
+ export declare interface CameraClip {
598
+ readonly label: string;
599
+ readonly duration: number;
600
+ start(runtime: ClipRuntime): void;
601
+ update(runtime: ClipRuntime, dt: number): ClipPhase;
602
+ /** Called when playback is cancelled mid-clip. */
603
+ cancel?(runtime: ClipRuntime): void;
604
+ }
620
605
 
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;
606
+ declare interface CameraClipTiming {
607
+ /** Duration in seconds. */
608
+ duration: number;
609
+ /** Progress easing for normalized time `t` in [0, 1]. Defaults to smoothstep. */
610
+ ease?: EasingFunction;
611
+ }
641
612
 
642
613
  /**
643
- * Orbit around a target
614
+ * Single director for camera showcase clips — Unity demo-scene style playback.
644
615
  *
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.
616
+ * One active clip at a time, driven by {@link update} with elapsed seconds (`dt`),
617
+ * not nested `requestAnimationFrame` loops. Disables OrbitControls while playing;
618
+ * re-enables and syncs `controls.target` to the clip focus on complete.
656
619
  *
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.
620
+ * @example
621
+ * ```ts
622
+ * const playback = new CameraPlayback(camera, controls);
623
+ * playback.setRest(); // snapshot current pose as Reset target
668
624
  *
669
- * Example:
670
- * ```
671
- * cameraSpiralAscensionAnimation(camera, new THREE.Vector3(0, 0, 0), 10, 300, 7, 12000, () => {
672
- * console.log("Spiral ascension animation complete");
625
+ * onFrame((dt) => {
626
+ * playback.update(dt);
627
+ * controls.update();
628
+ * renderer.render(scene, camera);
673
629
  * });
630
+ *
631
+ * playback.play(createOrbitClip({ target, radius: 10, duration: 8 }));
674
632
  * ```
675
633
  */
676
- export declare function cameraSpiralAscensionAnimation(camera: Camera, center: Vector3, radius: number, height: number, revolutions: number, duration: number, onComplete?: () => void): void;
634
+ export declare class CameraPlayback {
635
+ private readonly camera;
636
+ private readonly controls?;
637
+ private active;
638
+ private elapsed;
639
+ private readonly focus;
640
+ private rest;
641
+ constructor(camera: PerspectiveCamera, controls?: OrbitControls | undefined);
642
+ /** Whether a clip is actively playing. */
643
+ get isPlaying(): boolean;
644
+ /** Snapshot the current camera + controls pose as the Reset/rest pose. */
645
+ setRest(): void;
646
+ /** Replace the rest pose without stopping playback. */
647
+ setRestSnapshot(snapshot: CameraSnapshot): void;
648
+ /**
649
+ * Begin a clip. Cancels any active clip first.
650
+ * OrbitControls are disabled until the clip completes or {@link stop} is called.
651
+ */
652
+ play(clip: CameraClip): void;
653
+ /** Cancel the active clip and restore the rest pose. */
654
+ stop(): void;
655
+ /** Alias for {@link stop} — return to the rest pose. */
656
+ reset(): void;
657
+ /**
658
+ * Advance the active clip. Call from the scene `onFrame` callback each frame.
659
+ * @param dt Elapsed seconds since last frame.
660
+ */
661
+ update(dt: number): void;
662
+ /** Release references; call from example dispose. */
663
+ dispose(): void;
664
+ private cancelActive;
665
+ private runtime;
666
+ }
667
+
668
+ /** Rest pose captured when playback is constructed or reset. */
669
+ export declare interface CameraSnapshot {
670
+ position: Vector3;
671
+ quaternion: Quaternion;
672
+ fov: number;
673
+ target: Vector3;
674
+ }
677
675
 
678
676
  /**
679
677
  * CameraTransition provides smooth animated transitions between perspective and orthographic cameras.
@@ -756,31 +754,6 @@ export declare interface CameraTransitionOptions {
756
754
  onComplete?: () => void;
757
755
  }
758
756
 
759
- /**
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
757
  /**
785
758
  * Material indices
786
759
  * 0: Stick
@@ -821,6 +794,8 @@ export declare class CandleGeometry extends BufferGeometry {
821
794
  */
822
795
  export declare const capHeightFromRadius: (radius: number, thetaLength: number) => number;
823
796
 
797
+ export declare function captureSnapshot(camera: PerspectiveCamera, controls?: OrbitControls): CameraSnapshot;
798
+
824
799
  /**
825
800
  * Calculate the width of a spherical cap.
826
801
  * w = 2 * R * sin(thetaLength)
@@ -887,6 +862,23 @@ export declare function centerObjectGeometry<T extends Object3D>(object: T, targ
887
862
  */
888
863
  export declare const checkerboardTexture: (size: number) => DataTexture;
889
864
 
865
+ export declare type ClipPhase = "running" | "complete";
866
+
867
+ /** Per-frame mutable state shared with the active clip. */
868
+ export declare interface ClipRuntime {
869
+ camera: PerspectiveCamera;
870
+ controls: OrbitControls | null;
871
+ /** Seconds elapsed in the active clip. */
872
+ elapsed: number;
873
+ /** Clip duration in seconds. */
874
+ duration: number;
875
+ /** Look-at point the clip is focused on — synced to OrbitControls on complete. */
876
+ focus: Vector3;
877
+ }
878
+
879
+ /** Clip a segment to an axis-aligned rectangle; returns endpoints inside the opening. */
880
+ 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;
881
+
890
882
  export declare const ColorPalette: {
891
883
  CADMIUM_RED: number;
892
884
  CARDINAL_RED: number;
@@ -959,22 +951,6 @@ export declare const ColorPalette: {
959
951
  TITANIUM_WHITE: number;
960
952
  };
961
953
 
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
954
  /**
979
955
  * Function to create cubic Bezier curve points
980
956
  *
@@ -1010,6 +986,9 @@ export declare const createCubicCurvePoints: (start: Vector2, control1: Vector2,
1010
986
  */
1011
987
  export declare const createDampedCurvePoints: (start: Vector2, end: Vector2, damping: number, segments?: number) => Vector2[];
1012
988
 
989
+ /** Dolly in or out along the current view direction. */
990
+ export declare function createDollyClip(options: DollyClipOptions): CameraClip;
991
+
1013
992
  /**
1014
993
  * Function to create exponential curve points
1015
994
  *
@@ -1028,6 +1007,9 @@ export declare const createDampedCurvePoints: (start: Vector2, end: Vector2, dam
1028
1007
  */
1029
1008
  export declare const createExponentialCurvePoints: (start: Vector2, end: Vector2, base: number, factor: number, segments?: number) => Vector2[];
1030
1009
 
1010
+ /** Waypoint tour through a sequence of positions. */
1011
+ export declare function createFlythroughClip(options: FlythroughClipOptions): CameraClip;
1012
+
1031
1013
  /**
1032
1014
  * Hexagonal tile pattern factory with density control.
1033
1015
  *
@@ -1084,6 +1066,15 @@ export declare function createHexagonalTilesByRadius(options: HexagonalTileRadiu
1084
1066
  */
1085
1067
  export declare const createLogarithmicCurvePoints: (start: Vector2, end: Vector2, base: number, factor: number, segments?: number) => Vector2[];
1086
1068
 
1069
+ /**
1070
+ * Four clipping planes for a rectangular opening (shadow + mesh clip).
1071
+ * Fragments are discarded when `dot(normal, position) > constant`.
1072
+ */
1073
+ export declare function createOpeningClippingPlanes(width: number, height: number, centerY?: number): Plane[];
1074
+
1075
+ /** Circle the scene — showcase reel orbit. */
1076
+ export declare function createOrbitClip(options: OrbitClipOptions): CameraClip;
1077
+
1087
1078
  /**
1088
1079
  * Function to create parabolic curve points
1089
1080
  *
@@ -1103,6 +1094,12 @@ export declare const createLogarithmicCurvePoints: (start: Vector2, end: Vector2
1103
1094
  */
1104
1095
  export declare const createParabolicCurvePoints: (start: Vector2, end: Vector2, a: number, b: number, c: number, segments?: number) => Vector2[];
1105
1096
 
1097
+ /**
1098
+ * Atmospheric focus drift — slow Ken Burns sway while locked on a subject.
1099
+ * Not a full orbit; subtle back-and-forth for mood and screen capture.
1100
+ */
1101
+ export declare function createPendulumClip(options: PendulumClipOptions): CameraClip;
1102
+
1106
1103
  /**
1107
1104
  * Generates vertices for two triangles based upon a quad.
1108
1105
  *
@@ -1173,6 +1170,17 @@ p2: [number, number, number], p3: [number, number, number], p4: [number, number,
1173
1170
  */
1174
1171
  export declare const createQuadraticCurvePoints: (start: Vector2, control: Vector2, end: Vector2, segments?: number) => Vector2[];
1175
1172
 
1173
+ /**
1174
+ * Create a random source.
1175
+ *
1176
+ * - **No seed** — wraps `Math.random()`. Unique every runtime; default for examples.
1177
+ * - **With seed** — {@link mulberry32} stream. Same seed ⇒ same sequence.
1178
+ */
1179
+ export declare function createRandom(seed?: number): RandomSource;
1180
+
1181
+ /** Hollow square profile extruded for one lattice ring (local XY, facing +Z). */
1182
+ export declare function createRingLatticeGeometry(outer: number, wall: number, depth: number): ExtrudeGeometry;
1183
+
1176
1184
  /**
1177
1185
  * Function to create sigmoid curve points
1178
1186
  *
@@ -1189,6 +1197,23 @@ export declare const createQuadraticCurvePoints: (start: Vector2, control: Vecto
1189
1197
  */
1190
1198
  export declare const createSigmoidCurvePoints: (start: Vector2, end: Vector2, a: number, segments?: number) => Vector2[];
1191
1199
 
1200
+ /**
1201
+ * Scene-transition spiral — orbit upward while looking down at the scene.
1202
+ * Camera rises and optionally widens its orbit; `lookAt` stays on the ground
1203
+ * target so the view pitches into a bird's-eye survey (not a horizontal orbit).
1204
+ */
1205
+ export declare function createSpiralClip(options: SpiralClipOptions): CameraClip;
1206
+
1207
+ /**
1208
+ * Impact wobble — short head-shake / recovery shake (gameplay feedback).
1209
+ * Decaying sinusoidal offset, not random noise. For showcase orbit rigs use
1210
+ * {@link createPendulumClip} instead.
1211
+ */
1212
+ export declare function createWobbleClip(options: WobbleClipOptions): CameraClip;
1213
+
1214
+ /** Focus punch — smooth FOV narrow toward a target. Restores FOV on cancel; keeps end FOV on complete. */
1215
+ export declare function createZoomClip(options: ZoomClipOptions): CameraClip;
1216
+
1192
1217
  export declare const crossfadeShader: {
1193
1218
  uniforms: {
1194
1219
  tDiffuseA: {
@@ -1297,6 +1322,22 @@ export declare interface DaySkyUniforms {
1297
1322
  bottomColor: Uniform<Color>;
1298
1323
  }
1299
1324
 
1325
+ /**
1326
+ * Derive an independent sub-stream seed from a master seed and domain salt.
1327
+ *
1328
+ * XOR the salt before mixing so each subsystem gets its own mulberry32 stream
1329
+ * without sequential `seed + 1` collision risk. Use stable hex constants per
1330
+ * domain (`0x101` books, `0x202` fog, `0x303` windows, …).
1331
+ *
1332
+ * @example
1333
+ * ```ts
1334
+ * const master = 1337;
1335
+ * const bookRng = createRandom(deriveSubSeed(master, 0x101));
1336
+ * const fogRng = createRandom(deriveSubSeed(master, 0x202));
1337
+ * ```
1338
+ */
1339
+ export declare function deriveSubSeed(masterSeed: number, salt: number): number;
1340
+
1300
1341
  /**
1301
1342
  * Material indices:
1302
1343
  * 0. Desk surface
@@ -1315,41 +1356,117 @@ export declare class DeskGeometry extends BufferGeometry {
1315
1356
  constructor();
1316
1357
  }
1317
1358
 
1359
+ /** Derive uniform cell size from center-to-corner periods. Legacy — prefer grid counts. */
1360
+ export declare function diamondLatticeCellFromCount(width: number, height: number, cellsAcross: number): number;
1361
+
1362
+ /**
1363
+ * Perpendicular distance from the window center to a corner along the diamond
1364
+ * grid axis (45° families share this spacing when square).
1365
+ */
1366
+ export declare function diamondLatticeCornerSpan(width: number, height: number): number;
1367
+
1368
+ /**
1369
+ * Axis-aligned diamond lattice — north/south vertices share a vertical axis,
1370
+ * east/west share a horizontal axis (`<>` not `><`).
1371
+ */
1372
+ export declare interface DiamondLatticeGrid {
1373
+ /** Horizontal half-diagonal of each quarrel (east–west point spacing). */
1374
+ a: number;
1375
+ /** Vertical half-diagonal of each quarrel (north–south point spacing). */
1376
+ b: number;
1377
+ /**
1378
+ * Came angle from +X; the two families run at `+angle` and `−angle`.
1379
+ * Equals 45° only when `a === b`.
1380
+ */
1381
+ angle: number;
1382
+ /** Shared perpendicular spacing for both came families. */
1383
+ spacing: number;
1384
+ }
1385
+
1318
1386
  /**
1319
- * A diorama with a floor and walls.
1387
+ * Build an axis-aligned diamond grid from cell counts.
1320
1388
  *
1321
- * Material indices:
1322
- * 0: Interior walls
1323
- * 1: Floor
1324
- * 2: Exterior walls
1389
+ * `cellsX` quarrels span the width (east–west); `cellsY` span the height.
1390
+ * Equal counts on a square opening yield square diamonds; `5×10` elongates them
1391
+ * vertically while keeping north/south tips on the same vertical axis.
1325
1392
  */
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
- });
1393
+ export declare function diamondLatticeGridFromCells(width: number, height: number, cellsX: number, cellsY: number): DiamondLatticeGrid;
1394
+
1395
+ declare interface DiamondLatticePartOptions {
1396
+ width: number;
1397
+ height: number;
1398
+ /** Center Y of the opening in local space. Defaults to `0`. */
1399
+ centerY?: number;
1400
+ grid: DiamondLatticeGrid;
1401
+ leadThickness: number;
1402
+ leadDepth: number;
1336
1403
  }
1337
1404
 
1405
+ /** @deprecated Use {@link diamondLatticeGridFromCells}. */
1406
+ export declare function diamondLatticeSpacingFromGrid(width: number, height: number, cellsX: number, cellsY: number): {
1407
+ plus45: number;
1408
+ minus45: number;
1409
+ };
1410
+
1338
1411
  /**
1339
- * Geometry for a diorama with a floor and walls.
1412
+ * Diamond lattice window diagonal lead cames with axis-aligned quarrels (`<>`).
1340
1413
  *
1341
- * Group indices:
1342
- * 0: Interior walls
1343
- * 1: Floor
1344
- * 2: Exterior walls
1414
+ * Local frame: centered on the opening, XY plane facing +Z. Lead and optional
1415
+ * glass share `z = 0`. Pair with a scene-owned backing plane behind the wall.
1345
1416
  */
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
- });
1417
+ export declare class DiamondLatticeWindow extends Group {
1418
+ readonly lattice: Mesh<DiamondLatticeWindowGeometry, MeshStandardMaterial>;
1419
+ readonly glass?: Mesh<PlaneGeometry, MeshPhysicalMaterial>;
1420
+ readonly cellsX: number;
1421
+ readonly cellsY: number;
1422
+ readonly fittedGrid: DiamondLatticeGrid;
1423
+ constructor({ leadColor, glass, glassColor, glassEmissive, glassEmissiveIntensity, ...geometryOptions }?: DiamondLatticeWindowOptions);
1424
+ }
1425
+
1426
+ /**
1427
+ * Diamond lattice window — outer frame plus diagonal cames.
1428
+ * Quarrel tips align to the vertical and horizontal axes (`<>`).
1429
+ * Built in the XY plane facing +Z.
1430
+ *
1431
+ * Glass is a separate pane on {@link DiamondLatticeWindow} — this geometry is
1432
+ * lead and frame only (casts shadow; glass typically does not).
1433
+ */
1434
+ export declare class DiamondLatticeWindowGeometry extends BufferGeometry {
1435
+ readonly cellsX: number;
1436
+ readonly cellsY: number;
1437
+ readonly fittedGrid: DiamondLatticeGrid;
1438
+ constructor({ width, height, leadThickness, leadDepth, cellsX, cellsY, centerY, }?: DiamondLatticeWindowGeometryOptions);
1439
+ }
1440
+
1441
+ declare interface DiamondLatticeWindowGeometryOptions {
1442
+ /** Opening width (world units). */
1443
+ width?: number;
1444
+ /** Opening height (world units). */
1445
+ height?: number;
1446
+ /** Lead came thickness (cross-section). Defaults to `0.055`. */
1447
+ leadThickness?: number;
1448
+ /** Lead depth (Z extent). Defaults to `0.11`. */
1449
+ leadDepth?: number;
1450
+ /** Quarrels spanning east–west across the opening. Defaults to `10`. */
1451
+ cellsX?: number;
1452
+ /** Quarrels spanning north–south across the opening. Defaults to `10`. */
1453
+ cellsY?: number;
1454
+ /** Vertical center of the opening in local geometry space. Defaults to `0`. */
1455
+ centerY?: number;
1456
+ }
1457
+
1458
+ declare interface DiamondLatticeWindowOptions extends DiamondLatticeWindowGeometryOptions {
1459
+ /** Lead + outer frame tint. Defaults to `#0c0f14`. */
1460
+ leadColor?: ColorRepresentation;
1461
+ /**
1462
+ * Optional glass pane coplanar with the lattice (same Z center).
1463
+ * Mad-science uses an emissive sky mesh in the scene instead.
1464
+ */
1465
+ glass?: boolean;
1466
+ glassColor?: ColorRepresentation;
1467
+ /** Glass emissive for moonlit / storm backlight. Defaults to off. */
1468
+ glassEmissive?: ColorRepresentation;
1469
+ glassEmissiveIntensity?: number;
1353
1470
  }
1354
1471
 
1355
1472
  /**
@@ -1432,6 +1549,12 @@ export declare const Direction: {
1432
1549
  */
1433
1550
  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
1551
 
1552
+ export declare interface DollyClipOptions extends CameraClipTiming {
1553
+ /** Distance along view axis — positive pulls back, negative pushes in. */
1554
+ distance: number;
1555
+ ease?: EasingFunction;
1556
+ }
1557
+
1435
1558
  /**
1436
1559
  * Easing functions for interpolating values over time.
1437
1560
  *
@@ -1732,6 +1855,12 @@ export declare function findClosestColorChannelWise(inputColor: number, dataset:
1732
1855
  */
1733
1856
  export declare function findClosestPoint(point: Vector3, mesh: Mesh): Vector3;
1734
1857
 
1858
+ /**
1859
+ * Snap cell size so diagonal cames align symmetrically at all four frame edges.
1860
+ * Legacy single-spacing helper — prefer {@link diamondLatticeGridFromCells}.
1861
+ */
1862
+ export declare function fitDiamondLatticeCell(width: number, height: number, preferredCell: number): number;
1863
+
1735
1864
  export declare class Flame extends Mesh<FlameGeometry, MeshStandardMaterial> {
1736
1865
  constructor({ height, radius, segmentsU, segmentsV }?: {
1737
1866
  height?: number | undefined;
@@ -1810,6 +1939,13 @@ export declare class FlorenceFlaskGeometry extends BufferGeometry {
1810
1939
  constructor();
1811
1940
  }
1812
1941
 
1942
+ export declare interface FlythroughClipOptions extends CameraClipTiming {
1943
+ waypoints: Vector3[];
1944
+ /** Optional look-at points per waypoint; defaults to next waypoint. */
1945
+ lookAt?: Vector3[];
1946
+ ease?: EasingFunction;
1947
+ }
1948
+
1813
1949
  export declare class Gear extends Mesh {
1814
1950
  constructor({ sides, innerRadius, outerRadius, holeSides, holeRadius, depth }?: {
1815
1951
  sides?: number | undefined;
@@ -1876,6 +2012,86 @@ export declare interface GlowHaloOptions {
1876
2012
  opacity?: number;
1877
2013
  }
1878
2014
 
2015
+ /** Pane dimensions derived from opening size and cell counts. */
2016
+ export declare interface GregorianLatticeGrid {
2017
+ /** Width of each rectangular pane. */
2018
+ paneWidth: number;
2019
+ /** Height of each rectangular pane. */
2020
+ paneHeight: number;
2021
+ }
2022
+
2023
+ /**
2024
+ * Derive pane size from cell counts.
2025
+ *
2026
+ * `cellsX` panes span the opening width; `cellsY` span the height. Mullions
2027
+ * divide the opening evenly so every segment is a full rectangle.
2028
+ */
2029
+ export declare function gregorianLatticeGridFromCells(width: number, height: number, cellsX: number, cellsY: number): GregorianLatticeGrid;
2030
+
2031
+ declare interface GregorianLatticePartOptions {
2032
+ width: number;
2033
+ height: number;
2034
+ /** Center Y of the opening in local space. Defaults to `0`. */
2035
+ centerY?: number;
2036
+ cellsX: number;
2037
+ cellsY: number;
2038
+ mullionThickness: number;
2039
+ mullionDepth: number;
2040
+ }
2041
+
2042
+ /**
2043
+ * Gregorian lattice window — rectangular pane grid with orthogonal mullions.
2044
+ *
2045
+ * Local frame: centered on the opening, XY plane facing +Z. Mullions and
2046
+ * optional glass share `z = 0`.
2047
+ */
2048
+ export declare class GregorianLatticeWindow extends Group {
2049
+ readonly mullions: Mesh<GregorianLatticeWindowGeometry, MeshStandardMaterial>;
2050
+ readonly glass?: Mesh<PlaneGeometry, MeshPhysicalMaterial>;
2051
+ readonly cellsX: number;
2052
+ readonly cellsY: number;
2053
+ readonly fittedGrid: GregorianLatticeGrid;
2054
+ constructor({ mullionColor, glass, glassColor, glassEmissive, glassEmissiveIntensity, ...geometryOptions }?: GregorianLatticeWindowOptions);
2055
+ }
2056
+
2057
+ /**
2058
+ * Gregorian lattice window — outer frame plus orthogonal mullions in a rectangular grid.
2059
+ * Built in the XY plane facing +Z.
2060
+ */
2061
+ export declare class GregorianLatticeWindowGeometry extends BufferGeometry {
2062
+ readonly cellsX: number;
2063
+ readonly cellsY: number;
2064
+ readonly fittedGrid: GregorianLatticeGrid;
2065
+ constructor({ width, height, mullionThickness, mullionDepth, cellsX, cellsY, centerY, }?: GregorianLatticeWindowGeometryOptions);
2066
+ }
2067
+
2068
+ declare interface GregorianLatticeWindowGeometryOptions {
2069
+ /** Opening width (world units). */
2070
+ width?: number;
2071
+ /** Opening height (world units). */
2072
+ height?: number;
2073
+ /** Mullion thickness (cross-section). Defaults to `0.055`. */
2074
+ mullionThickness?: number;
2075
+ /** Mullion depth (Z extent). Defaults to `0.11`. */
2076
+ mullionDepth?: number;
2077
+ /** Rectangular panes across the opening width. Defaults to `4`. */
2078
+ cellsX?: number;
2079
+ /** Rectangular panes up the opening height. Defaults to `6`. */
2080
+ cellsY?: number;
2081
+ /** Vertical center of the opening in local geometry space. Defaults to `0`. */
2082
+ centerY?: number;
2083
+ }
2084
+
2085
+ declare interface GregorianLatticeWindowOptions extends GregorianLatticeWindowGeometryOptions {
2086
+ /** Frame + mullion tint. Defaults to `#5c4033` (wood). */
2087
+ mullionColor?: ColorRepresentation;
2088
+ /** Optional glass pane coplanar with the mullions (same Z center). */
2089
+ glass?: boolean;
2090
+ glassColor?: ColorRepresentation;
2091
+ glassEmissive?: ColorRepresentation;
2092
+ glassEmissiveIntensity?: number;
2093
+ }
2094
+
1879
2095
  /**
1880
2096
  * Creeping ground mist — soft horizontal cards drifting above the floor.
1881
2097
  * Interior patches wrap toroidally within `area`; optional perimeter patches
@@ -1906,7 +2122,7 @@ export declare interface GroundFogEffectOptions {
1906
2122
  * horizons opposite the camera. Defaults to `0` (interior only).
1907
2123
  */
1908
2124
  perimeterCount?: number;
1909
- /** Half-extent of the inner bounded plot (fence, wall, diorama edge, etc.). Defaults to `12`. */
2125
+ /** Half-extent of the inner bounded plot (fence, wall, scene edge, etc.). Defaults to `12`. */
1910
2126
  plotHalf?: number;
1911
2127
  /** Terrain half-extent; perimeter cards spill outward toward this edge. Defaults to `16`. */
1912
2128
  terrainHalf?: number;
@@ -1927,6 +2143,90 @@ export declare interface GroundFogEffectOptions {
1927
2143
  heightAt?: (x: number, z: number) => number;
1928
2144
  }
1929
2145
 
2146
+ /**
2147
+ * Hanging wrought-iron lantern — open cage struts around a solid emissive
2148
+ * inner octahedron (glass-pane lamp). Mount, cage, and lamp use separate
2149
+ * material groups. Pair {@link GlowHalo} and {@link FlameFlickerEffect} at
2150
+ * `cageCenterY` for bloom and flicker.
2151
+ *
2152
+ * Local frame: origin at the chain top (hang point).
2153
+ */
2154
+ export declare class HangingLantern extends Mesh<HangingLanternGeometry, MeshStandardMaterial[]> {
2155
+ readonly drop: number;
2156
+ readonly cageCenterY: number;
2157
+ constructor({ color, mountColor, cageColor, lampColor, lampEmissiveIntensity, lampOpacity, inner, ...geometryOptions }?: HangingLanternOptions);
2158
+ }
2159
+
2160
+ /**
2161
+ * Wrought-iron hanging lantern frame — chain, cap, and open octahedron cage
2162
+ * built from edge struts.
2163
+ *
2164
+ * Material groups: `0` mount (chain + cap), `1` cage struts, `2` inner lamp
2165
+ * (solid octahedron).
2166
+ *
2167
+ * Local frame: origin at the chain top (hang point). The cage top vertex
2168
+ * attaches at the cap center, optionally lowered by `cageGap`.
2169
+ */
2170
+ export declare class HangingLanternGeometry extends BufferGeometry {
2171
+ readonly drop: number;
2172
+ readonly chainWidth: number;
2173
+ readonly capWidth: number;
2174
+ readonly capHeight: number;
2175
+ readonly capDepth: number;
2176
+ readonly capOffset: number;
2177
+ readonly cageRadius: number;
2178
+ readonly cageStretch: number;
2179
+ readonly cageGap: number;
2180
+ readonly cageBarWidth: number;
2181
+ readonly innerScale: number;
2182
+ readonly inner: boolean;
2183
+ /** Y of the cage center in local space (negative, below the hang point). */
2184
+ readonly cageCenterY: number;
2185
+ constructor({ drop, chainWidth, capWidth, capHeight, capDepth, capOffset, cageRadius, cageStretch, cageGap, cageBarWidth, innerScale, inner, }?: HangingLanternGeometryOptions);
2186
+ }
2187
+
2188
+ export declare interface HangingLanternGeometryOptions {
2189
+ /** Chain length from the hang point. Defaults to `3`. */
2190
+ drop?: number;
2191
+ /** Chain link cross-section. Defaults to `0.05`. */
2192
+ chainWidth?: number;
2193
+ /** Cap width (X). Defaults to `0.18`. */
2194
+ capWidth?: number;
2195
+ /** Cap height (Y). Defaults to `0.16`. */
2196
+ capHeight?: number;
2197
+ /** Cap depth (Z). Defaults to `0.18`. */
2198
+ capDepth?: number;
2199
+ /** Cap center offset below the chain bottom. Defaults to `0.02`. */
2200
+ capOffset?: number;
2201
+ /** Cage vertex radius before stretch. Defaults to `0.42`. */
2202
+ cageRadius?: number;
2203
+ /** Vertical stretch on the cage. Defaults to `1.4`. */
2204
+ cageStretch?: number;
2205
+ /** Extra downward offset below the cap-center cage attach. Defaults to `0`. */
2206
+ cageGap?: number;
2207
+ /** Cage strut thickness. Defaults to `0.03`. */
2208
+ cageBarWidth?: number;
2209
+ /** Inner lamp scale relative to the cage (inset to sit inside struts). Defaults to `0.96`. */
2210
+ innerScale?: number;
2211
+ /** Include the solid inner octahedron lamp volume. Defaults to `true`. */
2212
+ inner?: boolean;
2213
+ }
2214
+
2215
+ export declare interface HangingLanternOptions extends HangingLanternGeometryOptions {
2216
+ /** Wrought-iron tint for mount and cage. Defaults to `#171a1f`. */
2217
+ color?: ColorRepresentation;
2218
+ /** Mount iron tint (chain + cap). Defaults to `color`. */
2219
+ mountColor?: ColorRepresentation;
2220
+ /** Cage strut tint. Defaults to `color`. */
2221
+ cageColor?: ColorRepresentation;
2222
+ /** Inner lamp tint (emissive octahedron). Defaults to `#ffb45a`. */
2223
+ lampColor?: ColorRepresentation;
2224
+ /** Inner lamp emissive strength. Defaults to `1.4`. */
2225
+ lampEmissiveIntensity?: number;
2226
+ /** Inner lamp opacity for a glass-pane read. Defaults to `0.88`. */
2227
+ lampOpacity?: number;
2228
+ }
2229
+
1930
2230
  export declare class Heart extends Mesh {
1931
2231
  constructor({ size, width, height, tipDepth, depth }?: {
1932
2232
  size?: number | undefined;
@@ -2062,8 +2362,110 @@ export declare class JarGeometry extends BufferGeometry {
2062
2362
  constructor();
2063
2363
  }
2064
2364
 
2065
- export declare class Lantern extends Group {
2066
- constructor(height?: number, baseWidth?: number);
2365
+ /**
2366
+ * Tabletop lantern — frame around an emissive glass body. Geometry only; add
2367
+ * {@link GlowHalo} and {@link FlameFlickerEffect} at `lampCenterY` in the
2368
+ * scene.
2369
+ *
2370
+ * Local frame: sits on the Y=0 plane.
2371
+ */
2372
+ export declare class Lantern extends Mesh<LanternGeometry, MeshStandardMaterial[]> {
2373
+ readonly lampCenterY: number;
2374
+ constructor(heightOrOptions?: number | LanternOptions, baseWidth?: number);
2375
+ }
2376
+
2377
+ /**
2378
+ * Tabletop lantern — wood/metal base, roof, and handle framing an emissive
2379
+ * glass body.
2380
+ *
2381
+ * Material groups: `0` frame (base + roof + handle), `1` glass body.
2382
+ *
2383
+ * Local frame: sits on the Y=0 plane; lamp center at `lampCenterY`.
2384
+ */
2385
+ export declare class LanternGeometry extends BufferGeometry {
2386
+ readonly baseWidth: number;
2387
+ readonly bodyHeight: number;
2388
+ readonly baseHeight: number;
2389
+ readonly innerScale: number;
2390
+ readonly inner: boolean;
2391
+ readonly lampCenterY: number;
2392
+ constructor({ baseWidth, bodyHeight, baseHeight, roofHeight, roofRadius, glassRadiusScale, innerScale, handleRadius, handleTubeRadius, handleLift, segments, inner, }?: LanternGeometryOptions);
2393
+ }
2394
+
2395
+ export declare interface LanternGeometryOptions {
2396
+ /** Base / foot radius. Defaults to `0.5`. */
2397
+ baseWidth?: number;
2398
+ /** Glass body height. Defaults to `1.3`. */
2399
+ bodyHeight?: number;
2400
+ /** Base height. Defaults to `0.2`. */
2401
+ baseHeight?: number;
2402
+ /** Roof cone height. Defaults to `0.5`. */
2403
+ roofHeight?: number;
2404
+ /** Roof cone radius. Defaults to `baseWidth * 1.1`. */
2405
+ roofRadius?: number;
2406
+ /** Glass radius relative to `baseWidth`. Defaults to `0.9`. */
2407
+ glassRadiusScale?: number;
2408
+ /** Glass height inset relative to `bodyHeight`. Defaults to `0.96`. */
2409
+ innerScale?: number;
2410
+ /** Carry-handle major radius. Defaults to `baseWidth * 0.8`. */
2411
+ handleRadius?: number;
2412
+ /** Carry-handle tube radius. Defaults to `0.05`. */
2413
+ handleTubeRadius?: number;
2414
+ /** Gap above the roof to the handle center. Defaults to `0.35`. */
2415
+ handleLift?: number;
2416
+ /** Radial segments on round parts. Defaults to `8`. */
2417
+ segments?: number;
2418
+ /** Include the emissive glass body. Defaults to `true`. */
2419
+ inner?: boolean;
2420
+ }
2421
+
2422
+ export declare interface LanternOptions extends LanternGeometryOptions {
2423
+ /** Frame tint (base, roof, handle). Defaults to `#8b4513`. */
2424
+ color?: ColorRepresentation;
2425
+ /** Glass lamp tint. Defaults to `#ffd700`. */
2426
+ lampColor?: ColorRepresentation;
2427
+ /** Glass emissive strength. Defaults to `1.2`. */
2428
+ lampEmissiveIntensity?: number;
2429
+ /** Glass opacity. Defaults to `0.75`. */
2430
+ lampOpacity?: number;
2431
+ }
2432
+
2433
+ /**
2434
+ * Folded autumn leaf prefab — {@link LeafGeometry} with flat-shaded double-sided
2435
+ * material matching the graveyard blowing-leaves look.
2436
+ *
2437
+ * Local frame: tip at +Y, base at −Y, fold rises along +Z.
2438
+ */
2439
+ export declare class Leaf extends Mesh<LeafGeometry, MeshStandardMaterial> {
2440
+ readonly size: number;
2441
+ readonly lift: number;
2442
+ constructor({ color, ...geometryOptions }?: LeafOptions);
2443
+ }
2444
+
2445
+ /**
2446
+ * Low-poly folded leaf — a pointed ellipse with a gently raised midrib so it
2447
+ * catches rim light instead of reading as a flat sliver. Spine vertices sit
2448
+ * slightly above the mirrored rim outline, giving a soft V cross-section under
2449
+ * flat shading.
2450
+ *
2451
+ * Local frame: tip at +Y, base at −Y, fold rises along +Z.
2452
+ */
2453
+ export declare class LeafGeometry extends BufferGeometry {
2454
+ readonly size: number;
2455
+ readonly lift: number;
2456
+ constructor({ size, lift }?: LeafGeometryOptions);
2457
+ }
2458
+
2459
+ export declare interface LeafGeometryOptions {
2460
+ /** Overall leaf scale. Defaults to `0.13`. */
2461
+ size?: number;
2462
+ /** Midrib rise above the rim as a fraction of size. Defaults to `0.22`. */
2463
+ lift?: number;
2464
+ }
2465
+
2466
+ export declare interface LeafOptions extends LeafGeometryOptions {
2467
+ /** Leaf tint. Defaults to `#a8702c`. */
2468
+ color?: ColorRepresentation;
2067
2469
  }
2068
2470
 
2069
2471
  export declare class LeverPanel extends Group {
@@ -2142,7 +2544,7 @@ export declare const LineEquations: {
2142
2544
  * @param {number} [max=1] - Maximum value of the range.
2143
2545
  * @returns {number} A random number between `min` and `max`, skewed towards `max`.
2144
2546
  */
2145
- export declare function logarithmicRandomMax(exponent?: number, min?: number, max?: number): number;
2547
+ export declare function logarithmicRandomMax(exponent?: number, min?: number, max?: number, source?: RandomSource): number;
2146
2548
 
2147
2549
  /**
2148
2550
  * Generates a random number skewed towards the minimum value.
@@ -2154,10 +2556,56 @@ export declare function logarithmicRandomMax(exponent?: number, min?: number, ma
2154
2556
  * @param {number} [max=1] - Maximum value of the range.
2155
2557
  * @returns {number} A random number between `min` and `max`, skewed towards `min`.
2156
2558
  */
2157
- export declare function logarithmicRandomMin(exponent?: number, min?: number, max?: number): number;
2559
+ export declare function logarithmicRandomMin(exponent?: number, min?: number, max?: number, source?: RandomSource): number;
2560
+
2561
+ /**
2562
+ * L-shaped staircase prefab — two flights with a square width × width landing.
2563
+ */
2564
+ export declare class LShapedStaircase extends Mesh<LShapedStaircaseGeometry, MeshStandardMaterial> {
2565
+ readonly width: number;
2566
+ readonly riserHeight: number;
2567
+ readonly treadDepth: number;
2568
+ readonly stepsPerFlight: number;
2569
+ readonly landingSize: number;
2570
+ readonly flightRun: number;
2571
+ readonly totalHeight: number;
2572
+ constructor({ color, ...geometryOptions }?: LShapedStaircaseOptions);
2573
+ }
2158
2574
 
2575
+ /**
2576
+ * L-shaped staircase with a square landing (width × width) at the 90° turn.
2577
+ *
2578
+ * Local frame:
2579
+ * - First flight climbs +Z, centered on X = 0.
2580
+ * - Landing is a width² platform starting at the last tread (no cantilever over
2581
+ * the lower flight) and extending forward at the turn.
2582
+ * - Second flight climbs −X from the left edge of the landing.
2583
+ */
2159
2584
  export declare class LShapedStaircaseGeometry extends BufferGeometry {
2160
- constructor(stepWidth?: number, stepHeight?: number, stepDepth?: number, numStepsPerFlight?: number, landingDepth?: number);
2585
+ readonly width: number;
2586
+ readonly riserHeight: number;
2587
+ readonly treadDepth: number;
2588
+ readonly stepsPerFlight: number;
2589
+ readonly landingSize: number;
2590
+ readonly flightRun: number;
2591
+ readonly totalHeight: number;
2592
+ constructor({ width, riserHeight, treadDepth, stepsPerFlight, }?: LShapedStaircaseGeometryOptions);
2593
+ }
2594
+
2595
+ export declare interface LShapedStaircaseGeometryOptions {
2596
+ /** Stair width (tread left–right extent). Defaults to `2`. */
2597
+ width?: number;
2598
+ /** Vertical rise per step (riser). Defaults to `0.3`. */
2599
+ riserHeight?: number;
2600
+ /** Horizontal run per step (tread depth). Defaults to `0.5`. */
2601
+ treadDepth?: number;
2602
+ /** Steps in each flight (before and after the landing). Defaults to `5`. */
2603
+ stepsPerFlight?: number;
2604
+ }
2605
+
2606
+ export declare interface LShapedStaircaseOptions extends LShapedStaircaseGeometryOptions {
2607
+ /** Tread and riser tint. Defaults to `#8b4513`. */
2608
+ color?: ColorRepresentation;
2161
2609
  }
2162
2610
 
2163
2611
  /**
@@ -2188,24 +2636,6 @@ export declare class Microscope extends Group {
2188
2636
  constructor();
2189
2637
  }
2190
2638
 
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
2639
  export declare class MortarAndPestle extends Group {
2210
2640
  constructor();
2211
2641
  }
@@ -2290,6 +2720,12 @@ export declare class MoundGeometry extends BufferGeometry {
2290
2720
  });
2291
2721
  }
2292
2722
 
2723
+ /**
2724
+ * Fast seeded PRNG — portfolio Gotham/Water parity.
2725
+ * Returns a closure yielding floats in [0, 1).
2726
+ */
2727
+ export declare function mulberry32(seed: number): RandomStream;
2728
+
2293
2729
  export declare class NightSkybox extends Mesh {
2294
2730
  geometry: SphereGeometry;
2295
2731
  material: ShaderMaterial & {
@@ -2389,6 +2825,16 @@ declare interface ObeliskHeadstoneOptions {
2389
2825
  totalHeight?: number;
2390
2826
  }
2391
2827
 
2828
+ export declare interface OrbitClipOptions extends CameraClipTiming {
2829
+ target: Vector3;
2830
+ /** Horizontal distance from target. Defaults to current camera distance. */
2831
+ radius?: number;
2832
+ /** Elevation above target Y in radians. Defaults to current camera elevation. */
2833
+ elevation?: number;
2834
+ /** Revolutions over the clip. Defaults to `1`. */
2835
+ revolutions?: number;
2836
+ }
2837
+
2392
2838
  /**
2393
2839
  * Prefab for a panel.
2394
2840
  * Designed to be used as a control panel for switches, lights, levels, dials, and gauges.
@@ -2456,6 +2902,17 @@ export declare const ParametricCurveUtils: {
2456
2902
  */
2457
2903
  export declare function parseHexCode(hex: string): [number, number, number];
2458
2904
 
2905
+ export declare interface PendulumClipOptions extends CameraClipTiming {
2906
+ target: Vector3;
2907
+ /** Distance from target. Defaults to current camera distance. */
2908
+ distance?: number;
2909
+ /** Peak azimuth swing in radians — keep small for Ken Burns mood (e.g. `0.12`). */
2910
+ azimuthAmplitude?: number;
2911
+ /** Slow back-and-forth cycles over the clip. Defaults to `2`. */
2912
+ oscillations?: number;
2913
+ ease?: EasingFunction;
2914
+ }
2915
+
2459
2916
  /**
2460
2917
  * Soft, slow-drifting petals (or leaves) falling through a bounded volume —
2461
2918
  * cherry-blossom float rather than stiff tumble. Each instance drifts downward
@@ -2710,18 +3167,126 @@ export declare interface RainEffectOptions {
2710
3167
  intensity?: number;
2711
3168
  }
2712
3169
 
3170
+ /**
3171
+ * Grouped exports — same function API, namespace import like {@link Easing}.
3172
+ *
3173
+ * @example
3174
+ * ```ts
3175
+ * import { Random } from "three-low-poly";
3176
+ * const rng = Random.create(deriveSubSeed(1337, 0x101));
3177
+ * ```
3178
+ */
3179
+ export declare const Random: {
3180
+ readonly create: typeof createRandom;
3181
+ readonly mulberry32: typeof mulberry32;
3182
+ readonly splitmix32: typeof splitmix32;
3183
+ readonly deriveSubSeed: typeof deriveSubSeed;
3184
+ readonly range: typeof randomRange;
3185
+ readonly pick: typeof randomPick;
3186
+ };
3187
+
2713
3188
  /**
2714
3189
  * Generates a random number between `min` and `max`.
2715
3190
  */
2716
- export declare function randomFloat(min?: number, max?: number): number;
3191
+ export declare function randomFloat(min?: number, max?: number, source?: RandomSource): number;
2717
3192
 
2718
3193
  /**
2719
3194
  * Generates a random integer between `min` and `max`.
2720
3195
  */
2721
- export declare function randomInteger(min?: number, max?: number): number;
3196
+ export declare function randomInteger(min?: number, max?: number, source?: RandomSource): number;
3197
+
3198
+ /** Pick from a non-empty array using any stream — website `pick()` parity. */
3199
+ export declare function randomPick<T>(stream: RandomStream, arr: readonly T[]): T;
3200
+
3201
+ /** Float in [min, max) from any stream — website `range()` parity. */
3202
+ export declare function randomRange(stream: RandomStream, min: number, max: number): number;
3203
+
3204
+ /**
3205
+ * Random source — a stream plus distribution helpers.
3206
+ * Returned by {@link createRandom}; also accepted by {@link RandomNumberUtils}.
3207
+ */
3208
+ export declare interface RandomSource {
3209
+ /** `true` when backed by {@link mulberry32}; `false` when using `Math.random()`. */
3210
+ readonly seeded: boolean;
3211
+ /** Next float in [0, 1). */
3212
+ next(): number;
3213
+ /** Float in [min, max). */
3214
+ float(min?: number, max?: number): number;
3215
+ /** Integer in [min, max] (inclusive). */
3216
+ int(min?: number, max?: number): number;
3217
+ /** Uniform element from a non-empty array. */
3218
+ pick<T>(arr: readonly T[]): T;
3219
+ /** `true` with given probability (default 0.5). */
3220
+ boolean(probability?: number): boolean;
3221
+ /**
3222
+ * Skew toward `max`. Lower `exponent` = stronger bias.
3223
+ * Mirrors {@link logarithmicRandomMax}.
3224
+ */
3225
+ skewMax(exponent?: number, min?: number, max?: number): number;
3226
+ /**
3227
+ * Skew toward `min`. Lower `exponent` = stronger bias.
3228
+ * Mirrors {@link logarithmicRandomMin}.
3229
+ */
3230
+ skewMin(exponent?: number, min?: number, max?: number): number;
3231
+ }
3232
+
3233
+ /**
3234
+ * Randomness for procedural generation — unseeded by default, reproducible on demand.
3235
+ *
3236
+ * ---
3237
+ *
3238
+ * ### Layer 1 — stream primitive (portfolio parity)
3239
+ *
3240
+ * - {@link mulberry32} — fast seeded PRNG; returns a `() => number` closure yielding
3241
+ * floats in `[0, 1)`. Same algorithm as Gotham/Water on the portfolio site.
3242
+ *
3243
+ * ### Seed mixing
3244
+ *
3245
+ * - {@link splitmix32} — mixer only, **not** a stream. Maps one 32-bit value to another.
3246
+ * - {@link deriveSubSeed} — `splitmix32(masterSeed ^ salt)`. Fan one user-facing master
3247
+ * seed into independent sub-streams per subsystem. Use stable hex salts per domain
3248
+ * (`0x101` books, `0x202` fog, `0x303` windows, …) instead of `seed + n` offsets.
3249
+ *
3250
+ * ### Layer 2 — library ergonomics
3251
+ *
3252
+ * - {@link createRandom} — **no seed** → wraps `Math.random()`, unique every runtime
3253
+ * (showcase default). **With seed** → {@link mulberry32} stream, same seed ⇒ same sequence.
3254
+ * - Returns a {@link RandomSource}: `next`, `float`, `int`, `pick`, `boolean`, `skewMax`, `skewMin`.
3255
+ * - {@link Random} namespace — grouped exports, same API as standalone functions (like {@link Easing}).
3256
+ *
3257
+ * ### Layer 3 — {@link RandomNumberUtils}
3258
+ *
3259
+ * Existing helpers (`randomFloat`, `logarithmicRandomMax`, …) accept an optional
3260
+ * {@link RandomSource} as their last argument. Omit it for unseeded default behavior.
3261
+ *
3262
+ * ---
3263
+ *
3264
+ * @example Unique runtime (default)
3265
+ * ```ts
3266
+ * const rng = createRandom();
3267
+ * rng.float(0, 10); // different every page load
3268
+ * ```
3269
+ *
3270
+ * @example Reproducible layout with sub-seeds
3271
+ * ```ts
3272
+ * const master = 1337;
3273
+ * const books = createRandom(deriveSubSeed(master, 0x101));
3274
+ * const fog = createRandom(deriveSubSeed(master, 0x202));
3275
+ * ```
3276
+ *
3277
+ * @example Namespace import
3278
+ * ```ts
3279
+ * const rng = Random.create(deriveSubSeed(1337, 0x101));
3280
+ * ```
3281
+ */
3282
+ /** Callable stream returning floats in [0, 1). */
3283
+ export declare type RandomStream = () => number;
2722
3284
 
2723
3285
  export declare function randomTransformVertices<T extends BufferGeometry>(geometry: T, axis?: Vector3, minScale?: number, maxScale?: number): T;
2724
3286
 
3287
+ /** Resolve uniform ring spacing — `cell` wins over the `cellsX` density hint. */
3288
+ export declare function resolveRingLatticeCell(width: number, _height: number, cell?: number, cellsX?: number): number;
3289
+
2725
3290
  export declare function rgbToHex(r: number, g: number, b: number): number;
2726
3291
 
2727
3292
  /**
@@ -2736,6 +3301,84 @@ export declare function rgbToHex(r: number, g: number, b: number): number;
2736
3301
  */
2737
3302
  export declare function rgbToHsl(r: number, g: number, b: number): [number, number, number];
2738
3303
 
3304
+ /** Ring-spacing factor — overlap tightens as this approaches 1. */
3305
+ export declare const RING_LATTICE_SPACING_FACTOR = 0.96;
3306
+
3307
+ declare interface RingLatticeFramePartOptions {
3308
+ width: number;
3309
+ height: number;
3310
+ centerY?: number;
3311
+ frameThickness: number;
3312
+ frameDepth: number;
3313
+ }
3314
+
3315
+ export declare interface RingLatticeGrid {
3316
+ /** Requested ring-center spacing before the overlap factor. */
3317
+ cell: number;
3318
+ /** Effective center spacing (`cell × 0.96`). */
3319
+ latticeCell: number;
3320
+ /** Outer half-extent of each square ring profile. */
3321
+ ringOuter: number;
3322
+ /** Ring instance count. */
3323
+ count: number;
3324
+ }
3325
+
3326
+ declare interface RingLatticeSpotOptions {
3327
+ width: number;
3328
+ height: number;
3329
+ centerY?: number;
3330
+ cell: number;
3331
+ }
3332
+
3333
+ /** Ring-center positions overscanning the opening (stencil trims the excess). */
3334
+ export declare function ringLatticeSpots({ width, height, centerY, cell, }: RingLatticeSpotOptions): {
3335
+ spots: [number, number][];
3336
+ grid: RingLatticeGrid;
3337
+ };
3338
+
3339
+ /**
3340
+ * Ring lattice window — overlapping square rings on a uniform grid (diaper /
3341
+ * trellis fretwork), stencil-clipped to a rectangular opening.
3342
+ */
3343
+ export declare class RingLatticeWindow extends Group {
3344
+ readonly lattice: InstancedMesh;
3345
+ readonly frame: Mesh;
3346
+ readonly glass?: Mesh<PlaneGeometry, MeshPhysicalMaterial>;
3347
+ readonly cell: number;
3348
+ readonly fittedGrid: RingLatticeGrid;
3349
+ private readonly clipPlanesLocal;
3350
+ private readonly clipPlanesWorld;
3351
+ constructor({ width, height, cell: cellOption, cellsX, centerY, ringThickness, ringDepth, frameThickness, frameDepth, latticeColor, glass, glassColor, glassEmissive, glassEmissiveIntensity, }?: RingLatticeWindowOptions);
3352
+ }
3353
+
3354
+ declare interface RingLatticeWindowOptions {
3355
+ /** Opening width (world units). */
3356
+ width?: number;
3357
+ /** Opening height (world units). */
3358
+ height?: number;
3359
+ /** Uniform ring-center spacing. Overrides `cellsX` when set. Defaults to `0.55`. */
3360
+ cell?: number;
3361
+ /** Density hint — `cell = width / cellsX` when `cell` is omitted. */
3362
+ cellsX?: number;
3363
+ /** Wall thickness of each square ring profile. Defaults to `0.05`. */
3364
+ ringThickness?: number;
3365
+ /** Extrusion depth of each ring. Defaults to `0.06`. */
3366
+ ringDepth?: number;
3367
+ /** Outer frame bar thickness. Defaults to `0.055`. */
3368
+ frameThickness?: number;
3369
+ /** Outer frame depth (Z). Defaults to `0.11`. */
3370
+ frameDepth?: number;
3371
+ /** Vertical center of the opening in local space. Defaults to `0`. */
3372
+ centerY?: number;
3373
+ /** Lattice + frame tint. Defaults to `#0c0f14`. */
3374
+ latticeColor?: ColorRepresentation;
3375
+ /** Optional glass pane recessed slightly on −Z. */
3376
+ glass?: boolean;
3377
+ glassColor?: ColorRepresentation;
3378
+ glassEmissive?: ColorRepresentation;
3379
+ glassEmissiveIntensity?: number;
3380
+ }
3381
+
2739
3382
  export declare class Rock extends Mesh<RockGeometry, MeshStandardMaterial> {
2740
3383
  constructor(radius?: number, widthSegments?: number, heightSegments?: number);
2741
3384
  }
@@ -2763,22 +3406,24 @@ export declare class RoundedHeadstoneGeometry extends BufferGeometry {
2763
3406
  /**
2764
3407
  * Creates a row of books with a given count.
2765
3408
  */
2766
- export declare function rowOfBooksByCount<T extends Material>({ coverMaterial, pagesMaterial, count, scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax, }: RowOfBooksOptions<T>): InstancedMesh;
3409
+ export declare function rowOfBooksByCount<T extends Material>({ coverMaterial, pagesMaterial, count, scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax, seed, }: RowOfBooksOptions<T>): InstancedMesh;
2767
3410
 
2768
3411
  /**
2769
3412
  * Creates a row of books with a total length.
2770
3413
  */
2771
- export declare function rowOfBooksByLength<T extends Material>({ coverMaterial, pagesMaterial, length, scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax, }: RowOfBooksOptions<T>): InstancedMesh;
3414
+ export declare function rowOfBooksByLength<T extends Material>({ coverMaterial, pagesMaterial, length, scaleXMin, scaleXMax, scaleYMin, scaleYMax, scaleZMin, scaleZMax, seed, }: RowOfBooksOptions<T>): InstancedMesh;
2772
3415
 
2773
3416
  /**
2774
3417
  * Creates a row of books from the scales array of Vector3.
2775
3418
  */
2776
- export declare function rowOfBooksByScales<T extends Material>({ coverMaterial, pagesMaterial, scales, }: RowOfBooksByScalesOptions<T>): InstancedMesh;
3419
+ export declare function rowOfBooksByScales<T extends Material>({ coverMaterial, pagesMaterial, scales, source, }: RowOfBooksByScalesOptions<T>): InstancedMesh;
2777
3420
 
2778
3421
  declare interface RowOfBooksByScalesOptions<T extends Material = Material> {
2779
3422
  coverMaterial: T;
2780
3423
  pagesMaterial: T;
2781
3424
  scales: Vector3[];
3425
+ /** Shared stream for shelf jitter — must be the same source that built `scales`. */
3426
+ source: RandomSource;
2782
3427
  }
2783
3428
 
2784
3429
  declare interface RowOfBooksOptions<T extends Material = Material> {
@@ -2792,6 +3437,8 @@ declare interface RowOfBooksOptions<T extends Material = Material> {
2792
3437
  scaleYMax?: number;
2793
3438
  scaleZMin?: number;
2794
3439
  scaleZMax?: number;
3440
+ /** Optional seed for reproducible layout. Omit for unique runtime. */
3441
+ seed?: number;
2795
3442
  }
2796
3443
 
2797
3444
  /**
@@ -3108,14 +3755,89 @@ export declare function sphericalUVMapping(vertices: [number, number, number][])
3108
3755
  */
3109
3756
  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
3757
 
3758
+ export declare interface SpiralClipOptions extends CameraClipTiming {
3759
+ /** Ground point to look down at (typically scene center, `y = 0`). */
3760
+ target: Vector3;
3761
+ /** Orbit radius at the start of the clip. */
3762
+ radius: number;
3763
+ /** Optional wider radius at the end — pulls back as you rise. Defaults to `radius`. */
3764
+ endRadius?: number;
3765
+ /** Total vertical rise over the clip. */
3766
+ height: number;
3767
+ revolutions: number;
3768
+ ease?: EasingFunction;
3769
+ }
3770
+
3771
+ /**
3772
+ * Turret-style spiral staircase prefab — wraps {@link SpiralStaircaseGeometry}.
3773
+ */
3774
+ export declare class SpiralStaircase extends Mesh<SpiralStaircaseGeometry, MeshStandardMaterial> {
3775
+ readonly innerRadius: number;
3776
+ readonly width: number;
3777
+ readonly outerRadius: number;
3778
+ readonly treadDepth: number;
3779
+ readonly riserHeight: number;
3780
+ readonly stepCount: number;
3781
+ readonly stepAngle: number;
3782
+ readonly totalHeight: number;
3783
+ readonly totalTurn: number;
3784
+ constructor({ color, ...geometryOptions }?: SpiralStaircaseOptions);
3785
+ }
3786
+
3787
+ /**
3788
+ * Turret-style spiral staircase — trapezoidal treads between an inner newel radius
3789
+ * and an outer wall radius, ascending counter-clockwise when viewed from above.
3790
+ *
3791
+ * Each step is a four-sided tread (no pinched center point). Step angle is
3792
+ * derived from tread depth at the mid-radius so treads meet without overlapping.
3793
+ */
3111
3794
  export declare class SpiralStaircaseGeometry extends BufferGeometry {
3112
- constructor(stepWidth?: number, stepDepth?: number, stepHeight?: number, numSteps?: number, radius?: number, angleIncrement?: number);
3795
+ readonly innerRadius: number;
3796
+ readonly width: number;
3797
+ readonly outerRadius: number;
3798
+ readonly treadDepth: number;
3799
+ readonly riserHeight: number;
3800
+ readonly stepCount: number;
3801
+ readonly startAngle: number;
3802
+ readonly stepAngle: number;
3803
+ readonly totalHeight: number;
3804
+ readonly totalTurn: number;
3805
+ constructor({ innerRadius, width, treadDepth, riserHeight, stepCount, startAngle, stepAngle: stepAngleOption, }?: SpiralStaircaseGeometryOptions);
3806
+ }
3807
+
3808
+ export declare interface SpiralStaircaseGeometryOptions {
3809
+ /** Newel / center-hole radius (inner edge of every tread). Defaults to `0.45`. */
3810
+ innerRadius?: number;
3811
+ /** Radial tread width (outer − inner radius). Defaults to `1.95`. */
3812
+ width?: number;
3813
+ /** Arc run per step at the walking line (mid-radius). Defaults to `0.45`. */
3814
+ treadDepth?: number;
3815
+ /** Vertical rise per step (riser). Defaults to `0.2`. */
3816
+ riserHeight?: number;
3817
+ /** Number of steps. Defaults to `20`. */
3818
+ stepCount?: number;
3819
+ /** Spiral start angle in radians (+X = 0, CCW). Defaults to `0`. */
3820
+ startAngle?: number;
3821
+ /** Override step angle (radians). When omitted, derived from `treadDepth`. */
3822
+ stepAngle?: number;
3823
+ }
3824
+
3825
+ export declare interface SpiralStaircaseOptions extends SpiralStaircaseGeometryOptions {
3826
+ /** Tread and riser tint. Defaults to `#8b4513`. */
3827
+ color?: ColorRepresentation;
3113
3828
  }
3114
3829
 
3115
3830
  export declare class SpiralTube extends Group {
3116
3831
  constructor();
3117
3832
  }
3118
3833
 
3834
+ /**
3835
+ * Seed mixer — maps one 32-bit value to another well-distributed value.
3836
+ * Use with {@link deriveSubSeed}, not as a drop-in stream replacement for
3837
+ * {@link mulberry32}.
3838
+ */
3839
+ export declare function splitmix32(seed: number): number;
3840
+
3119
3841
  export declare class SquareHeadstone extends Mesh<SquareHeadstoneGeometry, MeshStandardMaterial> {
3120
3842
  constructor(width?: number, height?: number, depth?: number);
3121
3843
  }
@@ -3124,8 +3846,53 @@ export declare class SquareHeadstoneGeometry extends BufferGeometry {
3124
3846
  constructor(width?: number, height?: number, depth?: number);
3125
3847
  }
3126
3848
 
3849
+ /**
3850
+ * Straight run staircase prefab — {@link StaircaseGeometry} with a wood-tone
3851
+ * default material.
3852
+ *
3853
+ * Local frame: centered on width, rises along +Y, runs along +Z.
3854
+ */
3855
+ export declare class Staircase extends Mesh<StaircaseGeometry, MeshStandardMaterial> {
3856
+ readonly width: number;
3857
+ readonly riserHeight: number;
3858
+ readonly treadDepth: number;
3859
+ readonly stepCount: number;
3860
+ readonly totalHeight: number;
3861
+ readonly totalDepth: number;
3862
+ constructor({ color, ...geometryOptions }?: StaircaseOptions);
3863
+ }
3864
+
3865
+ /**
3866
+ * Straight run staircase — open risers and treads (no side stringers yet).
3867
+ *
3868
+ * Local frame: centered on width, rises along +Y, runs along +Z. Each step
3869
+ * emits a front riser (+Z) and a top tread (+Y). UVs are normalized per face
3870
+ * (0–1) so materials can tile per step.
3871
+ */
3127
3872
  export declare class StaircaseGeometry extends BufferGeometry {
3128
- constructor(width?: number, stepHeight?: number, stepDepth?: number, numSteps?: number);
3873
+ readonly width: number;
3874
+ readonly riserHeight: number;
3875
+ readonly treadDepth: number;
3876
+ readonly stepCount: number;
3877
+ readonly totalHeight: number;
3878
+ readonly totalDepth: number;
3879
+ constructor({ width, riserHeight, treadDepth, stepCount, }?: StaircaseGeometryOptions);
3880
+ }
3881
+
3882
+ export declare interface StaircaseGeometryOptions {
3883
+ /** Stair width (tread left–right extent). Defaults to `2`. */
3884
+ width?: number;
3885
+ /** Vertical rise per step (riser). Defaults to `0.3`. */
3886
+ riserHeight?: number;
3887
+ /** Horizontal run per step (tread depth). Defaults to `0.5`. */
3888
+ treadDepth?: number;
3889
+ /** Number of steps. Defaults to `10`. */
3890
+ stepCount?: number;
3891
+ }
3892
+
3893
+ export declare interface StaircaseOptions extends StaircaseGeometryOptions {
3894
+ /** Tread and riser tint. Defaults to `#8b4513`. */
3895
+ color?: ColorRepresentation;
3129
3896
  }
3130
3897
 
3131
3898
  export declare class Stand extends Mesh<StandGeometry, MeshStandardMaterial> {
@@ -3434,6 +4201,107 @@ export declare function updateNoiseDisplacementTime<T extends Material>(material
3434
4201
  */
3435
4202
  export declare function updateWaterDisplacementTime<T extends Material>(material: T, deltaTime: number): void;
3436
4203
 
4204
+ /**
4205
+ * Wall-mounted oil-lamp sconce — iron mount and cap/bowl frame around an
4206
+ * emissive glass chimney. Pair {@link GlowHalo} and {@link FlameFlickerEffect}
4207
+ * at `(lightCenterX, lightCenterY, lightCenterZ)` for bloom and flicker.
4208
+ *
4209
+ * Local frame: faces +X from a −X wall.
4210
+ */
4211
+ export declare class WallSconce extends Mesh<WallSconceGeometry, MeshStandardMaterial[]> {
4212
+ readonly lightCenterX: number;
4213
+ readonly lightCenterY: number;
4214
+ readonly lightCenterZ: number;
4215
+ constructor({ color, mountColor, frameColor, lampColor, lampEmissiveIntensity, lampOpacity, inner, ...geometryOptions }?: WallSconceOptions);
4216
+ }
4217
+
4218
+ /**
4219
+ * Wall-mounted oil-lamp sconce — iron mount, cap, and bowl framing an emissive
4220
+ * glass chimney.
4221
+ *
4222
+ * Material groups: `0` mount (plate + bracket), `1` iron frame (cap + bowl),
4223
+ * `2` glass chimney.
4224
+ *
4225
+ * Local frame: faces +X from a −X wall; lamp center at
4226
+ * `(bodyOffsetX, chimneyCenterY, 0)`.
4227
+ */
4228
+ export declare class WallSconceGeometry extends BufferGeometry {
4229
+ readonly bodyOffsetX: number;
4230
+ readonly chimneyCenterY: number;
4231
+ readonly innerScale: number;
4232
+ readonly inner: boolean;
4233
+ readonly lightCenterX: number;
4234
+ readonly lightCenterY: number;
4235
+ readonly lightCenterZ: number;
4236
+ 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);
4237
+ }
4238
+
4239
+ export declare interface WallSconceGeometryOptions {
4240
+ /** Wall-plate thickness (X). Defaults to `0.05`. */
4241
+ plateThickness?: number;
4242
+ /** Wall-plate height (Y). Defaults to `0.22`. */
4243
+ plateHeight?: number;
4244
+ /** Wall-plate depth (Z). Defaults to `0.28`. */
4245
+ plateDepth?: number;
4246
+ /** Wall-plate center X (negative = into the wall). Defaults to `-0.055`. */
4247
+ plateOffsetX?: number;
4248
+ /** Bracket length into the room (X). Defaults to `0.1`. */
4249
+ bracketLength?: number;
4250
+ /** Bracket height (Y). Defaults to `0.05`. */
4251
+ bracketHeight?: number;
4252
+ /** Bracket depth (Z). Defaults to `0.07`. */
4253
+ bracketDepth?: number;
4254
+ /** Bracket center X. Defaults to `-0.005`. */
4255
+ bracketOffsetX?: number;
4256
+ /** Bracket center Y. Defaults to `0.1`. */
4257
+ bracketOffsetY?: number;
4258
+ /** Chimney / lamp body center X. Defaults to `0.06`. */
4259
+ bodyOffsetX?: number;
4260
+ /** Chimney height. Defaults to `0.3`. */
4261
+ chimneyHeight?: number;
4262
+ /** Chimney top radius. Defaults to `0.1`. */
4263
+ chimneyTopRadius?: number;
4264
+ /** Chimney bottom radius. Defaults to `0.105`. */
4265
+ chimneyBottomRadius?: number;
4266
+ /** Chimney center Y. Defaults to `-0.05`. */
4267
+ chimneyCenterY?: number;
4268
+ /** Cap radius. Defaults to `0.115`. */
4269
+ capRadius?: number;
4270
+ /** Cap height. Defaults to `0.05`. */
4271
+ capHeight?: number;
4272
+ /** Cap center Y. Defaults to `0.12`. */
4273
+ capCenterY?: number;
4274
+ /** Bowl top radius. Defaults to `0.09`. */
4275
+ bowlTopRadius?: number;
4276
+ /** Bowl bottom radius. Defaults to `0.11`. */
4277
+ bowlBottomRadius?: number;
4278
+ /** Bowl height. Defaults to `0.05`. */
4279
+ bowlHeight?: number;
4280
+ /** Bowl center Y. Defaults to `-0.22`. */
4281
+ bowlCenterY?: number;
4282
+ /** Radial segments on cylinders. Defaults to `8`. */
4283
+ radialSegments?: number;
4284
+ /** Glass chimney scale relative to the frame opening. Defaults to `0.96`. */
4285
+ innerScale?: number;
4286
+ /** Include the emissive glass chimney. Defaults to `true`. */
4287
+ inner?: boolean;
4288
+ }
4289
+
4290
+ export declare interface WallSconceOptions extends WallSconceGeometryOptions {
4291
+ /** Wrought-iron tint for mount and frame. Defaults to `#1c1e24`. */
4292
+ color?: ColorRepresentation;
4293
+ /** Mount iron tint (plate + bracket). Defaults to `color`. */
4294
+ mountColor?: ColorRepresentation;
4295
+ /** Frame iron tint (cap + bowl). Defaults to `color`. */
4296
+ frameColor?: ColorRepresentation;
4297
+ /** Glass chimney tint. Defaults to `#e8a058`. */
4298
+ lampColor?: ColorRepresentation;
4299
+ /** Glass emissive strength. Defaults to `1.4`. */
4300
+ lampEmissiveIntensity?: number;
4301
+ /** Glass opacity. Defaults to `0.88`. */
4302
+ lampOpacity?: number;
4303
+ }
4304
+
3437
4305
  export declare class WineBottle extends Mesh<WineBottleGeometry, MeshPhysicalMaterial> {
3438
4306
  constructor();
3439
4307
  }
@@ -3530,6 +4398,12 @@ export declare interface WispEffectOptions {
3530
4398
  lightPulseSpeed?: number;
3531
4399
  }
3532
4400
 
4401
+ export declare interface WobbleClipOptions extends CameraClipTiming {
4402
+ /** Peak positional shake in world units. */
4403
+ intensity: number;
4404
+ ease?: EasingFunction;
4405
+ }
4406
+
3533
4407
  export declare class WroughtIronBar extends Mesh<WroughtIronBarGeometry, MeshStandardMaterial> {
3534
4408
  constructor({ barHeight, //
3535
4409
  barRadius, spikeHeight, spikeRadius, spikeScaleZ, radialSegments, }?: {
@@ -3591,4 +4465,11 @@ export declare class WroughtIronFenceGeometry extends BufferGeometry {
3591
4465
  });
3592
4466
  }
3593
4467
 
4468
+ export declare interface ZoomClipOptions extends CameraClipTiming {
4469
+ target: Vector3;
4470
+ /** Narrower FOV at the end of the clip (e.g. `35` from `75`). */
4471
+ endFov: number;
4472
+ ease?: EasingFunction;
4473
+ }
4474
+
3594
4475
  export { }