- Weltgenerierung: FBM-Terrain, 3 Biome (Plains/Wald/Wüste), Höhlen, Wasser, Bäume - Blöcke: Grass, Dirt, Stein, Sand, Holz, Blätter, Wasser (+Bedrock) - Interaktion: DDA-Voxel-Raycast, Abbauen (LMB) & Setzen (RMB), Hotbar 1-6 - Spieler: First-Person, Gravitation, AABB-Kollision, Springen, Fly-Mode (F) - Engine: Chunk-Streaming (16x16x64), Face-Culling, opaker+transparenter Pass - Stack: Three.js + simplex-noise via CDN, prozedurale Texturen, kein Build-Step Co-Authored-By: Claude <noreply@anthropic.com>
31 lines
1.2 KiB
JavaScript
31 lines
1.2 KiB
JavaScript
// Noise-Setup: verschiedene Noise-Funktionen fuer Terrain, Biome und Hoehlen
|
|
import { createNoise2D, createNoise3D } from 'simplex-noise';
|
|
import { WORLD_SEED } from './constants.js';
|
|
import { mulberry32 } from './rng.js';
|
|
|
|
// Wir leiten mehrere unabhaengige Streams aus dem Seed ab, damit
|
|
// verschiedene Noise-Quellen (Hoehe, Temperatur, Hoehlen) nicht korrelieren.
|
|
const rngTerrain = mulberry32(WORLD_SEED);
|
|
const rngTemp = mulberry32(WORLD_SEED ^ 0x9e3779b9);
|
|
const rngHumid = mulberry32(WORLD_SEED ^ 0x85ebca6b);
|
|
const rngCave = mulberry32(WORLD_SEED ^ 0xc2b2ae35);
|
|
const rngDetail = mulberry32(WORLD_SEED ^ 0x27d4eb2f);
|
|
|
|
export const noise2DTerrain = createNoise2D(rngTerrain);
|
|
export const noise2DDetail = createNoise2D(rngDetail);
|
|
export const noise2DTemp = createNoise2D(rngTemp);
|
|
export const noise2DHumid = createNoise2D(rngHumid);
|
|
export const noise3DCave = createNoise3D(rngCave);
|
|
|
|
// Fraktale Brownian Motion (fbm) in 2D
|
|
export function fbm2(noiseFn, x, z, octaves, lacunarity, gain) {
|
|
let amp = 1, freq = 1, sum = 0, norm = 0;
|
|
for (let o = 0; o < octaves; o++) {
|
|
sum += amp * noiseFn(x * freq, z * freq);
|
|
norm += amp;
|
|
amp *= gain;
|
|
freq *= lacunarity;
|
|
}
|
|
return sum / norm; // [-1,1]
|
|
}
|