mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 12:21:52 +09:00
putting some actors into their own framebuffer for shadowing
This commit is contained in:
@@ -76,6 +76,9 @@ object IngameRenderer : Disposable {
|
|||||||
private lateinit var fboEmissive: Float16FrameBuffer
|
private lateinit var fboEmissive: Float16FrameBuffer
|
||||||
private lateinit var fboMixedOut: Float16FrameBuffer
|
private lateinit var fboMixedOut: Float16FrameBuffer
|
||||||
|
|
||||||
|
private lateinit var fboRGBactorsBehind: Float16FrameBuffer // for small shadow eff; A channel is for glow effects so they don't get shadow effects
|
||||||
|
private lateinit var fboRGBactorsMiddle: Float16FrameBuffer // for large shadew eff; A channel is for glow effects so they don't get shadow effects
|
||||||
|
|
||||||
private lateinit var rgbTex: TextureRegion
|
private lateinit var rgbTex: TextureRegion
|
||||||
private lateinit var aTex: TextureRegion
|
private lateinit var aTex: TextureRegion
|
||||||
private lateinit var mixedOutTex: TextureRegion
|
private lateinit var mixedOutTex: TextureRegion
|
||||||
@@ -498,9 +501,35 @@ object IngameRenderer : Disposable {
|
|||||||
fboRGB_lightMixed0.inAction(null, null) { clearBuffer() }
|
fboRGB_lightMixed0.inAction(null, null) { clearBuffer() }
|
||||||
fboRGB_lightMixed.inAction(null, null) { clearBuffer() }
|
fboRGB_lightMixed.inAction(null, null) { clearBuffer() }
|
||||||
|
|
||||||
fboRGB.inAction(camera, batch) {
|
|
||||||
|
|
||||||
|
fboRGBactorsBehind.inAction(camera, batch) {
|
||||||
|
clearBuffer()
|
||||||
setCameraPosition(0f, 0f)
|
setCameraPosition(0f, 0f)
|
||||||
|
|
||||||
|
batch.inUse {
|
||||||
|
batch.shader = shaderForActors
|
||||||
|
batch.color = Color.WHITE
|
||||||
|
moveCameraToWorldCoord()
|
||||||
|
actorsRenderBehind?.forEach { it.drawBody(frameDelta, batch) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fboRGBactorsMiddle.inAction(camera, batch) {
|
||||||
|
clearBuffer()
|
||||||
|
setCameraPosition(0f, 0f)
|
||||||
|
|
||||||
|
batch.inUse {
|
||||||
|
batch.shader = shaderForActors
|
||||||
|
batch.color = Color.WHITE
|
||||||
|
moveCameraToWorldCoord()
|
||||||
|
actorsRenderMiddle?.forEach { it.drawBody(frameDelta, batch) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fboRGB.inAction(camera, batch) {
|
||||||
|
setCameraPosition(0f, 0f)
|
||||||
|
|
||||||
BlocksDrawer.drawWall(batch.projectionMatrix, false)
|
BlocksDrawer.drawWall(batch.projectionMatrix, false)
|
||||||
|
|
||||||
batch.inUse {
|
batch.inUse {
|
||||||
@@ -508,7 +537,12 @@ object IngameRenderer : Disposable {
|
|||||||
batch.color = Color.WHITE
|
batch.color = Color.WHITE
|
||||||
moveCameraToWorldCoord()
|
moveCameraToWorldCoord()
|
||||||
actorsRenderFarBehind?.forEach { it.drawBody(frameDelta, batch) }
|
actorsRenderFarBehind?.forEach { it.drawBody(frameDelta, batch) }
|
||||||
actorsRenderBehind?.forEach { it.drawBody(frameDelta, batch) }
|
|
||||||
|
// actorsRenderBehind?.forEach { it.drawBody(frameDelta, batch) }
|
||||||
|
setCameraPosition(0f, 0f)
|
||||||
|
batch.drawFlipped(fboRGBactorsBehind.colorBufferTexture, 0f, 0f)
|
||||||
|
|
||||||
|
moveCameraToWorldCoord()
|
||||||
particlesContainer?.forEach { it.drawBody(frameDelta, batch) }
|
particlesContainer?.forEach { it.drawBody(frameDelta, batch) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -522,8 +556,12 @@ object IngameRenderer : Disposable {
|
|||||||
/////////////////
|
/////////////////
|
||||||
// draw actors //
|
// draw actors //
|
||||||
/////////////////
|
/////////////////
|
||||||
|
// moveCameraToWorldCoord()
|
||||||
|
// actorsRenderMiddle?.forEach { it.drawBody(frameDelta, batch) }
|
||||||
|
setCameraPosition(0f, 0f)
|
||||||
|
batch.drawFlipped(fboRGBactorsMiddle.colorBufferTexture, 0f, 0f)
|
||||||
|
|
||||||
moveCameraToWorldCoord()
|
moveCameraToWorldCoord()
|
||||||
actorsRenderMiddle?.forEach { it.drawBody(frameDelta, batch) }
|
|
||||||
actorsRenderMidTop?.forEach { it.drawBody(frameDelta, batch) }
|
actorsRenderMidTop?.forEach { it.drawBody(frameDelta, batch) }
|
||||||
player?.drawBody(frameDelta, batch)
|
player?.drawBody(frameDelta, batch)
|
||||||
actorsRenderFront?.forEach { it.drawBody(frameDelta, batch) }
|
actorsRenderFront?.forEach { it.drawBody(frameDelta, batch) }
|
||||||
@@ -1210,6 +1248,8 @@ object IngameRenderer : Disposable {
|
|||||||
fboA_lightMixed = Float16FrameBuffer(width, height, false)
|
fboA_lightMixed = Float16FrameBuffer(width, height, false)
|
||||||
fboEmissive = Float16FrameBuffer(width, height, false)
|
fboEmissive = Float16FrameBuffer(width, height, false)
|
||||||
fboMixedOut = Float16FrameBuffer(width, height, false)
|
fboMixedOut = Float16FrameBuffer(width, height, false)
|
||||||
|
fboRGBactorsBehind = Float16FrameBuffer(width, height, false)
|
||||||
|
fboRGBactorsMiddle = Float16FrameBuffer(width, height, false)
|
||||||
lightmapFbo = Float16FrameBuffer(
|
lightmapFbo = Float16FrameBuffer(
|
||||||
LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt(),
|
LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt(),
|
||||||
LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt(),
|
LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt(),
|
||||||
@@ -1272,6 +1312,8 @@ object IngameRenderer : Disposable {
|
|||||||
if (::fboEmissive.isInitialized) fboEmissive.tryDispose()
|
if (::fboEmissive.isInitialized) fboEmissive.tryDispose()
|
||||||
if (::fboMixedOut.isInitialized) fboMixedOut.tryDispose()
|
if (::fboMixedOut.isInitialized) fboMixedOut.tryDispose()
|
||||||
if (::lightmapFbo.isInitialized) lightmapFbo.tryDispose()
|
if (::lightmapFbo.isInitialized) lightmapFbo.tryDispose()
|
||||||
|
if (::fboRGBactorsBehind.isInitialized) fboRGBactorsBehind.tryDispose()
|
||||||
|
if (::fboRGBactorsMiddle.isInitialized) fboRGBactorsMiddle.tryDispose()
|
||||||
|
|
||||||
blurtex0.tryDispose()
|
blurtex0.tryDispose()
|
||||||
|
|
||||||
|
|||||||
@@ -102,6 +102,16 @@ internal object ExportFBO : ConsoleCommand {
|
|||||||
fun fboemissive(): FrameBuffer {
|
fun fboemissive(): FrameBuffer {
|
||||||
return IngameRenderer.extortField<Float16FrameBuffer>("fboEmissive")!!
|
return IngameRenderer.extortField<Float16FrameBuffer>("fboEmissive")!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ExportFBOCmd("Framebuffer for render-behind actors used for creating shallow shadow effects")
|
||||||
|
fun fboergbactorsbehind(): FrameBuffer {
|
||||||
|
return IngameRenderer.extortField<Float16FrameBuffer>("fboRGBactorsBehind")!!
|
||||||
|
}
|
||||||
|
|
||||||
|
@ExportFBOCmd("Framebuffer for render-middle actors used for creating large shadow effects")
|
||||||
|
fun fboergbactorsmiddle(): FrameBuffer {
|
||||||
|
return IngameRenderer.extortField<Float16FrameBuffer>("fboRGBactorsMiddle")!!
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal annotation class ExportFBOCmd(val description: String)
|
internal annotation class ExportFBOCmd(val description: String)
|
||||||
Reference in New Issue
Block a user