feat: shadows, baked vertex AO, post-processing + central config.js
Visuals:
- PCFSoftShadowMap (2048²), directional light follows player with a tight
shadow frustum (SHADOW_AREA) for high texel density; opak blocks cast+receive,
water receives.
- Baked vertex ambient occlusion ("smooth lighting"): per-vertex solid-neighbor
lookup (0fps algorithm) written into a color attribute, with flip-triangulation
to avoid brightness seams across quad diagonals.
- EffectComposer: RenderPass -> UnrealBloomPass (subtle) -> OutputPass with
ACES filmic tone-mapping + sRGB. HalfFloat render target (anti-banding) + MSAA.
Controls:
- Sprint moved from Ctrl to Shift (Ctrl is problematic in browsers). Shift in
fly mode still means "descend" (no conflict, sprint only applies when walking).
config.js:
- New central js/config.js for all tweakable values (world, performance,
renderer/tone-mapping, sky & fog, camera, lighting, shadows, bloom, AO,
player physics, mouse sensitivity, reach) with SHADOWS_ENABLED / BLOOM_ENABLED
feature toggles. Structural engine constants stay in constants.js.
- SEA_LEVEL / WORLD_SEED moved constants.js -> config.js (consumers rewired).
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
1 parent
1049253d54
commit
f009789c42
9 files changed
+282
-59
No files matched your search
+111
@@ -0,0 +1,111 @@
|
||||
// ============================================================
|
||||
// CONFIG — alle einstellbaren Werte für den Minecraft Clone
|
||||
// ============================================================
|
||||
// Hier kannst du Aussehen, Performance, Welt und Spieler-
|
||||
// verhalten anpassen. Strukturelle Engine-Konstanten
|
||||
// (Chunk-Größen, Block-IDs, Textur-Atlas) liegen in
|
||||
// constants.js und sollten NICHT geändert werden (sonst
|
||||
// drohen Mesh/Storage-Fehler).
|
||||
//
|
||||
// Nach jeder Änderung: Seite HARD-REFRESHEN (Ctrl+Shift+R),
|
||||
// damit der Browser die Module nicht aus dem Cache lädt.
|
||||
// ============================================================
|
||||
|
||||
import * as THREE from 'three';
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// 🌍 WELT
|
||||
// ────────────────────────────────────────────────────────────
|
||||
export const WORLD_SEED = 1337; // gleicher Seed = gleiche Welt. Beliebige ganze Zahl.
|
||||
export const SEA_LEVEL = 26; // Höhe der Wasseroberfläche (muss < CHUNK_HEIGHT=64 bleiben)
|
||||
|
||||
// Spawn-Position (X/Z in Blöcken; Y wird automatisch auf den Boden gesetzt).
|
||||
export const SPAWN = { x: 8, z: 8 };
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// ⚡ PERFORMANCE
|
||||
// ────────────────────────────────────────────────────────────
|
||||
export const RENDER_DISTANCE = 6; // Chunk-Radius um den Spieler (höher = weiter sichtbar, mehr Last)
|
||||
export const MAX_OPS_PER_FRAME = 2; // Chunk-Generierung/Meshing pro Frame (höher = lädt schneller, ruckelt eher)
|
||||
export const MAX_PIXEL_RATIO = 2; // Cap der Gerät-Pixelratio (2 = scharf; 1 = schneller auf HiDPI-Screens)
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// 🎨 RENDERER & TONE-MAPPING
|
||||
// ────────────────────────────────────────────────────────────
|
||||
export const ANTIALIAS = true; // MSAA direkt am Renderer (Kantenglättung ohne Composer)
|
||||
export const MSAA_SAMPLES = 4; // MSAA-Stufen im Post-Processing-Composer (WebGL2; 0 = aus)
|
||||
export const TONE_MAPPING = THREE.ACESFilmicToneMapping; // "Color Grading". Alternativen: THREE.Linear / Reinhard / Cineon
|
||||
export const TONE_MAPPING_EXPOSURE = 1.1; // globale Helligkeit (höher = heller). ACES dunkelt leicht ab.
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// 🌫️ HIMMEL & NEBEL
|
||||
// ────────────────────────────────────────────────────────────
|
||||
export const SKY_COLOR = 0xaaccff; // Hintergrund- und Nebelfarbe
|
||||
export const FOG_NEAR = 64; // Block-Distanz, ab der Nebel einsetzt (≈ (RENDER_DISTANCE-2)*16)
|
||||
export const FOG_FAR = 96; // Block-Distanz, ab der Nebel ganz undurchsichtig ist (≈ RENDER_DISTANCE*16)
|
||||
// Hinweis: bei Änderung von RENDER_DISTANCE FOG_NEAR/FOG_FAR passend nachziehen.
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// 📷 KAMERA
|
||||
// ────────────────────────────────────────────────────────────
|
||||
export const CAMERA_FOV = 72; // Sichtfeld in Grad (höher = weiterer Blickwinkel / Fisheye)
|
||||
export const CAMERA_NEAR = 0.1;
|
||||
export const CAMERA_FAR = 1000;
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// 💡 BELEUCHTUNG
|
||||
// ────────────────────────────────────────────────────────────
|
||||
export const HEMISPHERE = { sky: 0xbfdfff, ground: 0x5a6b3a, intensity: 1.05 }; // weiche Aufhellung von oben/unten
|
||||
export const SUN = { color: 0xfff4d6, intensity: 1.2 }; // gerichtetes Hauptlicht
|
||||
// Sonnenrichtung (wird intern normalisiert). Bestimmt, aus welcher Seite Licht/Schatten kommen.
|
||||
export const SUN_DIRECTION = [0.55, 0.72, 0.42];
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// 🌑 SCHATTEN
|
||||
// ────────────────────────────────────────────────────────────
|
||||
export const SHADOWS_ENABLED = true;
|
||||
export const SHADOW_MAP_SIZE = 2048; // Schatten-Textur-Auflösung (höher = schärfer + mehr Last; 1024/2048 typisch)
|
||||
export const SHADOW_AREA = 44; // halbe Kantenlänge des Schatten-Frustums um den Spieler (Blöcke)
|
||||
export const SHADOW_BIAS = 0.0002; // gegen "Shadow Acne" (strichartige Selbstschatten)
|
||||
export const SHADOW_NORMAL_BIAS = 0.02; // gegen Acne auf Voxelflächen (in Normalenrichtung verschieben)
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// ✨ POST-PROCESSING (Bloom / Glanz)
|
||||
// ────────────────────────────────────────────────────────────
|
||||
export const BLOOM_ENABLED = true;
|
||||
export const BLOOM = { strength: 0.4, radius: 0.5, threshold: 0.55 };
|
||||
// strength = Glanz-Stärke (höher = stärkeres Leuchten)
|
||||
// radius = Ausbreitung des Glanzes
|
||||
// threshold = nur Pixel HELLER als dieser Wert glühen (niedriger = mehr glüht)
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// 🔲 AMBIENT OCCLUSION (Eck-Verdunkelung = "Smooth Lighting")
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// AO-Stufe pro Vertex: Index 0 = stärkste Verdeckung (dunkelste Ecke),
|
||||
// 3 = keine Verdeckung. Niedrigere Werte = dunklere Ecken/Kanten.
|
||||
export const AO_LEVEL = [0.2, 0.4, 0.5, 1.8];
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// 🚶 SPIELER (Physik & Dimensionen)
|
||||
// ────────────────────────────────────────────────────────────
|
||||
export const PLAYER = {
|
||||
HALF: 0.3, // halbe Spielerbreite (X/Z) — AABB-Kollisionskasten
|
||||
HEIGHT: 1.8, // Körperhöhe
|
||||
EYE: 1.62, // Augenposition über den Füßen
|
||||
GRAVITY: 26, // Fallbeschleunigung (Blöcke/s²)
|
||||
JUMP_VEL: 8.6, // Sprung-Startgeschwindigkeit
|
||||
WALK: 4.7, // Laufgeschwindigkeit (Blöcke/s)
|
||||
SPRINT: 7.2, // Sprintgeschwindigkeit (Shift)
|
||||
FLY_SPEED: 9.5, // Fluggeschwindigkeit (F-Modus)
|
||||
MAX_FALL: 50, // max. Fallgeschwindigkeit (Terminal-Speed)
|
||||
};
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// 🖱️ STEUERUNG
|
||||
// ────────────────────────────────────────────────────────────
|
||||
export const MOUSE_SENSITIVITY = 0.0022; // Maus-Look-Empfindlichkeit (höher = schnellere Drehung)
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// 🎯 GAMEPLAY
|
||||
// ────────────────────────────────────────────────────────────
|
||||
export const REACH = 6; // Reichweite für Abbauen/Bauen (Blöcke)
|
||||
Reference in new issue
Block a user