Files
Terrarum/src/net/torvald/terrarum/mapdrawer/Light10B.kt
Song Minjae 9b9b65efba removed unnecessary class Light10B, minor fixes for LightmapRenderer
Former-commit-id: 4cddfb080cc689738d9bf308f7d08852f4c78a8b
Former-commit-id: 2354b2483f30e70862a327c1b9688a19bd1b2f66
2016-09-07 22:58:42 +09:00

195 lines
6.5 KiB
Kotlin

package net.torvald.terrarum.mapdrawer
import com.jme3.math.FastMath
import org.newdawn.slick.Color
/**
* Created by minjaesong on 16-07-08.
*/
/*class Light10B {
private var data = 0
constructor(r: Int, g: Int, b: Int) {
data = constructRGBFromInt(r, g, b)
}
constructor(r: Float, g: Float, b: Float) {
if (r < 0 || r > 1.0f) throw IllegalArgumentException("Red: out of range ($r)")
if (g < 0 || g > 1.0f) throw IllegalArgumentException("Green: out of range ($g)")
if (b < 0 || b > 1.0f) throw IllegalArgumentException("Blue: out of range ($b)")
val intR = (r * CHANNEL_MAX).floor()
val intG = (g * CHANNEL_MAX).floor()
val intB = (b * CHANNEL_MAX).floor()
data = constructRGBFromInt(intR, intG, intB)
}
constructor(raw: Int) {
data = raw
}
constructor(color: Color) {
data = constructRGBFromInt(color.red, color.green, color.blue)
}
/**
* Assigners
*/
fun fromRGB(r: Int, g: Int, b: Int): Light10B {
data = constructRGBFromInt(r, g, b)
return this
}
fun fromInt(raw: Int): Light10B {
data = raw
return this
}
fun fromSlickColor(color: Color): Light10B {
data = constructRGBFromInt(color.red, color.green, color.blue)
return this
}
fun toInt(): Int = data
fun constructRGBFromInt(r: Int, g: Int, b: Int): Int {
if (r !in 0..CHANNEL_MAX) throw IllegalArgumentException("Red: out of range ($r)")
if (g !in 0..CHANNEL_MAX) throw IllegalArgumentException("Green: out of range ($g)")
if (b !in 0..CHANNEL_MAX) throw IllegalArgumentException("Blue: out of range ($b)")
return (r * STEPS_2 + g * STEPS + b)
}
val STEPS = 1024
val STEPS_2 = STEPS * STEPS
val CHANNEL_MAX = STEPS - 1
val CHANNEL_MAX_FLOAT = CHANNEL_MAX.toFloat()
val CHANNEL_MAX_DECIMAL = 4f
val COLOUR_RANGE_SIZE = STEPS * STEPS_2
override fun toString() = "10BitCol:$data"
fun rawR() = data / STEPS_2
fun rawG() = data % STEPS_2 / STEPS
fun rawB() = data % STEPS
fun r(): Float = this.rawR() / CHANNEL_MAX_FLOAT
fun g(): Float = this.rawG() / CHANNEL_MAX_FLOAT
fun b(): Float = this.rawB() / CHANNEL_MAX_FLOAT
fun Float.floor() = FastMath.floor(this)
private fun Float.clampChannel() = if (this < 0) 0f else if (this > CHANNEL_MAX_DECIMAL) CHANNEL_MAX_DECIMAL else this
private fun Int.clampChannel() = if (this < 0) 0 else if (this > CHANNEL_MAX) CHANNEL_MAX else this
operator fun plus(other: Light10B) =
Light10B(
rawR().plus(other.rawR()).clampChannel(),
rawG().plus(other.rawG()).clampChannel(),
rawB().plus(other.rawB()).clampChannel()
)
operator fun minus(other: Light10B) =
Light10B(
rawR().minus(other.rawR()).clampChannel(),
rawG().minus(other.rawG()).clampChannel(),
rawB().minus(other.rawB()).clampChannel()
)
operator fun times(other: Light10B) =
Light10B(
r().times(other.r()).clampChannel(),
g().times(other.g()).clampChannel(),
b().times(other.b()).clampChannel()
)
infix fun darken(other: Light10B): Light10B {
if (other.toInt() < 0 || other.toInt() >= COLOUR_RANGE_SIZE)
throw IllegalArgumentException("darken: out of range ($other)")
val r = this.r() * (1f - other.r() * 6) // 6: Arbitrary value
val g = this.g() * (1f - other.g() * 6) // TODO gamma correction?
val b = this.b() * (1f - other.b() * 6)
return Light10B(r.clampChannel(), g.clampChannel(), b.clampChannel())
}
infix fun darken(darken: Int): Light10B {
if (darken < 0 || darken > CHANNEL_MAX)
throw IllegalArgumentException("darken: out of range ($darken)")
val darkenColoured = constructRGBFromInt(darken, darken, darken)
return (this darken darkenColoured)
}
infix fun brighten(other: Light10B): Light10B {
if (other.toInt() < 0 || other.toInt() >= COLOUR_RANGE_SIZE)
throw IllegalArgumentException("brighten: out of range ($other)")
val r = this.r() * (1f + other.r() * 6) // 6: Arbitrary value
val g = this.g() * (1f + other.g() * 6) // TODO gamma correction?
val b = this.b() * (1f + other.b() * 6)
return Light10B(r.clampChannel(), g.clampChannel(), b.clampChannel())
}
/**
* Darken or brighten colour by 'brighten' argument
*
* @param data Raw channel value (0-255) per channel
* @param brighten (-1.0 - 1.0) negative means darkening
* @return processed colour
*/
fun alterBrightnessUniform(data: Light10B, brighten: Float): Light10B {
val modifier = if (brighten < 0)
Light10B(-brighten, -brighten, -brighten)
else
Light10B(brighten, brighten, brighten)
return if (brighten < 0)
data darken modifier
else
data brighten modifier
}
/** Get each channel from two RGB values, return new RGB that has max value of each channel
* @param rgb
* @param rgb2
* @return
*/
infix fun maxBlend(other: Light10B): Light10B {
val r1 = this.rawR()
val r2 = other.rawR()
val newR = if (r1 > r2) r1 else r2
val g1 = this.rawG()
val g2 = other.rawG()
val newG = if (g1 > g2) g1 else g2
val b1 = this.rawB()
val b2 = other.rawB()
val newB = if (b1 > b2) b1 else b2
return Light10B(newR, newG, newB)
}
infix fun screenBlend(other: Light10B): Light10B {
val r1 = this.r()
val r2 = other.r()
val newR = 1 - (1 - r1) * (1 - r2)
val g1 = this.g()
val g2 = other.g()
val newG = 1 - (1 - g1) * (1 - g2)
val b1 = this.b()
val b2 = other.b()
val newB = 1 - (1 - b1) * (1 - b2)
return Light10B(newR, newG, newB)
}
private infix fun colSub(other: Light10B) = Light10B(
(this.rawR() - other.rawR()).clampChannel() ,
(this.rawG() - other.rawG()).clampChannel() ,
(this.rawB() - other.rawB()).clampChannel()
)
private infix fun colAdd(other: Light10B) = Light10B(
(this.rawR() + other.rawR()).clampChannel() ,
(this.rawG() + other.rawG()).clampChannel() ,
(this.rawB() + other.rawB()).clampChannel()
)
}*/