mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-12 17:07:55 -04:00
optimize textures, optimize section preparing
This commit is contained in:
parent
0712db8bfb
commit
ec35307a22
@ -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<BlockState?> = 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
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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),
|
||||
))
|
||||
}
|
||||
|
@ -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<BlockState?>, 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) {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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")
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user