fixed bad light calc from 1b83e7deb7 [formerly d900c0733a6d1dcbd9aaed8e9f7f1671c3866624] [formerly 5611e2d89f4601e57d014c45f0479600778217f6]

Former-commit-id: 7906df081a965ba70224fce4890ec3e067ea1636
Former-commit-id: f63552ac04de18ebc4b3283b87cf803eca5ae347
This commit is contained in:
Song Minjae
2017-01-25 17:53:06 +09:00
parent c5b452f779
commit 9aab3d3664
2 changed files with 40 additions and 31 deletions

View File

@@ -421,6 +421,8 @@ object LightmapRenderer {
} }
val lightScalingMagic = 8f
/** /**
* Subtract each channel's RGB value. * Subtract each channel's RGB value.
* *
@@ -432,12 +434,12 @@ object LightmapRenderer {
if (darken < 0 || darken >= COLOUR_RANGE_SIZE) if (darken < 0 || darken >= COLOUR_RANGE_SIZE)
throw IllegalArgumentException("darken: out of range ($darken)") throw IllegalArgumentException("darken: out of range ($darken)")
// use equation with magic number 9.0 // use equation with magic number 8.0
// smooooooth // should draw somewhat exponential curve when you plot the propagation of light in-game
val r = data.r() * (1f - darken.r() * 9.0f) val r = data.r() * (1f - darken.r() * lightScalingMagic)
val g = data.g() * (1f - darken.g() * 9.0f) val g = data.g() * (1f - darken.g() * lightScalingMagic)
val b = data.b() * (1f - darken.b() * 9.0f) val b = data.b() * (1f - darken.b() * lightScalingMagic)
return constructRGBFromFloat(r.clampZero(), g.clampZero(), b.clampZero()) return constructRGBFromFloat(r.clampZero(), g.clampZero(), b.clampZero())
} }
@@ -461,12 +463,9 @@ object LightmapRenderer {
if (brighten < 0 || brighten >= COLOUR_RANGE_SIZE) if (brighten < 0 || brighten >= COLOUR_RANGE_SIZE)
throw IllegalArgumentException("brighten: out of range ($brighten)") throw IllegalArgumentException("brighten: out of range ($brighten)")
val r = data.r() * (1f + brighten.r() * 6.5f) val r = data.r() * (1f + brighten.r() * lightScalingMagic)
val g = data.g() * (1f + brighten.g() * 6.5f) val g = data.g() * (1f + brighten.g() * lightScalingMagic)
val b = data.b() * (1f + brighten.b() * 6.5f) val b = data.b() * (1f + brighten.b() * lightScalingMagic)
//val r = data.r() + brighten.r()
//val g = data.g() + brighten.g()
//val b = data.b() + brighten.b()
return constructRGBFromFloat(r.clampChannel(), g.clampChannel(), b.clampChannel()) return constructRGBFromFloat(r.clampChannel(), g.clampChannel(), b.clampChannel())
} }
@@ -498,6 +497,7 @@ object LightmapRenderer {
constructRGBFromFloat(-brighten, -brighten, -brighten) constructRGBFromFloat(-brighten, -brighten, -brighten)
else else
constructRGBFromFloat(brighten, brighten, brighten) constructRGBFromFloat(brighten, brighten, brighten)
return if (brighten < 0) return if (brighten < 0)
darkenColoured(data, modifier) darkenColoured(data, modifier)
else else
@@ -624,12 +624,12 @@ object LightmapRenderer {
private fun Float.clampChannel() = if (this > CHANNEL_MAX_DECIMAL) CHANNEL_MAX_DECIMAL else this private fun Float.clampChannel() = if (this > CHANNEL_MAX_DECIMAL) CHANNEL_MAX_DECIMAL else this
fun getValueFromMap(x: Int, y: Int): Int? = getLight(x, y) fun getValueFromMap(x: Int, y: Int): Int? = getLight(x, y)
fun getLowestRGB(x: Int, y: Int): Int? { fun getHighestRGB(x: Int, y: Int): Int? {
val value = getLight(x, y) val value = getLight(x, y)
if (value == null) if (value == null)
return null return null
else else
return FastMath.min(value.rawR(), value.rawG(), value.rawB()) return FastMath.max(value.rawR(), value.rawG(), value.rawB())
} }
private fun purgeLightmap() { private fun purgeLightmap() {

View File

@@ -25,6 +25,7 @@ import java.util.*
object TilesDrawer { object TilesDrawer {
private val world: GameWorld = Terrarum.ingame.world private val world: GameWorld = Terrarum.ingame.world
private val TILE_SIZE = FeaturesDrawer.TILE_SIZE private val TILE_SIZE = FeaturesDrawer.TILE_SIZE
private val TILE_SIZEF = FeaturesDrawer.TILE_SIZE.toFloat()
var tilesTerrain: SpriteSheet = SpriteSheet("./assets/graphics/terrain/terrain.tga", TILE_SIZE, TILE_SIZE) var tilesTerrain: SpriteSheet = SpriteSheet("./assets/graphics/terrain/terrain.tga", TILE_SIZE, TILE_SIZE)
private set // Slick has some weird quirks with PNG's transparency. I'm using 32-bit targa here. private set // Slick has some weird quirks with PNG's transparency. I'm using 32-bit targa here.
@@ -310,25 +311,21 @@ object TilesDrawer {
if ((mode == WALL || mode == TERRAIN) && // not an air tile if ((mode == WALL || mode == TERRAIN) && // not an air tile
(thisTile ?: 0) != Tile.AIR) { (thisTile ?: 0) != Tile.AIR) {
// check if light level of nearby or this tile is illuminated // check if light level of nearby or this tile is illuminated
if ( LightmapRenderer.getLowestRGB(x, y) ?: 0 >= tileDrawLightThreshold || if ( LightmapRenderer.getHighestRGB(x, y) ?: 0 >= tileDrawLightThreshold ||
LightmapRenderer.getLowestRGB(x - 1, y) ?: 0 >= tileDrawLightThreshold || LightmapRenderer.getHighestRGB(x - 1, y) ?: 0 >= tileDrawLightThreshold ||
LightmapRenderer.getLowestRGB(x + 1, y) ?: 0 >= tileDrawLightThreshold || LightmapRenderer.getHighestRGB(x + 1, y) ?: 0 >= tileDrawLightThreshold ||
LightmapRenderer.getLowestRGB(x, y - 1) ?: 0 >= tileDrawLightThreshold || LightmapRenderer.getHighestRGB(x, y - 1) ?: 0 >= tileDrawLightThreshold ||
LightmapRenderer.getLowestRGB(x, y + 1) ?: 0 >= tileDrawLightThreshold || LightmapRenderer.getHighestRGB(x, y + 1) ?: 0 >= tileDrawLightThreshold ||
LightmapRenderer.getLowestRGB(x - 1, y - 1) ?: 0 >= tileDrawLightThreshold || LightmapRenderer.getHighestRGB(x - 1, y - 1) ?: 0 >= tileDrawLightThreshold ||
LightmapRenderer.getLowestRGB(x + 1, y + 1) ?: 0 >= tileDrawLightThreshold || LightmapRenderer.getHighestRGB(x + 1, y + 1) ?: 0 >= tileDrawLightThreshold ||
LightmapRenderer.getLowestRGB(x + 1, y - 1) ?: 0 >= tileDrawLightThreshold || LightmapRenderer.getHighestRGB(x + 1, y - 1) ?: 0 >= tileDrawLightThreshold ||
LightmapRenderer.getLowestRGB(x - 1, y + 1) ?: 0 >= tileDrawLightThreshold) { LightmapRenderer.getHighestRGB(x - 1, y + 1) ?: 0 >= tileDrawLightThreshold) {
// blackness // blackness
/*if (zeroTileCounter > 0) { if (zeroTileCounter > 0) {
g.color = Color.black /* unable to do anything */
g.fillRect(
(x - zeroTileCounter) * TILE_SIZE.toFloat(), y * TILE_SIZE.toFloat(),
zeroTileCounter * TILE_SIZE.toFloat(), TILE_SIZE.toFloat()
)
g.color = Color.white
zeroTileCounter = 0 zeroTileCounter = 0
}*/ }
val nearbyTilesInfo: Int val nearbyTilesInfo: Int
@@ -370,7 +367,19 @@ object TilesDrawer {
} // end if (is illuminated) } // end if (is illuminated)
else { else {
zeroTileCounter++ zeroTileCounter++
drawTile(mode, x, y, 1, 0) // black patch //drawTile(mode, x, y, 1, 0) // black patch
GL11.glColor4f(0f, 0f, 0f, 1f)
GL11.glTexCoord2f(0f, 0f)
GL11.glVertex3f(x * TILE_SIZE.toFloat(), y * TILE_SIZE.toFloat(), 0f)
GL11.glTexCoord2f(0f, 0f + TILE_SIZE)
GL11.glVertex3f(x * TILE_SIZE.toFloat(), (y + 1) * TILE_SIZE.toFloat(), 0f)
GL11.glTexCoord2f(0f + TILE_SIZE, 0f + TILE_SIZE)
GL11.glVertex3f((x + 1) * TILE_SIZE.toFloat(), (y + 1) * TILE_SIZE.toFloat(), 0f)
GL11.glTexCoord2f(0f + TILE_SIZE, 0f)
GL11.glVertex3f((x + 1) * TILE_SIZE.toFloat(), y * TILE_SIZE.toFloat(), 0f)
GL11.glColor4f(1f, 1f, 1f, 1f)
} }
} // end if (not an air) } // end if (not an air)
} catch (e: NullPointerException) { } catch (e: NullPointerException) {