From 821a849e253e25aa56c82bd1d2d43f6153750937 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Wed, 10 Nov 2021 22:42:47 +0100 Subject: [PATCH] world-renderer: mesh: calculate max positions (for frustum culling) --- .../gui/rendering/block/WorldRenderer.kt | 2 +- .../block/mesh/ChunkSectionMeshes.kt | 32 +++++++++++++++---- .../block/preparer/CullSectionPreparer.kt | 6 +++- .../models/baked/MultipartBakedModel.kt | 8 +++-- .../models/baked/WeightedBakedModel.kt | 4 +-- .../models/baked/block/BakedBlockModel.kt | 2 +- .../baked/block/BakedBlockStateModel.kt | 7 +++- 7 files changed, 46 insertions(+), 15 deletions(-) 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 eb73631c8..0cbbb73c9 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 @@ -90,7 +90,7 @@ class WorldRenderer( mesh = sectionPreparer.prepare(section) - // for (i in 0 until 1000) + for (i in 0 until 1000) mesh = sectionPreparer.prepare(section) /* diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/block/mesh/ChunkSectionMeshes.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/block/mesh/ChunkSectionMeshes.kt index d2f32f140..24646b7fe 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/block/mesh/ChunkSectionMeshes.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/block/mesh/ChunkSectionMeshes.kt @@ -13,9 +13,7 @@ package de.bixilon.minosoft.gui.rendering.block.mesh -import de.bixilon.minosoft.data.registries.AABB import de.bixilon.minosoft.gui.rendering.RenderWindow -import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.EMPTY import glm_.vec3.Vec3i class ChunkSectionMeshes( @@ -28,11 +26,9 @@ class ChunkSectionMeshes( var transparentMesh: ChunkSectionMesh? = ChunkSectionMesh(renderWindow) private set - val minPosition = Vec3i.EMPTY - val maxPosition = Vec3i.EMPTY - - lateinit var aabb: AABB - private set + // used for frustum culling + val minPosition = Vec3i(16) + val maxPosition = Vec3i(0) @Synchronized fun load() { @@ -58,4 +54,26 @@ class ChunkSectionMeshes( mesh.load() } } + + fun addBlock(x: Int, y: Int, z: Int) { + if (x < minPosition.x) { + minPosition.x = x + } + if (y < minPosition.y) { + minPosition.y = y + } + if (z < minPosition.z) { + minPosition.z = z + } + + if (x > maxPosition.x) { + maxPosition.x = x + } + if (y > maxPosition.y) { + maxPosition.y = y + } + if (z > maxPosition.z) { + maxPosition.z = z + } + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/block/preparer/CullSectionPreparer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/block/preparer/CullSectionPreparer.kt index 8f357044f..85bc1fd5f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/block/preparer/CullSectionPreparer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/block/preparer/CullSectionPreparer.kt @@ -25,6 +25,7 @@ class CullSectionPreparer( for (y in 0 until ProtocolDefinition.SECTION_HEIGHT_Y) { for (z in 0 until ProtocolDefinition.SECTION_WIDTH_Z) { block = section.blocks[ChunkSection.getIndex(x, y, z)] + val model = block?.model ?: continue // ToDo: Chunk borders neighbours[Directions.DOWN.ordinal] = if (y == 0) { @@ -59,7 +60,10 @@ class CullSectionPreparer( } random.setSeed(VecUtil.generatePositionHash(x, y, z)) - block?.model?.singleRender(Vec3i(x, y, z), mesh, random, neighbours, 0xFF, floatArrayOf(1.0f, 1.0f, 1.0f, 1.0f)) + val rendered = model.singleRender(Vec3i(x, y, z), mesh, random, neighbours, 0xFF, floatArrayOf(1.0f, 1.0f, 1.0f, 1.0f)) + if (rendered) { + mesh.addBlock(x, y, z) + } } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/MultipartBakedModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/MultipartBakedModel.kt index 5b9f92b53..cffa9c4dc 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/MultipartBakedModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/MultipartBakedModel.kt @@ -35,9 +35,13 @@ class MultipartBakedModel( return 0xFF } - override fun singleRender(position: Vec3i, mesh: ChunkSectionMeshes, random: Random, neighbours: Array, light: Int, ambientLight: FloatArray) { + override fun singleRender(position: Vec3i, mesh: ChunkSectionMeshes, random: Random, neighbours: Array, light: Int, ambientLight: FloatArray): Boolean { + var rendered = false for (model in models) { - model.singleRender(position, mesh, random, neighbours, light, ambientLight) + if (model.singleRender(position, mesh, random, neighbours, light, ambientLight) && !rendered) { + rendered = true + } } + return rendered } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/WeightedBakedModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/WeightedBakedModel.kt index 299ac8e55..beb3c83de 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/WeightedBakedModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/WeightedBakedModel.kt @@ -60,8 +60,8 @@ class WeightedBakedModel( return getModel(random).getLight(position, random, side, lightAccessor) } - override fun singleRender(position: Vec3i, mesh: ChunkSectionMeshes, random: Random, neighbours: Array, light: Int, ambientLight: FloatArray) { - getModel(random).singleRender(position, mesh, random, neighbours, light, ambientLight) + override fun singleRender(position: Vec3i, mesh: ChunkSectionMeshes, random: Random, neighbours: Array, light: Int, ambientLight: FloatArray): Boolean { + return getModel(random).singleRender(position, mesh, random, neighbours, light, ambientLight) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/block/BakedBlockModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/block/BakedBlockModel.kt index 9fbfd4516..ea3c41448 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/block/BakedBlockModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/baked/block/BakedBlockModel.kt @@ -27,7 +27,7 @@ interface BakedBlockModel : BakedModel { fun getSize(random: Random, direction: Directions): Array // ToDo: Tint - fun singleRender(position: Vec3i, mesh: ChunkSectionMeshes, random: Random, neighbours: Array, light: Int, ambientLight: FloatArray) + fun singleRender(position: Vec3i, mesh: ChunkSectionMeshes, random: Random, neighbours: Array, light: Int, ambientLight: FloatArray): Boolean // ToDo: Get ambient light fun getLight(position: Vec3i, random: Random, side: Directions, lightAccessor: LightAccessor): Int 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 ee9c41fd0..4394285ed 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 @@ -35,8 +35,9 @@ class BakedBlockStateModel( return sizes[direction.ordinal] } - override fun singleRender(position: Vec3i, mesh: ChunkSectionMeshes, random: Random, neighbours: Array, light: Int, ambientLight: FloatArray) { + override fun singleRender(position: Vec3i, mesh: ChunkSectionMeshes, random: Random, neighbours: Array, light: Int, ambientLight: FloatArray): Boolean { val floatPosition = position.toVec3().array + var rendered = false for ((index, faces) in faces.withIndex()) { val direction = Directions.VALUES[index] val neighbour = neighbours[index]?.model @@ -50,8 +51,12 @@ class BakedBlockStateModel( continue } face.singleRender(floatPosition, mesh, light, ambientLight) + if (!rendered) { + rendered = true + } } } + return rendered } override fun greedyRender(start: Vec3i, end: Vec3i, side: Directions, mesh: ChunkSectionMesh, light: Int) {