mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-10-31 21:52:59 +00:00
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).
This commit is contained in:
@@ -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<T extends ContainerComputerBase> 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
|
||||
|
||||
@@ -43,10 +43,7 @@ public class GuiTurtle extends ComputerScreenBase<ContainerTurtle>
|
||||
@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
|
||||
|
||||
@@ -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<T extends ContainerComputerBase> 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 );
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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 ),
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,7 +157,7 @@ public class TileEntityMonitorRenderer extends TileEntityRenderer<TileMonitor>
|
||||
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<TileMonitor>
|
||||
|
||||
// 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();
|
||||
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -69,10 +69,4 @@ public class TermAPI extends TermMethods implements ILuaAPI
|
||||
{
|
||||
return terminal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isColour()
|
||||
{
|
||||
return environment.isColour();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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" );
|
||||
}
|
||||
|
||||
|
||||
@@ -18,8 +18,6 @@ public interface IComputerEnvironment
|
||||
|
||||
double getTimeOfDay();
|
||||
|
||||
boolean isColour();
|
||||
|
||||
long getComputerSpaceLimit();
|
||||
|
||||
@Nonnull
|
||||
|
||||
@@ -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 ) );
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<IPeripheral> 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;
|
||||
|
||||
|
||||
@@ -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.
|
||||
* <p>
|
||||
* 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 )
|
||||
|
||||
Reference in New Issue
Block a user