adding test code to export fboRGB

This commit is contained in:
minjaesong
2019-01-15 03:02:40 +09:00
parent 8c4793bea5
commit 7cd2b55b97
8 changed files with 88 additions and 40 deletions

View File

@@ -30,7 +30,6 @@ uniform sampler2D tilemap; // RGBA8888
uniform sampler2D tilesAtlas; // terrain, wire, fluids, etc. uniform sampler2D tilesAtlas; // terrain, wire, fluids, etc.
uniform sampler2D tilesBlendAtlas; // weather mix (e.g. yellowed grass) uniform sampler2D tilesBlendAtlas; // weather mix (e.g. yellowed grass)
uniform sampler2D backbuffer;
uniform float tilesBlend = 0.0; // percentage of blending [0f..1f]. 0: draws tilesAtlas, 1: draws tilesBlendAtlas uniform float tilesBlend = 0.0; // percentage of blending [0f..1f]. 0: draws tilesAtlas, 1: draws tilesBlendAtlas
uniform ivec2 tilesInAtlas = ivec2(256, 256); uniform ivec2 tilesInAtlas = ivec2(256, 256);
@@ -112,10 +111,7 @@ void main() {
vec4 finalBreakage = texture2D(tilesAtlas, finalUVCoordForBreakage); vec4 finalBreakage = texture2D(tilesAtlas, finalUVCoordForBreakage);
vec4 finalColor = mix(finalTile, finalBreakage, finalBreakage.a); vec4 finalColor = mix(finalTile, finalBreakage, finalBreakage.a);
vec4 backbufferColor = texture2D(backbuffer, gl_FragCoord.xy / screenDimension);
//gl_FragColor = colourFilter * finalColor; gl_FragColor = colourFilter * finalColor;
// v
gl_FragColor = colourFilter * mix(backbufferColor, finalColor, 1);
} }

View File

@@ -11,17 +11,27 @@ import java.io.OutputStream;
*/ */
public class PixmapIO2 { public class PixmapIO2 {
public static void writeTGA(FileHandle file, Pixmap pixmap) throws IOException { public static void writeTGAHappy(FileHandle file, Pixmap pixmap) throws IOException {
OutputStream output = file.write(false); OutputStream output = file.write(false);
try { try {
_writeTGA(output, pixmap); _writeTGA(output, pixmap, false);
} finally { } finally {
StreamUtils.closeQuietly(output); StreamUtils.closeQuietly(output);
} }
} }
private static void _writeTGA(OutputStream out, Pixmap pixmap) throws IOException { public static void writeTGA(FileHandle file, Pixmap pixmap) throws IOException {
OutputStream output = file.write(false);
try {
_writeTGA(output, pixmap, true);
} finally {
StreamUtils.closeQuietly(output);
}
}
private static void _writeTGA(OutputStream out, Pixmap pixmap, Boolean verbatim) throws IOException {
byte[] width = toShortLittle(pixmap.getWidth()); byte[] width = toShortLittle(pixmap.getWidth());
byte[] height = toShortLittle(pixmap.getHeight()); byte[] height = toShortLittle(pixmap.getHeight());
byte[] zero = toShortLittle(0); byte[] zero = toShortLittle(0);
@@ -50,7 +60,7 @@ public class PixmapIO2 {
int color = pixmap.getPixel(x, y); int color = pixmap.getPixel(x, y);
// if alpha == 0, write special value instead // if alpha == 0, write special value instead
if ((color & 0xFF) == 0) { if (verbatim && (color & 0xFF) == 0) {
out.write(zeroalpha); out.write(zeroalpha);
} }
else { else {
@@ -63,7 +73,10 @@ public class PixmapIO2 {
// write footer // write footer
// 00 00 00 00 00 00 00 00 TRUEVISION-XFILE 2E 00 // 00 00 00 00 00 00 00 00 TRUEVISION-XFILE 2E 00
out.write(new byte[]{0,0,0,0,0,0,0,0}); out.write(new byte[]{0,0,0,0,0,0,0,0});
out.write("TerrarumHappyTGA".getBytes()); if (verbatim)
out.write("TRUEVISION-XFILE".getBytes());
else
out.write("TerrarumHappyTGA".getBytes());
out.write(new byte[]{0x2E,0}); out.write(new byte[]{0x2E,0});

View File

@@ -272,7 +272,7 @@ class SpriteAssemblerPreview: Game() {
if (doExport && image != null) { if (doExport && image != null) {
doExport = false doExport = false
PixmapIO2.writeTGA(Gdx.files.absolute(exportPath), image) PixmapIO2.writeTGAHappy(Gdx.files.absolute(exportPath), image)
} }

View File

@@ -627,8 +627,18 @@ fun blendDisable(batch: SpriteBatch? = null) {
fun gdxClearAndSetBlend(r: Float, g: Float, b: Float, a: Float) { fun gdxClearAndSetBlend(r: Float, g: Float, b: Float, a: Float) {
Gdx.gl.glClearColor(r,g,b,a) Gdx.gl.glClearColor(r,g,b,a)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
gdxSetBlend()
}
fun gdxSetBlend() {
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
Gdx.gl.glEnable(GL20.GL_BLEND) Gdx.gl.glEnable(GL20.GL_BLEND)
}
fun gdxSetBlendNormal() {
gdxSetBlend()
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
Gdx.gl.glBlendEquation(GL20.GL_FUNC_ADD)
// ALPHA *MUST BE* PREMULTIPLIED // // ALPHA *MUST BE* PREMULTIPLIED //

View File

@@ -1,7 +1,7 @@
package net.torvald.terrarum.console package net.torvald.terrarum.console
import net.torvald.terrarum.modulebasegame.console.* import net.torvald.terrarum.modulebasegame.console.*
import java.util.HashMap import java.util.*
/** /**
* Created by minjaesong on 2016-01-15. * Created by minjaesong on 2016-01-15.
@@ -59,7 +59,8 @@ object CommandDict {
/* !! */"exportlayer" to ExportLayerData, /* !! */"exportlayer" to ExportLayerData,
/* !! */"importlayer" to ImportLayerData /* !! */"importlayer" to ImportLayerData,
/* !! */"exportfborgb" to ExportRendererFboRGB
) )
operator fun get(commandName: String): ConsoleCommand { operator fun get(commandName: String): ConsoleCommand {

View File

@@ -0,0 +1,14 @@
package net.torvald.terrarum.console
import net.torvald.terrarum.modulebasegame.IngameRenderer
object ExportRendererFboRGB: ConsoleCommand {
override fun execute(args: Array<String>) {
IngameRenderer.fboRGBexportRequested = true
}
override fun printUsage() {
}
}

View File

@@ -5,6 +5,7 @@ import com.badlogic.gdx.Input
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.glutils.FrameBuffer import com.badlogic.gdx.graphics.glutils.FrameBuffer
import com.badlogic.gdx.utils.ScreenUtils
import net.torvald.dataclass.CircularArray import net.torvald.dataclass.CircularArray
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ActorWithBody
@@ -18,6 +19,7 @@ import net.torvald.terrarum.worlddrawer.BlocksDrawer
import net.torvald.terrarum.worlddrawer.FeaturesDrawer import net.torvald.terrarum.worlddrawer.FeaturesDrawer
import net.torvald.terrarum.worlddrawer.LightmapRenderer import net.torvald.terrarum.worlddrawer.LightmapRenderer
import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.terrarum.worlddrawer.WorldCamera
import javax.swing.JFileChooser
/** /**
* This will be rendered to a postprocessor FBO * This will be rendered to a postprocessor FBO
@@ -220,6 +222,8 @@ object IngameRenderer {
processBlur(lightmapFboA, lightmapFboB) processBlur(lightmapFboA, lightmapFboB)
} }
internal var fboRGBexportRequested = false
private fun drawToRGB( private fun drawToRGB(
actorsRenderBehind: List<ActorWithBody>?, actorsRenderBehind: List<ActorWithBody>?,
actorsRenderMiddle: List<ActorWithBody>?, actorsRenderMiddle: List<ActorWithBody>?,
@@ -238,7 +242,7 @@ object IngameRenderer {
} }
setCameraPosition(0f, 0f) setCameraPosition(0f, 0f)
BlocksDrawer.drawWall(batch.projectionMatrix, fboRGB) BlocksDrawer.drawWall(batch.projectionMatrix)
batch.inUse { batch.inUse {
moveCameraToWorldCoord() moveCameraToWorldCoord()
@@ -247,7 +251,7 @@ object IngameRenderer {
} }
setCameraPosition(0f, 0f) setCameraPosition(0f, 0f)
BlocksDrawer.drawTerrain(batch.projectionMatrix, fboRGB) BlocksDrawer.drawTerrain(batch.projectionMatrix)
batch.inUse { batch.inUse {
///////////////// /////////////////
@@ -262,20 +266,42 @@ object IngameRenderer {
} }
setCameraPosition(0f, 0f) setCameraPosition(0f, 0f)
BlocksDrawer.drawFront(batch.projectionMatrix, false, fboRGB) // blue coloured filter of water, etc. BlocksDrawer.drawFront(batch.projectionMatrix, false) // blue coloured filter of water, etc.
batch.inUse { batch.inUse {
FeaturesDrawer.drawEnvOverlay(batch) FeaturesDrawer.drawEnvOverlay(batch)
} }
} }
if (fboRGBexportRequested) {
fboRGBexportRequested = false
val fileChooser = JFileChooser()
fileChooser.showSaveDialog(null)
try {
if (fileChooser.selectedFile != null) {
fboRGB.inAction(null, null) {
val p = ScreenUtils.getFrameBufferPixmap(0, 0, fboRGB.width, fboRGB.height)
PixmapIO2.writeTGA(Gdx.files.absolute(fileChooser.selectedFile.absolutePath), p)
}
}
}
catch (e: Throwable) {
e.printStackTrace()
}
}
fboRGB_lightMixed.inAction(camera, batch) { fboRGB_lightMixed.inAction(camera, batch) {
setCameraPosition(0f, 0f) setCameraPosition(0f, 0f)
val (xrem, yrem) = worldCamToRenderPos() val (xrem, yrem) = worldCamToRenderPos()
gdxSetBlend()
batch.inUse { batch.inUse {
blendNormal(batch)
// draw world // draw world
batch.draw(fboRGB.colorBufferTexture, 0f, 0f) batch.draw(fboRGB.colorBufferTexture, 0f, 0f)
batch.flush() batch.flush()

View File

@@ -2,7 +2,6 @@ package net.torvald.terrarum.worlddrawer
import com.badlogic.gdx.Gdx import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.* import com.badlogic.gdx.graphics.*
import com.badlogic.gdx.graphics.glutils.FrameBuffer
import com.badlogic.gdx.math.Matrix4 import com.badlogic.gdx.math.Matrix4
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.AppLoader.printdbg import net.torvald.terrarum.AppLoader.printdbg
@@ -347,43 +346,34 @@ internal object BlocksDrawer {
drawTiles(FLUID) drawTiles(FLUID)
} }
internal fun drawWall(projectionMatrix: Matrix4, backbuffer: FrameBuffer) { internal fun drawWall(projectionMatrix: Matrix4) {
// blend normal gdxSetBlendNormal()
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
Gdx.gl.glEnable(GL20.GL_BLEND)
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
renderUsingBuffer(WALL, projectionMatrix, backbuffer) renderUsingBuffer(WALL, projectionMatrix)
} }
internal fun drawTerrain(projectionMatrix: Matrix4, backbuffer: FrameBuffer) { internal fun drawTerrain(projectionMatrix: Matrix4) {
// blend normal gdxSetBlendNormal()
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
Gdx.gl.glEnable(GL20.GL_BLEND)
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
renderUsingBuffer(TERRAIN, projectionMatrix, backbuffer) renderUsingBuffer(TERRAIN, projectionMatrix)
renderUsingBuffer(FLUID, projectionMatrix, backbuffer) renderUsingBuffer(FLUID, projectionMatrix)
} }
internal fun drawFront(projectionMatrix: Matrix4, drawWires: Boolean, backbuffer: FrameBuffer) { internal fun drawFront(projectionMatrix: Matrix4, drawWires: Boolean) {
// blend mul // blend mul
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
Gdx.gl.glEnable(GL20.GL_BLEND) Gdx.gl.glEnable(GL20.GL_BLEND)
Gdx.gl.glBlendFunc(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA) Gdx.gl.glBlendFunc(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA)
// let's just not MUL on terrain, make it FLUID only... // let's just not MUL on terrain, make it FLUID only...
renderUsingBuffer(FLUID, projectionMatrix, backbuffer) renderUsingBuffer(FLUID, projectionMatrix)
// blend normal gdxSetBlendNormal()
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
Gdx.gl.glEnable(GL20.GL_BLEND)
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
if (drawWires) { if (drawWires) {
renderUsingBuffer(WIRE, projectionMatrix, backbuffer) renderUsingBuffer(WIRE, projectionMatrix)
} }
} }
@@ -685,7 +675,7 @@ internal object BlocksDrawer {
private var _tilesBufferAsTex: Texture = Texture(1, 1, Pixmap.Format.RGBA8888) private var _tilesBufferAsTex: Texture = Texture(1, 1, Pixmap.Format.RGBA8888)
private fun renderUsingBuffer(mode: Int, projectionMatrix: Matrix4, backbuffer: FrameBuffer) { private fun renderUsingBuffer(mode: Int, projectionMatrix: Matrix4) {
//Gdx.gl.glClearColor(.094f, .094f, .094f, 0f) //Gdx.gl.glClearColor(.094f, .094f, .094f, 0f)
//Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) //Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
@@ -728,7 +718,6 @@ internal object BlocksDrawer {
_tilesBufferAsTex.dispose() _tilesBufferAsTex.dispose()
_tilesBufferAsTex = Texture(tilesBuffer) _tilesBufferAsTex = Texture(tilesBuffer)
_tilesBufferAsTex.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest) _tilesBufferAsTex.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest)
backbuffer.colorBufferTexture.bind(3)
tilesTerrainBlend.texture.bind(2) tilesTerrainBlend.texture.bind(2)
_tilesBufferAsTex.bind(1) // trying 1 and 0... _tilesBufferAsTex.bind(1) // trying 1 and 0...
tileAtlas.texture.bind(0) // for some fuck reason, it must be bound as last tileAtlas.texture.bind(0) // for some fuck reason, it must be bound as last
@@ -740,7 +729,6 @@ internal object BlocksDrawer {
shader.setUniformi("tilesAtlas", 0) shader.setUniformi("tilesAtlas", 0)
shader.setUniformi("tilesBlendAtlas", 2) shader.setUniformi("tilesBlendAtlas", 2)
shader.setUniformi("tilemap", 1) shader.setUniformi("tilemap", 1)
shader.setUniformi("backbuffer", 3)
shader.setUniformi("tilemapDimension", tilesBuffer.width, tilesBuffer.height) shader.setUniformi("tilemapDimension", tilesBuffer.width, tilesBuffer.height)
shader.setUniformf("tilesInAxes", tilesInHorizontal.toFloat(), tilesInVertical.toFloat()) shader.setUniformf("tilesInAxes", tilesInHorizontal.toFloat(), tilesInVertical.toFloat())
shader.setUniformi("cameraTranslation", WorldCamera.x fmod TILE_SIZE, WorldCamera.y fmod TILE_SIZE) // usage of 'fmod' and '%' were depend on the for_x_start, which I can't just do naive int div shader.setUniformi("cameraTranslation", WorldCamera.x fmod TILE_SIZE, WorldCamera.y fmod TILE_SIZE) // usage of 'fmod' and '%' were depend on the for_x_start, which I can't just do naive int div