From 598a4beda8f5d23b41243a63f40f652bbfcdd8ac Mon Sep 17 00:00:00 2001 From: extio-de Date: Thu, 25 Dec 2025 17:06:15 +0100 Subject: [PATCH] feat(renderer): Implement Container and Window classes for modular rendering --- .../renderer/container/Container.java | 113 ++++++++++++++++++ .../renderer/container/Window.java | 43 +++++++ 2 files changed, 156 insertions(+) create mode 100644 src/main/java/de/extio/game_engine/renderer/container/Container.java create mode 100644 src/main/java/de/extio/game_engine/renderer/container/Window.java diff --git a/src/main/java/de/extio/game_engine/renderer/container/Container.java b/src/main/java/de/extio/game_engine/renderer/container/Container.java new file mode 100644 index 0000000..d0638c6 --- /dev/null +++ b/src/main/java/de/extio/game_engine/renderer/container/Container.java @@ -0,0 +1,113 @@ +package de.extio.game_engine.renderer.container; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import de.extio.game_engine.event.EventService; +import de.extio.game_engine.module.AbstractClientModule; +import de.extio.game_engine.module.ModuleService; +import de.extio.game_engine.renderer.RendererControl; +import de.extio.game_engine.renderer.model.event.ViewportResizeEvent; +import de.extio.game_engine.renderer.work.RendererWorkingSet; +import de.extio.game_engine.renderer.work.RenderingBoPool; +import de.extio.game_engine.spatial2.model.Area2; +import de.extio.game_engine.spatial2.model.CoordI2; +import de.extio.game_engine.spatial2.model.MutableCoordI2; + +@Component +@Scope("prototype") +public class Container extends AbstractClientModule implements InitializingBean { + + protected final ModuleService moduleService; + + protected final RenderingBoPool renderingBoPool; + + protected final RendererControl rendererControl; + + protected final RendererWorkingSet rendererWorkingSet; + + protected final EventService eventService; + + protected final Area2 area = new Area2(MutableCoordI2.create(), MutableCoordI2.create()); + + protected final Area2 normalizedArea = new Area2(MutableCoordI2.create(), MutableCoordI2.create()); + + protected boolean draggable; + + protected boolean dragging; + + public Container(final ModuleService moduleService, final RenderingBoPool renderingBoPool, final RendererControl rendererControl, final EventService eventService, final RendererWorkingSet rendererWorkingSet) { + this.moduleService = moduleService; + this.renderingBoPool = renderingBoPool; + this.rendererControl = rendererControl; + this.eventService = eventService; + this.rendererWorkingSet = rendererWorkingSet; + + } + + @Override + public void afterPropertiesSet() throws Exception { + this.moduleService.loadModule(this); + } + + @Override + public void onActivate() { + this.eventService.register(ViewportResizeEvent.class, this.id, this::onViewportResize); + this.onViewportResize(null); + } + + @Override + public void onShow() { + this.draw(); + } + + @Override + public void onDeactivate() { + this.eventService.unregister(ViewportResizeEvent.class, this.id); + } + + protected void onViewportResize(final ViewportResizeEvent event) { + this.setPosition(this.normalizedArea.getPosition()); + this.setDimension(this.normalizedArea.getDimension()); + this.draw(); + } + + protected void draw() { + // Override in subclasses, but make sure to call super.draw() at the end if overridden + this.rendererWorkingSet.commit(this.id, true); + } + + public void setPosition(final CoordI2 normalizedPosition) { + this.normalizedArea.getPosition().setXY(normalizedPosition); + this.area.getPosition().setXY( + (int) (normalizedPosition.getX() * ((double) this.rendererControl.getEffectiveViewportDimension().getX() / RendererControl.REFERENCE_RESOLUTION.getX())), + (int) (normalizedPosition.getY() * ((double) this.rendererControl.getEffectiveViewportDimension().getY() / RendererControl.REFERENCE_RESOLUTION.getY()))); + this.draw(); + this.LOGGER.debug("Effective viewport dimension: {}", this.rendererControl.getEffectiveViewportDimension()); + } + + public CoordI2 getPosition() { + return this.normalizedArea.getPosition().toImmutableCoordI2(); + } + + public void setDimension(final CoordI2 normalizedDimension) { + this.normalizedArea.getDimension().setXY(normalizedDimension); + this.area.getDimension().setXY( + (int) (normalizedDimension.getX() * ((double) this.rendererControl.getEffectiveViewportDimension().getX() / RendererControl.REFERENCE_RESOLUTION.getX())), + (int) (normalizedDimension.getY() * ((double) this.rendererControl.getEffectiveViewportDimension().getY() / RendererControl.REFERENCE_RESOLUTION.getY()))); + this.draw(); + } + + public CoordI2 getDimension() { + return this.normalizedArea.getDimension().toImmutableCoordI2(); + } + + public boolean isDraggable() { + return draggable; + } + + public void setDraggable(final boolean draggable) { + this.draggable = draggable; + } +} diff --git a/src/main/java/de/extio/game_engine/renderer/container/Window.java b/src/main/java/de/extio/game_engine/renderer/container/Window.java new file mode 100644 index 0000000..15acc8d --- /dev/null +++ b/src/main/java/de/extio/game_engine/renderer/container/Window.java @@ -0,0 +1,43 @@ +package de.extio.game_engine.renderer.container; + +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import de.extio.game_engine.event.EventService; +import de.extio.game_engine.module.ModuleService; +import de.extio.game_engine.renderer.RendererControl; +import de.extio.game_engine.renderer.model.RenderingBoLayer; +import de.extio.game_engine.renderer.model.bo.DrawWindowRenderingBo; +import de.extio.game_engine.renderer.work.RendererWorkingSet; +import de.extio.game_engine.renderer.work.RenderingBoPool; + +@Component +@Scope("prototype") +public class Window extends Container { + + public Window( final ModuleService moduleService, final RenderingBoPool renderingBoPool, final RendererControl rendererControl, final EventService eventService, final RendererWorkingSet rendererWorkingSet) { + super(moduleService, renderingBoPool, rendererControl, eventService, rendererWorkingSet); + } + + @Override + protected void draw() { + if (this.area.getDimension().getX() <= 0 || this.area.getDimension().getY() <= 0) { + return; + } + if (this.area.getPosition().getX() + this.area.getDimension().getX() < 0 || this.area.getPosition().getY() + this.area.getDimension().getY() < 0) { + return; + } + if (this.area.getPosition().getX() > this.rendererControl.getAbsoluteViewportDimension().getX() || this.area.getPosition().getY() > this.rendererControl.getAbsoluteViewportDimension().getY()) { + return; + } + + final var windowFrame = this.rendererWorkingSet.getOrAcquire(this.id, "windowFrame", DrawWindowRenderingBo.class) + .setThickBorder(true) + .withDimensionAbsolute(this.area.getDimension()) + .withPositionAbsoluteAnchorTopLeft(this.area.getPosition()) + .setLayer(RenderingBoLayer.UI0_BGR); + this.rendererWorkingSet.put(this.id, windowFrame); + + super.draw(); + } +}