@wave3d/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/config/model.d.ts +240 -0
- package/dist/config/model.js +496 -0
- package/dist/config/model.js.map +1 -0
- package/dist/core-loader.d.ts +10 -0
- package/dist/core-loader.js +12 -0
- package/dist/core-loader.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3 -0
- package/dist/presets.d.ts +8 -0
- package/dist/presets.js +544 -0
- package/dist/presets.js.map +1 -0
- package/dist/renderer/WaveGeometry.d.ts +31 -0
- package/dist/renderer/WaveGeometry.js +92 -0
- package/dist/renderer/WaveGeometry.js.map +1 -0
- package/dist/renderer/WaveRenderer.d.ts +232 -0
- package/dist/renderer/WaveRenderer.js +1118 -0
- package/dist/renderer/WaveRenderer.js.map +1 -0
- package/dist/renderer/heroPalette.d.ts +10 -0
- package/dist/renderer/heroPalette.js +34 -0
- package/dist/renderer/heroPalette.js.map +1 -0
- package/dist/renderer/index.d.ts +4 -0
- package/dist/renderer/index.js +4 -0
- package/dist/renderer/palette.d.ts +67 -0
- package/dist/renderer/palette.js +535 -0
- package/dist/renderer/palette.js.map +1 -0
- package/dist/renderer/shaders.js +545 -0
- package/dist/renderer/shaders.js.map +1 -0
- package/dist/shell/createWave.d.ts +58 -0
- package/dist/shell/createWave.js +161 -0
- package/dist/shell/createWave.js.map +1 -0
- package/dist/shell/poster.js +64 -0
- package/dist/shell/poster.js.map +1 -0
- package/dist/shell/probe.js +34 -0
- package/dist/shell/probe.js.map +1 -0
- package/dist/standalone/wave3d.standalone.js +13507 -0
- package/dist/standalone.d.ts +13 -0
- package/dist/standalone.js +17 -0
- package/dist/standalone.js.map +1 -0
- package/dist/studio/StudioWaveRenderer.d.ts +187 -0
- package/dist/studio/StudioWaveRenderer.js +905 -0
- package/dist/studio/StudioWaveRenderer.js.map +1 -0
- package/dist/studio/index.d.ts +3 -0
- package/dist/studio/index.js +3 -0
- package/dist/studio/randomize.d.ts +28 -0
- package/dist/studio/randomize.js +264 -0
- package/dist/studio/randomize.js.map +1 -0
- package/dist/util/base64.js +14 -0
- package/dist/util/base64.js.map +1 -0
- package/dist/util/math.js +18 -0
- package/dist/util/math.js.map +1 -0
- package/package.json +76 -0
- package/skills/wave3d/SKILL.md +158 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Wave Studio contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# @wave3d/core
|
|
2
|
+
|
|
3
|
+
Framework-agnostic **3D gradient-wave** renderer + config model — the engine behind [Wave Studio](https://github.com/Amir-Abushanab/wave3d).
|
|
4
|
+
|
|
5
|
+
A glossy, twisting _wave of light_: a strip swept along a curve, with a gradient running along its length and a satin sheen. Everything is driven by a single JSON-serializable `WaveConfig`, so the renderer and every export read from one source of truth.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
pnpm add @wave3d/core three # three is a peer dependency
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`three` is a peer dependency (`>=0.180 <1`); add `@types/three` for TypeScript.
|
|
14
|
+
|
|
15
|
+
## Drop-in wave (poster-first, self-optimizing)
|
|
16
|
+
|
|
17
|
+
The `.` entry is a lightweight shell: it shows a poster immediately, then lazily upgrades to the live WebGL wave only when the browser can run it (falling back to the poster on no-WebGL, Save-Data, reduced-motion, or context loss). `three.js` is code-split out of the initial load.
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { createWave } from "@wave3d/core";
|
|
21
|
+
|
|
22
|
+
const handle = createWave(document.getElementById("wave"), config, {
|
|
23
|
+
poster: "/wave.png",
|
|
24
|
+
});
|
|
25
|
+
// handle.set(nextConfig) · handle.pause() · handle.play() · handle.destroy()
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Single `<script>` from a CDN (three bundled)
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<script type="module">
|
|
32
|
+
import { mountWave } from "https://esm.sh/@wave3d/core/standalone";
|
|
33
|
+
mountWave(document.getElementById("wave"), {
|
|
34
|
+
/* config */
|
|
35
|
+
});
|
|
36
|
+
</script>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Entry points
|
|
40
|
+
|
|
41
|
+
| Import | What |
|
|
42
|
+
| ------------------------- | ------------------------------------------------------------ |
|
|
43
|
+
| `@wave3d/core` | poster-first shell (`createWave`/`mountWave`) + config model |
|
|
44
|
+
| `@wave3d/core/renderer` | the raw `WaveRenderer` + `WaveGeometry` (static three) |
|
|
45
|
+
| `@wave3d/core/presets` | the built-in `PRESETS` |
|
|
46
|
+
| `@wave3d/core/studio` | `StudioWaveRenderer` + randomizers |
|
|
47
|
+
| `@wave3d/core/standalone` | single-file build with three bundled (the CDN entry) |
|
|
48
|
+
|
|
49
|
+
## Framework wrappers
|
|
50
|
+
|
|
51
|
+
- **React** — [`@wave3d/react`](https://www.npmjs.com/package/@wave3d/react): the `<Wave3D>` component.
|
|
52
|
+
- **Vue / Svelte / plain HTML** — [`@wave3d/element`](https://www.npmjs.com/package/@wave3d/element): the `<wave-3d>` custom element.
|
|
53
|
+
|
|
54
|
+
## Credits
|
|
55
|
+
|
|
56
|
+
Created by [Amir Abushanab](https://github.com/Amir-Abushanab).
|
|
57
|
+
|
|
58
|
+
## License
|
|
59
|
+
|
|
60
|
+
[MIT](https://github.com/Amir-Abushanab/wave3d/blob/main/LICENSE)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __exportAll = (all, no_symbols) => {
|
|
4
|
+
let target = {};
|
|
5
|
+
for (var name in all) __defProp(target, name, {
|
|
6
|
+
get: all[name],
|
|
7
|
+
enumerable: true
|
|
8
|
+
});
|
|
9
|
+
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
10
|
+
return target;
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { __exportAll };
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
//#region src/config/model.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Configuration schema for the wave: a flat sheet displaced by noise (X/Z frequency
|
|
4
|
+
* + amount) then twisted by three axis-rotations (twistFrequency + twistPower per
|
|
5
|
+
* axis), then scaled / rotated / positioned. Plain JSON — doubles as the save-state
|
|
6
|
+
* format.
|
|
7
|
+
*/
|
|
8
|
+
declare const MAX_COLORS = 8;
|
|
9
|
+
declare const MAX_MESH_POINTS = 8;
|
|
10
|
+
declare const MAX_LIGHTS = 8;
|
|
11
|
+
declare const MAX_NOISE_BANDS = 4;
|
|
12
|
+
/** Cap on stacked waves (keeps total geometry bounded — see WaveRenderer segment scaling). */
|
|
13
|
+
declare const MAX_WAVES = 6;
|
|
14
|
+
interface Vec2 {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
}
|
|
18
|
+
interface Vec3 {
|
|
19
|
+
x: number;
|
|
20
|
+
y: number;
|
|
21
|
+
z: number;
|
|
22
|
+
}
|
|
23
|
+
type BlendMode = "squared" | "normal" | "additive" | "multiply";
|
|
24
|
+
/** How the palette is mapped across the surface. */
|
|
25
|
+
type BasicGradientType = "linear" | "radial" | "conic";
|
|
26
|
+
type GradientType = BasicGradientType | "mesh";
|
|
27
|
+
type BackgroundMode = "color" | "gradient" | "image";
|
|
28
|
+
type BackgroundImageFit = "cover" | "contain" | "stretch";
|
|
29
|
+
/** What fills the 2D palette texture: the baked hero LUT, our editable stops, or
|
|
30
|
+
* a named built-in map (see PALETTE_MAPS). Any string is allowed for forward-compat. */
|
|
31
|
+
type PaletteSource = "hero" | "stops" | (string & {});
|
|
32
|
+
/** A positionable light. `position` lives in the same 3D space as the wave. */
|
|
33
|
+
interface LightConfig {
|
|
34
|
+
position: Vec3;
|
|
35
|
+
color: string;
|
|
36
|
+
intensity: number;
|
|
37
|
+
}
|
|
38
|
+
/** A default light; pass overrides for added fill lights. */
|
|
39
|
+
declare function createLight(position?: Vec3, intensity?: number): LightConfig;
|
|
40
|
+
/** Where the first light lands when you engage lights from an empty scene. Shared by the
|
|
41
|
+
* "drag in 3D" control and the camera-rig minimap, which previews a light marker here so the
|
|
42
|
+
* rig always shows the light — even before one has been explicitly added. */
|
|
43
|
+
declare const DEFAULT_LIGHT_POSITION: Vec3;
|
|
44
|
+
/**
|
|
45
|
+
* A noise band: inside a rectangular uv region (startX..endX along the length,
|
|
46
|
+
* startY..endY across the width, softened by `feather`), the fiber streaks are
|
|
47
|
+
* overridden — strength, frequency (density), colourAttenuation (how much the local
|
|
48
|
+
* colour suppresses them), and the end-weighting parabolaPower. Lets the fibers vary
|
|
49
|
+
* per region instead of uniform.
|
|
50
|
+
*/
|
|
51
|
+
interface NoiseBand {
|
|
52
|
+
startX: number;
|
|
53
|
+
endX: number;
|
|
54
|
+
startY: number;
|
|
55
|
+
endY: number;
|
|
56
|
+
feather: number;
|
|
57
|
+
strength: number;
|
|
58
|
+
frequency: number;
|
|
59
|
+
colorAttenuation: number;
|
|
60
|
+
parabolaPower: number;
|
|
61
|
+
}
|
|
62
|
+
/** A default band: a strong, coarse streak region over the first half. */
|
|
63
|
+
declare function createNoiseBand(): NoiseBand;
|
|
64
|
+
/** One gradient stop: a colour at a normalized position (0–1) across the width. */
|
|
65
|
+
interface ColorStop {
|
|
66
|
+
color: string;
|
|
67
|
+
pos: number;
|
|
68
|
+
}
|
|
69
|
+
/** One colour influence point in the 2D mesh-gradient field. */
|
|
70
|
+
interface MeshGradientPoint {
|
|
71
|
+
color: string;
|
|
72
|
+
/** Horizontal UV position (0–1). */
|
|
73
|
+
x: number;
|
|
74
|
+
/** Vertical UV position (0–1). */
|
|
75
|
+
y: number;
|
|
76
|
+
/** Relative reach of this point's colour field. */
|
|
77
|
+
influence: number;
|
|
78
|
+
}
|
|
79
|
+
/** Build evenly-spaced stops from a plain list of colours. */
|
|
80
|
+
declare function makeStops(colors: string[]): ColorStop[];
|
|
81
|
+
/** A balanced iOS-style field shown the first time Mesh is selected. */
|
|
82
|
+
declare function createDefaultMeshPoints(): MeshGradientPoint[];
|
|
83
|
+
/**
|
|
84
|
+
* A single wave: a COMPLETE, self-contained wave — its own shape, twist, colour, finish,
|
|
85
|
+
* transform and blend. Stacking waves composites independent waves; there is no shared
|
|
86
|
+
* "base wave" any more, so nothing is duplicated between a global section and the waves.
|
|
87
|
+
* Field names mirror the legacy top-level wave fields so migration + the per-section helpers
|
|
88
|
+
* (normalizeWaveColour, randomize*) map 1:1.
|
|
89
|
+
*/
|
|
90
|
+
interface WaveConfig {
|
|
91
|
+
palette: ColorStop[];
|
|
92
|
+
gradientType: GradientType;
|
|
93
|
+
gradientAngle: number;
|
|
94
|
+
gradientShift: number;
|
|
95
|
+
meshGradientPoints: MeshGradientPoint[];
|
|
96
|
+
meshGradientSoftness: number;
|
|
97
|
+
usePaletteTexture: boolean;
|
|
98
|
+
paletteSource: PaletteSource;
|
|
99
|
+
paletteImageUrl?: string;
|
|
100
|
+
paletteVideoUrl?: string;
|
|
101
|
+
paletteTextureScale: Vec2;
|
|
102
|
+
paletteTextureOffset: Vec2;
|
|
103
|
+
paletteTextureRotation: number;
|
|
104
|
+
/** Palette-offset drift per second (animates colour independently of the geometry; 0 = static).
|
|
105
|
+
* Applies to any texture palette (not mesh / procedural stops). */
|
|
106
|
+
paletteDriftX: number;
|
|
107
|
+
paletteDriftY: number;
|
|
108
|
+
paletteEdgeColor: string;
|
|
109
|
+
paletteEdgeAmount: number;
|
|
110
|
+
hueShift: number;
|
|
111
|
+
colorContrast: number;
|
|
112
|
+
colorSaturation: number;
|
|
113
|
+
fiberCount: number;
|
|
114
|
+
fiberStrength: number;
|
|
115
|
+
noiseBands: NoiseBand[];
|
|
116
|
+
texture: number;
|
|
117
|
+
creaseLight: number;
|
|
118
|
+
creaseSharpness: number;
|
|
119
|
+
creaseSoftness: number;
|
|
120
|
+
sheen: number;
|
|
121
|
+
roundness: number;
|
|
122
|
+
/** Thin-film / holographic hue response that shifts with view angle (0 = off). */
|
|
123
|
+
iridescence: number;
|
|
124
|
+
edgeFade: number;
|
|
125
|
+
/** Softness of the ribbon's long edges (smoothstep width across uv.y). 0.1 = the original
|
|
126
|
+
* hardcoded value; smaller = razor-crisp graphic ribbons, larger = soft vapor. */
|
|
127
|
+
edgeFeather: number;
|
|
128
|
+
/** Depth tint (solid theme): fade far fragments toward depthTintColor for atmospheric
|
|
129
|
+
* separation in multi-wave stacks (0 = off). */
|
|
130
|
+
depthTint: number;
|
|
131
|
+
depthTintColor: string;
|
|
132
|
+
displaceFrequency: Vec2;
|
|
133
|
+
displaceAmount: number;
|
|
134
|
+
/** Optional 2nd displacement octave: finer ripples riding on the broad swell (amount 0 = off). */
|
|
135
|
+
detailFrequency: number;
|
|
136
|
+
detailAmount: number;
|
|
137
|
+
twistFrequency: Vec3;
|
|
138
|
+
twistPower: Vec3;
|
|
139
|
+
twistMotion?: boolean;
|
|
140
|
+
theme?: "solid" | "wireframe";
|
|
141
|
+
lineAmount?: number;
|
|
142
|
+
lineThickness?: number;
|
|
143
|
+
lineDerivativePower?: number;
|
|
144
|
+
maxWidth?: number;
|
|
145
|
+
position: Vec3;
|
|
146
|
+
rotation: Vec3;
|
|
147
|
+
scale: Vec3;
|
|
148
|
+
blendMode: BlendMode;
|
|
149
|
+
/** Absolute animation speed for this wave (legacy global speed × per-layer multiplier). */
|
|
150
|
+
speed: number;
|
|
151
|
+
/** Overall opacity of this wave. */
|
|
152
|
+
opacity: number;
|
|
153
|
+
/** Phase/seed so waves don't move in lockstep. */
|
|
154
|
+
seed: number;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Scene-level settings shared by every wave: output/background/camera/lights, the post-fx
|
|
158
|
+
* pass (grain/blur), playback, quality, and the whole-composition mirror. Everything that
|
|
159
|
+
* describes an individual wave lives on WaveConfig instead.
|
|
160
|
+
*/
|
|
161
|
+
interface SceneConfig {
|
|
162
|
+
background: string;
|
|
163
|
+
transparentBackground: boolean;
|
|
164
|
+
backgroundMode: BackgroundMode;
|
|
165
|
+
backgroundPalette: ColorStop[];
|
|
166
|
+
backgroundGradientType: GradientType;
|
|
167
|
+
backgroundGradientAngle: number;
|
|
168
|
+
backgroundGradientSource: PaletteSource;
|
|
169
|
+
backgroundMeshPoints: MeshGradientPoint[];
|
|
170
|
+
backgroundMeshSoftness: number;
|
|
171
|
+
backgroundImageSource: PaletteSource;
|
|
172
|
+
backgroundImageUrl?: string;
|
|
173
|
+
backgroundVideoUrl?: string;
|
|
174
|
+
backgroundImageFit: BackgroundImageFit;
|
|
175
|
+
backgroundImageZoom: number;
|
|
176
|
+
backgroundImagePosition: Vec2;
|
|
177
|
+
/** Number of stacked waves (kept in sync with waves.length). */
|
|
178
|
+
waveCount: number;
|
|
179
|
+
quality: number;
|
|
180
|
+
dprMax: number;
|
|
181
|
+
paused: boolean;
|
|
182
|
+
/** Noise phase offset — scrubs the noise pattern to pick a still frame. */
|
|
183
|
+
timeOffset?: number;
|
|
184
|
+
/** Seamless-loop period in seconds (0 = off). When >0, the motion is mapped onto a circle in
|
|
185
|
+
* noise space so it repeats exactly every `loopSeconds` — scene-level so a multi-wave stack
|
|
186
|
+
* shares one period and the whole composite loops. */
|
|
187
|
+
loopSeconds?: number;
|
|
188
|
+
introRamp?: boolean;
|
|
189
|
+
showCameraRig: boolean;
|
|
190
|
+
cameraDistance: number;
|
|
191
|
+
cameraZoom: number;
|
|
192
|
+
cameraPosition: Vec3;
|
|
193
|
+
cameraTarget: Vec3;
|
|
194
|
+
/** Film grain amount (post pass). */
|
|
195
|
+
grain: number;
|
|
196
|
+
/** Soft-focus / spin blur amount (post pass). */
|
|
197
|
+
blur: number;
|
|
198
|
+
blurSamples?: number;
|
|
199
|
+
/** Bloom (post pass, UnrealBloomPass). strength 0 removes the pass entirely, so cost and pixels
|
|
200
|
+
* are identical to bloom-off; radius/threshold only take effect once strength > 0. */
|
|
201
|
+
bloomStrength?: number;
|
|
202
|
+
bloomRadius?: number;
|
|
203
|
+
bloomThreshold?: number;
|
|
204
|
+
/** Base ambient light level (0–1). */
|
|
205
|
+
ambient: number;
|
|
206
|
+
lights: LightConfig[];
|
|
207
|
+
/** Mirror the whole composition on screen (world-space flip). */
|
|
208
|
+
mirrorH: boolean;
|
|
209
|
+
mirrorV: boolean;
|
|
210
|
+
}
|
|
211
|
+
/** The full save-state: scene settings + one or more complete waves. */
|
|
212
|
+
interface StudioConfig extends SceneConfig {
|
|
213
|
+
waves: WaveConfig[];
|
|
214
|
+
}
|
|
215
|
+
/** Spread a base wave into `count` overlapping waves — each with a slightly varied hue, width,
|
|
216
|
+
* speed, phase, vertical offset and roll so a stack reads as one composition. `count === 1`
|
|
217
|
+
* returns the base unchanged. Used to author multi-wave presets. */
|
|
218
|
+
declare function makeWaveSpread(base: WaveConfig, count: number): WaveConfig[];
|
|
219
|
+
/** A fresh default wave (the hero wave as one complete wave). */
|
|
220
|
+
declare function makeWave(): WaveConfig;
|
|
221
|
+
/** Resize `waves` to match `waveCount`. New waves CLONE the last one (inherit every
|
|
222
|
+
* property of the preceding wave); extras are dropped. */
|
|
223
|
+
declare function resizeWaves(config: StudioConfig): void;
|
|
224
|
+
/** The default studio config: the hero wave + its scene, in the canonical wave model. */
|
|
225
|
+
declare function createDefaultConfig(): StudioConfig;
|
|
226
|
+
/** Backfill background styling for states saved before gradient/image backgrounds existed. */
|
|
227
|
+
declare function normalizeBackground(config: StudioConfig): void;
|
|
228
|
+
/** Backfill camera position/target for states saved before they existed. */
|
|
229
|
+
declare function ensureCamera(config: StudioConfig): void;
|
|
230
|
+
/** Backfill/repair a wave so the renderer can consume it (covers partial wave-model JSON). */
|
|
231
|
+
declare function normalizeWave(s: WaveConfig): void;
|
|
232
|
+
/** Backfill scene-level defaults (background/camera/post/lights/quality/mirror). */
|
|
233
|
+
declare function ensureSceneDefaults(config: StudioConfig): void;
|
|
234
|
+
/** Normalize an ingested config to the wave model: backfill the scene + every wave, and drop in
|
|
235
|
+
* a default wave if none are present. Idempotent, so it is safe on the renderer's own config as
|
|
236
|
+
* well as freshly loaded save-states / share links. */
|
|
237
|
+
declare function ensureStudioConfig(input: StudioConfig): StudioConfig;
|
|
238
|
+
//#endregion
|
|
239
|
+
export { BackgroundImageFit, BackgroundMode, BasicGradientType, BlendMode, ColorStop, DEFAULT_LIGHT_POSITION, GradientType, LightConfig, MAX_COLORS, MAX_LIGHTS, MAX_MESH_POINTS, MAX_NOISE_BANDS, MAX_WAVES, MeshGradientPoint, NoiseBand, PaletteSource, SceneConfig, StudioConfig, Vec2, Vec3, WaveConfig, createDefaultConfig, createDefaultMeshPoints, createLight, createNoiseBand, ensureCamera, ensureSceneDefaults, ensureStudioConfig, makeStops, makeWave, makeWaveSpread, normalizeBackground, normalizeWave, resizeWaves };
|
|
240
|
+
//# sourceMappingURL=model.d.ts.map
|