move tints, make Shades an enum

That should improve performance
This commit is contained in:
Moritz Zwerger 2023-10-10 20:33:05 +02:00
parent 77181c381d
commit 8838e480b1
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
16 changed files with 179 additions and 36 deletions

View File

@ -13,24 +13,22 @@
package de.bixilon.minosoft.gui.rendering.models.block.state.baked
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.minosoft.data.direction.Directions
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
import de.bixilon.minosoft.gui.rendering.chunk.mesh.ChunkMesh
import de.bixilon.minosoft.gui.rendering.chunk.mesh.SingleChunkMesh
import de.bixilon.minosoft.gui.rendering.chunk.mesher.SolidSectionMesher.Companion.SELF_LIGHT_INDEX
import de.bixilon.minosoft.gui.rendering.models.block.element.FaceVertexData
import de.bixilon.minosoft.gui.rendering.models.block.state.baked.BakingUtil.shade
import de.bixilon.minosoft.gui.rendering.models.block.state.baked.Shades.Companion.shade
import de.bixilon.minosoft.gui.rendering.models.block.state.baked.cull.side.FaceProperties
import de.bixilon.minosoft.gui.rendering.system.base.MeshUtil.buffer
import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureTransparencies
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.Texture
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.rgb
import de.bixilon.minosoft.gui.rendering.tint.TintUtil
class BakedFace(
val positions: FaceVertexData,
val uv: FaceVertexData,
val shade: Float,
val shade: Shades,
val tintIndex: Int,
cull: Directions?,
val texture: Texture,
@ -42,13 +40,8 @@ class BakedFace(
constructor(positions: FaceVertexData, uv: FaceVertexData, tintIndex: Int, texture: Texture, direction: Directions, properties: FaceProperties?) : this(positions, uv, direction.shade, tintIndex, if (properties == null) null else direction, texture, properties)
private fun color(tint: Int): Int {
val color = Vec3(this.shade)
if (tint > 0) {
color.r *= (tint shr 16) / RGBColor.COLOR_FLOAT_DIVIDER
color.g *= ((tint shr 8) and 0xFF) / RGBColor.COLOR_FLOAT_DIVIDER
color.b *= (tint and 0xFF) / RGBColor.COLOR_FLOAT_DIVIDER
}
return color.rgb
if (tint <= 0) return shade.color
return TintUtil.calculateTint(tint, shade)
}
fun render(offset: FloatArray, mesh: ChunkMesh, light: ByteArray, tints: IntArray?) {

View File

@ -97,13 +97,4 @@ object BakingUtil {
return target
}
val Directions.shade: Float
get() = when (this) {
Directions.UP -> 1.0f
Directions.DOWN -> 0.5f
Directions.NORTH, Directions.SOUTH -> 0.8f
Directions.WEST, Directions.EAST -> 0.6f
}
}

View File

@ -0,0 +1,45 @@
/*
* Minosoft
* Copyright (C) 2020-2023 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.models.block.state.baked
import de.bixilon.minosoft.data.direction.Directions
enum class Shades(val shade: Float) {
DOWN(0.5f),
UP(1.0f),
X(0.6f),
Z(0.8f),
;
val color = color()
private fun color(): Int {
val int = (shade * 255).toInt()
return (int shl 16) or (int shl 8) or int
}
companion object {
val Directions.shade: Shades
get() = when (this) {
Directions.DOWN -> DOWN
Directions.UP -> UP
Directions.NORTH, Directions.SOUTH -> Z
Directions.WEST, Directions.EAST -> X
}
}
}

View File

@ -21,7 +21,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureTransparenci
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.Texture
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture
import de.bixilon.minosoft.gui.rendering.tint.TintProvider
import de.bixilon.minosoft.gui.rendering.tint.WaterTintProvider
import de.bixilon.minosoft.gui.rendering.tint.tints.WaterTintProvider
class WaterFluidModel : FluidModel {
override val tint: TintProvider = WaterTintProvider

View File

@ -15,6 +15,7 @@ package de.bixilon.minosoft.gui.rendering.tint
import de.bixilon.minosoft.data.registries.blocks.MinecraftBlocks
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
import de.bixilon.minosoft.gui.rendering.tint.tints.*
@Deprecated("directly in integrated registries")
object DefaultTints {

View File

@ -23,6 +23,8 @@ import de.bixilon.minosoft.data.registries.fluid.Fluid
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
import de.bixilon.minosoft.data.text.formatting.color.RGBColor.Companion.asRGBColor
import de.bixilon.minosoft.data.world.chunk.chunk.Chunk
import de.bixilon.minosoft.gui.rendering.tint.tints.FoliageTintCalculator
import de.bixilon.minosoft.gui.rendering.tint.tints.GrassTintCalculator
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
class TintManager(val connection: PlayConnection) {

View File

@ -0,0 +1,50 @@
/*
* Minosoft
* Copyright (C) 2020-2023 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.tint
import de.bixilon.kutil.exception.Broken
import de.bixilon.minosoft.gui.rendering.models.block.state.baked.Shades
object TintUtil {
fun calculateTint(tint: Int, shade: Shades): Int {
if (shade == Shades.UP) return tint
var red = (tint shr 16) and 0xFF
var green = (tint shr 8) and 0xFF
var blue = tint and 0xFF
when (shade) {
Shades.UP -> Broken()
Shades.DOWN -> {
red /= 2; green /= 2; blue /= 2
}
Shades.Z -> {
red = 4 * red / 5
green = 4 * green / 5
blue = 4 * blue / 5
}
Shades.X -> {
red = 3 * red / 5
green = 3 * green / 5
blue = 3 * blue / 5
}
}
return (red shl 16) or (green shl 8) or blue
}
}

View File

@ -11,24 +11,23 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.tint
package de.bixilon.minosoft.gui.rendering.tint.tints
import de.bixilon.kutil.exception.ExceptionUtil.ignoreAll
import de.bixilon.kutil.exception.ExceptionUtil
import de.bixilon.minosoft.assets.AssetsManager
import de.bixilon.minosoft.assets.util.InputStreamUtil.readRGBArray
import de.bixilon.minosoft.data.container.stack.ItemStack
import de.bixilon.minosoft.data.registries.biomes.Biome
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture
import de.bixilon.minosoft.gui.rendering.tint.TintProvider
import de.bixilon.minosoft.util.KUtil.toResourceLocation
private const val FALLBACK_COLOR = 0x48B518
class FoliageTintCalculator : TintProvider {
private lateinit var colorMap: IntArray
fun init(assetsManager: AssetsManager) {
colorMap = ignoreAll { assetsManager["minecraft:colormap/foliage".toResourceLocation().texture()].readRGBArray() } ?: IntArray(256)
colorMap = ExceptionUtil.ignoreAll { assetsManager["minecraft:colormap/foliage".toResourceLocation().texture()].readRGBArray() } ?: IntArray(256)
}
fun getBlockColor(biome: Biome?, y: Int): Int {
@ -50,4 +49,8 @@ class FoliageTintCalculator : TintProvider {
override fun getItemColor(stack: ItemStack, tintIndex: Int): Int {
return FALLBACK_COLOR
}
companion object {
private const val FALLBACK_COLOR = 0x48B518
}
}

View File

@ -11,9 +11,9 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.tint
package de.bixilon.minosoft.gui.rendering.tint.tints
import de.bixilon.kutil.exception.ExceptionUtil.ignoreAll
import de.bixilon.kutil.exception.ExceptionUtil
import de.bixilon.minosoft.assets.AssetsManager
import de.bixilon.minosoft.assets.util.InputStreamUtil.readRGBArray
import de.bixilon.minosoft.data.registries.biomes.Biome
@ -22,13 +22,14 @@ import de.bixilon.minosoft.data.registries.blocks.MinecraftBlocks
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
import de.bixilon.minosoft.data.text.formatting.color.Colors
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture
import de.bixilon.minosoft.gui.rendering.tint.TintProvider
import de.bixilon.minosoft.util.KUtil.toResourceLocation
class GrassTintCalculator : TintProvider {
private lateinit var colorMap: IntArray
fun init(assetsManager: AssetsManager) {
colorMap = ignoreAll { assetsManager["minecraft:colormap/grass".toResourceLocation().texture()].readRGBArray() } ?: IntArray(256)
colorMap = ExceptionUtil.ignoreAll { assetsManager["minecraft:colormap/grass".toResourceLocation().texture()].readRGBArray() } ?: IntArray(256)
}
inline fun getColor(downfall: Int, temperature: Int): Int {

View File

@ -11,7 +11,7 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.tint
package de.bixilon.minosoft.gui.rendering.tint.tints
import de.bixilon.kotlinglm.func.common.clamp
import de.bixilon.kutil.primitive.IntUtil.toInt
@ -20,6 +20,7 @@ import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
import de.bixilon.minosoft.data.registries.blocks.state.PropertyBlockState
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
import de.bixilon.minosoft.gui.rendering.tint.TintProvider
object RedstoneWireTintCalculator : TintProvider {
private val COLORS = IntArray(16) {

View File

@ -11,11 +11,12 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.tint
package de.bixilon.minosoft.gui.rendering.tint.tints
import de.bixilon.minosoft.data.container.stack.ItemStack
import de.bixilon.minosoft.data.registries.biomes.Biome
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
import de.bixilon.minosoft.gui.rendering.tint.TintProvider
class StaticTintProvider(val block: Int, val item: Int = block, val particle: Int = block) : TintProvider {

View File

@ -11,13 +11,14 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.tint
package de.bixilon.minosoft.gui.rendering.tint.tints
import de.bixilon.kutil.primitive.IntUtil.toInt
import de.bixilon.minosoft.data.registries.biomes.Biome
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
import de.bixilon.minosoft.data.registries.blocks.state.PropertyBlockState
import de.bixilon.minosoft.gui.rendering.tint.TintProvider
object StemTintCalculator : TintProvider {

View File

@ -11,12 +11,13 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.tint
package de.bixilon.minosoft.gui.rendering.tint.tints
import de.bixilon.minosoft.data.container.stack.ItemStack
import de.bixilon.minosoft.data.registries.biomes.Biome
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
import de.bixilon.minosoft.data.text.formatting.color.Colors
import de.bixilon.minosoft.gui.rendering.tint.TintProvider
class SugarCaneTintCalculator(val grassTintCalculator: GrassTintCalculator) : TintProvider {

View File

@ -11,10 +11,11 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.tint
package de.bixilon.minosoft.gui.rendering.tint.tints
import de.bixilon.minosoft.data.registries.biomes.Biome
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
import de.bixilon.minosoft.gui.rendering.tint.TintProvider
class TallGrassTintCalculator(val grassTintCalculator: GrassTintCalculator) : TintProvider {

View File

@ -11,11 +11,12 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.tint
package de.bixilon.minosoft.gui.rendering.tint.tints
import de.bixilon.minosoft.data.registries.biomes.Biome
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
import de.bixilon.minosoft.data.registries.fluid.Fluid
import de.bixilon.minosoft.gui.rendering.tint.TintProvider
object WaterTintProvider : TintProvider {

View File

@ -0,0 +1,51 @@
/*
* Minosoft
* Copyright (C) 2020-2023 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.tint
import de.bixilon.minosoft.gui.rendering.models.block.state.baked.Shades
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class TintUtilTest {
@Test
fun `calculate white up`() {
val color = TintUtil.calculateTint(0xFFFFFF, Shades.UP)
assertEquals(color, 0xFFFFFF)
}
@Test
fun `calculate random color up`() {
val color = TintUtil.calculateTint(0x123456, Shades.UP)
assertEquals(color, 0x123456)
}
@Test
fun `calculate white down`() {
val color = TintUtil.calculateTint(0xFFFFFF, Shades.DOWN)
assertEquals(color, 0x7F7F7F)
}
@Test
fun `calculate white x`() {
val color = TintUtil.calculateTint(0xFFFFFF, Shades.X)
assertEquals(color, 0x999999)
}
@Test
fun `calculate white z`() {
val color = TintUtil.calculateTint(0xFFFFFF, Shades.Z)
assertEquals(color, 0xCCCCCC)
}
}