1313
1414#include < numbers>
1515
16+
1617scenes::LoadingScreen::LoadingScreen (ServiceProvider* service_provider)
17- : m_segments{
18- { Mino{ grid::GridPoint{ 0 , 0 }, helper::TetrominoType::J }, 1.0 },
19- { Mino{ grid::GridPoint{ 1 , 0 }, helper::TetrominoType::L }, 1.0 },
20- { Mino{ grid::GridPoint{ 2 , 0 }, helper::TetrominoType::I }, 1.0 },
21- { Mino{ grid::GridPoint{ 2 , 1 }, helper::TetrominoType::O }, 1.0 },
22- { Mino{ grid::GridPoint{ 2 , 2 }, helper::TetrominoType::S }, 1.0 },
23- { Mino{ grid::GridPoint{ 1 , 2 }, helper::TetrominoType::T }, 1.0 },
24- { Mino{ grid::GridPoint{ 0 , 2 }, helper::TetrominoType::I }, 1.0 },
25- { Mino{ grid::GridPoint{ 0 , 1 }, helper::TetrominoType::Z }, 1.0 },
26- },m_logo{logo::get_logo (service_provider)} {
27-
28- const auto [total_x_tiles, total_y_tiles] = utils::get_orientation () == utils::Orientation::Landscape
29- ? std::pair<u32 , u32 >{ 17 , 9 }
30- : std::pair<u32 , u32 >{ 9 , 17 };
31-
32- constexpr auto loading_segments_size = 3 ;
18+ : m_logo{ logo::get_logo (service_provider) },
19+ m_spinner{ ui::FullScreenLayout{ service_provider->window () }, true } {
3320
3421 const auto & window = service_provider->window ();
3522
3623 const auto layout = window.size ();
3724
38- const u32 tile_size_x = layout.x / total_x_tiles;
39- const u32 tile_size_y = layout.y / total_y_tiles;
40-
41- m_tile_size = std::min (tile_size_y, tile_size_x);
42-
43- const shapes::UPoint grid_start_offset = { (total_x_tiles - loading_segments_size) / 2 ,
44- (total_y_tiles - loading_segments_size) / 2 };
45-
46- m_start_offset = grid_start_offset * m_tile_size;
47-
4825 constexpr const auto logo_width_percentage = 0.8 ;
4926
5027 constexpr const auto start_x = (1.0 - logo_width_percentage) / 2.0 ;
@@ -58,70 +35,14 @@ scenes::LoadingScreen::LoadingScreen(ServiceProvider* service_provider)
5835 m_logo_rect = ui::RelativeLayout (window, start_x, 0.05 , logo_width_percentage, logo_height_percentage).get_rect ();
5936}
6037
61- namespace {
62- [[nodiscard]] double elapsed_time () {
63- return static_cast <double >(SDL_GetTicks64 ()) / 1000.0 ;
64- }
65- } // namespace
66-
6738
6839void scenes::LoadingScreen::update () {
69-
70- constexpr const auto speed = std::numbers::pi_v<double > * 1.0 ;
71- constexpr const auto amplitude = 1.1 ;
72- constexpr const auto scale_offset = 1.3 ;
73-
74- const auto length = m_segments.size ();
75- const auto length_d = static_cast <double >(length);
76-
77- const auto time = elapsed_time ();
78-
79- for (size_t i = 0 ; i < length; ++i) {
80-
81- auto & segment = m_segments.at (i);
82-
83- auto & scale = std::get<1 >(segment);
84-
85- const auto offset = std::numbers::pi_v<double > * 2.0 * static_cast <double >(length - i - 1 ) / length_d;
86-
87- scale = std::min ((amplitude * std::sin ((time * speed) + offset)) + scale_offset, 1.0 );
88- }
89- //
40+ m_spinner.update ();
9041}
9142
9243void scenes::LoadingScreen::render (const ServiceProvider& service_provider) const {
93-
94- service_provider. renderer (). draw_rect_filled ( service_provider. window (). screen_rect (), Color::black () );
44+ // NOTE: this already fills the background
45+ m_spinner. render ( service_provider);
9546
9647 service_provider.renderer ().draw_texture (m_logo, m_logo_rect);
97-
98- constexpr const auto scale_threshold = 0.25 ;
99-
100- for (const auto & [mino, scale] : m_segments) {
101- if (scale >= scale_threshold) {
102- const auto original_scale =
103- static_cast <double >(m_tile_size) / static_cast <double >(grid::original_tile_size);
104-
105-
106- const auto tile_size = static_cast <u32 >(static_cast <double >(m_tile_size) * scale);
107-
108- helper::graphics::render_mino (
109- mino, service_provider, MinoTransparency::Solid, original_scale,
110- [this , tile_size](const grid::GridPoint& point) -> auto {
111- return this ->to_screen_coords (point, tile_size);
112- },
113- { tile_size, tile_size }
114- );
115- }
116-
117- // TODO(Totto): render text here, but than we need to load the fonts before this, not in the loading thread (not that they take that long)
118- }
119- }
120-
121-
122- [[nodiscard]] shapes::UPoint scenes::LoadingScreen::to_screen_coords (const grid::GridPoint& point, u32 tile_size)
123- const {
124- const auto start_edge = m_start_offset + point.cast <u32 >() * m_tile_size;
125- const auto inner_offset = m_tile_size - (tile_size / 2 );
126- return start_edge + shapes::UPoint{ inner_offset, inner_offset };
12748}
0 commit comments