mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-15 10:25:06 -04:00
move tints, make Shades an enum
That should improve performance
This commit is contained in:
parent
77181c381d
commit
8838e480b1
@ -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?) {
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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 {
|
@ -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) {
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user