/* * Copyright (C) 2020 Christopher J. Howard * * This file is part of Antkeeper source code. * * Antkeeper source code is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Antkeeper source code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Antkeeper source code. If not, see . */ #ifndef ANTKEEPER_APPLICATION_HPP #define ANTKEEPER_APPLICATION_HPP // STL #include #include #include #include #include // External #include // Debug #include "debug/logger.hpp" #include "debug/performance-sampler.hpp" #include "debug/cli.hpp" // Input #include "input/control.hpp" #include "input/control-set.hpp" #include "input/keyboard.hpp" #include "input/mouse.hpp" #include "input/game-controller.hpp" #include "input/input-event-router.hpp" #include "input/input-mapper.hpp" // Event #include "event/event-dispatcher.hpp" // Renderer #include "renderer/compositor.hpp" #include "renderer/renderer.hpp" // Scene #include "scene/scene.hpp" #include "scene/camera.hpp" #include "scene/ambient-light.hpp" #include "scene/directional-light.hpp" #include "scene/point-light.hpp" #include "scene/spotlight.hpp" #include "scene/model-instance.hpp" // Animation #include "animation/timeline.hpp" #include "animation/tween.hpp" #include "animation/animation.hpp" // Misc #include "state/fsm.hpp" #include "frame-scheduler.hpp" #include "pheromone-matrix.hpp" #include "orbit-cam.hpp" // Forward declarations //{ // SDL typedef struct SDL_Window SDL_Window; typedef void* SDL_GLContext; // Resources class resource_manager; // Rasterizer class rasterizer; class framebuffer; class vertex_buffer; class vertex_array; class texture_2d; // Renderer class clear_pass; class shadow_map_pass; class material_pass; class sky_pass; class bloom_pass; class final_pass; class simple_render_pass; template class material_property; // Animation class animator; template class animation; class screen_transition; // Systems class behavior_system; class camera_system; class collision_system; class locomotion_system; class model_system; class nest_system; class placement_system; class samara_system; class subterrain_system; class terrain_system; class vegetation_system; class tool_system; class control_system; class constraint_system; class ui_system; // Scene class billboard; //} class application { public: /** * Creates and initializes an application. */ application(int argc, char** argv); /** * Destroys an application. */ ~application(); /** * Executes the application, causing it to enter the execution loop until closed. * * @return Exit status code. */ int execute(); /** * Requests the application's execution loop to cleanly terminate, and specifies its exit status code. * * @param status Status to be returned by application::execute() upon execution loop termination. */ void close(int status); logger* get_logger(); cli* get_cli(); resource_manager* get_resource_manager(); fsm::machine* get_state_machine(); const fsm::state& get_loading_state() const; const fsm::state& get_language_select_state() const; const fsm::state& get_splash_state() const; const fsm::state& get_title_state() const; const fsm::state& get_play_state() const; const fsm::state& get_pause_state() const; timeline* get_timeline(); animator* get_animator(); camera* get_overworld_camera(); camera* get_underworld_camera(); orbit_cam* get_orbit_cam(); control_system* get_control_system(); entt::registry& get_ecs_registry(); scene& get_scene(); void take_screenshot(); // UI scene* get_ui_scene(); billboard* get_splash_billboard(); ::sky_pass* get_sky_pass(); screen_transition* get_fade_transition(); screen_transition* get_radial_transition_inner(); screen_transition* get_radial_transition_outer(); private: void update(double t, double dt); void render(double alpha); void translate_sdl_events(); void set_relative_mouse_mode(bool enabled); void toggle_fullscreen(); void window_resized(); static void save_image(const std::string& filename, int w, int h, const unsigned char* pixels); bool fullscreen; std::tuple saved_mouse_position; std::tuple window_dimensions; std::tuple window_position; std::tuple display_dimensions; float4 viewport; // Debugging std::ofstream log_filestream; ::logger logger; ::cli cli; // Paths std::string data_path; std::string data_package_path; std::string config_path; std::string mods_path; std::string saves_path; std::string screenshots_path; // Resources resource_manager* resource_manager; SDL_Window* window; SDL_GLContext context; bool closed; int exit_status; // Updatable systems timeline timeline; animator* animator; animation* radial_transition_in; animation* radial_transition_out; std::list> systems; int shadow_map_resolution; framebuffer* shadow_map_framebuffer; texture_2d* shadow_map_depth_texture; framebuffer* framebuffer_hdr; texture_2d* framebuffer_hdr_color; texture_2d* framebuffer_hdr_depth; framebuffer* framebuffer_bloom; // General purpose framebuffer A texture_2d* bloom_texture; // Rendering rasterizer* rasterizer; material* fallback_material; ambient_light sun_indirect; directional_light sun_direct; point_light subterrain_light; ambient_light underworld_ambient_light; model_instance lantern; model_instance cloud; model_instance* grass_patches; ::spotlight spotlight; vertex_buffer* billboard_vbo; vertex_array* billboard_vao; ::renderer renderer; scene* active_scene; // Overworld scene overworld_scene; camera overworld_camera; ::clear_pass* clear_pass; ::sky_pass* sky_pass; ::material_pass* material_pass; ::clear_pass* shadow_map_clear_pass; ::shadow_map_pass* shadow_map_pass; ::bloom_pass* bloom_pass; ::final_pass* final_pass; compositor overworld_compositor; // Underworld scene underworld_scene; camera underworld_camera; ::clear_pass* underworld_clear_pass; ::material_pass* underworld_material_pass; simple_render_pass* underworld_final_pass; material_property* underground_color_texture_property; compositor underworld_compositor; // FSM fsm::machine state_machine; fsm::state loading_state; fsm::state language_select_state; fsm::state splash_state; fsm::state title_state; fsm::state play_state; fsm::state pause_state; fsm::state* initial_state; // Frame timing frame_scheduler frame_scheduler; performance_sampler performance_sampler; tween time; // Events event_dispatcher event_dispatcher; input_event_router input_event_router; input_mapper input_mapper; // Input devices keyboard keyboard; mouse mouse; game_controller game_controller; // Controls control_set menu_controls; control menu_back_control; control menu_select_control; control_set* camera_controls; // System controls control_set application_controls; control toggle_fullscreen_control; control screenshot_control; control dig_control; // Game orbit_cam orbit_cam; pheromone_matrix pheromones; control_system* control_system; // ECS entt::registry ecs_registry; behavior_system* behavior_system; camera_system* camera_system; collision_system* collision_system; locomotion_system* locomotion_system; model_system* model_system; nest_system* nest_system; placement_system* placement_system; samara_system* samara_system; subterrain_system* subterrain_system; terrain_system* terrain_system; vegetation_system* vegetation_system; tool_system* tool_system; constraint_system* constraint_system; // UI ui_system* ui_system; compositor ui_compositor; ::clear_pass* ui_clear_pass; ::material_pass* ui_material_pass; billboard* splash_billboard; material* splash_billboard_material; // Animation tween focal_point_tween; screen_transition* fade_transition; screen_transition* radial_transition_inner; screen_transition* radial_transition_outer; }; inline logger* application::get_logger() { return &logger; } inline cli* application::get_cli() { return &cli; } inline resource_manager* application::get_resource_manager() { return resource_manager; } inline fsm::machine* application::get_state_machine() { return &state_machine; } inline const fsm::state& application::get_loading_state() const { return loading_state; } inline const fsm::state& application::get_language_select_state() const { return language_select_state; } inline const fsm::state& application::get_splash_state() const { return splash_state; } inline const fsm::state& application::get_title_state() const { return title_state; } inline const fsm::state& application::get_play_state() const { return play_state; } inline const fsm::state& application::get_pause_state() const { return pause_state; } inline timeline* application::get_timeline() { return &timeline; } inline animator* application::get_animator() { return animator; } inline camera* application::get_overworld_camera() { return &overworld_camera; } inline camera* application::get_underworld_camera() { return &underworld_camera; } inline orbit_cam* application::get_orbit_cam() { return &orbit_cam; } inline control_system* application::get_control_system() { return control_system; } inline entt::registry& application::get_ecs_registry() { return ecs_registry; } inline scene& application::get_scene() { return overworld_scene; } inline billboard* application::get_splash_billboard() { return splash_billboard; } inline sky_pass* application::get_sky_pass() { return sky_pass; } inline screen_transition* application::get_fade_transition() { return fade_transition; } inline screen_transition* application::get_radial_transition_inner() { return radial_transition_inner; } inline screen_transition* application::get_radial_transition_outer() { return radial_transition_outer; } #endif // ANTKEEPER_APPLICATION_HPP