light whitewash version 1

This commit is contained in:
minjaesong
2020-12-01 17:50:47 +09:00
parent f77e65ac97
commit 5685243443
7 changed files with 53 additions and 71 deletions

View File

@@ -134,19 +134,19 @@ object BlockCodex {
prop.id = if (key == -1) 0 else intVal(record, "id") prop.id = if (key == -1) 0 else intVal(record, "id")
prop.drop = intVal(record, "drop") prop.drop = intVal(record, "drop")
prop.shadeColR = floatVal(record, "shdr") / LightmapRenderer.MUL_FLOAT prop.shadeColR = floatVal(record, "shdr")
prop.shadeColG = floatVal(record, "shdg") / LightmapRenderer.MUL_FLOAT prop.shadeColG = floatVal(record, "shdg")
prop.shadeColB = floatVal(record, "shdb") / LightmapRenderer.MUL_FLOAT prop.shadeColB = floatVal(record, "shdb")
prop.shadeColA = floatVal(record, "shduv") / LightmapRenderer.MUL_FLOAT prop.shadeColA = floatVal(record, "shduv")
prop.opacity = Cvec(prop.shadeColR, prop.shadeColG, prop.shadeColB, prop.shadeColA) prop.opacity = Cvec(prop.shadeColR, prop.shadeColG, prop.shadeColB, prop.shadeColA)
prop.strength = intVal(record, "str") prop.strength = intVal(record, "str")
prop.density = intVal(record, "dsty") prop.density = intVal(record, "dsty")
prop.baseLumColR = floatVal(record, "lumr") / LightmapRenderer.MUL_FLOAT prop.baseLumColR = floatVal(record, "lumr")
prop.baseLumColG = floatVal(record, "lumg") / LightmapRenderer.MUL_FLOAT prop.baseLumColG = floatVal(record, "lumg")
prop.baseLumColB = floatVal(record, "lumb") / LightmapRenderer.MUL_FLOAT prop.baseLumColB = floatVal(record, "lumb")
prop.baseLumColA = floatVal(record, "lumuv") / LightmapRenderer.MUL_FLOAT prop.baseLumColA = floatVal(record, "lumuv")
prop.baseLumCol.set(prop.baseLumColR, prop.baseLumColG, prop.baseLumColB, prop.baseLumColA) prop.baseLumCol.set(prop.baseLumColR, prop.baseLumColG, prop.baseLumColB, prop.baseLumColA)
prop.friction = intVal(record, "fr") prop.friction = intVal(record, "fr")

View File

@@ -111,8 +111,8 @@ object BlockPropUtil {
private fun getDynamicLumFunc(prop: BlockProp): Cvec { private fun getDynamicLumFunc(prop: BlockProp): Cvec {
return when (prop.dynamicLuminosityFunction) { return when (prop.dynamicLuminosityFunction) {
1 -> getTorchFlicker(prop) 1 -> getTorchFlicker(prop)
2 -> (Terrarum.ingame!!.world).globalLight.cpy().mul(LightmapRenderer.DIV_FLOAT) // current global light 2 -> (Terrarum.ingame!!.world).globalLight.cpy() // current global light
3 -> WeatherMixer.getGlobalLightOfTime(Terrarum.ingame!!.world, WorldTime.DAY_LENGTH / 2).cpy().mul(LightmapRenderer.DIV_FLOAT) // daylight at noon 3 -> WeatherMixer.getGlobalLightOfTime(Terrarum.ingame!!.world, WorldTime.DAY_LENGTH / 2).cpy() // daylight at noon
4 -> getSlowBreath(prop) 4 -> getSlowBreath(prop)
5 -> getPulsate(prop) 5 -> getPulsate(prop)
else -> prop.baseLumCol else -> prop.baseLumCol

View File

@@ -26,7 +26,7 @@ internal object SetGlobalLightOverride : ConsoleCommand {
Echo("Wrong number input.") Echo("Wrong number input.")
} }
catch (e1: IllegalArgumentException) { catch (e1: IllegalArgumentException) {
Echo("Range: 0-" + LightmapRenderer.CHANNEL_MAX + " per channel") Echo("Range: 0.0-1.0+ per channel")
} }
} }

View File

@@ -68,16 +68,16 @@ open class ActorHumanoid(
override var color: Cvec override var color: Cvec
get() = Cvec( get() = Cvec(
(actorValue.getAsFloat(AVKey.LUMR) ?: 0f) / LightmapRenderer.MUL_FLOAT, (actorValue.getAsFloat(AVKey.LUMR) ?: 0f),
(actorValue.getAsFloat(AVKey.LUMG) ?: 0f) / LightmapRenderer.MUL_FLOAT, (actorValue.getAsFloat(AVKey.LUMG) ?: 0f),
(actorValue.getAsFloat(AVKey.LUMB) ?: 0f) / LightmapRenderer.MUL_FLOAT, (actorValue.getAsFloat(AVKey.LUMB) ?: 0f),
(actorValue.getAsFloat(AVKey.LUMA) ?: 0f) / LightmapRenderer.MUL_FLOAT (actorValue.getAsFloat(AVKey.LUMA) ?: 0f)
) )
set(value) { set(value) {
actorValue[AVKey.LUMR] = value.r * LightmapRenderer.MUL_FLOAT actorValue[AVKey.LUMR] = value.r
actorValue[AVKey.LUMG] = value.g * LightmapRenderer.MUL_FLOAT actorValue[AVKey.LUMG] = value.g
actorValue[AVKey.LUMB] = value.b * LightmapRenderer.MUL_FLOAT actorValue[AVKey.LUMB] = value.b
actorValue[AVKey.LUMA] = value.a * LightmapRenderer.MUL_FLOAT actorValue[AVKey.LUMA] = value.a
} }
/** /**

View File

@@ -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. * 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, ... * @return 0 -> -1, 1 -> 0, 2 -> 1, 4 -> 2, 8 -> 3, 16 -> 4, ...

View File

@@ -89,6 +89,7 @@ internal object LightmapHDRMap : Disposable {
inline operator fun get(index: Int) = ptr.getFloat(4L * index) inline operator fun get(index: Int) = ptr.getFloat(4L * index)
val lastIndex = THE_LUT.lastIndex val lastIndex = THE_LUT.lastIndex
val size = lastIndex + 1
override fun dispose() { override fun dispose() {
ptr.destroy() ptr.destroy()

View File

@@ -94,16 +94,6 @@ object LightmapRenderer {
const val DRAW_TILE_SIZE: Float = CreateTileAtlas.TILE_SIZE / IngameRenderer.lightmapDownsample 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_x_start = 0
internal var for_y_start = 0 internal var for_y_start = 0
internal var for_x_end = 0 internal var for_x_end = 0
@@ -140,10 +130,10 @@ object LightmapRenderer {
val y = y.convY() val y = y.convY()
Cvec( Cvec(
lightmap.getR(x, y) * MUL_FLOAT, lightmap.getR(x, y),
lightmap.getG(x, y) * MUL_FLOAT, lightmap.getG(x, y),
lightmap.getB(x, y) * MUL_FLOAT, lightmap.getB(x, y),
lightmap.getA(x, y) * MUL_FLOAT lightmap.getA(x, y)
) )
} }
} }
@@ -199,7 +189,7 @@ object LightmapRenderer {
*/ */
// set sunlight // set sunlight
sunLight.set(world.globalLight); sunLight.mul(DIV_FLOAT) sunLight.set(world.globalLight)
// set no-op mask from solidity of the block // set no-op mask from solidity of the block
/*AppLoader.measureDebugTime("Renderer.LightNoOpMask") { /*AppLoader.measureDebugTime("Renderer.LightNoOpMask") {
@@ -722,37 +712,30 @@ object LightmapRenderer {
val red = lightmap.getR(arrayX, arrayY) val red = lightmap.getR(arrayX, arrayY)
val grn = lightmap.getG(arrayX, arrayY) val grn = lightmap.getG(arrayX, arrayY)
val blu = lightmap.getB(arrayX, arrayY) val blu = lightmap.getB(arrayX, arrayY)
val redw = (red - 1f) * (7f / 24f) val uvl = lightmap.getA(arrayX, arrayY)
val grnw = (grn - 1f) val redw = (red.sqrt() - 1f) * (7f / 24f)
val bluw = (blu - 1f) * (7f / 72f) 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) val color = if (solidMultMagic == null)
lightBuffer.drawPixel( lightBuffer.drawPixel(
x - this_x_start, x - this_x_start,
lightBuffer.height - 1 - y + this_y_start, lightBuffer.height - 1 - y + this_y_start, // flip Y
0 0
) // flip Y )
else else
lightBuffer.drawPixel( lightBuffer.drawPixel(
x - this_x_start, x - this_x_start,
lightBuffer.height - 1 - y + this_y_start, lightBuffer.height - 1 - y + this_y_start, // flip Y
(maxOf(red, grnw, bluw) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(24) or (maxOf(red,grnw,bluw,uvlwr) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(24) or
(maxOf(redw, grn, bluw) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(16) or (maxOf(redw,grn,bluw,uvlwg) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(16) or
(maxOf(redw, grnw, blu) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(8) or (maxOf(redw,grnw,blu,uvlwb) * solidMultMagic).hdnorm().times(255f).roundToInt().shl(8) or
(lightmap.getA(arrayX, arrayY) * solidMultMagic).hdnorm().times(255f).roundToInt() (maxOf(bluwv,uvl) * 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)*/
} }
} }
@@ -783,7 +766,7 @@ object LightmapRenderer {
_mapThisTileOpacity2.destroy() _mapThisTileOpacity2.destroy()
} }
private const val lightScalingMagic = 8f private const val lightScalingMagic = 2f
/** /**
* Subtract each channel's RGB value. * Subtract each channel's RGB value.
@@ -828,12 +811,12 @@ object LightmapRenderer {
// input: 0..1 for int 0..1023 // input: 0..1 for int 0..1023
fun hdr(intensity: Float): Float { fun hdr(intensity: Float): Float {
val intervalStart = (intensity * CHANNEL_MAX).floorInt() val intervalStart = (intensity / 4f * LightmapHDRMap.size).floorInt()
val intervalEnd = (intensity * CHANNEL_MAX).floorInt() + 1 val intervalEnd = (intensity / 4f * LightmapHDRMap.size).floorInt() + 1
if (intervalStart == intervalEnd) return LightmapHDRMap[intervalStart] 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( val ret = interpolateLinear(
intervalPos, intervalPos,
@@ -895,10 +878,10 @@ object LightmapRenderer {
val histogram: Histogram val histogram: Histogram
get() { get() {
val reds = IntArray(MUL) // reds[intensity] ← counts val reds = IntArray(256) // reds[intensity] ← counts
val greens = IntArray(MUL) // do. val greens = IntArray(256) // do.
val blues = IntArray(MUL) // do. val blues = IntArray(256) // do.
val uvs = IntArray(MUL) val uvs = IntArray(256)
val render_width = for_x_end - for_x_start val render_width = for_x_end - for_x_start
val render_height = for_y_end - for_y_start val render_height = for_y_end - for_y_start
// excluiding overscans; only reckon echo lights // excluiding overscans; only reckon echo lights
@@ -924,7 +907,7 @@ object LightmapRenderer {
val brightest: Int val brightest: Int
get() { get() {
for (i in CHANNEL_MAX downTo 1) { for (i in 255 downTo 1) {
if (reds[i] > 0 || greens[i] > 0 || blues[i] > 0) if (reds[i] > 0 || greens[i] > 0 || blues[i] > 0)
return i return i
} }
@@ -938,14 +921,14 @@ object LightmapRenderer {
val dimmest: Int val dimmest: Int
get() { get() {
for (i in 0..CHANNEL_MAX) { for (i in 0..255) {
if (reds[i] > 0 || greens[i] > 0 || blues[i] > 0) if (reds[i] > 0 || greens[i] > 0 || blues[i] > 0)
return i return i
} }
return CHANNEL_MAX return 255
} }
val range: Int = CHANNEL_MAX val range: Int = 255
fun get(index: Int): IntArray { fun get(index: Int): IntArray {
return when (index) { return when (index) {