From ae244e396972937650e55cdda383c36ebfc3d699 Mon Sep 17 00:00:00 2001 From: Mario Date: Tue, 21 Jul 2026 15:25:17 +0200 Subject: [PATCH] =?UTF-8?q?Weitere=20Grafik=20Filter=20hinzuge=C3=BCfgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../de/blight/game/config/GraphicsScreen.java | 21 ++++++- .../blight/game/config/GraphicsSettings.java | 23 +++++++ .../game/control/ThirdPersonCamera.java | 2 +- .../java/de/blight/game/scene/WorldScene.java | 63 +++++++++++++++++++ .../resources/lang/messages_de.properties | 1 + .../resources/lang/messages_en.properties | 1 + 6 files changed, 107 insertions(+), 4 deletions(-) diff --git a/blight-game/src/main/java/de/blight/game/config/GraphicsScreen.java b/blight-game/src/main/java/de/blight/game/config/GraphicsScreen.java index ba76927..0fcd1b8 100644 --- a/blight-game/src/main/java/de/blight/game/config/GraphicsScreen.java +++ b/blight-game/src/main/java/de/blight/game/config/GraphicsScreen.java @@ -30,7 +30,8 @@ public class GraphicsScreen extends MenuScreen { private static final int ROW_AA = 3; private static final int ROW_VIEWDIST = 4; private static final int ROW_SHADOW = 5; - private static final int ROW_COUNT = 6; + private static final int ROW_POSTFX = 6; + private static final int ROW_COUNT = 7; private final GraphicsSettings live; private GraphicsSettings edit; @@ -63,6 +64,7 @@ public class GraphicsScreen extends MenuScreen { edit.samples = live.samples; edit.viewDistance = live.viewDistance; edit.shadowQuality = live.shadowQuality; + edit.postFxQuality = live.postFxQuality; resIdx = 0; for (int i = 0; i < resolutions.length; i++) { @@ -86,7 +88,8 @@ public class GraphicsScreen extends MenuScreen { "menu.graphics.row.vsync", "menu.graphics.row.aa", "menu.graphics.row.viewdist", - "menu.graphics.row.shadow" + "menu.graphics.row.shadow", + "menu.graphics.row.postfx" }; float lblX = CONT_X + 30f; @@ -145,6 +148,11 @@ public class GraphicsScreen extends MenuScreen { case MEDIUM -> t("menu.graphics.val.shadow.medium"); case HIGH -> t("menu.graphics.val.shadow.high"); }; + case ROW_POSTFX -> switch (edit.postFxQuality) { + case OFF -> t("menu.graphics.val.off"); + case MEDIUM -> t("menu.graphics.val.shadow.medium"); + case HIGH -> t("menu.graphics.val.shadow.high"); + }; default -> ""; }; BitmapText vt = valTexts[row]; @@ -178,18 +186,24 @@ public class GraphicsScreen extends MenuScreen { GraphicsSettings.ShadowQuality[] sqs = GraphicsSettings.ShadowQuality.values(); edit.shadowQuality = sqs[(edit.shadowQuality.ordinal() + dir + sqs.length) % sqs.length]; break; + case ROW_POSTFX: + GraphicsSettings.PostFxQuality[] pfqs = GraphicsSettings.PostFxQuality.values(); + edit.postFxQuality = pfqs[(edit.postFxQuality.ordinal() + dir + pfqs.length) % pfqs.length]; + break; } refreshText(row); } private void applyAndSave() { boolean shadowChanged = live.shadowQuality != edit.shadowQuality; + boolean postFxChanged = live.postFxQuality != edit.postFxQuality; boolean needsRestart = live.width != edit.width || live.height != edit.height || live.fullscreen != edit.fullscreen || live.vsync != edit.vsync || live.samples != edit.samples - || shadowChanged; + || shadowChanged + || postFxChanged; live.width = edit.width; live.height = edit.height; @@ -198,6 +212,7 @@ public class GraphicsScreen extends MenuScreen { live.samples = edit.samples; live.viewDistance = edit.viewDistance; live.shadowQuality = edit.shadowQuality; + live.postFxQuality = edit.postFxQuality; GraphicsStore.save(live); WeatherState ws = getApplication().getStateManager().getState(WeatherState.class); diff --git a/blight-game/src/main/java/de/blight/game/config/GraphicsSettings.java b/blight-game/src/main/java/de/blight/game/config/GraphicsSettings.java index 94f06ff..5072877 100644 --- a/blight-game/src/main/java/de/blight/game/config/GraphicsSettings.java +++ b/blight-game/src/main/java/de/blight/game/config/GraphicsSettings.java @@ -10,6 +10,29 @@ public class GraphicsSettings { public ShadowQuality shadowQuality = ShadowQuality.MEDIUM; /** Verstecktes Debug-Flag: erzwingt LOD2 (Impostor) für alle Objekte. Nur per Konsole setzbar. */ public boolean debugLod2 = false; + public PostFxQuality postFxQuality = PostFxQuality.HIGH; + + public enum PostFxQuality { + // fxaa toneMap bloomI bloomExp godRays + OFF ( false, false, 0f, 0f, false), + MEDIUM( true, true, 0.4f, 3.0f, false), + HIGH ( true, true, 0.6f, 3.5f, true ); + + public final boolean fxaa; + public final boolean toneMap; + public final float bloomIntensity; + public final float bloomExposurePower; + public final boolean godRays; + + PostFxQuality(boolean fxaa, boolean toneMap, + float bloomIntensity, float bloomExposurePower, boolean godRays) { + this.fxaa = fxaa; + this.toneMap = toneMap; + this.bloomIntensity = bloomIntensity; + this.bloomExposurePower = bloomExposurePower; + this.godRays = godRays; + } + } /** * Schattenqualitäts-Stufen. diff --git a/blight-game/src/main/java/de/blight/game/control/ThirdPersonCamera.java b/blight-game/src/main/java/de/blight/game/control/ThirdPersonCamera.java index f1bd379..e0645de 100644 --- a/blight-game/src/main/java/de/blight/game/control/ThirdPersonCamera.java +++ b/blight-game/src/main/java/de/blight/game/control/ThirdPersonCamera.java @@ -23,7 +23,7 @@ public class ThirdPersonCamera { private static final float BASE_DISTANCE = 5f; private static final float MIN_DISTANCE = BASE_DISTANCE - 3f; private static final float MAX_DISTANCE = BASE_DISTANCE + 3f; - private static final float MIN_VERTICAL_ANGLE = 0.08f; // Kamera immer leicht über Schulter + private static final float MIN_VERTICAL_ANGLE = -0.12f; // Kamera kann bis Kniehöhe sinken private static final float MAX_VERTICAL_ANGLE = FastMath.HALF_PI - 0.1f; private static final float TARGET_HEIGHT = 1.0f; 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 ad10793..739e12d 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 @@ -80,6 +80,8 @@ public class WorldScene extends BaseAppState { private MapData loadedMapData; private FilterPostProcessor sharedFPP; private BlightFogFilter fogFilter; + private com.jme3.post.filters.LightScatteringFilter lightScatterFilter; + private com.jme3.post.filters.DepthOfFieldFilter dofFilter; private TerrainChunkState terrainChunkState; private Material terrainMaterial; @@ -435,6 +437,15 @@ public class WorldScene extends BaseAppState { for (Material mat : characterPbrMaterials) { mat.setColor("Emissive", new ColorRGBA(ac.r, ac.g, ac.b, 1f)); } + + if (lightScatterFilter != null) { + Vector3f sunDir = dayNight.getSunDirection(); + // Weltposition der Sonne: von der Kamera aus weit entfernt entgegen der Lichtrichtung + Vector3f sunWorld = app.getCamera().getLocation().add(sunDir.negate().mult(10000f)); + lightScatterFilter.setLightPosition(sunWorld); + // Deaktivieren wenn Sonne hinter der Kamera (gleiche Richtung wie Kamera schaut) + lightScatterFilter.setEnabled(sunDir.dot(app.getCamera().getDirection()) < 0.2f); + } } } @@ -492,6 +503,21 @@ public class WorldScene extends BaseAppState { log.info("[Debug] Nebel {}", nowEnabled ? "AN" : "AUS"); } + /** Tiefenschärfe für Dialogszenen aktivieren. focusDistance in Welt-Einheiten ab Kamera. */ + public void focusDof(float focusDistance, float blurScale) { + if (dofFilter == null) return; + dofFilter.setFocusDistance(focusDistance); + dofFilter.setFocusRange(focusDistance * 0.4f); + dofFilter.setBlurScale(blurScale); + dofFilter.setEnabled(true); + } + + /** Tiefenschärfe deaktivieren. */ + public void clearDof() { + if (dofFilter == null) return; + dofFilter.setEnabled(false); + } + @Override protected void cleanup(Application app) { } @Override protected void onDisable() {} @@ -778,6 +804,43 @@ public class WorldScene extends BaseAppState { log.warn("[WorldScene] Post-Processing nicht verfügbar: {}", e.getMessage()); } + GraphicsSettings.PostFxQuality pfx = graphicsSettings.postFxQuality; + + if (pfx.bloomIntensity > 0f) { + com.jme3.post.filters.BloomFilter bloom = + new com.jme3.post.filters.BloomFilter(com.jme3.post.filters.BloomFilter.GlowMode.Scene); + bloom.setBloomIntensity(pfx.bloomIntensity); + bloom.setExposurePower(pfx.bloomExposurePower); + bloom.setDownSamplingFactor(2f); + fpp.addFilter(bloom); + } + + if (pfx.godRays) { + // Initiale Sonnenposition: von Kamera aus weit entfernt entgegen Lichtrichtung + Vector3f initSunPos = app.getCamera().getLocation().add(sunDir.negate().mult(10000f)); + lightScatterFilter = new com.jme3.post.filters.LightScatteringFilter(initSunPos); + lightScatterFilter.setLightDensity(0.8f); + lightScatterFilter.setBlurStart(0.3f); + lightScatterFilter.setBlurWidth(0.4f); + lightScatterFilter.setNbSamples(150); + fpp.addFilter(lightScatterFilter); + } + + if (pfx.toneMap) { + fpp.addFilter(new com.jme3.post.filters.ToneMapFilter()); + } + + dofFilter = new com.jme3.post.filters.DepthOfFieldFilter(); + dofFilter.setFocusDistance(0f); + dofFilter.setFocusRange(0f); + dofFilter.setBlurScale(1.5f); + dofFilter.setEnabled(false); + fpp.addFilter(dofFilter); + + if (pfx.fxaa) { + fpp.addFilter(new com.jme3.post.filters.FXAAFilter()); + } + app.getViewPort().addProcessor(fpp); } diff --git a/blight-lang/src/main/resources/lang/messages_de.properties b/blight-lang/src/main/resources/lang/messages_de.properties index dbb2312..8f04a3b 100644 --- a/blight-lang/src/main/resources/lang/messages_de.properties +++ b/blight-lang/src/main/resources/lang/messages_de.properties @@ -58,6 +58,7 @@ menu.graphics.row.shadow=Schattenqualität menu.graphics.val.shadow.low=Niedrig menu.graphics.val.shadow.medium=Mittel menu.graphics.val.shadow.high=Hoch +menu.graphics.row.postfx=Post-Effekte menu.graphics.val.resolution.native=Nativ menu.graphics.btn.apply=Übernehmen menu.graphics.btn.cancel=Abbrechen diff --git a/blight-lang/src/main/resources/lang/messages_en.properties b/blight-lang/src/main/resources/lang/messages_en.properties index a06fe7e..11363ed 100644 --- a/blight-lang/src/main/resources/lang/messages_en.properties +++ b/blight-lang/src/main/resources/lang/messages_en.properties @@ -61,6 +61,7 @@ menu.graphics.row.shadow=Shadow Quality menu.graphics.val.shadow.low=Low menu.graphics.val.shadow.medium=Medium menu.graphics.val.shadow.high=High +menu.graphics.row.postfx=Post Effects menu.graphics.val.resolution.native=Native menu.graphics.btn.apply=Apply menu.graphics.btn.cancel=Cancel