feat(renderer): Implement Container and Window classes for modular rendering

This commit is contained in:
extio-de
2025-12-25 17:06:15 +01:00
parent 4648c1241b
commit 598a4beda8
2 changed files with 156 additions and 0 deletions

View File

@@ -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;
}
}

View File

@@ -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();
}
}