cloud wip

This commit is contained in:
minjaesong
2023-08-20 19:10:43 +09:00
parent 3d3926c08b
commit c5dfe46b76
9 changed files with 113 additions and 40 deletions

View File

@@ -2,7 +2,10 @@
"skyboxGradColourMap": "generic_skybox.tga", "skyboxGradColourMap": "generic_skybox.tga",
"daylightClut": "clut_daylight.tga", "daylightClut": "clut_daylight.tga",
"classification": "generic", "classification": "generic",
"extraImages": [ "clouds": {
"normal": {
] "filename": "cloud_normal.png",
"tw": 1024, "th": 512
}
}
} }

View File

@@ -1,10 +0,0 @@
{
"globalLight": "generic_light.tga",
"skyboxGradColourMap": "generic_skybox.tga",
"classification": "genericrain",
"extraImages": [
"raindrop.tga"
],
"mixFrom": "__CURRENTWEATHER",
"mixPercentage": 80.0
}

Binary file not shown.

Binary file not shown.

View File

@@ -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

View File

@@ -18,6 +18,9 @@ rm $DESTDIR/graphics/*.bat
rm $DESTDIR/keylayout/*.not_ime rm $DESTDIR/keylayout/*.not_ime
rm $DESTDIR/mods/basegame/blocks/*.gz rm $DESTDIR/mods/basegame/blocks/*.gz
rm $DESTDIR/mods/basegame/blocks/*.txt 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/basegame/sounds
rm -r $DESTDIR/mods/dwarventech rm -r $DESTDIR/mods/dwarventech

View File

@@ -2,6 +2,7 @@ package net.torvald.terrarum.weather
import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.Texture
import net.torvald.terrarum.GdxColorMap import net.torvald.terrarum.GdxColorMap
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import java.util.* 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) var skyboxGradColourMap: GdxColorMap, // row 0: skybox grad top, row 1: skybox grad bottom, row 2: sunlight (RGBA)
val daylightClut: GdxColorMap, val daylightClut: GdxColorMap,
val classification: String, val classification: String,
var extraImages: ArrayList<Texture>, var clouds: HashMap<String, TextureRegionPack>,
val mixFrom: String? = null, val mixFrom: String? = null,
val mixPercentage: Double? = null val mixPercentage: Double? = null
) )

View File

@@ -16,7 +16,9 @@ import net.torvald.terrarum.gameworld.WorldTime.Companion.DAY_LENGTH
import net.torvald.terrarum.RNGConsumer import net.torvald.terrarum.RNGConsumer
import net.torvald.terrarum.clut.Skybox import net.torvald.terrarum.clut.Skybox
import net.torvald.terrarum.utils.JsonFetcher import net.torvald.terrarum.utils.JsonFetcher
import net.torvald.terrarum.utils.forEachSiblings
import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.terrarum.worlddrawer.WorldCamera
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import java.io.File import java.io.File
import java.io.FileFilter import java.io.FileFilter
@@ -68,7 +70,8 @@ internal object WeatherMixer : RNGConsumer {
it.texture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat) 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 astrumOffX = 0f
private var astrumOffY = 0f private var astrumOffY = 0f
@@ -131,7 +134,7 @@ internal object WeatherMixer : RNGConsumer {
GdxColorMap(1, 3, Color(0x55aaffff), Color(0xaaffffff.toInt()), Color.WHITE), GdxColorMap(1, 3, Color(0x55aaffff), Color(0xaaffffff.toInt()), Color.WHITE),
GdxColorMap(2, 2, Color.WHITE, Color.WHITE, Color.WHITE, Color.WHITE), GdxColorMap(2, 2, Color.WHITE, Color.WHITE, Color.WHITE, Color.WHITE),
"default", "default",
ArrayList<Texture>() HashMap()
) )
currentWeather = defaultWeather currentWeather = defaultWeather
@@ -166,6 +169,23 @@ internal object WeatherMixer : RNGConsumer {
*/ */
internal fun render(camera: Camera, batch: FlippingSpriteBatch, world: GameWorld) { internal fun render(camera: Camera, batch: FlippingSpriteBatch, world: GameWorld) {
drawSkybox(camera, batch, world) 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 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 val astrumY = ((world.worldTime.TIME_T / WorldTime.DIURNAL_MOTION_LENGTH) % 1f) * starmapTex.regionHeight
batch.inUse { batch.inUse {
batch.shader = shaderBlendMax batch.shader = shaderAstrum
shaderBlendMax.setUniformi("tex1", 1) shaderAstrum.setUniformi("tex1", 1)
shaderBlendMax.setUniformf("drawOffsetSize", 0f, gradY, App.scr.wf, gH) shaderAstrum.setUniformf("drawOffsetSize", 0f, gradY, App.scr.wf, gH)
shaderBlendMax.setUniform4fv("uvA", uvs, 0, 4) shaderAstrum.setUniform4fv("uvA", uvs, 0, 4)
shaderBlendMax.setUniform4fv("uvB", uvs, 4, 4) shaderAstrum.setUniform4fv("uvB", uvs, 4, 4)
shaderBlendMax.setUniform4fv("uvC", uvs, 8, 4) shaderAstrum.setUniform4fv("uvC", uvs, 8, 4)
shaderBlendMax.setUniform4fv("uvD", uvs, 12, 4) shaderAstrum.setUniform4fv("uvD", uvs, 12, 4)
shaderBlendMax.setUniform4fv("uvE", uvs, 16, 4) shaderAstrum.setUniform4fv("uvE", uvs, 16, 4)
shaderBlendMax.setUniform4fv("uvF", uvs, 20, 4) shaderAstrum.setUniform4fv("uvF", uvs, 20, 4)
shaderBlendMax.setUniform4fv("uvG", uvs, 24, 4) shaderAstrum.setUniform4fv("uvG", uvs, 24, 4)
shaderBlendMax.setUniform4fv("uvH", uvs, 28, 4) shaderAstrum.setUniform4fv("uvH", uvs, 28, 4)
shaderBlendMax.setUniformf("texBlend", mornNoonBlend, turbX, albX, 0f) shaderAstrum.setUniformf("texBlend", mornNoonBlend, turbX, albX, 0f)
shaderBlendMax.setUniformf("astrumScroll", astrumOffX + astrumX, astrumOffY + astrumY) shaderAstrum.setUniformf("astrumScroll", astrumOffX + astrumX, astrumOffY + astrumY)
shaderBlendMax.setUniformf("randomNumber", shaderAstrum.setUniformf("randomNumber",
// (world.worldTime.TIME_T.plus(31L) xor 1453L + 31L).and(1023).toFloat(), // (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(37L) xor 862L + 31L).and(1023).toFloat(),
// (world.worldTime.TIME_T.plus(23L) xor 1639L + 29L).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 skyboxInJson = JSON.getString("skyboxGradColourMap")
val lightbox = JSON.getString("daylightClut") val lightbox = JSON.getString("daylightClut")
val extraImagesPath = JSON.get("extraImages").asStringArray()
val skybox = GdxColorMap(ModMgr.getGdxFile(modname, "$pathToImage/${skyboxInJson}")) val skybox = GdxColorMap(ModMgr.getGdxFile(modname, "$pathToImage/${skyboxInJson}"))
val daylight = GdxColorMap(ModMgr.getGdxFile(modname, "$pathToImage/${lightbox}")) val daylight = GdxColorMap(ModMgr.getGdxFile(modname, "$pathToImage/${lightbox}"))
val extraImages = ArrayList<Texture>()
for (i in extraImagesPath)
extraImages.add(Texture(ModMgr.getGdxFile(modname, "$pathToImage/${i}")))
val classification = JSON.getString("classification") val classification = JSON.getString("classification")
val cloudsMap = HashMap<String, TextureRegionPack>()
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? var mixFrom: String?
try { mixFrom = JSON.getString("mixFrom") } try { mixFrom = JSON.getString("mixFrom") }
@@ -397,17 +415,18 @@ internal object WeatherMixer : RNGConsumer {
skyboxGradColourMap = skybox, skyboxGradColourMap = skybox,
daylightClut = daylight, daylightClut = daylight,
classification = classification, classification = classification,
extraImages = extraImages clouds = cloudsMap
) )
} }
fun dispose() { fun dispose() {
weatherList.values.forEach { list -> weatherList.values.forEach { list ->
list.forEach { weather -> list.forEach { weather ->
weather.extraImages.forEach { it.tryDispose() } weather.clouds.forEach { it.value.dispose() }
} }
} }
starmapTex.texture.dispose() starmapTex.texture.dispose()
shaderBlendMax.dispose() shaderAstrum.dispose()
shaderClouds.dispose()
} }
} }

25
src/shaders/clouds.frag Normal file
View File

@@ -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;
}