From cf05ab1db113ec0cf97c45ad144c9c807bf1d941 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Fri, 21 Oct 2022 18:26:57 +0100 Subject: [PATCH] Store colour support in the Terminal Previously we stored it alongside the terminal. While this makes sense - it's not a property of the terminal itself, it ends up duplicating code in a bunch of places. We now track the colour flag on the terminal itself. This allows us to simplify a couple of things: - The palette now also knows whether it supports colours or not, and so performs greyscale conversion. This means we no longer need to thread a "greyscale" flag throughout terminal rendering. - Remove isColour() getters from a whole load of places (TerminalMethods, ServerTerminal, IComputerEnvironment). --- .../computercraft/client/gui/GuiComputer.java | 6 +- .../computercraft/client/gui/GuiTurtle.java | 5 +- .../client/gui/NoTermComputerScreen.java | 3 +- .../client/gui/widgets/WidgetTerminal.java | 27 +++---- .../client/pocket/PocketComputerData.java | 12 +-- .../client/render/ItemPocketRenderer.java | 2 +- .../render/MonitorTextureBufferShader.java | 4 +- .../client/render/PrintoutRenderer.java | 4 +- .../render/TileEntityMonitorRenderer.java | 6 +- .../text/DirectFixedWidthFontRenderer.java | 32 ++++---- .../render/text/FixedWidthFontRenderer.java | 40 +++++----- .../computercraft/core/apis/TermAPI.java | 6 -- .../computercraft/core/apis/TermMethods.java | 4 +- .../core/computer/ComputerExecutor.java | 5 +- .../core/computer/IComputerEnvironment.java | 2 - .../computercraft/core/terminal/Terminal.java | 63 ++++++++------- .../shared/common/ClientTerminal.java | 13 +--- .../shared/common/ITerminal.java | 15 ---- .../shared/common/ServerTerminal.java | 23 ++---- .../shared/computer/core/ServerComputer.java | 10 +-- .../client/PocketComputerDataMessage.java | 3 +- .../shared/network/client/TerminalState.java | 11 +-- .../network/server/KeyEventServerMessage.java | 1 + .../peripheral/monitor/MonitorPeripheral.java | 6 -- .../peripheral/monitor/TileMonitor.java | 4 +- .../peripheral/printer/TilePrinter.java | 2 +- .../computercraft/shared/util/Palette.java | 45 ++++++----- .../core/ComputerTestDelegate.java | 2 +- .../core/computer/BasicEnvironment.java | 6 -- .../core/computer/ComputerBootstrap.java | 4 +- .../core/computer/FakeComputerManager.java | 2 +- .../core/terminal/TerminalTest.java | 76 +++++++++---------- .../network/client/TerminalStateTest.java | 8 +- 33 files changed, 190 insertions(+), 262 deletions(-) delete mode 100644 src/main/java/dan200/computercraft/shared/common/ITerminal.java diff --git a/src/main/java/dan200/computercraft/client/gui/GuiComputer.java b/src/main/java/dan200/computercraft/client/gui/GuiComputer.java index daff80f65..60193a365 100644 --- a/src/main/java/dan200/computercraft/client/gui/GuiComputer.java +++ b/src/main/java/dan200/computercraft/client/gui/GuiComputer.java @@ -9,7 +9,6 @@ import com.mojang.blaze3d.matrix.MatrixStack; import dan200.computercraft.client.gui.widgets.ComputerSidebar; import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.client.render.ComputerBorderRenderer; -import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.util.text.ITextComponent; @@ -32,10 +31,7 @@ public final class GuiComputer extends Computer @Override protected WidgetTerminal createTerminal() { - return new WidgetTerminal( - getMenu().getFamily() != ComputerFamily.NORMAL, terminalData, input, - leftPos + ComputerSidebar.WIDTH + BORDER, topPos + BORDER - ); + return new WidgetTerminal( terminalData, input, leftPos + ComputerSidebar.WIDTH + BORDER, topPos + BORDER ); } @Override diff --git a/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java b/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java index eec24f88a..344277ad9 100644 --- a/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java +++ b/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java @@ -43,10 +43,7 @@ public class GuiTurtle extends ComputerScreenBase @Override protected WidgetTerminal createTerminal() { - return new WidgetTerminal( - getMenu().getFamily() != ComputerFamily.NORMAL, terminalData, input, - leftPos + BORDER + ComputerSidebar.WIDTH, topPos + BORDER - ); + return new WidgetTerminal( terminalData, input, leftPos + BORDER + ComputerSidebar.WIDTH, topPos + BORDER ); } @Override diff --git a/src/main/java/dan200/computercraft/client/gui/NoTermComputerScreen.java b/src/main/java/dan200/computercraft/client/gui/NoTermComputerScreen.java index 3632914c1..1b83be90c 100644 --- a/src/main/java/dan200/computercraft/client/gui/NoTermComputerScreen.java +++ b/src/main/java/dan200/computercraft/client/gui/NoTermComputerScreen.java @@ -8,7 +8,6 @@ package dan200.computercraft.client.gui; import com.mojang.blaze3d.matrix.MatrixStack; import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.core.terminal.Terminal; -import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.IHasContainer; @@ -56,7 +55,7 @@ public class NoTermComputerScreen extends Scree super.init(); minecraft.keyboardHandler.setSendRepeatsToGui( true ); - terminal = addWidget( new WidgetTerminal( getMenu().getFamily() != ComputerFamily.NORMAL, terminalData, new ClientInputHandler( menu ), 0, 0 ) ); + terminal = addWidget( new WidgetTerminal( terminalData, new ClientInputHandler( menu ), 0, 0 ) ); terminal.visible = false; terminal.active = false; setFocused( terminal ); diff --git a/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java b/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java index a2b1bafae..599fa27ad 100644 --- a/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java +++ b/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java @@ -33,11 +33,9 @@ public class WidgetTerminal extends Widget { private static final float TERMINATE_TIME = 0.5f; - private final boolean isColour; private final @Nonnull Terminal terminal; private final @Nonnull InputHandler computer; - // The positions of the actual terminal private final int innerX; private final int innerY; @@ -54,11 +52,10 @@ public class WidgetTerminal extends Widget private final BitSet keysDown = new BitSet( 256 ); - public WidgetTerminal( boolean isColour, @Nonnull Terminal terminal, @Nonnull InputHandler computer, int x, int y ) + public WidgetTerminal( @Nonnull Terminal terminal, @Nonnull InputHandler computer, int x, int y ) { super( x, y, terminal.getWidth() * FONT_WIDTH + MARGIN * 2, terminal.getHeight() * FONT_HEIGHT + MARGIN * 2, StringTextComponent.EMPTY ); - this.isColour = isColour; this.terminal = terminal; this.computer = computer; @@ -178,7 +175,7 @@ public class WidgetTerminal extends Widget public boolean mouseClicked( double mouseX, double mouseY, int button ) { if( !inTermRegion( mouseX, mouseY ) ) return false; - if( !isColour || button < 0 || button > 2 ) return false; + if( !hasMouseSupport() || button < 0 || button > 2 ) return false; int charX = (int) ((mouseX - innerX) / FONT_WIDTH); int charY = (int) ((mouseY - innerY) / FONT_HEIGHT); @@ -198,7 +195,7 @@ public class WidgetTerminal extends Widget public boolean mouseReleased( double mouseX, double mouseY, int button ) { if( !inTermRegion( mouseX, mouseY ) ) return false; - if( !isColour || button < 0 || button > 2 ) return false; + if( !hasMouseSupport() || button < 0 || button > 2 ) return false; int charX = (int) ((mouseX - innerX) / FONT_WIDTH); int charY = (int) ((mouseY - innerY) / FONT_HEIGHT); @@ -221,7 +218,7 @@ public class WidgetTerminal extends Widget public boolean mouseDragged( double mouseX, double mouseY, int button, double v2, double v3 ) { if( !inTermRegion( mouseX, mouseY ) ) return false; - if( !isColour || button < 0 || button > 2 ) return false; + if( !hasMouseSupport() || button < 0 || button > 2 ) return false; int charX = (int) ((mouseX - innerX) / FONT_WIDTH); int charY = (int) ((mouseY - innerY) / FONT_HEIGHT); @@ -242,7 +239,7 @@ public class WidgetTerminal extends Widget public boolean mouseScrolled( double mouseX, double mouseY, double delta ) { if( !inTermRegion( mouseX, mouseY ) ) return false; - if( !isColour || delta == 0 ) return false; + if( !hasMouseSupport() || delta == 0 ) return false; int charX = (int) ((mouseX - innerX) / FONT_WIDTH); int charY = (int) ((mouseY - innerY) / FONT_HEIGHT); @@ -262,6 +259,11 @@ public class WidgetTerminal extends Widget return active && visible && mouseX >= innerX && mouseY >= innerY && mouseX < innerX + innerWidth && mouseY < innerY + innerHeight; } + private boolean hasMouseSupport() + { + return terminal.isColour(); + } + public void update() { if( terminateTimer >= 0 && terminateTimer < TERMINATE_TIME && (terminateTimer += 0.05f) > TERMINATE_TIME ) @@ -315,14 +317,7 @@ public class WidgetTerminal extends Widget IRenderTypeBuffer.Impl renderer = IRenderTypeBuffer.immediate( Tessellator.getInstance().getBuilder() ); IVertexBuilder buffer = renderer.getBuffer( RenderTypes.TERMINAL_WITH_DEPTH ); - if( terminal != null ) - { - FixedWidthFontRenderer.drawTerminal( matrix, buffer, innerX, innerY, terminal, !isColour, MARGIN, MARGIN, MARGIN, MARGIN ); - } - else - { - FixedWidthFontRenderer.drawEmptyTerminal( matrix, buffer, x, y, width, height ); - } + FixedWidthFontRenderer.drawTerminal( matrix, buffer, innerX, innerY, terminal, MARGIN, MARGIN, MARGIN, MARGIN ); renderer.endBatch(); } diff --git a/src/main/java/dan200/computercraft/client/pocket/PocketComputerData.java b/src/main/java/dan200/computercraft/client/pocket/PocketComputerData.java index 671eb4f15..de188d727 100644 --- a/src/main/java/dan200/computercraft/client/pocket/PocketComputerData.java +++ b/src/main/java/dan200/computercraft/client/pocket/PocketComputerData.java @@ -25,15 +25,13 @@ import javax.annotation.Nonnull; */ public class PocketComputerData { - private boolean isColour; private Terminal terminal; private ComputerState state = ComputerState.OFF; private int lightColour = -1; public PocketComputerData( boolean colour ) { - isColour = colour; - terminal = new Terminal( ComputerCraft.pocketTermWidth, ComputerCraft.pocketTermHeight ); + terminal = new Terminal( ComputerCraft.pocketTermWidth, ComputerCraft.pocketTermHeight, colour ); } public int getLightState() @@ -41,11 +39,6 @@ public class PocketComputerData return state != ComputerState.OFF ? lightColour : -1; } - public boolean isColour() - { - return isColour; - } - @Nonnull public Terminal getTerminal() { @@ -65,8 +58,7 @@ public class PocketComputerData public void setTerminal( TerminalState state ) { - isColour = state.colour; - if( state.width != terminal.getWidth() || state.height != terminal.getHeight() ) + if( state.width != terminal.getWidth() || state.height != terminal.getHeight() || state.colour != terminal.isColour() ) { terminal = state.create(); } diff --git a/src/main/java/dan200/computercraft/client/render/ItemPocketRenderer.java b/src/main/java/dan200/computercraft/client/render/ItemPocketRenderer.java index 74ccdcfa4..d02022b4c 100644 --- a/src/main/java/dan200/computercraft/client/render/ItemPocketRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/ItemPocketRenderer.java @@ -92,7 +92,7 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer FixedWidthFontRenderer.drawTerminal( matrix, bufferSource.getBuffer( RenderTypes.TERMINAL_WITHOUT_DEPTH ), - MARGIN, MARGIN, terminal, !computer.isColour(), MARGIN, MARGIN, MARGIN, MARGIN + MARGIN, MARGIN, terminal, MARGIN, MARGIN, MARGIN, MARGIN ); FixedWidthFontRenderer.drawBlocker( matrix, bufferSource.getBuffer( RenderTypes.TERMINAL_BLOCKER ), diff --git a/src/main/java/dan200/computercraft/client/render/MonitorTextureBufferShader.java b/src/main/java/dan200/computercraft/client/render/MonitorTextureBufferShader.java index 4beb79672..9dbe06b44 100644 --- a/src/main/java/dan200/computercraft/client/render/MonitorTextureBufferShader.java +++ b/src/main/java/dan200/computercraft/client/render/MonitorTextureBufferShader.java @@ -173,14 +173,14 @@ class MonitorTextureBufferShader buffer.limit( pos ); } - public static void setUniformData( ByteBuffer buffer, Terminal terminal, boolean greyscale ) + public static void setUniformData( ByteBuffer buffer, Terminal terminal ) { int pos = 0; Palette palette = terminal.getPalette(); for( int i = 0; i < 16; i++ ) { double[] colour = palette.getColour( i ); - if( greyscale ) + if( !terminal.isColour() ) { float f = FixedWidthFontRenderer.toGreyscale( colour ); buffer.putFloat( pos, f ).putFloat( pos + 4, f ).putFloat( pos + 8, f ); diff --git a/src/main/java/dan200/computercraft/client/render/PrintoutRenderer.java b/src/main/java/dan200/computercraft/client/render/PrintoutRenderer.java index 35da61e8e..354ce7afb 100644 --- a/src/main/java/dan200/computercraft/client/render/PrintoutRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/PrintoutRenderer.java @@ -63,7 +63,7 @@ public final class PrintoutRenderer { FixedWidthFontRenderer.drawString( transform, buffer, x, y + line * FONT_HEIGHT, text[start + line], colours[start + line], - Palette.DEFAULT, false, light + Palette.DEFAULT, light ); } } @@ -76,7 +76,7 @@ public final class PrintoutRenderer FixedWidthFontRenderer.drawString( transform, buffer, x, y + line * FONT_HEIGHT, new TextBuffer( text[start + line] ), new TextBuffer( colours[start + line] ), - Palette.DEFAULT, false, light + Palette.DEFAULT, light ); } } diff --git a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java index 95ff7f502..97dc69502 100644 --- a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java @@ -157,7 +157,7 @@ public class TileEntityMonitorRenderer extends TileEntityRenderer DirectBuffers.setBufferData( GL31.GL_TEXTURE_BUFFER, monitor.tboBuffer, terminalBuffer, GL20.GL_STATIC_DRAW ); ByteBuffer uniformBuffer = getBuffer( MonitorTextureBufferShader.UNIFORM_SIZE ); - MonitorTextureBufferShader.setUniformData( uniformBuffer, terminal, !monitor.isColour() ); + MonitorTextureBufferShader.setUniformData( uniformBuffer, terminal ); DirectBuffers.setBufferData( GL31.GL_UNIFORM_BUFFER, monitor.tboUniform, uniformBuffer, GL20.GL_STATIC_DRAW ); } @@ -197,13 +197,13 @@ public class TileEntityMonitorRenderer extends TileEntityRenderer // Draw the main terminal and store how many vertices it has. DirectFixedWidthFontRenderer.drawTerminalWithoutCursor( - buffer, 0, 0, terminal, !monitor.isColour(), yMargin, yMargin, xMargin, xMargin + buffer, 0, 0, terminal, yMargin, yMargin, xMargin, xMargin ); int termIndexes = buffer.position() / vertexSize; // If the cursor is visible, we append it to the end of our buffer. When rendering, we can either // render n or n+1 quads and so toggle the cursor on and off. - DirectFixedWidthFontRenderer.drawCursor( buffer, 0, 0, terminal, !monitor.isColour() ); + DirectFixedWidthFontRenderer.drawCursor( buffer, 0, 0, terminal ); buffer.flip(); diff --git a/src/main/java/dan200/computercraft/client/render/text/DirectFixedWidthFontRenderer.java b/src/main/java/dan200/computercraft/client/render/text/DirectFixedWidthFontRenderer.java index c528cc951..53d29e699 100644 --- a/src/main/java/dan200/computercraft/client/render/text/DirectFixedWidthFontRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/text/DirectFixedWidthFontRenderer.java @@ -61,25 +61,25 @@ public final class DirectFixedWidthFontRenderer ); } - private static void drawQuad( ByteBuffer emitter, float x, float y, float width, float height, Palette palette, boolean greyscale, char colourIndex ) + private static void drawQuad( ByteBuffer emitter, float x, float y, float width, float height, Palette palette, char colourIndex ) { - byte[] colour = palette.getByteColour( getColour( colourIndex, Colour.BLACK ), greyscale ); + byte[] colour = palette.getRenderColours( getColour( colourIndex, Colour.BLACK ) ); quad( emitter, x, y, x + width, y + height, colour, BACKGROUND_START, BACKGROUND_START, BACKGROUND_END, BACKGROUND_END ); } private static void drawBackground( - @Nonnull ByteBuffer buffer, float x, float y, @Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale, + @Nonnull ByteBuffer buffer, float x, float y, @Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, float leftMarginSize, float rightMarginSize, float height ) { if( leftMarginSize > 0 ) { - drawQuad( buffer, x - leftMarginSize, y, leftMarginSize, height, palette, greyscale, backgroundColour.charAt( 0 ) ); + drawQuad( buffer, x - leftMarginSize, y, leftMarginSize, height, palette, backgroundColour.charAt( 0 ) ); } if( rightMarginSize > 0 ) { - drawQuad( buffer, x + backgroundColour.length() * FONT_WIDTH, y, rightMarginSize, height, palette, greyscale, backgroundColour.charAt( backgroundColour.length() - 1 ) ); + drawQuad( buffer, x + backgroundColour.length() * FONT_WIDTH, y, rightMarginSize, height, palette, backgroundColour.charAt( backgroundColour.length() - 1 ) ); } // Batch together runs of identical background cells. @@ -92,7 +92,7 @@ public final class DirectFixedWidthFontRenderer if( blockColour != '\0' ) { - drawQuad( buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, greyscale, blockColour ); + drawQuad( buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, blockColour ); } blockColour = colourIndex; @@ -101,15 +101,15 @@ public final class DirectFixedWidthFontRenderer if( blockColour != '\0' ) { - drawQuad( buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (backgroundColour.length() - blockStart), height, palette, greyscale, blockColour ); + drawQuad( buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (backgroundColour.length() - blockStart), height, palette, blockColour ); } } - private static void drawString( @Nonnull ByteBuffer buffer, float x, float y, @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nonnull Palette palette, boolean greyscale ) + private static void drawString( @Nonnull ByteBuffer buffer, float x, float y, @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nonnull Palette palette ) { for( int i = 0; i < text.length(); i++ ) { - byte[] colour = palette.getByteColour( getColour( textColour.charAt( i ), Colour.BLACK ), greyscale ); + byte[] colour = palette.getRenderColours( getColour( textColour.charAt( i ), Colour.BLACK ) ); int index = text.charAt( i ); if( index > 255 ) index = '?'; @@ -118,7 +118,7 @@ public final class DirectFixedWidthFontRenderer } public static void drawTerminalWithoutCursor( - @Nonnull ByteBuffer buffer, float x, float y, @Nonnull Terminal terminal, boolean greyscale, + @Nonnull ByteBuffer buffer, float x, float y, @Nonnull Terminal terminal, float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize ) { @@ -127,12 +127,12 @@ public final class DirectFixedWidthFontRenderer // Top and bottom margins drawBackground( - buffer, x, y - topMarginSize, terminal.getBackgroundColourLine( 0 ), palette, greyscale, + buffer, x, y - topMarginSize, terminal.getBackgroundColourLine( 0 ), palette, leftMarginSize, rightMarginSize, topMarginSize ); drawBackground( - buffer, x, y + height * FONT_HEIGHT, terminal.getBackgroundColourLine( height - 1 ), palette, greyscale, + buffer, x, y + height * FONT_HEIGHT, terminal.getBackgroundColourLine( height - 1 ), palette, leftMarginSize, rightMarginSize, bottomMarginSize ); @@ -141,21 +141,21 @@ public final class DirectFixedWidthFontRenderer { float rowY = y + FONT_HEIGHT * i; drawBackground( - buffer, x, rowY, terminal.getBackgroundColourLine( i ), palette, greyscale, + buffer, x, rowY, terminal.getBackgroundColourLine( i ), palette, leftMarginSize, rightMarginSize, FONT_HEIGHT ); drawString( buffer, x, rowY, terminal.getLine( i ), terminal.getTextColourLine( i ), - palette, greyscale + palette ); } } - public static void drawCursor( @Nonnull ByteBuffer buffer, float x, float y, @Nonnull Terminal terminal, boolean greyscale ) + public static void drawCursor( @Nonnull ByteBuffer buffer, float x, float y, @Nonnull Terminal terminal ) { if( isCursorVisible( terminal ) ) { - byte[] colour = terminal.getPalette().getByteColour( 15 - terminal.getTextColour(), greyscale ); + byte[] colour = terminal.getPalette().getRenderColours( 15 - terminal.getTextColour() ); drawChar( buffer, x + terminal.getCursorX() * FONT_WIDTH, y + terminal.getCursorY() * FONT_HEIGHT, '_', colour ); } } diff --git a/src/main/java/dan200/computercraft/client/render/text/FixedWidthFontRenderer.java b/src/main/java/dan200/computercraft/client/render/text/FixedWidthFontRenderer.java index ba978369d..90eb9e449 100644 --- a/src/main/java/dan200/computercraft/client/render/text/FixedWidthFontRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/text/FixedWidthFontRenderer.java @@ -92,26 +92,26 @@ public final class FixedWidthFontRenderer quad( transform, buffer, x, y, x + width, y + height, z, colour, BACKGROUND_START, BACKGROUND_START, BACKGROUND_END, BACKGROUND_END, light ); } - private static void drawQuad( Matrix4f transform, IVertexBuilder buffer, float x, float y, float width, float height, Palette palette, boolean greyscale, char colourIndex, int light ) + private static void drawQuad( Matrix4f transform, IVertexBuilder buffer, float x, float y, float width, float height, Palette palette, char colourIndex, int light ) { - byte[] colour = palette.getByteColour( getColour( colourIndex, Colour.BLACK ), greyscale ); + byte[] colour = palette.getRenderColours( getColour( colourIndex, Colour.BLACK ) ); drawQuad( transform, buffer, x, y, 0, width, height, colour, light ); } private static void drawBackground( @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, - @Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale, + @Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, float leftMarginSize, float rightMarginSize, float height, int light ) { if( leftMarginSize > 0 ) { - drawQuad( transform, buffer, x - leftMarginSize, y, leftMarginSize, height, palette, greyscale, backgroundColour.charAt( 0 ), light ); + drawQuad( transform, buffer, x - leftMarginSize, y, leftMarginSize, height, palette, backgroundColour.charAt( 0 ), light ); } if( rightMarginSize > 0 ) { - drawQuad( transform, buffer, x + backgroundColour.length() * FONT_WIDTH, y, rightMarginSize, height, palette, greyscale, backgroundColour.charAt( backgroundColour.length() - 1 ), light ); + drawQuad( transform, buffer, x + backgroundColour.length() * FONT_WIDTH, y, rightMarginSize, height, palette, backgroundColour.charAt( backgroundColour.length() - 1 ), light ); } // Batch together runs of identical background cells. @@ -124,7 +124,7 @@ public final class FixedWidthFontRenderer if( blockColour != '\0' ) { - drawQuad( transform, buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, greyscale, blockColour, light ); + drawQuad( transform, buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, blockColour, light ); } blockColour = colourIndex; @@ -133,18 +133,18 @@ public final class FixedWidthFontRenderer if( blockColour != '\0' ) { - drawQuad( transform, buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (backgroundColour.length() - blockStart), height, palette, greyscale, blockColour, light ); + drawQuad( transform, buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (backgroundColour.length() - blockStart), height, palette, blockColour, light ); } } public static void drawString( @Nonnull Matrix4f transform, @Nonnull IVertexBuilder renderer, float x, float y, - @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nonnull Palette palette, boolean greyscale, int light + @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nonnull Palette palette, int light ) { for( int i = 0; i < text.length(); i++ ) { - byte[] colour = palette.getByteColour( getColour( textColour.charAt( i ), Colour.BLACK ), greyscale ); + byte[] colour = palette.getRenderColours( getColour( textColour.charAt( i ), Colour.BLACK ) ); int index = text.charAt( i ); if( index > 255 ) index = '?'; @@ -154,7 +154,7 @@ public final class FixedWidthFontRenderer public static void drawTerminalWithoutCursor( @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, - @Nonnull Terminal terminal, boolean greyscale, + @Nonnull Terminal terminal, float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize ) { @@ -164,13 +164,13 @@ public final class FixedWidthFontRenderer // Top and bottom margins drawBackground( transform, buffer, x, y - topMarginSize, - terminal.getBackgroundColourLine( 0 ), palette, greyscale, + terminal.getBackgroundColourLine( 0 ), palette, leftMarginSize, rightMarginSize, topMarginSize, FULL_BRIGHT_LIGHTMAP ); drawBackground( transform, buffer, x, y + height * FONT_HEIGHT, - terminal.getBackgroundColourLine( height - 1 ), palette, greyscale, + terminal.getBackgroundColourLine( height - 1 ), palette, leftMarginSize, rightMarginSize, bottomMarginSize, FULL_BRIGHT_LIGHTMAP ); @@ -180,12 +180,12 @@ public final class FixedWidthFontRenderer float rowY = y + FONT_HEIGHT * i; drawBackground( transform, buffer, x, rowY, terminal.getBackgroundColourLine( i ), - palette, greyscale, leftMarginSize, rightMarginSize, FONT_HEIGHT, FULL_BRIGHT_LIGHTMAP + palette, leftMarginSize, rightMarginSize, FONT_HEIGHT, FULL_BRIGHT_LIGHTMAP ); drawString( transform, buffer, x, rowY, terminal.getLine( i ), terminal.getTextColourLine( i ), - palette, greyscale, FULL_BRIGHT_LIGHTMAP + palette, FULL_BRIGHT_LIGHTMAP ); } } @@ -200,25 +200,23 @@ public final class FixedWidthFontRenderer } public static void drawCursor( - @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, - @Nonnull Terminal terminal, boolean greyscale + @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, @Nonnull Terminal terminal ) { if( isCursorVisible( terminal ) && FrameInfo.getGlobalCursorBlink() ) { - byte[] colour = terminal.getPalette().getByteColour( 15 - terminal.getTextColour(), greyscale ); + byte[] colour = terminal.getPalette().getRenderColours( 15 - terminal.getTextColour() ); drawChar( transform, buffer, x + terminal.getCursorX() * FONT_WIDTH, y + terminal.getCursorY() * FONT_HEIGHT, '_', colour, FULL_BRIGHT_LIGHTMAP ); } } public static void drawTerminal( - @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, - @Nonnull Terminal terminal, boolean greyscale, + @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, @Nonnull Terminal terminal, float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize ) { - drawTerminalWithoutCursor( transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize ); - drawCursor( transform, buffer, x, y, terminal, greyscale ); + drawTerminalWithoutCursor( transform, buffer, x, y, terminal, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize ); + drawCursor( transform, buffer, x, y, terminal ); } public static void drawEmptyTerminal( @Nonnull Matrix4f transform, @Nonnull IVertexBuilder renderer, float x, float y, float width, float height ) diff --git a/src/main/java/dan200/computercraft/core/apis/TermAPI.java b/src/main/java/dan200/computercraft/core/apis/TermAPI.java index 716b9ddb4..14646c07f 100644 --- a/src/main/java/dan200/computercraft/core/apis/TermAPI.java +++ b/src/main/java/dan200/computercraft/core/apis/TermAPI.java @@ -69,10 +69,4 @@ public class TermAPI extends TermMethods implements ILuaAPI { return terminal; } - - @Override - public boolean isColour() - { - return environment.isColour(); - } } diff --git a/src/main/java/dan200/computercraft/core/apis/TermMethods.java b/src/main/java/dan200/computercraft/core/apis/TermMethods.java index 5692065a6..4235b8c0e 100644 --- a/src/main/java/dan200/computercraft/core/apis/TermMethods.java +++ b/src/main/java/dan200/computercraft/core/apis/TermMethods.java @@ -37,8 +37,6 @@ public abstract class TermMethods @Nonnull public abstract Terminal getTerminal() throws LuaException; - public abstract boolean isColour() throws LuaException; - /** * Write {@code text} at the current cursor position, moving the cursor to the end of the text. * @@ -258,7 +256,7 @@ public abstract class TermMethods @LuaFunction( { "isColour", "isColor" } ) public final boolean getIsColour() throws LuaException { - return isColour(); + return getTerminal().isColour(); } /** diff --git a/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java b/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java index 331fa096a..bd7e5a81c 100644 --- a/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java +++ b/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java @@ -637,11 +637,10 @@ final class ComputerExecutor private void displayFailure( String message, String extra ) { Terminal terminal = computer.getTerminal(); - boolean colour = computer.getComputerEnvironment().isColour(); terminal.reset(); // Display our primary error message - if( colour ) terminal.setTextColour( 15 - Colour.RED.ordinal() ); + if( terminal.isColour() ) terminal.setTextColour( 15 - Colour.RED.ordinal() ); terminal.write( message ); if( extra != null ) @@ -654,7 +653,7 @@ final class ComputerExecutor // And display our generic "CC may be installed incorrectly" message. terminal.setCursorPos( 0, terminal.getCursorY() + 1 ); - if( colour ) terminal.setTextColour( 15 - Colour.WHITE.ordinal() ); + if( terminal.isColour() ) terminal.setTextColour( 15 - Colour.WHITE.ordinal() ); terminal.write( "ComputerCraft may be installed incorrectly" ); } diff --git a/src/main/java/dan200/computercraft/core/computer/IComputerEnvironment.java b/src/main/java/dan200/computercraft/core/computer/IComputerEnvironment.java index 71fb68ac2..9ca82eb90 100644 --- a/src/main/java/dan200/computercraft/core/computer/IComputerEnvironment.java +++ b/src/main/java/dan200/computercraft/core/computer/IComputerEnvironment.java @@ -18,8 +18,6 @@ public interface IComputerEnvironment double getTimeOfDay(); - boolean isColour(); - long getComputerSpaceLimit(); @Nonnull diff --git a/src/main/java/dan200/computercraft/core/terminal/Terminal.java b/src/main/java/dan200/computercraft/core/terminal/Terminal.java index 45fa8b6b4..bbc31b528 100644 --- a/src/main/java/dan200/computercraft/core/terminal/Terminal.java +++ b/src/main/java/dan200/computercraft/core/terminal/Terminal.java @@ -11,11 +11,16 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.PacketBuffer; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.nio.ByteBuffer; public class Terminal { - private static final String base16 = "0123456789abcdef"; + private static final String BASE_16 = "0123456789abcdef"; + + private int width; + private int height; + private final boolean colour; private int cursorX = 0; private int cursorY = 0; @@ -23,26 +28,25 @@ public class Terminal private int cursorColour = 0; private int cursorBackgroundColour = 15; - private int width; - private int height; - private TextBuffer[] text; private TextBuffer[] textColour; private TextBuffer[] backgroundColour; - private final Palette palette = new Palette(); + private final Palette palette; - private final Runnable onChanged; + private final @Nullable Runnable onChanged; - public Terminal( int width, int height ) + public Terminal( int width, int height, boolean colour ) { - this( width, height, null ); + this( width, height, colour, null ); } - public Terminal( int width, int height, Runnable changedCallback ) + public Terminal( int width, int height, boolean colour, Runnable changedCallback ) { this.width = width; this.height = height; + this.colour = colour; + palette = new Palette( colour ); onChanged = changedCallback; text = new TextBuffer[height]; @@ -51,8 +55,8 @@ public class Terminal for( int i = 0; i < this.height; i++ ) { text[i] = new TextBuffer( ' ', this.width ); - textColour[i] = new TextBuffer( base16.charAt( cursorColour ), this.width ); - backgroundColour[i] = new TextBuffer( base16.charAt( cursorBackgroundColour ), this.width ); + textColour[i] = new TextBuffer( BASE_16.charAt( cursorColour ), this.width ); + backgroundColour[i] = new TextBuffer( BASE_16.charAt( cursorBackgroundColour ), this.width ); } } @@ -78,6 +82,11 @@ public class Terminal return height; } + public boolean isColour() + { + return colour; + } + public synchronized void resize( int width, int height ) { if( width == this.width && height == this.height ) @@ -102,8 +111,8 @@ public class Terminal if( i >= oldHeight ) { text[i] = new TextBuffer( ' ', this.width ); - textColour[i] = new TextBuffer( base16.charAt( cursorColour ), this.width ); - backgroundColour[i] = new TextBuffer( base16.charAt( cursorBackgroundColour ), this.width ); + textColour[i] = new TextBuffer( BASE_16.charAt( cursorColour ), this.width ); + backgroundColour[i] = new TextBuffer( BASE_16.charAt( cursorBackgroundColour ), this.width ); } else if( this.width == oldWidth ) { @@ -114,8 +123,8 @@ public class Terminal else { text[i] = new TextBuffer( ' ', this.width ); - textColour[i] = new TextBuffer( base16.charAt( cursorColour ), this.width ); - backgroundColour[i] = new TextBuffer( base16.charAt( cursorBackgroundColour ), this.width ); + textColour[i] = new TextBuffer( BASE_16.charAt( cursorColour ), this.width ); + backgroundColour[i] = new TextBuffer( BASE_16.charAt( cursorBackgroundColour ), this.width ); text[i].write( oldText[i] ); textColour[i].write( oldTextColour[i] ); backgroundColour[i].write( oldBackgroundColour[i] ); @@ -212,8 +221,8 @@ public class Terminal if( y >= 0 && y < height ) { this.text[y].write( text, x ); - textColour[y].fill( base16.charAt( cursorColour ), x, x + text.length() ); - backgroundColour[y].fill( base16.charAt( cursorBackgroundColour ), x, x + text.length() ); + textColour[y].fill( BASE_16.charAt( cursorColour ), x, x + text.length() ); + backgroundColour[y].fill( BASE_16.charAt( cursorBackgroundColour ), x, x + text.length() ); setChanged(); } } @@ -237,8 +246,8 @@ public class Terminal else { newText[y] = new TextBuffer( ' ', width ); - newTextColour[y] = new TextBuffer( base16.charAt( cursorColour ), width ); - newBackgroundColour[y] = new TextBuffer( base16.charAt( cursorBackgroundColour ), width ); + newTextColour[y] = new TextBuffer( BASE_16.charAt( cursorColour ), width ); + newBackgroundColour[y] = new TextBuffer( BASE_16.charAt( cursorBackgroundColour ), width ); } } text = newText; @@ -253,8 +262,8 @@ public class Terminal for( int y = 0; y < height; y++ ) { text[y].fill( ' ' ); - textColour[y].fill( base16.charAt( cursorColour ) ); - backgroundColour[y].fill( base16.charAt( cursorBackgroundColour ) ); + textColour[y].fill( BASE_16.charAt( cursorColour ) ); + backgroundColour[y].fill( BASE_16.charAt( cursorBackgroundColour ) ); } setChanged(); } @@ -265,8 +274,8 @@ public class Terminal if( y >= 0 && y < height ) { text[y].fill( ' ' ); - textColour[y].fill( base16.charAt( cursorColour ) ); - backgroundColour[y].fill( base16.charAt( cursorBackgroundColour ) ); + textColour[y].fill( BASE_16.charAt( cursorColour ) ); + backgroundColour[y].fill( BASE_16.charAt( cursorBackgroundColour ) ); setChanged(); } } @@ -357,8 +366,8 @@ public class Terminal for( int x = 0; x < width; x++ ) { byte colour = buffer.readByte(); - backColour.setChar( x, base16.charAt( (colour >> 4) & 0xF ) ); - textColour.setChar( x, base16.charAt( colour & 0xF ) ); + backColour.setChar( x, BASE_16.charAt( (colour >> 4) & 0xF ) ); + textColour.setChar( x, BASE_16.charAt( colour & 0xF ) ); } } @@ -399,12 +408,12 @@ public class Terminal { text[n].write( nbt.getString( "term_text_" + n ) ); } - textColour[n].fill( base16.charAt( cursorColour ) ); + textColour[n].fill( BASE_16.charAt( cursorColour ) ); if( nbt.contains( "term_textColour_" + n ) ) { textColour[n].write( nbt.getString( "term_textColour_" + n ) ); } - backgroundColour[n].fill( base16.charAt( cursorBackgroundColour ) ); + backgroundColour[n].fill( BASE_16.charAt( cursorBackgroundColour ) ); if( nbt.contains( "term_textBgColour_" + n ) ) { backgroundColour[n].write( nbt.getString( "term_textBgColour_" + n ) ); diff --git a/src/main/java/dan200/computercraft/shared/common/ClientTerminal.java b/src/main/java/dan200/computercraft/shared/common/ClientTerminal.java index f405048df..6a5f73650 100644 --- a/src/main/java/dan200/computercraft/shared/common/ClientTerminal.java +++ b/src/main/java/dan200/computercraft/shared/common/ClientTerminal.java @@ -8,7 +8,7 @@ package dan200.computercraft.shared.common; import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.shared.network.client.TerminalState; -public class ClientTerminal implements ITerminal +public class ClientTerminal { private boolean colour; private Terminal terminal; @@ -28,20 +28,11 @@ public class ClientTerminal implements ITerminal return changed; } - // ITerminal implementation - - @Override public Terminal getTerminal() { return terminal; } - @Override - public boolean isColour() - { - return colour; - } - public void read( TerminalState state ) { colour = state.colour; @@ -60,7 +51,7 @@ public class ClientTerminal implements ITerminal { if( terminal == null ) { - terminal = new Terminal( width, height, () -> terminalChanged = true ); + terminal = new Terminal( width, height, colour, () -> terminalChanged = true ); terminalChanged = true; } else diff --git a/src/main/java/dan200/computercraft/shared/common/ITerminal.java b/src/main/java/dan200/computercraft/shared/common/ITerminal.java deleted file mode 100644 index 845efce75..000000000 --- a/src/main/java/dan200/computercraft/shared/common/ITerminal.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.shared.common; - -import dan200.computercraft.core.terminal.Terminal; - -public interface ITerminal -{ - Terminal getTerminal(); - - boolean isColour(); -} diff --git a/src/main/java/dan200/computercraft/shared/common/ServerTerminal.java b/src/main/java/dan200/computercraft/shared/common/ServerTerminal.java index f3af43711..84a90c311 100644 --- a/src/main/java/dan200/computercraft/shared/common/ServerTerminal.java +++ b/src/main/java/dan200/computercraft/shared/common/ServerTerminal.java @@ -8,32 +8,26 @@ package dan200.computercraft.shared.common; import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.shared.network.client.TerminalState; +import javax.annotation.Nullable; import java.util.concurrent.atomic.AtomicBoolean; -public class ServerTerminal implements ITerminal +public class ServerTerminal { private final boolean colour; - private Terminal terminal; + private @Nullable Terminal terminal; private final AtomicBoolean terminalChanged = new AtomicBoolean( false ); private boolean terminalChangedLastFrame = false; public ServerTerminal( boolean colour ) { this.colour = colour; - terminal = null; - } - - public ServerTerminal( boolean colour, int terminalWidth, int terminalHeight ) - { - this.colour = colour; - terminal = new Terminal( terminalWidth, terminalHeight, this::markTerminalChanged ); } protected void resize( int width, int height ) { if( terminal == null ) { - terminal = new Terminal( width, height, this::markTerminalChanged ); + terminal = new Terminal( width, height, colour, this::markTerminalChanged ); markTerminalChanged(); } else @@ -66,20 +60,13 @@ public class ServerTerminal implements ITerminal return terminalChangedLastFrame; } - @Override public Terminal getTerminal() { return terminal; } - @Override - public boolean isColour() - { - return colour; - } - public TerminalState write() { - return new TerminalState( colour, terminal ); + return new TerminalState( terminal ); } } diff --git a/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java b/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java index 772b65f7c..0aef4d356 100644 --- a/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java @@ -56,18 +56,12 @@ public class ServerComputer implements InputHandler, IComputerEnvironment this.family = family; instanceID = ServerComputerRegistry.INSTANCE.getUnusedInstanceID(); - terminal = new Terminal( terminalWidth, terminalHeight, this::markTerminalChanged ); + terminal = new Terminal( terminalWidth, terminalHeight, family != ComputerFamily.NORMAL, this::markTerminalChanged ); computer = new Computer( this, terminal, computerID ); computer.setLabel( label ); } - @Override - public boolean isColour() - { - return family != ComputerFamily.NORMAL; - } - public ComputerFamily getFamily() { return family; @@ -126,7 +120,7 @@ public class ServerComputer implements InputHandler, IComputerEnvironment public TerminalState getTerminalState() { - return new TerminalState( isColour(), terminal ); + return new TerminalState( terminal ); } public void keepAlive() diff --git a/src/main/java/dan200/computercraft/shared/network/client/PocketComputerDataMessage.java b/src/main/java/dan200/computercraft/shared/network/client/PocketComputerDataMessage.java index a4f476d5b..7794ff71b 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/PocketComputerDataMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/PocketComputerDataMessage.java @@ -7,6 +7,7 @@ package dan200.computercraft.shared.network.client; import dan200.computercraft.client.pocket.ClientPocketComputers; import dan200.computercraft.client.pocket.PocketComputerData; +import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.shared.computer.core.ComputerState; import dan200.computercraft.shared.network.NetworkMessage; import dan200.computercraft.shared.pocket.core.PocketServerComputer; @@ -28,7 +29,7 @@ public class PocketComputerDataMessage implements NetworkMessage instanceId = computer.getInstanceID(); state = computer.getState(); lightState = computer.getLight(); - terminal = sendTerminal ? computer.getTerminalState() : new TerminalState( false, null ); + terminal = sendTerminal ? computer.getTerminalState() : new TerminalState( (Terminal) null ); } public PocketComputerDataMessage( PacketBuffer buf ) diff --git a/src/main/java/dan200/computercraft/shared/network/client/TerminalState.java b/src/main/java/dan200/computercraft/shared/network/client/TerminalState.java index 9a0a5f413..39b87d240 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/TerminalState.java +++ b/src/main/java/dan200/computercraft/shared/network/client/TerminalState.java @@ -42,23 +42,24 @@ public class TerminalState private ByteBuf compressed; - public TerminalState( boolean colour, @Nullable Terminal terminal ) + public TerminalState( @Nullable Terminal terminal ) { - this( colour, terminal, true ); + this( terminal, true ); } - public TerminalState( boolean colour, @Nullable Terminal terminal, boolean compress ) + public TerminalState( @Nullable Terminal terminal, boolean compress ) { - this.colour = colour; this.compress = compress; if( terminal == null ) { + colour = false; width = height = 0; buffer = null; } else { + colour = terminal.isColour(); width = terminal.getWidth(); height = terminal.getHeight(); @@ -123,7 +124,7 @@ public class TerminalState public Terminal create() { if( buffer == null ) throw new NullPointerException( "Terminal does not exist" ); - Terminal terminal = new Terminal( width, height ); + Terminal terminal = new Terminal( width, height, colour ); terminal.read( new PacketBuffer( buffer ) ); return terminal; } diff --git a/src/main/java/dan200/computercraft/shared/network/server/KeyEventServerMessage.java b/src/main/java/dan200/computercraft/shared/network/server/KeyEventServerMessage.java index 50d835587..d3dedd2cf 100644 --- a/src/main/java/dan200/computercraft/shared/network/server/KeyEventServerMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/server/KeyEventServerMessage.java @@ -39,6 +39,7 @@ public class KeyEventServerMessage extends ComputerServerMessage @Override public void toBytes( @Nonnull PacketBuffer buf ) { + super.toBytes( buf ); buf.writeByte( type ); buf.writeVarInt( key ); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java index d574212b3..cfa7ee353 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java @@ -120,12 +120,6 @@ public class MonitorPeripheral extends TermMethods implements IPeripheral return terminal; } - @Override - public boolean isColour() throws LuaException - { - return getMonitor().isColour(); - } - @Nullable @Override public Object getTarget() diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/TileMonitor.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/TileMonitor.java index cbe88a763..706850e83 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/TileMonitor.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/TileMonitor.java @@ -577,6 +577,8 @@ public class TileMonitor extends TileGeneric private void monitorTouched( float xPos, float yPos, float zPos ) { + if( !advanced ) return; + XYPair pair = XYPair .of( xPos, yPos, zPos, getDirection(), getOrientation() ) .add( xIndex, height - yIndex - 1 ); @@ -587,7 +589,7 @@ public class TileMonitor extends TileGeneric } ServerTerminal serverTerminal = getServerMonitor(); - if( serverTerminal == null || !serverTerminal.isColour() ) return; + if( serverTerminal == null ) return; Terminal originTerminal = serverTerminal.getTerminal(); if( originTerminal == null ) return; diff --git a/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java b/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java index a3b56a269..089959117 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java @@ -63,7 +63,7 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent SidedCaps.ofNullable( facing -> facing == null ? new InvWrapper( this ) : new SidedInvWrapper( this, facing ) ); private LazyOptional peripheralCap; - private final Terminal page = new Terminal( ItemPrintout.LINE_MAX_LENGTH, ItemPrintout.LINES_PER_PAGE ); + private final Terminal page = new Terminal( ItemPrintout.LINE_MAX_LENGTH, ItemPrintout.LINES_PER_PAGE, true ); private String pageTitle = ""; private boolean printing = false; diff --git a/src/main/java/dan200/computercraft/shared/util/Palette.java b/src/main/java/dan200/computercraft/shared/util/Palette.java index c176ba525..42042c7a1 100644 --- a/src/main/java/dan200/computercraft/shared/util/Palette.java +++ b/src/main/java/dan200/computercraft/shared/util/Palette.java @@ -5,7 +5,6 @@ */ package dan200.computercraft.shared.util; -import dan200.computercraft.client.render.text.FixedWidthFontRenderer; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.PacketBuffer; @@ -14,18 +13,19 @@ import javax.annotation.Nonnull; public class Palette { private static final int PALETTE_SIZE = 16; + + private final boolean colour; private final double[][] colours = new double[PALETTE_SIZE][3]; private final byte[][] byteColours = new byte[PALETTE_SIZE][4]; - private final byte[][] greyByteColours = new byte[PALETTE_SIZE][4]; - public static final Palette DEFAULT = new Palette(); + public static final Palette DEFAULT = new Palette( true ); - public Palette() + public Palette( boolean colour ) { - // Get the default palette + this.colour = colour; resetColours(); - for( int i = 0; i < PALETTE_SIZE; i++ ) byteColours[i][3] = greyByteColours[i][3] = (byte) 255; + for( int i = 0; i < PALETTE_SIZE; i++ ) byteColours[i][3] = (byte) 255; } public void setColour( int i, double r, double g, double b ) @@ -35,12 +35,17 @@ public class Palette colours[i][1] = g; colours[i][2] = b; - byteColours[i][0] = (byte) (int) (r * 255); - byteColours[i][1] = (byte) (int) (g * 255); - byteColours[i][2] = (byte) (int) (b * 255); - - byte grey = (byte) (int) ((r + g + b) / 3 * 255); - greyByteColours[i][0] = greyByteColours[i][1] = greyByteColours[i][2] = grey; + if( colour ) + { + byteColours[i][0] = (byte) (int) (r * 255); + byteColours[i][1] = (byte) (int) (g * 255); + byteColours[i][2] = (byte) (int) (b * 255); + } + else + { + byte grey = (byte) (int) ((r + g + b) / 3 * 255); + byteColours[i][0] = byteColours[i][1] = byteColours[i][2] = grey; + } } public void setColour( int i, Colour colour ) @@ -54,20 +59,18 @@ public class Palette } /** - * Get the colour as a set of bytes rather than floats. This is called frequently by {@link FixedWidthFontRenderer}, - * as our vertex format uses bytes. + * Get the colour as a set of RGB values suitable for rendering. Colours are automatically converted to greyscale + * when using a black and white palette. + *

+ * This returns a byte array, suitable for being used directly by our terminal vertex format. * - * This allows us to do the conversion once (when setting the colour) rather than for every vertex, at the cost of - * some memory overhead. - * - * @param i The colour index. - * @param greyscale Whether this number should be converted to greyscale. + * @param i The colour index. * @return The number as a tuple of bytes. */ @Nonnull - public byte[] getByteColour( int i, boolean greyscale ) + public byte[] getRenderColours( int i ) { - return greyscale ? greyByteColours[i] : byteColours[i]; + return byteColours[i]; } public void resetColour( int i ) diff --git a/src/test/java/dan200/computercraft/core/ComputerTestDelegate.java b/src/test/java/dan200/computercraft/core/ComputerTestDelegate.java index 6482ccbcd..41a36406a 100644 --- a/src/test/java/dan200/computercraft/core/ComputerTestDelegate.java +++ b/src/test/java/dan200/computercraft/core/ComputerTestDelegate.java @@ -97,7 +97,7 @@ public class ComputerTestDelegate if( REPORT_PATH.delete() ) ComputerCraft.log.info( "Deleted previous coverage report." ); - Terminal term = new Terminal( 80, 100 ); + Terminal term = new Terminal( 80, 100, true ); IWritableMount mount = new FileMount( new File( "test-files/mount" ), 10_000_000 ); // Remove any existing files diff --git a/src/test/java/dan200/computercraft/core/computer/BasicEnvironment.java b/src/test/java/dan200/computercraft/core/computer/BasicEnvironment.java index ea4734e26..073000aa7 100644 --- a/src/test/java/dan200/computercraft/core/computer/BasicEnvironment.java +++ b/src/test/java/dan200/computercraft/core/computer/BasicEnvironment.java @@ -62,12 +62,6 @@ public class BasicEnvironment implements IComputerEnvironment return 0; } - @Override - public boolean isColour() - { - return true; - } - @Override public long getComputerSpaceLimit() { diff --git a/src/test/java/dan200/computercraft/core/computer/ComputerBootstrap.java b/src/test/java/dan200/computercraft/core/computer/ComputerBootstrap.java index e22e5dad8..98aed701b 100644 --- a/src/test/java/dan200/computercraft/core/computer/ComputerBootstrap.java +++ b/src/test/java/dan200/computercraft/core/computer/ComputerBootstrap.java @@ -37,7 +37,7 @@ public class ComputerBootstrap public static void run( String program, int maxTimes ) { - run( program, x -> { }, maxTimes ); + run( program, x -> {}, maxTimes ); } public static void run( IWritableMount mount, Consumer setup, int maxTicks ) @@ -45,7 +45,7 @@ public class ComputerBootstrap ComputerCraft.logComputerErrors = true; ComputerCraft.maxMainComputerTime = ComputerCraft.maxMainGlobalTime = Integer.MAX_VALUE; - Terminal term = new Terminal( ComputerCraft.computerTermWidth, ComputerCraft.computerTermHeight ); + Terminal term = new Terminal( ComputerCraft.computerTermWidth, ComputerCraft.computerTermHeight, true ); final Computer computer = new Computer( new BasicEnvironment( mount ), term, 0 ); AssertApi api = new AssertApi(); diff --git a/src/test/java/dan200/computercraft/core/computer/FakeComputerManager.java b/src/test/java/dan200/computercraft/core/computer/FakeComputerManager.java index 4636e4054..0dbb6f6bc 100644 --- a/src/test/java/dan200/computercraft/core/computer/FakeComputerManager.java +++ b/src/test/java/dan200/computercraft/core/computer/FakeComputerManager.java @@ -55,7 +55,7 @@ public class FakeComputerManager @Nonnull public static Computer create() { - Computer computer = new Computer( new BasicEnvironment(), new Terminal( 51, 19 ), 0 ); + Computer computer = new Computer( new BasicEnvironment(), new Terminal( 51, 19, true ), 0 ); machines.put( computer, new ConcurrentLinkedQueue<>() ); return computer; } diff --git a/src/test/java/dan200/computercraft/core/terminal/TerminalTest.java b/src/test/java/dan200/computercraft/core/terminal/TerminalTest.java index 0a1f90a33..c60574dd7 100644 --- a/src/test/java/dan200/computercraft/core/terminal/TerminalTest.java +++ b/src/test/java/dan200/computercraft/core/terminal/TerminalTest.java @@ -27,7 +27,7 @@ class TerminalTest @Test void testCreation() { - Terminal terminal = new Terminal( 16, 9 ); + Terminal terminal = new Terminal( 16, 9, true ); assertEquals( 16, terminal.getWidth() ); assertEquals( 9, terminal.getHeight() ); } @@ -35,7 +35,7 @@ class TerminalTest @Test void testSetAndGetLine() { - Terminal terminal = new Terminal( 16, 9 ); + Terminal terminal = new Terminal( 16, 9, true ); terminal.setLine( 1, "ABCDEFGHIJKLMNOP", "0123456789abcdef", "fedcba9876543210" ); assertEquals( "ABCDEFGHIJKLMNOP", terminal.getLine( 1 ).toString() ); assertEquals( "0123456789abcdef", terminal.getTextColourLine( 1 ).toString() ); @@ -45,7 +45,7 @@ class TerminalTest @Test void testGetLineOutOfBounds() { - Terminal terminal = new Terminal( 16, 9 ); + Terminal terminal = new Terminal( 16, 9, true ); assertNull( terminal.getLine( -5 ) ); assertNull( terminal.getLine( 12 ) ); @@ -60,7 +60,7 @@ class TerminalTest @Test void testDefaults() { - Terminal terminal = new Terminal( 16, 9 ); + Terminal terminal = new Terminal( 16, 9, true ); assertEquals( 0, terminal.getCursorX() ); assertEquals( 0, terminal.getCursorY() ); assertFalse( terminal.getCursorBlink() ); @@ -71,7 +71,7 @@ class TerminalTest @Test void testDefaultTextBuffer() { - assertThat( new Terminal( 4, 3 ), textMatches( new String[] { + assertThat( new Terminal( 4, 3, true ), textMatches( new String[] { " ", " ", " ", @@ -81,7 +81,7 @@ class TerminalTest @Test void testDefaultTextColourBuffer() { - assertThat( new Terminal( 4, 3 ), textColourMatches( new String[] { + assertThat( new Terminal( 4, 3, true ), textColourMatches( new String[] { "0000", "0000", "0000", @@ -91,7 +91,7 @@ class TerminalTest @Test void testDefaultBackgroundColourBuffer() { - assertThat( new Terminal( 4, 3 ), TerminalMatchers.backgroundColourMatches( new String[] { + assertThat( new Terminal( 4, 3, true ), TerminalMatchers.backgroundColourMatches( new String[] { "ffff", "ffff", "ffff", @@ -102,7 +102,7 @@ class TerminalTest void testZeroSizeBuffers() { String[] x = new String[0]; - assertThat( new Terminal( 0, 0 ), allOf( + assertThat( new Terminal( 0, 0, true ), allOf( textMatches( new String[0] ), textColourMatches( x ), TerminalMatchers.backgroundColourMatches( x ) @@ -113,7 +113,7 @@ class TerminalTest void testResizeWidthAndHeight() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setLine( 0, "test", "aaaa", "eeee" ); callCounter.reset(); @@ -146,7 +146,7 @@ class TerminalTest void testResizeSmaller() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setLine( 0, "test", "aaaa", "eeee" ); terminal.setLine( 1, "smol", "aaaa", "eeee" ); terminal.setLine( 2, "term", "aaaa", "eeee" ); @@ -176,7 +176,7 @@ class TerminalTest void testResizeWithSameDimensions() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); terminal.resize( 4, 3 ); @@ -189,7 +189,7 @@ class TerminalTest void testSetAndGetCursorPos() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setCursorPos( 2, 1 ); @@ -202,7 +202,7 @@ class TerminalTest void testSetCursorPosUnchanged() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setCursorPos( 2, 1 ); callCounter.reset(); @@ -217,7 +217,7 @@ class TerminalTest void testSetCursorBlink() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setCursorBlink( true ); @@ -229,7 +229,7 @@ class TerminalTest void testSetCursorBlinkUnchanged() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setCursorBlink( true ); callCounter.reset(); @@ -243,7 +243,7 @@ class TerminalTest void testSetTextColour() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setTextColour( 5 ); @@ -255,7 +255,7 @@ class TerminalTest void testSetTextColourUnchanged() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setTextColour( 5 ); callCounter.reset(); @@ -269,7 +269,7 @@ class TerminalTest void testSetBackgroundColour() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setBackgroundColour( 5 ); @@ -281,7 +281,7 @@ class TerminalTest void testSetBackgroundColourUnchanged() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setBackgroundColour( 5 ); callCounter.reset(); @@ -295,7 +295,7 @@ class TerminalTest void testBlitFromOrigin() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); blit( terminal, "test", "1234", "abcd" ); @@ -322,7 +322,7 @@ class TerminalTest void testBlitWithOffset() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setCursorPos( 2, 1 ); callCounter.reset(); @@ -353,7 +353,7 @@ class TerminalTest void testBlitOutOfBounds() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); terminal.setCursorPos( 2, -5 ); @@ -372,7 +372,7 @@ class TerminalTest @Test public void testBlitPartialBuffer() { - Terminal terminal = new Terminal( 4, 3 ); + Terminal terminal = new Terminal( 4, 3, true ); ByteBuffer text = LuaValues.encode( "123456" ); text.position( 1 ); @@ -386,7 +386,7 @@ class TerminalTest void testWriteFromOrigin() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.write( "test" ); @@ -413,7 +413,7 @@ class TerminalTest void testWriteWithOffset() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setCursorPos( 2, 1 ); callCounter.reset(); @@ -444,7 +444,7 @@ class TerminalTest void testWriteOutOfBounds() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); terminal.setCursorPos( 2, -5 ); @@ -465,7 +465,7 @@ class TerminalTest void testScrollUp() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setLine( 1, "test", "1111", "eeee" ); callCounter.reset(); @@ -496,7 +496,7 @@ class TerminalTest void testScrollDown() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setLine( 1, "test", "1111", "eeee" ); callCounter.reset(); @@ -527,7 +527,7 @@ class TerminalTest void testScrollZeroLinesUnchanged() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); terminal.setLine( 1, "test", "1111", "eeee" ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); @@ -543,7 +543,7 @@ class TerminalTest void testClear() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); terminal.setLine( 1, "test", "1111", "eeee" ); @@ -559,7 +559,7 @@ class TerminalTest void testClearLine() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); terminal.setLine( 1, "test", "1111", "eeee" ); @@ -576,7 +576,7 @@ class TerminalTest void testClearLineOutOfBounds() { CallCounter callCounter = new CallCounter(); - Terminal terminal = new Terminal( 4, 3, callCounter ); + Terminal terminal = new Terminal( 4, 3, true, callCounter ); TerminalBufferSnapshot old; terminal.setLine( 1, "test", "1111", "eeee" ); @@ -599,7 +599,7 @@ class TerminalTest @Test void testPacketBufferRoundtrip() { - Terminal writeTerminal = new Terminal( 2, 1 ); + Terminal writeTerminal = new Terminal( 2, 1, true ); blit( writeTerminal, "hi", "11", "ee" ); writeTerminal.setCursorPos( 2, 5 ); @@ -610,7 +610,7 @@ class TerminalTest writeTerminal.write( packetBuffer ); CallCounter callCounter = new CallCounter(); - Terminal readTerminal = new Terminal( 2, 1, callCounter ); + Terminal readTerminal = new Terminal( 2, 1, true, callCounter ); packetBuffer.writeBytes( packetBuffer ); readTerminal.read( packetBuffer ); @@ -630,7 +630,7 @@ class TerminalTest @Test void testNbtRoundtrip() { - Terminal writeTerminal = new Terminal( 10, 5 ); + Terminal writeTerminal = new Terminal( 10, 5, true ); blit( writeTerminal, "hi", "11", "ee" ); writeTerminal.setCursorPos( 2, 5 ); writeTerminal.setTextColour( 3 ); @@ -640,7 +640,7 @@ class TerminalTest writeTerminal.writeToNBT( nbt ); CallCounter callCounter = new CallCounter(); - Terminal readTerminal = new Terminal( 2, 1, callCounter ); + Terminal readTerminal = new Terminal( 2, 1, true, callCounter ); readTerminal.readFromNBT( nbt ); @@ -660,13 +660,13 @@ class TerminalTest @Test void testReadWriteNBTEmpty() { - Terminal terminal = new Terminal( 0, 0 ); + Terminal terminal = new Terminal( 0, 0, true ); CompoundNBT nbt = new CompoundNBT(); terminal.writeToNBT( nbt ); CallCounter callCounter = new CallCounter(); - terminal = new Terminal( 0, 1, callCounter ); + terminal = new Terminal( 0, 1, true, callCounter ); terminal.readFromNBT( nbt ); assertThat( terminal, allOf( diff --git a/src/test/java/dan200/computercraft/shared/network/client/TerminalStateTest.java b/src/test/java/dan200/computercraft/shared/network/client/TerminalStateTest.java index 62c1351d4..9b5f5d727 100644 --- a/src/test/java/dan200/computercraft/shared/network/client/TerminalStateTest.java +++ b/src/test/java/dan200/computercraft/shared/network/client/TerminalStateTest.java @@ -26,7 +26,7 @@ public class TerminalStateTest Terminal terminal = randomTerminal(); PacketBuffer buffer = new PacketBuffer( Unpooled.directBuffer() ); - new TerminalState( true, terminal, true ).write( buffer ); + new TerminalState( terminal, true ).write( buffer ); checkEqual( terminal, read( buffer ) ); assertEquals( 0, buffer.readableBytes() ); @@ -38,7 +38,7 @@ public class TerminalStateTest Terminal terminal = randomTerminal(); PacketBuffer buffer = new PacketBuffer( Unpooled.directBuffer() ); - new TerminalState( true, terminal, false ).write( buffer ); + new TerminalState( terminal, false ).write( buffer ); checkEqual( terminal, read( buffer ) ); assertEquals( 0, buffer.readableBytes() ); @@ -47,7 +47,7 @@ public class TerminalStateTest private static Terminal randomTerminal() { Random random = new Random(); - Terminal terminal = new Terminal( 10, 5 ); + Terminal terminal = new Terminal( 10, 5, true ); for( int y = 0; y < terminal.getHeight(); y++ ) { TextBuffer buffer = terminal.getLine( y ); @@ -77,7 +77,7 @@ public class TerminalStateTest if( !state.hasTerminal() ) return null; - Terminal other = new Terminal( state.width, state.height ); + Terminal other = new Terminal( state.width, state.height, true ); state.apply( other ); return other; }