From d197c0a73e6943de4b1617f8713e29e3bd84e289 Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Tue, 5 Jan 2021 18:51:44 +0300 Subject: [PATCH] Colors are now always Vec4, ARGB ints are only wrappers --- .../progressia/client/ClientState.java | 4 +- .../progressia/client/graphics/Colors.java | 53 ++++++++++------- .../client/graphics/flat/RenderTarget.java | 43 ++++++++++++-- .../progressia/client/graphics/font/Font.java | 17 ++++-- .../client/graphics/font/SpriteTypeface.java | 59 ++++++++----------- .../client/graphics/font/Typeface.java | 13 ++-- .../client/graphics/model/Faces.java | 5 +- .../graphics/model/ShapeRenderProgram.java | 43 ++++++++++---- .../client/graphics/model/Shapes.java | 14 +++-- .../client/graphics/world/LayerWorld.java | 3 +- .../graphics/world/WorldRenderProgram.java | 31 +++++++--- .../world/cro/ChunkRenderOptimizerCube.java | 5 +- .../client/world/tile/TileRenderGrass.java | 3 +- .../client/world/tile/TileRenderSimple.java | 3 +- .../progressia/test/LayerTestGUI.java | 16 ++--- .../graphics/flat => test}/LayerTestUI.java | 18 +++--- .../test/TestEntityRenderJavapony.java | 31 +++++----- .../assets/shaders/Shape.fragment.glsl | 6 +- .../assets/shaders/Shape.vertex.glsl | 4 +- 19 files changed, 232 insertions(+), 139 deletions(-) rename src/main/java/ru/windcorp/progressia/{client/graphics/flat => test}/LayerTestUI.java (86%) diff --git a/src/main/java/ru/windcorp/progressia/client/ClientState.java b/src/main/java/ru/windcorp/progressia/client/ClientState.java index f6e6959..47a3141 100644 --- a/src/main/java/ru/windcorp/progressia/client/ClientState.java +++ b/src/main/java/ru/windcorp/progressia/client/ClientState.java @@ -2,11 +2,11 @@ package ru.windcorp.progressia.client; import ru.windcorp.progressia.client.comms.localhost.LocalServerCommsChannel; import ru.windcorp.progressia.client.graphics.GUI; -import ru.windcorp.progressia.client.graphics.flat.LayerTestUI; import ru.windcorp.progressia.client.graphics.world.LayerWorld; import ru.windcorp.progressia.common.world.WorldData; import ru.windcorp.progressia.server.ServerState; import ru.windcorp.progressia.test.LayerTestGUI; +import ru.windcorp.progressia.test.LayerTestUI; import ru.windcorp.progressia.test.TestContent; public class ClientState { @@ -31,8 +31,6 @@ public class ClientState { Client client = new Client(world, channel); -// world.tmp_generate(); - channel.connect(TestContent.PLAYER_LOGIN); setInstance(client); diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/Colors.java b/src/main/java/ru/windcorp/progressia/client/graphics/Colors.java index 0ee371c..3799058 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/Colors.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/Colors.java @@ -17,34 +17,43 @@ *******************************************************************************/ package ru.windcorp.progressia.client.graphics; -import glm.vec._3.Vec3; +import glm.vec._4.Vec4; public class Colors { - public static final int - WHITE = 0xFFFFFF, - BLACK = 0x000000, - - GRAY_4 = 0x444444, - GRAY = 0x888888, - GRAY_A = 0xAAAAAA, - - DEBUG_RED = 0xFF0000, - DEBUG_GREEN = 0x00FF00, - DEBUG_BLUE = 0x0000FF, - - DEBUG_CYAN = 0x00FFFF, - DEBUG_MAGENTA = 0xFF00FF, - DEBUG_YELLOW = 0xFFFF00; + public static final Vec4 + WHITE = toVector(0xFFFFFFFF), + BLACK = toVector(0xFF000000), + + GRAY_4 = toVector(0xFF444444), + GRAY = toVector(0xFF888888), + GRAY_A = toVector(0xFFAAAAAA), + + DEBUG_RED = toVector(0xFFFF0000), + DEBUG_GREEN = toVector(0xFF00FF00), + DEBUG_BLUE = toVector(0xFF0000FF), + DEBUG_CYAN = toVector(0xFF00FFFF), + DEBUG_MAGENTA = toVector(0xFFFF00FF), + DEBUG_YELLOW = toVector(0xFFFFFF00); - public static Vec3 toVector(int rgb) { - return toVector(rgb, new Vec3()); + public static Vec4 toVector(int argb) { + return toVector(argb, new Vec4()); } - public static Vec3 toVector(int rgb, Vec3 output) { - output.x = ((rgb & 0xFF0000) >> 16) / 256f; - output.y = ((rgb & 0x00FF00) >> 8 ) / 256f; - output.z = ((rgb & 0x0000FF) ) / 256f; + public static Vec4 multiplyRGB(Vec4 color, float multiplier) { + return color.mul(multiplier, multiplier, multiplier, 1); + } + + public static Vec4 multiplyRGB(Vec4 color, float multiplier, Vec4 output) { + if (output == null) output = new Vec4(); + return color.mul(multiplier, multiplier, multiplier, 1, output); + } + + public static Vec4 toVector(int argb, Vec4 output) { + output.w = ((argb & 0xFF000000) >>> 24) / 256f; // Alpha + output.x = ((argb & 0x00FF0000) >>> 16) / 256f; // Red + output.y = ((argb & 0x0000FF00) >>> 8) / 256f; // Green + output.z = ((argb & 0x000000FF) ) / 256f; // Blue return output; } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/flat/RenderTarget.java b/src/main/java/ru/windcorp/progressia/client/graphics/flat/RenderTarget.java index 77e0341..8847a3a 100755 --- a/src/main/java/ru/windcorp/progressia/client/graphics/flat/RenderTarget.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/flat/RenderTarget.java @@ -25,6 +25,7 @@ import java.util.Objects; import glm.mat._4.Mat4; import glm.vec._3.Vec3; +import glm.vec._4.Vec4; import ru.windcorp.progressia.client.graphics.Colors; import ru.windcorp.progressia.client.graphics.backend.Usage; import ru.windcorp.progressia.client.graphics.model.Face; @@ -190,13 +191,20 @@ public class RenderTarget { public void drawTexture( int x, int y, int width, int height, - int color, Texture texture + Vec4 color, Texture texture ) { addFaceToCurrentClip( createRectagleFace(x, y, width, height, color, texture) ); } + public void drawTexture( + int x, int y, int width, int height, + int color, Texture texture + ) { + drawTexture(x, y, width, height, Colors.toVector(color), texture); + } + public void drawTexture( int x, int y, int width, int height, Texture texture @@ -206,12 +214,19 @@ public class RenderTarget { public void fill( int x, int y, int width, int height, - int color + Vec4 color ) { drawTexture(x, y, width, height, color, null); } - public void fill(int color) { + public void fill( + int x, int y, int width, int height, + int color + ) { + fill(x, y, width, height, Colors.toVector(color)); + } + + public void fill(Vec4 color) { fill( Integer.MIN_VALUE / 2, Integer.MIN_VALUE / 2, Integer.MAX_VALUE, Integer.MAX_VALUE, @@ -219,15 +234,19 @@ public class RenderTarget { ); } + public void fill(int color) { + fill(Colors.toVector(color)); + } + public Face createRectagleFace( - int x, int y, int width, int height, int color, Texture texture + int x, int y, int width, int height, Vec4 color, Texture texture ) { float depth = this.depth--; return Faces.createRectangle( FlatRenderProgram.getDefault(), texture, - Colors.toVector(color), + color, new Vec3(x, y, depth), new Vec3(width, 0, 0), new Vec3(0, height, 0), @@ -235,8 +254,14 @@ public class RenderTarget { ); } - public Shape createRectagle( + public Face createRectagleFace( int x, int y, int width, int height, int color, Texture texture + ) { + return createRectagleFace(x, y, width, height, Colors.toVector(color), texture); + } + + public Shape createRectagle( + int x, int y, int width, int height, Vec4 color, Texture texture ) { return new Shape( Usage.STATIC, FlatRenderProgram.getDefault(), @@ -244,4 +269,10 @@ public class RenderTarget { ); } + public Shape createRectagle( + int x, int y, int width, int height, int color, Texture texture + ) { + return createRectagle(x, y, width, height, Colors.toVector(color), texture); + } + } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/font/Font.java b/src/main/java/ru/windcorp/progressia/client/graphics/font/Font.java index bb40d2a..efbc3cc 100755 --- a/src/main/java/ru/windcorp/progressia/client/graphics/font/Font.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/font/Font.java @@ -3,6 +3,7 @@ package ru.windcorp.progressia.client.graphics.font; import java.util.function.Supplier; import glm.vec._2.i.Vec2i; +import glm.vec._4.Vec4; import ru.windcorp.progressia.client.graphics.Colors; import ru.windcorp.progressia.client.graphics.model.Renderable; @@ -12,15 +13,19 @@ public class Font { private final int style; private final float align; - private final int color; + private final Vec4 color; - public Font(Typeface typeface, int style, float align, int color) { + public Font(Typeface typeface, int style, float align, Vec4 color) { this.typeface = typeface; this.style = style; this.align = align; this.color = color; } + public Font(Typeface typeface, int style, float align, int color) { + this(typeface, style, align, Colors.toVector(color)); + } + public Font(Typeface typeface) { this(typeface, Typeface.Style.PLAIN, Typeface.ALIGN_LEFT, Colors.WHITE); } @@ -41,14 +46,14 @@ public class Font { return align; } - public int getColor() { + public Vec4 getColor() { return color; } public Renderable assemble( CharSequence chars, float maxWidth ) { - return typeface.assemble(chars, style, align, maxWidth, color); + return typeface.assembleStatic(chars, style, align, maxWidth, color); } public Renderable assembleDynamic( @@ -127,6 +132,10 @@ public class Font { return new Font(getTypeface(), getStyle(), align, getColor()); } + public Font withColor(Vec4 color) { + return new Font(getTypeface(), getStyle(), getAlign(), color); + } + public Font withColor(int color) { return new Font(getTypeface(), getStyle(), getAlign(), color); } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/font/SpriteTypeface.java b/src/main/java/ru/windcorp/progressia/client/graphics/font/SpriteTypeface.java index d9512f9..6f0fdcd 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/font/SpriteTypeface.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/font/SpriteTypeface.java @@ -8,10 +8,12 @@ import glm.mat._4.Mat4; import glm.vec._2.Vec2; import glm.vec._2.i.Vec2i; import glm.vec._3.Vec3; +import glm.vec._4.Vec4; import gnu.trove.map.TCharObjectMap; import gnu.trove.map.hash.TCharObjectHashMap; import gnu.trove.stack.TIntStack; import gnu.trove.stack.array.TIntArrayStack; +import ru.windcorp.progressia.client.graphics.Colors; import ru.windcorp.progressia.client.graphics.backend.Usage; import ru.windcorp.progressia.client.graphics.model.Face; import ru.windcorp.progressia.client.graphics.model.Faces; @@ -115,7 +117,7 @@ public abstract class SpriteTypeface extends Typeface { return output.set(resultWidth, height); } - private Shape createCharShape(char c, Vec3 color) { + private Shape createCharShape(char c, Vec4 color) { return new Shape( Usage.STATIC, getProgram(), Faces.createRectangle( @@ -130,25 +132,16 @@ public abstract class SpriteTypeface extends Typeface { ); } - // TODO remove - private static Vec3 createVectorFromRGBInt(int rgb) { - int r = (rgb & 0xFF0000) >> 16; - int g = (rgb & 0x00FF00) >> 8; - int b = (rgb & 0x0000FF); - - return new Vec3(r / 256f, g / 256f, b / 256f); - } - private class DynamicText implements Renderable, Drawer { private final Supplier supplier; private final int style; private final float align; private final float maxWidth; - private final Vec3 color; + private final Vec4 color; private final Renderable unitLine = new Shape(Usage.STATIC, getProgram(), Faces.createRectangle( - getProgram(), null, Vectors.UNIT_3, Vectors.ZERO_3, new Vec3(1, 0, 0), new Vec3(0, 1, 0), false + getProgram(), null, Vectors.UNIT_4, Vectors.ZERO_3, new Vec3(1, 0, 0), new Vec3(0, 1, 0), false )); private class DynamicWorkspace extends Workspace { @@ -165,7 +158,7 @@ public abstract class SpriteTypeface extends Typeface { public DynamicText( Supplier supplier, - int style, float align, float maxWidth, Vec3 color + int style, float align, float maxWidth, Vec4 color ) { this.supplier = supplier; this.style = style; @@ -200,14 +193,14 @@ public abstract class SpriteTypeface extends Typeface { */ @Override - public void drawChar(char c, Vec3 color, Mat4 transform) { + public void drawChar(char c, Vec4 color, Mat4 transform) { workspace.renderer.pushTransform().mul(transform); getShape(c).render(workspace.renderer); workspace.renderer.popTransform(); } @Override - public void drawRectangle(Vec2 size, Vec3 color, Mat4 transform) { + public void drawRectangle(Vec2 size, Vec4 color, Mat4 transform) { workspace.renderer.pushTransform().mul(transform).scale(size.x, size.y, 1); unitLine.render(workspace.renderer); workspace.renderer.popTransform(); @@ -234,7 +227,7 @@ public abstract class SpriteTypeface extends Typeface { public final SDWorkspace workspace = new SDWorkspace(); @Override - public void drawChar(char c, Vec3 color, Mat4 transform) { + public void drawChar(char c, Vec4 color, Mat4 transform) { workspace.origin.set(0, 0, 0); workspace.width.set(getWidth(c), 0, 0); workspace.height.set(0, getHeight(), 0); @@ -243,7 +236,7 @@ public abstract class SpriteTypeface extends Typeface { } @Override - public void drawRectangle(Vec2 size, Vec3 color, Mat4 transform) { + public void drawRectangle(Vec2 size, Vec4 color, Mat4 transform) { workspace.origin.set(0, 0, 0); workspace.width.set(size.x, 0, 0); workspace.height.set(0, size.y, 0); @@ -251,7 +244,7 @@ public abstract class SpriteTypeface extends Typeface { drawFace(null, color, transform); } - private void drawFace(Texture texture, Vec3 color, Mat4 transform) { + private void drawFace(Texture texture, Vec4 color, Mat4 transform) { workspace.width.add(workspace.origin); workspace.height.add(workspace.origin); @@ -281,15 +274,15 @@ public abstract class SpriteTypeface extends Typeface { } @Override - public Renderable assemble(CharSequence chars, int style, float align, float maxWidth, int color) { + public Renderable assembleStatic(CharSequence text, int style, float align, float maxWidth, Vec4 color) { StaticDrawer drawer = new StaticDrawer(); - draw(chars, drawer, drawer.workspace, style, align, maxWidth, createVectorFromRGBInt(color)); + draw(text, drawer, drawer.workspace, style, align, maxWidth, color); return drawer.assemble(); } @Override - public Renderable assembleDynamic(Supplier supplier, int style, float align, float maxWidth, int color) { - return new DynamicText(supplier, style, align, maxWidth, createVectorFromRGBInt(color)); + public Renderable assembleDynamic(Supplier supplier, int style, float align, float maxWidth, Vec4 color) { + return new DynamicText(supplier, style, align, maxWidth, color); } /* @@ -309,7 +302,7 @@ public abstract class SpriteTypeface extends Typeface { private float maxWidth; private final TIntStack styles = new TIntArrayStack(16); - private final StashingStack colors = new StashingStack<>(16, Vec3::new); + private final StashingStack colors = new StashingStack<>(16, Vec4::new); private final Vec2 pos = new Vec2(); @@ -332,10 +325,10 @@ public abstract class SpriteTypeface extends Typeface { return current; } - private Vec3 pushColor() { + private Vec4 pushColor() { if (colors.isEmpty()) return colors.push(); - Vec3 previous = colors.peek(); + Vec4 previous = colors.peek(); return colors.push().set(previous); } @@ -371,13 +364,13 @@ public abstract class SpriteTypeface extends Typeface { } protected interface Drawer { - void drawChar(char c, Vec3 color, Mat4 transform); - void drawRectangle(Vec2 size, Vec3 color, Mat4 transform); + void drawChar(char c, Vec4 color, Mat4 transform); + void drawRectangle(Vec2 size, Vec4 color, Mat4 transform); } protected void draw( CharSequence text, Drawer drawer, Workspace workspace, - int style, float align, float maxWidth, Vec3 color + int style, float align, float maxWidth, Vec4 color ) { workspace.text = text; workspace.toIndex = text.length(); @@ -387,7 +380,7 @@ public abstract class SpriteTypeface extends Typeface { getSize(text, style, align, maxWidth, workspace.totalSize); workspace.styles.push(style); - workspace.colors.push().set(color.x, color.y, color.z); + workspace.colors.push().set(color); drawSpan(drawer, workspace); @@ -447,15 +440,15 @@ public abstract class SpriteTypeface extends Typeface { workspace.pushStyle(~Style.SHADOW); - workspace.pushColor().mul(getShadowColorMultiplier()); + drawLine(drawer, workspace); // TODO figure out why placing this line after drawing shadow reverses order of display (should be the opposite) + workspace.pos.x = xToRestore; + + Colors.multiplyRGB(workspace.pushColor(), getShadowColorMultiplier()); workspace.pushTransform().translate(getShadowOffset()); drawLine(drawer, workspace); - workspace.pos.x = xToRestore; workspace.colors.pop(); workspace.transforms.pop(); - drawLine(drawer, workspace); - workspace.styles.pop(); } else if (Style.isBold(style)) { diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/font/Typeface.java b/src/main/java/ru/windcorp/progressia/client/graphics/font/Typeface.java index ab0d0dd..6620377 100755 --- a/src/main/java/ru/windcorp/progressia/client/graphics/font/Typeface.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/font/Typeface.java @@ -3,6 +3,7 @@ package ru.windcorp.progressia.client.graphics.font; import java.util.function.Supplier; import glm.vec._2.i.Vec2i; +import glm.vec._4.Vec4; import ru.windcorp.progressia.client.graphics.model.Renderable; import ru.windcorp.progressia.common.util.Named; import ru.windcorp.progressia.common.util.Vectors; @@ -48,13 +49,15 @@ public abstract class Typeface extends Named { super(name); } - public abstract Renderable assemble( - CharSequence chars, int style, - float align, float maxWidth, - int color + public abstract Renderable assembleStatic( + CharSequence chars, + int style, float align, float maxWidth, Vec4 color ); - public abstract Renderable assembleDynamic(Supplier supplier, int style, float align, float maxWidth, int color); + public abstract Renderable assembleDynamic( + Supplier supplier, + int style, float align, float maxWidth, Vec4 color + ); public int getWidth( CharSequence chars, int style, diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/model/Faces.java b/src/main/java/ru/windcorp/progressia/client/graphics/model/Faces.java index a1d64dd..6834e4e 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/model/Faces.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/model/Faces.java @@ -21,6 +21,7 @@ import java.nio.ShortBuffer; import glm.vec._2.Vec2; import glm.vec._3.Vec3; +import glm.vec._4.Vec4; import ru.windcorp.progressia.client.graphics.model.ShapeRenderProgram.VertexBuilder; import ru.windcorp.progressia.client.graphics.texture.Texture; import ru.windcorp.progressia.common.world.block.BlockFace; @@ -32,7 +33,7 @@ public class Faces { public static Face createRectangle( ShapeRenderProgram program, Texture texture, - Vec3 colorMultiplier, + Vec4 colorMultiplier, Vec3 origin, Vec3 width, Vec3 height, @@ -76,7 +77,7 @@ public class Faces { public static Face createBlockFace( ShapeRenderProgram program, Texture texture, - Vec3 colorMultiplier, + Vec4 colorMultiplier, Vec3 blockCenter, BlockFace face, boolean inner diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/model/ShapeRenderProgram.java b/src/main/java/ru/windcorp/progressia/client/graphics/model/ShapeRenderProgram.java index 83213ea..54ef210 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/model/ShapeRenderProgram.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/model/ShapeRenderProgram.java @@ -28,6 +28,7 @@ import com.google.common.collect.ObjectArrays; import glm.vec._2.Vec2; import glm.vec._3.Vec3; +import glm.vec._4.Vec4; import ru.windcorp.progressia.client.graphics.backend.VertexBufferObject; import ru.windcorp.progressia.client.graphics.backend.VertexBufferObject.BindTarget; import ru.windcorp.progressia.client.graphics.backend.shaders.CombinedShader; @@ -42,7 +43,7 @@ public class ShapeRenderProgram extends Program { private static final int DEFAULT_BYTES_PER_VERTEX = 3 * Float.BYTES + // Position - 3 * Float.BYTES + // Color multiplier + 4 * Float.BYTES + // Color multiplier 2 * Float.BYTES; // Texture coordinates private static final String SHAPE_VERTEX_SHADER_RESOURCE = @@ -152,10 +153,10 @@ public class ShapeRenderProgram extends Program { offset += 3 * Float.BYTES; colorsAttribute.set( - 3, GL11.GL_FLOAT, false, vertexStride, vertices, + 4, GL11.GL_FLOAT, false, vertexStride, vertices, offset ); - offset += 3 * Float.BYTES; + offset += 4 * Float.BYTES; textureCoordsAttribute.set( 2, GL11.GL_FLOAT, false, vertexStride, vertices, @@ -209,7 +210,7 @@ public class ShapeRenderProgram extends Program { for (int i = 0; i < face.getVertexCount(); i++) { int offset = vertices.position() + i * getBytesPerVertex() + ( 3 * Float.BYTES + - 3 * Float.BYTES + 4 * Float.BYTES ); v.set( @@ -239,9 +240,15 @@ public class ShapeRenderProgram extends Program { float tx, float ty ); + VertexBuilder addVertex( + float x, float y, float z, + float r, float g, float b, float a, + float tx, float ty + ); + VertexBuilder addVertex( Vec3 position, - Vec3 colorMultiplier, + Vec4 colorMultiplier, Vec2 textureCoords ); @@ -252,10 +259,10 @@ public class ShapeRenderProgram extends Program { private static class Vertex { final Vec3 position; - final Vec3 colorMultiplier; + final Vec4 colorMultiplier; final Vec2 textureCoords; - Vertex(Vec3 position, Vec3 colorMultiplier, Vec2 textureCoords) { + Vertex(Vec3 position, Vec4 colorMultiplier, Vec2 textureCoords) { this.position = position; this.colorMultiplier = colorMultiplier; this.textureCoords = textureCoords; @@ -264,6 +271,21 @@ public class ShapeRenderProgram extends Program { private final List vertices = new ArrayList<>(); + @Override + public VertexBuilder addVertex( + float x, float y, float z, + float r, float g, float b, float a, + float tx, float ty + ) { + vertices.add(new Vertex( + new Vec3(x, y, z), + new Vec4(r, g, b, a), + new Vec2(tx, ty) + )); + + return this; + } + @Override public VertexBuilder addVertex( float x, float y, float z, @@ -272,7 +294,7 @@ public class ShapeRenderProgram extends Program { ) { vertices.add(new Vertex( new Vec3(x, y, z), - new Vec3(r, g, b), + new Vec4(r, g, b, 1f), new Vec2(tx, ty) )); @@ -282,12 +304,12 @@ public class ShapeRenderProgram extends Program { @Override public VertexBuilder addVertex( Vec3 position, - Vec3 colorMultiplier, + Vec4 colorMultiplier, Vec2 textureCoords ) { vertices.add(new Vertex( new Vec3(position), - new Vec3(colorMultiplier), + new Vec4(colorMultiplier), new Vec2(textureCoords) )); @@ -308,6 +330,7 @@ public class ShapeRenderProgram extends Program { .putFloat(v.colorMultiplier.x) .putFloat(v.colorMultiplier.y) .putFloat(v.colorMultiplier.z) + .putFloat(v.colorMultiplier.w) .putFloat(v.textureCoords.x) .putFloat(v.textureCoords.y); } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/model/Shapes.java b/src/main/java/ru/windcorp/progressia/client/graphics/model/Shapes.java index 83c7f2e..2da7332 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/model/Shapes.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/model/Shapes.java @@ -20,6 +20,7 @@ package ru.windcorp.progressia.client.graphics.model; import java.util.Map; import glm.vec._3.Vec3; +import glm.vec._4.Vec4; import ru.windcorp.progressia.client.graphics.backend.Usage; import ru.windcorp.progressia.client.graphics.texture.Texture; import ru.windcorp.progressia.common.world.block.BlockFace; @@ -35,7 +36,7 @@ public class Shapes { Vec3 height, Vec3 depth, - Vec3 colorMultiplier, + Vec4 colorMultiplier, Texture topTexture, Texture bottomTexture, @@ -120,7 +121,7 @@ public class Shapes { private final Vec3 width = new Vec3(0, 1, 0); private final Vec3 height = new Vec3(0, 0, 1); - private final Vec3 colorMultiplier = new Vec3(1, 1, 1); + private final Vec4 colorMultiplier = new Vec4(1, 1, 1, 1); private final Texture topTexture; private final Texture bottomTexture; @@ -178,13 +179,18 @@ public class Shapes { return this; } - public PppBuilder setColorMultiplier(Vec3 colorMultiplier) { + public PppBuilder setColorMultiplier(Vec4 colorMultiplier) { this.colorMultiplier.set(colorMultiplier); return this; } public PppBuilder setColorMultiplier(float r, float g, float b) { - this.colorMultiplier.set(r, g, b); + this.colorMultiplier.set(r, g, b, 1); + return this; + } + + public PppBuilder setColorMultiplier(float r, float g, float b, float a) { + this.colorMultiplier.set(r, g, b, a); return this; } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java index 94a5f16..22e1b9a 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/LayerWorld.java @@ -23,6 +23,7 @@ import java.util.List; import glm.mat._4.Mat4; import glm.vec._3.Vec3; import glm.vec._3.i.Vec3i; +import glm.vec._4.Vec4; import ru.windcorp.progressia.client.Client; import ru.windcorp.progressia.client.ClientState; import ru.windcorp.progressia.client.comms.controls.InputBasedControls; @@ -157,7 +158,7 @@ public class LayerWorld extends Layer { final float f = 1e-2f; final float scale = 1 - f/2; - final Vec3 color = new Vec3(1, 1, 1).mul(0); + final Vec4 color = new Vec4(1, 1, 1, 1).mul(0); for (float phi = 0; phi < 2*FloatMathUtils.PI_F; phi += FloatMathUtils.PI_F/2) { Mat4 rot = new Mat4().identity().rotateZ(phi).scale(scale); diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/world/WorldRenderProgram.java b/src/main/java/ru/windcorp/progressia/client/graphics/world/WorldRenderProgram.java index 7adf1e6..97a1094 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/world/WorldRenderProgram.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/world/WorldRenderProgram.java @@ -28,6 +28,7 @@ import com.google.common.collect.ObjectArrays; import glm.vec._2.Vec2; import glm.vec._3.Vec3; +import glm.vec._4.Vec4; import ru.windcorp.progressia.client.graphics.backend.VertexBufferObject; import ru.windcorp.progressia.client.graphics.backend.shaders.attributes.*; import ru.windcorp.progressia.client.graphics.backend.shaders.uniforms.*; @@ -54,7 +55,7 @@ public class WorldRenderProgram extends ShapeRenderProgram { private static final int DEFAULT_BYTES_PER_VERTEX = 3 * Float.BYTES + // Position - 3 * Float.BYTES + // Color multiplier + 4 * Float.BYTES + // Color multiplier 2 * Float.BYTES + // Texture coordinates 3 * Float.BYTES; // Normals @@ -194,7 +195,7 @@ public class WorldRenderProgram extends ShapeRenderProgram { ByteBuffer vertices = face.getVertices(); int offset = vertices.position() + index * getBytesPerVertex() + ( 3 * Float.BYTES + - 3 * Float.BYTES + + 4 * Float.BYTES + 2 * Float.BYTES ); @@ -216,10 +217,10 @@ public class WorldRenderProgram extends ShapeRenderProgram { private static class Vertex { final Vec3 position; - final Vec3 colorMultiplier; + final Vec4 colorMultiplier; final Vec2 textureCoords; - Vertex(Vec3 position, Vec3 colorMultiplier, Vec2 textureCoords) { + Vertex(Vec3 position, Vec4 colorMultiplier, Vec2 textureCoords) { this.position = position; this.colorMultiplier = colorMultiplier; this.textureCoords = textureCoords; @@ -236,7 +237,22 @@ public class WorldRenderProgram extends ShapeRenderProgram { ) { vertices.add(new Vertex( new Vec3(x, y, z), - new Vec3(r, g, b), + new Vec4(r, g, b, 1), + new Vec2(tx, ty) + )); + + return this; + } + + @Override + public VertexBuilder addVertex( + float x, float y, float z, + float r, float g, float b, float a, + float tx, float ty + ) { + vertices.add(new Vertex( + new Vec3(x, y, z), + new Vec4(r, g, b, a), new Vec2(tx, ty) )); @@ -246,12 +262,12 @@ public class WorldRenderProgram extends ShapeRenderProgram { @Override public VertexBuilder addVertex( Vec3 position, - Vec3 colorMultiplier, + Vec4 colorMultiplier, Vec2 textureCoords ) { vertices.add(new Vertex( new Vec3(position), - new Vec3(colorMultiplier), + new Vec4(colorMultiplier), new Vec2(textureCoords) )); @@ -272,6 +288,7 @@ public class WorldRenderProgram extends ShapeRenderProgram { .putFloat(v.colorMultiplier.x) .putFloat(v.colorMultiplier.y) .putFloat(v.colorMultiplier.z) + .putFloat(v.colorMultiplier.w) .putFloat(v.textureCoords.x) .putFloat(v.textureCoords.y) .putFloat(Float.NaN) diff --git a/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java b/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java index 161012c..4921c7d 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java +++ b/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java @@ -27,6 +27,7 @@ import java.util.function.Consumer; import glm.vec._3.Vec3; import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.client.graphics.Colors; import ru.windcorp.progressia.client.graphics.backend.Usage; import ru.windcorp.progressia.client.graphics.model.Face; import ru.windcorp.progressia.client.graphics.model.Faces; @@ -70,8 +71,6 @@ public class ChunkRenderOptimizerCube extends ChunkRenderOptimizer { int tileCount = 0; } - private static final Vec3 COLOR_MULTIPLIER = new Vec3(1, 1, 1); - private final BlockInfo[][][] data = new BlockInfo[BLOCKS_PER_CHUNK] [BLOCKS_PER_CHUNK] @@ -209,7 +208,7 @@ public class ChunkRenderOptimizerCube extends ChunkRenderOptimizer { output.accept(Faces.createBlockFace( WorldRenderProgram.getDefault(), texture, - COLOR_MULTIPLIER, + Colors.WHITE, new Vec3(cursor), face, false diff --git a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderGrass.java b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderGrass.java index cc59b74..e5bf8fa 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderGrass.java +++ b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderGrass.java @@ -1,6 +1,7 @@ package ru.windcorp.progressia.client.world.tile; import glm.vec._3.Vec3; +import ru.windcorp.progressia.client.graphics.Colors; import ru.windcorp.progressia.client.graphics.backend.Usage; import ru.windcorp.progressia.client.graphics.model.Faces; import ru.windcorp.progressia.client.graphics.model.Shape; @@ -42,7 +43,7 @@ public class TileRenderGrass extends TileRender implements OpaqueTile { return new Shape( Usage.STATIC, WorldRenderProgram.getDefault(), Faces.createBlockFace( - program, getTexture(face), new Vec3(1, 1, 1), + program, getTexture(face), Colors.WHITE, new Vec3(0, 0, 0), face, false ) ); diff --git a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderSimple.java b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderSimple.java index d9034cb..8d62740 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderSimple.java +++ b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderSimple.java @@ -1,6 +1,7 @@ package ru.windcorp.progressia.client.world.tile; import glm.vec._3.Vec3; +import ru.windcorp.progressia.client.graphics.Colors; import ru.windcorp.progressia.client.graphics.backend.Usage; import ru.windcorp.progressia.client.graphics.model.Faces; import ru.windcorp.progressia.client.graphics.model.Shape; @@ -43,7 +44,7 @@ public class TileRenderSimple extends TileRender implements OpaqueTile { return new Shape( Usage.STATIC, WorldRenderProgram.getDefault(), Faces.createBlockFace( - program, getTexture(face), new Vec3(1, 1, 1), + program, getTexture(face), Colors.WHITE, new Vec3(0, 0, 0), face, false ) ); diff --git a/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java b/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java index caeb1c9..b087001 100755 --- a/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java +++ b/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java @@ -46,45 +46,45 @@ public class LayerTestGUI extends GUILayer { Collection