mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-16 16:46:07 +09:00
UIs will draw on "backing" framebuffer where skybox is
This commit is contained in:
@@ -80,8 +80,8 @@ class StateInGame : BasicGameState() {
|
|||||||
|
|
||||||
val worldDrawFrameBuffer = Image(Terrarum.WIDTH.div(ZOOM_MIN).ceilInt(), Terrarum.HEIGHT.div(ZOOM_MIN).ceilInt())
|
val worldDrawFrameBuffer = Image(Terrarum.WIDTH.div(ZOOM_MIN).ceilInt(), Terrarum.HEIGHT.div(ZOOM_MIN).ceilInt())
|
||||||
val worldG = worldDrawFrameBuffer.graphics
|
val worldG = worldDrawFrameBuffer.graphics
|
||||||
val uisDrawFrameBuffer = Image(Terrarum.WIDTH, Terrarum.HEIGHT)
|
val backDrawFrameBuffer = Image(Terrarum.WIDTH, Terrarum.HEIGHT)
|
||||||
val uiG = uisDrawFrameBuffer.graphics
|
val backG = backDrawFrameBuffer.graphics
|
||||||
|
|
||||||
//private lateinit var shader12BitCol: Shader // grab LibGDX if you want some shader
|
//private lateinit var shader12BitCol: Shader // grab LibGDX if you want some shader
|
||||||
//private lateinit var shaderBlur: Shader
|
//private lateinit var shaderBlur: Shader
|
||||||
@@ -198,11 +198,11 @@ class StateInGame : BasicGameState() {
|
|||||||
// vital metre
|
// vital metre
|
||||||
// fill in getter functions by
|
// fill in getter functions by
|
||||||
// (uiAliases[UI_QUICK_BAR]!!.UI as UIVitalMetre).vitalGetterMax = { some_function }
|
// (uiAliases[UI_QUICK_BAR]!!.UI as UIVitalMetre).vitalGetterMax = { some_function }
|
||||||
uiAliases[UI_VITAL1] = UIHandler(UIVitalMetre(player, { 80f }, { 100f }, Color.red, 0))
|
uiAliases[UI_VITAL1] = UIHandler(UIVitalMetre(player, { 80f }, { 100f }, Color.red, 0), customPositioning = true)
|
||||||
uiAliases[UI_VITAL1]!!.setAsAlwaysVisible()
|
uiAliases[UI_VITAL1]!!.setAsAlwaysVisible()
|
||||||
uiAliases[UI_VITAL2] = UIHandler(UIVitalMetre(player, { 73f }, { 100f }, Color(0x00dfff), 1))
|
uiAliases[UI_VITAL2] = UIHandler(UIVitalMetre(player, { 73f }, { 100f }, Color(0x00dfff), 1), customPositioning = true)
|
||||||
uiAliases[UI_VITAL2]!!.setAsAlwaysVisible()
|
uiAliases[UI_VITAL2]!!.setAsAlwaysVisible()
|
||||||
uiAliases[UI_VITAL3] = UIHandler(UIVitalMetre(player, { 32f }, { 100f }, Color(0xffcc00), 2))
|
uiAliases[UI_VITAL3] = UIHandler(UIVitalMetre(player, { 32f }, { 100f }, Color(0xffcc00), 2), customPositioning = true)
|
||||||
uiAliases[UI_VITAL3]!!.setAsAlwaysVisible()
|
uiAliases[UI_VITAL3]!!.setAsAlwaysVisible()
|
||||||
|
|
||||||
|
|
||||||
@@ -357,17 +357,16 @@ class StateInGame : BasicGameState() {
|
|||||||
|
|
||||||
// clean the shit beforehand
|
// clean the shit beforehand
|
||||||
worldG.clear()
|
worldG.clear()
|
||||||
uiG.clear()
|
backG.clear()
|
||||||
|
|
||||||
blendNormal()
|
blendNormal()
|
||||||
|
|
||||||
|
|
||||||
drawSkybox(gwin) // drawing to gwin so that any lights from lamp wont "leak" to the skybox
|
drawSkybox(backG) // drawing to gwin so that any lights from lamp wont "leak" to the skybox
|
||||||
// e.g. Bright blue light on sunset
|
// e.g. Bright blue light on sunset
|
||||||
|
|
||||||
|
|
||||||
// make camara work //
|
// make camara work
|
||||||
// compensate for zoom. UIs must be treated specially! (see UIHandler)
|
|
||||||
worldG.translate(-MapCamera.x.toFloat(), -MapCamera.y.toFloat())
|
worldG.translate(-MapCamera.x.toFloat(), -MapCamera.y.toFloat())
|
||||||
|
|
||||||
|
|
||||||
@@ -472,21 +471,31 @@ class StateInGame : BasicGameState() {
|
|||||||
WorldSimulator.drawFluidMapDebug(worldG)
|
WorldSimulator.drawFluidMapDebug(worldG)
|
||||||
|
|
||||||
|
|
||||||
//////////////
|
|
||||||
// draw UIs //
|
|
||||||
//////////////
|
/////////////////
|
||||||
uiContainer.forEach { if (it != consoleHandler) it.render(gc, sbg, uiG) }
|
// GUI Predraw //
|
||||||
debugWindow.render(gc, sbg, uiG)
|
/////////////////
|
||||||
|
worldG.flush()
|
||||||
|
backG.drawImage(worldDrawFrameBuffer.getScaledCopy(screenZoom), 0f, 0f)
|
||||||
|
backG.flush()
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////
|
||||||
|
// draw UIs ONLY! //
|
||||||
|
/////////////////////
|
||||||
|
uiContainer.forEach { if (it != consoleHandler) it.render(gc, sbg, backG) }
|
||||||
|
debugWindow.render(gc, sbg, backG)
|
||||||
// make sure console draws on top of other UIs
|
// make sure console draws on top of other UIs
|
||||||
consoleHandler.render(gc, sbg, uiG)
|
consoleHandler.render(gc, sbg, backG)
|
||||||
notifier.render(gc, sbg, uiG)
|
notifier.render(gc, sbg, backG)
|
||||||
|
|
||||||
|
|
||||||
/////////////////
|
//////////////////
|
||||||
// draw layers //
|
// GUI Postdraw //
|
||||||
/////////////////
|
//////////////////
|
||||||
gwin.drawImage(worldDrawFrameBuffer.getScaledCopy(screenZoom), 0f, 0f)
|
backG.flush()
|
||||||
gwin.drawImage(uisDrawFrameBuffer, 0f, 0f)
|
gwin.drawImage(backDrawFrameBuffer, 0f, 0f)
|
||||||
|
|
||||||
|
|
||||||
// centre marker
|
// centre marker
|
||||||
|
|||||||
@@ -88,6 +88,12 @@ class StateUITest : BasicGameState() {
|
|||||||
override fun getID() = Terrarum.STATE_ID_TEST_UI1
|
override fun getID() = Terrarum.STATE_ID_TEST_UI1
|
||||||
|
|
||||||
override fun render(container: GameContainer, game: StateBasedGame, g: Graphics) {
|
override fun render(container: GameContainer, game: StateBasedGame, g: Graphics) {
|
||||||
|
blendNormal()
|
||||||
|
g.color = Color.green
|
||||||
|
g.fillRect(0f, 0f, 2048f, 2048f)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ui.render(container, game, g)
|
ui.render(container, game, g)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ class BasicDebugInfoWindow : UICanvas {
|
|||||||
val histogramH = 200
|
val histogramH = 200
|
||||||
|
|
||||||
private fun drawHistogram(g: Graphics, histogram: LightmapRenderer.Histogram, x: Int, y: Int) {
|
private fun drawHistogram(g: Graphics, histogram: LightmapRenderer.Histogram, x: Int, y: Int) {
|
||||||
val uiColour = Color(0xAA000000.toInt())
|
val uiColour = Color(0x80000000.toInt())
|
||||||
val barR = Color(0xDD0000)
|
val barR = Color(0xDD0000)
|
||||||
val barG = Color(0x00DD00)
|
val barG = Color(0x00DD00)
|
||||||
val barB = Color(0x0000DD)
|
val barB = Color(0x0000DD)
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import org.newdawn.slick.Input
|
|||||||
*/
|
*/
|
||||||
class ConsoleWindow : UICanvas, KeyboardControlled {
|
class ConsoleWindow : UICanvas, KeyboardControlled {
|
||||||
|
|
||||||
internal var UIColour = Color(0xCC000000.toInt())
|
internal var UIColour = Color(0x80404080.toInt())
|
||||||
|
|
||||||
private var inputCursorPos: Int = 0
|
private var inputCursorPos: Int = 0
|
||||||
private val MESSAGES_MAX = 5000
|
private val MESSAGES_MAX = 5000
|
||||||
|
|||||||
@@ -18,18 +18,17 @@ import org.newdawn.slick.state.StateBasedGame
|
|||||||
* Created by minjaesong on 15-12-31.
|
* Created by minjaesong on 15-12-31.
|
||||||
*/
|
*/
|
||||||
class UIHandler(val UI: UICanvas,
|
class UIHandler(val UI: UICanvas,
|
||||||
val toggleKey: Int? = null, val toggleButton: Int? = null
|
val toggleKey: Int? = null, val toggleButton: Int? = null,
|
||||||
|
// UI positions itself? (you must g.flush() yourself after the g.translate(Int, Int))
|
||||||
|
var customPositioning: Boolean = false
|
||||||
) {
|
) {
|
||||||
|
|
||||||
// X/Y Position to the game window.
|
// X/Y Position relative to the game window.
|
||||||
var posX: Int = 0
|
var posX: Int = 0
|
||||||
var posY: Int = 0
|
var posY: Int = 0
|
||||||
|
|
||||||
private var alwaysVisible = false
|
private var alwaysVisible = false
|
||||||
|
|
||||||
private val UIGraphicInstance: Graphics
|
|
||||||
private val UIDrawnCanvas: Image
|
|
||||||
|
|
||||||
var isOpening = false
|
var isOpening = false
|
||||||
var isClosing = false
|
var isClosing = false
|
||||||
var isOpened = false // fully opened
|
var isOpened = false // fully opened
|
||||||
@@ -56,11 +55,6 @@ class UIHandler(val UI: UICanvas,
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
UI.handler = this
|
UI.handler = this
|
||||||
|
|
||||||
println("[UIHandler] Creating framebuffer for UI '${UI.javaClass.simpleName}'")
|
|
||||||
|
|
||||||
UIDrawnCanvas = Image(UI.width, UI.height)
|
|
||||||
UIGraphicInstance = UIDrawnCanvas.graphics
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -123,14 +117,11 @@ class UIHandler(val UI: UICanvas,
|
|||||||
|
|
||||||
fun render(gc: GameContainer, sbg: StateBasedGame, ingameGraphics: Graphics) {
|
fun render(gc: GameContainer, sbg: StateBasedGame, ingameGraphics: Graphics) {
|
||||||
if (isVisible || alwaysVisible) {
|
if (isVisible || alwaysVisible) {
|
||||||
UIGraphicInstance.clear()
|
ingameGraphics.font = Terrarum.fontGame // default font. Re-assign in the UI to change
|
||||||
UIGraphicInstance.font = Terrarum.fontGame
|
|
||||||
|
|
||||||
UI.render(gc, UIGraphicInstance)
|
if (!customPositioning) ingameGraphics.translate(posX.toFloat(), posY.toFloat())
|
||||||
|
UI.render(gc, ingameGraphics)
|
||||||
ingameGraphics.drawImage(
|
ingameGraphics.flush()
|
||||||
UIDrawnCanvas, posX.toFloat(), posY.toFloat(), Color(1f, 1f, 1f, opacity)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class UIInventory(
|
|||||||
|
|
||||||
val catButtonsToCatIdent = HashMap<String, String>()
|
val catButtonsToCatIdent = HashMap<String, String>()
|
||||||
|
|
||||||
val backgroundColour = Color(0x1c1c1c)
|
val backgroundColour = Color(0xA0282828.toInt())
|
||||||
|
|
||||||
init {
|
init {
|
||||||
catButtonsToCatIdent.put("GAME_INVENTORY_WEAPONS", InventoryItem.Category.WEAPON)
|
catButtonsToCatIdent.put("GAME_INVENTORY_WEAPONS", InventoryItem.Category.WEAPON)
|
||||||
@@ -73,9 +73,10 @@ class UIInventory(
|
|||||||
defaultSelection = 0,
|
defaultSelection = 0,
|
||||||
iconSpriteSheet = SpriteSheet("./assets/graphics/gui/inventory/category.tga", 20, 20),
|
iconSpriteSheet = SpriteSheet("./assets/graphics/gui/inventory/category.tga", 20, 20),
|
||||||
iconSpriteSheetIndices = intArrayOf(9,0,1,2,3,4,5,6,7,8),
|
iconSpriteSheetIndices = intArrayOf(9,0,1,2,3,4,5,6,7,8),
|
||||||
highlightBackCol = backgroundColour screen Color(0x0c0c0c),
|
highlightBackCol = Color(0x0c0c0c),
|
||||||
highlightBackBlendMode = BlendMode.NORMAL,
|
highlightBackBlendMode = BlendMode.SCREEN,
|
||||||
backgroundCol = Color(0x383838),
|
backgroundCol = Color(0x383838),
|
||||||
|
backgroundBlendMode = BlendMode.MULTIPLY,
|
||||||
kinematic = true
|
kinematic = true
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -93,8 +94,6 @@ class UIInventory(
|
|||||||
mouseoverBackCol = Color(0x282828),
|
mouseoverBackCol = Color(0x282828),
|
||||||
mouseoverBackBlendMode = BlendMode.SCREEN,
|
mouseoverBackBlendMode = BlendMode.SCREEN,
|
||||||
drawBackOnNull = false
|
drawBackOnNull = false
|
||||||
//backCol = Color(0x101010),
|
|
||||||
//backBlendMode = BlendMode.SCREEN
|
|
||||||
) })
|
) })
|
||||||
val itemsScrollOffset = 0
|
val itemsScrollOffset = 0
|
||||||
|
|
||||||
@@ -175,6 +174,8 @@ class UIInventory(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun render(gc: GameContainer, g: Graphics) {
|
override fun render(gc: GameContainer, g: Graphics) {
|
||||||
|
//blendMul()
|
||||||
|
blendNormal()
|
||||||
g.color = backgroundColour
|
g.color = backgroundColour
|
||||||
g.fillRect(0f, 0f, width.toFloat(), height.toFloat())
|
g.fillRect(0f, 0f, width.toFloat(), height.toFloat())
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ class UIPieMenu : UICanvas {
|
|||||||
for (i in 0..slotCount - 1) {
|
for (i in 0..slotCount - 1) {
|
||||||
// set position
|
// set position
|
||||||
val angle = Math.PI * 2.0 * (i.toDouble() / slotCount) + Math.PI // 180 deg monitor-wise
|
val angle = Math.PI * 2.0 * (i.toDouble() / slotCount) + Math.PI // 180 deg monitor-wise
|
||||||
val slotCentrePoint = Vector2(0.0, slotDistanceFromCentre.toDouble()).setDirection(angle) + centrePoint
|
val slotCentrePoint = Vector2(0.0, slotDistanceFromCentre).setDirection(angle) + centrePoint
|
||||||
|
|
||||||
// draw cells
|
// draw cells
|
||||||
val color = if (i == selection)
|
val color = if (i == selection)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import net.torvald.terrarum.Terrarum
|
|||||||
import net.torvald.terrarum.gameactors.ActorHumanoid
|
import net.torvald.terrarum.gameactors.ActorHumanoid
|
||||||
import net.torvald.terrarum.gameactors.floorInt
|
import net.torvald.terrarum.gameactors.floorInt
|
||||||
import net.torvald.terrarum.gameactors.roundInt
|
import net.torvald.terrarum.gameactors.roundInt
|
||||||
|
import net.torvald.terrarum.mapdrawer.MapCamera
|
||||||
import org.newdawn.slick.Color
|
import org.newdawn.slick.Color
|
||||||
import org.newdawn.slick.GameContainer
|
import org.newdawn.slick.GameContainer
|
||||||
import org.newdawn.slick.Graphics
|
import org.newdawn.slick.Graphics
|
||||||
@@ -27,10 +28,17 @@ class UIVitalMetre(
|
|||||||
override var width: Int = 80 + 2 * margin; set(value) { throw Error("operation not permitted") }
|
override var width: Int = 80 + 2 * margin; set(value) { throw Error("operation not permitted") }
|
||||||
override var height: Int; get() = player?.baseHitboxH ?: 0 * 3 + margin; set(value) { throw Error("operation not permitted") }
|
override var height: Int; get() = player?.baseHitboxH ?: 0 * 3 + margin; set(value) { throw Error("operation not permitted") }
|
||||||
override var handler: UIHandler? = null
|
override var handler: UIHandler? = null
|
||||||
|
set(value) {
|
||||||
|
// override customPositioning to be true
|
||||||
|
if (value != null) {
|
||||||
|
value.customPositioning = true
|
||||||
|
}
|
||||||
|
field = value
|
||||||
|
}
|
||||||
override var openCloseTime: Int = 50
|
override var openCloseTime: Int = 50
|
||||||
|
|
||||||
private val relativePX = width / 2f
|
//private val relativePX = width / 2f
|
||||||
private val relativePY: Float; get() = (player?.baseHitboxH ?: 0) * 1.5f
|
private val offsetY: Float; get() = (player?.baseHitboxH ?: 0) * 1.5f
|
||||||
private val circleRadius: Float; get() = (player?.baseHitboxH ?: 0) * 3f
|
private val circleRadius: Float; get() = (player?.baseHitboxH ?: 0) * 3f
|
||||||
|
|
||||||
private val theta = 33f
|
private val theta = 33f
|
||||||
@@ -41,21 +49,35 @@ class UIVitalMetre(
|
|||||||
|
|
||||||
override fun update(gc: GameContainer, delta: Int) {
|
override fun update(gc: GameContainer, delta: Int) {
|
||||||
handler!!.setPosition(
|
handler!!.setPosition(
|
||||||
(Terrarum.HALFW - relativePX).roundInt(),
|
Terrarum.HALFW,
|
||||||
(Terrarum.HALFH - relativePY).floorInt()
|
Terrarum.HALFH
|
||||||
)
|
)
|
||||||
|
|
||||||
|
handler!!.customPositioning = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g must be same as World Graphics!
|
||||||
|
*/
|
||||||
override fun render(gc: GameContainer, g: Graphics) {
|
override fun render(gc: GameContainer, g: Graphics) {
|
||||||
if (vitalGetterVal() != null && vitalGetterMax() != null) {
|
if (vitalGetterVal() != null && vitalGetterMax() != null && player != null) {
|
||||||
|
|
||||||
|
// FIXME does not work well with screen zoom, because of my custom g.translate
|
||||||
|
|
||||||
|
g.translate(
|
||||||
|
-MapCamera.x + player!!.centrePosPoint.x.toFloat(),
|
||||||
|
-MapCamera.y + player!!.centrePosPoint.y.toFloat()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
g.lineWidth = 2f
|
g.lineWidth = 2f
|
||||||
|
|
||||||
// background
|
// background
|
||||||
g.color = backColor
|
g.color = backColor
|
||||||
g.drawArc(
|
g.drawArc(
|
||||||
relativePX - circleRadius - order * gap,
|
|
||||||
-circleRadius - order * gap,
|
-circleRadius - order * gap,
|
||||||
|
-circleRadius - order * gap - offsetY,
|
||||||
circleRadius * 2f + order * gap * 2,
|
circleRadius * 2f + order * gap * 2,
|
||||||
circleRadius * 2f + order * gap * 2,
|
circleRadius * 2f + order * gap * 2,
|
||||||
90f - halfTheta,
|
90f - halfTheta,
|
||||||
@@ -64,13 +86,17 @@ class UIVitalMetre(
|
|||||||
|
|
||||||
g.color = color
|
g.color = color
|
||||||
g.drawArc(
|
g.drawArc(
|
||||||
relativePX - circleRadius - order * gap,
|
|
||||||
-circleRadius - order * gap,
|
-circleRadius - order * gap,
|
||||||
|
-circleRadius - order * gap - offsetY,
|
||||||
circleRadius * 2f + order * gap * 2,
|
circleRadius * 2f + order * gap * 2,
|
||||||
circleRadius * 2f + order * gap * 2,
|
circleRadius * 2f + order * gap * 2,
|
||||||
90f + halfTheta - theta * (vitalGetterVal()!! / vitalGetterMax()!!),
|
90f + halfTheta - theta * (vitalGetterVal()!! / vitalGetterMax()!!),
|
||||||
90f + halfTheta
|
90f + halfTheta
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
g.flush()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,10 +122,10 @@ class UIVitalMetre(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
X-------------+ (84)
|
+-------------+ (84)
|
||||||
| |
|
| |
|
||||||
| |
|
| |
|
||||||
| @ |
|
| X |
|
||||||
| @ |
|
| @ |
|
||||||
|, ,|
|
|, ,|
|
||||||
| ''-------'' |
|
| ''-------'' |
|
||||||
|
|||||||
Reference in New Issue
Block a user