diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/block/SectionPreparer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/block/SectionPreparer.kt index 494e3f112..cbd302310 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/block/SectionPreparer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/block/SectionPreparer.kt @@ -19,6 +19,9 @@ import de.bixilon.minosoft.data.world.ChunkSection import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.block.mesh.ChunkSectionMesh import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition +import de.bixilon.minosoft.util.logging.Log +import de.bixilon.minosoft.util.logging.LogLevels +import de.bixilon.minosoft.util.logging.LogMessageType import glm_.vec3.Vec3i import java.util.* @@ -28,12 +31,14 @@ class SectionPreparer( fun prepare(section: ChunkSection): ChunkSectionMesh { + val startTime = System.nanoTime() val mesh = ChunkSectionMesh(renderWindow) + val random = Random(0L) for (x in 0 until ProtocolDefinition.SECTION_WIDTH_X) { for (y in 0 until ProtocolDefinition.SECTION_HEIGHT_Y) { for (z in 0 until ProtocolDefinition.SECTION_WIDTH_Z) { - val block = section.blocks[ChunkSection.getIndex(x, y, z)] + val block = section.blocks[ChunkSection.getIndex(x, y, z)] ?: continue val neighbours: Array = arrayOfNulls(Directions.VALUES.size) @@ -68,13 +73,18 @@ class SectionPreparer( } else { section.blocks[ChunkSection.getIndex(x + 1, y, z)] } + val model = block.model - block?.model?.singleRender(Vec3i(x, y, z), mesh, Random(0L), neighbours, 0xFF, intArrayOf(0xF, 0xF, 0xF, 0xF)) + random.setSeed(0L) + model?.singleRender(Vec3i(x, y, z), mesh, random, neighbours, 0xFF, intArrayOf(0xF, 0xF, 0xF, 0xF)) } } } + val time = System.nanoTime() + val delta = time - startTime + Log.log(LogMessageType.OTHER, LogLevels.VERBOSE) { "Preparing took ${delta}ns, ${delta / 1000}µs, ${delta / 1000000}ms" } return mesh } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/block/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/block/WorldRenderer.kt index b4dc2dd67..f61a22e01 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/block/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/block/WorldRenderer.kt @@ -65,6 +65,7 @@ class WorldRenderer( val blockState = connection.registries.blockRegistry["diamond_block"]?.defaultState val chunk = ChunkSection(Array(4096) { if (it < 4096) blockState else null }) + // for(i in 0 until 100000) mesh = sectionPreparer.prepare(chunk) mesh.load() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/block/mesh/ChunkSectionMesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/block/mesh/ChunkSectionMesh.kt index 63d98e90c..a5b239db4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/block/mesh/ChunkSectionMesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/block/mesh/ChunkSectionMesh.kt @@ -13,7 +13,6 @@ package de.bixilon.minosoft.gui.rendering.block.mesh -import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderWindow @@ -26,8 +25,6 @@ import glm_.vec3.Vec3 class ChunkSectionMesh(renderWindow: RenderWindow) : Mesh(renderWindow, SectionArrayMeshStruct, initialCacheSize = 100000) { fun addVertex(position: Vec3, uv: Vec2, texture: AbstractTexture, tintColor: RGBColor?, light: Int) { - val color = tintColor ?: ChatColors.WHITE - val textureLayer = if (RenderConstants.FORCE_DEBUG_TEXTURE) { RenderConstants.DEBUG_TEXTURE_ID } else { @@ -43,7 +40,7 @@ class ChunkSectionMesh(renderWindow: RenderWindow) : Mesh(renderWindow, SectionA transformedUV.y, Float.fromBits(textureLayer), Float.fromBits(texture.renderData?.animationData ?: -1), - Float.fromBits(color.rgb), + Float.fromBits(tintColor?.rgb ?: 0xFFFFFF), // white Float.fromBits(light), )) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/block/BakedBlockStateModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/block/BakedBlockStateModel.kt index cbd61a5eb..b5559e33d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/block/BakedBlockStateModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/block/BakedBlockStateModel.kt @@ -18,7 +18,7 @@ import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.world.light.LightAccessor import de.bixilon.minosoft.gui.rendering.block.mesh.ChunkSectionMesh import de.bixilon.minosoft.gui.rendering.models.FaceSize -import glm_.vec3.Vec3 +import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.toVec3 import glm_.vec3.Vec3i import java.util.* @@ -31,7 +31,7 @@ class BakedBlockStateModel( } override fun singleRender(position: Vec3i, mesh: ChunkSectionMesh, random: Random, neighbours: Array, light: Int, ambientLight: IntArray) { - val floatPosition = Vec3(position) + val floatPosition = position.toVec3() for ((index, direction) in faces.withIndex()) { val neighbour = neighbours[index] if (neighbour != null) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureArray.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureArray.kt index 73aca05e8..64d05e2fd 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureArray.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureArray.kt @@ -101,9 +101,12 @@ class OpenGLTextureArray( } - val uvEnd = Vec2(texture.size) / arrayResolution + val uvEnd: Vec2? = if (texture.size.x == arrayResolution && texture.size.y == arrayResolution) { + null + } else { + Vec2(texture.size) / arrayResolution + } val singlePixelSize = Vec2(1.0f) / arrayResolution - val textureArrayUV = Vec2(texture.size) / arrayResolution if (texture is SpriteTexture) { val animationIndex = lastAnimationIndex++ @@ -122,7 +125,7 @@ class OpenGLTextureArray( texturesByResolution[arrayId] += texture texture.renderData = OpenGLTextureData(arrayId, lastTextureId[arrayId]++, uvEnd, -1) texture.singlePixelSize = singlePixelSize - texture.textureArrayUV = textureArrayUV + texture.textureArrayUV = uvEnd ?: Vec2(1.0f, 1.0f) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureData.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureData.kt index c2f73b45a..f2936eac7 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureData.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/OpenGLTextureData.kt @@ -19,12 +19,15 @@ import glm_.vec2.Vec2 class OpenGLTextureData( val array: Int, val index: Int, - val uvEnd: Vec2, + val uvEnd: Vec2?, override val animationData: Int = -1, ) : TextureRenderData { override val layer: Int = (array shl 24) or (index) override fun transformUV(end: Vec2): Vec2 { + if (uvEnd == null) { + return end + } return end * uvEnd } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3iUtil.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3iUtil.kt index a98f94c9d..de5967ad4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3iUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3iUtil.kt @@ -14,6 +14,7 @@ package de.bixilon.minosoft.gui.rendering.util.vec.vec3 import de.bixilon.minosoft.util.KUtil.toInt +import glm_.vec3.Vec3 import glm_.vec3.Vec3i object Vec3iUtil { @@ -28,6 +29,11 @@ object Vec3iUtil { get() = Vec3i(Int.MAX_VALUE, Int.MAX_VALUE, Int.MAX_VALUE) + fun Vec3i.toVec3(): Vec3 { + val array = array + return Vec3(floatArrayOf(array[0].toFloat(), array[1].toFloat(), array[2].toFloat())) + } + fun Any?.toVec3i(default: Vec3i? = null): Vec3i { return toVec3iN() ?: default ?: throw IllegalArgumentException("Not a Vec3i: $this") }