Files
Terrarum/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt
Song Minjae 2131e86e76 more efficient particles
Former-commit-id: 56dad88ecd715ad6e357e33b903851a47a358dcd
Former-commit-id: c85c0b759a447c0461563d98156f59879fa95db2
2017-01-22 04:13:45 +09:00

274 lines
9.4 KiB
Kotlin

package net.torvald.terrarum.ui
import com.jme3.math.FastMath
import net.torvald.imagefont.GameFontBase
import net.torvald.terrarum.gameworld.PairedMapLayer
import net.torvald.terrarum.mapdrawer.LightmapRenderer
import net.torvald.terrarum.mapdrawer.TilesDrawer
import net.torvald.terrarum.mapdrawer.FeaturesDrawer
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.blendNormal
import net.torvald.terrarum.blendScreen
import net.torvald.terrarum.mapdrawer.MapCamera
import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
import org.newdawn.slick.Input
/**
* Created by minjaesong on 16-03-14.
*/
class BasicDebugInfoWindow : UICanvas {
override var width: Int = Terrarum.WIDTH
override var height: Int = Terrarum.HEIGHT
override var openCloseTime: Int = 0
override var handler: UIHandler? = null
private var prevPlayerX = 0.0
private var prevPlayerY = 0.0
private var xdelta = 0.0
private var ydelta = 0.0
val ccW = GameFontBase.colToCode["w"]
val ccG = GameFontBase.colToCode["g"]
val ccY = GameFontBase.colToCode["y"]
val ccR = GameFontBase.colToCode["r"]
val ccM = GameFontBase.colToCode["m"]
override fun processInput(gc: GameContainer, delta: Int, input: Input) {
}
override fun update(gc: GameContainer, delta: Int) {
val player = Terrarum.ingame.player
val hitbox = player.hitbox
xdelta = hitbox.pointedX - prevPlayerX
ydelta = hitbox.pointedY - prevPlayerY
prevPlayerX = hitbox.pointedX
prevPlayerY = hitbox.pointedY
}
override fun render(gc: GameContainer, g: Graphics) {
fun Int.rawR() = this / LightmapRenderer.MUL_2
fun Int.rawG() = this % LightmapRenderer.MUL_2 / LightmapRenderer.MUL
fun Int.rawB() = this % LightmapRenderer.MUL
val player = Terrarum.ingame.player
val mouseTileX = ((MapCamera.x + gc.input.mouseX / Terrarum.ingame.screenZoom) / FeaturesDrawer.TILE_SIZE).toInt()
val mouseTileY = ((MapCamera.y + gc.input.mouseY / Terrarum.ingame.screenZoom) / FeaturesDrawer.TILE_SIZE).toInt()
g.font = Terrarum.fontSmallNumbers
g.color = GameFontBase.codeToCol["y"]
val hitbox = player.hitbox
val nextHitbox = player.nextHitbox
/**
* First column
*/
printLine(g, 1, "posX "
+ ccG
+ "${hitbox.pointedX}"
+ " ("
+ "${(hitbox.pointedX / FeaturesDrawer.TILE_SIZE).toInt()}"
+ ")")
printLine(g, 2, "posY "
+ ccG
+ hitbox.pointedY.toString()
+ " ("
+ (hitbox.pointedY / FeaturesDrawer.TILE_SIZE).toInt().toString()
+ ")")
printLine(g, 3, "veloX reported $ccG${player.moveDelta.x}")
printLine(g, 4, "veloY reported $ccG${player.moveDelta.y}")
printLineColumn(g, 2, 3, "veloX measured $ccG${xdelta}")
printLineColumn(g, 2, 4, "veloY measured $ccG${ydelta}")
printLine(g, 5, "grounded $ccG${player.grounded}")
printLine(g, 6, "noClip $ccG${player.noClip}")
//printLine(g, 7, "jump $ccG${player.jumpAcc}")
val lightVal: String
val mtX = mouseTileX.toString()
val mtY = mouseTileY.toString()
val valRaw = LightmapRenderer.getValueFromMap(mouseTileX, mouseTileY) ?: -1
val rawR = valRaw.rawR()
val rawG = valRaw.rawG()
val rawB = valRaw.rawB()
lightVal = if (valRaw == -1) ""
else valRaw.toString() + " (" +
rawR.toString() + " " +
rawG.toString() + " " +
rawB.toString() + ")"
printLine(g, 8, "light@cursor $ccG$lightVal")
val tileNo: String
val tileNumRaw = Terrarum.ingame.world.getTileFromTerrain(mouseTileX, mouseTileY) ?: -1
val tilenum = tileNumRaw / PairedMapLayer.RANGE
val tiledmg = tileNumRaw % PairedMapLayer.RANGE
tileNo = if (tileNumRaw == -1) "" else "$tilenum:$tiledmg"
printLine(g, 9, "tile@cursor $ccG$tileNo ($mtX, $mtY)")
/**
* Second column
*/
printLineColumn(g, 2, 1, "VSync $ccG" + Terrarum.appgc.isVSyncRequested)
printLineColumn(g, 2, 2, "Env colour temp $ccG" + FeaturesDrawer.colTemp)
printLineColumn(g, 2, 5, "Time $ccG${Terrarum.ingame.world.time.elapsedSeconds}" +
" (${Terrarum.ingame.world.time.getFormattedTime()})")
printLineColumn(g, 2, 6, "Mass $ccG${player.mass}")
printLineColumn(g, 2, 7, "p_WalkX $ccG${player.walkX}")
printLineColumn(g, 2, 8, "p_WalkY $ccG${player.walkY}")
drawHistogram(g, LightmapRenderer.histogram,
Terrarum.WIDTH - histogramW - 30,
Terrarum.HEIGHT - histogramH - 30
)
if (Terrarum.controller != null) {
drawGamepadAxis(g,
Terrarum.controller!!.getAxisValue(3),
Terrarum.controller!!.getAxisValue(2),
Terrarum.WIDTH - 135,
40
)
}
/**
* Top right
*/
g.color = GameFontBase.codeToCol["y"]
g.drawString("${ccY}MEM ", (Terrarum.WIDTH - 15 * 8 - 2).toFloat(), 2f)
//g.drawString("${ccY}FPS $ccG${Terrarum.appgc.fps}", (Terrarum.WIDTH - 6 * 8 - 2).toFloat(), 10f)
g.drawString("${ccY}CPUs ${if (Terrarum.MULTITHREAD) ccG else ccR}${Terrarum.THREADS}",
(Terrarum.WIDTH - 2 - 6*8).toFloat(), 10f)
g.color = GameFontBase.codeToCol["g"]
g.drawString("${Terrarum.memInUse}M",
(Terrarum.WIDTH - 11 * 8 - 2).toFloat(), 2f)
g.drawString("/${Terrarum.totalVMMem}M",
(Terrarum.WIDTH - 6 * 8 - 2).toFloat(), 2f)
/**
* Bottom left
*/
g.drawString("${ccY}Actors total $ccG${Terrarum.ingame.actorContainer.size + Terrarum.ingame.actorContainerInactive.size}",
2f, Terrarum.HEIGHT - 10f)
g.drawString("${ccY}Active $ccG${Terrarum.ingame.actorContainer.size}",
(2 + 17*8).toFloat(), Terrarum.HEIGHT - 10f)
g.drawString("${ccY}Dormant $ccG${Terrarum.ingame.actorContainerInactive.size}",
(2 + 28*8).toFloat(), Terrarum.HEIGHT - 10f)
g.drawString("${ccM}Particles $ccG${Terrarum.ingame.particlesContainer.elemCount}",
(2 + 41*8).toFloat(), Terrarum.HEIGHT - 10f)
}
private fun printLine(g: Graphics, l: Int, s: String) {
g.drawString(s, 10f, line(l))
}
private fun printLineColumn(g: Graphics, col: Int, row: Int, s: String) {
g.drawString(s, (10 + column(col)), line(row))
}
val histogramW = 256
val histogramH = 200
private fun drawHistogram(g: Graphics, histogram: LightmapRenderer.Histogram, x: Int, y: Int) {
val uiColour = Color(0xAA000000.toInt())
val barR = Color(0xDD0000)
val barG = Color(0x00DD00)
val barB = Color(0x0000DD)
val barColour = arrayOf(barR, barG, barB)
val w = histogramW.toFloat()
val h = histogramH.toFloat()
val range = histogram.range
val histogramMax = histogram.screen_tiles.toFloat()
g.color = uiColour
g.fillRect(x.toFloat(), y.toFloat(), w.plus(1), h)
g.color = Color.gray
g.drawString("0", x.toFloat(), y.toFloat() + h + 2)
g.drawString("255", x.toFloat() + w + 1 - 8*3, y.toFloat() + h + 2)
g.drawString("Histogramme", x + w / 2 - 5.5f * 8, y.toFloat() + h + 2)
blendScreen()
for (c in 0..2) {
for (i in 0..255) {
var histogram_value = if (i == 255) 0 else histogram.get(c)[i]
if (i == 255) {
for (k in 255..range - 1) {
histogram_value += histogram.get(c)[k]
}
}
val bar_x = x + (w / w.minus(1f)) * i.toFloat()
val bar_h = FastMath.ceil(h / histogramMax * histogram_value.toFloat()).toFloat()
val bar_y = y + (h / histogramMax) - bar_h + h
val bar_w = 1f
g.color = barColour[c]
g.fillRect(bar_x, bar_y, bar_w, bar_h)
}
}
blendNormal()
}
private fun drawGamepadAxis(g: Graphics, axisX: Float, axisY: Float, uiX: Int, uiY: Int) {
val uiColour = Color(0xAA000000.toInt())
val w = 128f
val h = 128f
val halfW = w / 2f
val halfH = h / 2f
val pointDX = axisX * halfW
val pointDY = axisY * halfH
val padName = if (Terrarum.controller!!.name.isEmpty()) "Gamepad"
else Terrarum.controller!!.name
blendNormal()
g.color = uiColour
g.fillRect(uiX.toFloat(), uiY.toFloat(), w, h)
g.color = Color.white
g.drawLine(uiX + halfW, uiY + halfH, uiX + halfW + pointDX, uiY + halfH + pointDY)
g.color = Color.gray
g.drawString(padName, uiX + w / 2 - (padName.length) * 4, uiY.toFloat() + h + 2)
}
private fun line(i: Int): Float = i * 10f
private fun column(i: Int): Float = 300f * (i - 1)
override fun doOpening(gc: GameContainer, delta: Int) {
}
override fun doClosing(gc: GameContainer, delta: Int) {
}
override fun endOpening(gc: GameContainer, delta: Int) {
}
override fun endClosing(gc: GameContainer, delta: Int) {
}
}