feat(renderer): Enhance RendererWorkingSet and related classes to support filtering of displayed modules
This commit is contained in:
@@ -239,7 +239,13 @@ public class ModuleManagerImpl implements InitializingBean, ModuleManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isDisplayed(final Class<? extends AbstractClientModule> clazz) {
|
public boolean isDisplayed(final Class<? extends AbstractClientModule> 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
|
@Override
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import org.springframework.context.annotation.Bean;
|
|||||||
|
|
||||||
import de.extio.game_engine.event.EventService;
|
import de.extio.game_engine.event.EventService;
|
||||||
import de.extio.game_engine.keyboard.KeycodeRegistry;
|
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.model.RenderingBo;
|
||||||
import de.extio.game_engine.renderer.work.RendererWorkingSet;
|
import de.extio.game_engine.renderer.work.RendererWorkingSet;
|
||||||
import de.extio.game_engine.renderer.work.RendererWorkingSetImpl;
|
import de.extio.game_engine.renderer.work.RendererWorkingSetImpl;
|
||||||
@@ -55,9 +56,10 @@ public class RendererAutoConfiguration {
|
|||||||
final KeycodeRegistry keycodeRegistry,
|
final KeycodeRegistry keycodeRegistry,
|
||||||
final EventService eventService,
|
final EventService eventService,
|
||||||
final StorageService storageService,
|
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);
|
renderer.setRendererData(rendererData);
|
||||||
rendererControl.setRendererData(rendererData);
|
rendererControl.setRendererData(rendererData);
|
||||||
renderingBoPool.setRendererData(rendererData);
|
renderingBoPool.setRendererData(rendererData);
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import org.springframework.context.ApplicationContext;
|
|||||||
|
|
||||||
import de.extio.game_engine.event.EventService;
|
import de.extio.game_engine.event.EventService;
|
||||||
import de.extio.game_engine.keyboard.KeycodeRegistry;
|
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.UiOptions;
|
||||||
import de.extio.game_engine.renderer.model.options.VideoOptions;
|
import de.extio.game_engine.renderer.model.options.VideoOptions;
|
||||||
import de.extio.game_engine.renderer.work.RendererWorkingSet;
|
import de.extio.game_engine.renderer.work.RendererWorkingSet;
|
||||||
@@ -36,10 +37,12 @@ public class RendererData {
|
|||||||
private final StorageService storageService;
|
private final StorageService storageService;
|
||||||
|
|
||||||
private final RendererWorkingSet rendererWorkingSet;
|
private final RendererWorkingSet rendererWorkingSet;
|
||||||
|
|
||||||
|
private final ModuleManager moduleManager;
|
||||||
|
|
||||||
private RendererLoop rendererLoop;
|
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.applicationContext = applicationContext;
|
||||||
this.renderer = renderer;
|
this.renderer = renderer;
|
||||||
this.rendererControl = rendererControl;
|
this.rendererControl = rendererControl;
|
||||||
@@ -48,6 +51,7 @@ public class RendererData {
|
|||||||
this.eventService = eventService;
|
this.eventService = eventService;
|
||||||
this.storageService = storageService;
|
this.storageService = storageService;
|
||||||
this.rendererWorkingSet = rendererWorkingSet;
|
this.rendererWorkingSet = rendererWorkingSet;
|
||||||
|
this.moduleManager = moduleManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ApplicationContext getApplicationContext() {
|
public ApplicationContext getApplicationContext() {
|
||||||
@@ -105,4 +109,8 @@ public class RendererData {
|
|||||||
public RendererWorkingSet getRendererWorkingSet() {
|
public RendererWorkingSet getRendererWorkingSet() {
|
||||||
return rendererWorkingSet;
|
return rendererWorkingSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ModuleManager getModuleManager() {
|
||||||
|
return moduleManager;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,6 +82,10 @@ public class G2DRenderer implements Renderer {
|
|||||||
public void show() {
|
public void show() {
|
||||||
try {
|
try {
|
||||||
LOGGER.info("show()");
|
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(() -> {
|
EventQueue.invokeAndWait(() -> {
|
||||||
this.rendererData.getRendererControl().applyVideoOptions();
|
this.rendererData.getRendererControl().applyVideoOptions();
|
||||||
@@ -155,7 +159,7 @@ public class G2DRenderer implements Renderer {
|
|||||||
|
|
||||||
this.drawStatistics();
|
this.drawStatistics();
|
||||||
this.rendererData.getRendererWorkingSet().commit(G2DRendererModule.class, true);
|
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()));
|
this.renderingBOs.sort((bo0, bo1) -> bo0.getLayer().compareTo(bo1.getLayer()));
|
||||||
|
|
||||||
Graphics2D screenGraphics = null;
|
Graphics2D screenGraphics = null;
|
||||||
@@ -337,6 +341,6 @@ public class G2DRenderer implements Renderer {
|
|||||||
this.rendererData = rendererData;
|
this.rendererData = rendererData;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static abstract class G2DRendererModule extends AbstractClientModule {
|
public static class G2DRendererModule extends AbstractClientModule {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package de.extio.game_engine.renderer.work;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
import de.extio.game_engine.module.AbstractClientModule;
|
import de.extio.game_engine.module.AbstractClientModule;
|
||||||
import de.extio.game_engine.renderer.model.RenderingBo;
|
import de.extio.game_engine.renderer.model.RenderingBo;
|
||||||
@@ -20,6 +21,6 @@ public interface RendererWorkingSet {
|
|||||||
|
|
||||||
void clear(Class<? extends AbstractClientModule> producer);
|
void clear(Class<? extends AbstractClientModule> producer);
|
||||||
|
|
||||||
void getLiveSet(List<RenderingBo> combinedLiveSet);
|
void getLiveSet(List<RenderingBo> combinedLiveSet, Predicate<Class<? extends AbstractClientModule>> filter);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import java.util.concurrent.BlockingQueue;
|
|||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
import de.extio.game_engine.module.AbstractClientModule;
|
import de.extio.game_engine.module.AbstractClientModule;
|
||||||
import de.extio.game_engine.renderer.model.RenderingBo;
|
import de.extio.game_engine.renderer.model.RenderingBo;
|
||||||
@@ -90,8 +91,12 @@ public class RendererWorkingSetImpl implements RendererWorkingSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getLiveSet(final List<RenderingBo> combinedLiveSet) {
|
public void getLiveSet(final List<RenderingBo> combinedLiveSet, final Predicate<Class<? extends AbstractClientModule>> filter) {
|
||||||
this.workingSet.values().forEach(rendererWork -> combinedLiveSet.addAll(rendererWork.live().values()));
|
this.workingSet.forEach((producer, rendererWork) -> {
|
||||||
|
if (filter == null || filter.test(producer)) {
|
||||||
|
combinedLiveSet.addAll(rendererWork.live().values());
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private RendererWork getWorkingSetByProducer(final Class<? extends AbstractClientModule> producer) {
|
private RendererWork getWorkingSetByProducer(final Class<? extends AbstractClientModule> producer) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package de.extio.game_engine.renderer.work;
|
package de.extio.game_engine.renderer.work;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
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.assertNotNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
@@ -78,7 +79,7 @@ public class RendererWorkingSetImplTest {
|
|||||||
assertTrue(currentUncommitted.isEmpty());
|
assertTrue(currentUncommitted.isEmpty());
|
||||||
|
|
||||||
final List<RenderingBo> live = new ArrayList<>();
|
final List<RenderingBo> live = new ArrayList<>();
|
||||||
this.workingSet.getLiveSet(live);
|
this.workingSet.getLiveSet(live, null);
|
||||||
assertEquals(2, live.size());
|
assertEquals(2, live.size());
|
||||||
assertTrue(live.containsAll(List.of(bo1, bo2)));
|
assertTrue(live.containsAll(List.of(bo1, bo2)));
|
||||||
}
|
}
|
||||||
@@ -102,13 +103,13 @@ public class RendererWorkingSetImplTest {
|
|||||||
assertEquals(Map.of("bo1", bo1, "bo2", bo2), currentUncommitted);
|
assertEquals(Map.of("bo1", bo1, "bo2", bo2), currentUncommitted);
|
||||||
|
|
||||||
final List<RenderingBo> live = new ArrayList<>();
|
final List<RenderingBo> live = new ArrayList<>();
|
||||||
this.workingSet.getLiveSet(live);
|
this.workingSet.getLiveSet(live, null);
|
||||||
assertEquals(2, live.size());
|
assertEquals(2, live.size());
|
||||||
assertTrue(live.containsAll(List.of(bo1, bo2)));
|
assertTrue(live.containsAll(List.of(bo1, bo2)));
|
||||||
|
|
||||||
this.workingSet.add(TestModuleA.class, bo3);
|
this.workingSet.add(TestModuleA.class, bo3);
|
||||||
final List<RenderingBo> liveAfterAdd = new ArrayList<>();
|
final List<RenderingBo> liveAfterAdd = new ArrayList<>();
|
||||||
this.workingSet.getLiveSet(liveAfterAdd);
|
this.workingSet.getLiveSet(liveAfterAdd, null);
|
||||||
assertEquals(2, liveAfterAdd.size());
|
assertEquals(2, liveAfterAdd.size());
|
||||||
assertTrue(liveAfterAdd.containsAll(List.of(bo1, bo2)));
|
assertTrue(liveAfterAdd.containsAll(List.of(bo1, bo2)));
|
||||||
}
|
}
|
||||||
@@ -130,7 +131,7 @@ public class RendererWorkingSetImplTest {
|
|||||||
this.workingSet.commit(TestModuleB.class, false);
|
this.workingSet.commit(TestModuleB.class, false);
|
||||||
|
|
||||||
final List<RenderingBo> live = new ArrayList<>();
|
final List<RenderingBo> live = new ArrayList<>();
|
||||||
this.workingSet.getLiveSet(live);
|
this.workingSet.getLiveSet(live, null);
|
||||||
assertEquals(3, live.size());
|
assertEquals(3, live.size());
|
||||||
assertTrue(live.containsAll(List.of(bo1, bo2, bo3)));
|
assertTrue(live.containsAll(List.of(bo1, bo2, bo3)));
|
||||||
}
|
}
|
||||||
@@ -142,7 +143,7 @@ public class RendererWorkingSetImplTest {
|
|||||||
assertTrue(returnedUncommitted.isEmpty());
|
assertTrue(returnedUncommitted.isEmpty());
|
||||||
|
|
||||||
final List<RenderingBo> live = new ArrayList<>();
|
final List<RenderingBo> live = new ArrayList<>();
|
||||||
this.workingSet.getLiveSet(live);
|
this.workingSet.getLiveSet(live, null);
|
||||||
assertTrue(live.isEmpty());
|
assertTrue(live.isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +160,7 @@ public class RendererWorkingSetImplTest {
|
|||||||
|
|
||||||
// Before clear
|
// Before clear
|
||||||
final List<RenderingBo> liveBefore = new ArrayList<>();
|
final List<RenderingBo> liveBefore = new ArrayList<>();
|
||||||
this.workingSet.getLiveSet(liveBefore);
|
this.workingSet.getLiveSet(liveBefore, null);
|
||||||
assertTrue(liveBefore.contains(bo1));
|
assertTrue(liveBefore.contains(bo1));
|
||||||
assertNotNull(this.workingSet.get(TestModuleA.class, "bo2"));
|
assertNotNull(this.workingSet.get(TestModuleA.class, "bo2"));
|
||||||
|
|
||||||
@@ -167,7 +168,7 @@ public class RendererWorkingSetImplTest {
|
|||||||
|
|
||||||
// After clear
|
// After clear
|
||||||
final List<RenderingBo> liveAfter = new ArrayList<>();
|
final List<RenderingBo> liveAfter = new ArrayList<>();
|
||||||
this.workingSet.getLiveSet(liveAfter);
|
this.workingSet.getLiveSet(liveAfter, null);
|
||||||
assertTrue(liveAfter.isEmpty());
|
assertTrue(liveAfter.isEmpty());
|
||||||
|
|
||||||
final var uncommittedAfter = this.workingSet.getUncommittedWork(TestModuleA.class);
|
final var uncommittedAfter = this.workingSet.getUncommittedWork(TestModuleA.class);
|
||||||
@@ -189,7 +190,7 @@ public class RendererWorkingSetImplTest {
|
|||||||
this.workingSet.clear(TestModuleC.class);
|
this.workingSet.clear(TestModuleC.class);
|
||||||
|
|
||||||
final List<RenderingBo> live = new ArrayList<>();
|
final List<RenderingBo> live = new ArrayList<>();
|
||||||
this.workingSet.getLiveSet(live);
|
this.workingSet.getLiveSet(live, null);
|
||||||
assertEquals(1, live.size());
|
assertEquals(1, live.size());
|
||||||
assertTrue(live.contains(bo1));
|
assertTrue(live.contains(bo1));
|
||||||
}
|
}
|
||||||
@@ -277,6 +278,34 @@ public class RendererWorkingSetImplTest {
|
|||||||
assertEquals(1, uncommittedAfter.size());
|
assertEquals(1, uncommittedAfter.size());
|
||||||
assertSame(bo1_replacement, uncommittedAfter.get("bo1"));
|
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<RenderingBo> allLive = new ArrayList<>();
|
||||||
|
this.workingSet.getLiveSet(allLive, null);
|
||||||
|
assertEquals(3, allLive.size());
|
||||||
|
assertTrue(allLive.containsAll(List.of(boA1, boB1, boA2)));
|
||||||
|
|
||||||
|
final List<RenderingBo> 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 {
|
private static abstract class TestBoBase implements RenderingBo {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user