From ad37720edd90fde12f33f2141df738e599b7d827 Mon Sep 17 00:00:00 2001 From: Mario Date: Sun, 19 Jul 2026 12:30:11 +0200 Subject: [PATCH] Am Lightning rumgeschraubt (Nicht mc queen) --- .../java/de/blight/game/scene/WorldScene.java | 5 ++- .../de/blight/game/state/DayNightState.java | 39 +++++++++++++------ .../de/blight/game/state/LightingConfig.java | 11 +++--- .../blight/game/state/WorldObjectsState.java | 11 ++++-- 4 files changed, 44 insertions(+), 22 deletions(-) diff --git a/blight-game/src/main/java/de/blight/game/scene/WorldScene.java b/blight-game/src/main/java/de/blight/game/scene/WorldScene.java index 31a41b9..0ed2bb4 100644 --- a/blight-game/src/main/java/de/blight/game/scene/WorldScene.java +++ b/blight-game/src/main/java/de/blight/game/scene/WorldScene.java @@ -219,8 +219,11 @@ public class WorldScene extends BaseAppState { animLib = new AnimationLibrary(); app.getStateManager().attach(animLib); - // Früh starten damit DayNightState bis onEnable() bereits initialisiert ist + // Früh starten damit DayNightState bis onEnable() bereits initialisiert ist. + // withShadows=false: Shadow-Filter wird in buildLighting() extern übergeben. + // setGameMode(true): Spiel-Beleuchtungswerte statt Editor-Werte verwenden. dayNight = new DayNightState(false); + dayNight.setGameMode(true); app.getStateManager().attach(dayNight); } diff --git a/blight-game/src/main/java/de/blight/game/state/DayNightState.java b/blight-game/src/main/java/de/blight/game/state/DayNightState.java index 0971362..9190979 100644 --- a/blight-game/src/main/java/de/blight/game/state/DayNightState.java +++ b/blight-game/src/main/java/de/blight/game/state/DayNightState.java @@ -57,6 +57,8 @@ public class DayNightState extends BaseAppState implements TimeListener { private ColorRGBA sunBaseColor = new ColorRGBA(1, 1, 1, 1); private float shadowBaseIntensity = 0f; private ColorRGBA customAmbient = new ColorRGBA(); + /** true = Spiel-Beleuchtungswerte, false = Editor-Werte. Standardmäßig = withShadows. */ + private boolean gameMode; private static final float CAVE_RAY_HEIGHT = 12f; private static final float CAVE_CHECK_INTERVAL = 0.2f; @@ -69,14 +71,23 @@ public class DayNightState extends BaseAppState implements TimeListener { this(new DayTime(), true); } - /** @param withShadows false für Editor (kein Shadow-Renderer) */ + /** @param withShadows false für Editor (kein Shadow-Renderer, Editor-Beleuchtungswerte) */ public DayNightState(boolean withShadows) { this(new DayTime(), withShadows); } public DayNightState(DayTime dayTime, boolean withShadows) { - this.dayTime = dayTime; + this.dayTime = dayTime; this.withShadows = withShadows; + this.gameMode = withShadows; + } + + /** + * Schaltet auf Spiel-Beleuchtungswerte um, unabhängig vom withShadows-Flag. + * Nützlich wenn der Shadow-Filter von außen gesetzt wird (z.B. WorldScene). + */ + public void setGameMode(boolean gameMode) { + this.gameMode = gameMode; } public DayTime getDayTime() { return dayTime; } @@ -234,24 +245,28 @@ public class DayNightState extends BaseAppState implements TimeListener { float elevC = FastMath.clamp(elevation, 0f, 1f); // Spiel vs. Editor: unterschiedliche Helligkeitswerte aus LightingConfig - ColorRGBA ambDay = withShadows ? LightingConfig.AMB_DAY : LightingConfig.EDITOR_AMB_DAY; - ColorRGBA ambNight = withShadows ? LightingConfig.AMB_NIGHT : LightingConfig.EDITOR_AMB_NIGHT; - ColorRGBA custDay = withShadows ? LightingConfig.CUSTOM_AMB_DAY : LightingConfig.EDITOR_CUSTOM_AMB_DAY; - ColorRGBA custNight = withShadows ? LightingConfig.CUSTOM_AMB_NIGHT : LightingConfig.EDITOR_CUSTOM_AMB_NIGHT; - float sunIntensity = withShadows ? LightingConfig.SUN_INTENSITY : LightingConfig.EDITOR_SUN_INTENSITY; + ColorRGBA ambDay = gameMode ? LightingConfig.AMB_DAY : LightingConfig.EDITOR_AMB_DAY; + ColorRGBA ambNight = gameMode ? LightingConfig.AMB_NIGHT : LightingConfig.EDITOR_AMB_NIGHT; + ColorRGBA custDay = gameMode ? LightingConfig.CUSTOM_AMB_DAY : LightingConfig.EDITOR_CUSTOM_AMB_DAY; + ColorRGBA custNight = gameMode ? LightingConfig.CUSTOM_AMB_NIGHT : LightingConfig.EDITOR_CUSTOM_AMB_NIGHT; + float sunIntensity = gameMode ? LightingConfig.SUN_INTENSITY : LightingConfig.EDITOR_SUN_INTENSITY; // ── Sonnenfarbe: Dämmerung (orange) → Tag (warm-weiß) — jedes Frame ── float dawnFactor = 1f - FastMath.clamp(elevation * LightingConfig.SUN_DAWN_SLOPE, 0f, 1f); - ColorRGBA sunColor = LightingConfig.SUN_COLOR_DAWN.clone() + ColorRGBA sunTint = LightingConfig.SUN_COLOR_DAWN.clone() .interpolateLocal(LightingConfig.SUN_COLOR_DAY, 1f - dawnFactor); - sunBaseColor = sunColor.mult(elevC * sunIntensity); + sunBaseColor = sunTint.mult(elevC * sunIntensity); sun.setColor(sunBaseColor.mult(1f - caveFactor)); - // ── Ambient: Nacht → Tag — jedes Frame ───────────────────────────── + // ── Ambient: Nacht (blau) → Tag (Sonnenfarbe-tinted) — jedes Frame ── + // Tages-Ambient bekommt den Farbton der Sonne: orange bei Dämmerung, + // warm-gelb tagsüber. Nachts bleibt das fixe Blau von AMB_NIGHT. + ColorRGBA ambDayTinted = ambDay.mult(sunTint); + ColorRGBA custDayTinted = custDay.mult(sunTint); float ambFactor = FastMath.clamp( (elevation - LightingConfig.AMB_ELEV_LOW) / LightingConfig.AMB_ELEV_RANGE, 0f, 1f); - ambient.setColor(ambNight.clone().interpolateLocal(ambDay, ambFactor)); - customAmbient.set(custNight.clone().interpolateLocal(custDay, ambFactor)); + ambient.setColor(ambNight.clone().interpolateLocal(ambDayTinted, ambFactor)); + customAmbient.set(custNight.clone().interpolateLocal(custDayTinted, ambFactor)); shadowBaseIntensity = FastMath.clamp( elevation * LightingConfig.SHADOW_SLOPE, 0f, LightingConfig.SHADOW_MAX); diff --git a/blight-game/src/main/java/de/blight/game/state/LightingConfig.java b/blight-game/src/main/java/de/blight/game/state/LightingConfig.java index 02791b8..0636704 100644 --- a/blight-game/src/main/java/de/blight/game/state/LightingConfig.java +++ b/blight-game/src/main/java/de/blight/game/state/LightingConfig.java @@ -77,16 +77,17 @@ public final class LightingConfig { /** * AmbientLight-Farbe am Mittag. * Skaliert den LightProbe-IBL: envLight = probeIBL × AMB_DAY. - * Hoch halten (≥ 0.7) damit PBR-Reflexionen sichtbar bleiben. + * Nicht zu hoch – LightProbe bäckt bereits Mittags-Beleuchtung ein; + * bei AMB_DAY=0.90 wäre probeIBL + direkte Sonne (0.68) zu hell für weiße Flächen. * Hat keinen Effekt solange kein LightProbe in der Szene ist. */ - public static final ColorRGBA AMB_DAY = new ColorRGBA(0.90f, 0.90f, 0.90f, 1f); + public static final ColorRGBA AMB_DAY = new ColorRGBA(0.28f, 0.28f, 0.28f, 1f); /** * AmbientLight-Farbe in der Nacht (LightProbe-Multiplikator). * Leichter Blaustich simuliert Mondlicht-Reflexionen auf PBR-Flächen. */ - public static final ColorRGBA AMB_NIGHT = new ColorRGBA(0.10f, 0.10f, 0.25f, 1f); + public static final ColorRGBA AMB_NIGHT = new ColorRGBA(0.05f, 0.05f, 0.125f, 1f); // ╔══════════════════════════════════════════════════════════════════════════╗ @@ -103,7 +104,7 @@ public final class LightingConfig { * ↓ senken: mehr Kontrast, tiefere Schatten (wirkt moodiger/dramatischer). * Empfehlung: 0.03–0.10 pro Kanal. */ - public static final ColorRGBA CUSTOM_AMB_DAY = new ColorRGBA(0.04f, 0.05f, 0.08f, 1f); + public static final ColorRGBA CUSTOM_AMB_DAY = new ColorRGBA(0.03f, 0.04f, 0.06f, 1f); /** * Ambient-Farbe in der Nacht. @@ -111,7 +112,7 @@ public final class LightingConfig { * Zu hoch → Nacht wirkt grau statt dunkel. * Empfehlung: 0.01–0.04 pro Kanal, Blau-Kanal darf höher sein. */ - public static final ColorRGBA CUSTOM_AMB_NIGHT = new ColorRGBA(0.025f, 0.025f, 0.06f, 1f); + public static final ColorRGBA CUSTOM_AMB_NIGHT = new ColorRGBA(0.012f, 0.012f, 0.03f, 1f); // ╔══════════════════════════════════════════════════════════════════════════╗ diff --git a/blight-game/src/main/java/de/blight/game/state/WorldObjectsState.java b/blight-game/src/main/java/de/blight/game/state/WorldObjectsState.java index dff348d..5ef01e1 100644 --- a/blight-game/src/main/java/de/blight/game/state/WorldObjectsState.java +++ b/blight-game/src/main/java/de/blight/game/state/WorldObjectsState.java @@ -291,6 +291,7 @@ public class WorldObjectsState extends BaseAppState { geo.setMaterial(pbrMat); } else if (spatial instanceof Node node) { + if ("lod2".equals(node.getName())) return; for (Spatial child : new ArrayList<>(node.getChildren())) { convertUnshadedToPbr(child); } @@ -303,10 +304,11 @@ public class WorldObjectsState extends BaseAppState { if (mat == null) return; String name = mat.getMaterialDef().getName(); if ("Tree".equals(name) || "TreeLeaf".equals(name)) { - // j3o-Loading setzt keine j3md-Defaults → Uniforms explizit setzen - // (Werte für Mittag; werden sofort in update() durch DayNightState überschrieben) - mat.setVector3("SunColor", new Vector3f(1.00f, 0.95f, 0.88f)); - mat.setVector3("AmbientColor", new Vector3f(0.08f, 0.10f, 0.16f)); + // j3o-Loading setzt keine j3md-Defaults → Uniforms explizit setzen. + // SunColor = SUN_COLOR_DAY × SUN_INTENSITY (wie in update() bei Mittag), + // sonst leuchten Bäume weiß bis DayNightState das erste Mal überschreibt. + mat.setVector3("SunColor", new Vector3f(0.68f, 0.65f, 0.60f)); + mat.setVector3("AmbientColor", new Vector3f(0.04f, 0.05f, 0.08f)); mat.setVector3("LightDir", new Vector3f(0f, -1f, 0f)); sceneLitMaterials.add(mat); } else if ("Fern".equals(name)) { @@ -325,6 +327,7 @@ public class WorldObjectsState extends BaseAppState { log.info("[WorldObjects] Material-Def '{}' an '{}' – unbekannt, übersprungen.", name, geo.getName()); } } else if (spatial instanceof Node node) { + if ("lod2".equals(node.getName())) return; for (Spatial child : node.getChildren()) { collectSceneLitMaterials(child); }