@plasius/gpu-world-generator 0.0.4
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 +203 -0
- package/README.md +73 -0
- package/dist/field.wgsl +225 -0
- package/dist/fractal-prepass.wgsl +290 -0
- package/dist/index.cjs +1942 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +447 -0
- package/dist/index.d.ts +447 -0
- package/dist/index.js +1848 -0
- package/dist/index.js.map +1 -0
- package/dist/terrain.wgsl +451 -0
- package/docs/adrs/adr-0001-package-scope.md +18 -0
- package/docs/adrs/adr-0002-world-tiling-lod-stitching.md +28 -0
- package/docs/adrs/adr-0003-terrain-generation-style-mixing.md +21 -0
- package/docs/adrs/index.md +5 -0
- package/docs/biomes.md +206 -0
- package/docs/lod-zoning.md +22 -0
- package/docs/plan.md +107 -0
- package/docs/procedural-surface.md +73 -0
- package/docs/resources.md +55 -0
- package/package.json +53 -0
- package/src/biomes/temperate.ts +387 -0
- package/src/field.wgsl +225 -0
- package/src/fields.ts +321 -0
- package/src/fractal-prepass.ts +237 -0
- package/src/fractal-prepass.wgsl +290 -0
- package/src/generator.ts +106 -0
- package/src/hex.ts +54 -0
- package/src/index.ts +11 -0
- package/src/mesh.ts +285 -0
- package/src/perf-monitor.ts +133 -0
- package/src/shaders/demo-terrain.wgsl +193 -0
- package/src/shaders/demo-trees.wgsl +172 -0
- package/src/shaders/demo-water-sim.wgsl +361 -0
- package/src/shaders/library/common.wgsl +38 -0
- package/src/shaders/library/materials.wgsl +175 -0
- package/src/terrain.wgsl +451 -0
- package/src/tile-cache.ts +274 -0
- package/src/tiles.ts +417 -0
- package/src/types.ts +220 -0
- package/src/wgsl/field.job.wgsl +225 -0
- package/src/wgsl/terrain.job.wgsl +451 -0
- package/src/wgsl.ts +77 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
declare const TerrainBiome: {
|
|
2
|
+
readonly Plains: 0;
|
|
3
|
+
readonly Tundra: 1;
|
|
4
|
+
readonly Savanna: 2;
|
|
5
|
+
readonly River: 3;
|
|
6
|
+
readonly City: 4;
|
|
7
|
+
readonly Village: 5;
|
|
8
|
+
readonly Ice: 6;
|
|
9
|
+
readonly Snow: 7;
|
|
10
|
+
readonly Mountainous: 8;
|
|
11
|
+
readonly Volcanic: 9;
|
|
12
|
+
readonly Road: 10;
|
|
13
|
+
readonly Town: 11;
|
|
14
|
+
readonly Castle: 12;
|
|
15
|
+
readonly MixedForest: 13;
|
|
16
|
+
};
|
|
17
|
+
type TerrainBiomeId = (typeof TerrainBiome)[keyof typeof TerrainBiome];
|
|
18
|
+
declare const TerrainBiomeLabel: Record<TerrainBiomeId, string>;
|
|
19
|
+
declare const MacroBiome: {
|
|
20
|
+
readonly Polar: 0;
|
|
21
|
+
readonly ColdTemperate: 1;
|
|
22
|
+
readonly Temperate: 2;
|
|
23
|
+
readonly Arid: 3;
|
|
24
|
+
readonly Tropical: 4;
|
|
25
|
+
readonly Alpine: 5;
|
|
26
|
+
readonly Volcanic: 6;
|
|
27
|
+
readonly Freshwater: 7;
|
|
28
|
+
readonly Coastal: 8;
|
|
29
|
+
readonly Urban: 9;
|
|
30
|
+
readonly Underground: 10;
|
|
31
|
+
};
|
|
32
|
+
type MacroBiomeId = (typeof MacroBiome)[keyof typeof MacroBiome];
|
|
33
|
+
declare const MacroBiomeLabel: Record<MacroBiomeId, string>;
|
|
34
|
+
declare const SurfaceCover: {
|
|
35
|
+
readonly Grass: 0;
|
|
36
|
+
readonly Dirt: 1;
|
|
37
|
+
readonly Sand: 2;
|
|
38
|
+
readonly Rock: 3;
|
|
39
|
+
readonly Gravel: 4;
|
|
40
|
+
readonly Snowpack: 5;
|
|
41
|
+
readonly Ice: 6;
|
|
42
|
+
readonly Mud: 7;
|
|
43
|
+
readonly Ash: 8;
|
|
44
|
+
readonly Cobble: 9;
|
|
45
|
+
readonly Road: 10;
|
|
46
|
+
readonly Water: 11;
|
|
47
|
+
readonly Basalt: 12;
|
|
48
|
+
readonly Crystal: 13;
|
|
49
|
+
readonly Sludge: 14;
|
|
50
|
+
};
|
|
51
|
+
type SurfaceCoverId = (typeof SurfaceCover)[keyof typeof SurfaceCover];
|
|
52
|
+
declare const SurfaceCoverLabel: Record<SurfaceCoverId, string>;
|
|
53
|
+
declare const MicroFeature: {
|
|
54
|
+
readonly Tree: 0;
|
|
55
|
+
readonly Bush: 1;
|
|
56
|
+
readonly GrassTuft: 2;
|
|
57
|
+
readonly Reed: 3;
|
|
58
|
+
readonly Rock: 4;
|
|
59
|
+
readonly Boulder: 5;
|
|
60
|
+
readonly WaterRipple: 6;
|
|
61
|
+
readonly IceSpike: 7;
|
|
62
|
+
readonly Hut: 8;
|
|
63
|
+
readonly Wall: 9;
|
|
64
|
+
readonly Bridge: 10;
|
|
65
|
+
readonly Gate: 11;
|
|
66
|
+
readonly Tower: 12;
|
|
67
|
+
readonly Ruin: 13;
|
|
68
|
+
readonly Stalactite: 14;
|
|
69
|
+
readonly Stalagmite: 15;
|
|
70
|
+
readonly CrystalSpire: 16;
|
|
71
|
+
readonly Mushroom: 17;
|
|
72
|
+
readonly TimberSupport: 18;
|
|
73
|
+
readonly Rail: 19;
|
|
74
|
+
readonly Cart: 20;
|
|
75
|
+
readonly Lantern: 21;
|
|
76
|
+
readonly Grate: 22;
|
|
77
|
+
readonly BrickTunnel: 23;
|
|
78
|
+
readonly Flower: 24;
|
|
79
|
+
};
|
|
80
|
+
type MicroFeatureId = (typeof MicroFeature)[keyof typeof MicroFeature];
|
|
81
|
+
declare const MicroFeatureLabel: Record<MicroFeatureId, string>;
|
|
82
|
+
interface HexCell {
|
|
83
|
+
q: number;
|
|
84
|
+
r: number;
|
|
85
|
+
level: number;
|
|
86
|
+
flags?: number;
|
|
87
|
+
}
|
|
88
|
+
declare const SlopeBand: {
|
|
89
|
+
readonly Downward: 0;
|
|
90
|
+
readonly Flat: 1;
|
|
91
|
+
readonly Upward: 2;
|
|
92
|
+
};
|
|
93
|
+
type SlopeBandId = (typeof SlopeBand)[keyof typeof SlopeBand];
|
|
94
|
+
declare const SlopeBandLabel: Record<SlopeBandId, string>;
|
|
95
|
+
interface TerrainCell {
|
|
96
|
+
height: number;
|
|
97
|
+
heat: number;
|
|
98
|
+
moisture: number;
|
|
99
|
+
biome: TerrainBiomeId;
|
|
100
|
+
macroBiome?: MacroBiomeId;
|
|
101
|
+
surface?: SurfaceCoverId;
|
|
102
|
+
feature?: MicroFeatureId;
|
|
103
|
+
obstacle?: number;
|
|
104
|
+
foliage?: number;
|
|
105
|
+
slopeBand?: SlopeBandId;
|
|
106
|
+
}
|
|
107
|
+
interface TerrainParams {
|
|
108
|
+
seed: number;
|
|
109
|
+
cellCount: number;
|
|
110
|
+
heatBias?: number;
|
|
111
|
+
heightScale?: number;
|
|
112
|
+
macroScale?: number;
|
|
113
|
+
macroWarpStrength?: number;
|
|
114
|
+
styleMixStrength?: number;
|
|
115
|
+
terraceSteps?: number;
|
|
116
|
+
terraceStrength?: number;
|
|
117
|
+
craterStrength?: number;
|
|
118
|
+
craterScale?: number;
|
|
119
|
+
heightMin?: number;
|
|
120
|
+
heightMax?: number;
|
|
121
|
+
slopeDownMax?: number;
|
|
122
|
+
slopeUpMin?: number;
|
|
123
|
+
}
|
|
124
|
+
interface HexLevelSpec {
|
|
125
|
+
level: number;
|
|
126
|
+
areaM2: number;
|
|
127
|
+
sideMeters: number;
|
|
128
|
+
acrossFlatsMeters: number;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
declare function hexAreaFromSide(sideMeters: number): number;
|
|
132
|
+
declare function hexSideFromArea(areaM2: number): number;
|
|
133
|
+
declare function axialToWorld(q: number, r: number, sizeMeters: number): {
|
|
134
|
+
x: number;
|
|
135
|
+
y: number;
|
|
136
|
+
};
|
|
137
|
+
declare function generateHexGrid(radius: number, level?: number): HexCell[];
|
|
138
|
+
declare function buildHexLevels(options?: {
|
|
139
|
+
topAreaKm2?: number;
|
|
140
|
+
minAreaM2?: number;
|
|
141
|
+
levels?: number;
|
|
142
|
+
}): HexLevelSpec[];
|
|
143
|
+
|
|
144
|
+
declare function packHexCells(cells: HexCell[]): Int32Array;
|
|
145
|
+
declare function encodeTerrainParams(params: TerrainParams): ArrayBuffer;
|
|
146
|
+
declare function unpackTerrain(buffer: ArrayBuffer): TerrainCell[];
|
|
147
|
+
|
|
148
|
+
declare const terrainWgslUrl: URL;
|
|
149
|
+
declare const fieldWgslUrl: URL;
|
|
150
|
+
declare const fractalPrepassWgslUrl: URL;
|
|
151
|
+
declare function loadTerrainWgsl(options?: {
|
|
152
|
+
url?: URL | string;
|
|
153
|
+
fetcher?: typeof fetch | null;
|
|
154
|
+
}): Promise<string>;
|
|
155
|
+
declare function loadFieldWgsl(options?: {
|
|
156
|
+
url?: URL | string;
|
|
157
|
+
fetcher?: typeof fetch | null;
|
|
158
|
+
}): Promise<string>;
|
|
159
|
+
declare function loadFractalPrepassWgsl(options?: {
|
|
160
|
+
url?: URL | string;
|
|
161
|
+
fetcher?: typeof fetch | null;
|
|
162
|
+
}): Promise<string>;
|
|
163
|
+
|
|
164
|
+
declare const FIELD_DOWNWARD_MAX = 0.2;
|
|
165
|
+
declare const FIELD_UPWARD_MIN = 0.8;
|
|
166
|
+
type FieldParams = {
|
|
167
|
+
seed: number;
|
|
168
|
+
scale: number;
|
|
169
|
+
warpScale: number;
|
|
170
|
+
warpStrength: number;
|
|
171
|
+
iterations: number;
|
|
172
|
+
power: number;
|
|
173
|
+
detailScale: number;
|
|
174
|
+
detailIterations: number;
|
|
175
|
+
detailPower: number;
|
|
176
|
+
ridgePower: number;
|
|
177
|
+
heatBias: number;
|
|
178
|
+
moistureBias: number;
|
|
179
|
+
macroScale: number;
|
|
180
|
+
macroWarpStrength: number;
|
|
181
|
+
styleMixStrength: number;
|
|
182
|
+
terraceSteps: number;
|
|
183
|
+
terraceStrength: number;
|
|
184
|
+
craterStrength: number;
|
|
185
|
+
craterScale: number;
|
|
186
|
+
heightMin: number;
|
|
187
|
+
heightMax: number;
|
|
188
|
+
};
|
|
189
|
+
type FieldSample = {
|
|
190
|
+
height: number;
|
|
191
|
+
cumulativeHeight: number;
|
|
192
|
+
slopeBand: SlopeBandId;
|
|
193
|
+
heat: number;
|
|
194
|
+
moisture: number;
|
|
195
|
+
roughness: number;
|
|
196
|
+
rockiness: number;
|
|
197
|
+
water: number;
|
|
198
|
+
featureMask: number;
|
|
199
|
+
obstacleMask: number;
|
|
200
|
+
foliageMask: number;
|
|
201
|
+
ridge: number;
|
|
202
|
+
base: number;
|
|
203
|
+
detail: number;
|
|
204
|
+
};
|
|
205
|
+
declare function classifySlopeBand(cumulativeHeight: number): SlopeBandId;
|
|
206
|
+
declare function defaultFieldParams(seed?: number): FieldParams;
|
|
207
|
+
declare function sampleFieldStack(x: number, z: number, params: FieldParams): FieldSample;
|
|
208
|
+
|
|
209
|
+
interface MixedForestOptions {
|
|
210
|
+
seed?: number;
|
|
211
|
+
terrainSeed?: number;
|
|
212
|
+
featureSeed?: number;
|
|
213
|
+
foliageSeed?: number;
|
|
214
|
+
radius?: number;
|
|
215
|
+
topAreaKm2?: number;
|
|
216
|
+
minAreaM2?: number;
|
|
217
|
+
levels?: number;
|
|
218
|
+
}
|
|
219
|
+
interface MixedForestLayer {
|
|
220
|
+
levelSpec: HexLevelSpec;
|
|
221
|
+
cells: HexCell[];
|
|
222
|
+
terrain: TerrainCell[];
|
|
223
|
+
}
|
|
224
|
+
declare function generateTemperateMixedForest(options: MixedForestOptions): MixedForestLayer;
|
|
225
|
+
|
|
226
|
+
interface PerfMonitorOptions {
|
|
227
|
+
targetFps?: number;
|
|
228
|
+
tolerance?: number;
|
|
229
|
+
sampleSize?: number;
|
|
230
|
+
minSampleFraction?: number;
|
|
231
|
+
cooldownMs?: number;
|
|
232
|
+
qualitySlew?: number;
|
|
233
|
+
initialBudget?: number;
|
|
234
|
+
auto?: boolean;
|
|
235
|
+
}
|
|
236
|
+
interface PerfMonitorUpdate {
|
|
237
|
+
budget: number;
|
|
238
|
+
medianFps: number | null;
|
|
239
|
+
miss: number | null;
|
|
240
|
+
adjusted: boolean;
|
|
241
|
+
stable: boolean;
|
|
242
|
+
}
|
|
243
|
+
interface PerfMonitor {
|
|
244
|
+
sampleFrame: (dtSeconds: number) => void;
|
|
245
|
+
sampleFps: (fps: number) => void;
|
|
246
|
+
update: (nowMs: number) => PerfMonitorUpdate;
|
|
247
|
+
resetSamples: () => void;
|
|
248
|
+
setBudget: (budget: number) => void;
|
|
249
|
+
getBudget: () => number;
|
|
250
|
+
setAuto: (enabled: boolean) => void;
|
|
251
|
+
getConfig: () => Required<PerfMonitorOptions>;
|
|
252
|
+
}
|
|
253
|
+
declare function createPerfMonitor(options?: PerfMonitorOptions): PerfMonitor;
|
|
254
|
+
|
|
255
|
+
type GPUDeviceLike = any;
|
|
256
|
+
declare const FRACTAL_ASSET_VERSION = 2;
|
|
257
|
+
declare const FRACTAL_SAMPLE_STRIDE = 8;
|
|
258
|
+
type FractalMandelSettings = {
|
|
259
|
+
scale: number;
|
|
260
|
+
strength: number;
|
|
261
|
+
rockBoost: number;
|
|
262
|
+
};
|
|
263
|
+
declare const defaultFractalMandelSettings: FractalMandelSettings;
|
|
264
|
+
type FractalAsset = {
|
|
265
|
+
seed: number;
|
|
266
|
+
extent: number;
|
|
267
|
+
gridSize: number;
|
|
268
|
+
heightScale: number;
|
|
269
|
+
samples: Float32Array;
|
|
270
|
+
};
|
|
271
|
+
type FractalAssetPayload = {
|
|
272
|
+
version: number;
|
|
273
|
+
seed: number;
|
|
274
|
+
extent: number;
|
|
275
|
+
gridSize: number;
|
|
276
|
+
heightScale: number;
|
|
277
|
+
sampleStride: number;
|
|
278
|
+
samples: number[];
|
|
279
|
+
};
|
|
280
|
+
type FractalPrepassRunOptions = {
|
|
281
|
+
seed: number;
|
|
282
|
+
extent: number;
|
|
283
|
+
heightScale: number;
|
|
284
|
+
fieldParams?: Partial<FieldParams>;
|
|
285
|
+
mandel?: Partial<FractalMandelSettings>;
|
|
286
|
+
};
|
|
287
|
+
type FractalPrepassRunner = {
|
|
288
|
+
gridSize: number;
|
|
289
|
+
gridPoints: number;
|
|
290
|
+
sampleCount: number;
|
|
291
|
+
run: (options: FractalPrepassRunOptions) => Promise<FractalAsset>;
|
|
292
|
+
};
|
|
293
|
+
declare function serializeFractalAsset(asset: FractalAsset): FractalAssetPayload;
|
|
294
|
+
declare function parseFractalAsset(payload: unknown): FractalAsset | null;
|
|
295
|
+
declare function assetMatches(asset: FractalAsset | null, config: {
|
|
296
|
+
seed: number;
|
|
297
|
+
extent: number;
|
|
298
|
+
gridSize: number;
|
|
299
|
+
}): boolean;
|
|
300
|
+
declare function createFractalPrepassRunner(options: {
|
|
301
|
+
device: GPUDeviceLike;
|
|
302
|
+
wgsl: string;
|
|
303
|
+
gridSize: number;
|
|
304
|
+
}): FractalPrepassRunner;
|
|
305
|
+
|
|
306
|
+
type TileKey = {
|
|
307
|
+
seed: number;
|
|
308
|
+
tx: number;
|
|
309
|
+
tz: number;
|
|
310
|
+
level: number;
|
|
311
|
+
tileSizeWorld?: number;
|
|
312
|
+
};
|
|
313
|
+
interface TileAsset {
|
|
314
|
+
key: TileKey;
|
|
315
|
+
gridSize: number;
|
|
316
|
+
heightScale: number;
|
|
317
|
+
height: Float32Array;
|
|
318
|
+
fields?: Float32Array;
|
|
319
|
+
fieldStride?: number;
|
|
320
|
+
materials?: Uint8Array;
|
|
321
|
+
materialStride?: number;
|
|
322
|
+
features?: Float32Array;
|
|
323
|
+
featureStride?: number;
|
|
324
|
+
}
|
|
325
|
+
interface TileAssetPayload {
|
|
326
|
+
version: number;
|
|
327
|
+
key: TileKey;
|
|
328
|
+
gridSize: number;
|
|
329
|
+
heightScale: number;
|
|
330
|
+
height: number[];
|
|
331
|
+
fields?: number[];
|
|
332
|
+
fieldStride?: number;
|
|
333
|
+
materials?: number[];
|
|
334
|
+
materialStride?: number;
|
|
335
|
+
features?: number[];
|
|
336
|
+
featureStride?: number;
|
|
337
|
+
}
|
|
338
|
+
declare const TILE_ASSET_VERSION = 1;
|
|
339
|
+
declare function validateTileAssetPayload(payload: TileAssetPayload): string[];
|
|
340
|
+
declare function serializeTileAssetJson(asset: TileAsset): TileAssetPayload;
|
|
341
|
+
declare function parseTileAssetJson(payload: TileAssetPayload): TileAsset;
|
|
342
|
+
interface TileBakeOutput {
|
|
343
|
+
asset: TileAsset;
|
|
344
|
+
payload: TileAssetPayload;
|
|
345
|
+
binary: ArrayBuffer;
|
|
346
|
+
}
|
|
347
|
+
interface TileBakeWriter {
|
|
348
|
+
writeJson?: (payload: TileAssetPayload, asset: TileAsset) => void | Promise<void>;
|
|
349
|
+
writeBinary?: (binary: ArrayBuffer, asset: TileAsset, payload: TileAssetPayload) => void | Promise<void>;
|
|
350
|
+
}
|
|
351
|
+
declare function bakeTileAsset(asset: TileAsset, writer?: TileBakeWriter): Promise<TileBakeOutput>;
|
|
352
|
+
declare function serializeTileAssetBinary(asset: TileAsset): ArrayBuffer;
|
|
353
|
+
declare function parseTileAssetBinary(input: ArrayBuffer | ArrayBufferView): TileAsset;
|
|
354
|
+
declare function serializeTileAssetBinaryFromJson(payload: TileAssetPayload): ArrayBuffer;
|
|
355
|
+
declare function serializeTileAssetJsonFromBinary(input: ArrayBuffer | ArrayBufferView): TileAssetPayload;
|
|
356
|
+
|
|
357
|
+
type TileCacheStatus = "pending" | "ready" | "error";
|
|
358
|
+
interface TileCacheEntry {
|
|
359
|
+
key: TileKey;
|
|
360
|
+
status: TileCacheStatus;
|
|
361
|
+
asset?: TileAsset;
|
|
362
|
+
payload?: TileAssetPayload;
|
|
363
|
+
binary?: ArrayBuffer;
|
|
364
|
+
bytes: number;
|
|
365
|
+
lastAccess: number;
|
|
366
|
+
error?: unknown;
|
|
367
|
+
}
|
|
368
|
+
type TileGenerator = (key: TileKey) => TileAsset | Promise<TileAsset>;
|
|
369
|
+
interface TileCacheOptions {
|
|
370
|
+
maxEntries?: number;
|
|
371
|
+
maxBytes?: number;
|
|
372
|
+
keepBinary?: boolean;
|
|
373
|
+
keepJson?: boolean;
|
|
374
|
+
writer?: TileBakeWriter;
|
|
375
|
+
now?: () => number;
|
|
376
|
+
onEvict?: (entry: TileCacheEntry) => void;
|
|
377
|
+
}
|
|
378
|
+
declare const DEFAULT_TILE_SIZE_WORLD = 64;
|
|
379
|
+
declare function normalizeTileKey(key: TileKey): TileKey;
|
|
380
|
+
declare function tileKeyToString(key: TileKey): string;
|
|
381
|
+
declare function resolveTileSizeWorld(key: TileKey, defaultTileSizeWorld?: number): number;
|
|
382
|
+
declare function tileBoundsWorld(key: TileKey, defaultTileSizeWorld?: number): {
|
|
383
|
+
minX: number;
|
|
384
|
+
minZ: number;
|
|
385
|
+
maxX: number;
|
|
386
|
+
maxZ: number;
|
|
387
|
+
centerX: number;
|
|
388
|
+
centerZ: number;
|
|
389
|
+
size: number;
|
|
390
|
+
};
|
|
391
|
+
declare function tileKeyFromWorldPosition(options: {
|
|
392
|
+
seed: number;
|
|
393
|
+
x: number;
|
|
394
|
+
z: number;
|
|
395
|
+
level?: number;
|
|
396
|
+
tileSizeWorld?: number;
|
|
397
|
+
defaultTileSizeWorld?: number;
|
|
398
|
+
}): TileKey;
|
|
399
|
+
declare function tileAssetFileStem(key: TileKey): string;
|
|
400
|
+
declare class TileCache {
|
|
401
|
+
private entries;
|
|
402
|
+
private inflight;
|
|
403
|
+
private totalBytes;
|
|
404
|
+
private options;
|
|
405
|
+
constructor(options?: TileCacheOptions);
|
|
406
|
+
getStats(): {
|
|
407
|
+
entries: number;
|
|
408
|
+
bytes: number;
|
|
409
|
+
inflight: number;
|
|
410
|
+
};
|
|
411
|
+
has(key: TileKey): boolean;
|
|
412
|
+
get(key: TileKey): TileCacheEntry | undefined;
|
|
413
|
+
getOrCreate(key: TileKey, generator: TileGenerator): Promise<TileCacheEntry>;
|
|
414
|
+
delete(key: TileKey): boolean;
|
|
415
|
+
private replaceEntry;
|
|
416
|
+
private evictIfNeeded;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
type Vec3 = [number, number, number];
|
|
420
|
+
type MeshGeomorph = {
|
|
421
|
+
targetY: number;
|
|
422
|
+
weight?: number;
|
|
423
|
+
};
|
|
424
|
+
interface MeshBuilderOptions {
|
|
425
|
+
size?: number;
|
|
426
|
+
includeGeomorph?: boolean;
|
|
427
|
+
defaultMaterial?: number;
|
|
428
|
+
foliageMaterial?: number;
|
|
429
|
+
}
|
|
430
|
+
interface MeshBuilder {
|
|
431
|
+
vertices: number[];
|
|
432
|
+
boxMin: number[];
|
|
433
|
+
boxMax: number[];
|
|
434
|
+
vertexStride: number;
|
|
435
|
+
includeGeomorph: boolean;
|
|
436
|
+
addTriangle: (a: Vec3, b: Vec3, c: Vec3, normal: Vec3, color: Vec3, swayA?: number, swayB?: number, swayC?: number, material?: number, morphA?: MeshGeomorph, morphB?: MeshGeomorph, morphC?: MeshGeomorph) => void;
|
|
437
|
+
addQuad: (a: Vec3, b: Vec3, c: Vec3, d: Vec3, normal: Vec3, color: Vec3, swayA?: number, swayB?: number, swayC?: number, swayD?: number, material?: number, morphA?: MeshGeomorph, morphB?: MeshGeomorph, morphC?: MeshGeomorph, morphD?: MeshGeomorph) => void;
|
|
438
|
+
addTreeMesh: (center: Vec3, baseHeight: number, seedValue: number, material?: number) => void;
|
|
439
|
+
addBounds: (points: Vec3[], minY?: number, maxYOverride?: number) => void;
|
|
440
|
+
readonly treeMeshCount: number;
|
|
441
|
+
}
|
|
442
|
+
declare function normalize(vec: Vec3): Vec3;
|
|
443
|
+
declare function computeNormal(a: Vec3, b: Vec3, c: Vec3): Vec3;
|
|
444
|
+
declare function shade(color: Vec3, factor: number): Vec3;
|
|
445
|
+
declare function createMeshBuilder(sizeOrOptions?: number | MeshBuilderOptions): MeshBuilder;
|
|
446
|
+
|
|
447
|
+
export { DEFAULT_TILE_SIZE_WORLD, FIELD_DOWNWARD_MAX, FIELD_UPWARD_MIN, FRACTAL_ASSET_VERSION, FRACTAL_SAMPLE_STRIDE, type FieldParams, type FieldSample, type FractalAsset, type FractalAssetPayload, type FractalMandelSettings, type FractalPrepassRunOptions, type FractalPrepassRunner, type HexCell, type HexLevelSpec, MacroBiome, type MacroBiomeId, MacroBiomeLabel, type MeshBuilder, type MeshBuilderOptions, type MeshGeomorph, MicroFeature, type MicroFeatureId, MicroFeatureLabel, type MixedForestLayer, type MixedForestOptions, type PerfMonitor, type PerfMonitorOptions, type PerfMonitorUpdate, SlopeBand, type SlopeBandId, SlopeBandLabel, SurfaceCover, type SurfaceCoverId, SurfaceCoverLabel, TILE_ASSET_VERSION, TerrainBiome, type TerrainBiomeId, TerrainBiomeLabel, type TerrainCell, type TerrainParams, type TileAsset, type TileAssetPayload, type TileBakeOutput, type TileBakeWriter, TileCache, type TileCacheEntry, type TileCacheOptions, type TileCacheStatus, type TileGenerator, type TileKey, type Vec3, assetMatches, axialToWorld, bakeTileAsset, buildHexLevels, classifySlopeBand, computeNormal, createFractalPrepassRunner, createMeshBuilder, createPerfMonitor, defaultFieldParams, defaultFractalMandelSettings, encodeTerrainParams, fieldWgslUrl, fractalPrepassWgslUrl, generateHexGrid, generateTemperateMixedForest, hexAreaFromSide, hexSideFromArea, loadFieldWgsl, loadFractalPrepassWgsl, loadTerrainWgsl, normalize, normalizeTileKey, packHexCells, parseFractalAsset, parseTileAssetBinary, parseTileAssetJson, resolveTileSizeWorld, sampleFieldStack, serializeFractalAsset, serializeTileAssetBinary, serializeTileAssetBinaryFromJson, serializeTileAssetJson, serializeTileAssetJsonFromBinary, shade, terrainWgslUrl, tileAssetFileStem, tileBoundsWorld, tileKeyFromWorldPosition, tileKeyToString, unpackTerrain, validateTileAssetPayload };
|