mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 12:21:52 +09:00
cloud wip
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"globalLight": "generic_light.tga",
|
||||
"skyboxGradColourMap": "generic_skybox.tga",
|
||||
"classification": "genericrain",
|
||||
"extraImages": [
|
||||
"raindrop.tga"
|
||||
],
|
||||
"mixFrom": "__CURRENTWEATHER",
|
||||
"mixPercentage": 80.0
|
||||
}
|
||||
BIN
assets/mods/basegame/weathers/cloud_normal.kra
LFS
Normal file
BIN
assets/mods/basegame/weathers/cloud_normal.kra
LFS
Normal file
Binary file not shown.
BIN
assets/mods/basegame/weathers/cloud_normal.png
LFS
Normal file
BIN
assets/mods/basegame/weathers/cloud_normal.png
LFS
Normal file
Binary file not shown.
26
assets/mods/basegame/weathers/cloud_texture_instruction.md
Normal file
26
assets/mods/basegame/weathers/cloud_texture_instruction.md
Normal 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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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<Texture>,
|
||||
var clouds: HashMap<String, TextureRegionPack>,
|
||||
val mixFrom: String? = null,
|
||||
val mixPercentage: Double? = null
|
||||
)
|
||||
@@ -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<Texture>()
|
||||
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<Texture>()
|
||||
for (i in extraImagesPath)
|
||||
extraImages.add(Texture(ModMgr.getGdxFile(modname, "$pathToImage/${i}")))
|
||||
|
||||
|
||||
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?
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
||||
25
src/shaders/clouds.frag
Normal file
25
src/shaders/clouds.frag
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user