Refactor viewport handling in DiceOS for improved scaling and rendering

This commit is contained in:
2025-12-16 10:01:02 +01:00
parent 20eb1e8979
commit 380922fb18
2 changed files with 29 additions and 6 deletions

View File

@@ -6,7 +6,7 @@ import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.utils.ScreenUtils; import com.badlogic.gdx.utils.ScreenUtils;
import com.badlogic.gdx.utils.viewport.FillViewport; import com.badlogic.gdx.utils.viewport.ScreenViewport;
import com.badlogic.gdx.utils.viewport.Viewport; import com.badlogic.gdx.utils.viewport.Viewport;
import io.avaje.inject.Component; import io.avaje.inject.Component;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -22,14 +22,22 @@ public class DiceOS extends ApplicationAdapter {
private final List<OnStartup> startupTasks; private final List<OnStartup> startupTasks;
private Texture background; private Texture background;
private Texture border; private Texture border;
private Viewport viewport; private Viewport vmViewport;
private Viewport screenViewport;
private int stretchFactor = 1;
private int offsetX = 0;
private int offsetY = 0;
@Override @Override
public void create() { public void create() {
log.info("DiceOS starting..."); log.info("DiceOS starting...");
background = new Texture("src/main/resources/background.png"); background = new Texture("src/main/resources/background.png");
border = new Texture("src/main/resources/border.png"); border = new Texture("src/main/resources/border.png");
viewport = new FillViewport(2, 2);
screenViewport = new ScreenViewport();
vmViewport = new ScreenViewport();
vmViewport.update(display.getWidth(), display.getHeight(), true);
for (var task : startupTasks) { for (var task : startupTasks) {
task.onStartup(); task.onStartup();
@@ -38,11 +46,23 @@ public class DiceOS extends ApplicationAdapter {
log.info("DiceOS started!"); log.info("DiceOS started!");
} }
@Override
public void resize(int width, int height) {
screenViewport.update(width, height, true);
int displayWidth = display.getWidth();
int displayHeight = display.getHeight();
stretchFactor = Math.min(width / displayWidth, height / displayHeight);
offsetX = (width - (displayWidth * stretchFactor)) / 2;
offsetY = (height - (displayHeight * stretchFactor)) / 2;
}
@Override @Override
public void render() { public void render() {
ScreenUtils.clear(Color.BLACK);
vmViewport.apply();
display.getScreenBuffer().begin(); display.getScreenBuffer().begin();
viewport.apply(); display.getBatch().setProjectionMatrix(vmViewport.getCamera().combined);
display.getBatch().setProjectionMatrix(viewport.getCamera().combined);
display.getBatch().begin(); display.getBatch().begin();
ScreenUtils.clear(Color.GREEN); ScreenUtils.clear(Color.GREEN);
@@ -65,9 +85,11 @@ public class DiceOS extends ApplicationAdapter {
display.getBatch().end(); display.getBatch().end();
display.getScreenBuffer().end(); display.getScreenBuffer().end();
screenViewport.apply();
display.getBatch().setProjectionMatrix(screenViewport.getCamera().combined);
display.getBatch().begin(); display.getBatch().begin();
display.getBatch().draw(display.getScreenBuffer().getColorBufferTexture(), display.getBatch().draw(display.getScreenBuffer().getColorBufferTexture(),
0, 0); offsetX, offsetY, display.getWidth() * stretchFactor, display.getHeight() * stretchFactor);
display.getBatch().end(); display.getBatch().end();
} }
} }

View File

@@ -22,6 +22,7 @@ public class DisplayService implements OnStartup {
@Override @Override
public void onStartup() { public void onStartup() {
screenBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, getWidth(), getHeight(), false); screenBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, getWidth(), getHeight(), false);
screenBuffer.getColorBufferTexture().setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest);
batch = new SpriteBatch(); batch = new SpriteBatch();
} }