mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-12 11:34:05 +09:00
cloud wip
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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/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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
)
|
)
|
||||||
@@ -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
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