dynamic textures: allow 64x32 textures, growing

This commit is contained in:
Bixilon 2022-05-02 23:06:04 +02:00
parent 942a1a8787
commit 67d6d8fb14
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
3 changed files with 44 additions and 7 deletions

View File

@ -13,6 +13,7 @@
package de.bixilon.minosoft.data.entities.block package de.bixilon.minosoft.data.entities.block
import de.bixilon.kutil.primitive.IntUtil.toInt
import de.bixilon.minosoft.data.colors.DyeColors import de.bixilon.minosoft.data.colors.DyeColors
import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
@ -23,7 +24,7 @@ class BedBlockEntity(connection: PlayConnection) : BlockEntity(connection) {
override fun updateNBT(nbt: Map<String, Any>) { override fun updateNBT(nbt: Map<String, Any>) {
color = DyeColors.RED // ToDo color = DyeColors.getOrNull(nbt["color"]?.toInt()) ?: DyeColors.RED
} }
companion object : BlockEntityFactory<BedBlockEntity> { companion object : BlockEntityFactory<BedBlockEntity> {

View File

@ -15,6 +15,7 @@ package de.bixilon.minosoft.gui.rendering.system.opengl.texture.dynamic
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTexture import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTexture
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureState import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureState
import java.nio.ByteBuffer
import java.util.* import java.util.*
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
@ -22,6 +23,7 @@ class OpenGLDynamicTexture(
override val uuid: UUID, override val uuid: UUID,
shaderId: Int, shaderId: Int,
) : DynamicTexture { ) : DynamicTexture {
var data: Array<ByteBuffer>? = null
override var onStateChange: (() -> Unit)? = null override var onStateChange: (() -> Unit)? = null
override val usages = AtomicInteger() override val usages = AtomicInteger()
override var state: DynamicTextureState = DynamicTextureState.WAITING override var state: DynamicTextureState = DynamicTextureState.WAITING

View File

@ -22,6 +22,9 @@ import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicText
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureArray import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureArray
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureState import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureState
import de.bixilon.minosoft.gui.rendering.system.opengl.texture.OpenGLTextureUtil import de.bixilon.minosoft.gui.rendering.system.opengl.texture.OpenGLTextureUtil
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import org.lwjgl.opengl.GL11.* import org.lwjgl.opengl.GL11.*
import org.lwjgl.opengl.GL12.glTexImage3D import org.lwjgl.opengl.GL12.glTexImage3D
import org.lwjgl.opengl.GL12.glTexSubImage3D import org.lwjgl.opengl.GL12.glTexSubImage3D
@ -35,11 +38,12 @@ import java.util.*
class OpenGLDynamicTextureArray( class OpenGLDynamicTextureArray(
val renderWindow: RenderWindow, val renderWindow: RenderWindow,
val index: Int = 7, val index: Int = 7,
initialSize: Int = 32, val initialSize: Int = 32,
val resolution: Int, val resolution: Int,
) : DynamicTextureArray { ) : DynamicTextureArray {
private val textures: Array<WeakReference<OpenGLDynamicTexture>?> = arrayOfNulls(initialSize) private var textures: Array<WeakReference<OpenGLDynamicTexture>?> = arrayOfNulls(initialSize)
private var textureId = -1 private var textureId = -1
var shaders: MutableSet<Shader> = mutableSetOf()
override val size: Int override val size: Int
get() { get() {
@ -82,12 +86,18 @@ class OpenGLDynamicTextureArray(
val texture = OpenGLDynamicTexture(identifier, createShaderIdentifier(index = index)) val texture = OpenGLDynamicTexture(identifier, createShaderIdentifier(index = index))
textures[index] = WeakReference(texture) textures[index] = WeakReference(texture)
texture.state = DynamicTextureState.LOADING texture.state = DynamicTextureState.LOADING
DefaultThreadPool += { DefaultThreadPool += add@{
val bytes = data() val bytes = data()
check(bytes.limit() == resolution * resolution * 4) { "Texture must have a size of ${resolution}x${resolution}" } if (bytes.limit() > resolution * resolution * 4 || bytes.limit() < resolution * 4) { // allow anything in 1..resolution for y size
Log.log(LogMessageType.ASSETS, LogLevels.WARN) { "Dynamic texture $texture, has not a size of ${resolution}x${resolution}!" }
textures[index] = null
texture.state = DynamicTextureState.UNLOADED
return@add
}
val mipmaps = OpenGLTextureUtil.generateMipMaps(bytes, Vec2i(resolution, resolution)) val mipmaps = OpenGLTextureUtil.generateMipMaps(bytes, Vec2i(resolution, bytes.limit() / 4 / resolution))
texture.data = mipmaps
renderWindow.queue += { load(texture, index, mipmaps) } renderWindow.queue += { load(texture, index, mipmaps) }
} }
return texture return texture
@ -117,6 +127,11 @@ class OpenGLDynamicTextureArray(
} }
override fun use(shader: Shader, name: String) { override fun use(shader: Shader, name: String) {
shaders += shader
_use(shader, name)
}
private fun _use(shader: Shader, name: String = "uTextures") {
shader.use() shader.use()
activate() activate()
@ -135,8 +150,27 @@ class OpenGLDynamicTextureArray(
return nextIndex return nextIndex
} }
private fun reload() {
glDeleteTextures(textureId)
load(CountUpAndDownLatch(0))
for ((index, textureReference) in textures.withIndex()) {
val texture = textureReference?.get() ?: continue
load(texture, index, texture.data ?: continue)
}
for (shader in shaders) {
_use(shader)
}
}
private fun grow() { private fun grow() {
TODO() val textures: Array<WeakReference<OpenGLDynamicTexture>?> = arrayOfNulls(textures.size + initialSize)
for ((index, texture) in this.textures.withIndex()) {
textures[index] = texture
}
this.textures = textures
renderWindow.queue += { reload() }
} }
private fun cleanup() { private fun cleanup() {