mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-12 19:44:05 +09:00
84 lines
3.0 KiB
Kotlin
84 lines
3.0 KiB
Kotlin
package net.torvald.terrarum.worlddrawer
|
|
|
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
|
import com.jme3.math.FastMath
|
|
import net.torvald.colourutil.ColourTemp
|
|
import net.torvald.terrarum.*
|
|
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZEF
|
|
import net.torvald.terrarum.blockproperties.Block
|
|
import net.torvald.terrarum.blockstats.TileSurvey
|
|
import net.torvald.terrarum.gameworld.GameWorld
|
|
import net.torvald.terrarum.ui.Toolkit
|
|
import kotlin.math.roundToInt
|
|
|
|
/**
|
|
* Created by minjaesong on 2015-12-31.
|
|
*/
|
|
object FeaturesDrawer {
|
|
|
|
/** World change is managed by IngameRenderer.setWorld() */
|
|
internal var world: GameWorld = GameWorld.makeNullWorld()
|
|
|
|
//const val TILE_SIZE = TILE_SIZE
|
|
|
|
private val ENV_COLTEMP_LOWEST = 5500
|
|
private val ENV_COLTEMP_HIGHEST = 7500
|
|
|
|
val ENV_COLTEMP_NOON = 6500 // 6500 == sRGB White; do not touch!
|
|
|
|
var colTemp: Int = 0
|
|
private set
|
|
|
|
init {
|
|
TileSurvey.submitProposal(
|
|
TileSurvey.SurveyProposal(
|
|
"basegame.FeaturesDrawer.coldTiles", 72, 48, 2, 2
|
|
) { world, x, y -> BlockCodex[world.getTileFromTerrain(x, y)].hasTag("COLD") }
|
|
)
|
|
TileSurvey.submitProposal(
|
|
TileSurvey.SurveyProposal(
|
|
"basegame.FeaturesDrawer.warmTiles", 72, 48, 2, 2
|
|
) { world, x, y -> BlockCodex[world.getTileFromTerrain(x, y)].hasTag("WARM") }
|
|
)
|
|
}
|
|
|
|
fun update(delta: Float) {
|
|
}
|
|
|
|
/**
|
|
* A colour filter used to provide effect that makes whole screen look warmer/cooler,
|
|
* usually targeted for the environmental temperature (desert/winterland), hence the name.
|
|
*/
|
|
fun drawEnvOverlay(batch: SpriteBatch) {
|
|
val onscreen_tiles_cap = 0.3
|
|
val onscreen_cold_tiles = (TileSurvey.getRatio("basegame.FeaturesDrawer.coldTiles") ?: 0.0).coerceAtMost(onscreen_tiles_cap)
|
|
val onscreen_warm_tiles = (TileSurvey.getRatio("basegame.FeaturesDrawer.warmTiles") ?: 0.0).coerceAtMost(onscreen_tiles_cap)
|
|
|
|
val colTemp_cold = colTempLinearFunc((onscreen_cold_tiles / onscreen_tiles_cap).toFloat())
|
|
val colTemp_warm = colTempLinearFunc(-(onscreen_warm_tiles / onscreen_tiles_cap).toFloat())
|
|
colTemp = colTemp_warm + colTemp_cold - ENV_COLTEMP_NOON
|
|
val zoom = Terrarum.ingame?.screenZoom ?: 1f
|
|
|
|
blendMul(batch)
|
|
|
|
batch.color = ColourTemp(colTemp)
|
|
Toolkit.fillArea(batch, 0, 0,
|
|
(App.scr.width * if (zoom < 1) 1f / zoom else zoom).roundToInt(),
|
|
(App.scr.height * if (zoom < 1) 1f / zoom else zoom).roundToInt()
|
|
)
|
|
|
|
blendNormalStraightAlpha(batch)
|
|
}
|
|
|
|
/**
|
|
|
|
* @param x [-1 , 1], 0 for 6500K (median of ENV_COLTEMP_HIGHEST and ENV_COLTEMP_LOWEST)
|
|
* *
|
|
* @return
|
|
*/
|
|
private fun colTempLinearFunc(x: Float): Int {
|
|
val colTempMedian = (ENV_COLTEMP_HIGHEST + ENV_COLTEMP_LOWEST) / 2
|
|
|
|
return ((ENV_COLTEMP_HIGHEST - ENV_COLTEMP_LOWEST) / 2 * x.coerceIn(-1f, 1f) + colTempMedian).roundToInt()
|
|
}
|
|
} |