diff --git a/src/main/java/be/seeseemelk/diceos/Bootloader.java b/src/main/java/be/seeseemelk/diceos/Bootloader.java index ff4f822..3c365fe 100644 --- a/src/main/java/be/seeseemelk/diceos/Bootloader.java +++ b/src/main/java/be/seeseemelk/diceos/Bootloader.java @@ -1,5 +1,6 @@ package be.seeseemelk.diceos; +import be.seeseemelk.diceos.system.DiceOS; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import com.badlogic.gdx.graphics.glutils.HdpiMode; diff --git a/src/main/java/be/seeseemelk/diceos/system/CursorService.java b/src/main/java/be/seeseemelk/diceos/system/CursorService.java new file mode 100644 index 0000000..b957c5b --- /dev/null +++ b/src/main/java/be/seeseemelk/diceos/system/CursorService.java @@ -0,0 +1,43 @@ +package be.seeseemelk.diceos.system; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Cursor; +import com.badlogic.gdx.graphics.Pixmap; +import io.avaje.inject.Component; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +public class CursorService { + private int cursorScale = 1; + private Cursor currentCursor; + + void setScale(int scale) { + if (cursorScale != scale) { + cursorScale = scale; + if (currentCursor != null) { + currentCursor.dispose(); + currentCursor = null; + } + } + } + + void updateCursor() { + if (currentCursor != null) { + return; + } + + var original = new Pixmap(Gdx.files.internal("cursor.png")); + + var scaled = new Pixmap(original.getWidth() * cursorScale, original.getHeight() * cursorScale, original.getFormat()); + scaled.setFilter(Pixmap.Filter.NearestNeighbour); + scaled.drawPixmap(original, 0, 0, original.getWidth(), original.getHeight(), + 0, 0, scaled.getWidth(), scaled.getHeight()); + + currentCursor = Gdx.graphics.newCursor(scaled, 0, 0); + Gdx.graphics.setCursor(currentCursor); + + original.dispose(); + scaled.dispose(); + } +} diff --git a/src/main/java/be/seeseemelk/diceos/DiceOS.java b/src/main/java/be/seeseemelk/diceos/system/DiceOS.java similarity index 82% rename from src/main/java/be/seeseemelk/diceos/DiceOS.java rename to src/main/java/be/seeseemelk/diceos/system/DiceOS.java index 0b7c2e5..a52892d 100644 --- a/src/main/java/be/seeseemelk/diceos/DiceOS.java +++ b/src/main/java/be/seeseemelk/diceos/system/DiceOS.java @@ -1,11 +1,7 @@ -package be.seeseemelk.diceos; +package be.seeseemelk.diceos.system; -import be.seeseemelk.diceos.system.DisplayService; -import be.seeseemelk.diceos.system.OnStartup; import com.badlogic.gdx.ApplicationAdapter; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.NinePatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; @@ -23,6 +19,7 @@ import java.util.List; @RequiredArgsConstructor public class DiceOS extends ApplicationAdapter { private final DisplayService display; + private final CursorService cursorService; private final List startupTasks; private Texture background; private Texture clouds; @@ -41,7 +38,6 @@ public class DiceOS extends ApplicationAdapter { clouds = new Texture("src/main/resources/clouds.png"); border = new Texture("src/main/resources/border.png"); loadMenubar(); - loadCursor(); screenViewport = new ScreenViewport(); vmViewport = new ScreenViewport(); @@ -60,19 +56,6 @@ public class DiceOS extends ApplicationAdapter { menubar = new NinePatch(texture, 9, 9, 15, 1); } - private void loadCursor() { - var pixmap = new Pixmap(Gdx.files.internal("cursor.png")); - - var scaled = new Pixmap(pixmap.getWidth() * scaling, pixmap.getHeight() * scaling, pixmap.getFormat()); - scaled.setFilter(Pixmap.Filter.NearestNeighbour); - scaled.drawPixmap(pixmap, 0, 0, pixmap.getWidth(), pixmap.getHeight(), - 0, 0, scaled.getWidth(), scaled.getHeight()); - - var cursor = Gdx.graphics.newCursor(scaled, 0, 0); - Gdx.graphics.setCursor(cursor); - pixmap.dispose(); - } - @Override public void resize(int width, int height) { screenViewport.update(width, height, true); @@ -82,11 +65,14 @@ public class DiceOS extends ApplicationAdapter { scaling = Math.min(width / displayWidth, height / displayHeight); offsetX = (width - (displayWidth * scaling)) / 2; offsetY = (height - (displayHeight * scaling)) / 2; + + cursorService.setScale(scaling); } @Override public void render() { - loadCursor(); // Dispose the old cursor first + cursorService.updateCursor(); + ScreenUtils.clear(Color.BLACK); vmViewport.apply(); display.getScreenBuffer().begin(); diff --git a/src/main/java/be/seeseemelk/diceos/system/DisplayService.java b/src/main/java/be/seeseemelk/diceos/system/DisplayService.java index e2e4291..fddb670 100644 --- a/src/main/java/be/seeseemelk/diceos/system/DisplayService.java +++ b/src/main/java/be/seeseemelk/diceos/system/DisplayService.java @@ -18,7 +18,6 @@ public class DisplayService implements OnStartup { private FrameBuffer screenBuffer; @Getter private SpriteBatch batch; -// private final GraphicsFactory graphicsFactory; @Override public void onStartup() { diff --git a/src/main/java/be/seeseemelk/diceos/system/utils/Disposer.java b/src/main/java/be/seeseemelk/diceos/system/utils/Disposer.java new file mode 100644 index 0000000..c5922e9 --- /dev/null +++ b/src/main/java/be/seeseemelk/diceos/system/utils/Disposer.java @@ -0,0 +1,20 @@ +package be.seeseemelk.diceos.system.utils; + +import com.badlogic.gdx.utils.Disposable; +import lombok.RequiredArgsConstructor; + +import java.io.Closeable; + +@RequiredArgsConstructor +public class Disposer implements Closeable { + private final T disposable; + + public T get() { + return disposable; + } + + @Override + public void close() { + disposable.dispose(); + } +} diff --git a/src/main/java/be/seeseemelk/diceos/system/utils/Utils.java b/src/main/java/be/seeseemelk/diceos/system/utils/Utils.java new file mode 100644 index 0000000..bfebb08 --- /dev/null +++ b/src/main/java/be/seeseemelk/diceos/system/utils/Utils.java @@ -0,0 +1,9 @@ +package be.seeseemelk.diceos.system.utils; + +import com.badlogic.gdx.utils.Disposable; + +public class Utils { + public static Disposer disposing(T disposable) { + return new Disposer<>(disposable); + } +}