diff --git a/assets/graphics/fonts/terrarum-sans-bitmap/hayeren_variable.tga b/assets/graphics/fonts/terrarum-sans-bitmap/hayeren_variable.tga index 12651f109..c657e9376 100755 --- a/assets/graphics/fonts/terrarum-sans-bitmap/hayeren_variable.tga +++ b/assets/graphics/fonts/terrarum-sans-bitmap/hayeren_variable.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ebc0db9f141b302e45316951812b4995c0fb342be0e95173bb95f5a975d87f2b +oid sha256:b8fd0eee31b88ad4c46379cdb372946129d1860cd04da8e3660d2e55604a4634 size 122898 diff --git a/src/net/torvald/terrarum/gameparticles/ParticleBase.kt b/src/net/torvald/terrarum/gameparticles/ParticleBase.kt index fa29ea66d..922596022 100644 --- a/src/net/torvald/terrarum/gameparticles/ParticleBase.kt +++ b/src/net/torvald/terrarum/gameparticles/ParticleBase.kt @@ -1,8 +1,11 @@ package net.torvald.terrarum.gameparticles +import com.badlogic.gdx.Gdx import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.GL20 import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion +import net.torvald.random.HQRNG import net.torvald.terrarum.* import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.Hitbox @@ -93,8 +96,22 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, var despawnUponCollision fun defaultDrawFun(frameDelta: Float, batch: SpriteBatch, drawJob: (x: Float, y: Float) -> Unit) { val oldColour = batch.color.cpy() if (!flagDespawn) { + App.getCurrentDitherTex().bind(1) + Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // so that batch that comes next will bind any tex to it + + batch.shader = IngameRenderer.shaderBayerAlpha - batch.shader.setUniformi("frame", App.GLOBAL_RENDER_TIMER.toInt() % 16) + +// batch.shader.setUniformi("frame", App.GLOBAL_RENDER_TIMER.toInt() % 16) + + +// batch.shader.setUniformMatrix("u_projTrans", projMat) + batch.shader.setUniformi("u_texture", 0) + batch.shader.setUniformi("rnd", rng.nextInt(8192), rng.nextInt(8192)) + batch.shader.setUniformi("u_pattern", 1) + batch.shader.setUniformMatrix4fv("swizzler", swizzler, rng.nextInt(24), 16*4) + + batch.color = drawColour drawBodyInGoodPosition(hitbox.startX.toFloat(), hitbox.startY.toFloat()) { x, y -> drawJob(x, y) @@ -103,7 +120,41 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, var despawnUponCollision batch.color = oldColour } + private val rng = HQRNG() + open fun dispose() { } + + companion object { + private val swizzler = floatArrayOf( + 1f,0f,0f,0f, 0f,1f,0f,0f, 0f,0f,1f,0f, 0f,0f,0f,1f, + 1f,0f,0f,0f, 0f,1f,0f,0f, 0f,0f,0f,1f, 0f,0f,1f,0f, + 1f,0f,0f,0f, 0f,0f,1f,0f, 0f,1f,0f,0f, 0f,0f,0f,1f, + 1f,0f,0f,0f, 0f,0f,1f,0f, 0f,0f,0f,1f, 0f,1f,0f,0f, + 1f,0f,0f,0f, 0f,0f,0f,1f, 0f,1f,0f,0f, 0f,0f,1f,0f, + 1f,0f,0f,0f, 0f,0f,0f,1f, 0f,0f,1f,0f, 0f,1f,0f,0f, + + 0f,1f,0f,0f, 1f,0f,0f,0f, 0f,0f,1f,0f, 0f,0f,0f,1f, + 0f,1f,0f,0f, 1f,0f,0f,0f, 0f,0f,0f,1f, 0f,0f,1f,0f, + 0f,1f,0f,0f, 0f,0f,1f,0f, 1f,0f,0f,0f, 0f,0f,0f,1f, + 0f,1f,0f,0f, 0f,0f,1f,0f, 0f,0f,0f,1f, 1f,0f,0f,0f, + 0f,1f,0f,0f, 0f,0f,0f,1f, 1f,0f,0f,0f, 0f,0f,1f,0f, + 0f,1f,0f,0f, 0f,0f,0f,1f, 0f,0f,1f,0f, 1f,0f,0f,0f, + + 0f,0f,1f,0f, 1f,0f,0f,0f, 0f,1f,0f,0f, 0f,0f,0f,1f, + 0f,0f,1f,0f, 1f,0f,0f,0f, 0f,0f,0f,1f, 0f,1f,0f,0f, + 0f,0f,1f,0f, 0f,1f,0f,0f, 1f,0f,0f,0f, 0f,0f,0f,1f, + 0f,0f,1f,0f, 0f,1f,0f,0f, 0f,0f,0f,1f, 1f,0f,0f,0f, + 0f,0f,1f,0f, 0f,0f,0f,1f, 1f,0f,0f,0f, 0f,1f,0f,0f, + 0f,0f,1f,0f, 0f,0f,0f,1f, 0f,1f,0f,0f, 1f,0f,0f,0f, + + 0f,0f,0f,1f, 1f,0f,0f,0f, 0f,1f,0f,0f, 0f,0f,1f,0f, + 0f,0f,0f,1f, 1f,0f,0f,0f, 0f,0f,1f,0f, 0f,1f,0f,0f, + 0f,0f,0f,1f, 0f,1f,0f,0f, 1f,0f,0f,0f, 0f,0f,1f,0f, + 0f,0f,0f,1f, 0f,1f,0f,0f, 0f,0f,1f,0f, 1f,0f,0f,0f, + 0f,0f,0f,1f, 0f,0f,1f,0f, 1f,0f,0f,0f, 0f,1f,0f,0f, + 0f,0f,0f,1f, 0f,0f,1f,0f, 0f,1f,0f,0f, 1f,0f,0f,0f, + ) + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt index 62c4a90cb..c3fa116ab 100644 --- a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt +++ b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt @@ -146,7 +146,7 @@ object IngameRenderer : Disposable { shaderBlendGlowTex1Flip = App.loadShaderFromClasspath("shaders/blendGlow.vert", "shaders/blendGlowTex1Flip.frag") shaderDemultiply = App.loadShaderFromClasspath("shaders/blendGlow.vert", "shaders/demultiply.frag") - shaderBayerAlpha = App.loadShaderFromClasspath("shaders/blendGlow.vert", "shaders/bayeralpha.frag") + shaderBayerAlpha = App.loadShaderFromClasspath("shaders/default.vert", "shaders/alphadither.frag") shaderKawaseDown = App.loadShaderFromClasspath("shaders/default.vert", "shaders/kawasedown.frag") shaderKawaseUp = App.loadShaderFromClasspath("shaders/default.vert", "shaders/kawaseup.frag") diff --git a/src/net/torvald/terrarum/tests/BTeXTest.kt b/src/net/torvald/terrarum/tests/BTeXTest.kt index 8bc635155..a94777a51 100644 --- a/src/net/torvald/terrarum/tests/BTeXTest.kt +++ b/src/net/torvald/terrarum/tests/BTeXTest.kt @@ -33,13 +33,13 @@ import kotlin.system.measureTimeMillis */ class BTeXTest : ApplicationAdapter() { - val filePath = "btex.btxbook" +// val filePath = "btex.btxbook" // val filePath = "btex_ko.xml" // val filePath = "test.xml" // val filePath = "literature/en/daniel_defoe_robinson_crusoe.xml" // val filePath = "literature/ruRU/anton_chekhov_palata_no_6.xml" // val filePath = "literature/koKR/yisang_nalgae.xml" -// val filePath = "literature/koKR/yisang_geonchukmuhanyukmyeongakche.xml" + val filePath = "literature/koKR/yisang_geonchukmuhanyukmyeongakche.xml" private var serialise = true diff --git a/src/shaders/alphadither.frag b/src/shaders/alphadither.frag new file mode 100644 index 000000000..5b3655f16 --- /dev/null +++ b/src/shaders/alphadither.frag @@ -0,0 +1,55 @@ +/** + * Blue Noise texture created by Christoph Peters, released under CC0 + * http://momentsingraphics.de/BlueNoise.html + */ + + +#ifdef GL_ES +precision mediump float; +#endif + + +vec4 gammaIn(vec4 col) { + return pow(col, vec4(2.2)); +} + +vec4 gammaOut(vec4 col) { + return pow(col, vec4(1.0 / 2.2)); +} + +in vec4 v_color; +in vec2 v_texCoords; + +uniform sampler2D u_texture; +uniform sampler2D u_pattern; +uniform ivec2 rnd = ivec2(0,0); +uniform mat4 swizzler = mat4( +1.0,0.0,0.0,0.0, +0.0,1.0,0.0,0.0, +0.0,0.0,1.0,0.0, +0.0,0.0,0.0,1.0 +); +uniform float quant = 1.0; // 64 steps -> 63.0; 256 steps -> 255.0 + +vec4 quantVec = vec4(quant); +vec4 invQuant = vec4(1.0 / quant); + +out vec4 fragColor; + +const vec2 boolean = vec2(0.0, 1.0); +const vec2 patternsize = vec2(1.0/512.0, 1.0/512.0); + + +float nearestAlpha(float alpha) { + return min(1.0, max(0.0, floor(alpha + 0.5))); +} + +void main(void) { + vec4 particleCol = vec4(v_color.rgb, smoothstep(0.0, 1.0, v_color.a)); + vec4 inColor = particleCol * texture(u_texture, v_texCoords); + + float bayerThreshold = (swizzler * vec4(texture(u_pattern, (gl_FragCoord.xy + rnd) * patternsize))).r; + float alpha = nearestAlpha((inColor.a * 256.0 / 255.0) - (1.0 / 255.0) + (bayerThreshold - 0.5)); + + fragColor = inColor * boolean.yyyx + alpha * boolean.xxxy; +} \ No newline at end of file