mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 12:21:52 +09:00
light whitewash version 1
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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, ...
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user