rendering: tint: change grass color according to the height

This commit is contained in:
Bixilon 2021-02-24 22:51:09 +01:00
parent e215afb42b
commit ce4acbe725
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
4 changed files with 23 additions and 13 deletions

View File

@ -20,6 +20,7 @@ import de.bixilon.minosoft.data.mappings.versions.VersionMapping
import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.data.text.RGBColor
import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.TintColorCalculator import de.bixilon.minosoft.gui.rendering.TintColorCalculator
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.MMath import de.bixilon.minosoft.util.MMath
data class Biome( data class Biome(
@ -39,13 +40,21 @@ data class Biome(
val grassColorModifier: GrassColorModifiers = GrassColorModifiers.NONE, val grassColorModifier: GrassColorModifiers = GrassColorModifiers.NONE,
) : RegistryItem { ) : RegistryItem {
val temperatureColorMapCoordinate = ((1.0 - MMath.clamp(temperature, 0.0f, 1.0f)) * RenderConstants.COLORMAP_SIZE).toInt() val temperatureColorMapCoordinate = getColorMapCoordinate(temperature)
val downfallColorMapCoordinate = ((1.0 - (MMath.clamp(downfall, 0.0f, 1.0f) * MMath.clamp(temperature, 0.0f, 1.0f))) * RenderConstants.COLORMAP_SIZE).toInt() val downfallColorMapCoordinate = getColorMapCoordinate(downfall * temperature)
override fun toString(): String { override fun toString(): String {
return resourceLocation.toString() 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<Biome> { companion object : ResourceLocationDeserializer<Biome> {
override fun deserialize(mappings: VersionMapping, resourceLocation: ResourceLocation, data: JsonObject): Biome { override fun deserialize(mappings: VersionMapping, resourceLocation: ResourceLocation, data: JsonObject): Biome {
return Biome( return Biome(
@ -77,15 +86,11 @@ data class Biome(
} }
enum class GrassColorModifiers(val modifier: (color: RGBColor) -> RGBColor) { enum class GrassColorModifiers(val modifier: (color: RGBColor) -> RGBColor) {
NONE({ color: RGBColor -> NONE({ color: RGBColor -> color }),
color DARK_FORREST({ color: RGBColor -> RGBColor(color.color + 2634762 shl 8) }),
}), SWAMP({
DARK_FORREST({ color: RGBColor ->
RGBColor(color.color + 2634762 shl 8)
}),
SWAMP({ color: RGBColor ->
// ToDo: Minecraft uses PerlinSimplexNoise here // ToDo: Minecraft uses PerlinSimplexNoise here
color RGBColor("#6A7039")
}), }),
} }

View File

@ -17,6 +17,7 @@ import de.bixilon.minosoft.data.assets.AssetsManager
import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.ResourceLocation
import de.bixilon.minosoft.data.mappings.biomes.Biome import de.bixilon.minosoft.data.mappings.biomes.Biome
import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.data.text.RGBColor
import de.bixilon.minosoft.data.world.BlockPosition
class TintColorCalculator { class TintColorCalculator {
private lateinit var grassColorMap: Array<RGBColor> private lateinit var grassColorMap: Array<RGBColor>
@ -27,7 +28,7 @@ class TintColorCalculator {
foliageColorMap = assetsManager.readPixelArray("minecraft/textures/colormap/foliage.png") 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) { return when (tint) {
ResourceLocation("water_tint") -> biome.waterColor ResourceLocation("water_tint") -> biome.waterColor
ResourceLocation("grass_tint"), ResourceLocation("sugar_cane_tint"), ResourceLocation("shearing_double_plant_tint") -> { ResourceLocation("grass_tint"), ResourceLocation("sugar_cane_tint"), ResourceLocation("shearing_double_plant_tint") -> {
@ -43,7 +44,7 @@ class TintColorCalculator {
biome.grassColorModifier.modifier.invoke(color) biome.grassColorModifier.modifier.invoke(color)
} }
ResourceLocation("foliage_tint") -> { 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 ResourceLocation("lily_pad_tint") -> RenderConstants.LILY_PAD_BLOCK_COLOR
else -> null else -> null

View File

@ -101,7 +101,7 @@ class ChunkRenderer(private val connection: Connection, private val world: World
biome.foliageColor?.let { tintColor = it } biome.foliageColor?.let { tintColor = it }
blockInfo.block.owner.tint?.let { tint -> blockInfo.block.owner.tint?.let { tint ->
tintColor = renderWindow.tintColorCalculator.calculateTint(tint, biome) tintColor = renderWindow.tintColorCalculator.calculateTint(tint, biome, blockPosition)
} }
} }

View File

@ -88,6 +88,10 @@ public final class ProtocolDefinition {
public static final int TICKS_PER_SECOND = 20; public static final int TICKS_PER_SECOND = 20;
public static final int TICK_TIME = 1000 / TICKS_PER_SECOND; 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 DEFAULT_DIMENSION = new ResourceLocation("overworld");
public static final ResourceLocation NETHER_DIMENSION = new ResourceLocation("nether"); public static final ResourceLocation NETHER_DIMENSION = new ResourceLocation("nether");