option to disable mipmap generation

This commit is contained in:
Bixilon 2022-01-03 02:35:26 +01:00
parent 61a0d6e655
commit ea45a04b9b
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
8 changed files with 25 additions and 8 deletions

View File

@ -36,7 +36,7 @@ class BitmapFontProvider(
init {
val charRows = data["chars"].asJsonList()
val texture = renderWindow.textureManager.staticTextures.createTexture(data["file"].toResourceLocation().texture())
val texture = renderWindow.textureManager.staticTextures.createTexture(data["file"].toResourceLocation().texture(), mipmaps = false)
texture.load(renderWindow.connection.assetsManager)
val height = texture.size.y / charRows.size

View File

@ -41,7 +41,7 @@ class LegacyUnicodeFontProvider(
char += UNICODE_PAGE_SIZE
continue
}
val texture = renderWindow.textureManager.staticTextures.createTexture(template.format("%02x".format(page)).toResourceLocation().texture())
val texture = renderWindow.textureManager.staticTextures.createTexture(template.format("%02x".format(page)).toResourceLocation().texture(), mipmaps = false)
for (y in 0 until UNICODE_PAGE_SIZE / CHAR_SIZE) {
val yStart = PIXEL.y * y * CHAR_SIZE
val yEnd = PIXEL.y * (y + 1) * CHAR_SIZE

View File

@ -23,7 +23,7 @@ interface TextureArray {
val state: TextureArrayStates
operator fun get(resourceLocation: ResourceLocation): AbstractTexture?
fun createTexture(resourceLocation: ResourceLocation, default: () -> AbstractTexture = { PNGTexture(resourceLocation) }): AbstractTexture
fun createTexture(resourceLocation: ResourceLocation, mipmaps: Boolean = true, default: () -> AbstractTexture = { PNGTexture(resourceLocation, generateMipMaps = mipmaps) }): AbstractTexture
fun preLoad()

View File

@ -38,6 +38,7 @@ interface AbstractTexture {
var renderData: TextureRenderData
var data: ByteBuffer?
val generateMipMaps: Boolean
fun load(assetsManager: AssetsManager)
@ -48,6 +49,9 @@ interface AbstractTexture {
var data = data!!
images += data
if (!generateMipMaps) {
return images.toTypedArray()
}
for (i in 1 until OpenGLTextureArray.MAX_MIPMAP_LEVELS) {
val mipMapSize = Vec2i(size.x shr i, size.y shr i)

View File

@ -29,6 +29,7 @@ class MemoryTexture(
override val resourceLocation: ResourceLocation,
override val size: Vec2i,
override var properties: ImageProperties = ImageProperties(),
override val generateMipMaps: Boolean = true,
generator: ((x: Int, y: Int) -> RGBColor)? = null,
) : AbstractTexture {
override lateinit var textureArrayUV: Vec2

View File

@ -29,7 +29,10 @@ import java.nio.ByteBuffer
import javax.imageio.ImageIO
class PNGTexture(override val resourceLocation: ResourceLocation) : AbstractTexture {
class PNGTexture(
override val resourceLocation: ResourceLocation,
override val generateMipMaps: Boolean = true,
) : AbstractTexture {
override lateinit var renderData: TextureRenderData
override lateinit var textureArrayUV: Vec2

View File

@ -30,6 +30,8 @@ class SpriteTexture(private val original: AbstractTexture) : AbstractTexture {
override var properties: ImageProperties by original::properties
override var renderData: TextureRenderData by original::renderData
override val transparency: TextureTransparencies by original::transparency
override val generateMipMaps: Boolean
get() = original.generateMipMaps
override var state: TextureStates = TextureStates.DECLARED
private set

View File

@ -51,7 +51,7 @@ class OpenGLTextureArray(
private val lastTextureId = IntArray(TEXTURE_RESOLUTION_ID_MAP.size)
override fun createTexture(resourceLocation: ResourceLocation, default: () -> AbstractTexture): AbstractTexture {
override fun createTexture(resourceLocation: ResourceLocation, mipmaps: Boolean, default: () -> AbstractTexture): AbstractTexture {
var texture = textures[resourceLocation]
// load .mcmeta
@ -136,7 +136,7 @@ class OpenGLTextureArray(
@Synchronized
private fun loadSingleArray(resolution: Int, textures: MutableList<AbstractTexture>): Int {
private fun loadSingleArray(resolution: Int, textures: List<AbstractTexture>): Int {
val textureId = glGenTextures()
glBindTexture(GL_TEXTURE_2D_ARRAY, textureId)
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT)
@ -155,8 +155,15 @@ class OpenGLTextureArray(
val renderData = texture.renderData as OpenGLTextureData
for ((level, data) in mipMaps.withIndex()) {
val size = texture.size shr level
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, level, 0, 0, renderData.index, size.x, size.y, level + 1, GL_RGBA, GL_UNSIGNED_BYTE, data)
if (texture.generateMipMaps) {
val size = texture.size shr level
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, level, 0, 0, renderData.index, size.x, size.y, level + 1, GL_RGBA, GL_UNSIGNED_BYTE, data)
} else {
val size = texture.size
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, level, 0, 0, renderData.index, size.x, size.y, level + 1, GL_RGBA, GL_UNSIGNED_BYTE, mipMaps[0])
}
}
texture.data = null