mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-16 00:26:07 +09:00
working UV simulation using alpha channel
This commit is contained in:
@@ -32,12 +32,12 @@ Creature raw documentation
|
|||||||
|
|
||||||
|name|unit|description|
|
|name|unit|description|
|
||||||
|----|----|-----------|
|
|----|----|-----------|
|
||||||
|luminosity|30-bit RGB (Int)|Self-glow. Set to 0 for not glowing|
|
|color|30-bit RGB (Int)|Self-glow. Set to 0 for not glowing|
|
||||||
|name|String|Given (perhaps customised) name|
|
|name|String|Given (perhaps customised) name|
|
||||||
|racename|STRING_ID|Racename token in language CSV|
|
|racename|STRING_ID|Racename token in language CSV|
|
||||||
|racenameplural|STRING_ID|Racename token in language CSV|
|
|racenameplural|STRING_ID|Racename token in language CSV|
|
||||||
|
|
||||||
* Note: luminosity uses customised 30-bit RGB. The format specifies ```1.0``` luminosity of white (```#FFFFFF```) be ```0000_0011111111_0011111111_0011111111```, and can hold luminosity range of 0.0-4.0
|
* Note: color uses customised 30-bit RGB. The format specifies ```1.0``` color of white (```#FFFFFF```) be ```0000_0011111111_0011111111_0011111111```, and can hold color range of 0.0-4.0
|
||||||
|
|
||||||
## Flags ##
|
## Flags ##
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -102,5 +102,5 @@ val kappa = 24389f/27f
|
|||||||
* u, v: -100+ - 100+
|
* u, v: -100+ - 100+
|
||||||
* (Hundred-based-plus)
|
* (Hundred-based-plus)
|
||||||
*/
|
*/
|
||||||
data class CIELab(var L: Float = 0f, var a: Float = 0f, var b: Float = 0f, val alpha: Float = 1f)
|
data class CIELab(var L: Float = 0f, var a: Float = 0f, var b: Float = 0f, var alpha: Float = 1f)
|
||||||
|
|
||||||
|
|||||||
@@ -108,4 +108,4 @@ fun CIELuv.toColor() = this.toXYZ().toColor()
|
|||||||
* u, v: -100+ - 100+
|
* u, v: -100+ - 100+
|
||||||
* (Hundred-based-plus)
|
* (Hundred-based-plus)
|
||||||
*/
|
*/
|
||||||
data class CIELuv(var L: Float = 0f, var u: Float = 0f, var v: Float = 0f, val alpha: Float = 1f)
|
data class CIELuv(var L: Float = 0f, var u: Float = 0f, var v: Float = 0f, var alpha: Float = 1f)
|
||||||
|
|||||||
@@ -96,16 +96,16 @@ object CIEXYZUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Range: X, Y, Z: 0 - 1.0+ (One-based-plus) */
|
/** Range: X, Y, Z: 0 - 1.0+ (One-based-plus) */
|
||||||
data class CIEXYZ(var X: Float = 0f, var Y: Float = 0f, var Z: Float = 0f, val alpha: Float = 1f) {
|
data class CIEXYZ(var X: Float = 0f, var Y: Float = 0f, var Z: Float = 0f, var alpha: Float = 1f) {
|
||||||
init {
|
init {
|
||||||
if (X > 2f || Y > 2f || Z > 2f)
|
if (X > 2f || Y > 2f || Z > 2f)
|
||||||
throw IllegalArgumentException("Value range error - CIEXYZ is one-based (0.0 - 1.0+): ($X, $Y, $Z)")
|
throw IllegalArgumentException("Value range error - this version of CIEXYZ is one-based (0.0 - 1.0+): ($X, $Y, $Z)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Range: r, g, b: 0 - 1.0 (One-based) */
|
/** Range: r, g, b: 0 - 1.0 (One-based) */
|
||||||
data class RGB(var r: Float = 0f, var g: Float = 0f, var b: Float = 0f, val alpha: Float = 1f) {
|
data class RGB(var r: Float = 0f, var g: Float = 0f, var b: Float = 0f, var alpha: Float = 1f) {
|
||||||
constructor(color: Color) : this() {
|
constructor(color: Color) : this() {
|
||||||
r = color.r; g = color.g; b = color.b
|
r = color.r; g = color.g; b = color.b; alpha = color.a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,33 +9,34 @@ import javax.naming.OperationNotSupportedException
|
|||||||
* Created by minjaesong on 2017-06-17.
|
* Created by minjaesong on 2017-06-17.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typealias XRGB888 = Int
|
|
||||||
|
|
||||||
class GdxColorMap {
|
class GdxColorMap {
|
||||||
|
|
||||||
constructor(imageFile: FileHandle) {
|
constructor(imageFile: FileHandle) {
|
||||||
val pixmap = Pixmap(imageFile)
|
val pixmap = Pixmap(imageFile)
|
||||||
width = pixmap.width
|
width = pixmap.width
|
||||||
height = pixmap.height
|
height = pixmap.height
|
||||||
is2D = pixmap.height == 1
|
is2D = pixmap.height > 1
|
||||||
|
|
||||||
data = kotlin.IntArray(pixmap.width * pixmap.height, {
|
data = kotlin.IntArray(pixmap.width * pixmap.height, {
|
||||||
pixmap.getPixel(it % pixmap.width, it / pixmap.width)
|
pixmap.getPixel(it % pixmap.width, it / pixmap.width)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
println("[GdxColorMap] Loading colormap from ${imageFile.name()}; PixmapFormat: ${pixmap.format}; Dimension: $width x $height")
|
||||||
|
|
||||||
|
|
||||||
pixmap.dispose()
|
pixmap.dispose()
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(xrgb888: XRGB888) {
|
constructor(color: Color) {
|
||||||
data = intArrayOf(xrgb888.shl(24) + xrgb888.shl(16) + xrgb888.shl(8) + 255)
|
data = intArrayOf(color.toIntBits())
|
||||||
width = 1
|
width = 1
|
||||||
height = 1
|
height = 1
|
||||||
is2D = false
|
is2D = false
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(gradStart: XRGB888, gradEnd: XRGB888) {
|
constructor(gradStart: Color, gradEnd: Color) {
|
||||||
data = intArrayOf(gradStart.shl(24) + gradStart.shl(16) + gradStart.shl(8) + 255,
|
data = intArrayOf(gradStart.toIntBits(), gradEnd.toIntBits())
|
||||||
gradEnd.shl(24) + gradEnd.shl(16) + gradEnd.shl(8) + 255)
|
|
||||||
width = 1
|
width = 1
|
||||||
height = 2
|
height = 2
|
||||||
is2D = true
|
is2D = true
|
||||||
@@ -49,9 +50,9 @@ class GdxColorMap {
|
|||||||
|
|
||||||
|
|
||||||
fun get(x: Int, y: Int): Color = Color(data[y * width + x])
|
fun get(x: Int, y: Int): Color = Color(data[y * width + x])
|
||||||
operator fun get(x: Int): Color = if (!is2D) throw OperationNotSupportedException("This is 2D color map") else Color(data[x])
|
operator fun get(x: Int): Color = if (is2D) throw OperationNotSupportedException("This is 2D color map") else Color(data[x])
|
||||||
|
|
||||||
fun getRaw(x: Int, y: Int): RGBA8888 = data[y * width + x]
|
fun getRaw(x: Int, y: Int): RGBA8888 = data[y * width + x]
|
||||||
fun getRaw(x: Int): RGBA8888 = if (!is2D) throw OperationNotSupportedException("This is 2D color map") else data[x]
|
fun getRaw(x: Int): RGBA8888 = if (is2D) throw OperationNotSupportedException("This is 2D color map") else data[x]
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -152,6 +152,7 @@ class Ingame(val batch: SpriteBatch) : Screen {
|
|||||||
|
|
||||||
var camera = OrthographicCamera(Terrarum.WIDTH.toFloat(), Terrarum.HEIGHT.toFloat())
|
var camera = OrthographicCamera(Terrarum.WIDTH.toFloat(), Terrarum.HEIGHT.toFloat())
|
||||||
|
|
||||||
|
/** Actually just a mesh of four vertices, two triangles -- not a literal glQuad */
|
||||||
var fullscreenQuad = Mesh(
|
var fullscreenQuad = Mesh(
|
||||||
true, 4, 6,
|
true, 4, 6,
|
||||||
VertexAttribute.Position(),
|
VertexAttribute.Position(),
|
||||||
@@ -675,12 +676,8 @@ class Ingame(val batch: SpriteBatch) : Screen {
|
|||||||
batch.color = Color.WHITE
|
batch.color = Color.WHITE
|
||||||
blendNormal()
|
blendNormal()
|
||||||
|
|
||||||
Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // reset active textureunit to zero (i don't know tbh)
|
Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // reset active textureunit to zero (i don't know tbh, but it won't work without this)
|
||||||
|
|
||||||
|
|
||||||
batch.shader = null
|
batch.shader = null
|
||||||
batch.color = Color.RED
|
|
||||||
batch.fillRect(0f, 0f, 16f, 16f)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -711,9 +708,6 @@ class Ingame(val batch: SpriteBatch) : Screen {
|
|||||||
batch.draw(blendedTex, 0f, 0f, blendedTex.width.toFloat(), blendedTex.height.toFloat())
|
batch.draw(blendedTex, 0f, 0f, blendedTex.width.toFloat(), blendedTex.height.toFloat())
|
||||||
|
|
||||||
|
|
||||||
batch.color = Color.GREEN
|
|
||||||
batch.fillRect(16f, 16f, 16f, 16f)
|
|
||||||
|
|
||||||
|
|
||||||
// an old code.
|
// an old code.
|
||||||
/*batch.shader = null
|
/*batch.shader = null
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ class BlockProp {
|
|||||||
|
|
||||||
var nameKey: String = ""
|
var nameKey: String = ""
|
||||||
|
|
||||||
|
/** 1.0f for 1023, 0.25f for 255 */
|
||||||
var shadeColR = 0f
|
var shadeColR = 0f
|
||||||
var shadeColG = 0f
|
var shadeColG = 0f
|
||||||
var shadeColB = 0f
|
var shadeColB = 0f
|
||||||
@@ -33,6 +33,7 @@ class BlockProp {
|
|||||||
var isVertFriction: Boolean = false
|
var isVertFriction: Boolean = false
|
||||||
|
|
||||||
|
|
||||||
|
/** 1.0f for 1023, 0.25f for 255 */
|
||||||
var lumColR = 0f
|
var lumColR = 0f
|
||||||
var lumColG = 0f
|
var lumColG = 0f
|
||||||
var lumColB = 0f
|
var lumColB = 0f
|
||||||
|
|||||||
@@ -13,12 +13,13 @@ internal object SetGlobalLightOverride : ConsoleCommand {
|
|||||||
private set
|
private set
|
||||||
|
|
||||||
override fun execute(args: Array<String>) {
|
override fun execute(args: Array<String>) {
|
||||||
if (args.size == 4) {
|
if (args.size == 5) {
|
||||||
try {
|
try {
|
||||||
val r = args[1].toFloat()
|
val r = args[1].toFloat()
|
||||||
val g = args[2].toFloat()
|
val g = args[2].toFloat()
|
||||||
val b = args[3].toFloat()
|
val b = args[3].toFloat()
|
||||||
val GL = Color(r, g, b, 1f)
|
val a = args[4].toFloat()
|
||||||
|
val GL = Color(r, g, b, a)
|
||||||
|
|
||||||
lightOverride = true
|
lightOverride = true
|
||||||
Terrarum.ingame!!.world.globalLight = GL
|
Terrarum.ingame!!.world.globalLight = GL
|
||||||
@@ -37,6 +38,6 @@ internal object SetGlobalLightOverride : ConsoleCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun printUsage() {
|
override fun printUsage() {
|
||||||
Echo("Usage: setgl [raw_value|r g b|“none”]")
|
Echo("Usage: setgl [r g b a|“none”]")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
|
|||||||
if (houseDesignation != null) houseDesignation!!.clear()
|
if (houseDesignation != null) houseDesignation!!.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
override var luminosity: Color
|
override var color: Color
|
||||||
get() = Color(
|
get() = Color(
|
||||||
(actorValue.getAsFloat(AVKey.LUMR) ?: 0f) / LightmapRenderer.MUL_FLOAT,
|
(actorValue.getAsFloat(AVKey.LUMR) ?: 0f) / LightmapRenderer.MUL_FLOAT,
|
||||||
(actorValue.getAsFloat(AVKey.LUMG) ?: 0f) / LightmapRenderer.MUL_FLOAT,
|
(actorValue.getAsFloat(AVKey.LUMG) ?: 0f) / LightmapRenderer.MUL_FLOAT,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import java.util.*
|
|||||||
*/
|
*/
|
||||||
internal class FixtureTikiTorch : FixtureBase(), Luminous {
|
internal class FixtureTikiTorch : FixtureBase(), Luminous {
|
||||||
|
|
||||||
override var luminosity: Color
|
override var color: Color
|
||||||
get() = BlockCodex[Block.TORCH].luminosity
|
get() = BlockCodex[Block.TORCH].luminosity
|
||||||
set(value) {
|
set(value) {
|
||||||
throw UnsupportedOperationException()
|
throw UnsupportedOperationException()
|
||||||
|
|||||||
@@ -8,9 +8,11 @@ import com.badlogic.gdx.graphics.Color
|
|||||||
interface Luminous {
|
interface Luminous {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Range of 0.0 - 4.0 for each channel
|
||||||
|
*
|
||||||
* Recommended implementation:
|
* Recommended implementation:
|
||||||
*
|
*
|
||||||
override var luminosity: Color
|
override var color: Color
|
||||||
get() = Color(
|
get() = Color(
|
||||||
(actorValue.getAsFloat(AVKey.LUMR) ?: 0f) / LightmapRenderer.MUL_FLOAT,
|
(actorValue.getAsFloat(AVKey.LUMR) ?: 0f) / LightmapRenderer.MUL_FLOAT,
|
||||||
(actorValue.getAsFloat(AVKey.LUMG) ?: 0f) / LightmapRenderer.MUL_FLOAT,
|
(actorValue.getAsFloat(AVKey.LUMG) ?: 0f) / LightmapRenderer.MUL_FLOAT,
|
||||||
@@ -24,7 +26,7 @@ interface Luminous {
|
|||||||
actorValue[AVKey.LUMA] = value.a * LightmapRenderer.MUL_FLOAT
|
actorValue[AVKey.LUMA] = value.a * LightmapRenderer.MUL_FLOAT
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
var luminosity: Color
|
var color: Color
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Arguments:
|
* Arguments:
|
||||||
|
|||||||
@@ -50,9 +50,9 @@ object PlayerBuilderSigrid {
|
|||||||
p.actorValue[AVKey.INTELLIGENT] = true
|
p.actorValue[AVKey.INTELLIGENT] = true
|
||||||
|
|
||||||
//p.actorValue[AVKey.LUMR] = 0.84
|
//p.actorValue[AVKey.LUMR] = 0.84
|
||||||
//p.actorValue[AVKey.LUMR] = 0.93
|
//p.actorValue[AVKey.LUMG] = 0.93
|
||||||
//p.actorValue[AVKey.LUMR] = 1.37
|
//p.actorValue[AVKey.LUMB] = 1.37
|
||||||
p.actorValue[AVKey.LUMA] = 0.32
|
//p.actorValue[AVKey.LUMA] = 1.93
|
||||||
|
|
||||||
p.actorValue[AVKey.BASEDEFENCE] = 141
|
p.actorValue[AVKey.BASEDEFENCE] = 141
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ open class ProjectileSimple(
|
|||||||
val speed: Int
|
val speed: Int
|
||||||
|
|
||||||
|
|
||||||
override var luminosity: Color
|
override var color: Color
|
||||||
get() = (bulletDatabase[type][OFFSET_LUMINOSITY] as Color).cpy()
|
get() = (bulletDatabase[type][OFFSET_LUMINOSITY] as Color).cpy()
|
||||||
set(value) {
|
set(value) {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,13 +11,13 @@ class WeaponSwung(val itemID: Int) : ActorWithPhysics(Actor.RenderOrder.MIDTOP),
|
|||||||
/**
|
/**
|
||||||
* Recommended implementation:
|
* Recommended implementation:
|
||||||
*
|
*
|
||||||
override var luminosity: Int
|
override var color: Int
|
||||||
get() = actorValue.getAsInt(AVKey.LUMINOSITY) ?: 0
|
get() = actorValue.getAsInt(AVKey.LUMINOSITY) ?: 0
|
||||||
set(value) {
|
set(value) {
|
||||||
actorValue[AVKey.LUMINOSITY] = value
|
actorValue[AVKey.LUMINOSITY] = value
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
override var luminosity: Color
|
override var color: Color
|
||||||
get() = throw UnsupportedOperationException()
|
get() = throw UnsupportedOperationException()
|
||||||
set(value) {
|
set(value) {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class GameWorld(val width: Int, val height: Int) {
|
|||||||
/** Meter per second squared. Currently only the downward gravity is supported. No reverse gravity :p */
|
/** Meter per second squared. Currently only the downward gravity is supported. No reverse gravity :p */
|
||||||
var gravitation: Vector2 = Vector2(0.0, 9.8)
|
var gravitation: Vector2 = Vector2(0.0, 9.8)
|
||||||
/** 0.0..1.0+ */
|
/** 0.0..1.0+ */
|
||||||
var globalLight = Color(0f,0f,0f,1f)
|
var globalLight = Color(0f,0f,0f,0f)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ class UIBasicNotifier(private val player: ActorHumanoid?) : UICanvas {
|
|||||||
|
|
||||||
|
|
||||||
// backplate
|
// backplate
|
||||||
batch.color = lightLevel
|
batch.color = Color(lightLevel.r, lightLevel.g, lightLevel.b, 1f)
|
||||||
batch.draw(atlas.get(0, 0), 0f, 0f)
|
batch.draw(atlas.get(0, 0), 0f, 0f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ class UITierOneWatch(private val player: ActorHumanoid?) : UICanvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// backplate
|
// backplate
|
||||||
batch.color = lightLevel
|
batch.color = Color(lightLevel.r, lightLevel.g, lightLevel.b, 1f)
|
||||||
batch.draw(atlas.get(0, 0), 0f, 0f)
|
batch.draw(atlas.get(0, 0), 0f, 0f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -89,14 +89,9 @@ object WeatherMixer {
|
|||||||
}
|
}
|
||||||
globalLightNow.set(getGlobalLightOfTime(world.time.todaySeconds).mul(0.3f, 0.3f, 0.3f, 0.58f))
|
globalLightNow.set(getGlobalLightOfTime(world.time.todaySeconds).mul(0.3f, 0.3f, 0.3f, 0.58f))
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun Color.set(other: Color) {
|
|
||||||
this.r = other.r
|
}
|
||||||
this.g = other.g
|
|
||||||
this.b = other.b
|
|
||||||
this.a = other.a
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -110,9 +105,7 @@ object WeatherMixer {
|
|||||||
|
|
||||||
// calculate global light
|
// calculate global light
|
||||||
val globalLight = getGradientColour(skyboxColourMap, 2, timeNow)
|
val globalLight = getGradientColour(skyboxColourMap, 2, timeNow)
|
||||||
globalLightNow.r = globalLight.r
|
globalLightNow.set(globalLight)
|
||||||
globalLightNow.g = globalLight.g
|
|
||||||
globalLightNow.b = globalLight.b
|
|
||||||
|
|
||||||
// draw skybox to provided graphics instance
|
// draw skybox to provided graphics instance
|
||||||
batch.end()
|
batch.end()
|
||||||
@@ -140,7 +133,6 @@ object WeatherMixer {
|
|||||||
fun getGlobalLightOfTime(timeInSec: Int): Color =
|
fun getGlobalLightOfTime(timeInSec: Int): Color =
|
||||||
getGradientColour(currentWeather.skyboxGradColourMap, 2, timeInSec)
|
getGradientColour(currentWeather.skyboxGradColourMap, 2, timeInSec)
|
||||||
|
|
||||||
// TODO colour gradient load from image, store to array
|
|
||||||
fun getGradientColour(colorMap: GdxColorMap, row: Int, timeInSec: Int): Color {
|
fun getGradientColour(colorMap: GdxColorMap, row: Int, timeInSec: Int): Color {
|
||||||
val dataPointDistance = WorldTime.DAY_LENGTH / colorMap.width
|
val dataPointDistance = WorldTime.DAY_LENGTH / colorMap.width
|
||||||
|
|
||||||
@@ -150,7 +142,7 @@ object WeatherMixer {
|
|||||||
val colourThis = colorMap.get(phaseThis, row)
|
val colourThis = colorMap.get(phaseThis, row)
|
||||||
val colourNext = colorMap.get(phaseNext, row)
|
val colourNext = colorMap.get(phaseNext, row)
|
||||||
|
|
||||||
// interpolate R, G and B
|
// interpolate R, G, B and A
|
||||||
val scale = (timeInSec % dataPointDistance).toFloat() / dataPointDistance // [0.0, 1.0]
|
val scale = (timeInSec % dataPointDistance).toFloat() / dataPointDistance // [0.0, 1.0]
|
||||||
|
|
||||||
val newCol = CIELabUtil.getGradient(scale, colourThis, colourNext)
|
val newCol = CIELabUtil.getGradient(scale, colourThis, colourNext)
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ object LightmapRenderer {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return Color(col.r * MUL_FLOAT, col.g * MUL_FLOAT, col.b * MUL_FLOAT, 1f)
|
return Color(col.r * MUL_FLOAT, col.g * MUL_FLOAT, col.b * MUL_FLOAT, col.a * MUL_FLOAT)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,10 +244,13 @@ object LightmapRenderer {
|
|||||||
..lightBoxY.plus(lightBoxH).div(TILE_SIZE).floorInt()) {
|
..lightBoxY.plus(lightBoxH).div(TILE_SIZE).floorInt()) {
|
||||||
for (x in lightBoxX.div(TILE_SIZE).floorInt()
|
for (x in lightBoxX.div(TILE_SIZE).floorInt()
|
||||||
..lightBoxX.plus(lightBoxW).div(TILE_SIZE).floorInt()) {
|
..lightBoxX.plus(lightBoxW).div(TILE_SIZE).floorInt()) {
|
||||||
lanternMap.add(Lantern(x, y, it.luminosity))
|
|
||||||
|
val normalisedColor = it.color.cpy().mul(DIV_FLOAT)
|
||||||
|
|
||||||
|
lanternMap.add(Lantern(x, y, normalisedColor))
|
||||||
// Q&D fix for Roundworld anomaly
|
// Q&D fix for Roundworld anomaly
|
||||||
lanternMap.add(Lantern(x + world.width, y, it.luminosity))
|
lanternMap.add(Lantern(x + world.width, y, normalisedColor))
|
||||||
lanternMap.add(Lantern(x - world.width, y, it.luminosity))
|
lanternMap.add(Lantern(x - world.width, y, normalisedColor))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -268,7 +271,7 @@ object LightmapRenderer {
|
|||||||
val thisWall = Terrarum.ingame!!.world.getTileFromWall(x, y)
|
val thisWall = Terrarum.ingame!!.world.getTileFromWall(x, y)
|
||||||
val thisTileLuminosity = BlockCodex[thisTerrain].luminosity // already been div by four
|
val thisTileLuminosity = BlockCodex[thisTerrain].luminosity // already been div by four
|
||||||
val thisTileOpacity = BlockCodex[thisTerrain].opacity // already been div by four
|
val thisTileOpacity = BlockCodex[thisTerrain].opacity // already been div by four
|
||||||
val sunLight = Terrarum.ingame!!.world.globalLight.cpy().mul(DIV_FLOAT, DIV_FLOAT, DIV_FLOAT, DIV_FLOAT)
|
val sunLight = Terrarum.ingame!!.world.globalLight.cpy().mul(DIV_FLOAT)
|
||||||
|
|
||||||
// MIX TILE
|
// MIX TILE
|
||||||
// open air
|
// open air
|
||||||
@@ -285,13 +288,12 @@ object LightmapRenderer {
|
|||||||
}
|
}
|
||||||
// END MIX TILE
|
// END MIX TILE
|
||||||
|
|
||||||
for (i in 0..lanternMap.size - 1) {
|
for (i in 0 until lanternMap.size) {
|
||||||
val lmap = lanternMap[i]
|
val lmap = lanternMap[i]
|
||||||
if (lmap.posX == x && lmap.posY == y)
|
if (lmap.posX == x && lmap.posY == y)
|
||||||
lightLevelThis = lightLevelThis maxBlend lmap.luminosity // maximise to not exceed 1.0 with normal (<= 1.0) light
|
lightLevelThis = lightLevelThis maxBlend lmap.color // maximise to not exceed 1.0 with normal (<= 1.0) light
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!doNotCalculateAmbient) {
|
if (!doNotCalculateAmbient) {
|
||||||
// calculate ambient
|
// calculate ambient
|
||||||
/* + * +
|
/* + * +
|
||||||
@@ -310,11 +312,18 @@ object LightmapRenderer {
|
|||||||
/* * */ambientAccumulator = ambientAccumulator maxBlend darkenColoured(getLightInternal(x - 1, y ) ?: Color(0f,0f,0f,0f), thisTileOpacity)
|
/* * */ambientAccumulator = ambientAccumulator maxBlend darkenColoured(getLightInternal(x - 1, y ) ?: Color(0f,0f,0f,0f), thisTileOpacity)
|
||||||
/* * */ambientAccumulator = ambientAccumulator maxBlend darkenColoured(getLightInternal(x + 1, y ) ?: Color(0f,0f,0f,0f), thisTileOpacity)
|
/* * */ambientAccumulator = ambientAccumulator maxBlend darkenColoured(getLightInternal(x + 1, y ) ?: Color(0f,0f,0f,0f), thisTileOpacity)
|
||||||
|
|
||||||
return lightLevelThis maxBlend ambientAccumulator
|
val ret = lightLevelThis maxBlend ambientAccumulator
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return ret
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return lightLevelThis
|
val ret = lightLevelThis
|
||||||
|
|
||||||
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getLightForOpaque(x: Int, y: Int): Color? { // ...so that they wouldn't appear too dark
|
private fun getLightForOpaque(x: Int, y: Int): Color? { // ...so that they wouldn't appear too dark
|
||||||
@@ -415,7 +424,7 @@ object LightmapRenderer {
|
|||||||
data.r * (1f - darken.r * lightScalingMagic),//.clampZero(),
|
data.r * (1f - darken.r * lightScalingMagic),//.clampZero(),
|
||||||
data.g * (1f - darken.g * lightScalingMagic),//.clampZero(),
|
data.g * (1f - darken.g * lightScalingMagic),//.clampZero(),
|
||||||
data.b * (1f - darken.b * lightScalingMagic),//.clampZero(),
|
data.b * (1f - darken.b * lightScalingMagic),//.clampZero(),
|
||||||
data.a * (1f - darken.b * lightScalingMagic))
|
data.a * (1f - darken.a * lightScalingMagic))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun scaleSqrt2(data: Color): Color {
|
private fun scaleSqrt2(data: Color): Color {
|
||||||
@@ -438,7 +447,7 @@ object LightmapRenderer {
|
|||||||
data.r * (1f + brighten.r * lightScalingMagic),
|
data.r * (1f + brighten.r * lightScalingMagic),
|
||||||
data.g * (1f + brighten.g * lightScalingMagic),
|
data.g * (1f + brighten.g * lightScalingMagic),
|
||||||
data.b * (1f + brighten.b * lightScalingMagic),
|
data.b * (1f + brighten.b * lightScalingMagic),
|
||||||
data.a * (1f + brighten.b * lightScalingMagic)
|
data.a * (1f + brighten.a * lightScalingMagic)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -453,7 +462,7 @@ object LightmapRenderer {
|
|||||||
if (darken < 0 || darken > CHANNEL_MAX)
|
if (darken < 0 || darken > CHANNEL_MAX)
|
||||||
throw IllegalArgumentException("darken: out of range ($darken)")
|
throw IllegalArgumentException("darken: out of range ($darken)")
|
||||||
|
|
||||||
val darkenColoured = Color(darken, darken, darken, 1f)
|
val darkenColoured = Color(darken, darken, darken, darken)
|
||||||
return darkenColoured(data, darkenColoured)
|
return darkenColoured(data, darkenColoured)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -543,7 +552,7 @@ object LightmapRenderer {
|
|||||||
private fun purgeLightmap() {
|
private fun purgeLightmap() {
|
||||||
for (y in 0..LIGHTMAP_HEIGHT - 1) {
|
for (y in 0..LIGHTMAP_HEIGHT - 1) {
|
||||||
for (x in 0..LIGHTMAP_WIDTH - 1) {
|
for (x in 0..LIGHTMAP_WIDTH - 1) {
|
||||||
lightmap[y][x] = Color(0f,0f,0f,1f)
|
lightmap[y][x] = Color(0f,0f,0f,0f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -559,12 +568,6 @@ object LightmapRenderer {
|
|||||||
inline fun Float.ceil() = FastMath.ceil(this)
|
inline fun Float.ceil() = FastMath.ceil(this)
|
||||||
inline fun Int.even(): Boolean = this and 1 == 0
|
inline fun Int.even(): Boolean = this and 1 == 0
|
||||||
inline fun Int.odd(): Boolean = this and 1 == 1
|
inline fun Int.odd(): Boolean = this and 1 == 1
|
||||||
/*inline fun Int.normaliseToColour(): Color = Color(
|
|
||||||
Math.min(this.r(), 1f),
|
|
||||||
Math.min(this.g(), 1f),
|
|
||||||
Math.min(this.b(), 1f),
|
|
||||||
1f
|
|
||||||
)*/
|
|
||||||
|
|
||||||
// TODO: float LUT lookup using linear interpolation
|
// TODO: float LUT lookup using linear interpolation
|
||||||
|
|
||||||
@@ -665,7 +668,10 @@ object LightmapRenderer {
|
|||||||
1f
|
1f
|
||||||
)
|
)
|
||||||
|
|
||||||
data class Lantern(val posX: Int, val posY: Int, val luminosity: Color)
|
/**
|
||||||
|
* color values are normalised -- 0.0 to 1.0 for 0..1023
|
||||||
|
*/
|
||||||
|
data class Lantern(val posX: Int, val posY: Int, val color: Color)
|
||||||
|
|
||||||
private fun Color.nonZero() = this.r != 0f || this.g != 0f || this.b != 0f || this.a != 0f
|
private fun Color.nonZero() = this.r != 0f || this.g != 0f || this.b != 0f || this.a != 0f
|
||||||
|
|
||||||
|
|||||||
@@ -4828,7 +4828,7 @@
|
|||||||
"height": 13,
|
"height": 13,
|
||||||
"autoResize": false,
|
"autoResize": false,
|
||||||
"underline": false,
|
"underline": false,
|
||||||
"text": "+luminosity: Int",
|
"text": "+color: Int",
|
||||||
"horizontalAlignment": 0,
|
"horizontalAlignment": 0,
|
||||||
"verticalAlignment": 5,
|
"verticalAlignment": 5,
|
||||||
"wordWrap": false
|
"wordWrap": false
|
||||||
@@ -12710,7 +12710,7 @@
|
|||||||
"_parent": {
|
"_parent": {
|
||||||
"$ref": "AAAAAAFYpmYlfnwyF/k="
|
"$ref": "AAAAAAFYpmYlfnwyF/k="
|
||||||
},
|
},
|
||||||
"name": "luminosity",
|
"name": "color",
|
||||||
"visibility": "public",
|
"visibility": "public",
|
||||||
"isStatic": false,
|
"isStatic": false,
|
||||||
"isLeaf": false,
|
"isLeaf": false,
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user