From ce4acbe725b4b9058549fc08daeca3fa744e5749 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Wed, 24 Feb 2021 22:51:09 +0100 Subject: [PATCH] rendering: tint: change grass color according to the height --- .../minosoft/data/mappings/biomes/Biome.kt | 25 +++++++++++-------- .../gui/rendering/TintColorCalculator.kt | 5 ++-- .../gui/rendering/chunk/ChunkRenderer.kt | 2 +- .../protocol/protocol/ProtocolDefinition.java | 4 +++ 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/biomes/Biome.kt b/src/main/java/de/bixilon/minosoft/data/mappings/biomes/Biome.kt index e7ffff8e4..d6a3ec8fe 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/biomes/Biome.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/biomes/Biome.kt @@ -20,6 +20,7 @@ import de.bixilon.minosoft.data.mappings.versions.VersionMapping import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.TintColorCalculator +import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.MMath data class Biome( @@ -39,13 +40,21 @@ data class Biome( val grassColorModifier: GrassColorModifiers = GrassColorModifiers.NONE, ) : RegistryItem { - val temperatureColorMapCoordinate = ((1.0 - MMath.clamp(temperature, 0.0f, 1.0f)) * RenderConstants.COLORMAP_SIZE).toInt() - val downfallColorMapCoordinate = ((1.0 - (MMath.clamp(downfall, 0.0f, 1.0f) * MMath.clamp(temperature, 0.0f, 1.0f))) * RenderConstants.COLORMAP_SIZE).toInt() + val temperatureColorMapCoordinate = getColorMapCoordinate(temperature) + val downfallColorMapCoordinate = getColorMapCoordinate(downfall * temperature) override fun toString(): String { return resourceLocation.toString() } + private fun getColorMapCoordinate(value: Float): Int { + return ((1.0 - MMath.clamp(value, 0.0f, 1.0f)) * RenderConstants.COLORMAP_SIZE).toInt() + } + + fun getClampedTemperature(height: Int): Int { + return getColorMapCoordinate(MMath.clamp(temperature + (MMath.clamp(height - ProtocolDefinition.SEA_LEVEL_HEIGHT, 1, Int.MAX_VALUE) * ProtocolDefinition.HEIGHT_SEA_LEVEL_MODIFIER), 0f, 1f)) + } + companion object : ResourceLocationDeserializer { override fun deserialize(mappings: VersionMapping, resourceLocation: ResourceLocation, data: JsonObject): Biome { return Biome( @@ -77,15 +86,11 @@ data class Biome( } enum class GrassColorModifiers(val modifier: (color: RGBColor) -> RGBColor) { - NONE({ color: RGBColor -> - color - }), - DARK_FORREST({ color: RGBColor -> - RGBColor(color.color + 2634762 shl 8) - }), - SWAMP({ color: RGBColor -> + NONE({ color: RGBColor -> color }), + DARK_FORREST({ color: RGBColor -> RGBColor(color.color + 2634762 shl 8) }), + SWAMP({ // ToDo: Minecraft uses PerlinSimplexNoise here - color + RGBColor("#6A7039") }), } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/TintColorCalculator.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/TintColorCalculator.kt index 2f5a6118a..2634939cb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/TintColorCalculator.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/TintColorCalculator.kt @@ -17,6 +17,7 @@ import de.bixilon.minosoft.data.assets.AssetsManager import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.biomes.Biome import de.bixilon.minosoft.data.text.RGBColor +import de.bixilon.minosoft.data.world.BlockPosition class TintColorCalculator { private lateinit var grassColorMap: Array @@ -27,7 +28,7 @@ class TintColorCalculator { foliageColorMap = assetsManager.readPixelArray("minecraft/textures/colormap/foliage.png") } - fun calculateTint(tint: ResourceLocation, biome: Biome): RGBColor? { + fun calculateTint(tint: ResourceLocation, biome: Biome, position: BlockPosition): RGBColor? { return when (tint) { ResourceLocation("water_tint") -> biome.waterColor ResourceLocation("grass_tint"), ResourceLocation("sugar_cane_tint"), ResourceLocation("shearing_double_plant_tint") -> { @@ -43,7 +44,7 @@ class TintColorCalculator { biome.grassColorModifier.modifier.invoke(color) } ResourceLocation("foliage_tint") -> { - foliageColorMap[biome.downfallColorMapCoordinate shl 8 or biome.temperatureColorMapCoordinate] + foliageColorMap[biome.downfallColorMapCoordinate shl 8 or biome.getClampedTemperature(position.y)] // ToDo: hardcoded color values } ResourceLocation("lily_pad_tint") -> RenderConstants.LILY_PAD_BLOCK_COLOR else -> null diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/ChunkRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/ChunkRenderer.kt index d4fd34051..afb7472c1 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/ChunkRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/ChunkRenderer.kt @@ -101,7 +101,7 @@ class ChunkRenderer(private val connection: Connection, private val world: World biome.foliageColor?.let { tintColor = it } blockInfo.block.owner.tint?.let { tint -> - tintColor = renderWindow.tintColorCalculator.calculateTint(tint, biome) + tintColor = renderWindow.tintColorCalculator.calculateTint(tint, biome, blockPosition) } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java index 8ceb395c8..2a80c24bb 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java @@ -88,6 +88,10 @@ public final class ProtocolDefinition { public static final int TICKS_PER_SECOND = 20; public static final int TICK_TIME = 1000 / TICKS_PER_SECOND; + public static final int SEA_LEVEL_HEIGHT = 62; + + public static final float HEIGHT_SEA_LEVEL_MODIFIER = 0.00166667f; + public static final ResourceLocation DEFAULT_DIMENSION = new ResourceLocation("overworld"); public static final ResourceLocation NETHER_DIMENSION = new ResourceLocation("nether");