77 lines
2.1 KiB
GLSL
77 lines
2.1 KiB
GLSL
#ifndef GLOBALS_GLSL
|
|
#define GLOBALS_GLSL
|
|
|
|
layout(std140, set = 0, binding = 0) uniform u_globals {
|
|
mat4 view_mat;
|
|
mat4 proj_mat;
|
|
mat4 all_mat;
|
|
vec4 cam_pos;
|
|
vec4 focus_off;
|
|
vec4 focus_pos;
|
|
vec4 view_distance;
|
|
// .x = time of day, repeats every day.
|
|
// .y = a continuous value for what day it is. Repeats every `tick_overflow` for precisions sake.
|
|
vec4 time_of_day;
|
|
vec4 sun_dir;
|
|
vec4 moon_dir;
|
|
// .x = The `Time` resource, repeated every `tick_overflow`
|
|
// .y = a floored (`Time` / `tick_overflow`)
|
|
// .z = Time local to client, not synced between clients.
|
|
vec4 tick;
|
|
vec4 screen_res;
|
|
uvec4 light_shadow_count;
|
|
vec4 shadow_proj_factors;
|
|
uvec4 medium;
|
|
ivec4 select_pos;
|
|
vec4 gamma_exposure;
|
|
vec4 last_lightning;
|
|
vec2 wind_vel;
|
|
float ambiance;
|
|
// 0 - FirstPerson
|
|
// 1 - ThirdPerson
|
|
uint cam_mode;
|
|
float sprite_render_distance;
|
|
float globals_dummy; // Fix alignment.
|
|
};
|
|
|
|
// Specifies the pattern used in the player dithering
|
|
mat4 threshold_matrix = mat4(
|
|
vec4(1.0 / 17.0, 9.0 / 17.0, 3.0 / 17.0, 11.0 / 17.0),
|
|
vec4(13.0 / 17.0, 5.0 / 17.0, 15.0 / 17.0, 7.0 / 17.0),
|
|
vec4(4.0 / 17.0, 12.0 / 17.0, 2.0 / 17.0, 10.0 / 17.0),
|
|
vec4(16.0 / 17.0, 8.0 / 17.0, 14.0 / 17.0, 6.0 / 17.0)
|
|
);
|
|
float distance_divider = 2;
|
|
float shadow_dithering = 0.5;
|
|
|
|
float tick_overflow = 300000.0;
|
|
|
|
// Get a scaled time with an offset that loops at a period.
|
|
float tick_loop(float period, float scale, float offset) {
|
|
float loop = tick_overflow * scale;
|
|
float rem = mod(loop, period);
|
|
float rest = rem * tick.y;
|
|
|
|
return mod(rest + tick.x * scale + offset, period);
|
|
}
|
|
|
|
float tick_loop(float period) {
|
|
return tick_loop(period, 1.0, 0.0);
|
|
}
|
|
|
|
|
|
vec4 tick_loop4(float period, vec4 scale, vec4 offset) {
|
|
vec4 loop = tick_overflow * scale;
|
|
vec4 rem = mod(loop, period);
|
|
vec4 rest = rem * tick.y;
|
|
|
|
return mod(rest + tick.x * scale + offset, period);
|
|
}
|
|
|
|
// Only works if t happened within tick_overflow
|
|
float time_since(float t) {
|
|
return tick.x < t ? (tick_overflow - t + tick.x) : (tick.x - t);
|
|
}
|
|
|
|
#endif
|