From 5685243443f7e2db9507d15b569057142be74f21 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 1 Dec 2020 17:50:47 +0900 Subject: [PATCH] light whitewash version 1 --- .../terrarum/blockproperties/BlockCodex.kt | 16 ++-- .../terrarum/blockproperties/BlockPropUtil.kt | 4 +- .../console/SetGlobalLightOverride.kt | 2 +- .../gameactors/ActorHumanoid.kt | 16 ++-- .../terrarum/worlddrawer/BlocksDrawerNew.kt | 2 - .../terrarum/worlddrawer/LightmapHDRMap.kt | 1 + .../worlddrawer/LightmapRendererNew.kt | 83 ++++++++----------- 7 files changed, 53 insertions(+), 71 deletions(-) diff --git a/src/net/torvald/terrarum/blockproperties/BlockCodex.kt b/src/net/torvald/terrarum/blockproperties/BlockCodex.kt index 07d5e54c4..16a0cbb12 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockCodex.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockCodex.kt @@ -134,19 +134,19 @@ object BlockCodex { prop.id = if (key == -1) 0 else intVal(record, "id") prop.drop = intVal(record, "drop") - prop.shadeColR = floatVal(record, "shdr") / LightmapRenderer.MUL_FLOAT - prop.shadeColG = floatVal(record, "shdg") / LightmapRenderer.MUL_FLOAT - prop.shadeColB = floatVal(record, "shdb") / LightmapRenderer.MUL_FLOAT - prop.shadeColA = floatVal(record, "shduv") / LightmapRenderer.MUL_FLOAT + prop.shadeColR = floatVal(record, "shdr") + prop.shadeColG = floatVal(record, "shdg") + prop.shadeColB = floatVal(record, "shdb") + prop.shadeColA = floatVal(record, "shduv") prop.opacity = Cvec(prop.shadeColR, prop.shadeColG, prop.shadeColB, prop.shadeColA) prop.strength = intVal(record, "str") prop.density = intVal(record, "dsty") - prop.baseLumColR = floatVal(record, "lumr") / LightmapRenderer.MUL_FLOAT - prop.baseLumColG = floatVal(record, "lumg") / LightmapRenderer.MUL_FLOAT - prop.baseLumColB = floatVal(record, "lumb") / LightmapRenderer.MUL_FLOAT - prop.baseLumColA = floatVal(record, "lumuv") / LightmapRenderer.MUL_FLOAT + prop.baseLumColR = floatVal(record, "lumr") + prop.baseLumColG = floatVal(record, "lumg") + prop.baseLumColB = floatVal(record, "lumb") + prop.baseLumColA = floatVal(record, "lumuv") prop.baseLumCol.set(prop.baseLumColR, prop.baseLumColG, prop.baseLumColB, prop.baseLumColA) prop.friction = intVal(record, "fr") diff --git a/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt b/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt index 5ec5626fb..ae6ec8a38 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt @@ -111,8 +111,8 @@ object BlockPropUtil { private fun getDynamicLumFunc(prop: BlockProp): Cvec { return when (prop.dynamicLuminosityFunction) { 1 -> getTorchFlicker(prop) - 2 -> (Terrarum.ingame!!.world).globalLight.cpy().mul(LightmapRenderer.DIV_FLOAT) // current global light - 3 -> WeatherMixer.getGlobalLightOfTime(Terrarum.ingame!!.world, WorldTime.DAY_LENGTH / 2).cpy().mul(LightmapRenderer.DIV_FLOAT) // daylight at noon + 2 -> (Terrarum.ingame!!.world).globalLight.cpy() // current global light + 3 -> WeatherMixer.getGlobalLightOfTime(Terrarum.ingame!!.world, WorldTime.DAY_LENGTH / 2).cpy() // daylight at noon 4 -> getSlowBreath(prop) 5 -> getPulsate(prop) else -> prop.baseLumCol diff --git a/src/net/torvald/terrarum/console/SetGlobalLightOverride.kt b/src/net/torvald/terrarum/console/SetGlobalLightOverride.kt index c7914017b..ce722fb8f 100644 --- a/src/net/torvald/terrarum/console/SetGlobalLightOverride.kt +++ b/src/net/torvald/terrarum/console/SetGlobalLightOverride.kt @@ -26,7 +26,7 @@ internal object SetGlobalLightOverride : ConsoleCommand { Echo("Wrong number input.") } catch (e1: IllegalArgumentException) { - Echo("Range: 0-" + LightmapRenderer.CHANNEL_MAX + " per channel") + Echo("Range: 0.0-1.0+ per channel") } } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt index 6bbb27d84..c7d9346b2 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt @@ -68,16 +68,16 @@ open class ActorHumanoid( override var color: Cvec get() = Cvec( - (actorValue.getAsFloat(AVKey.LUMR) ?: 0f) / LightmapRenderer.MUL_FLOAT, - (actorValue.getAsFloat(AVKey.LUMG) ?: 0f) / LightmapRenderer.MUL_FLOAT, - (actorValue.getAsFloat(AVKey.LUMB) ?: 0f) / LightmapRenderer.MUL_FLOAT, - (actorValue.getAsFloat(AVKey.LUMA) ?: 0f) / LightmapRenderer.MUL_FLOAT + (actorValue.getAsFloat(AVKey.LUMR) ?: 0f), + (actorValue.getAsFloat(AVKey.LUMG) ?: 0f), + (actorValue.getAsFloat(AVKey.LUMB) ?: 0f), + (actorValue.getAsFloat(AVKey.LUMA) ?: 0f) ) set(value) { - actorValue[AVKey.LUMR] = value.r * LightmapRenderer.MUL_FLOAT - actorValue[AVKey.LUMG] = value.g * LightmapRenderer.MUL_FLOAT - actorValue[AVKey.LUMB] = value.b * LightmapRenderer.MUL_FLOAT - actorValue[AVKey.LUMA] = value.a * LightmapRenderer.MUL_FLOAT + actorValue[AVKey.LUMR] = value.r + actorValue[AVKey.LUMG] = value.g + actorValue[AVKey.LUMB] = value.b + actorValue[AVKey.LUMA] = value.a } /** diff --git a/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt b/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt index 7d9f3aa79..925b6ac61 100644 --- a/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt +++ b/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt @@ -266,8 +266,6 @@ internal object BlocksDrawer { } } - private val tileDrawLightThreshold = 2f / LightmapRenderer.MUL - /** * Turns bitmask-with-single-bit-set into its bit index. The LSB is counted as 1, and thus the index starts at one. * @return 0 -> -1, 1 -> 0, 2 -> 1, 4 -> 2, 8 -> 3, 16 -> 4, ... diff --git a/src/net/torvald/terrarum/worlddrawer/LightmapHDRMap.kt b/src/net/torvald/terrarum/worlddrawer/LightmapHDRMap.kt index 67dbcdf6b..64644c302 100644 --- a/src/net/torvald/terrarum/worlddrawer/LightmapHDRMap.kt +++ b/src/net/torvald/terrarum/worlddrawer/LightmapHDRMap.kt @@ -89,6 +89,7 @@ internal object LightmapHDRMap : Disposable { inline operator fun get(index: Int) = ptr.getFloat(4L * index) val lastIndex = THE_LUT.lastIndex + val size = lastIndex + 1 override fun dispose() { ptr.destroy() diff --git a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt index 9b1bf6af3..63628f63b 100644 --- a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt +++ b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt @@ -94,16 +94,6 @@ object LightmapRenderer { const val DRAW_TILE_SIZE: Float = CreateTileAtlas.TILE_SIZE / IngameRenderer.lightmapDownsample - // color model related constants - const val MUL = 1024 // modify this to 1024 to implement 30-bit RGB - const val CHANNEL_MAX_DECIMAL = 1f - const val MUL_2 = MUL * MUL - const val CHANNEL_MAX = MUL - 1 - const val CHANNEL_MAX_FLOAT = CHANNEL_MAX.toFloat() - const val COLOUR_RANGE_SIZE = MUL * MUL_2 - const val MUL_FLOAT = MUL / 256f - const val DIV_FLOAT = 256f / MUL - internal var for_x_start = 0 internal var for_y_start = 0 internal var for_x_end = 0 @@ -140,10 +130,10 @@ object LightmapRenderer { val y = y.convY() Cvec( - lightmap.getR(x, y) * MUL_FLOAT, - lightmap.getG(x, y) * MUL_FLOAT, - lightmap.getB(x, y) * MUL_FLOAT, - lightmap.getA(x, y) * MUL_FLOAT + lightmap.getR(x, y), + lightmap.getG(x, y), + lightmap.getB(x, y), + lightmap.getA(x, y) ) } } @@ -199,7 +189,7 @@ object LightmapRenderer { */ // set sunlight - sunLight.set(world.globalLight); sunLight.mul(DIV_FLOAT) + sunLight.set(world.globalLight) // set no-op mask from solidity of the block /*AppLoader.measureDebugTime("Renderer.LightNoOpMask") { @@ -722,37 +712,30 @@ object LightmapRenderer { val red = lightmap.getR(arrayX, arrayY) val grn = lightmap.getG(arrayX, arrayY) val blu = lightmap.getB(arrayX, arrayY) - val redw = (red - 1f) * (7f / 24f) - val grnw = (grn - 1f) - val bluw = (blu - 1f) * (7f / 72f) + val uvl = lightmap.getA(arrayX, arrayY) + val redw = (red.sqrt() - 1f) * (7f / 24f) + val grnw = (grn.sqrt() - 1f) + val bluw = (blu.sqrt() - 1f) * (7f / 72f) + val bluwv = (blu.sqrt() - 1f) * (1f / 50f) + val uvlwr = (uvl.sqrt() - 1f) * (1f / 13f) + val uvlwg = (uvl.sqrt() - 1f) * (1f / 10f) + val uvlwb = (uvl.sqrt() - 1f) * (1f / 8f) val color = if (solidMultMagic == null) lightBuffer.drawPixel( x - this_x_start, - lightBuffer.height - 1 - y + this_y_start, + lightBuffer.height - 1 - y + this_y_start, // flip Y 0 - ) // flip Y + ) else lightBuffer.drawPixel( x - this_x_start, - lightBuffer.height - 1 - y + this_y_start, - (maxOf(red, grnw, bluw) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(24) or - (maxOf(redw, grn, bluw) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(16) or - (maxOf(redw, grnw, blu) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(8) or - (lightmap.getA(arrayX, arrayY) * solidMultMagic).hdnorm().times(255f).roundToInt() - ) // flip Y - - - /*Color( - maxOf(red, grnw, bluw) * solidMultMagic, - maxOf(redw, grn, bluw) * solidMultMagic, - maxOf(redw, grnw, blu) * solidMultMagic, - lightmap.getA(arrayX, arrayY) * solidMultMagic - ).normaliseToHDR() - - lightBuffer.setColor(color)*/ - - + lightBuffer.height - 1 - y + this_y_start, // flip Y + (maxOf(red,grnw,bluw,uvlwr) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(24) or + (maxOf(redw,grn,bluw,uvlwg) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(16) or + (maxOf(redw,grnw,blu,uvlwb) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(8) or + (maxOf(bluwv,uvl) * solidMultMagic).hdnorm().times(255f).roundToInt() + ) } } @@ -783,7 +766,7 @@ object LightmapRenderer { _mapThisTileOpacity2.destroy() } - private const val lightScalingMagic = 8f + private const val lightScalingMagic = 2f /** * Subtract each channel's RGB value. @@ -828,12 +811,12 @@ object LightmapRenderer { // input: 0..1 for int 0..1023 fun hdr(intensity: Float): Float { - val intervalStart = (intensity * CHANNEL_MAX).floorInt() - val intervalEnd = (intensity * CHANNEL_MAX).floorInt() + 1 + val intervalStart = (intensity / 4f * LightmapHDRMap.size).floorInt() + val intervalEnd = (intensity / 4f * LightmapHDRMap.size).floorInt() + 1 if (intervalStart == intervalEnd) return LightmapHDRMap[intervalStart] - val intervalPos = (intensity * CHANNEL_MAX) - (intensity * CHANNEL_MAX).toInt() + val intervalPos = (intensity / 4f * LightmapHDRMap.size) - (intensity / 4f * LightmapHDRMap.size).toInt() val ret = interpolateLinear( intervalPos, @@ -895,10 +878,10 @@ object LightmapRenderer { val histogram: Histogram get() { - val reds = IntArray(MUL) // reds[intensity] ← counts - val greens = IntArray(MUL) // do. - val blues = IntArray(MUL) // do. - val uvs = IntArray(MUL) + val reds = IntArray(256) // reds[intensity] ← counts + val greens = IntArray(256) // do. + val blues = IntArray(256) // do. + val uvs = IntArray(256) val render_width = for_x_end - for_x_start val render_height = for_y_end - for_y_start // excluiding overscans; only reckon echo lights @@ -924,7 +907,7 @@ object LightmapRenderer { val brightest: Int get() { - for (i in CHANNEL_MAX downTo 1) { + for (i in 255 downTo 1) { if (reds[i] > 0 || greens[i] > 0 || blues[i] > 0) return i } @@ -938,14 +921,14 @@ object LightmapRenderer { val dimmest: Int get() { - for (i in 0..CHANNEL_MAX) { + for (i in 0..255) { if (reds[i] > 0 || greens[i] > 0 || blues[i] > 0) return i } - return CHANNEL_MAX + return 255 } - val range: Int = CHANNEL_MAX + val range: Int = 255 fun get(index: Int): IntArray { return when (index) {