diff --git a/src/main/java/be/seeseemelk/diceos/system/DiceOS.java b/src/main/java/be/seeseemelk/diceos/system/DiceOS.java index 6961862..64d204a 100644 --- a/src/main/java/be/seeseemelk/diceos/system/DiceOS.java +++ b/src/main/java/be/seeseemelk/diceos/system/DiceOS.java @@ -66,7 +66,7 @@ public class DiceOS extends ApplicationAdapter { cursorService.setScale(scaling); - gc = new GraphicsContext(display.getBatch(), displayHeight, displayWidth); + gc = new GraphicsContext(screenViewport.getCamera(), display.getBatch(), displayHeight, displayWidth); } @Override @@ -84,7 +84,7 @@ public class DiceOS extends ApplicationAdapter { // Render background gc.draw(clouds, 0, 0); - windowService.paint(gc); + gc.scissor(0, 0, gc.getWidth(), gc.getHeight(), windowService::paint); // Render borders var param = new GraphicsContext.Parameters(); diff --git a/src/main/java/be/seeseemelk/diceos/system/WindowService.java b/src/main/java/be/seeseemelk/diceos/system/WindowService.java index cb8ae0c..36c92b5 100644 --- a/src/main/java/be/seeseemelk/diceos/system/WindowService.java +++ b/src/main/java/be/seeseemelk/diceos/system/WindowService.java @@ -24,6 +24,6 @@ public class WindowService implements OnStartup { void paint(GraphicsContext gc) { // Render menubar - gc.draw(menubar, 0, 0, gc.getWidth(), 13); + gc.draw(menubar, 0, 0, gc.getWidth(), 14); } } diff --git a/src/main/java/be/seeseemelk/diceos/system/gfx/GraphicsContext.java b/src/main/java/be/seeseemelk/diceos/system/gfx/GraphicsContext.java index 6e3a77d..1e33925 100644 --- a/src/main/java/be/seeseemelk/diceos/system/gfx/GraphicsContext.java +++ b/src/main/java/be/seeseemelk/diceos/system/gfx/GraphicsContext.java @@ -1,17 +1,23 @@ package be.seeseemelk.diceos.system.gfx; +import com.badlogic.gdx.graphics.Camera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.scenes.scene2d.utils.ScissorStack; import lombok.Getter; import lombok.RequiredArgsConstructor; +import java.util.function.Consumer; + /** * Graphics context and rendering utilities. */ @Getter @RequiredArgsConstructor public class GraphicsContext { + private final Camera camera; private final Batch batch; private final int height; private final int width; @@ -31,6 +37,18 @@ public class GraphicsContext { params.flipX, params.flipY); } + public void scissor(int x, int y, int width, int height, Consumer callback) { + var scissors = new Rectangle(); + var clipBounds = new Rectangle(x, getHeight() - y - height, width, height); + ScissorStack.calculateScissors(camera, batch.getTransformMatrix(), clipBounds, scissors); + batch.flush(); + if (ScissorStack.pushScissors(scissors)) { + callback.accept(this); + batch.flush(); + ScissorStack.popScissors(); + } + } + public static class Parameters { public final static Parameters DEFAULT = new Parameters(); diff --git a/src/main/java/be/seeseemelk/diceos/system/toolkit/Component.java b/src/main/java/be/seeseemelk/diceos/system/toolkit/Component.java new file mode 100644 index 0000000..f8c2b3c --- /dev/null +++ b/src/main/java/be/seeseemelk/diceos/system/toolkit/Component.java @@ -0,0 +1,7 @@ +package be.seeseemelk.diceos.system.toolkit; + +import be.seeseemelk.diceos.system.gfx.GraphicsContext; + +public abstract class Component { + public abstract void paint(GraphicsContext gc); +} diff --git a/src/main/java/be/seeseemelk/diceos/system/toolkit/Container.java b/src/main/java/be/seeseemelk/diceos/system/toolkit/Container.java new file mode 100644 index 0000000..82e014f --- /dev/null +++ b/src/main/java/be/seeseemelk/diceos/system/toolkit/Container.java @@ -0,0 +1,25 @@ +package be.seeseemelk.diceos.system.toolkit; + +import be.seeseemelk.diceos.system.gfx.GraphicsContext; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Container extends Component { + private final List components = new ArrayList<>(); + + public void addComponent(Component component) { + components.add(component); + } + + public void removeComponent(Component component) { + components.remove(component); + } + + @Override + public void paint(GraphicsContext gc) { + for (Component component : components) { + component.paint(gc); + } + } +} diff --git a/src/main/java/be/seeseemelk/diceos/system/toolkit/Window.java b/src/main/java/be/seeseemelk/diceos/system/toolkit/Window.java new file mode 100644 index 0000000..6b0f619 --- /dev/null +++ b/src/main/java/be/seeseemelk/diceos/system/toolkit/Window.java @@ -0,0 +1,16 @@ +package be.seeseemelk.diceos.system.toolkit; + +import be.seeseemelk.diceos.system.gfx.GraphicsContext; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class Window extends Container { + private String title; + + @Override + public void paint(GraphicsContext gc) { + super.paint(gc); + } +}