From 2238e4abddf8d218c88761867ce948e7a3cd6cda Mon Sep 17 00:00:00 2001 From: "C. J. Howard" Date: Mon, 28 Sep 2020 07:50:14 -0700 Subject: [PATCH] Tween sky pass shader inputs --- src/game/bootloader.cpp | 1 + src/game/states/play-state.cpp | 1 - src/game/systems/weather-system.cpp | 3 ++- src/renderer/passes/sky-pass.cpp | 39 +++++++++++++++++++++-------- src/renderer/passes/sky-pass.hpp | 21 +++++++++------- 5 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/game/bootloader.cpp b/src/game/bootloader.cpp index 97e8df7..bdaf865 100644 --- a/src/game/bootloader.cpp +++ b/src/game/bootloader.cpp @@ -1234,6 +1234,7 @@ void setup_callbacks(game_context* ctx) { (*ctx->time_tween)[1] = t; + ctx->overworld_sky_pass->update_tweens(); ctx->overworld_scene->update_tweens(); ctx->underworld_scene->update_tweens(); ctx->ui_scene->update_tweens(); diff --git a/src/game/states/play-state.cpp b/src/game/states/play-state.cpp index a881875..efdb6f5 100644 --- a/src/game/states/play-state.cpp +++ b/src/game/states/play-state.cpp @@ -89,7 +89,6 @@ void play_state_enter(game_context* ctx) sky_pass* sky_pass = ctx->overworld_sky_pass; sky_pass->set_enabled(true); sky_pass->set_sky_model(ctx->resource_manager->load("sky-dome.mdl")); - sky_pass->set_sun_color(ctx->biome->sun_color * ctx->biome->sun_intensity); ctx->weather_system->set_coordinates(ctx->biome->coordinates); ctx->weather_system->set_time(2020, 10, 1, 6, 0, 0, -7.0); diff --git a/src/game/systems/weather-system.cpp b/src/game/systems/weather-system.cpp index 94faf10..33d33a5 100644 --- a/src/game/systems/weather-system.cpp +++ b/src/game/systems/weather-system.cpp @@ -320,10 +320,11 @@ void weather_system::update(double t, double dt) ambient_light->set_color(ambient_color); sky_pass->set_sky_gradient(gradient); - sky_pass->set_time_of_day(hour * 60.0 * 60.0); + sky_pass->set_time_of_day(static_cast(hour * 60.0 * 60.0)); sky_pass->set_observer_coordinates(coordinates); sky_pass->set_sun_coordinates(sun_position, sun_az_el); sky_pass->set_moon_coordinates(moon_position, moon_az_el); + sky_pass->set_julian_day(static_cast(jd)); } shadow_light = sun_light; diff --git a/src/renderer/passes/sky-pass.cpp b/src/renderer/passes/sky-pass.cpp index cdfc108..af79b9d 100644 --- a/src/renderer/passes/sky-pass.cpp +++ b/src/renderer/passes/sky-pass.cpp @@ -43,7 +43,6 @@ sky_pass::sky_pass(::rasterizer* rasterizer, const ::framebuffer* framebuffer, resource_manager* resource_manager): render_pass(rasterizer, framebuffer), mouse_position({0.0f, 0.0f}), - time_of_day(0.0f), sky_model(nullptr), sky_model_vao(nullptr), blue_noise_map(nullptr), @@ -51,7 +50,6 @@ sky_pass::sky_pass(::rasterizer* rasterizer, const ::framebuffer* framebuffer, r { shader_program = resource_manager->load<::shader_program>("sky.glsl"); model_view_projection_input = shader_program->get_input("model_view_projection"); - sun_color_input = shader_program->get_input("sun_color"); sky_gradient_input = shader_program->get_input("sky_gradient"); mouse_input = shader_program->get_input("mouse"); resolution_input = shader_program->get_input("resolution"); @@ -63,6 +61,7 @@ sky_pass::sky_pass(::rasterizer* rasterizer, const ::framebuffer* framebuffer, r sun_az_el_input = shader_program->get_input("sun_az_el"); moon_position_input = shader_program->get_input("moon_position"); moon_az_el_input = shader_program->get_input("moon_az_el"); + julian_day_input = shader_program->get_input("julian_day"); const float vertex_data[] = { @@ -122,14 +121,20 @@ void sky_pass::render(render_context* context) const float4x4 projection = camera.get_projection_tween().interpolate(context->alpha); float4x4 model_view_projection = projection * model_view; + + float time_of_day = time_of_day_tween.interpolate(context->alpha); + float julian_day = julian_day_tween.interpolate(context->alpha); + float3 sun_position = sun_position_tween.interpolate(context->alpha); + float2 sun_az_el = sun_az_el_tween.interpolate(context->alpha); + float3 moon_position = moon_position_tween.interpolate(context->alpha); + float2 moon_az_el = moon_az_el_tween.interpolate(context->alpha); + // Change shader program rasterizer->use_program(*shader_program); // Upload shader parameters if (model_view_projection_input) model_view_projection_input->upload(model_view_projection); - if (sun_color_input) - sun_color_input->upload(sun_color); if (sky_gradient_input) sky_gradient_input->upload(0, &sky_gradient[0], 4); if (mouse_input) @@ -153,6 +158,8 @@ void sky_pass::render(render_context* context) const moon_position_input->upload(moon_position); if (moon_az_el_input) moon_az_el_input->upload(moon_az_el); + if (julian_day_input) + julian_day_input->upload(julian_day); // Draw sky model rasterizer->draw_arrays(*sky_model_vao, sky_model_drawing_mode, sky_model_start_index, sky_model_index_count); @@ -180,9 +187,14 @@ void sky_pass::set_sky_model(const model* model) } } -void sky_pass::set_sun_color(const float3& color) +void sky_pass::update_tweens() { - sun_color = color; + julian_day_tween.update(); + sun_position_tween.update(); + sun_az_el_tween.update(); + moon_position_tween.update(); + moon_az_el_tween.update(); + time_of_day_tween.update(); } void sky_pass::set_sky_gradient(const std::array& gradient) @@ -192,7 +204,7 @@ void sky_pass::set_sky_gradient(const std::array& gradient) void sky_pass::set_time_of_day(float time) { - time_of_day = time; + time_of_day_tween[1] = time; } void sky_pass::set_time_tween(const tween* time) @@ -205,6 +217,11 @@ void sky_pass::set_blue_noise_map(const texture_2d* texture) blue_noise_map = texture; } +void sky_pass::set_julian_day(float jd) +{ + julian_day_tween[1] = jd; +} + void sky_pass::set_observer_coordinates(const float2& coordinates) { observer_coordinates = coordinates; @@ -212,14 +229,14 @@ void sky_pass::set_observer_coordinates(const float2& coordinates) void sky_pass::set_sun_coordinates(const float3& position, const float2& az_el) { - sun_position = position; - sun_az_el = az_el; + sun_position_tween[1] = position; + sun_az_el_tween[1] = az_el; } void sky_pass::set_moon_coordinates(const float3& position, const float2& az_el) { - moon_position = position; - moon_az_el = az_el; + moon_position_tween[1] = position; + moon_az_el_tween[1] = az_el; } void sky_pass::handle_event(const mouse_moved_event& event) diff --git a/src/renderer/passes/sky-pass.hpp b/src/renderer/passes/sky-pass.hpp index 119415d..01785c2 100644 --- a/src/renderer/passes/sky-pass.hpp +++ b/src/renderer/passes/sky-pass.hpp @@ -46,12 +46,15 @@ public: virtual ~sky_pass(); virtual void render(render_context* context) const final; + void update_tweens(); + void set_sky_model(const model* model); - void set_sun_color(const float3& color); void set_sky_gradient(const std::array& gradient); void set_time_of_day(float time); void set_blue_noise_map(const texture_2d* texture); void set_time_tween(const tween* time); + + void set_julian_day(float jd); void set_observer_coordinates(const float2& coordinates); void set_sun_coordinates(const float3& position, const float2& az_el); void set_moon_coordinates(const float3& position, const float2& az_el); @@ -61,7 +64,6 @@ private: shader_program* shader_program; const shader_input* model_view_projection_input; - const shader_input* sun_color_input; const shader_input* sky_gradient_input; const shader_input* mouse_input; const shader_input* resolution_input; @@ -73,6 +75,7 @@ private: const shader_input* moon_position_input; const shader_input* moon_az_el_input; const shader_input* blue_noise_map_input; + const shader_input* julian_day_input; vertex_buffer* quad_vbo; @@ -84,18 +87,18 @@ private: std::size_t sky_model_start_index; std::size_t sky_model_index_count; - float sun_angular_radius; - float3 sun_color; const texture_2d* blue_noise_map; float2 mouse_position; std::array sky_gradient; const tween* time_tween; - float time_of_day; float2 observer_coordinates; - float3 sun_position; - float2 sun_az_el; - float3 moon_position; - float2 moon_az_el; + tween time_of_day_tween; + + tween julian_day_tween; + tween sun_position_tween; + tween sun_az_el_tween; + tween moon_position_tween; + tween moon_az_el_tween; }; #endif // ANTKEEPER_SKY_PASS_HPP