From c5dfe46b76a2ce13c4da27c343710987f81f0f06 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 20 Aug 2023 19:10:43 +0900 Subject: [PATCH] cloud wip --- .../basegame/weathers/WeatherGeneric.json | 9 ++- .../WeatherGenericRain.json.asrtinears | 10 --- .../mods/basegame/weathers/cloud_normal.kra | 3 + .../mods/basegame/weathers/cloud_normal.png | 3 + .../weathers/cloud_texture_instruction.md | 26 +++++++ buildapp/make_assets_release.sh | 3 + .../terrarum/weather/BaseModularWeather.kt | 3 +- .../torvald/terrarum/weather/WeatherMixer.kt | 71 ++++++++++++------- src/shaders/clouds.frag | 25 +++++++ 9 files changed, 113 insertions(+), 40 deletions(-) delete mode 100644 assets/mods/basegame/weathers/WeatherGenericRain.json.asrtinears create mode 100644 assets/mods/basegame/weathers/cloud_normal.kra create mode 100644 assets/mods/basegame/weathers/cloud_normal.png create mode 100644 assets/mods/basegame/weathers/cloud_texture_instruction.md create mode 100644 src/shaders/clouds.frag diff --git a/assets/mods/basegame/weathers/WeatherGeneric.json b/assets/mods/basegame/weathers/WeatherGeneric.json index 92cb538c4..7e5bc621f 100644 --- a/assets/mods/basegame/weathers/WeatherGeneric.json +++ b/assets/mods/basegame/weathers/WeatherGeneric.json @@ -2,7 +2,10 @@ "skyboxGradColourMap": "generic_skybox.tga", "daylightClut": "clut_daylight.tga", "classification": "generic", - "extraImages": [ - - ] + "clouds": { + "normal": { + "filename": "cloud_normal.png", + "tw": 1024, "th": 512 + } + } } \ No newline at end of file diff --git a/assets/mods/basegame/weathers/WeatherGenericRain.json.asrtinears b/assets/mods/basegame/weathers/WeatherGenericRain.json.asrtinears deleted file mode 100644 index 9bc935e4c..000000000 --- a/assets/mods/basegame/weathers/WeatherGenericRain.json.asrtinears +++ /dev/null @@ -1,10 +0,0 @@ -{ - "globalLight": "generic_light.tga", - "skyboxGradColourMap": "generic_skybox.tga", - "classification": "genericrain", - "extraImages": [ - "raindrop.tga" - ], - "mixFrom": "__CURRENTWEATHER", - "mixPercentage": 80.0 -} \ No newline at end of file diff --git a/assets/mods/basegame/weathers/cloud_normal.kra b/assets/mods/basegame/weathers/cloud_normal.kra new file mode 100644 index 000000000..548cb7c86 --- /dev/null +++ b/assets/mods/basegame/weathers/cloud_normal.kra @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f38981c48584e9b541a869ee5a1d599e0d5186095a89559bf21500f6fde25ea +size 1084674 diff --git a/assets/mods/basegame/weathers/cloud_normal.png b/assets/mods/basegame/weathers/cloud_normal.png new file mode 100644 index 000000000..aba59561f --- /dev/null +++ b/assets/mods/basegame/weathers/cloud_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe3db92949155a69db70c8837895947feb927ba925c3d4c9396c5f491f04db45 +size 117859 diff --git a/assets/mods/basegame/weathers/cloud_texture_instruction.md b/assets/mods/basegame/weathers/cloud_texture_instruction.md new file mode 100644 index 000000000..821cb41e8 --- /dev/null +++ b/assets/mods/basegame/weathers/cloud_texture_instruction.md @@ -0,0 +1,26 @@ +## actually blending +1. On Krita, load the cloudmap +2. Select and isolate suitable piece of the cloud +3. With liquefying brush, make the bottom flat +4. On new tab, load the solidmap +5. Resize the solidmap to 1024x1024 +6. Rotate the solidmap by 30 deg or so +7. Overlay the processed solidmap to the cloudmap, opacity=30% +8. With airbrush tool, manually add the shade (see cloud_normal.kra to get the gist of it) + +### cloudmap +1. On GIMP, prepare 4096x4096 canvas +2. Create Simplex Noise with following parameters: + - Scale: arbitrary (0.05 - 0.2) + - Iterations: MAX + - Seed: anything but 0 + +### solidmap +1. On GIMP, prepare 4096x4096 canvas +2. Create Solid Noise with following parameters: + - XY Size: 16.0 + - Detail: MAX + - Tileable: check + - Turbulent: check + - Seed: anything but 0 + diff --git a/buildapp/make_assets_release.sh b/buildapp/make_assets_release.sh index c217a7dd4..53cdd884b 100755 --- a/buildapp/make_assets_release.sh +++ b/buildapp/make_assets_release.sh @@ -18,6 +18,9 @@ rm $DESTDIR/graphics/*.bat rm $DESTDIR/keylayout/*.not_ime rm $DESTDIR/mods/basegame/blocks/*.gz rm $DESTDIR/mods/basegame/blocks/*.txt +rm $DESTDIR/mods/basegame/weathers/*.txt +rm $DESTDIR/mods/basegame/weathers/*.md +rm $DESTDIR/mods/basegame/weathers/*.kra rm -r $DESTDIR/mods/basegame/sounds rm -r $DESTDIR/mods/dwarventech diff --git a/src/net/torvald/terrarum/weather/BaseModularWeather.kt b/src/net/torvald/terrarum/weather/BaseModularWeather.kt index 94fb88dac..dc39b18fc 100644 --- a/src/net/torvald/terrarum/weather/BaseModularWeather.kt +++ b/src/net/torvald/terrarum/weather/BaseModularWeather.kt @@ -2,6 +2,7 @@ package net.torvald.terrarum.weather import com.badlogic.gdx.graphics.Texture import net.torvald.terrarum.GdxColorMap +import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import java.util.* /** @@ -15,7 +16,7 @@ data class BaseModularWeather( var skyboxGradColourMap: GdxColorMap, // row 0: skybox grad top, row 1: skybox grad bottom, row 2: sunlight (RGBA) val daylightClut: GdxColorMap, val classification: String, - var extraImages: ArrayList, + var clouds: HashMap, val mixFrom: String? = null, val mixPercentage: Double? = null ) \ No newline at end of file diff --git a/src/net/torvald/terrarum/weather/WeatherMixer.kt b/src/net/torvald/terrarum/weather/WeatherMixer.kt index 341e00cb1..dc3617ebd 100644 --- a/src/net/torvald/terrarum/weather/WeatherMixer.kt +++ b/src/net/torvald/terrarum/weather/WeatherMixer.kt @@ -16,7 +16,9 @@ import net.torvald.terrarum.gameworld.WorldTime.Companion.DAY_LENGTH import net.torvald.terrarum.RNGConsumer import net.torvald.terrarum.clut.Skybox import net.torvald.terrarum.utils.JsonFetcher +import net.torvald.terrarum.utils.forEachSiblings import net.torvald.terrarum.worlddrawer.WorldCamera +import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import java.io.File import java.io.FileFilter @@ -68,7 +70,8 @@ internal object WeatherMixer : RNGConsumer { it.texture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat) } - private val shaderBlendMax = App.loadShaderFromClasspath("shaders/blendSkyboxStars.vert", "shaders/blendSkyboxStars.frag") + private val shaderAstrum = App.loadShaderFromClasspath("shaders/blendSkyboxStars.vert", "shaders/blendSkyboxStars.frag") + private val shaderClouds = App.loadShaderFromClasspath("shaders/default.vert", "shaders/clouds.frag") private var astrumOffX = 0f private var astrumOffY = 0f @@ -131,7 +134,7 @@ internal object WeatherMixer : RNGConsumer { GdxColorMap(1, 3, Color(0x55aaffff), Color(0xaaffffff.toInt()), Color.WHITE), GdxColorMap(2, 2, Color.WHITE, Color.WHITE, Color.WHITE, Color.WHITE), "default", - ArrayList() + HashMap() ) currentWeather = defaultWeather @@ -166,6 +169,23 @@ internal object WeatherMixer : RNGConsumer { */ internal fun render(camera: Camera, batch: FlippingSpriteBatch, world: GameWorld) { drawSkybox(camera, batch, world) + + + + + batch.color = globalLightNow.toGdxColor().also { + it.a = 1f + } // TODO add cloud-only colour strip on the CLUT + batch.shader = shaderClouds + batch.inUse { + currentWeather.clouds["normal"]?.get(0, 0)?.let { + batch.draw(it, 0f, -150f) + } + } + + + + batch.color = Color.WHITE } private val parallaxDomainSize = 400f @@ -223,20 +243,20 @@ internal object WeatherMixer : RNGConsumer { val astrumY = ((world.worldTime.TIME_T / WorldTime.DIURNAL_MOTION_LENGTH) % 1f) * starmapTex.regionHeight batch.inUse { - batch.shader = shaderBlendMax - shaderBlendMax.setUniformi("tex1", 1) - shaderBlendMax.setUniformf("drawOffsetSize", 0f, gradY, App.scr.wf, gH) - shaderBlendMax.setUniform4fv("uvA", uvs, 0, 4) - shaderBlendMax.setUniform4fv("uvB", uvs, 4, 4) - shaderBlendMax.setUniform4fv("uvC", uvs, 8, 4) - shaderBlendMax.setUniform4fv("uvD", uvs, 12, 4) - shaderBlendMax.setUniform4fv("uvE", uvs, 16, 4) - shaderBlendMax.setUniform4fv("uvF", uvs, 20, 4) - shaderBlendMax.setUniform4fv("uvG", uvs, 24, 4) - shaderBlendMax.setUniform4fv("uvH", uvs, 28, 4) - shaderBlendMax.setUniformf("texBlend", mornNoonBlend, turbX, albX, 0f) - shaderBlendMax.setUniformf("astrumScroll", astrumOffX + astrumX, astrumOffY + astrumY) - shaderBlendMax.setUniformf("randomNumber", + batch.shader = shaderAstrum + shaderAstrum.setUniformi("tex1", 1) + shaderAstrum.setUniformf("drawOffsetSize", 0f, gradY, App.scr.wf, gH) + shaderAstrum.setUniform4fv("uvA", uvs, 0, 4) + shaderAstrum.setUniform4fv("uvB", uvs, 4, 4) + shaderAstrum.setUniform4fv("uvC", uvs, 8, 4) + shaderAstrum.setUniform4fv("uvD", uvs, 12, 4) + shaderAstrum.setUniform4fv("uvE", uvs, 16, 4) + shaderAstrum.setUniform4fv("uvF", uvs, 20, 4) + shaderAstrum.setUniform4fv("uvG", uvs, 24, 4) + shaderAstrum.setUniform4fv("uvH", uvs, 28, 4) + shaderAstrum.setUniformf("texBlend", mornNoonBlend, turbX, albX, 0f) + shaderAstrum.setUniformf("astrumScroll", astrumOffX + astrumX, astrumOffY + astrumY) + shaderAstrum.setUniformf("randomNumber", // (world.worldTime.TIME_T.plus(31L) xor 1453L + 31L).and(1023).toFloat(), // (world.worldTime.TIME_T.plus(37L) xor 862L + 31L).and(1023).toFloat(), // (world.worldTime.TIME_T.plus(23L) xor 1639L + 29L).and(1023).toFloat(), @@ -366,20 +386,18 @@ internal object WeatherMixer : RNGConsumer { val skyboxInJson = JSON.getString("skyboxGradColourMap") val lightbox = JSON.getString("daylightClut") - val extraImagesPath = JSON.get("extraImages").asStringArray() val skybox = GdxColorMap(ModMgr.getGdxFile(modname, "$pathToImage/${skyboxInJson}")) val daylight = GdxColorMap(ModMgr.getGdxFile(modname, "$pathToImage/${lightbox}")) - val extraImages = ArrayList() - for (i in extraImagesPath) - extraImages.add(Texture(ModMgr.getGdxFile(modname, "$pathToImage/${i}"))) - - val classification = JSON.getString("classification") - + val cloudsMap = HashMap() + val clouds = JSON["clouds"] + clouds.forEachSiblings { name, json -> + cloudsMap[name] = TextureRegionPack(ModMgr.getGdxFile(modname, "$pathToImage/${json.getString("filename")}"), json.getInt("tw"), json.getInt("th")) + } var mixFrom: String? try { mixFrom = JSON.getString("mixFrom") } @@ -397,17 +415,18 @@ internal object WeatherMixer : RNGConsumer { skyboxGradColourMap = skybox, daylightClut = daylight, classification = classification, - extraImages = extraImages + clouds = cloudsMap ) } fun dispose() { weatherList.values.forEach { list -> list.forEach { weather -> - weather.extraImages.forEach { it.tryDispose() } + weather.clouds.forEach { it.value.dispose() } } } starmapTex.texture.dispose() - shaderBlendMax.dispose() + shaderAstrum.dispose() + shaderClouds.dispose() } } diff --git a/src/shaders/clouds.frag b/src/shaders/clouds.frag new file mode 100644 index 000000000..d47037abe --- /dev/null +++ b/src/shaders/clouds.frag @@ -0,0 +1,25 @@ +#version 150 + +#ifdef GL_ES +#define LOWP lowp +precision mediump float; +#else +#define LOWP +#endif + +in LOWP vec4 v_color; +in vec2 v_texCoords; +uniform sampler2D u_texture; +out vec4 fragColor; + +const vec2 boolean = vec2(0.0, 1.0); + +uniform vec2 inverseGamma = vec2(0.5, 2.0); // vec2(inverse gamma RGB, inverse gamma RGA) + +void main() { + vec4 inCol = v_color * texture(u_texture, v_texCoords); + + vec4 outCol = pow(inCol, inverseGamma.xxxy); + + fragColor = outCol; +} \ No newline at end of file