Files
Bliss-Shader/shaders/lib/scene_controller.glsl
T

691 lines
26 KiB
GLSL

#if !defined READ_SCENE_CONTROLLER_PARAMETERS
#if defined USE_SCENE_CONTROLLER_SETTINGS
uniform int worldDay;
uniform ivec3 cameraPositionInt;
uniform bool isInColdArea;
uniform bool isInHotArea;
uniform bool isInJungleBiomes;
uniform bool isInSwampBiomes;
uniform bool isInSpecialEnviornment;
uniform bool isInSnowFallEnviornment;
uniform bool isInRainFallEnviornment;
uniform bool isInNoRainFallEnviornment;
uniform int worldTime;
#define DECLARE_UNIFORMS_OR_WRITE_FUNCTIONS_FOR_CUSTOM_SCENE_CONTROLLER_PROFILES
#include "/CUSTOM_SCENE_PARAMETERS.glsl"
// https://www.shadertoy.com/view/llGSzw
float hash11( uint n )
{
// integer hash copied from Hugo Elias
n = (n << 13U) ^ n;
n = n * (n * n * 15731U + 789221U) + 1376312589U;
return float( n & uint(0x7fffffffU))/float(0x7fffffff);
}
bool playerIsWithinArea(in vec3 positionA, in vec3 positionB){
return cameraPositionInt.x > positionA.x && cameraPositionInt.y > positionA.y && cameraPositionInt.z > positionA.z && cameraPositionInt.x < positionB.x && cameraPositionInt.y < positionB.y && cameraPositionInt.z < positionB.z;
}
bool playerIsOutsideArea(in vec3 positionA, in vec3 positionB){
return !(cameraPositionInt.x > positionA.x && cameraPositionInt.y > positionA.y && cameraPositionInt.z > positionA.z && cameraPositionInt.x < positionB.x && cameraPositionInt.y < positionB.y && cameraPositionInt.z < positionB.z);
}
vec4 timesOfDay(){
float time = float(worldTime%24000);
// set schedules for fog to appear at specific ranges of time in the day.
float morning = clamp((time-22000.0)/2000.0,0.0,1.0) + clamp((2000.0-time)/2000.0,0.0,1.0);
float noon = clamp(time/2000.0,0.0,1.0) * clamp((12000.0-time)/2000.0,0.0,1.0);
float evening = clamp((time-10000.0)/2000.0,0.0,1.0) * clamp((14000.0-time)/2000.0,0.0,1.0);
float night = clamp((time-13000.0)/2000.0,0.0,1.0) * clamp((23000.0-time)/2000.0,0.0,1.0);
return (float(TOD_FOG_AMOUNT) / 100.0) * vec4(morning, noon, evening, night);
}
void applySceneControllerParameters(
out float smallCumulusCoverage, out float smallCumulusDensity,
out float largeCumulusCoverage, out float largeCumulusDensity,
out float altostratusCoverage, out float altostratusDensity,
out float uniformFogDensity, out float clumpyFogDensity,
out float LocalUniformFogDensity, out float LocalClumpyFogDensity, out vec3 localFogColor
){
// these are the default parameters if no "trigger" or custom uniform is being used.
// do not remove them
smallCumulusCoverage = 0.0;
smallCumulusDensity = 0.0;
largeCumulusCoverage = 0.0;
largeCumulusDensity = 0.0;
altostratusCoverage = 0.0;
altostratusDensity = 0.0;
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
LocalUniformFogDensity = 0.0;
LocalClumpyFogDensity = 0.0;
localFogColor = vec3(1.0);
#if TOD_FOG_AMOUNT > 0
vec4 timesOfDay = timesOfDay();
uniformFogDensity = dot(timesOfDay, vec4(Morning_Uniform_Fog, Noon_Uniform_Fog, Evening_Uniform_Fog, Night_Uniform_Fog));
clumpyFogDensity = dot(timesOfDay, vec4(Morning_Cloudy_Fog, Noon_Cloudy_Fog, Evening_Cloudy_Fog, Night_Cloudy_Fog));
#endif
// the seed is the in-game day counter.
// give a random value within the range 0.0-1.0 which is scaled up to the wanted range, and then quantized to choose a profile
float RNG = hash11(worldDay + 0.2);
#if USE_CUSTOM_DAILY_WEATHER_PROFILE == 0
int dailyWeatherProfile = int(RNG * 11.0);
switch (dailyWeatherProfile){
default : {
altostratusCoverage = 0.0;
largeCumulusCoverage = 0.0;
smallCumulusCoverage = 0.0;
altostratusDensity = 0.0;
largeCumulusDensity = 0.0;
smallCumulusDensity = 0.0;
break;
}
case 1: {
altostratusCoverage = 0.0;
largeCumulusCoverage = 1.0;
smallCumulusCoverage = 1.0;
altostratusDensity = 0.0;
largeCumulusDensity = 0.5;
smallCumulusDensity = 0.25;
break;
}
case 2: {
altostratusCoverage = 1.0;
largeCumulusCoverage = 1.0;
smallCumulusCoverage = 0.0;
altostratusDensity = 0.5;
largeCumulusDensity = 0.5;
smallCumulusDensity = 0.0;
break;
}
case 3: {
altostratusCoverage = 0.0;
largeCumulusCoverage = 1.1;
smallCumulusCoverage = 0.0;
altostratusDensity = 0.0;
largeCumulusDensity = 0.5;
smallCumulusDensity = 0.0;
break;
}
case 4: {
altostratusCoverage = 1.5;
largeCumulusCoverage = 0.0;
smallCumulusCoverage = 1.0;
altostratusDensity = 0.25;
largeCumulusDensity = 0.1;
smallCumulusDensity = 0.1;
break;
}
case 5 : {
altostratusCoverage = 1.0;
largeCumulusCoverage = 0.1;
smallCumulusCoverage = 1.0;
altostratusDensity = 0.1;
largeCumulusDensity = 0.5;
smallCumulusDensity = 0.5;
break;
}
case 6: {
altostratusCoverage = 1.0;
largeCumulusCoverage = 0.0;
smallCumulusCoverage = 0.0;
altostratusDensity = 0.5;
largeCumulusDensity = 0.0;
smallCumulusDensity = 0.0;
break;
}
case 7: {
altostratusCoverage = 0.0;
largeCumulusCoverage = 1.9;
smallCumulusCoverage = 0.0;
altostratusDensity = 0.0;
largeCumulusDensity = 0.2;
smallCumulusDensity = 0.0;
break;
}
case 8: {
altostratusCoverage = 0.0;
largeCumulusCoverage = 0.0;
smallCumulusCoverage = 1.4;
altostratusDensity = 0.0;
largeCumulusDensity = 0.0;
smallCumulusDensity = 0.5;
break;
}
case 9: {
altostratusCoverage = 2.0;
largeCumulusCoverage = 0.0;
smallCumulusCoverage = 0.0;
altostratusDensity = 0.3;
largeCumulusDensity = 0.0;
smallCumulusDensity = 0.0;
break;
}
case 10: {
altostratusCoverage = 0.0;
largeCumulusCoverage = 0.0;
smallCumulusCoverage = 1.0;
altostratusDensity = 0.0;
largeCumulusDensity = 0.0;
smallCumulusDensity = 0.5;
break;
}
}
#endif
#if USE_CUSTOM_DAILY_WEATHER_PROFILE > 0
int customDailyWeatherProfile = int(RNG * float(USE_CUSTOM_DAILY_WEATHER_PROFILE));
switch (customDailyWeatherProfile){
default : {
smallCumulusCoverage = DAILY_PROFILE_1_LAYER0_COVERAGE;
largeCumulusCoverage = DAILY_PROFILE_1_LAYER1_COVERAGE;
altostratusCoverage = DAILY_PROFILE_1_LAYER2_COVERAGE;
smallCumulusDensity = DAILY_PROFILE_1_LAYER0_DENSITY;
largeCumulusDensity = DAILY_PROFILE_1_LAYER1_DENSITY;
altostratusDensity = DAILY_PROFILE_1_LAYER2_DENSITY;
break;
}
#if USE_CUSTOM_DAILY_WEATHER_PROFILE >= 2
case 1: {
smallCumulusCoverage = DAILY_PROFILE_2_LAYER0_COVERAGE;
largeCumulusCoverage = DAILY_PROFILE_2_LAYER1_COVERAGE;
altostratusCoverage = DAILY_PROFILE_2_LAYER2_COVERAGE;
smallCumulusDensity = DAILY_PROFILE_2_LAYER0_DENSITY;
largeCumulusDensity = DAILY_PROFILE_2_LAYER1_DENSITY;
altostratusDensity = DAILY_PROFILE_2_LAYER2_DENSITY;
break;
}
#endif
#if USE_CUSTOM_DAILY_WEATHER_PROFILE >= 3
case 2: {
smallCumulusCoverage = DAILY_PROFILE_3_LAYER0_COVERAGE;
largeCumulusCoverage = DAILY_PROFILE_3_LAYER1_COVERAGE;
altostratusCoverage = DAILY_PROFILE_3_LAYER2_COVERAGE;
smallCumulusDensity = DAILY_PROFILE_3_LAYER0_DENSITY;
largeCumulusDensity = DAILY_PROFILE_3_LAYER1_DENSITY;
altostratusDensity = DAILY_PROFILE_3_LAYER2_DENSITY;
break;
}
#endif
#if USE_CUSTOM_DAILY_WEATHER_PROFILE >= 4
case 3: {
smallCumulusCoverage = DAILY_PROFILE_4_LAYER0_COVERAGE;
largeCumulusCoverage = DAILY_PROFILE_4_LAYER1_COVERAGE;
altostratusCoverage = DAILY_PROFILE_4_LAYER2_COVERAGE;
smallCumulusDensity = DAILY_PROFILE_4_LAYER0_DENSITY;
largeCumulusDensity = DAILY_PROFILE_4_LAYER1_DENSITY;
altostratusDensity = DAILY_PROFILE_4_LAYER2_DENSITY;
break;
}
#endif
#if USE_CUSTOM_DAILY_WEATHER_PROFILE >= 5
case 4: {
smallCumulusCoverage = DAILY_PROFILE_5_LAYER0_COVERAGE;
largeCumulusCoverage = DAILY_PROFILE_5_LAYER1_COVERAGE;
altostratusCoverage = DAILY_PROFILE_5_LAYER2_COVERAGE;
smallCumulusDensity = DAILY_PROFILE_5_LAYER0_DENSITY;
largeCumulusDensity = DAILY_PROFILE_5_LAYER1_DENSITY;
altostratusDensity = DAILY_PROFILE_5_LAYER2_DENSITY;
break;
}
#endif
#if USE_CUSTOM_DAILY_WEATHER_PROFILE >= 6
case 5 : {
smallCumulusCoverage = DAILY_PROFILE_6_LAYER0_COVERAGE;
largeCumulusCoverage = DAILY_PROFILE_6_LAYER1_COVERAGE;
altostratusCoverage = DAILY_PROFILE_6_LAYER2_COVERAGE;
smallCumulusDensity = DAILY_PROFILE_6_LAYER0_DENSITY;
largeCumulusDensity = DAILY_PROFILE_6_LAYER1_DENSITY;
altostratusDensity = DAILY_PROFILE_6_LAYER2_DENSITY;
break;
}
#endif
}
#endif
if(rainStrength > 0.0001){
#if USE_CUSTOM_DAILY_RAIN_PROFILE == 0
int rainyWeatherProfile = int(RNG * 6.0);
switch (rainyWeatherProfile){
///////////////////////// TEMPERATE WEATHER PROFILES
default : { // light rain
smallCumulusCoverage = 1.5;
smallCumulusDensity = 0.25;
largeCumulusCoverage = 0.0;
altostratusCoverage = 2.0;
altostratusDensity = 0.1;
uniformFogDensity = 0.1;
clumpyFogDensity = 0.2;
break;
}
case 1: { // medium rain
smallCumulusCoverage = 0.0;
largeCumulusCoverage = 1.5;
largeCumulusDensity = 0.25;
altostratusCoverage = 1.5;
altostratusDensity = 0.5;
uniformFogDensity = 0.2;
clumpyFogDensity = 0.4;
break;
}
case 2: { // heavy rain
smallCumulusCoverage = 1.5;
smallCumulusDensity = 0.25;
largeCumulusCoverage = 1.5;
largeCumulusDensity = 0.25;
altostratusCoverage = 1.3;
altostratusDensity = 0.5;
uniformFogDensity = 0.3;
clumpyFogDensity = 0.2;
break;
}
case 3: { // heavy rain
smallCumulusCoverage = 1.5;
smallCumulusDensity = 0.25;
largeCumulusCoverage = 1.5;
largeCumulusDensity = 0.25;
altostratusCoverage = 1.3;
altostratusDensity = 0.5;
uniformFogDensity = 0.1;
clumpyFogDensity = 0.2;
break;
}
case 4: { // medium rain
smallCumulusCoverage = 0.0;
largeCumulusCoverage = 1.5;
largeCumulusDensity = 0.25;
altostratusCoverage = 2.0;
altostratusDensity = 0.3;
uniformFogDensity = 0.1;
clumpyFogDensity = 0.2;
break;
}
case 5: { // light rain
smallCumulusCoverage = 0.0;
largeCumulusCoverage = 1.8;
largeCumulusDensity = 0.1;
altostratusCoverage = 0.0;
uniformFogDensity = 0.1;
clumpyFogDensity = 0.2;
break;
}
}
#endif
#if USE_CUSTOM_DAILY_RAIN_PROFILE > 0
int customRainyWeatherProfile = int(RNG * USE_CUSTOM_DAILY_RAIN_PROFILE);
switch (customRainyWeatherProfile){
default : {
smallCumulusCoverage = RAINY_PROFILE_1_LAYER0_COVERAGE;
largeCumulusCoverage = RAINY_PROFILE_1_LAYER1_COVERAGE;
altostratusCoverage = RAINY_PROFILE_1_LAYER2_COVERAGE;
smallCumulusDensity = RAINY_PROFILE_1_LAYER0_DENSITY;
largeCumulusDensity = RAINY_PROFILE_1_LAYER1_DENSITY;
altostratusDensity = RAINY_PROFILE_1_LAYER2_DENSITY;
break;
}
#if USE_CUSTOM_DAILY_RAIN_PROFILE >= 2
case 1: {
smallCumulusCoverage = RAINY_PROFILE_2_LAYER0_COVERAGE;
largeCumulusCoverage = RAINY_PROFILE_2_LAYER1_COVERAGE;
altostratusCoverage = RAINY_PROFILE_2_LAYER2_COVERAGE;
smallCumulusDensity = RAINY_PROFILE_2_LAYER0_DENSITY;
largeCumulusDensity = RAINY_PROFILE_2_LAYER1_DENSITY;
altostratusDensity = RAINY_PROFILE_2_LAYER2_DENSITY;
break;
}
#endif
#if USE_CUSTOM_DAILY_RAIN_PROFILE >= 3
case 2: {
smallCumulusCoverage = RAINY_PROFILE_3_LAYER0_COVERAGE;
largeCumulusCoverage = RAINY_PROFILE_3_LAYER1_COVERAGE;
altostratusCoverage = RAINY_PROFILE_3_LAYER2_COVERAGE;
smallCumulusDensity = RAINY_PROFILE_3_LAYER0_DENSITY;
largeCumulusDensity = RAINY_PROFILE_3_LAYER1_DENSITY;
altostratusDensity = RAINY_PROFILE_3_LAYER2_DENSITY;
break;
}
#endif
#if USE_CUSTOM_DAILY_RAIN_PROFILE >= 4
case 3: {
smallCumulusCoverage = RAINY_PROFILE_4_LAYER0_COVERAGE;
largeCumulusCoverage = RAINY_PROFILE_4_LAYER1_COVERAGE;
altostratusCoverage = RAINY_PROFILE_4_LAYER2_COVERAGE;
smallCumulusDensity = RAINY_PROFILE_4_LAYER0_DENSITY;
largeCumulusDensity = RAINY_PROFILE_4_LAYER1_DENSITY;
altostratusDensity = RAINY_PROFILE_4_LAYER2_DENSITY;
break;
}
#endif
#if USE_CUSTOM_DAILY_RAIN_PROFILE >= 5
case 4: {
smallCumulusCoverage = RAINY_PROFILE_5_LAYER0_COVERAGE;
largeCumulusCoverage = RAINY_PROFILE_5_LAYER1_COVERAGE;
altostratusCoverage = RAINY_PROFILE_5_LAYER2_COVERAGE;
smallCumulusDensity = RAINY_PROFILE_5_LAYER0_DENSITY;
largeCumulusDensity = RAINY_PROFILE_5_LAYER1_DENSITY;
altostratusDensity = RAINY_PROFILE_5_LAYER2_DENSITY;
break;
}
#endif
#if USE_CUSTOM_DAILY_RAIN_PROFILE >= 6
case 5 : {
smallCumulusCoverage = RAINY_PROFILE_6_LAYER0_COVERAGE;
largeCumulusCoverage = RAINY_PROFILE_6_LAYER1_COVERAGE;
altostratusCoverage = RAINY_PROFILE_6_LAYER2_COVERAGE;
smallCumulusDensity = RAINY_PROFILE_6_LAYER0_DENSITY;
largeCumulusDensity = RAINY_PROFILE_6_LAYER1_DENSITY;
altostratusDensity = RAINY_PROFILE_6_LAYER2_DENSITY;
break;
}
#endif
}
#endif
#if USE_CUSTOM_HOT_BIOME_RAIN_PROFILE == 0 || USE_CUSTOM_COLD_BIOME_RAIN_PROFILE == 0
// simply shift the index ahead for enviornment switching
int biomeRainyWeatherProfile = int(RNG * 3.0);
#if USE_CUSTOM_HOT_BIOME_RAIN_PROFILE == 0
if(isInHotArea && isInNoRainFallEnviornment) biomeRainyWeatherProfile += 3;
#endif
#if USE_CUSTOM_COLD_BIOME_RAIN_PROFILE == 0
if(isInColdArea && isInSnowFallEnviornment) biomeRainyWeatherProfile += 6;
#endif
switch (biomeRainyWeatherProfile){
default : {
break;
}
#if USE_CUSTOM_HOT_BIOME_RAIN_PROFILE == 0
case 3: { // clear
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
break;
}
case 4: { // dust storm
LocalUniformFogDensity = 0.03;
LocalClumpyFogDensity = 0.2;
localFogColor = vec3(1.0,0.5,0.3);
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
break;
}
case 5: { // sand storm
LocalUniformFogDensity = 0.08;
LocalClumpyFogDensity = 0.5;
localFogColor = vec3(1.0,0.3,0.1)*2.0;
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
break;
}
#endif
#if USE_CUSTOM_COLD_BIOME_RAIN_PROFILE == 0
case 6: { // light snow
LocalUniformFogDensity = 0.0085;
LocalClumpyFogDensity = 0.0;
localFogColor = vec3(0.4,0.6,1.0) * 5.0;
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
break;
}
case 7: { // snow storm
LocalUniformFogDensity = 0.03;
LocalClumpyFogDensity = 0.2;
localFogColor = vec3(0.4,0.6,1.0) * 5.0;
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
break;
}
case 8: { // blizzard
LocalUniformFogDensity = 0.07;
LocalClumpyFogDensity = 1.0;
localFogColor = vec3(0.4,0.6,1.0) * 5.0;
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
break;
}
#endif
}
#endif
#if USE_CUSTOM_HOT_BIOME_RAIN_PROFILE > 0
if(isInHotArea && isInNoRainFallEnviornment){
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
int customHotBiomeRainyWeatherProfile = int(RNG * USE_CUSTOM_HOT_BIOME_RAIN_PROFILE);
switch (customHotBiomeRainyWeatherProfile){
default : {
LocalUniformFogDensity = HOT_BIOME_RAINY_PROFILE_1_UNIFORM_FOG_DENSITY;
LocalClumpyFogDensity = HOT_BIOME_RAINY_PROFILE_1_CLUMPY_FOG_DENSITY;
localFogColor = vec3(HOT_BIOME_RAINY_PROFILE_1_FOG_COLOR_R, HOT_BIOME_RAINY_PROFILE_1_FOG_COLOR_G, HOT_BIOME_RAINY_PROFILE_1_FOG_COLOR_B);
break;
}
#if USE_CUSTOM_HOT_BIOME_RAIN_PROFILE >= 2
case 1: {
LocalUniformFogDensity = HOT_BIOME_RAINY_PROFILE_2_UNIFORM_FOG_DENSITY;
LocalClumpyFogDensity = HOT_BIOME_RAINY_PROFILE_2_CLUMPY_FOG_DENSITY;
localFogColor = vec3(HOT_BIOME_RAINY_PROFILE_2_FOG_COLOR_R, HOT_BIOME_RAINY_PROFILE_2_FOG_COLOR_G, HOT_BIOME_RAINY_PROFILE_2_FOG_COLOR_B);
break;
}
#endif
#if USE_CUSTOM_HOT_BIOME_RAIN_PROFILE >= 3
case 2: {
LocalUniformFogDensity = HOT_BIOME_RAINY_PROFILE_3_UNIFORM_FOG_DENSITY;
LocalClumpyFogDensity = HOT_BIOME_RAINY_PROFILE_3_CLUMPY_FOG_DENSITY;
localFogColor = vec3(HOT_BIOME_RAINY_PROFILE_3_FOG_COLOR_R, HOT_BIOME_RAINY_PROFILE_3_FOG_COLOR_G, HOT_BIOME_RAINY_PROFILE_3_FOG_COLOR_B);
break;
}
#endif
}
}
#endif
#if USE_CUSTOM_COLD_BIOME_RAIN_PROFILE > 0
if(isInColdArea && isInSnowFallEnviornment){
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
int customHotBiomeRainyWeatherProfile = int(RNG * USE_CUSTOM_COLD_BIOME_RAIN_PROFILE);
switch (customHotBiomeRainyWeatherProfile){
default : {
LocalUniformFogDensity = COLD_BIOME_RAINY_PROFILE_1_UNIFORM_FOG_DENSITY;
LocalClumpyFogDensity = COLD_BIOME_RAINY_PROFILE_1_CLUMPY_FOG_DENSITY;
localFogColor = vec3(COLD_BIOME_RAINY_PROFILE_1_FOG_COLOR_R, COLD_BIOME_RAINY_PROFILE_1_FOG_COLOR_G, COLD_BIOME_RAINY_PROFILE_1_FOG_COLOR_B);
break;
}
#if USE_CUSTOM_COLD_BIOME_RAIN_PROFILE >= 2
case 1: {
LocalUniformFogDensity = COLD_BIOME_RAINY_PROFILE_2_UNIFORM_FOG_DENSITY;
LocalClumpyFogDensity = COLD_BIOME_RAINY_PROFILE_2_CLUMPY_FOG_DENSITY;
localFogColor = vec3(COLD_BIOME_RAINY_PROFILE_2_FOG_COLOR_R, COLD_BIOME_RAINY_PROFILE_2_FOG_COLOR_G, HCOLDBIOME_RAINY_PROFILE_2_FOG_COLOR_B);
break;
}
#endif
#if USE_CUSTOM_COLD_BIOME_RAIN_PROFILE >= 3
case 2: {
LocalUniformFogDensity = COLD_BIOME_RAINY_PROFILE_3_UNIFORM_FOG_DENSITY;
LocalClumpyFogDensity = COLD_BIOME_RAINY_PROFILE_3_CLUMPY_FOG_DENSITY;
localFogColor = vec3(HCOLDBIOME_RAINY_PROFILE_3_FOG_COLOR_R, COLD_BIOME_RAINY_PROFILE_3_FOG_COLOR_G, COLD_BIOME_RAINY_PROFILE_3_FOG_COLOR_B);
break;
}
#endif
}
}
#endif
}
#if USE_CUSTOM_SWAMP_CATEGORY_PROFILE == 0
if(isInSwampBiomes){
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
LocalUniformFogDensity = 0.01;
LocalClumpyFogDensity = 0.1;
localFogColor = vec3(0.8,1.0,0.1);
}
#endif
#if USE_CUSTOM_SWAMP_CATEGORY_PROFILE == 1
if(isInSwampBiomes){
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
LocalUniformFogDensity = CUSTOM_SWAMP_PROFILE_1_UNIFORM_FOG_DENSITY;
LocalClumpyFogDensity = CUSTOM_SWAMP_PROFILE_1_CLUMPY_FOG_DENSITY;
localFogColor = vec3(CUSTOM_SWAMP_PROFILE_1_FOG_COLOR_R, CUSTOM_SWAMP_PROFILE_1_FOG_COLOR_G, CUSTOM_SWAMP_PROFILE_1_FOG_COLOR_B);
}
#endif
#if USE_CUSTOM_JUNGLE_CATEGORY_PROFILE == 0
if(isInJungleBiomes){
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
LocalUniformFogDensity = 0.01;
LocalClumpyFogDensity = 0.0;
localFogColor = vec3(0.5,1.0,0.8);
}
#endif
#if USE_CUSTOM_JUNGLE_CATEGORY_PROFILE == 1
if(isInJungleBiomes){
uniformFogDensity = 0.0;
clumpyFogDensity = 0.0;
LocalUniformFogDensity = CUSTOM_JUNGLE_PROFILE_1_UNIFORM_FOG_DENSITY;
LocalClumpyFogDensity = CUSTOM_JUNGLE_PROFILE_1_CLUMPY_FOG_DENSITY;
localFogColor = vec3(CUSTOM_JUNGLE_PROFILE_1_FOG_COLOR_R, CUSTOM_JUNGLE_PROFILE_1_FOG_COLOR_G, CUSTOM_JUNGLE_PROFILE_1_FOG_COLOR_B);
}
#endif
#define WRITE_CUSTOM_SCENE_CONTROLLER_PROFILES
#undef DECLARE_UNIFORMS_OR_WRITE_FUNCTIONS_FOR_CUSTOM_SCENE_CONTROLLER_PROFILES
#include "/CUSTOM_SCENE_PARAMETERS.glsl"
}
#endif
flat varying struct sceneController {
vec2 smallCumulus;
vec2 largeCumulus;
vec2 altostratus;
vec2 fog;
vec2 localFog;
vec3 localFogColor;
} parameters;
vec3 writeSceneControllerParameters(
vec2 uv,
vec2 smallCumulus,
vec2 largeCumulus,
vec2 altostratus,
vec2 fog,
vec2 localFog,
vec3 localFogColor
){
// in colortex4, data is written in a 3x3 pixel area from (1,1) to (3,3)
// avoiding use of any variation of (0,0) to avoid weird textture wrapping issues
// 4th compnent/alpha is storing 1/4 res depth so i cant store there lol
/* (1,3) */ bool topLeft = uv.x > 1 && uv.x < 2 && uv.y > 3 && uv.y < 4;
/* (2,3) */ bool topMiddle = uv.x > 2 && uv.x < 3 && uv.y > 3 && uv.y < 4;
/* (3,3) */ bool topRight = uv.x > 3 && uv.x < 5 && uv.y > 3 && uv.y < 4;
/* (1,2) */ bool middleLeft = uv.x > 1 && uv.x < 2 && uv.y > 2 && uv.y < 3;
/* (2,2) */ bool middleMiddle = uv.x > 2 && uv.x < 3 && uv.y > 2 && uv.y < 3;
// /* (3,2) */ bool middleRight = uv.x > 3 && uv.x < 5 && uv.y > 2 && uv.y < 3;
// /* (1,1) */ bool bottomLeft = uv.x > 1 && uv.x < 2 && uv.y > 1 && uv.y < 2;
// /* (2,1) */ bool bottomMiddle = uv.x > 2 && uv.x < 3 && uv.y > 1 && uv.y < 2;
// /* (3,1) */ bool bottomRight = uv.x > 3 && uv.x < 5 && uv.y > 1 && uv.y < 2;
vec3 data = vec3(0.0,0.0,0.0);
if(topLeft) data = vec3(smallCumulus.xy, largeCumulus.x);
if(topMiddle) data = vec3(largeCumulus.y, altostratus.xy);
if(topRight) data = vec3(fog.xy, localFog.x);
if(middleLeft) data = vec3(localFog.y, 0.0, 0.0);
if(middleMiddle) data = vec3(localFogColor.rgb);
// if(topRight) data = vec4(groundSunColor,fogSunColor.r);
// if(middleLeft) data = vec4(groundAmbientColor,fogSunColor.g);
// if(middleMiddle) data = vec4(fogAmbientColor,fogSunColor.b);
// if(middleRight) data = vec4(cloudSunColor,cloudAmbientColor.r);
// if(bottomLeft) data = vec4(cloudAmbientColor.gb,0.0,0.0);
// if(bottomMiddle) data = vec4(0.0);
// if(bottomRight) data = vec4(0.0);
return data;
}
void readSceneControllerParameters(
sampler2D colortex,
out vec2 smallCumulus,
out vec2 largeCumulus,
out vec2 altostratus,
out vec2 fog,
out vec2 localFog,
out vec3 localFogColor
){
// in colortex4, read the data stored within the 3 components of the sampled pixels, and pass it to the fragment stage
// 4th compnent/alpha is storing 1/4 res depth so i cant store there lol
vec3 data1 = texelFetch(colortex,ivec2(1,3),0).rgb/150.0;
vec3 data2 = texelFetch(colortex,ivec2(2,3),0).rgb/150.0;
vec3 data3 = texelFetch(colortex,ivec2(3,3),0).rgb/150.0;
float data4 = texelFetch(colortex,ivec2(1,2),0).r/150.0;
vec3 data5 = texelFetch(colortex,ivec2(2,2),0).rgb/150.0; // this samples a color
smallCumulus = vec2(data1.x,data1.y);
largeCumulus = vec2(data1.z,data2.x);
altostratus = vec2(data2.y,data2.z);
fog = vec2(data3.x, data3.y);
localFog = vec2(data3.z, data4);
localFogColor = vec3(data5.r,data5.g,data5.b);
}
#endif
// call the reading function within the main function
// this is so i dont have to edit the function call across every file :)))))))))))))
#if defined READ_SCENE_CONTROLLER_PARAMETERS
readSceneControllerParameters(
colortex4,
parameters.smallCumulus,
parameters.largeCumulus,
parameters.altostratus,
parameters.fog,
parameters.localFog,
parameters.localFogColor
);
#endif