mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-13 12:04:06 +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.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")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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, ...
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user