From d839a4ea22c69203831a4e19a4fb6230d3195561 Mon Sep 17 00:00:00 2001 From: simonbas Date: Mon, 12 Jun 2023 22:54:52 +0200 Subject: [PATCH] Lightmap add falloff --- .../core/graphics/GraphicsConfiguration.java | 11 +++++++++++ .../core/graphics/GraphicsConfigurationEvent.java | 3 ++- .../core/graphics/internal/DefaultLight.java | 2 +- .../screwbox/core/graphics/internal/Lightmap.java | 14 +++++++++----- .../examples/platformer/scenes/GameScene.java | 7 +++++++ 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/GraphicsConfiguration.java b/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/GraphicsConfiguration.java index 143c7a2a7..1595dfcdb 100644 --- a/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/GraphicsConfiguration.java +++ b/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/GraphicsConfiguration.java @@ -1,5 +1,6 @@ package io.github.srcimon.screwbox.core.graphics; +import io.github.srcimon.screwbox.core.Percent; import io.github.srcimon.screwbox.core.loop.Loop; import java.util.ArrayList; @@ -16,6 +17,7 @@ public class GraphicsConfiguration { private boolean useAntialiasing = false; private int lightmapBlur = 4; private int lightmapScale = 4; + private Percent lightFalloff = Percent.max(); /** * Sets the resolution modifier for the light map. Higher values lower the @@ -138,4 +140,13 @@ private void notifyListeners(final GraphicsConfigurationEvent.ConfigurationPrope } } + public GraphicsConfiguration lightFalloff(final Percent lightFalloff) { + this.lightFalloff = lightFalloff; + notifyListeners(GraphicsConfigurationEvent.ConfigurationProperty.LIGHT_FALLOFF); + return this; + } + + public Percent lightFalloff() { + return lightFalloff; + } } diff --git a/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/GraphicsConfigurationEvent.java b/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/GraphicsConfigurationEvent.java index 3085e3e7a..1913fbe4a 100644 --- a/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/GraphicsConfigurationEvent.java +++ b/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/GraphicsConfigurationEvent.java @@ -14,7 +14,8 @@ public enum ConfigurationProperty { WINDOW_MODE, ANTIALIASING, LIGHTMAP_BLUR, - LIGHTMAP_SCALE + LIGHTMAP_SCALE, + LIGHT_FALLOFF } public GraphicsConfigurationEvent(final Object source, final ConfigurationProperty changedProperty) { diff --git a/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/internal/DefaultLight.java b/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/internal/DefaultLight.java index 2e178edf6..fd25c8f8f 100644 --- a/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/internal/DefaultLight.java +++ b/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/internal/DefaultLight.java @@ -185,6 +185,6 @@ private boolean isVisible(final Bounds lightBox) { } private void initLightmap() { - lightmap = new Lightmap(screen.size(), configuration.lightmapScale()); + lightmap = new Lightmap(screen.size(), configuration.lightmapScale(), configuration.lightFalloff()); } } diff --git a/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/internal/Lightmap.java b/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/internal/Lightmap.java index 5e8432a18..a1982ad98 100644 --- a/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/internal/Lightmap.java +++ b/screwbox-core/src/main/java/io/github/srcimon/screwbox/core/graphics/internal/Lightmap.java @@ -1,8 +1,10 @@ package io.github.srcimon.screwbox.core.graphics.internal; +import io.github.srcimon.screwbox.core.Percent; import io.github.srcimon.screwbox.core.graphics.Offset; import io.github.srcimon.screwbox.core.graphics.Size; import io.github.srcimon.screwbox.core.graphics.WindowBounds; +import io.github.srcimon.screwbox.core.utils.MathUtil; import java.awt.*; import java.awt.image.BufferedImage; @@ -11,30 +13,32 @@ class Lightmap { - record PointLight(Offset position, int radius, List area, io.github.srcimon.screwbox.core.graphics.Color color) { + record PointLight(Offset position, int radius, List area, + io.github.srcimon.screwbox.core.graphics.Color color) { } record SpotLight(Offset position, int radius, io.github.srcimon.screwbox.core.graphics.Color color) { } private static final java.awt.Color FADE_TO_COLOR = AwtMapper.toAwtColor(io.github.srcimon.screwbox.core.graphics.Color.TRANSPARENT); - private static final float[] FRACTIONS = new float[] { 0.1f, 1f }; - private final BufferedImage image; private final Graphics2D graphics; private final int resolution; + private final float[] fractions; private final List pointLights = new ArrayList<>(); private final List spotLights = new ArrayList<>(); private final List fullBrigthnessAreas = new ArrayList<>(); - public Lightmap(final Size size, final int resolution) { + public Lightmap(final Size size, final int resolution, Percent lightFade) { this.image = new BufferedImage( size.width() / resolution + 1, // to avoid glitches add 1 size.height() / resolution + 1, // to avoid glitches add 1 BufferedImage.TYPE_INT_ARGB); this.resolution = resolution; this.graphics = (Graphics2D) image.getGraphics(); + final float falloffValue = (float) MathUtil.clamp(0.1f, lightFade.invert().value(), 0.99f); + this.fractions = new float[]{falloffValue, 1f}; } public void add(final WindowBounds fullBrightnessArea) { @@ -108,7 +112,7 @@ private RadialGradientPaint radialPaint(final Offset position, final int radius, position.x() / (float) resolution, position.y() / (float) resolution, usedRadius / (float) resolution, - FRACTIONS, colors); + fractions, colors); } public List pointLights() { diff --git a/screwbox-examples/platformer-example/src/main/java/io/github/srcimon/screwbox/examples/platformer/scenes/GameScene.java b/screwbox-examples/platformer-example/src/main/java/io/github/srcimon/screwbox/examples/platformer/scenes/GameScene.java index d625a056b..b84d40466 100644 --- a/screwbox-examples/platformer-example/src/main/java/io/github/srcimon/screwbox/examples/platformer/scenes/GameScene.java +++ b/screwbox-examples/platformer-example/src/main/java/io/github/srcimon/screwbox/examples/platformer/scenes/GameScene.java @@ -102,6 +102,13 @@ public void initialize(final Entities entities) { .add(new AreaTriggerSystem()) .add(new TimeoutSystem()) .add(new ResetSceneSystem()) + .add(e -> { + if(e.mouse().justClickedLeft()) { + e.graphics().configuration().setLightmapScale(2); + } + e.window().setTitle(e.graphics().configuration().lightFalloff() + ""); + e.graphics().configuration().lightFalloff(Percent.of(e.graphics().configuration().lightFalloff().value() + 0.02 * e.mouse().unitsScrolled())); + }) .add(new AutoFlipSpriteSystem()) .add(new BackgroundSystem()) .add(new CatMovementSystem())