From 02b0886aaae8847bb94fb7960c4b2c6c01f7b35c Mon Sep 17 00:00:00 2001 From: extio-de Date: Tue, 23 Dec 2025 15:18:52 +0100 Subject: [PATCH] feat(renderer): Enhance RendererWorkingSet and related classes to support filtering of displayed modules --- .../game_engine/module/ModuleManagerImpl.java | 8 +++- .../renderer/RendererAutoConfiguration.java | 6 ++- .../game_engine/renderer/RendererData.java | 10 ++++- .../game_engine/renderer/g2d/G2DRenderer.java | 8 +++- .../renderer/work/RendererWorkingSet.java | 3 +- .../renderer/work/RendererWorkingSetImpl.java | 9 +++- .../work/RendererWorkingSetImplTest.java | 45 +++++++++++++++---- 7 files changed, 72 insertions(+), 17 deletions(-) diff --git a/src/main/java/de/extio/game_engine/module/ModuleManagerImpl.java b/src/main/java/de/extio/game_engine/module/ModuleManagerImpl.java index 4796011..de0cd0d 100644 --- a/src/main/java/de/extio/game_engine/module/ModuleManagerImpl.java +++ b/src/main/java/de/extio/game_engine/module/ModuleManagerImpl.java @@ -239,7 +239,13 @@ public class ModuleManagerImpl implements InitializingBean, ModuleManager { @Override public boolean isDisplayed(final Class clazz) { - return this.modulesDisplayed.stream().anyMatch(m -> clazz.isAssignableFrom(m.getClass())); + final var modules = this.modulesDisplayed; + for (int i = 0; i < modules.size(); i++) { + if (clazz.isAssignableFrom(this.modulesDisplayed.get(i).getClass())) { + return true; + } + } + return false; } @Override diff --git a/src/main/java/de/extio/game_engine/renderer/RendererAutoConfiguration.java b/src/main/java/de/extio/game_engine/renderer/RendererAutoConfiguration.java index 8369fc0..c3ac1ef 100644 --- a/src/main/java/de/extio/game_engine/renderer/RendererAutoConfiguration.java +++ b/src/main/java/de/extio/game_engine/renderer/RendererAutoConfiguration.java @@ -14,6 +14,7 @@ import org.springframework.context.annotation.Bean; import de.extio.game_engine.event.EventService; import de.extio.game_engine.keyboard.KeycodeRegistry; +import de.extio.game_engine.module.ModuleManager; import de.extio.game_engine.renderer.model.RenderingBo; import de.extio.game_engine.renderer.work.RendererWorkingSet; import de.extio.game_engine.renderer.work.RendererWorkingSetImpl; @@ -55,9 +56,10 @@ public class RendererAutoConfiguration { final KeycodeRegistry keycodeRegistry, final EventService eventService, final StorageService storageService, - final RendererWorkingSet rendererWorkingSet) { + final RendererWorkingSet rendererWorkingSet, + final ModuleManager moduleManager) { - final var rendererData = new RendererData(applicationContext, renderer, rendererControl, renderingBoPool, keycodeRegistry, eventService, storageService, rendererWorkingSet); + final var rendererData = new RendererData(applicationContext, renderer, rendererControl, renderingBoPool, keycodeRegistry, eventService, storageService, rendererWorkingSet, moduleManager); renderer.setRendererData(rendererData); rendererControl.setRendererData(rendererData); renderingBoPool.setRendererData(rendererData); diff --git a/src/main/java/de/extio/game_engine/renderer/RendererData.java b/src/main/java/de/extio/game_engine/renderer/RendererData.java index d36d02d..3a9ee66 100644 --- a/src/main/java/de/extio/game_engine/renderer/RendererData.java +++ b/src/main/java/de/extio/game_engine/renderer/RendererData.java @@ -7,6 +7,7 @@ import org.springframework.context.ApplicationContext; import de.extio.game_engine.event.EventService; import de.extio.game_engine.keyboard.KeycodeRegistry; +import de.extio.game_engine.module.ModuleManager; import de.extio.game_engine.renderer.model.options.UiOptions; import de.extio.game_engine.renderer.model.options.VideoOptions; import de.extio.game_engine.renderer.work.RendererWorkingSet; @@ -36,10 +37,12 @@ public class RendererData { private final StorageService storageService; private final RendererWorkingSet rendererWorkingSet; + + private final ModuleManager moduleManager; private RendererLoop rendererLoop; - public RendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final KeycodeRegistry keycodeRegistry, final EventService eventService, final StorageService storageService, final RendererWorkingSet rendererWorkingSet) { + public RendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final KeycodeRegistry keycodeRegistry, final EventService eventService, final StorageService storageService, final RendererWorkingSet rendererWorkingSet, final ModuleManager moduleManager) { this.applicationContext = applicationContext; this.renderer = renderer; this.rendererControl = rendererControl; @@ -48,6 +51,7 @@ public class RendererData { this.eventService = eventService; this.storageService = storageService; this.rendererWorkingSet = rendererWorkingSet; + this.moduleManager = moduleManager; } public ApplicationContext getApplicationContext() { @@ -105,4 +109,8 @@ public class RendererData { public RendererWorkingSet getRendererWorkingSet() { return rendererWorkingSet; } + + public ModuleManager getModuleManager() { + return moduleManager; + } } diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java index 4996f26..1d5fb85 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java @@ -82,6 +82,10 @@ public class G2DRenderer implements Renderer { public void show() { try { LOGGER.info("show()"); + + this.rendererData.getModuleManager().loadModule(G2DRendererModule.class); + this.rendererData.getModuleManager().changeActiveState(G2DRendererModule.class, true); + this.rendererData.getModuleManager().changeDisplayState(G2DRendererModule.class, true); EventQueue.invokeAndWait(() -> { this.rendererData.getRendererControl().applyVideoOptions(); @@ -155,7 +159,7 @@ public class G2DRenderer implements Renderer { this.drawStatistics(); this.rendererData.getRendererWorkingSet().commit(G2DRendererModule.class, true); - this.rendererData.getRendererWorkingSet().getLiveSet(this.renderingBOs); + this.rendererData.getRendererWorkingSet().getLiveSet(this.renderingBOs, clientModuleClass -> this.rendererData.getModuleManager().isDisplayed(clientModuleClass)); this.renderingBOs.sort((bo0, bo1) -> bo0.getLayer().compareTo(bo1.getLayer())); Graphics2D screenGraphics = null; @@ -337,6 +341,6 @@ public class G2DRenderer implements Renderer { this.rendererData = rendererData; } - private static abstract class G2DRendererModule extends AbstractClientModule { + public static class G2DRendererModule extends AbstractClientModule { } } diff --git a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java index aa46492..22af4de 100644 --- a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java +++ b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java @@ -2,6 +2,7 @@ package de.extio.game_engine.renderer.work; import java.util.List; import java.util.Map; +import java.util.function.Predicate; import de.extio.game_engine.module.AbstractClientModule; import de.extio.game_engine.renderer.model.RenderingBo; @@ -20,6 +21,6 @@ public interface RendererWorkingSet { void clear(Class producer); - void getLiveSet(List combinedLiveSet); + void getLiveSet(List combinedLiveSet, Predicate> filter); } diff --git a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java index 2e239c6..adc4287 100644 --- a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java +++ b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java @@ -11,6 +11,7 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Predicate; import de.extio.game_engine.module.AbstractClientModule; import de.extio.game_engine.renderer.model.RenderingBo; @@ -90,8 +91,12 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { } @Override - public void getLiveSet(final List combinedLiveSet) { - this.workingSet.values().forEach(rendererWork -> combinedLiveSet.addAll(rendererWork.live().values())); + public void getLiveSet(final List combinedLiveSet, final Predicate> filter) { + this.workingSet.forEach((producer, rendererWork) -> { + if (filter == null || filter.test(producer)) { + combinedLiveSet.addAll(rendererWork.live().values()); + } + }); } private RendererWork getWorkingSetByProducer(final Class producer) { diff --git a/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java b/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java index 870c97b..32a7e58 100644 --- a/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java +++ b/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java @@ -1,6 +1,7 @@ package de.extio.game_engine.renderer.work; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -78,7 +79,7 @@ public class RendererWorkingSetImplTest { assertTrue(currentUncommitted.isEmpty()); final List live = new ArrayList<>(); - this.workingSet.getLiveSet(live); + this.workingSet.getLiveSet(live, null); assertEquals(2, live.size()); assertTrue(live.containsAll(List.of(bo1, bo2))); } @@ -102,13 +103,13 @@ public class RendererWorkingSetImplTest { assertEquals(Map.of("bo1", bo1, "bo2", bo2), currentUncommitted); final List live = new ArrayList<>(); - this.workingSet.getLiveSet(live); + this.workingSet.getLiveSet(live, null); assertEquals(2, live.size()); assertTrue(live.containsAll(List.of(bo1, bo2))); this.workingSet.add(TestModuleA.class, bo3); final List liveAfterAdd = new ArrayList<>(); - this.workingSet.getLiveSet(liveAfterAdd); + this.workingSet.getLiveSet(liveAfterAdd, null); assertEquals(2, liveAfterAdd.size()); assertTrue(liveAfterAdd.containsAll(List.of(bo1, bo2))); } @@ -130,7 +131,7 @@ public class RendererWorkingSetImplTest { this.workingSet.commit(TestModuleB.class, false); final List live = new ArrayList<>(); - this.workingSet.getLiveSet(live); + this.workingSet.getLiveSet(live, null); assertEquals(3, live.size()); assertTrue(live.containsAll(List.of(bo1, bo2, bo3))); } @@ -142,7 +143,7 @@ public class RendererWorkingSetImplTest { assertTrue(returnedUncommitted.isEmpty()); final List live = new ArrayList<>(); - this.workingSet.getLiveSet(live); + this.workingSet.getLiveSet(live, null); assertTrue(live.isEmpty()); } @@ -159,7 +160,7 @@ public class RendererWorkingSetImplTest { // Before clear final List liveBefore = new ArrayList<>(); - this.workingSet.getLiveSet(liveBefore); + this.workingSet.getLiveSet(liveBefore, null); assertTrue(liveBefore.contains(bo1)); assertNotNull(this.workingSet.get(TestModuleA.class, "bo2")); @@ -167,7 +168,7 @@ public class RendererWorkingSetImplTest { // After clear final List liveAfter = new ArrayList<>(); - this.workingSet.getLiveSet(liveAfter); + this.workingSet.getLiveSet(liveAfter, null); assertTrue(liveAfter.isEmpty()); final var uncommittedAfter = this.workingSet.getUncommittedWork(TestModuleA.class); @@ -189,7 +190,7 @@ public class RendererWorkingSetImplTest { this.workingSet.clear(TestModuleC.class); final List live = new ArrayList<>(); - this.workingSet.getLiveSet(live); + this.workingSet.getLiveSet(live, null); assertEquals(1, live.size()); assertTrue(live.contains(bo1)); } @@ -277,6 +278,34 @@ public class RendererWorkingSetImplTest { assertEquals(1, uncommittedAfter.size()); assertSame(bo1_replacement, uncommittedAfter.get("bo1")); } + + @Test + void getLiveSetFiltersOutNotDisplayedModules() { + final var boA1 = new TestBoA(); + boA1.setId("boA1"); + final var boB1 = new TestBoB(); + boB1.setId("boB1"); + final var boA2 = new TestBoA(); + boA2.setId("boA2"); + + this.workingSet.add(TestModuleA.class, boA1); + this.workingSet.add(TestModuleB.class, boB1); + this.workingSet.add(TestModuleA.class, boA2); + + this.workingSet.commit(TestModuleA.class, false); + this.workingSet.commit(TestModuleB.class, false); + + final List allLive = new ArrayList<>(); + this.workingSet.getLiveSet(allLive, null); + assertEquals(3, allLive.size()); + assertTrue(allLive.containsAll(List.of(boA1, boB1, boA2))); + + final List filteredLive = new ArrayList<>(); + this.workingSet.getLiveSet(filteredLive, TestModuleA.class::equals); + assertEquals(2, filteredLive.size()); + assertTrue(filteredLive.containsAll(List.of(boA1, boA2))); + assertFalse(filteredLive.contains(boB1)); + } private static abstract class TestBoBase implements RenderingBo {