Experimental river velocity in shaders

This commit is contained in:
Joshua Barretto 2022-09-23 15:04:47 +01:00
parent 8d8d9309b0
commit 3f2efea4f2
34 changed files with 150 additions and 79 deletions

View File

@ -73,7 +73,8 @@ hud-settings-upscale_factor = Internal Resolution
hud-settings-cloud_rendering_mode = Cloud Rendering Mode hud-settings-cloud_rendering_mode = Cloud Rendering Mode
hud-settings-fluid_rendering_mode = Fluid Rendering Mode hud-settings-fluid_rendering_mode = Fluid Rendering Mode
hud-settings-fluid_rendering_mode-cheap = Cheap hud-settings-fluid_rendering_mode-cheap = Cheap
hud-settings-fluid_rendering_mode-shiny = Shiny hud-settings-fluid_rendering_mode-medium = Medium
hud-settings-fluid_rendering_mode-high = High
hud-settings-cloud_rendering_mode-minimal = Minimal hud-settings-cloud_rendering_mode-minimal = Minimal
hud-settings-cloud_rendering_mode-low = Low hud-settings-cloud_rendering_mode-low = Low
hud-settings-cloud_rendering_mode-medium = Medium hud-settings-cloud_rendering_mode-medium = Medium

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -10,7 +10,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif
@ -135,7 +135,7 @@ void main() {
// float moon_light = get_moon_brightness(moon_dir); // float moon_light = get_moon_brightness(moon_dir);
/* float sun_shade_frac = horizon_at(f_pos, sun_dir); /* float sun_shade_frac = horizon_at(f_pos, sun_dir);
float moon_shade_frac = horizon_at(f_pos, moon_dir); */ float moon_shade_frac = horizon_at(f_pos, moon_dir); */
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE == FLUID_MODE_SHINY) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP)
float f_alt = f_pos.z; float f_alt = f_pos.z;
@ -206,7 +206,7 @@ void main() {
vec3 cam_attenuation = vec3(1); vec3 cam_attenuation = vec3(1);
float fluid_alt = max(f_pos.z + 1, floor(f_alt + 1)); float fluid_alt = max(f_pos.z + 1, floor(f_alt + 1));
vec3 mu = medium.x == MEDIUM_WATER ? MU_WATER : vec3(0.0); vec3 mu = medium.x == MEDIUM_WATER ? MU_WATER : vec3(0.0);
#if (FLUID_MODE == FLUID_MODE_SHINY) #if (FLUID_MODE >= FLUID_MODE_MEDIUM)
cam_attenuation = cam_attenuation =
medium.x == MEDIUM_WATER ? compute_attenuation_point(cam_pos.xyz, view_dir, mu, fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/f_pos) medium.x == MEDIUM_WATER ? compute_attenuation_point(cam_pos.xyz, view_dir, mu, fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/f_pos)
: compute_attenuation_point(f_pos, -view_dir, mu, fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/cam_pos.xyz); : compute_attenuation_point(f_pos, -view_dir, mu, fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/cam_pos.xyz);

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif
@ -23,6 +23,7 @@
layout(location = 0) in vec3 f_pos; layout(location = 0) in vec3 f_pos;
layout(location = 1) flat in uint f_pos_norm; layout(location = 1) flat in uint f_pos_norm;
layout(location = 2) in vec2 f_vel;
// in vec3 f_col; // in vec3 f_col;
// in float f_light; // in float f_light;
// in vec3 light_pos[2]; // in vec3 light_pos[2];
@ -88,7 +89,7 @@ void main() {
/* vec3 sun_dir = get_sun_dir(time_of_day.x); /* vec3 sun_dir = get_sun_dir(time_of_day.x);
vec3 moon_dir = get_moon_dir(time_of_day.x); */ vec3 moon_dir = get_moon_dir(time_of_day.x); */
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE == FLUID_MODE_SHINY) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP)
float f_alt = f_pos.z; float f_alt = f_pos.z;

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif
@ -25,6 +25,7 @@
layout(location = 0) in vec3 f_pos; layout(location = 0) in vec3 f_pos;
layout(location = 1) flat in uint f_pos_norm; layout(location = 1) flat in uint f_pos_norm;
layout(location = 2) in vec2 f_vel;
// in vec3 f_col; // in vec3 f_col;
// in float f_light; // in float f_light;
// in vec3 light_pos[2]; // in vec3 light_pos[2];
@ -60,29 +61,66 @@ vec2 wavedx(vec2 position, vec2 direction, float speed, float frequency, float t
} }
// Based on https://www.shadertoy.com/view/MdXyzX // Based on https://www.shadertoy.com/view/MdXyzX
float wave_height(vec3 pos){ float wave_height(vec2 pos){
pos *= 0.3;
float iter = 0.0; float iter = 0.0;
float phase = 6.0; float phase = 4.0;
float speed = 2.0; float weight = 1.5;
float weight = 1.0;
float w = 0.0; float w = 0.0;
float ws = 0.0; float ws = 0.0;
const float drag_factor = 0.048; const float speed_per_iter = 0.1;
for(int i = 0; i < 11; i ++){ #if (FLUID_MODE == FLUID_MODE_HIGH)
float speed = 1.0;
pos *= 0.15;
const float drag_factor = 0.03;
const float iters = 21;
#else
float speed = 2.0;
pos *= 0.3;
const float drag_factor = 0.04;
const float iters = 11;
#endif
const float iter_shift = (3.14159 * 2.0) / 7.3;
vec2 dir = vec2(
sin(pos.y * 0.1),
sin(pos.x * 0.1)
) * 0;
for(int i = 0; i < iters; i ++) {
vec2 p = vec2(sin(iter), cos(iter)); vec2 p = vec2(sin(iter), cos(iter));
vec2 res = wavedx(pos.xy, p, speed, phase, tick.x); vec2 res = wavedx(pos, p, speed, phase, tick.x);
pos.xy += p * res.y * weight * drag_factor; pos += p * res.y * weight * drag_factor;
w += res.x * weight; w += res.x * weight * (1.0 + max(dot(p, -dir), 0.0));
iter += 10.0; iter += iter_shift * 1.5;
ws += weight; ws += weight;
weight = mix(weight, 0.0, 0.15); weight = mix(weight, 0.0, 0.2);
phase *= 1.18; phase *= 1.23;
speed *= 1.07; speed += speed_per_iter;
} }
return w / ws * 10.0; return w / ws * 10.0;
} }
float wave_height2(vec2 pos){
vec2 vel = vec2(sin(pos.x * 0.2), cos(pos.y * 0.2)) * 2.0;
vel = cross(vec3(vel, 0), vec3(0, 0, 1)).xy;
vel = lod_norm(f_pos.xy - 16).xy * 10.0;
vel = f_vel * 3.5;
float hx = mix(
wave_height(pos - vec2(1, 0) * tick.x * floor(vel.x) - vec2(0, 1) * tick.x * floor(vel.y)),
wave_height(pos - vec2(1, 0) * tick.x * floor(vel.x + 1.0) - vec2(0, 1) * tick.x * floor(vel.y)),
fract(vel.x + 1.0)
);
float hx2 = mix(
wave_height(pos - vec2(1, 0) * tick.x * floor(vel.x) - vec2(0, 1) * tick.x * floor(vel.y + 1.0)),
wave_height(pos - vec2(1, 0) * tick.x * floor(vel.x + 1.0) - vec2(0, 1) * tick.x * floor(vel.y + 1.0)),
fract(vel.x + 1.0)
);
return mix(
hx,
hx2,
fract(vel.y + 1.0)
);
}
void main() { void main() {
#ifdef EXPERIMENTAL_BAREMINIMUM #ifdef EXPERIMENTAL_BAREMINIMUM
tgt_color = vec4(simple_lighting(f_pos.xyz, MU_SCATTER, 1.0), 0.5); tgt_color = vec4(simple_lighting(f_pos.xyz, MU_SCATTER, 1.0), 0.5);
@ -127,11 +165,11 @@ void main() {
} }
vec3 c_norm = cross(f_norm, b_norm); vec3 c_norm = cross(f_norm, b_norm);
vec3 wave_pos = mod(f_pos + focus_off.xyz, vec3(3000.0)); vec3 wave_pos = mod(f_pos + focus_off.xyz, vec3(3000.0)) - (f_pos.z + focus_off.z) * 0.2;
float wave_sample_dist = 0.025; float wave_sample_dist = 0.1;
float wave00 = wave_height(wave_pos); float wave00 = wave_height2(wave_pos.xy);
float wave10 = wave_height(wave_pos + vec3(wave_sample_dist, 0, 0)); float wave10 = wave_height2(wave_pos.xy + vec2(wave_sample_dist, 0));
float wave01 = wave_height(wave_pos + vec3(0, wave_sample_dist, 0)); float wave01 = wave_height2(wave_pos.xy + vec2(0, wave_sample_dist));
// Possibility of div by zero when slope = 0, // Possibility of div by zero when slope = 0,
// however this only results in no water surface appearing // however this only results in no water surface appearing
@ -175,7 +213,7 @@ void main() {
//norm = f_norm; //norm = f_norm;
vec3 water_color = (1.0 - MU_WATER) * MU_SCATTER; vec3 water_color = (1.0 - MU_WATER) * MU_SCATTER;
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE == FLUID_MODE_SHINY) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP)
float f_alt = f_pos.z; float f_alt = f_pos.z;

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif
@ -21,6 +21,7 @@
#include <random.glsl> #include <random.glsl>
layout(location = 0) in uint v_pos_norm; layout(location = 0) in uint v_pos_norm;
layout(location = 1) in uint v_vel;
// in uint v_col_light; // in uint v_col_light;
layout(std140, set = 2, binding = 0) layout(std140, set = 2, binding = 0)
@ -42,6 +43,7 @@ uniform u_locals {
layout(location = 0) out vec3 f_pos; layout(location = 0) out vec3 f_pos;
layout(location = 1) flat out uint f_pos_norm; layout(location = 1) flat out uint f_pos_norm;
layout(location = 2) out vec2 f_vel;
// out vec3 f_col; // out vec3 f_col;
// out float f_light; // out float f_light;
// out vec3 light_pos[2]; // out vec3 light_pos[2];
@ -50,6 +52,10 @@ const float EXTRA_NEG_Z = 65536.0/*65536.1*/;
void main() { void main() {
f_pos = vec3(v_pos_norm & 0x3Fu, (v_pos_norm >> 6) & 0x3Fu, float((v_pos_norm >> 12) & 0x1FFFFu) - EXTRA_NEG_Z) + model_offs - focus_off.xyz; f_pos = vec3(v_pos_norm & 0x3Fu, (v_pos_norm >> 6) & 0x3Fu, float((v_pos_norm >> 12) & 0x1FFFFu) - EXTRA_NEG_Z) + model_offs - focus_off.xyz;
f_vel = vec2(
(float(v_vel & 0xFFFFu) - 32768.0) / 1000.0,
(float((v_vel >> 16u) & 0xFFFFu) - 32768.0) / 1000.0
);
// f_pos.z -= 250.0 * (1.0 - min(1.0001 - 0.02 / pow(tick.x - load_time, 10.0), 1.0)); // f_pos.z -= 250.0 * (1.0 - min(1.0001 - 0.02 / pow(tick.x - load_time, 10.0), 1.0));
// f_pos.z -= min(32.0, 25.0 * pow(distance(focus_pos.xy, f_pos.xy) / view_distance.x, 20.0)); // f_pos.z -= min(32.0, 25.0 * pow(distance(focus_pos.xy, f_pos.xy) / view_distance.x, 20.0));
@ -73,7 +79,7 @@ void main() {
// f_pos.xy += 0.01; // Avoid z-fighting // f_pos.xy += 0.01; // Avoid z-fighting
// f_pos.x += 0.1 * sin(tick.x / 60 * hash(vec4(f_pos.xyz, 1.0))); // f_pos.x += 0.1 * sin(tick.x / 60 * hash(vec4(f_pos.xyz, 1.0)));
// f_pos.y += 0.1 * sin(tick.x / 60 * hash(vec4(f_pos.xyz, 2.0))); // f_pos.y += 0.1 * sin(tick.x / 60 * hash(vec4(f_pos.xyz, 2.0)));
#if (FLUID_MODE == FLUID_MODE_SHINY) #if (FLUID_MODE >= FLUID_MODE_MEDIUM)
// f_pos.z -= 0.1 + 0.1 * (sin(tick.x/* / 60.0*/* 2.0 + f_pos.x * 2.0 + f_pos.y * 2.0) + 1.0) * 0.5; // f_pos.z -= 0.1 + 0.1 * (sin(tick.x/* / 60.0*/* 2.0 + f_pos.x * 2.0 + f_pos.y * 2.0) + 1.0) * 0.5;
#endif #endif

View File

@ -7,7 +7,8 @@
#define VOXYGEN_COMPUTATION_PREFERENCE_VERTEX 1 #define VOXYGEN_COMPUTATION_PREFERENCE_VERTEX 1
#define FLUID_MODE_CHEAP 0 #define FLUID_MODE_CHEAP 0
#define FLUID_MODE_SHINY 1 #define FLUID_MODE_MEDIUM 1
#define FLUID_MODE_HIGH 2
#define CLOUD_MODE_NONE 0 #define CLOUD_MODE_NONE 0
#define CLOUD_MODE_MINIMAL 1 #define CLOUD_MODE_MINIMAL 1

View File

@ -9,7 +9,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -11,7 +11,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -13,7 +13,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -13,7 +13,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -9,7 +9,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif
@ -41,7 +41,7 @@ void main() {
vec3 cam_to_frag = normalize(f_pos - cam_pos.xyz); vec3 cam_to_frag = normalize(f_pos - cam_pos.xyz);
vec3 view_dir = -cam_to_frag; vec3 view_dir = -cam_to_frag;
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE == FLUID_MODE_SHINY) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP)
float f_alt = f_pos.z; float f_alt = f_pos.z;

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif
@ -445,7 +445,7 @@ void main() {
vec3 moon_dir = get_moon_dir(time_of_day.x); */ vec3 moon_dir = get_moon_dir(time_of_day.x); */
// voxel_norm = vec3(0.0); // voxel_norm = vec3(0.0);
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE == FLUID_MODE_SHINY) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float shadow_alt = /*f_pos.z;*/alt_at(f_pos.xy);//max(alt_at(f_pos.xy), f_pos.z); float shadow_alt = /*f_pos.z;*/alt_at(f_pos.xy);//max(alt_at(f_pos.xy), f_pos.z);
// float shadow_alt = f_pos.z; // float shadow_alt = f_pos.z;
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP)
@ -648,7 +648,7 @@ void main() {
// vec3 surf_color = illuminate(f_col, light, diffuse_light, ambient_light); // vec3 surf_color = illuminate(f_col, light, diffuse_light, ambient_light);
// f_col = f_col + (hash(vec4(floor(vec3(focus_pos.xy + splay(v_pos_orig), f_pos.z)) * 3.0 - round(f_norm) * 0.5, 0)) - 0.5) * 0.05; // Small-scale noise // f_col = f_col + (hash(vec4(floor(vec3(focus_pos.xy + splay(v_pos_orig), f_pos.z)) * 3.0 - round(f_norm) * 0.5, 0)) - 0.5) * 0.05; // Small-scale noise
vec3 surf_color; vec3 surf_color;
#if (FLUID_MODE == FLUID_MODE_SHINY) #if (FLUID_MODE >= FLUID_MODE_MEDIUM)
if (length(f_col_raw - vec3(0.02, 0.06, 0.22)) < 0.025 && dot(vec3(0, 0, 1), f_norm) > 0.9) { if (length(f_col_raw - vec3(0.02, 0.06, 0.22)) < 0.025 && dot(vec3(0, 0, 1), f_norm) > 0.9) {
vec3 water_color = (1.0 - MU_WATER) * MU_SCATTER; vec3 water_color = (1.0 - MU_WATER) * MU_SCATTER;

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif
@ -42,7 +42,7 @@ void main() {
vec3 cam_to_frag = normalize(f_pos - cam_pos.xyz); vec3 cam_to_frag = normalize(f_pos - cam_pos.xyz);
vec3 view_dir = -cam_to_frag; vec3 view_dir = -cam_to_frag;
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE == FLUID_MODE_SHINY) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP)
float f_alt = f_pos.z; float f_alt = f_pos.z;
@ -88,7 +88,7 @@ void main() {
vec3 cam_attenuation = vec3(1); vec3 cam_attenuation = vec3(1);
float fluid_alt = max(f_pos.z + 1, floor(f_alt + 1)); float fluid_alt = max(f_pos.z + 1, floor(f_alt + 1));
vec3 mu = medium.x == MEDIUM_WATER ? MU_WATER : vec3(0.0); vec3 mu = medium.x == MEDIUM_WATER ? MU_WATER : vec3(0.0);
#if (FLUID_MODE == FLUID_MODE_SHINY) #if (FLUID_MODE >= FLUID_MODE_MEDIUM)
cam_attenuation = cam_attenuation =
medium.x == MEDIUM_WATER ? compute_attenuation_point(cam_pos.xyz, view_dir, MU_WATER, fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/f_pos) medium.x == MEDIUM_WATER ? compute_attenuation_point(cam_pos.xyz, view_dir, MU_WATER, fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/f_pos)
: compute_attenuation_point(f_pos, -view_dir, vec3(0), fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/cam_pos.xyz); : compute_attenuation_point(f_pos, -view_dir, vec3(0), fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/cam_pos.xyz);

View File

@ -9,7 +9,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -9,7 +9,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -11,7 +11,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif
@ -51,7 +51,7 @@ void main() {
vec3 cam_to_frag = normalize(f_pos - cam_pos.xyz); vec3 cam_to_frag = normalize(f_pos - cam_pos.xyz);
vec3 view_dir = -cam_to_frag; vec3 view_dir = -cam_to_frag;
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE == FLUID_MODE_SHINY) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP)
float f_alt = f_pos.z; float f_alt = f_pos.z;
@ -94,7 +94,7 @@ void main() {
vec3 cam_attenuation = vec3(1); vec3 cam_attenuation = vec3(1);
float fluid_alt = max(f_pos.z + 1, floor(f_alt + 1)); float fluid_alt = max(f_pos.z + 1, floor(f_alt + 1));
vec3 mu = medium.x == MEDIUM_WATER ? MU_WATER : vec3(0.0); vec3 mu = medium.x == MEDIUM_WATER ? MU_WATER : vec3(0.0);
#if (FLUID_MODE == FLUID_MODE_SHINY) #if (FLUID_MODE >= FLUID_MODE_MEDIUM)
cam_attenuation = cam_attenuation =
medium.x == MEDIUM_WATER ? compute_attenuation_point(cam_pos.xyz, view_dir, mu, fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/f_pos) medium.x == MEDIUM_WATER ? compute_attenuation_point(cam_pos.xyz, view_dir, mu, fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/f_pos)
: compute_attenuation_point(f_pos, -view_dir, mu, fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/cam_pos.xyz); : compute_attenuation_point(f_pos, -view_dir, mu, fluid_alt, /*cam_pos.z <= fluid_alt ? cam_pos.xyz : f_pos*/cam_pos.xyz);

View File

@ -9,7 +9,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif
@ -209,7 +209,7 @@ void main() {
/* vec3 sun_dir = get_sun_dir(time_of_day.x); /* vec3 sun_dir = get_sun_dir(time_of_day.x);
vec3 moon_dir = get_moon_dir(time_of_day.x); */ vec3 moon_dir = get_moon_dir(time_of_day.x); */
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE == FLUID_MODE_SHINY) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP)
float f_alt = f_pos.z; float f_alt = f_pos.z;
@ -396,7 +396,7 @@ void main() {
reflected_light *= 0.4 + f_ao * 0.6; reflected_light *= 0.4 + f_ao * 0.6;
#ifndef EXPERIMENTAL_NOCAUSTICS #ifndef EXPERIMENTAL_NOCAUSTICS
#if (FLUID_MODE == FLUID_MODE_SHINY) #if (FLUID_MODE >= FLUID_MODE_MEDIUM)
if (faces_fluid) { if (faces_fluid) {
vec3 wpos = f_pos + vec3(focus_off.xy, 0); vec3 wpos = f_pos + vec3(focus_off.xy, 0);
vec3 spos = (wpos + (fluid_alt - wpos.z) * vec3(sun_dir.xy, 0)) * 0.25; vec3 spos = (wpos + (fluid_alt - wpos.z) * vec3(sun_dir.xy, 0)) * 0.25;

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -8,7 +8,7 @@
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_CHEAP)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE == FLUID_MODE_SHINY) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
#endif #endif

View File

@ -1038,12 +1038,14 @@ impl<'a> Widget for Video<'a> {
.color(TEXT_COLOR) .color(TEXT_COLOR)
.set(state.ids.fluid_mode_text, ui); .set(state.ids.fluid_mode_text, ui);
let mode_list = [FluidMode::Cheap, FluidMode::Shiny]; let mode_list = [FluidMode::Cheap, FluidMode::Medium, FluidMode::High];
let mode_label_list = [ let mode_label_list = [
self.localized_strings self.localized_strings
.get_msg("hud-settings-fluid_rendering_mode-cheap"), .get_msg("hud-settings-fluid_rendering_mode-cheap"),
self.localized_strings self.localized_strings
.get_msg("hud-settings-fluid_rendering_mode-shiny"), .get_msg("hud-settings-fluid_rendering_mode-medium"),
self.localized_strings
.get_msg("hud-settings-fluid_rendering_mode-high"),
]; ];
// Get which fluid rendering mode is currently active // Get which fluid rendering mode is currently active

View File

@ -9,7 +9,7 @@ use crate::{
scene::terrain::BlocksOfInterest, scene::terrain::BlocksOfInterest,
}; };
use common::{ use common::{
terrain::Block, terrain::{Block, TerrainChunk},
util::either_with, util::either_with,
vol::{ReadVol, RectRasterableVol}, vol::{ReadVol, RectRasterableVol},
volumes::vol_grid_2d::{CachedVolGrid2d, VolGrid2d}, volumes::vol_grid_2d::{CachedVolGrid2d, VolGrid2d},
@ -226,8 +226,8 @@ fn calc_light<V: RectRasterableVol<Vox = Block> + ReadVol + Debug>(
} }
#[allow(clippy::type_complexity)] #[allow(clippy::type_complexity)]
pub fn generate_mesh<'a, V: RectRasterableVol<Vox = Block> + ReadVol + Debug + 'static>( pub fn generate_mesh<'a>(
vol: &'a VolGrid2d<V>, vol: &'a VolGrid2d<TerrainChunk>,
(range, max_texture_size, _boi): (Aabb<i32>, Vec2<u16>, &'a BlocksOfInterest), (range, max_texture_size, _boi): (Aabb<i32>, Vec2<u16>, &'a BlocksOfInterest),
) -> MeshGen< ) -> MeshGen<
TerrainVertex, TerrainVertex,
@ -390,7 +390,20 @@ pub fn generate_mesh<'a, V: RectRasterableVol<Vox = Block> + ReadVol + Debug + '
let mesh_delta = Vec3::new(0.0, 0.0, (z_start + range.min.z) as f32); let mesh_delta = Vec3::new(0.0, 0.0, (z_start + range.min.z) as f32);
let create_opaque = let create_opaque =
|atlas_pos, pos, norm, meta| TerrainVertex::new(atlas_pos, pos + mesh_delta, norm, meta); |atlas_pos, pos, norm, meta| TerrainVertex::new(atlas_pos, pos + mesh_delta, norm, meta);
let create_transparent = |_atlas_pos, pos, norm| FluidVertex::new(pos + mesh_delta, norm); let create_transparent = |_atlas_pos, pos: Vec3<f32>, norm| {
let key = vol.pos_key(pos.map(|e| e.floor() as i32) + range.min);
let v00 = vol.get_key(key + Vec2::new(0, 0)).map_or(Vec3::zero(), |c| c.meta().river_velocity());
let v10 = vol.get_key(key + Vec2::new(1, 0)).map_or(Vec3::zero(), |c| c.meta().river_velocity());
let v01 = vol.get_key(key + Vec2::new(0, 1)).map_or(Vec3::zero(), |c| c.meta().river_velocity());
let v11 = vol.get_key(key + Vec2::new(1, 1)).map_or(Vec3::zero(), |c| c.meta().river_velocity());
let factor = pos / TerrainChunk::RECT_SIZE.map(|e| e as f32);
let vel = Lerp::lerp(
Lerp::lerp(v00, v10, factor.x.rem_euclid(1.0)),
Lerp::lerp(v01, v11, factor.x.rem_euclid(1.0)),
factor.y.rem_euclid(1.0),
);
FluidVertex::new(pos + mesh_delta, norm, vel.xy())
};
let mut greedy = let mut greedy =
GreedyMesh::<guillotiere::SimpleAtlasAllocator>::new(max_size, greedy::general_config()); GreedyMesh::<guillotiere::SimpleAtlasAllocator>::new(max_size, greedy::general_config());

View File

@ -155,6 +155,7 @@ pub enum FluidMode {
/// diffraction, and no light attenuation through water. As a result, /// diffraction, and no light attenuation through water. As a result,
/// it can be much cheaper than shiny reflection. /// it can be much cheaper than shiny reflection.
Cheap, Cheap,
High,
/// "Shiny" water. This water implements waves on the surfaces, some /// "Shiny" water. This water implements waves on the surfaces, some
/// attempt at reflections, and tries to compute accurate light /// attempt at reflections, and tries to compute accurate light
/// attenuation through water (this is what results in the /// attenuation through water (this is what results in the
@ -172,11 +173,11 @@ pub enum FluidMode {
/// which causes attenuation to be computed incorrectly; this can be /// which causes attenuation to be computed incorrectly; this can be
/// addressed by using shadow maps (at least for terrain). /// addressed by using shadow maps (at least for terrain).
#[serde(other)] #[serde(other)]
Shiny, Medium,
} }
impl Default for FluidMode { impl Default for FluidMode {
fn default() -> Self { FluidMode::Shiny } fn default() -> Self { FluidMode::Medium }
} }
/// Lighting modes /// Lighting modes

View File

@ -7,10 +7,11 @@ use vek::*;
#[derive(Copy, Clone, Debug, Zeroable, Pod)] #[derive(Copy, Clone, Debug, Zeroable, Pod)]
pub struct Vertex { pub struct Vertex {
pos_norm: u32, pos_norm: u32,
vel: u32,
} }
impl Vertex { impl Vertex {
pub fn new(pos: Vec3<f32>, norm: Vec3<f32>) -> Self { pub fn new(pos: Vec3<f32>, norm: Vec3<f32>, river_velocity: Vec2<f32>) -> Self {
let (norm_axis, norm_dir) = norm let (norm_axis, norm_dir) = norm
.as_slice() .as_slice()
.iter() .iter()
@ -27,11 +28,17 @@ impl Vertex {
| ((pos.y as u32) & 0x003F) << 6 | ((pos.y as u32) & 0x003F) << 6
| (((pos.z + EXTRA_NEG_Z).max(0.0).min((1 << 17) as f32) as u32) & 0x1FFFF) << 12 | (((pos.z + EXTRA_NEG_Z).max(0.0).min((1 << 17) as f32) as u32) & 0x1FFFF) << 12
| (norm_bits & 0x7) << 29, | (norm_bits & 0x7) << 29,
vel: river_velocity
.map2(Vec2::new(0, 16), |e, off| (((e * 1000.0 + 32768.9) as u16 as u32) << off))
.reduce_bitor(),
} }
} }
fn desc<'a>() -> wgpu::VertexBufferLayout<'a> { fn desc<'a>() -> wgpu::VertexBufferLayout<'a> {
const ATTRIBUTES: [wgpu::VertexAttribute; 1] = wgpu::vertex_attr_array![0 => Uint32]; const ATTRIBUTES: [wgpu::VertexAttribute; 2] = wgpu::vertex_attr_array![
0 => Uint32,
1 => Uint32,
];
wgpu::VertexBufferLayout { wgpu::VertexBufferLayout {
array_stride: Self::STRIDE, array_stride: Self::STRIDE,
step_mode: wgpu::InputStepMode::Vertex, step_mode: wgpu::InputStepMode::Vertex,

View File

@ -182,7 +182,8 @@ impl ShaderModules {
"VOXYGEN_COMPUTATION_PREFERENCE_FRAGMENT", "VOXYGEN_COMPUTATION_PREFERENCE_FRAGMENT",
match pipeline_modes.fluid { match pipeline_modes.fluid {
FluidMode::Cheap => "FLUID_MODE_CHEAP", FluidMode::Cheap => "FLUID_MODE_CHEAP",
FluidMode::Shiny => "FLUID_MODE_SHINY", FluidMode::Medium => "FLUID_MODE_MEDIUM",
FluidMode::High => "FLUID_MODE_HIGH",
}, },
match pipeline_modes.cloud { match pipeline_modes.cloud {
CloudMode::None => "CLOUD_MODE_NONE", CloudMode::None => "CLOUD_MODE_NONE",
@ -299,7 +300,7 @@ impl ShaderModules {
let selected_fluid_shader = ["fluid-frag.", match pipeline_modes.fluid { let selected_fluid_shader = ["fluid-frag.", match pipeline_modes.fluid {
FluidMode::Cheap => "cheap", FluidMode::Cheap => "cheap",
FluidMode::Shiny => "shiny", _ => "shiny",
}] }]
.concat(); .concat();

View File

@ -224,12 +224,12 @@ impl assets::Asset for SpriteSpec {
/// skip_remesh is either None (do the full remesh, including recomputing the /// skip_remesh is either None (do the full remesh, including recomputing the
/// light map), or Some((light_map, glow_map)). /// light map), or Some((light_map, glow_map)).
fn mesh_worker<V: BaseVol<Vox = Block> + RectRasterableVol + ReadVol + Debug + 'static>( fn mesh_worker(
pos: Vec2<i32>, pos: Vec2<i32>,
z_bounds: (f32, f32), z_bounds: (f32, f32),
skip_remesh: Option<(LightMapFn, LightMapFn)>, skip_remesh: Option<(LightMapFn, LightMapFn)>,
started_tick: u64, started_tick: u64,
volume: <VolGrid2d<V> as SampleVol<Aabr<i32>>>::Sample, volume: <VolGrid2d<TerrainChunk> as SampleVol<Aabr<i32>>>::Sample,
max_texture_size: u16, max_texture_size: u16,
chunk: Arc<TerrainChunk>, chunk: Arc<TerrainChunk>,
range: Aabb<i32>, range: Aabb<i32>,
@ -274,11 +274,11 @@ fn mesh_worker<V: BaseVol<Vox = Block> + RectRasterableVol + ReadVol + Debug + '
prof_span!("extract sprite_instances"); prof_span!("extract sprite_instances");
let mut instances = [(); SPRITE_LOD_LEVELS].map(|()| Vec::new()); let mut instances = [(); SPRITE_LOD_LEVELS].map(|()| Vec::new());
for x in 0..V::RECT_SIZE.x as i32 { for x in 0..TerrainChunk::RECT_SIZE.x as i32 {
for y in 0..V::RECT_SIZE.y as i32 { for y in 0..TerrainChunk::RECT_SIZE.y as i32 {
for z in z_bounds.0 as i32..z_bounds.1 as i32 + 1 { for z in z_bounds.0 as i32..z_bounds.1 as i32 + 1 {
let rel_pos = Vec3::new(x, y, z); let rel_pos = Vec3::new(x, y, z);
let wpos = Vec3::from(pos * V::RECT_SIZE.map(|e: u32| e as i32)) + rel_pos; let wpos = Vec3::from(pos * TerrainChunk::RECT_SIZE.map(|e: u32| e as i32)) + rel_pos;
let block = if let Ok(block) = volume.get(wpos) { let block = if let Ok(block) = volume.get(wpos) {
block block