Refactor viewport handling in DiceOS for improved scaling and rendering
This commit is contained in:
@@ -6,7 +6,7 @@ import com.badlogic.gdx.ApplicationAdapter;
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.Texture;
|
||||
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 io.avaje.inject.Component;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -22,14 +22,22 @@ public class DiceOS extends ApplicationAdapter {
|
||||
private final List<OnStartup> startupTasks;
|
||||
private Texture background;
|
||||
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
|
||||
public void create() {
|
||||
log.info("DiceOS starting...");
|
||||
background = new Texture("src/main/resources/background.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) {
|
||||
task.onStartup();
|
||||
@@ -38,11 +46,23 @@ public class DiceOS extends ApplicationAdapter {
|
||||
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
|
||||
public void render() {
|
||||
ScreenUtils.clear(Color.BLACK);
|
||||
vmViewport.apply();
|
||||
display.getScreenBuffer().begin();
|
||||
viewport.apply();
|
||||
display.getBatch().setProjectionMatrix(viewport.getCamera().combined);
|
||||
display.getBatch().setProjectionMatrix(vmViewport.getCamera().combined);
|
||||
display.getBatch().begin();
|
||||
|
||||
ScreenUtils.clear(Color.GREEN);
|
||||
@@ -65,9 +85,11 @@ public class DiceOS extends ApplicationAdapter {
|
||||
display.getBatch().end();
|
||||
display.getScreenBuffer().end();
|
||||
|
||||
screenViewport.apply();
|
||||
display.getBatch().setProjectionMatrix(screenViewport.getCamera().combined);
|
||||
display.getBatch().begin();
|
||||
display.getBatch().draw(display.getScreenBuffer().getColorBufferTexture(),
|
||||
0, 0);
|
||||
offsetX, offsetY, display.getWidth() * stretchFactor, display.getHeight() * stretchFactor);
|
||||
display.getBatch().end();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ public class DisplayService implements OnStartup {
|
||||
@Override
|
||||
public void onStartup() {
|
||||
screenBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, getWidth(), getHeight(), false);
|
||||
screenBuffer.getColorBufferTexture().setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest);
|
||||
batch = new SpriteBatch();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user