From e3fbb575306b5ae309fbeabf1f388c2e5cdafa87 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 20 May 2019 23:31:43 +0900 Subject: [PATCH] something's screwing up but commiting anyway --- .idea/misc.xml | 2 +- .../terrarum/blockproperties/BlockCodex.kt | 6 +- .../terrarum/blockproperties/BlockProp.kt | 8 +- .../terrarum/blockproperties/BlockPropUtil.kt | 10 +- .../console/SetGlobalLightOverride.kt | 15 +- .../torvald/terrarum/gameactors/Luminous.kt | 4 +- .../torvald/terrarum/gameworld/GameWorld.kt | 4 +- .../terrarum/modulebasegame/BuildingMaker.kt | 3 +- .../gameactors/ActorHumanoid.kt | 16 +- .../gameactors/FixtureTikiTorch.kt | 4 +- .../gameactors/ProjectileSimple.kt | 9 +- .../modulebasegame/gameactors/WeaponSwung.kt | 5 +- .../modulebasegame/weather/WeatherMixer.kt | 11 +- .../terrarum/ui/BasicDebugInfoWindow.kt | 8 +- src/net/torvald/terrarum/worlddrawer/Cvec.kt | 75 +++++++++ .../terrarum/worlddrawer/LightmapRenderer.kt | 18 +-- .../worlddrawer/LightmapRendererNew.kt | 153 ++++++++---------- 17 files changed, 201 insertions(+), 150 deletions(-) create mode 100644 src/net/torvald/terrarum/worlddrawer/Cvec.kt diff --git a/.idea/misc.xml b/.idea/misc.xml index 3e53d74a6..e75c5678f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -38,7 +38,7 @@ - + \ No newline at end of file diff --git a/src/net/torvald/terrarum/blockproperties/BlockCodex.kt b/src/net/torvald/terrarum/blockproperties/BlockCodex.kt index 3320a9a47..fe9e5286c 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockCodex.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockCodex.kt @@ -1,6 +1,5 @@ package net.torvald.terrarum.blockproperties -import com.badlogic.gdx.graphics.Color import net.torvald.terrarum.AppLoader import net.torvald.terrarum.AppLoader.printmsg import net.torvald.terrarum.gameworld.FluidType @@ -8,6 +7,7 @@ import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.MapLayer import net.torvald.terrarum.gameworld.PairedMapLayer import net.torvald.terrarum.utils.CSVFetcher +import net.torvald.terrarum.worlddrawer.Cvec import net.torvald.terrarum.worlddrawer.LightmapRenderer import org.apache.commons.csv.CSVRecord import java.io.IOException @@ -110,7 +110,7 @@ object BlockCodex { 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.opacity = Color(prop.shadeColR, prop.shadeColG, prop.shadeColB, prop.shadeColA) + prop.opacity = Cvec(floatArrayOf(prop.shadeColR, prop.shadeColG, prop.shadeColB, prop.shadeColA)) prop.strength = intVal(record, "str") prop.density = intVal(record, "dsty") @@ -119,7 +119,7 @@ object BlockCodex { prop.lumColG = floatVal(record, "lumg") / LightmapRenderer.MUL_FLOAT prop.lumColB = floatVal(record, "lumb") / LightmapRenderer.MUL_FLOAT prop.lumColA = floatVal(record, "lumuv") / LightmapRenderer.MUL_FLOAT - prop.internalLumCol = Color(prop.lumColR, prop.lumColG, prop.lumColB, prop.lumColA) + prop.internalLumCol = Cvec(floatArrayOf(prop.lumColR, prop.lumColG, prop.lumColB, prop.lumColA)) prop.friction = intVal(record, "fr") prop.viscosity = intVal(record, "vscs") diff --git a/src/net/torvald/terrarum/blockproperties/BlockProp.kt b/src/net/torvald/terrarum/blockproperties/BlockProp.kt index 8bca216e8..e676636b7 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockProp.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockProp.kt @@ -1,6 +1,6 @@ package net.torvald.terrarum.blockproperties -import com.badlogic.gdx.graphics.Color +import net.torvald.terrarum.worlddrawer.Cvec /** * Created by minjaesong on 2016-02-16. @@ -17,7 +17,7 @@ class BlockProp { var shadeColB = 0f var shadeColA = 0f - lateinit var opacity: Color + lateinit var opacity: Cvec var strength: Int = 0 var density: Int = 0 @@ -36,12 +36,12 @@ class BlockProp { var lumColG = 0f var lumColB = 0f var lumColA = 0f - lateinit var internalLumCol: Color + lateinit var internalLumCol: Cvec /** * @param luminosity */ - inline val luminosity: Color + inline val luminosity: Cvec get() = BlockPropUtil.getDynamicLumFunc(internalLumCol, dynamicLuminosityFunction) var drop: Int = 0 diff --git a/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt b/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt index 0cde2a6c5..fd8bff7f6 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt @@ -1,13 +1,13 @@ package net.torvald.terrarum.blockproperties import com.badlogic.gdx.Gdx -import com.badlogic.gdx.graphics.Color import com.jme3.math.FastMath import net.torvald.random.HQRNG import net.torvald.terrarum.Second import net.torvald.terrarum.Terrarum import net.torvald.terrarum.modulebasegame.gameworld.WorldTime import net.torvald.terrarum.modulebasegame.weather.WeatherMixer +import net.torvald.terrarum.worlddrawer.Cvec import net.torvald.terrarum.worlddrawer.LightmapRenderer /** @@ -37,7 +37,7 @@ object BlockPropUtil { } - private fun getTorchFlicker(baseLum: Color): Color { + private fun getTorchFlicker(baseLum: Cvec): Cvec { val funcY = FastMath.interpolateCatmullRom(0.0f, flickerFuncX / flickerFuncDomain, flickerP0, flickerP1, flickerP2, flickerP3 ) @@ -45,13 +45,13 @@ object BlockPropUtil { return LightmapRenderer.alterBrightnessUniform(baseLum, funcY) } - private fun getSlowBreath(baseLum: Color): Color { + private fun getSlowBreath(baseLum: Cvec): Cvec { val funcY = FastMath.sin(FastMath.PI * breathFuncX / breathCycleDuration) * breathRange return LightmapRenderer.alterBrightnessUniform(baseLum, funcY) } - private fun getPulsate(baseLum: Color): Color { + private fun getPulsate(baseLum: Cvec): Cvec { val funcY = FastMath.sin(FastMath.PI * pulsateFuncX / pulsateCycleDuration) * pulsateRange return LightmapRenderer.alterBrightnessUniform(baseLum, funcY) @@ -91,7 +91,7 @@ object BlockPropUtil { private fun linearInterpolation1D(a: Float, b: Float, x: Float) = a * (1 - x) + b * x - fun getDynamicLumFunc(baseLum: Color, type: Int): Color { + fun getDynamicLumFunc(baseLum: Cvec, type: Int): Cvec { return when (type) { 1 -> getTorchFlicker(baseLum) 2 -> (Terrarum.ingame!!.world).globalLight.cpy().mul(LightmapRenderer.DIV_FLOAT) // current global light diff --git a/src/net/torvald/terrarum/console/SetGlobalLightOverride.kt b/src/net/torvald/terrarum/console/SetGlobalLightOverride.kt index 50af96216..a54fd4712 100644 --- a/src/net/torvald/terrarum/console/SetGlobalLightOverride.kt +++ b/src/net/torvald/terrarum/console/SetGlobalLightOverride.kt @@ -1,10 +1,9 @@ package net.torvald.terrarum.console -import com.badlogic.gdx.graphics.Color -import net.torvald.terrarum.worlddrawer.LightmapRenderer import net.torvald.terrarum.Terrarum -import net.torvald.terrarum.modulebasegame.Ingame import net.torvald.terrarum.modulebasegame.weather.WeatherMixer +import net.torvald.terrarum.worlddrawer.Cvec +import net.torvald.terrarum.worlddrawer.LightmapRenderer /** * Created by minjaesong on 2016-02-17. @@ -14,11 +13,11 @@ internal object SetGlobalLightOverride : ConsoleCommand { override fun execute(args: Array) { if (args.size == 5) { try { - val r = args[1].toFloat() - val g = args[2].toFloat() - val b = args[3].toFloat() - val a = args[4].toFloat() - val GL = Color(r, g, b, a) + //val r = args[1].toFloat() + //val g = args[2].toFloat() + //val b = args[3].toFloat() + //val a = args[4].toFloat() + val GL = Cvec(args.sliceArray(1..4).map { it.toFloat() }.toFloatArray()) WeatherMixer.globalLightOverridden = true (Terrarum.ingame!!.world).globalLight = GL diff --git a/src/net/torvald/terrarum/gameactors/Luminous.kt b/src/net/torvald/terrarum/gameactors/Luminous.kt index 0a25c101d..83f792d4f 100644 --- a/src/net/torvald/terrarum/gameactors/Luminous.kt +++ b/src/net/torvald/terrarum/gameactors/Luminous.kt @@ -1,6 +1,6 @@ package net.torvald.terrarum.gameactors -import com.badlogic.gdx.graphics.Color +import net.torvald.terrarum.worlddrawer.Cvec /** * Created by minjaesong on 2016-02-19. @@ -26,7 +26,7 @@ interface Luminous { actorValue[AVKey.LUMA] = value.a * LightmapRenderer.MUL_FLOAT } */ - var color: Color + var color: Cvec /** * Arguments: diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index ed7494d57..b0c1694a7 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -1,7 +1,6 @@ package net.torvald.terrarum.gameworld -import com.badlogic.gdx.graphics.Color import net.torvald.terrarum.AppLoader.printdbg import net.torvald.terrarum.Terrarum import net.torvald.terrarum.blockproperties.Block @@ -10,6 +9,7 @@ import net.torvald.terrarum.blockproperties.Fluid import net.torvald.terrarum.modulebasegame.gameworld.WorldSimulator import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.serialise.ReadLayerDataZip +import net.torvald.terrarum.worlddrawer.Cvec import net.torvald.util.SortedArrayList import org.dyn4j.geometry.Vector2 import kotlin.math.absoluteValue @@ -90,7 +90,7 @@ open class GameWorld { /** Meter per second squared. Currently only the downward gravity is supported. No reverse gravity :p */ var gravitation: Vector2 = Vector2(0.0, 9.80665) /** 0.0..1.0+ */ - var globalLight = Color(0f,0f,0f,0f) + var globalLight = Cvec() var averageTemperature = 288f // 15 deg celsius; simulates global warming diff --git a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt index b6f5abde1..f64411bc4 100644 --- a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt +++ b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt @@ -27,6 +27,7 @@ import net.torvald.terrarum.serialise.toULittle48 import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UINSMenu import net.torvald.terrarum.worlddrawer.CreateTileAtlas.TILE_SIZE +import net.torvald.terrarum.worlddrawer.Cvec import net.torvald.terrarum.worlddrawer.LightmapRenderer import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack @@ -279,7 +280,7 @@ class BuildingMaker(batch: SpriteBatch) : IngameInstance(batch) { init { gameWorld.time.setTimeOfToday(WorldTime.HOUR_SEC * 10) - gameWorld.globalLight = Color(.8f,.8f,.8f,.8f) + gameWorld.globalLight = Cvec(.8f) essentialOverlays.add(blockPointingCursor) diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt index d94557697..4d0cec11e 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt @@ -1,7 +1,6 @@ package net.torvald.terrarum.modulebasegame.gameactors import com.badlogic.gdx.Gdx -import com.badlogic.gdx.graphics.Color import com.jme3.math.FastMath import net.torvald.spriteanimation.HasAssembledSprite import net.torvald.terrarum.* @@ -15,6 +14,7 @@ import net.torvald.terrarum.modulebasegame.Ingame import net.torvald.terrarum.modulebasegame.gameworld.time_t import net.torvald.terrarum.modulebasegame.ui.UIInventoryFull import net.torvald.terrarum.realestate.LandUtil +import net.torvald.terrarum.worlddrawer.Cvec import net.torvald.terrarum.worlddrawer.LightmapRenderer import org.dyn4j.geometry.Vector2 import java.util.* @@ -68,18 +68,18 @@ open class ActorHumanoid( if (houseDesignation != null) houseDesignation!!.clear() } - override var color: Color - get() = Color( + override var color: Cvec + get() = Cvec(floatArrayOf( (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 - ) + )) 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.vec[0] * LightmapRenderer.MUL_FLOAT + actorValue[AVKey.LUMG] = value.vec[1] * LightmapRenderer.MUL_FLOAT + actorValue[AVKey.LUMB] = value.vec[2] * LightmapRenderer.MUL_FLOAT + actorValue[AVKey.LUMA] = value.vec[3] * LightmapRenderer.MUL_FLOAT } /** diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt index 703fdfd2d..d0afb68a8 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt @@ -1,12 +1,12 @@ package net.torvald.terrarum.modulebasegame.gameactors -import com.badlogic.gdx.graphics.Color import net.torvald.terrarum.ModMgr import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.Hitbox import net.torvald.terrarum.gameactors.Luminous +import net.torvald.terrarum.worlddrawer.Cvec import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import java.util.* @@ -17,7 +17,7 @@ internal class FixtureTikiTorch : FixtureBase( BlockBox(BlockBox.NO_COLLISION, 1, 2) ), Luminous { - override var color: Color + override var color: Cvec get() = BlockCodex[Block.TORCH].luminosity set(value) { throw UnsupportedOperationException() diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt index 9451d3b68..a8d5d7714 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt @@ -9,6 +9,7 @@ import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.gameactors.ActorWBMovable import net.torvald.terrarum.gameactors.Hitbox import net.torvald.terrarum.gameactors.Luminous +import net.torvald.terrarum.worlddrawer.Cvec import org.dyn4j.geometry.Vector2 import java.util.* @@ -31,8 +32,8 @@ open class ProjectileSimple( val speed: Int - override var color: Color - get() = (bulletDatabase[type][OFFSET_LUMINOSITY] as Color).cpy() + override var color: Cvec + get() = (bulletDatabase[type][OFFSET_LUMINOSITY] as Cvec).cpy() set(value) { } /** @@ -118,8 +119,8 @@ open class ProjectileSimple( val OFFSET_LUMINOSITY = 4 val bulletDatabase = arrayOf( // damage, display colour, no gravity, speed - arrayOf(7, Color(0xFF5429_FF.toInt()), true, 40, 32), - arrayOf(8, Color(0xFF5429_FF.toInt()), true, 20, 0) + arrayOf(7, Cvec(1f, .329f, .161f, 1f), true, 40, 32), + arrayOf(8, Cvec(1f, .329f, .161f, 1f), true, 20, 0) // ... ) } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/WeaponSwung.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/WeaponSwung.kt index 58d9ae398..94827e86d 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/WeaponSwung.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/WeaponSwung.kt @@ -1,10 +1,9 @@ package net.torvald.terrarum.modulebasegame.gameactors -import com.badlogic.gdx.graphics.Color import net.torvald.terrarum.gameactors.ActorWBMovable import net.torvald.terrarum.gameactors.Hitbox import net.torvald.terrarum.gameactors.Luminous -import net.torvald.terrarum.gameworld.GameWorld +import net.torvald.terrarum.worlddrawer.Cvec /** * Created by minjaesong on 2016-04-26. @@ -21,7 +20,7 @@ class WeaponSwung(val itemID: Int) : ActorWBMovable(RenderOrder.MIDTOP), Luminou actorValue[AVKey.LUMINOSITY] = value } */ - override var color: Color + override var color: Cvec get() = throw UnsupportedOperationException() set(value) { } diff --git a/src/net/torvald/terrarum/modulebasegame/weather/WeatherMixer.kt b/src/net/torvald/terrarum/modulebasegame/weather/WeatherMixer.kt index 4f3f0cc27..28186ebb8 100644 --- a/src/net/torvald/terrarum/modulebasegame/weather/WeatherMixer.kt +++ b/src/net/torvald/terrarum/modulebasegame/weather/WeatherMixer.kt @@ -22,6 +22,7 @@ import net.torvald.terrarum.modulebasegame.gameworld.WorldTime import net.torvald.terrarum.modulebasegame.worldgenerator.WorldGenerator import net.torvald.terrarum.utils.JsonFetcher import net.torvald.terrarum.worlddrawer.CreateTileAtlas +import net.torvald.terrarum.worlddrawer.Cvec import net.torvald.terrarum.worlddrawer.WorldCamera import java.io.File import java.util.* @@ -51,7 +52,7 @@ internal object WeatherMixer : RNGConsumer { lateinit var mixedWeather: BaseModularWeather - val globalLightNow = Color(0) + val globalLightNow = Cvec() // Weather indices const val WEATHER_GENERIC = "generic" @@ -133,7 +134,7 @@ internal object WeatherMixer : RNGConsumer { // calculate global light val globalLight = getGradientColour(skyboxColourMap, 2, timeNow) - globalLightNow.set(globalLight) + globalLightNow.setTo(floatArrayOf(globalLight.r, globalLight.g, globalLight.b, globalLight.a)) /* (copied from the shader source) @@ -178,8 +179,10 @@ internal object WeatherMixer : RNGConsumer { /** * Get a GL of specific time */ - fun getGlobalLightOfTime(timeInSec: Int): Color = - getGradientColour(currentWeather.skyboxGradColourMap, 2, timeInSec) + fun getGlobalLightOfTime(timeInSec: Int): Cvec { + val c = getGradientColour(currentWeather.skyboxGradColourMap, 2, timeInSec) + return Cvec(floatArrayOf(c.r, c.g, c.b, c.a)) + } fun getGradientColour(colorMap: GdxColorMap, row: Int, timeInSec: Int): Color { val dataPointDistance = WorldTime.DAY_LENGTH / colorMap.width diff --git a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt index 2308fd24d..c41595ec4 100644 --- a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt +++ b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt @@ -140,10 +140,10 @@ class BasicDebugInfoWindow : UICanvas() { val mtX = mouseTileX.toString() val mtY = mouseTileY.toString() val valRaw = LightmapRenderer.getLight(mouseTileX, mouseTileY) - val rawR = valRaw?.r?.times(100f)?.round()?.div(100f) - val rawG = valRaw?.g?.times(100f)?.round()?.div(100f) - val rawB = valRaw?.b?.times(100f)?.round()?.div(100f) - val rawA = valRaw?.a?.times(100f)?.round()?.div(100f) + val rawR = valRaw?.vec?.get(0)?.times(100f)?.round()?.div(100f) + val rawG = valRaw?.vec?.get(1)?.times(100f)?.round()?.div(100f) + val rawB = valRaw?.vec?.get(2)?.times(100f)?.round()?.div(100f) + val rawA = valRaw?.vec?.get(3)?.times(100f)?.round()?.div(100f) lightVal = if (valRaw == null) "—" else "$rawR $rawG $rawB $rawA" diff --git a/src/net/torvald/terrarum/worlddrawer/Cvec.kt b/src/net/torvald/terrarum/worlddrawer/Cvec.kt new file mode 100644 index 000000000..95a332d14 --- /dev/null +++ b/src/net/torvald/terrarum/worlddrawer/Cvec.kt @@ -0,0 +1,75 @@ +package net.torvald.terrarum.worlddrawer + +import kotlin.math.roundToInt + +//import jdk.incubator.vector.FloatVector + + +/** + * Get your panama JDK for linux/mac/windows at https://jdk.java.net/panama/ + * + * Created by minjaesong on 2019-05-20. + */ +class Cvec(val vec: FloatArray) { + + constructor(r: Float, g: Float, b: Float, a: Float) : this(floatArrayOf(r, g, b, a)) + constructor(scalar: Float) : this(FloatArray(4) { scalar }) + constructor() : this(FloatArray(4) { 0f }) + + private val epsilon = 1f / 512f + + fun cpy(): Cvec = Cvec(this.vec) + + fun setTo(scalar: Float) = setTo(FloatArray(4) { scalar }) + fun setTo(other: Cvec) = setTo(other.vec) + fun setTo(other: FloatArray): Cvec { + for (i in 0..3) { + this.vec[i] = other[i] + } + return this + } + + infix fun mul(scalar: Float): Cvec = mul(FloatArray(4) { scalar }) + infix fun mul(other: Cvec) = mul(other.vec) + + fun mul(other: FloatArray): Cvec { + for (i in 0..3) { + this.vec[i] *= other[i] + } + return this + } + + fun max(other: Cvec): Cvec = max(other.vec) + + fun max(other: FloatArray): Cvec { + for (i in 0..3) { + this.vec[i] = if (this.vec[i] >= other[i]) this.vec[i] else other[i] + } + return this + } + + /** + * true if at least one element in the vector is not zero. + */ + fun nonZero(): Boolean { + var oracc = 0 // set to 1 if the vector element is zero + for (i in 0..3) { + if (vec[i] in 0f..epsilon) + oracc = oracc or 1 + } + + return (oracc != 0) + } + + fun toRGBA8888(): Int { + var acc = 0 + for (i in 0..3) + acc += vec[i].coerceIn(0f, 1f).times(255f).roundToInt().shl(8 * (3 - i)) + + return acc + } + +} + + +//hg clone http://hg.openjdk.java.net/panama/dev/ \ No newline at end of file diff --git a/src/net/torvald/terrarum/worlddrawer/LightmapRenderer.kt b/src/net/torvald/terrarum/worlddrawer/LightmapRenderer.kt index d3cdd36a1..23f403d99 100644 --- a/src/net/torvald/terrarum/worlddrawer/LightmapRenderer.kt +++ b/src/net/torvald/terrarum/worlddrawer/LightmapRenderer.kt @@ -1,19 +1,5 @@ package net.torvald.terrarum.worlddrawer -import com.badlogic.gdx.graphics.Color -import com.badlogic.gdx.graphics.g2d.SpriteBatch -import com.jme3.math.FastMath -import net.torvald.terrarum.Terrarum -import net.torvald.terrarum.blockproperties.Block -import net.torvald.terrarum.blockproperties.BlockCodex -import net.torvald.terrarum.fillRect -import net.torvald.terrarum.floorInt -import net.torvald.terrarum.gameactors.ActorWBMovable -import net.torvald.terrarum.gameactors.Luminous -import net.torvald.terrarum.gameworld.GameWorld -import net.torvald.terrarum.modulebasegame.IngameRenderer -import java.util.* - /** * Warning: you are not going to store float value to the lightmap -- see RGB_HDR_LUT (beziér) * @@ -24,7 +10,7 @@ import java.util.* // NOTE: no Float16 on this thing: 67 kB of memory footage is totally acceptable -object LightmapRendererOld { +/*object LightmapRendererOld { lateinit var world: GameWorld @@ -771,4 +757,4 @@ object LightmapRendererOld { } return (1f - scale) * startValue + scale * endValue } -} +}*/ diff --git a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt index 91f1ced87..4479074c9 100644 --- a/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt +++ b/src/net/torvald/terrarum/worlddrawer/LightmapRendererNew.kt @@ -82,8 +82,8 @@ object LightmapRenderer { */ // it utilises alpha channel to determine brightness of "glow" sprites (so that alpha channel works like UV light) //private val lightmap: Array> = Array(LIGHTMAP_HEIGHT) { Array(LIGHTMAP_WIDTH, { Color(0f,0f,0f,0f) }) } // Can't use framebuffer/pixmap -- this is a fvec4 array, whereas they are ivec4. - private var lightmap: Array = Array(LIGHTMAP_WIDTH * LIGHTMAP_HEIGHT) { Color(0) } // Can't use framebuffer/pixmap -- this is a fvec4 array, whereas they are ivec4. - private val lanternMap = HashMap((Terrarum.ingame?.ACTORCONTAINER_INITIAL_SIZE ?: 2) * 4) + private var lightmap: Array = Array(LIGHTMAP_WIDTH * LIGHTMAP_HEIGHT) { Cvec() } // Can't use framebuffer/pixmap -- this is a fvec4 array, whereas they are ivec4. + private val lanternMap = HashMap((Terrarum.ingame?.ACTORCONTAINER_INITIAL_SIZE ?: 2) * 4) init { printdbg(this, "Overscan open: $overscan_open; opaque: $overscan_opaque") @@ -120,13 +120,13 @@ object LightmapRenderer { * @param x world tile coord * @param y world tile coord */ - internal fun getLight(x: Int, y: Int): Color? { + internal fun getLight(x: Int, y: Int): Cvec? { val col = getLightInternal(x, y) if (col == null) { return null } else { - return Color(col.r * MUL_FLOAT, col.g * MUL_FLOAT, col.b * MUL_FLOAT, col.a * MUL_FLOAT) + return col.cpy().mul(MUL_FLOAT) } } @@ -137,7 +137,7 @@ object LightmapRenderer { * @param y world tile coord */ // TODO in regard of "colour math against integers", return Int? - private fun getLightInternal(x: Int, y: Int): Color? { + private fun getLightInternal(x: Int, y: Int): Cvec? { if (y - for_y_start + overscan_open in 0 until LIGHTMAP_HEIGHT && x - for_x_start + overscan_open in 0 until LIGHTMAP_WIDTH) { @@ -164,7 +164,7 @@ object LightmapRenderer { * @param colour Color to write * @param applyFun A function ```foo(old_colour, given_colour)``` */ - private fun setLightOf(list: Array, x: Int, y: Int, colour: Color, applyFun: (Color, Color) -> Color = { _, c -> c }) { + private fun setLightOf(list: Array, x: Int, y: Int, colour: Cvec, applyFun: (Cvec, Cvec) -> Cvec = { _, c -> c }) { if (y - for_y_start + overscan_open in 0 until LIGHTMAP_HEIGHT && x - for_x_start + overscan_open in 0 until LIGHTMAP_WIDTH) { @@ -220,7 +220,8 @@ object LightmapRenderer { */ // set sunlight - sunLight.set(world.globalLight); sunLight.mul(DIV_FLOAT) + sunLight.setTo(world.globalLight) + sunLight.mul(DIV_FLOAT) // set no-op mask from solidity of the block AppLoader.measureDebugTime("Renderer.LightNoOpMask") { @@ -394,15 +395,15 @@ object LightmapRenderer { //private val ambientAccumulator = Color(0f,0f,0f,0f) - private val lightLevelThis = Color(0) + private val lightLevelThis = Cvec() private var thisTerrain = 0 private var thisFluid = GameWorld.FluidInfo(Fluid.NULL, 0f) - private val fluidAmountToCol = Color(0) + private val fluidAmountToCol = Cvec() private var thisWall = 0 - private val thisTileLuminosity = Color(0) - private val thisTileOpacity = Color(0) - private val thisTileOpacity2 = Color(0) // thisTileOpacity * sqrt(2) - private val sunLight = Color(0) + private val thisTileLuminosity = Cvec() + private val thisTileOpacity = Cvec() + private val thisTileOpacity2 = Cvec() // thisTileOpacity * sqrt(2) + private val sunLight = Cvec() /** * This function will alter following variables: @@ -416,35 +417,35 @@ object LightmapRenderer { * - sunlight */ private fun getLightsAndShades(x: Int, y: Int) { - lightLevelThis.set(colourNull) + lightLevelThis.setTo(colourNull) thisTerrain = world.getTileFromTerrain(x, y) ?: Block.STONE thisFluid = world.getFluid(x, y) thisWall = world.getTileFromWall(x, y) ?: Block.STONE if (thisFluid.type != Fluid.NULL) { - fluidAmountToCol.set(thisFluid.amount, thisFluid.amount, thisFluid.amount, thisFluid.amount) + fluidAmountToCol.setTo(thisFluid.amount) - thisTileLuminosity.set(BlockCodex[thisTerrain].luminosity) - thisTileLuminosity.maxAndAssign(BlockCodex[thisFluid.type].luminosity mul fluidAmountToCol) // already been div by four - thisTileOpacity.set(BlockCodex[thisTerrain].opacity) - thisTileOpacity.maxAndAssign(BlockCodex[thisFluid.type].opacity mul fluidAmountToCol) // already been div by four + thisTileLuminosity.setTo(BlockCodex[thisTerrain].luminosity) + thisTileLuminosity.max(BlockCodex[thisFluid.type].luminosity mul fluidAmountToCol) // already been div by four + thisTileOpacity.setTo(BlockCodex[thisTerrain].opacity) + thisTileOpacity.max(BlockCodex[thisFluid.type].opacity mul fluidAmountToCol) // already been div by four } else { - thisTileLuminosity.set(BlockCodex[thisTerrain].luminosity) - thisTileOpacity.set(BlockCodex[thisTerrain].opacity) + thisTileLuminosity.setTo(BlockCodex[thisTerrain].luminosity) + thisTileOpacity.setTo(BlockCodex[thisTerrain].opacity) } - thisTileOpacity2.set(thisTileOpacity); thisTileOpacity2.mul(1.41421356f) + thisTileOpacity2.setTo(thisTileOpacity); thisTileOpacity2.mul(1.41421356f) //sunLight.set(world.globalLight); sunLight.mul(DIV_FLOAT) // moved to fireRecalculateEvent() // open air || luminous tile backed by sunlight if ((thisTerrain == AIR && thisWall == AIR) || (thisTileLuminosity.nonZero() && thisWall == AIR)) { - lightLevelThis.set(sunLight) + lightLevelThis.setTo(sunLight) } // blend lantern - lightLevelThis.maxAndAssign(thisTileLuminosity).maxAndAssign(lanternMap[LandUtil.getBlockAddr(world, x, y)] ?: colourNull) + lightLevelThis.max(thisTileLuminosity).max(lanternMap[LandUtil.getBlockAddr(world, x, y)] ?: colourNull) } @@ -499,7 +500,7 @@ object LightmapRenderer { /** * Calculates the light simulation, using main lightmap as one of the input. */ - private fun calculateAndAssign(lightmap: Array, x: Int, y: Int) { + private fun calculateAndAssign(lightmap: Array, x: Int, y: Int) { if (inNoopMask(x, y)) return @@ -517,32 +518,27 @@ object LightmapRenderer { // will "overwrite" what's there in the lightmap if it's the first pass // takes about 2 ms on 6700K - /* + */lightLevelThis.maxAndAssign(darkenColoured(getLightInternal(x - 1, y - 1) ?: colourNull, thisTileOpacity2)) - /* + */lightLevelThis.maxAndAssign(darkenColoured(getLightInternal(x + 1, y - 1) ?: colourNull, thisTileOpacity2)) - /* + */lightLevelThis.maxAndAssign(darkenColoured(getLightInternal(x - 1, y + 1) ?: colourNull, thisTileOpacity2)) - /* + */lightLevelThis.maxAndAssign(darkenColoured(getLightInternal(x + 1, y + 1) ?: colourNull, thisTileOpacity2)) - /* * */lightLevelThis.maxAndAssign(darkenColoured(getLightInternal(x, y - 1) ?: colourNull, thisTileOpacity)) - /* * */lightLevelThis.maxAndAssign(darkenColoured(getLightInternal(x, y + 1) ?: colourNull, thisTileOpacity)) - /* * */lightLevelThis.maxAndAssign(darkenColoured(getLightInternal(x - 1, y) ?: colourNull, thisTileOpacity)) - /* * */lightLevelThis.maxAndAssign(darkenColoured(getLightInternal(x + 1, y) ?: colourNull, thisTileOpacity)) + /* + */lightLevelThis.max(darkenColoured(getLightInternal(x - 1, y - 1) ?: colourNull, thisTileOpacity2)) + /* + */lightLevelThis.max(darkenColoured(getLightInternal(x + 1, y - 1) ?: colourNull, thisTileOpacity2)) + /* + */lightLevelThis.max(darkenColoured(getLightInternal(x - 1, y + 1) ?: colourNull, thisTileOpacity2)) + /* + */lightLevelThis.max(darkenColoured(getLightInternal(x + 1, y + 1) ?: colourNull, thisTileOpacity2)) + /* * */lightLevelThis.max(darkenColoured(getLightInternal(x, y - 1) ?: colourNull, thisTileOpacity)) + /* * */lightLevelThis.max(darkenColoured(getLightInternal(x, y + 1) ?: colourNull, thisTileOpacity)) + /* * */lightLevelThis.max(darkenColoured(getLightInternal(x - 1, y) ?: colourNull, thisTileOpacity)) + /* * */lightLevelThis.max(darkenColoured(getLightInternal(x + 1, y) ?: colourNull, thisTileOpacity)) //return lightLevelThis.cpy() // it HAS to be a cpy(), otherwise all cells gets the same instance setLightOf(lightmap, x, y, lightLevelThis.cpy()) } - private fun getLightForOpaque(x: Int, y: Int): Color? { // ...so that they wouldn't appear too dark + private fun getLightForOpaque(x: Int, y: Int): Cvec? { // ...so that they wouldn't appear too dark val l = getLightInternal(x, y) if (l == null) return null // brighten if solid if (BlockCodex[world.getTileFromTerrain(x, y)].isSolid) { - return Color( - (l.r * 1.2f), - (l.g * 1.2f), - (l.b * 1.2f), - (l.a * 1.2f) - ) + return l.cpy().mul(1.2f) } else { return l @@ -551,8 +547,7 @@ object LightmapRenderer { var lightBuffer: Pixmap = Pixmap(1, 1, Pixmap.Format.RGBA8888) - private val colourNull = Color(0) - private val epsilon = 1f/1024f + private val colourNull = Cvec() private var _lightBufferAsTex: Texture = Texture(1, 1, Pixmap.Format.RGBA8888) @@ -568,7 +563,7 @@ object LightmapRenderer { // wipe out beforehand. You DO need this lightBuffer.blending = Pixmap.Blending.None // gonna overwrite (remove this line causes the world to go bit darker) - lightBuffer.setColor(colourNull) + lightBuffer.setColor(0) lightBuffer.fill() @@ -581,12 +576,11 @@ object LightmapRenderer { for (x in this_x_start..this_x_end) { - val color = (getLightForOpaque(x, y) ?: Color(0f, 0f, 0f, 0f)).normaliseToHDR() + val color: RGBA8888 = (getLightForOpaque(x, y) ?: Cvec()).normaliseToHDR().toRGBA8888() lightBuffer.setColor(color) //lightBuffer.drawPixel(x - this_x_start, y - this_y_start) - lightBuffer.drawPixel(x - this_x_start, lightBuffer.height - 1 - y + this_y_start) // flip Y } } @@ -620,15 +614,17 @@ object LightmapRenderer { * @param darken (0-255) per channel * @return darkened data (0-255) per channel */ - fun darkenColoured(data: Color, darken: Color): Color { + fun darkenColoured(data: Cvec, darken: Cvec): Cvec { // use equation with magic number 8.0 // this function, when done recursively (A_x = darken(A_x-1, C)), draws exponential curve. (R^2 = 1) - return Color( - data.r * (1f - darken.r * lightScalingMagic),//.clampZero(), - data.g * (1f - darken.g * lightScalingMagic),//.clampZero(), - data.b * (1f - darken.b * lightScalingMagic),//.clampZero(), - data.a * (1f - darken.a * lightScalingMagic)) + val newvec = data.cpy() + + for (i in 0..3) { + newvec.vec[i] = data.vec[i] * (1f - darken.vec[i] * lightScalingMagic) + } + + return newvec } /** @@ -638,13 +634,13 @@ object LightmapRenderer { * @param darken (0-255) * @return */ - fun darkenUniformInt(data: Color, darken: Float): Color { + /*fun darkenUniformInt(data: Color, darken: Float): Color { if (darken < 0 || darken > CHANNEL_MAX) throw IllegalArgumentException("darken: out of range ($darken)") val darkenColoured = Color(darken, darken, darken, darken) return darkenColoured(data, darkenColoured) - } + }*/ /** * Darken or brighten colour by 'brighten' argument @@ -653,26 +649,16 @@ object LightmapRenderer { * @param brighten (-1.0 - 1.0) negative means darkening * @return processed colour */ - fun alterBrightnessUniform(data: Color, brighten: Float): Color { - return Color( - data.r + brighten, - data.g + brighten, - data.b + brighten, - data.a + brighten - ) + fun alterBrightnessUniform(data: Cvec, brighten: Float): Cvec { + val newvec = data.cpy() + + for (i in 0..3) { + newvec.vec[i] = data.vec[i] + brighten + } + + return newvec } - /** infix is removed to clarify the association direction */ - fun Color.maxAndAssign(other: Color): Color { - this.set( - if (this.r > other.r) this.r else other.r, - if (this.g > other.g) this.g else other.g, - if (this.b > other.b) this.b else other.b, - if (this.a > other.a) this.a else other.a - ) - - return this - } private fun Float.inv() = 1f / this fun Float.floor() = FastMath.floor(this) @@ -723,7 +709,7 @@ object LightmapRenderer { _init = true } lightBuffer = Pixmap(tilesInHorizontal, tilesInVertical, Pixmap.Format.RGBA8888) - lightmap = Array(LIGHTMAP_WIDTH * LIGHTMAP_HEIGHT) { Color(0) } + lightmap = Array(LIGHTMAP_WIDTH * LIGHTMAP_HEIGHT) { Cvec() } printdbg(this, "Resize event") @@ -797,14 +783,15 @@ object LightmapRenderer { 1.0000f,1.0000f,1.0000f,1.0000f,1.0000f,1.0000f,1.0000f,1.0000f,1.0000f,1.0000f,1.0000f,1.0000f,1.0000f,1.0000f,1.0000f,1.0000f // isn't it beautiful? ) /** To eliminated visible edge on the gradient when 255/1023 is exceeded */ - internal fun Color.normaliseToHDR() = Color( - hdr(this.r.coerceIn(0f,1f)), - hdr(this.g.coerceIn(0f,1f)), - hdr(this.b.coerceIn(0f,1f)), - hdr(this.a.coerceIn(0f,1f)) - ) + internal fun Cvec.normaliseToHDR(): Cvec { + val newvec = this.cpy() - private fun Color.nonZero() = this.r + this.g + this.b + this.a > epsilon + for (i in 0..3) { + newvec.vec[i] = hdr(newvec.vec[i].coerceIn(0f,1f)) + } + + return newvec + } val histogram: Histogram get() { @@ -820,10 +807,10 @@ object LightmapRenderer { try { //val colour = lightmap[y][x] val colour = lightmap[y * LIGHTMAP_WIDTH + x] - reds[minOf(CHANNEL_MAX, colour.r.times(MUL).floorInt())] += 1 - greens[minOf(CHANNEL_MAX, colour.g.times(MUL).floorInt())] += 1 - blues[minOf(CHANNEL_MAX, colour.b.times(MUL).floorInt())] += 1 - uvs[minOf(CHANNEL_MAX, colour.a.times(MUL).floorInt())] += 1 + reds[minOf(CHANNEL_MAX, colour.vec[0].times(MUL).floorInt())] += 1 + greens[minOf(CHANNEL_MAX, colour.vec[1].times(MUL).floorInt())] += 1 + blues[minOf(CHANNEL_MAX, colour.vec[2].times(MUL).floorInt())] += 1 + uvs[minOf(CHANNEL_MAX, colour.vec[3].times(MUL).floorInt())] += 1 } catch (e: ArrayIndexOutOfBoundsException) { } }