From 5bd8c3d9ecad3c8b70e4936a4ad9faaf142a80fa Mon Sep 17 00:00:00 2001 From: kismama <159849319+kismama@users.noreply.github.com> Date: Mon, 23 Sep 2024 03:23:22 +0100 Subject: [PATCH] Texture updated/created: water, grass, lantern --- BlockGame.sln.DotSettings.user | 1 + src/GL/BTextureAtlas.cs | 2 +- src/ui/GUI.cs | 5 +++++ src/util/BlockModel.cs | 34 ++++++++++++++++++++++++++++++++- src/util/Blocks.cs | 26 +++++++++++++++++-------- src/world/chunk/SubChunk.cs | 2 +- textures/blocks.png | Bin 16608 -> 15237 bytes 7 files changed, 59 insertions(+), 11 deletions(-) diff --git a/BlockGame.sln.DotSettings.user b/BlockGame.sln.DotSettings.user index 55d4841..9fcec60 100644 --- a/BlockGame.sln.DotSettings.user +++ b/BlockGame.sln.DotSettings.user @@ -88,6 +88,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded diff --git a/src/GL/BTextureAtlas.cs b/src/GL/BTextureAtlas.cs index 38e49c3..4844209 100644 --- a/src/GL/BTextureAtlas.cs +++ b/src/GL/BTextureAtlas.cs @@ -143,7 +143,7 @@ public void Dispose() { } public void update(double dt) { - if (ticks % 5 == 0) { + if (ticks % 8 == 0) { updateTexture(0, 4 * 16, 16, 16, (i % 16) * 16, 4 * 16); i++; } diff --git a/src/ui/GUI.cs b/src/ui/GUI.cs index 473cfc7..2b8fbae 100644 --- a/src/ui/GUI.cs +++ b/src/ui/GUI.cs @@ -355,6 +355,8 @@ public Vector2 measureStringSmall(ReadOnlySpan text) { public void drawBlock(Block block, int x, int y, int size) { //GD.Clear(ClearBuffers.Color); var viewport = GD.Viewport; + var dt = GD.DepthTestingEnabled; + GD.DepthTestingEnabled = true; GD.VertexArray = buffer; GD.ShaderProgram = guiBlockShader; WorldRenderer.meshBlockTinted(block, ref guiBlock, ref guiBlockI, 15); @@ -387,6 +389,9 @@ public void drawBlock(Block block, int x, int y, int size) { // it no longer thinks we have vertex arrays bound when we actually trashed it in our renderer //GL.BindVertexArray(buffer.VertexArray.Handle); GD.DrawElements(PrimitiveType.Triangles, 0, (uint)spI.Length); + + // restore + GD.DepthTestingEnabled = dt; GD.Viewport = viewport; } diff --git a/src/util/BlockModel.cs b/src/util/BlockModel.cs index ac2f398..2bc40fa 100644 --- a/src/util/BlockModel.cs +++ b/src/util/BlockModel.cs @@ -60,7 +60,7 @@ public static BlockModel makeGrass(UVPair[] uvs) { model.faces = new Face[4]; // offset from edge - var offset = 1 / (8 * MathF.Sqrt(2)); + var offset = 1 / 16*mathsqrt(2); // x1 model.faces[0] = new(0 + offset, 1, 1 - offset, 0 + offset, 0, 1 - offset, 1 - offset, 0, 0 + offset, 1 - offset, 1, 0 + offset, @@ -77,6 +77,10 @@ public static BlockModel makeGrass(UVPair[] uvs) { return model; } + private static int mathsqrt(int i) { + return 0; + } + public static BlockModel makeStairs(UVPair[] uvs) { var model = new BlockModel(); model.faces = new Face[10]; @@ -124,6 +128,34 @@ public static BlockModel makeHalfCube(UVPair[] uvs) { } + //make a 12x14 pixel partial cube + public static BlockModel makePartialCube(UVPair[] uvs) { + var model = new BlockModel(); + var offset = 2 / 16f; + var offset1 = 6 / 16f; + + model.faces = new Face[11]; + // west + model.faces[0] = new(0+offset, 1-offset, 1-offset, 0+offset, 0, 1-offset, 0+offset, 0, 0+offset, 0+offset, 1-offset, 0+offset, uvs[1] + offset, uvs[1] + new UVPair(1-offset, 1), RawDirection.WEST, true, true); + // east + model.faces[1] = new(1-offset, 1-offset, 0+offset, 1-offset, 0, 0+offset, 1-offset, 0, 1-offset, 1-offset, 1-offset, 1-offset, uvs[1] + offset, uvs[1] + new UVPair(1-offset, 1), RawDirection.EAST, true, true); + // south + model.faces[2] = new(0+offset, 1-offset, 0+offset, 0+offset, 0, 0+offset, 1-offset, 0, 0+offset, 1-offset, 1-offset, 0+offset, uvs[1] + offset, uvs[1] + new UVPair(1-offset, 1), RawDirection.SOUTH, true, true); + // north + model.faces[3] = new(1-offset, 1-offset, 1-offset, 1-offset, 0, 1-offset, 0+offset, 0, 1-offset, 0+offset, 1-offset, 1-offset, uvs[1] + offset, uvs[1] + new UVPair(1-offset, 1), RawDirection.NORTH, true, true); + // down + model.faces[4] = new(1-offset, 0, 1-offset, 1-offset, 0, 0+offset, 0+offset, 0, 0+offset, 0+offset, 0, 1-offset, uvs[4] + offset, uvs[4]+(1-offset), RawDirection.DOWN, true, true); + // up + model.faces[5] = new(0+offset, 1-offset, 1-offset, 0+offset, 1-offset, 0+offset, 1-offset, 1-offset, 0+offset, 1-offset, 1-offset, 1-offset, uvs[5] + offset, uvs[5]+(1-offset), RawDirection.UP, true, true); + + model.faces[6] = new(0+offset1, 1, 1-offset1, 0+offset1, 1-offset, 1-offset1, 0+offset1, 1-offset, 0+offset1, 0+offset1, 1, 0+offset1, uvs[2] + new UVPair(offset1,0), uvs[2]+new UVPair(1-offset1, offset) , RawDirection.WEST, true, true); + model.faces[7] = new(1-offset1, 1, 0+offset1, 1-offset1, 1-offset, 0+offset1, 1-offset1, 1-offset, 1-offset1, 1-offset1, 1, 1-offset1, uvs[2] + new UVPair(offset1,0), uvs[2]+new UVPair(1-offset1, offset), RawDirection.EAST, true, true); + model.faces[8] = new(0+offset1, 1, 0+offset1, 0+offset1, 1-offset, 0+offset1, 1-offset1, 1-offset, 0+offset1, 1-offset1, 1, 0+offset1, uvs[2] + new UVPair(offset1,0), uvs[2]+new UVPair(1-offset1, offset), RawDirection.SOUTH, true, true); + model.faces[9] = new(1-offset1, 1, 1-offset1, 1-offset1, 1-offset, 1-offset1, 0+offset1, 1-offset, 1-offset1, 0+offset1, 1, 1-offset1, uvs[2] + new UVPair(offset1,0), uvs[2]+new UVPair(1-offset1, offset), RawDirection.NORTH, true, true); + model.faces[10] = new(0+offset1, 1, 1-offset1, 0+offset1, 1, 0+offset1, 1-offset1, 1, 0+offset1, 1-offset1, 1, 1-offset1, uvs[4] + new UVPair(offset1,offset1), uvs[4]+new UVPair(1-offset1, 1-offset1), RawDirection.UP, true, true); + return model; + } + public static BlockModel emptyBlock() { var model = new BlockModel(); model.faces = []; diff --git a/src/util/Blocks.cs b/src/util/Blocks.cs index d96f2a6..7521231 100644 --- a/src/util/Blocks.cs +++ b/src/util/Blocks.cs @@ -19,7 +19,7 @@ public class Blocks { public static bool[] translucentCache = new bool[MAXBLOCKS]; public static bool[] inventoryBlacklist = new bool[MAXBLOCKS]; - public static readonly int maxBlock = 42; + public static readonly int maxBlock = 44; public static Block register(Block block) { return blocks[block.id] = block; @@ -62,12 +62,16 @@ public static bool isBlacklisted(int block) { public static Block STONE = register(new Block(5, "Stone", BlockModel.makeCube(Block.cubeUVs(5, 0)))); public static Block GRAVEL = register(new Block(6, "Gravel", BlockModel.makeCube(Block.cubeUVs(7, 0)))); public static Block HELLSTONE = register(new Block(7, "Hellstone", BlockModel.makeCube(Block.grassUVs(8, 0, 9, 0, 9, 0))).light(15)); - public static Block GLASS = register(new Block(8, "Glass", BlockModel.makeCube(Block.cubeUVs(6, 0))).transparency()); - public static Block LANTERN = register(new Block(9, "Lantern", BlockModel.makeCube(Block.grassUVs(15, 1, 13, 1, 14, 1))).light(15)); - public static Block YELLOW_FLOWER = register(new Flower(10, "Yellow Flower", BlockModel.makeGrass(Block.crossUVs(2, 3)))).transparency().flowerAABB().noCollision(); - public static Block RED_FLOWER = register(new Flower(11, "Red Flower", BlockModel.makeGrass(Block.crossUVs(3, 3)))).transparency().flowerAABB().noCollision(); - //public static Block TALL_GRASS = register(new Flower(12, "Tall Grass", BlockModel.makeGrass(Block.crossUVs( , )))).transparency().flowerAABB().noCollision(); + + public static Block LANTERN = register(new Block(9, "Lantern", BlockModel.makePartialCube(Block.grassUVs(15, 1, 13, 1, 14, 1))).light(15).partialBlock()); + + public static Block TALL_GRASS = register(new Flower(43, "Tall Grass", BlockModel.makeGrass(Block.crossUVs(9,1)))).transparency().noCollision(); + public static Block SHORT_GRASS = register(new Flower(44, "Short Grass", BlockModel.makeGrass(Block.crossUVs(8,1)))).transparency().shortGrassAABB().noCollision(); + + public static Block YELLOW_FLOWER = register(new Flower(10, "Yellow Flower", BlockModel.makeGrass(Block.crossUVs(10,1))).transparency().flowerAABB().noCollision()); + public static Block RED_FLOWER = register(new Flower(11, "Red Flower", BlockModel.makeGrass(Block.crossUVs(11,1))).transparency().flowerAABB().noCollision()); + public static Block PLANKS = register(new Block(12, "Planks", BlockModel.makeCube(Block.cubeUVs(0, 5)))); public static Block STAIRS = register(new Block(13, "Stairs", BlockModel.makeStairs(Block.cubeUVs(0, 5))).partialBlock()); @@ -276,11 +280,17 @@ public static AABB fullBlock() { } public Block flowerAABB() { - var offset = 3 / 8f; + var offset = 6 / 16f; selectionAABB = new AABB(new Vector3D(0 + offset, 0, 0 + offset), new Vector3D(1 - offset, 0.5, 1 - offset)); return this; } + public Block shortGrassAABB() { + var offset = 4 / 16f; + selectionAABB = new AABB(new Vector3D(0, 0, 0), new Vector3D(1, offset, 1)); + return this; + } + public Block(ushort id, string name, BlockModel model) { this.id = id; this.name = name; @@ -496,7 +506,7 @@ public readonly record struct Face( float x4, float y4, float z4, UVPair min, UVPair max, RawDirection direction, bool noAO = false, bool nonFullFace = false) { - public const int MAX_FACES = 10; + public const int MAX_FACES = 12; public readonly float x1 = x1; public readonly float y1 = y1; diff --git a/src/world/chunk/SubChunk.cs b/src/world/chunk/SubChunk.cs index b21ac9d..234a685 100644 --- a/src/world/chunk/SubChunk.cs +++ b/src/world/chunk/SubChunk.cs @@ -58,7 +58,7 @@ public void tick(Random random, int x, int y, int z) { var worldPos = World.toWorldPos(chunkX, chunkY, chunkZ, x, y, z); if (block == Blocks.GRASS.id) { - if (y < 127 && world.getBlock(worldPos.X, worldPos.Y + 1, worldPos.Z) != 0) { + if (y < 127 && Blocks.isFullBlock(world.getBlock(worldPos.X, worldPos.Y + 1, worldPos.Z))) { blocks[x, y, z] = Blocks.DIRT.id; renderer.meshChunk(); } diff --git a/textures/blocks.png b/textures/blocks.png index fcfaa82b7409a8be52d003b8a2df89c4e9220923..b97b8109f01ced4d5c0e2b10373635dce5a0568b 100644 GIT binary patch literal 15237 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 S;NGhRynCajP%UTi>AwI%L6_zL literal 16608 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 J?yY&){{vhES#tmY