#pragma once #include #include "cpputils/unique_ptr.hpp" #include "entities/camera.hpp" #include "entities/world.hpp" #include "istate.hpp" #include "text/token.hpp" #include "utils/globals.hpp" #include "utils/light.hpp" namespace Nimbin { class MenuState : public IState { enum class ItemKind : uint8_t { OpenFile, StartLevel, Quit, }; struct MenuItem { ItemKind kind; size_t level_index = 0; Text::TokenPtr text3d; Vec3 slot_pos {}; std::string label; }; DynArray _items; cpputils::unique_ptr _world; cpputils::unique_ptr _camera; cpputils::unique_ptr _light; Text::TokenPtr _title; double _scroll_current{0.0}; double _scroll_target {0.0}; double _time {0.0}; size_t _selected {0}; void build_Items (); void activate (Game& game); bool is_LevelItem (size_t idx) const; size_t pick_FromCrosshair() const; static uint32_t yaw_FromRadians(double rad); static double yaw_ToRadians (uint32_t yaw); public: MenuState(); void handle_Event(Game&, const SDL_Event&) override; void update (double dt, const GlRenderer*) override; void render (SDL_Window&, GlRenderer&) override; }; } // namespace Nimbin