From 4cfcd6519aa81d3bb2ee315f421eb5533bb324cd Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 4 Feb 2021 17:43:28 +0100 Subject: [PATCH] rendering: move some classes to packages, use AssetsManager for textures --- .../bixilon/minosoft/gui/rendering/Camera.kt | 1 + .../minosoft/gui/rendering/ChunkPreparer.kt | 1 + .../minosoft/gui/rendering/DummyData.java | 31 --------------- .../bixilon/minosoft/gui/rendering/Mesh.java | 1 + .../minosoft/gui/rendering/RenderWindow.kt | 4 +- .../gui/rendering/{ => shader}/Shader.java | 3 +- .../rendering/{ => shader}/ShaderUtil.java | 3 +- .../{ => textures}/TextureArray.java | 39 ++++++++++--------- .../gui/rendering/textures/TextureLoader.kt | 23 +++++++++++ .../gui/rendering/{ => util}/OpenGLUtil.java | 2 +- 10 files changed, 55 insertions(+), 53 deletions(-) delete mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/DummyData.java rename src/main/java/de/bixilon/minosoft/gui/rendering/{ => shader}/Shader.java (96%) rename src/main/java/de/bixilon/minosoft/gui/rendering/{ => shader}/ShaderUtil.java (90%) rename src/main/java/de/bixilon/minosoft/gui/rendering/{ => textures}/TextureArray.java (52%) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/textures/TextureLoader.kt rename src/main/java/de/bixilon/minosoft/gui/rendering/{ => util}/OpenGLUtil.java (85%) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt index 3a025595f..e510f98b3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt @@ -1,5 +1,6 @@ package de.bixilon.minosoft.gui.rendering +import de.bixilon.minosoft.gui.rendering.shader.Shader import glm_.glm import glm_.mat4x4.Mat4 import glm_.vec3.Vec3 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/ChunkPreparer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/ChunkPreparer.kt index a3e81203d..2a12c744e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/ChunkPreparer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/ChunkPreparer.kt @@ -107,6 +107,7 @@ object ChunkPreparer { "minecraft:dirt" -> 1 "minecraft:stone" -> 2 "minecraft:glass" -> 3 + "minecraft:red_wool" -> 4 else -> 2 } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/DummyData.java b/src/main/java/de/bixilon/minosoft/gui/rendering/DummyData.java deleted file mode 100644 index 20ec940d1..000000000 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/DummyData.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.bixilon.minosoft.gui.rendering; - -import de.bixilon.minosoft.data.mappings.blocks.Block; -import de.bixilon.minosoft.data.world.Chunk; -import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition; - -import java.util.HashMap; - -public class DummyData { - private static final Block BEDROCK = new Block("bedrock"); - private static final Block DIRT = new Block("dirt"); - private static final Block STONE = new Block("stone"); - - public static Chunk getDummyChunk() { - Chunk chunk = new Chunk(new HashMap<>()); - for (int y = 0; y < ProtocolDefinition.SECTION_HEIGHT_Y * ProtocolDefinition.SECTIONS_PER_CHUNK; y++) { - for (int x = 0; x < ProtocolDefinition.SECTION_WIDTH_X; x++) { - for (int z = 0; z < ProtocolDefinition.SECTION_WIDTH_Z; z++) { - if (y == 0) { - chunk.setBlock(x, y, z, BEDROCK); - } else if (y < 8) { - chunk.setBlock(x, y, z, DIRT); - } else if (y < 60) { - chunk.setBlock(x, y, z, STONE); - } - } - } - } - return chunk; - } -} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/Mesh.java b/src/main/java/de/bixilon/minosoft/gui/rendering/Mesh.java index 2aa8794a4..9d5219087 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/Mesh.java +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/Mesh.java @@ -1,6 +1,7 @@ package de.bixilon.minosoft.gui.rendering; import de.bixilon.minosoft.data.world.ChunkLocation; +import de.bixilon.minosoft.gui.rendering.shader.Shader; import glm_.vec3.Vec3; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt index a940ed89d..dbddce232 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt @@ -1,6 +1,8 @@ package de.bixilon.minosoft.gui.rendering import de.bixilon.minosoft.data.world.ChunkLocation +import de.bixilon.minosoft.gui.rendering.shader.Shader +import de.bixilon.minosoft.gui.rendering.textures.TextureArray import de.bixilon.minosoft.protocol.network.Connection import org.lwjgl.* import org.lwjgl.glfw.Callbacks @@ -111,7 +113,7 @@ class RenderWindow(private val connection: Connection) { } fun startLoop() { - texture0 = TextureArray(arrayOf("/textures/bedrock.png", "/textures/dirt.png", "/textures/stone.png", "/textures/glass.png")) + texture0 = TextureArray(connection.version.assetsManager, arrayOf("block/bedrock", "block/dirt", "block/stone", "block/glass", "block/red_wool")) texture0.load() shader = Shader("vertex.glsl", "fragment.glsl") diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/Shader.java b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/Shader.java similarity index 96% rename from src/main/java/de/bixilon/minosoft/gui/rendering/Shader.java rename to src/main/java/de/bixilon/minosoft/gui/rendering/shader/Shader.java index bb78dd5d0..c5657e59a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/Shader.java +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/Shader.java @@ -1,6 +1,7 @@ -package de.bixilon.minosoft.gui.rendering; +package de.bixilon.minosoft.gui.rendering.shader; import de.bixilon.minosoft.gui.rendering.exceptions.ShaderLoadingException; +import de.bixilon.minosoft.gui.rendering.util.OpenGLUtil; import glm_.mat4x4.Mat4; import glm_.vec3.Vec3; import org.lwjgl.BufferUtils; diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/ShaderUtil.java b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/ShaderUtil.java similarity index 90% rename from src/main/java/de/bixilon/minosoft/gui/rendering/ShaderUtil.java rename to src/main/java/de/bixilon/minosoft/gui/rendering/shader/ShaderUtil.java index 9a9d2d21a..ac021d506 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/ShaderUtil.java +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/shader/ShaderUtil.java @@ -1,6 +1,7 @@ -package de.bixilon.minosoft.gui.rendering; +package de.bixilon.minosoft.gui.rendering.shader; import de.bixilon.minosoft.gui.rendering.exceptions.ShaderLoadingException; +import de.bixilon.minosoft.gui.rendering.util.OpenGLUtil; import de.bixilon.minosoft.util.Util; import org.lwjgl.opengl.ARBShaderObjects; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/TextureArray.java b/src/main/java/de/bixilon/minosoft/gui/rendering/textures/TextureArray.java similarity index 52% rename from src/main/java/de/bixilon/minosoft/gui/rendering/TextureArray.java rename to src/main/java/de/bixilon/minosoft/gui/rendering/textures/TextureArray.java index 06fdedbfc..aac00e1b5 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/TextureArray.java +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/textures/TextureArray.java @@ -1,20 +1,23 @@ -package de.bixilon.minosoft.gui.rendering; +package de.bixilon.minosoft.gui.rendering.textures; -import de.matthiasmann.twl.utils.PNGDecoder; -import org.lwjgl.BufferUtils; +import de.bixilon.minosoft.data.assets.AssetsManager; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Map; import static org.lwjgl.opengl.GL20.*; import static org.lwjgl.opengl.GL30.GL_TEXTURE_2D_ARRAY; import static org.lwjgl.opengl.GL30.glGenerateMipmap; public class TextureArray { + private final AssetsManager assetsManager; private final String[] texturePaths; + private String[] textureIndexArray; private int textureId; - public TextureArray(String[] texturePaths) { + public TextureArray(AssetsManager assetsManager, String[] texturePaths) { + this.assetsManager = assetsManager; this.texturePaths = texturePaths; } @@ -26,26 +29,22 @@ public class TextureArray { glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // load and generate the texture + var textures = TextureLoader.Companion.loadTextureArray(this.assetsManager, this.texturePaths); - boolean sizeSet = false; + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 16, 16, textures.size(), 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer) null); - for (int i = 0; i < this.texturePaths.length; i++) { - PNGDecoder decoder = new PNGDecoder(OpenGLUtil.class.getResourceAsStream(this.texturePaths[i])); - ByteBuffer buffer = BufferUtils.createByteBuffer(decoder.getWidth() * decoder.getHeight() * 4); - decoder.decode(buffer, decoder.getWidth() * 4, PNGDecoder.Format.RGBA); - buffer.flip(); - if (!sizeSet) { - glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, decoder.getWidth(), decoder.getHeight(), this.texturePaths.length, 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer) null); - - sizeSet = true; - } - glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, decoder.getWidth(), decoder.getHeight(), 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer); + this.textureIndexArray = new String[textures.size()]; + int i = 0; + for (Map.Entry entry : textures.entrySet()) { + this.textureIndexArray[i] = entry.getKey(); + glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i++, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, entry.getValue()); } - //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, decoder.getWidth(), decoder.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); - glGenerateMipmap(GL_TEXTURE_2D); + glGenerateMipmap(GL_TEXTURE_2D_ARRAY); return this.textureId; } @@ -57,4 +56,8 @@ public class TextureArray { glActiveTexture(textureMode); // activate the texture unit first before binding texture glBindTexture(GL_TEXTURE_2D, this.textureId); } + + public String[] getTextureIndexArray() { + return this.textureIndexArray; + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/textures/TextureLoader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/textures/TextureLoader.kt new file mode 100644 index 000000000..488f4aa3b --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/textures/TextureLoader.kt @@ -0,0 +1,23 @@ +package de.bixilon.minosoft.gui.rendering.textures + +import de.bixilon.minosoft.data.assets.AssetsManager +import de.matthiasmann.twl.utils.PNGDecoder +import org.lwjgl.BufferUtils +import java.nio.ByteBuffer + +class TextureLoader { + + companion object { + fun loadTextureArray(assetsManager: AssetsManager, textures: Array): Map { + val result: MutableMap = mutableMapOf() + for (texture in textures) { + val decoder = PNGDecoder(assetsManager.readAssetAsStream("minecraft/textures/${texture}.png")) + val buffer = BufferUtils.createByteBuffer(decoder.width * decoder.height * 4) + decoder.decode(buffer, decoder.width * 4, PNGDecoder.Format.RGBA) + buffer.flip() + result[texture] = buffer + } + return result.toMap() + } + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/OpenGLUtil.java b/src/main/java/de/bixilon/minosoft/gui/rendering/util/OpenGLUtil.java similarity index 85% rename from src/main/java/de/bixilon/minosoft/gui/rendering/OpenGLUtil.java rename to src/main/java/de/bixilon/minosoft/gui/rendering/util/OpenGLUtil.java index 4cdc549a6..aa08b9e36 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/OpenGLUtil.java +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/OpenGLUtil.java @@ -1,4 +1,4 @@ -package de.bixilon.minosoft.gui.rendering; +package de.bixilon.minosoft.gui.rendering.util; import org.lwjgl.opengl.ARBShaderObjects;