magnified screen will display everything correctly scaled (but some buttons wont work for some reason)

This commit is contained in:
minjaesong
2022-08-10 00:04:26 +09:00
parent 6e0f9a5924
commit f4d8d72715
8 changed files with 171 additions and 110 deletions

View File

@@ -11,10 +11,7 @@ import com.badlogic.gdx.controllers.Controllers;
import com.badlogic.gdx.graphics.*; import com.badlogic.gdx.graphics.*;
import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.FloatFrameBuffer; import com.badlogic.gdx.graphics.glutils.*;
import com.badlogic.gdx.graphics.glutils.GLFrameBuffer;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.Disposable;
import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.GdxRuntimeException;
import com.badlogic.gdx.utils.JsonValue; import com.badlogic.gdx.utils.JsonValue;
@@ -545,6 +542,8 @@ public class App implements ApplicationListener {
CommonResourcePool.INSTANCE.loadAll(); CommonResourcePool.INSTANCE.loadAll();
} }
private FrameBuffer postProcessorOutFBO;
@Override @Override
public void render() { public void render() {
Gdx.gl.glDisable(GL20.GL_DITHER); Gdx.gl.glDisable(GL20.GL_DITHER);
@@ -561,6 +560,7 @@ public class App implements ApplicationListener {
gdxClearAndSetBlend(.094f, .094f, .094f, 0f); gdxClearAndSetBlend(.094f, .094f, .094f, 0f);
setCameraPosition(0, 0); setCameraPosition(0, 0);
// draw splash screen when predefined screen is null // draw splash screen when predefined screen is null
// because in normal operation, the only time screen == null is when the app is cold-launched // because in normal operation, the only time screen == null is when the app is cold-launched
// you can't have a text drawn here :v // you can't have a text drawn here :v
@@ -584,10 +584,13 @@ public class App implements ApplicationListener {
setScreen(notitle); setScreen(notitle);
} }
} }
postProcessorOutFBO = renderFBO;
} }
// draw the screen // draw the screen
else { else {
currentScreen.render(UPDATE_RATE); currentScreen.render(UPDATE_RATE);
postProcessorOutFBO = TerrarumPostProcessor.INSTANCE.draw(camera.combined, renderFBO);
} }
KeyToggler.INSTANCE.update(currentScreen instanceof TerrarumIngame); KeyToggler.INSTANCE.update(currentScreen instanceof TerrarumIngame);
@@ -597,9 +600,32 @@ public class App implements ApplicationListener {
// nested FBOs are just not a thing in GL! // nested FBOs are just not a thing in GL!
FrameBufferManager.end(); FrameBufferManager.end();
PostProcessor.INSTANCE.draw(camera.combined, renderFBO);
// process screenshot request
if (screenshotRequested) {
FrameBufferManager.begin(postProcessorOutFBO);
screenshotRequested = false;
try {
Pixmap p = Pixmap.createFromFrameBuffer(0, 0, scr.getWidth(), scr.getHeight());
PixmapIO.writePNG(Gdx.files.absolute(defaultDir+"/Screenshot-"+String.valueOf(System.currentTimeMillis())+".png"), p, 9, true);
p.dispose();
Terrarum.INSTANCE.getIngame().sendNotification("Screenshot taken");
}
catch (Throwable e) {
e.printStackTrace();
Terrarum.INSTANCE.getIngame().sendNotification("Failed to take screenshot: "+e.getMessage());
}
FrameBufferManager.end();
}
shaderPassthruRGBA.bind();
shaderPassthruRGBA.setUniformMatrix("u_projTrans", camera.combined);
shaderPassthruRGBA.setUniformi("u_texture", 0);
postProcessorOutFBO.getColorBufferTexture().bind(0);
fullscreenQuad.render(shaderPassthruRGBA, GL20.GL_TRIANGLES);
// process resize request // process resize request
if (resizeRequested) { if (resizeRequested) {
resizeRequested = false; resizeRequested = false;
@@ -607,22 +633,6 @@ public class App implements ApplicationListener {
} }
// process screenshot request
if (screenshotRequested) {
screenshotRequested = false;
try {
Pixmap p = Pixmap.createFromFrameBuffer(0, 0, scr.getWidth(), scr.getHeight());
PixmapIO.writePNG(Gdx.files.absolute(defaultDir+"/Screenshot-"+String.valueOf(System.currentTimeMillis())+".png"), p, 9, true);
p.dispose();
Terrarum.INSTANCE.getIngame().sendNotification("Screenshot taken");
}
catch (Throwable e) {
e.printStackTrace();
Terrarum.INSTANCE.getIngame().sendNotification("Failed to take screenshot: "+e.getMessage());
}
}
splashDisplayed = true; splashDisplayed = true;
GLOBAL_RENDER_TIMER += 1; GLOBAL_RENDER_TIMER += 1;
@@ -720,12 +730,23 @@ public class App implements ApplicationListener {
logoBatch.end(); logoBatch.end();
} }
/**
* This resize takes the apparent screen size (i.e. zoomed size) as parameters.
*
* All other Terrarum's resize() must take real screen size. (i.e not zoomed)
*
* @param w0 the new width in pixels
* @param h0 the new height in pixels
*/
@Override @Override
public void resize(int w, int h) { public void resize(int w0, int h0) {
double magn = getConfigDouble("screenmagnifying"); int w = (w0%2==0)?w0:w0+1;
int width = (int) Math.round(w / magn); int h = (h0%2==0)?h0:h0+1;
int height = (int) Math.round(h / magn);
float magn = (float) getConfigDouble("screenmagnifying");
int width = Math.round(w / magn);
int height = Math.round(h / magn);
printdbg(this, "Resize called: "+width+","+height); printdbg(this, "Resize called: "+width+","+height);
@@ -735,9 +756,10 @@ public class App implements ApplicationListener {
//initViewPort(width, height); //initViewPort(width, height);
scr.setDimension(width, height); scr.setDimension(width, height, magn, w, h);
if (currentScreen != null) currentScreen.resize(scr.getWidth(), scr.getHeight()); if (currentScreen != null) currentScreen.resize(scr.getWidth(), scr.getHeight());
TerrarumPostProcessor.INSTANCE.resize(scr.getWidth(), scr.getHeight());
updateFullscreenQuad(scr.getWidth(), scr.getHeight()); updateFullscreenQuad(scr.getWidth(), scr.getHeight());
@@ -1085,7 +1107,7 @@ public class App implements ApplicationListener {
operationSystem = "WINDOWS"; operationSystem = "WINDOWS";
defaultDir = System.getenv("APPDATA") + "/Terrarum"; defaultDir = System.getenv("APPDATA") + "/Terrarum";
} }
else if (OS.contains("OS X")) { else if (OS.contains("OS X") || OS.contains("MACOS")) { // OpenJDK for mac will still report "Mac OS X" with version number "10.16", even on Big Sur and beyond
operationSystem = "OSX"; operationSystem = "OSX";
defaultDir = System.getProperty("user.home") + "/Library/Application Support/Terrarum"; defaultDir = System.getProperty("user.home") + "/Library/Application Support/Terrarum";
} }

View File

@@ -223,16 +223,16 @@ object Terrarum : Disposable {
/** Position of the cursor in the world, rounded */ /** Position of the cursor in the world, rounded */
val mouseX: Double val mouseX: Double
get() = (WorldCamera.zoomedX + Gdx.input.x / (ingame?.screenZoom ?: 1f).times(scr.magn)).fmod(WorldCamera.worldWidth.toDouble()) get() = (WorldCamera.zoomedX + Gdx.input.x / (ingame?.screenZoom ?: 1f).times(scr.magn.toDouble())).fmod(WorldCamera.worldWidth.toDouble())
/** Position of the cursor in the world */ /** Position of the cursor in the world */
val mouseY: Double val mouseY: Double
get() = (WorldCamera.zoomedY + Gdx.input.y / (ingame?.screenZoom ?: 1f).times(scr.magn)) get() = (WorldCamera.zoomedY + Gdx.input.y / (ingame?.screenZoom ?: 1f).times(scr.magn.toDouble()))
/** Position of the cursor in the world, rounded */ /** Position of the cursor in the world, rounded */
val oldMouseX: Double val oldMouseX: Double
get() = (WorldCamera.zoomedX + (Gdx.input.x - Gdx.input.deltaX) / (ingame?.screenZoom ?: 1f).times(scr.magn)).fmod(WorldCamera.worldWidth.toDouble()) get() = (WorldCamera.zoomedX + (Gdx.input.x - Gdx.input.deltaX) / (ingame?.screenZoom ?: 1f).times(scr.magn.toDouble())).fmod(WorldCamera.worldWidth.toDouble())
/** Position of the cursor in the world */ /** Position of the cursor in the world */
val oldMouseY: Double val oldMouseY: Double
get() = WorldCamera.zoomedY + (Gdx.input.y - Gdx.input.deltaY) / (ingame?.screenZoom ?: 1f).times(scr.magn) get() = WorldCamera.zoomedY + (Gdx.input.y - Gdx.input.deltaY) / (ingame?.screenZoom ?: 1f).times(scr.magn.toDouble())
/** Position of the cursor in the world, rounded */ /** Position of the cursor in the world, rounded */
@JvmStatic val mouseTileX: Int @JvmStatic val mouseTileX: Int
get() = (mouseX / TILE_SIZE).floorInt() get() = (mouseX / TILE_SIZE).floorInt()

View File

@@ -2,10 +2,7 @@ package net.torvald.terrarum
import com.badlogic.gdx.Gdx import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Input import com.badlogic.gdx.Input
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.*
import com.badlogic.gdx.graphics.GL20
import com.badlogic.gdx.graphics.OrthographicCamera
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.glutils.FrameBuffer import com.badlogic.gdx.graphics.glutils.FrameBuffer
import com.badlogic.gdx.graphics.glutils.ShapeRenderer import com.badlogic.gdx.graphics.glutils.ShapeRenderer
import com.badlogic.gdx.math.Matrix4 import com.badlogic.gdx.math.Matrix4
@@ -20,7 +17,7 @@ import net.torvald.terrarum.ui.Toolkit
* *
* We recommened most of the user interfaces to be contained within the UI Area which has aspect ratio of 3:2. * We recommened most of the user interfaces to be contained within the UI Area which has aspect ratio of 3:2.
*/ */
object PostProcessor : Disposable { object TerrarumPostProcessor : Disposable {
private lateinit var batch: FlippingSpriteBatch // not nulling to save some lines of code private lateinit var batch: FlippingSpriteBatch // not nulling to save some lines of code
private lateinit var shapeRenderer: ShapeRenderer private lateinit var shapeRenderer: ShapeRenderer
@@ -30,6 +27,8 @@ object PostProcessor : Disposable {
private var init = false private var init = false
private lateinit var outFBO: FrameBuffer
fun reloadLUT(filename: String) { fun reloadLUT(filename: String) {
lutTex = Texture(Gdx.files.internal("assets/clut/$filename")) lutTex = Texture(Gdx.files.internal("assets/clut/$filename"))
} }
@@ -62,19 +61,22 @@ object PostProcessor : Disposable {
App.disposables.add(this) App.disposables.add(this)
} }
fun resize(w: Int, h: Int) {
try { outFBO.dispose() } catch (_: UninitializedPropertyAccessException) {}
outFBO = FrameBuffer(Pixmap.Format.RGBA8888, w, h, false)
}
override fun dispose() { override fun dispose() {
batch.dispose() batch.dispose()
shapeRenderer.dispose() shapeRenderer.dispose()
functionRowHelper.dispose() functionRowHelper.dispose()
try { try { lutTex.dispose() } catch (_: UninitializedPropertyAccessException) {}
lutTex.dispose()
}
catch (e: UninitializedPropertyAccessException) { }
shaderPostDither.dispose() shaderPostDither.dispose()
shaderPostNoDither.dispose() shaderPostNoDither.dispose()
outFBO.dispose()
} }
fun draw(projMat: Matrix4, fbo: FrameBuffer) { fun draw(projMat: Matrix4, fbo: FrameBuffer): FrameBuffer {
// init // init
if (!init) { if (!init) {
@@ -89,65 +91,72 @@ object PostProcessor : Disposable {
batch.projectionMatrix = camera.combined batch.projectionMatrix = camera.combined
shapeRenderer = ShapeRenderer() shapeRenderer = ShapeRenderer()
shapeRenderer.projectionMatrix = camera.combined
Gdx.gl20.glViewport(0, 0, App.scr.width, App.scr.height) Gdx.gl20.glViewport(0, 0, App.scr.width, App.scr.height)
resize(App.scr.width, App.scr.height)
} }
debugUI.update(Gdx.graphics.deltaTime) debugUI.update(Gdx.graphics.deltaTime)
outFBO.inAction(camera, batch) {
App.measureDebugTime("Renderer.PostProcessor") {
App.measureDebugTime("Renderer.PostProcessor") { gdxClearAndSetBlend(.094f, .094f, .094f, 0f)
gdxClearAndSetBlend(.094f, .094f, .094f, 0f) fbo.colorBufferTexture.setFilter(
Texture.TextureFilter.Linear,
if (App.scr.magn % 1.0 < 0.0001) Texture.TextureFilter.Nearest else Texture.TextureFilter.Linear
)
fbo.colorBufferTexture.setFilter( postShader(projMat, fbo)
Texture.TextureFilter.Linear,
if (App.scr.magn % 1.0 < 0.0001) Texture.TextureFilter.Nearest else Texture.TextureFilter.Linear
)
postShader(projMat, fbo) // draw things when F keys are on
if (App.IS_DEVELOPMENT_BUILD && KeyToggler.isOn(Input.Keys.F11)) {
// draw things when F keys are on drawSafeArea()
if (App.IS_DEVELOPMENT_BUILD && KeyToggler.isOn(Input.Keys.F11)) {
drawSafeArea()
}
if (KeyToggler.isOn(Input.Keys.F1)) {
batch.color = Color.WHITE
batch.inUse {
it.draw(functionRowHelper,
(App.scr.width - functionRowHelper.width) / 2f,
functionRowHelper.height.toFloat(),
functionRowHelper.width.toFloat(),
functionRowHelper.height * -1f
)
} }
}
if (KeyToggler.isOn(Input.Keys.F10)) {
batch.color = Color.WHITE if (KeyToggler.isOn(Input.Keys.F1)) {
batch.inUse { batch.color = Color.WHITE
App.fontSmallNumbers.draw(it, "Wire draw class: ${(Terrarum.ingame as? net.torvald.terrarum.modulebasegame.TerrarumIngame)?.selectedWireRenderClass}", 2f, 2f) batch.inUse {
it.draw(functionRowHelper,
(App.scr.width - functionRowHelper.width) / 2f,
0f,
functionRowHelper.width.toFloat(),
functionRowHelper.height.toFloat()
)
}
} }
}
if (KeyToggler.isOn(Input.Keys.F3)) { if (KeyToggler.isOn(Input.Keys.F10)) {
if (!debugUI.isOpened && !debugUI.isOpening) debugUI.setAsOpen() batch.color = Color.WHITE
batch.inUse { debugUI.renderUI(batch, camera) } batch.inUse {
} App.fontSmallNumbers.draw(it, "Wire draw class: ${(Terrarum.ingame as? net.torvald.terrarum.modulebasegame.TerrarumIngame)?.selectedWireRenderClass}", 2f, 2f)
else { }
if (!debugUI.isClosed && !debugUI.isClosing) debugUI.setAsClose() }
}
// draw dev build notifiers if (KeyToggler.isOn(Input.Keys.F3)) {
if (App.IS_DEVELOPMENT_BUILD && Terrarum.ingame != null) { if (!debugUI.isOpened && !debugUI.isOpening) debugUI.setAsOpen()
batch.inUse { batch.inUse { debugUI.renderUI(batch, camera) }
batch.color = safeAreaCol }
App.fontGame.draw(it, thisIsDebugStr, 5f, App.scr.height - 24f) else {
if (!debugUI.isClosed && !debugUI.isClosing) debugUI.setAsClose()
}
// draw dev build notifiers
if (App.IS_DEVELOPMENT_BUILD && Terrarum.ingame != null) {
batch.inUse {
batch.color = safeAreaCol
App.fontGame.draw(it, thisIsDebugStr, 5f, App.scr.height - 24f)
}
} }
} }
} }
return outFBO
} }
private val rng = HQRNG() private val rng = HQRNG()
@@ -176,40 +185,49 @@ object PostProcessor : Disposable {
} }
private fun drawSafeArea() { private fun drawSafeArea() {
val magn = App.scr.magn
val tvSafeAreaW = App.scr.tvSafeGraphicsWidth.toFloat() val tvSafeAreaW = App.scr.tvSafeGraphicsWidth.toFloat()
val tvSafeAreaH = App.scr.tvSafeGraphicsHeight.toFloat() val tvSafeAreaH = App.scr.tvSafeGraphicsHeight.toFloat()
val tvSafeArea2W = App.scr.tvSafeActionWidth.toFloat() val tvSafeArea2W = App.scr.tvSafeActionWidth.toFloat()
val tvSafeArea2H = App.scr.tvSafeActionHeight.toFloat() val tvSafeArea2H = App.scr.tvSafeActionHeight.toFloat()
val uiAreaHeight = App.scr.height - 2 * tvSafeAreaH val uiAreaHeight = App.scr.height - 2 * tvSafeAreaH
val uiAreaWidth = uiAreaHeight * recommendRatio val uiAreaWidth = uiAreaHeight * recommendRatio
val scrw = Toolkit.drawWidthf
val scrw = Toolkit.drawWidthf * magn
val scrh = App.scr.hf * magn
val rect2W = tvSafeArea2W * magn
val rect2H = tvSafeArea2H * magn
val rectW = tvSafeAreaW * magn
val rectH = tvSafeAreaH * magn
shapeRenderer.inUse(ShapeRenderer.ShapeType.Line) { shapeRenderer.inUse(ShapeRenderer.ShapeType.Line) {
// centre ind // centre ind
shapeRenderer.color = safeAreaCol2 shapeRenderer.color = safeAreaCol2
shapeRenderer.line(0f, 0f, scrw, App.scr.hf) shapeRenderer.line(0f, 0f, scrw, scrh)
shapeRenderer.line(0f, App.scr.hf, scrw, 0f) shapeRenderer.line(0f, scrh, scrw, 0f)
// safe action area // safe action area
shapeRenderer.color = safeAreaCol2 shapeRenderer.color = safeAreaCol2
shapeRenderer.rect( shapeRenderer.rect(
tvSafeArea2W, tvSafeArea2H, scrw - 2 * tvSafeArea2W, App.scr.height - 2 * tvSafeArea2H rect2W, rect2H, scrw - 2 * rect2W, App.scr.height * magn - 2 * rect2H
) )
// safe graphics area // safe graphics area
shapeRenderer.color = safeAreaCol shapeRenderer.color = safeAreaCol
shapeRenderer.rect( shapeRenderer.rect(
tvSafeAreaW, tvSafeAreaH, scrw - 2 * tvSafeAreaW, App.scr.height - 2 * tvSafeAreaH rectW, rectH, scrw - 2 * rectW, App.scr.height * magn - 2 * rectH
) )
// default res ind // default res ind
shapeRenderer.color = defaultResCol shapeRenderer.color = defaultResCol
shapeRenderer.rect( shapeRenderer.rect(
(scrw - uiAreaWidth).div(2f), (scrw - uiAreaWidth * magn).div(2f),
(App.scr.height - uiAreaHeight).div(2f), (App.scr.height - uiAreaHeight).times(magn).div(2f),
uiAreaWidth, uiAreaWidth * magn,
uiAreaHeight uiAreaHeight * magn
) )
} }
@@ -224,14 +242,14 @@ object PostProcessor : Disposable {
batch.color = defaultResCol batch.color = defaultResCol
App.fontSmallNumbers.draw( App.fontSmallNumbers.draw(
batch, defaultResStr, batch, defaultResStr,
(scrw - uiAreaWidth).div(2f), (Toolkit.drawWidthf - uiAreaWidth).div(2f),
tvSafeAreaH tvSafeAreaH
) )
batch.color = currentResCol batch.color = currentResCol
App.fontSmallNumbers.draw( App.fontSmallNumbers.draw(
batch, currentResStr, batch, currentResStr,
scrw - 80f, Toolkit.drawWidthf - 80f,
0f 0f
) )
} }

View File

@@ -1,5 +1,6 @@
package net.torvald.terrarum package net.torvald.terrarum
import net.torvald.terrarum.App.printdbg
import kotlin.math.roundToInt import kotlin.math.roundToInt
class TerrarumScreenSize(scrw: Int = defaultW, scrh: Int = defaultH) { class TerrarumScreenSize(scrw: Int = defaultW, scrh: Int = defaultH) {
@@ -25,18 +26,21 @@ class TerrarumScreenSize(scrw: Int = defaultW, scrh: Int = defaultH) {
var aspectRatio: Float = 0f; private set var aspectRatio: Float = 0f; private set
var chatWidth: Int = 0; private set var chatWidth: Int = 0; private set
var magn: Double = 0.0; private set // this value is stored here so that the initial instance would stay, forcing the players to require restart to apply the screen magnifying var magn: Float = 0f; private set // this value is stored here so that the initial instance would stay, forcing the players to require restart to apply the screen magnifying
val tvSafeGraphicsWidth: Int; get() = Math.round(width * TV_SAFE_GRAPHICS) val tvSafeGraphicsWidth: Int; get() = Math.round(width * TV_SAFE_GRAPHICS)
val tvSafeGraphicsHeight: Int; get() = Math.round(height * TV_SAFE_GRAPHICS) val tvSafeGraphicsHeight: Int; get() = Math.round(height * TV_SAFE_GRAPHICS)
val tvSafeActionWidth: Int; get() = Math.round(width * TV_SAFE_ACTION) val tvSafeActionWidth: Int; get() = Math.round(width * TV_SAFE_ACTION)
val tvSafeActionHeight: Int; get() = Math.round(height * TV_SAFE_ACTION) val tvSafeActionHeight: Int; get() = Math.round(height * TV_SAFE_ACTION)
var windowW: Int = 0; private set
var windowH: Int = 0; private set
init { init {
setDimension(maxOf(minimumW, scrw), maxOf(minimumH, scrh)) setDimension(maxOf(minimumW, scrw), maxOf(minimumH, scrh), App.getConfigDouble("screenmagnifying").toFloat(), maxOf(minimumW, scrw), maxOf(minimumH, scrh))
} }
fun setDimension(scrw: Int, scrh: Int) { fun setDimension(scrw: Int, scrh: Int, magn: Float, ww: Int, wh: Int) {
width = scrw and 0x7FFFFFFE width = scrw and 0x7FFFFFFE
height = scrh and 0x7FFFFFFE height = scrh and 0x7FFFFFFE
wf = scrw.toFloat() wf = scrw.toFloat()
@@ -48,7 +52,14 @@ class TerrarumScreenSize(scrw: Int = defaultW, scrh: Int = defaultH) {
aspectRatio = wf / hf aspectRatio = wf / hf
chatWidth = (width - (width * 0.84375).roundToInt()) and 0x7FFFFFFE chatWidth = (width - (width * 0.84375).roundToInt()) and 0x7FFFFFFE
magn = App.getConfigDouble("screenmagnifying") this.magn = magn
windowW = ww
windowH = wh
printdbg(this, "Window dim: $ww x $wh, called by:")
printStackTrace(this)
} }
} }

View File

@@ -11,7 +11,8 @@ import com.badlogic.gdx.utils.Disposable
import com.badlogic.gdx.utils.GdxRuntimeException import com.badlogic.gdx.utils.GdxRuntimeException
import net.torvald.random.HQRNG import net.torvald.random.HQRNG
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.App.measureDebugTime import net.torvald.terrarum.App.*
import net.torvald.terrarum.Terrarum.ingame
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZEF import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZEF
import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ActorWithBody
@@ -28,6 +29,9 @@ import net.torvald.terrarum.worlddrawer.WorldCamera
import net.torvald.util.CircularArray import net.torvald.util.CircularArray
import kotlin.system.exitProcess import kotlin.system.exitProcess
/** /**
* This will be rendered to a postprocessor FBO. * This will be rendered to a postprocessor FBO.
* *
@@ -409,6 +413,10 @@ object IngameRenderer : Disposable {
blendNormal(batch) blendNormal(batch)
} }
/**
* This "screencap" will capture the game WITHOUT gui and postprocessors!
* To capture the entire game, use [App.requestScreenshot]
*/
@Volatile internal var screencapRequested = false @Volatile internal var screencapRequested = false
@Volatile internal var fboRGBexportedLatch = false @Volatile internal var fboRGBexportedLatch = false
@Volatile internal var screencapExportCallback: (FrameBuffer) -> Unit = {} @Volatile internal var screencapExportCallback: (FrameBuffer) -> Unit = {}

View File

@@ -347,7 +347,7 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) {
) )
} }
App.fontGame.draw(batch, PostProcessor.thisIsDebugStr, 5f, App.scr.height - 24f) App.fontGame.draw(batch, TerrarumPostProcessor.thisIsDebugStr, 5f, App.scr.height - 24f)

View File

@@ -72,19 +72,25 @@ class UIInventoryFull(
App.disposables.add(shapeRenderer) App.disposables.add(shapeRenderer)
} }
val magn = App.scr.magn
val gradTopStart = -YPOS_CORRECTION + (App.scr.height - internalHeight).div(2).toFloat() val gradTopStart0 = -YPOS_CORRECTION + (App.scr.height - internalHeight).div(2).toFloat()
val gradBottomEnd = App.scr.height - gradTopStart val gradTopStart = gradTopStart0 * magn
val gradBottomEnd = (App.scr.height - gradTopStart0) * magn
val gradHeightFlat = (2*YPOS_CORRECTION + internalHeight - (2 * gradHeight)) * magn
val gradHeight = gradHeight * magn
val w = App.scr.wf * magn
val h = App.scr.hf * magn
shapeRenderer!!.inUse { shapeRenderer!!.inUse {
// shaperender starts at bottom-left! // shaperender starts at bottom-left!
it.rect(0f, gradTopStart, App.scr.wf, gradHeight, gradStartCol, gradStartCol, gradEndCol, gradEndCol) it.rect(0f, gradTopStart, w, gradHeight, gradStartCol, gradStartCol, gradEndCol, gradEndCol)
it.rect(0f, gradBottomEnd, App.scr.wf, -gradHeight, gradStartCol, gradStartCol, gradEndCol, gradEndCol) it.rect(0f, gradBottomEnd, w, -gradHeight, gradStartCol, gradStartCol, gradEndCol, gradEndCol)
it.rect(0f, gradTopStart + gradHeight, App.scr.wf, 2*YPOS_CORRECTION + internalHeight - (2 * gradHeight), gradEndCol, gradEndCol, gradEndCol, gradEndCol) it.rect(0f, gradTopStart + gradHeight, w, gradHeightFlat, gradEndCol, gradEndCol, gradEndCol, gradEndCol)
it.rect(0f, 0f, App.scr.wf, gradTopStart, gradStartCol, gradStartCol, gradStartCol, gradStartCol) it.rect(0f, 0f, w, gradTopStart, gradStartCol, gradStartCol, gradStartCol, gradStartCol)
it.rect(0f, App.scr.hf, App.scr.wf, -(App.scr.hf - gradBottomEnd), gradStartCol, gradStartCol, gradStartCol, gradStartCol) it.rect(0f, h, w, -(h - gradBottomEnd), gradStartCol, gradStartCol, gradStartCol, gradStartCol)
} }
batch.begin() batch.begin()

View File

@@ -5,7 +5,6 @@ import com.badlogic.gdx.graphics.*
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import com.badlogic.gdx.graphics.glutils.FrameBuffer import com.badlogic.gdx.graphics.glutils.FrameBuffer
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
import net.torvald.unicode.getKeycapConsole import net.torvald.unicode.getKeycapConsole
import net.torvald.unicode.getKeycapPC import net.torvald.unicode.getKeycapPC
import net.torvald.terrarum.* import net.torvald.terrarum.*
@@ -33,8 +32,6 @@ class UITitleModules(val remoCon: UIRemoCon) : UICanvas() {
override var openCloseTime: Second = 0f override var openCloseTime: Second = 0f
private val shapeRenderer = ShapeRenderer()
internal val uiWidth = MODULEINFO_CELL_WIDTH internal val uiWidth = MODULEINFO_CELL_WIDTH
internal val uiX: Int internal val uiX: Int
@@ -255,7 +252,6 @@ class UITitleModules(val remoCon: UIRemoCon) : UICanvas() {
} }
override fun dispose() { override fun dispose() {
try { shapeRenderer.dispose() } catch (e: IllegalArgumentException) {}
try { sliderFBO.dispose() } catch (e: IllegalArgumentException) {} try { sliderFBO.dispose() } catch (e: IllegalArgumentException) {}
} }