diff options
Diffstat (limited to 'src/game/client')
94 files changed, 1360 insertions, 1295 deletions
diff --git a/src/game/client/config/gamepad_axis.cc b/src/game/client/config/gamepad_axis.cc index c6f9e3d..4eb36a9 100644 --- a/src/game/client/config/gamepad_axis.cc +++ b/src/game/client/config/gamepad_axis.cc @@ -30,7 +30,7 @@ static std::string_view get_axis_name(int axis) return UNKNOWN_AXIS_NAME; } -config::GamepadAxis::GamepadAxis(void) : GamepadAxis(io::INVALID_GAMEPAD_AXIS, false) +config::GamepadAxis::GamepadAxis(void) : GamepadAxis(INVALID_GAMEPAD_AXIS, false) { } @@ -66,7 +66,7 @@ void config::GamepadAxis::set(std::string_view value) } m_inverted = false; - m_gamepad_axis = io::INVALID_GAMEPAD_AXIS; + m_gamepad_axis = INVALID_GAMEPAD_AXIS; m_name = UNKNOWN_AXIS_NAME; m_full_string = std::format("{}:{}", m_name, m_inverted ? 1U : 0U); } diff --git a/src/game/client/config/gamepad_button.cc b/src/game/client/config/gamepad_button.cc index 07e4457..d3f8a25 100644 --- a/src/game/client/config/gamepad_button.cc +++ b/src/game/client/config/gamepad_button.cc @@ -39,7 +39,7 @@ static std::string_view get_button_name(int button) config::GamepadButton::GamepadButton(void) { - m_gamepad_button = io::INVALID_GAMEPAD_BUTTON; + m_gamepad_button = INVALID_GAMEPAD_BUTTON; m_name = UNKNOWN_BUTTON_NAME; } @@ -64,7 +64,7 @@ void config::GamepadButton::set(std::string_view value) } } - m_gamepad_button = io::INVALID_GAMEPAD_BUTTON; + m_gamepad_button = INVALID_GAMEPAD_BUTTON; m_name = UNKNOWN_BUTTON_NAME; } diff --git a/src/game/client/const.hh b/src/game/client/const.hh index 461b500..709c0a1 100644 --- a/src/game/client/const.hh +++ b/src/game/client/const.hh @@ -7,11 +7,11 @@ // use this key for conventional gameplay things constexpr static int DEBUG_KEY = GLFW_KEY_F3; -constexpr static int BASE_WIDTH = 320; -constexpr static int BASE_HEIGHT = 240; +constexpr static int BASE_WIDTH = 640; +constexpr static int BASE_HEIGHT = 480; -constexpr static int MIN_WIDTH = 2 * BASE_WIDTH; -constexpr static int MIN_HEIGHT = 2 * BASE_HEIGHT; +constexpr static int MIN_WIDTH = BASE_WIDTH; +constexpr static int MIN_HEIGHT = BASE_HEIGHT; constexpr static int DEFAULT_WIDTH = 720; constexpr static int DEFAULT_HEIGHT = 480; diff --git a/src/game/client/entity/camera.cc b/src/game/client/entity/camera.cc index 3badd9d..2009066 100644 --- a/src/game/client/entity/camera.cc +++ b/src/game/client/entity/camera.cc @@ -23,23 +23,23 @@ #include "client/session.hh" #include "client/toggles.hh" -config::Float entity::camera::roll_angle(2.0f, 0.0f, 4.0f); -config::Float entity::camera::vertical_fov(90.0f, 45.0f, 110.0f); -config::Unsigned entity::camera::view_distance(16U, 4U, 32U); +config::Float camera::roll_angle(2.0f, 0.0f, 4.0f); +config::Float camera::vertical_fov(90.0f, 45.0f, 110.0f); +config::Unsigned camera::view_distance(16U, 4U, 32U); -glm::fvec3 entity::camera::angles; -glm::fvec3 entity::camera::direction; -glm::fmat4x4 entity::camera::matrix; -chunk_pos entity::camera::position_chunk; -glm::fvec3 entity::camera::position_local; +glm::fvec3 camera::angles; +glm::fvec3 camera::direction; +glm::fmat4x4 camera::matrix; +chunk_pos camera::position_chunk; +glm::fvec3 camera::position_local; static void reset_camera(void) { - entity::camera::angles = glm::fvec3(0.0f, 0.0f, 0.0f); - entity::camera::direction = DIR_FORWARD<float>; - entity::camera::matrix = glm::identity<glm::fmat4x4>(); - entity::camera::position_chunk = chunk_pos(0, 0, 0); - entity::camera::position_local = glm::fvec3(0.0f, 0.0f, 0.0f); + camera::angles = glm::fvec3(0.0f, 0.0f, 0.0f); + camera::direction = DIR_FORWARD<float>; + camera::matrix = glm::identity<glm::fmat4x4>(); + camera::position_chunk = chunk_pos(0, 0, 0); + camera::position_local = glm::fvec3(0.0f, 0.0f, 0.0f); } // Gracefully contributed by PQCraft himself in 2024 @@ -65,50 +65,49 @@ static glm::fmat4x4 platinumsrc_viewmatrix(const glm::fvec3& position, const glm return result; } -void entity::camera::init(void) +void camera::init(void) { - globals::client_config.add_value("camera.roll_angle", entity::camera::roll_angle); - globals::client_config.add_value("camera.vertical_fov", entity::camera::vertical_fov); - globals::client_config.add_value("camera.view_distance", entity::camera::view_distance); + globals::client_config.add_value("camera.roll_angle", camera::roll_angle); + globals::client_config.add_value("camera.vertical_fov", camera::vertical_fov); + globals::client_config.add_value("camera.view_distance", camera::view_distance); - settings::add_slider(1, entity::camera::vertical_fov, settings_location::GENERAL, "camera.vertical_fov", true, "%.0f"); - settings::add_slider(0, entity::camera::view_distance, settings_location::VIDEO, "camera.view_distance", false); - settings::add_slider(10, entity::camera::roll_angle, settings_location::VIDEO, "camera.roll_angle", true, "%.01f"); + settings::add_slider(1, camera::vertical_fov, settings_location::GENERAL, "camera.vertical_fov", true, "%.0f"); + settings::add_slider(0, camera::view_distance, settings_location::VIDEO, "camera.view_distance", false); + settings::add_slider(10, camera::roll_angle, settings_location::VIDEO, "camera.roll_angle", true, "%.01f"); reset_camera(); } -void entity::camera::update(void) +void camera::update(void) { if(!session::is_ingame()) { reset_camera(); return; } - const auto& head = globals::dimension->entities.get<entity::client::HeadIntr>(globals::player); - const auto& transform = globals::dimension->entities.get<entity::client::TransformIntr>(globals::player); - const auto& velocity = globals::dimension->entities.get<entity::Velocity>(globals::player); + const auto& head = globals::dimension->entities.get<client::HeadIntr>(globals::player); + const auto& transform = globals::dimension->entities.get<client::TransformIntr>(globals::player); + const auto& velocity = globals::dimension->entities.get<Velocity>(globals::player); - entity::camera::angles = transform.angles + head.angles; - entity::camera::position_chunk = transform.chunk; - entity::camera::position_local = transform.local + head.offset; + camera::angles = transform.angles + head.angles; + camera::position_chunk = transform.chunk; + camera::position_local = transform.local + head.offset; glm::fvec3 right_vector, up_vector; - math::vectors(entity::camera::angles, &entity::camera::direction, &right_vector, &up_vector); + math::vectors(camera::angles, &camera::direction, &right_vector, &up_vector); - auto client_angles = entity::camera::angles; + auto client_angles = camera::angles; if(!toggles::get(TOGGLE_PM_FLIGHT)) { // Apply the quake-like view rolling - client_angles[2] = math::radians(-entity::camera::roll_angle.get_value() - * glm::dot(velocity.value / PMOVE_MAX_SPEED_GROUND, right_vector)); + client_angles[2] = math::radians(-camera::roll_angle.get_value() * glm::dot(velocity.value / PMOVE_MAX_SPEED_GROUND, right_vector)); } const auto z_near = 0.01f; - const auto z_far = 1.25f * static_cast<float>(CHUNK_SIZE * entity::camera::view_distance.get_value()); + const auto z_far = 1.25f * static_cast<float>(CHUNK_SIZE * camera::view_distance.get_value()); - auto proj = glm::perspective(math::radians(entity::camera::vertical_fov.get_value()), globals::aspect, z_near, z_far); - auto view = platinumsrc_viewmatrix(entity::camera::position_local, client_angles); + auto proj = glm::perspective(math::radians(camera::vertical_fov.get_value()), globals::aspect, z_near, z_far); + auto view = platinumsrc_viewmatrix(camera::position_local, client_angles); - entity::camera::matrix = proj * view; + camera::matrix = proj * view; } diff --git a/src/game/client/entity/camera.hh b/src/game/client/entity/camera.hh index 67baf72..526bc91 100644 --- a/src/game/client/entity/camera.hh +++ b/src/game/client/entity/camera.hh @@ -8,24 +8,24 @@ class Float; class Unsigned; } // namespace config -namespace entity::camera +namespace camera { extern config::Float roll_angle; extern config::Float vertical_fov; extern config::Unsigned view_distance; -} // namespace entity::camera +} // namespace camera -namespace entity::camera +namespace camera { extern glm::fvec3 angles; extern glm::fvec3 direction; extern glm::fmat4x4 matrix; extern chunk_pos position_chunk; extern glm::fvec3 position_local; -} // namespace entity::camera +} // namespace camera -namespace entity::camera +namespace camera { void init(void); void update(void); -} // namespace entity::camera +} // namespace camera diff --git a/src/game/client/entity/factory.cc b/src/game/client/entity/factory.cc index f6f6079..f4724c5 100644 --- a/src/game/client/entity/factory.cc +++ b/src/game/client/entity/factory.cc @@ -12,19 +12,19 @@ #include "client/globals.hh" -void entity::client::create_player(world::Dimension* dimension, entt::entity entity) +void client::create_player(Dimension* dimension, entt::entity entity) { - entity::shared::create_player(dimension, entity); + shared::create_player(dimension, entity); - const auto& head = dimension->entities.get<entity::Head>(entity); - dimension->entities.emplace_or_replace<entity::client::HeadIntr>(entity, head); - dimension->entities.emplace_or_replace<entity::client::HeadPrev>(entity, head); + const auto& head = dimension->entities.get<Head>(entity); + dimension->entities.emplace_or_replace<client::HeadIntr>(entity, head); + dimension->entities.emplace_or_replace<client::HeadPrev>(entity, head); - const auto& transform = dimension->entities.get<entity::Transform>(entity); - dimension->entities.emplace_or_replace<entity::client::TransformIntr>(entity, transform); - dimension->entities.emplace_or_replace<entity::client::TransformPrev>(entity, transform); + const auto& transform = dimension->entities.get<Transform>(entity); + dimension->entities.emplace_or_replace<client::TransformIntr>(entity, transform); + dimension->entities.emplace_or_replace<client::TransformPrev>(entity, transform); if(globals::sound_ctx) { - dimension->entities.emplace_or_replace<entity::SoundEmitter>(entity); + dimension->entities.emplace_or_replace<SoundEmitter>(entity); } } diff --git a/src/game/client/entity/factory.hh b/src/game/client/entity/factory.hh index 63e6e44..776a0b8 100644 --- a/src/game/client/entity/factory.hh +++ b/src/game/client/entity/factory.hh @@ -1,11 +1,8 @@ #pragma once -namespace world -{ class Dimension; -} // namespace world -namespace entity::client +namespace client { -void create_player(world::Dimension* dimension, entt::entity entity); -} // namespace entity::client +void create_player(Dimension* dimension, entt::entity entity); +} // namespace client diff --git a/src/game/client/entity/interpolation.cc b/src/game/client/entity/interpolation.cc index a9a3349..69fd487 100644 --- a/src/game/client/entity/interpolation.cc +++ b/src/game/client/entity/interpolation.cc @@ -15,8 +15,7 @@ static void transform_interpolate(float alpha) { - auto group = globals::dimension->entities.group<entity::client::TransformIntr>( - entt::get<entity::Transform, entity::client::TransformPrev>); + auto group = globals::dimension->entities.group<client::TransformIntr>(entt::get<Transform, client::TransformPrev>); for(auto [entity, interp, current, previous] : group.each()) { interp.angles[0] = glm::mix(previous.angles[0], current.angles[0], alpha); @@ -41,7 +40,7 @@ static void transform_interpolate(float alpha) static void head_interpolate(float alpha) { - auto group = globals::dimension->entities.group<entity::client::HeadIntr>(entt::get<entity::Head, entity::client::HeadPrev>); + auto group = globals::dimension->entities.group<client::HeadIntr>(entt::get<Head, client::HeadPrev>); for(auto [entity, interp, current, previous] : group.each()) { interp.angles[0] = glm::mix(previous.angles[0], current.angles[0], alpha); @@ -54,7 +53,7 @@ static void head_interpolate(float alpha) } } -void entity::interpolation::update(void) +void interpolation::update(void) { if(globals::dimension) { auto alpha = static_cast<float>(globals::fixed_accumulator) / static_cast<float>(globals::fixed_frametime_us); diff --git a/src/game/client/entity/interpolation.hh b/src/game/client/entity/interpolation.hh index 6935fe8..8fb0db1 100644 --- a/src/game/client/entity/interpolation.hh +++ b/src/game/client/entity/interpolation.hh @@ -1,6 +1,6 @@ #pragma once -namespace entity::interpolation +namespace interpolation { void update(void); -} // namespace entity::interpolation +} // namespace interpolation diff --git a/src/game/client/entity/listener.cc b/src/game/client/entity/listener.cc index a79e8a5..991f014 100644 --- a/src/game/client/entity/listener.cc +++ b/src/game/client/entity/listener.cc @@ -18,19 +18,19 @@ #include "client/globals.hh" #include "client/session.hh" -void entity::listener::update(void) +void listener::update(void) { if(session::is_ingame()) { - const auto& velocity = globals::dimension->entities.get<entity::Velocity>(globals::player).value; - const auto& position = entity::camera::position_local; + const auto& velocity = globals::dimension->entities.get<Velocity>(globals::player).value; + const auto& position = camera::position_local; alListener3f(AL_POSITION, position.x, position.y, position.z); alListener3f(AL_VELOCITY, velocity.x, velocity.y, velocity.z); float orientation[6]; - orientation[0] = entity::camera::direction.x; - orientation[1] = entity::camera::direction.y; - orientation[2] = entity::camera::direction.z; + orientation[0] = camera::direction.x; + orientation[1] = camera::direction.y; + orientation[2] = camera::direction.z; orientation[3] = DIR_UP<float>.x; orientation[4] = DIR_UP<float>.y; orientation[5] = DIR_UP<float>.z; diff --git a/src/game/client/entity/listener.hh b/src/game/client/entity/listener.hh index 594cde1..07d750f 100644 --- a/src/game/client/entity/listener.hh +++ b/src/game/client/entity/listener.hh @@ -1,6 +1,6 @@ #pragma once -namespace entity::listener +namespace listener { void update(void); -} // namespace entity::listener +} // namespace listener diff --git a/src/game/client/entity/player_look.cc b/src/game/client/entity/player_look.cc index 0752e78..ad0f40e 100644 --- a/src/game/client/entity/player_look.cc +++ b/src/game/client/entity/player_look.cc @@ -51,7 +51,7 @@ static glm::fvec2 last_cursor; static void add_angles(float pitch, float yaw) { if(session::is_ingame()) { - auto& head = globals::dimension->entities.get<entity::Head>(globals::player); + auto& head = globals::dimension->entities.get<Head>(globals::player); head.angles[0] += pitch; head.angles[1] += yaw; @@ -62,13 +62,13 @@ static void add_angles(float pitch, float yaw) // Re-assigning the previous state after the current // state has been already modified is certainly a way // to circumvent the interpolation applied to anything with a head - globals::dimension->entities.emplace_or_replace<entity::client::HeadPrev>(globals::player, head); + globals::dimension->entities.emplace_or_replace<client::HeadPrev>(globals::player, head); } } -static void on_glfw_cursor_pos(const io::GlfwCursorPosEvent& event) +static void on_glfw_cursor_pos(const GlfwCursorPosEvent& event) { - if(io::gamepad::available && io::gamepad::active.get_value()) { + if(gamepad::available && gamepad::active.get_value()) { // The player is assumed to be using // a gamepad instead of mouse and keyboard last_cursor = event.pos; @@ -88,14 +88,14 @@ static void on_glfw_cursor_pos(const io::GlfwCursorPosEvent& event) last_cursor = event.pos; } -static void on_gamepad_button(const io::GamepadButtonEvent& event) +static void on_gamepad_button(const GamepadButtonEvent& event) { if(button_fastlook.equals(event.button)) { fastlook_enabled = event.action == GLFW_PRESS; } } -void entity::player_look::init(void) +void player_look::init(void) { globals::client_config.add_value("player_look.mouse.raw_input", mouse_raw_input); globals::client_config.add_value("player_look.mouse.sensitivity", mouse_sensitivity); @@ -121,15 +121,15 @@ void entity::player_look::init(void) last_cursor.x = 0.5f * static_cast<float>(globals::width); last_cursor.y = 0.5f * static_cast<float>(globals::height); - globals::dispatcher.sink<io::GlfwCursorPosEvent>().connect<&on_glfw_cursor_pos>(); - globals::dispatcher.sink<io::GamepadButtonEvent>().connect<&on_gamepad_button>(); + globals::dispatcher.sink<GlfwCursorPosEvent>().connect<&on_glfw_cursor_pos>(); + globals::dispatcher.sink<GamepadButtonEvent>().connect<&on_gamepad_button>(); } -void entity::player_look::update_late(void) +void player_look::update_late(void) { - if(io::gamepad::available && io::gamepad::active.get_value() && !globals::gui_screen) { - auto pitch_value = axis_pitch.get_value(io::gamepad::state, io::gamepad::deadzone.get_value()); - auto yaw_value = axis_yaw.get_value(io::gamepad::state, io::gamepad::deadzone.get_value()); + if(gamepad::available && gamepad::active.get_value() && !globals::gui_screen) { + auto pitch_value = axis_pitch.get_value(gamepad::state, gamepad::deadzone.get_value()); + auto yaw_value = axis_yaw.get_value(gamepad::state, gamepad::deadzone.get_value()); if(fastlook_enabled) { // Fastlook allows the camera to diff --git a/src/game/client/entity/player_look.hh b/src/game/client/entity/player_look.hh index 0ae18db..9d0f1dd 100644 --- a/src/game/client/entity/player_look.hh +++ b/src/game/client/entity/player_look.hh @@ -1,7 +1,7 @@ #pragma once -namespace entity::player_look +namespace player_look { void init(void); void update_late(void); -} // namespace entity::player_look +} // namespace player_look diff --git a/src/game/client/entity/player_move.cc b/src/game/client/entity/player_move.cc index 4087b04..14d64cc 100644 --- a/src/game/client/entity/player_move.cc +++ b/src/game/client/entity/player_move.cc @@ -114,7 +114,7 @@ static glm::fvec3 pm_flight_move(const glm::fvec3& wishdir) return wishdir * PMOVE_MAX_SPEED_AIR; } -void entity::player_move::init(void) +void player_move::init(void) { movement_direction = ZERO_VEC3<float>; @@ -153,14 +153,14 @@ void entity::player_move::init(void) settings::add_checkbox(2, enable_speedometer, settings_location::VIDEO_GUI, "player_move.enable_speedometer", true); } -void entity::player_move::fixed_update(void) +void player_move::fixed_update(void) { - const auto& head = globals::dimension->entities.get<entity::Head>(globals::player); - auto& transform = globals::dimension->entities.get<entity::Transform>(globals::player); - auto& velocity = globals::dimension->entities.get<entity::Velocity>(globals::player); + const auto& head = globals::dimension->entities.get<Head>(globals::player); + auto& transform = globals::dimension->entities.get<Transform>(globals::player); + auto& velocity = globals::dimension->entities.get<Velocity>(globals::player); // Interpolation - preserve current component states - globals::dimension->entities.emplace_or_replace<entity::client::TransformPrev>(globals::player, transform); + globals::dimension->entities.emplace_or_replace<client::TransformPrev>(globals::player, transform); glm::fvec3 forward, right; math::vectors(glm::fvec3(0.0f, head.angles[1], 0.0f), &forward, &right, nullptr); @@ -175,7 +175,7 @@ void entity::player_move::fixed_update(void) return; } - auto grounded = globals::dimension->entities.try_get<entity::Grounded>(globals::player); + auto grounded = globals::dimension->entities.try_get<Grounded>(globals::player); auto velocity_horizontal = glm::fvec3(velocity.value.x, 0.0f, velocity.value.z); if(grounded) { @@ -193,7 +193,7 @@ void entity::player_move::fixed_update(void) } if(footsteps_distance >= PMOVE_FOOTSTEP_SIZE) { - if(auto effect = world::voxel_sounds::get_footsteps(grounded->surface)) { + if(auto effect = voxel_sounds::get_footsteps(grounded->surface)) { sound::play_player(effect, false, pitch_distrib(pitch_random)); } @@ -228,27 +228,27 @@ void entity::player_move::fixed_update(void) if(glm::abs(speed_change) < 0.01f) { // No considerable speed increase within // the precision we use to draw the speedometer - gui::status_lines::set(gui::STATUS_DEBUG, new_speed_text, ImVec4(0.7f, 0.7f, 0.7f, 1.0f), 1.0f); + status_lines::set(STATUS_DEBUG, new_speed_text, ImVec4(0.7f, 0.7f, 0.7f, 1.0f), 1.0f); } else if(speed_change < 0.0f) { // Speed change is negative, we are actively // slowing down; use the red color for the status line - gui::status_lines::set(gui::STATUS_DEBUG, new_speed_text, ImVec4(1.0f, 0.0f, 0.0f, 1.0f), 1.0f); + status_lines::set(STATUS_DEBUG, new_speed_text, ImVec4(1.0f, 0.0f, 0.0f, 1.0f), 1.0f); } else { // Speed change is positive, we are actively // speeding up; use the green color for the status line - gui::status_lines::set(gui::STATUS_DEBUG, new_speed_text, ImVec4(0.0f, 1.0f, 0.0f, 1.0f), 1.0f); + status_lines::set(STATUS_DEBUG, new_speed_text, ImVec4(0.0f, 1.0f, 0.0f, 1.0f), 1.0f); } } - if(auto effect = world::voxel_sounds::get_footsteps(grounded->surface)) { + if(auto effect = voxel_sounds::get_footsteps(grounded->surface)) { sound::play_player(effect, false, 1.0f); } } } -void entity::player_move::update_late(void) +void player_move::update_late(void) { movement_direction = ZERO_VEC3<float>; @@ -258,17 +258,17 @@ void entity::player_move::update_late(void) return; } - if(io::gamepad::available && io::gamepad::active.get_value()) { - if(button_move_down.is_pressed(io::gamepad::state)) { + if(gamepad::available && gamepad::active.get_value()) { + if(button_move_down.is_pressed(gamepad::state)) { movement_direction += DIR_DOWN<float>; } - if(button_move_up.is_pressed(io::gamepad::state)) { + if(button_move_up.is_pressed(gamepad::state)) { movement_direction += DIR_UP<float>; } - movement_direction.x += axis_move_sideways.get_value(io::gamepad::state, io::gamepad::deadzone.get_value()); - movement_direction.z -= axis_move_forward.get_value(io::gamepad::state, io::gamepad::deadzone.get_value()); + movement_direction.x += axis_move_sideways.get_value(gamepad::state, gamepad::deadzone.get_value()); + movement_direction.z -= axis_move_forward.get_value(gamepad::state, gamepad::deadzone.get_value()); } else { if(GLFW_PRESS == glfwGetKey(globals::window, key_move_forward.get_key())) { diff --git a/src/game/client/entity/player_move.hh b/src/game/client/entity/player_move.hh index 8c033cc..8516308 100644 --- a/src/game/client/entity/player_move.hh +++ b/src/game/client/entity/player_move.hh @@ -7,9 +7,9 @@ constexpr static float PMOVE_ACCELERATION_GROUND = 6.0f; constexpr static float PMOVE_FRICTION_GROUND = 10.0f; constexpr static float PMOVE_JUMP_FORCE = 0.275f; -namespace entity::player_move +namespace player_move { void init(void); void fixed_update(void); void update_late(void); -} // namespace entity::player_move +} // namespace player_move diff --git a/src/game/client/entity/sound_emitter.cc b/src/game/client/entity/sound_emitter.cc index 57909ec..79b5ab0 100644 --- a/src/game/client/entity/sound_emitter.cc +++ b/src/game/client/entity/sound_emitter.cc @@ -19,35 +19,35 @@ #include "client/globals.hh" -entity::SoundEmitter::SoundEmitter(void) +SoundEmitter::SoundEmitter(void) { alGenSources(1, &source); sound = nullptr; } -entity::SoundEmitter::~SoundEmitter(void) +SoundEmitter::~SoundEmitter(void) { alSourceStop(source); alDeleteSources(1, &source); } -void entity::SoundEmitter::update(void) +void SoundEmitter::update(void) { if(globals::dimension) { - const auto view = globals::dimension->entities.view<entity::SoundEmitter>(); + const auto view = globals::dimension->entities.view<SoundEmitter>(); - const auto& pivot = entity::camera::position_chunk; + const auto& pivot = camera::position_chunk; const auto gain = glm::clamp(sound::volume_effects.get_value() * 0.01f, 0.0f, 1.0f); for(const auto [entity, emitter] : view.each()) { alSourcef(emitter.source, AL_GAIN, gain); - if(const auto transform = globals::dimension->entities.try_get<entity::client::TransformIntr>(entity)) { + if(const auto transform = globals::dimension->entities.try_get<client::TransformIntr>(entity)) { auto position = coord::to_relative(pivot, transform->chunk, transform->local); alSource3f(emitter.source, AL_POSITION, position.x, position.y, position.z); } - if(const auto velocity = globals::dimension->entities.try_get<entity::Velocity>(entity)) { + if(const auto velocity = globals::dimension->entities.try_get<Velocity>(entity)) { alSource3f(emitter.source, AL_VELOCITY, velocity->value.x, velocity->value.y, velocity->value.z); } diff --git a/src/game/client/entity/sound_emitter.hh b/src/game/client/entity/sound_emitter.hh index 72a3f74..6bc0846 100644 --- a/src/game/client/entity/sound_emitter.hh +++ b/src/game/client/entity/sound_emitter.hh @@ -4,8 +4,6 @@ struct SoundEffect; -namespace entity -{ struct SoundEmitter final { resource_ptr<SoundEffect> sound; ALuint source; @@ -17,4 +15,3 @@ public: public: static void update(void); }; -} // namespace entity diff --git a/src/game/client/experiments.cc b/src/game/client/experiments.cc index eb415f7..4df6f1e 100644 --- a/src/game/client/experiments.cc +++ b/src/game/client/experiments.cc @@ -19,10 +19,10 @@ #include "client/globals.hh" #include "client/session.hh" -static void on_glfw_mouse_button(const io::GlfwMouseButtonEvent& event) +static void on_glfw_mouse_button(const GlfwMouseButtonEvent& event) { if(!globals::gui_screen && session::is_ingame()) { - if((event.action == GLFW_PRESS) && world::player_target::voxel) { + if((event.action == GLFW_PRESS) && player_target::voxel) { if(event.button == GLFW_MOUSE_BUTTON_LEFT) { experiments::attack(); return; @@ -38,20 +38,20 @@ static void on_glfw_mouse_button(const io::GlfwMouseButtonEvent& event) void experiments::init(void) { - globals::dispatcher.sink<io::GlfwMouseButtonEvent>().connect<&on_glfw_mouse_button>(); + globals::dispatcher.sink<GlfwMouseButtonEvent>().connect<&on_glfw_mouse_button>(); } void experiments::init_late(void) { - gui::hotbar::slots[0] = game_items::cobblestone; - gui::hotbar::slots[1] = game_items::stone; - gui::hotbar::slots[2] = game_items::dirt; - gui::hotbar::slots[3] = game_items::grass; - gui::hotbar::slots[4] = game_items::oak_leaves; - gui::hotbar::slots[5] = game_items::oak_planks; - gui::hotbar::slots[6] = game_items::oak_log; - gui::hotbar::slots[7] = game_items::glass; - gui::hotbar::slots[8] = game_items::slime; + hotbar::slots[0] = game_items::cobblestone; + hotbar::slots[1] = game_items::stone; + hotbar::slots[2] = game_items::dirt; + hotbar::slots[3] = game_items::grass; + hotbar::slots[4] = game_items::oak_leaves; + hotbar::slots[5] = game_items::oak_planks; + hotbar::slots[6] = game_items::oak_log; + hotbar::slots[7] = game_items::glass; + hotbar::slots[8] = game_items::slime; } void experiments::shutdown(void) @@ -68,16 +68,16 @@ void experiments::update_late(void) void experiments::attack(void) { - globals::dimension->set_voxel(nullptr, world::player_target::coord); + globals::dimension->set_voxel(nullptr, player_target::coord); } void experiments::interact(void) { - auto active_item = gui::hotbar::slots[gui::hotbar::active_slot]; + auto active_item = hotbar::slots[hotbar::active_slot]; if(active_item) { if(auto place_voxel = active_item->get_place_voxel()) { - globals::dimension->set_voxel(place_voxel, world::player_target::coord + world::player_target::normal); + globals::dimension->set_voxel(place_voxel, player_target::coord + player_target::normal); return; } } diff --git a/src/game/client/game.cc b/src/game/client/game.cc index 4b8ffc8..5a67b59 100644 --- a/src/game/client/game.cc +++ b/src/game/client/game.cc @@ -100,7 +100,7 @@ static ImFont* load_font(std::string_view path, float size, ImFontConfig& font_c { std::vector<std::byte> font; - if(!io::read_file(path, font)) { + if(!read_file(path, font)) { spdlog::error("{}: utils::read_file failed", path); std::terminate(); } @@ -116,7 +116,7 @@ static ImFont* load_font(std::string_view path, float size, ImFontConfig& font_c return font_ptr; } -static void on_glfw_framebuffer_size(const io::GlfwFramebufferSizeEvent& event) +static void on_glfw_framebuffer_size(const GlfwFramebufferSizeEvent& event) { if(globals::world_fbo) { glDeleteRenderbuffers(1, &globals::world_fbo_depth); @@ -147,7 +147,7 @@ static void on_glfw_framebuffer_size(const io::GlfwFramebufferSizeEvent& event) } } -static void on_glfw_key(const io::GlfwKeyEvent& event) +static void on_glfw_key(const GlfwKeyEvent& event) { if(!globals::gui_keybind_ptr && hide_hud_toggle.equals(event.key) && (event.action == GLFW_PRESS)) { client_game::hide_hud = !client_game::hide_hud; @@ -175,8 +175,8 @@ void client_game::init(void) globals::font_unscii16 = load_font("fonts/unscii-16.ttf", 16.0f, font_config, ranges); globals::font_unscii8 = load_font("fonts/unscii-8.ttf", 8.0f, font_config, ranges); - gui::client_splash::init(); - gui::client_splash::render(); + client_splash::init(); + client_splash::render(); globals::client_config.add_value("game.streamer_mode", client_game::streamer_mode); globals::client_config.add_value("game.vertical_sync", client_game::vertical_sync); @@ -201,31 +201,31 @@ void client_game::init(void) std::terminate(); } - gui::language::init(); + language::init(); session::init(); - entity::player_look::init(); - entity::player_move::init(); - world::player_target::init(); + player_look::init(); + player_move::init(); + player_target::init(); - io::gamepad::init(); + gamepad::init(); - entity::camera::init(); + camera::init(); - world::voxel_anims::init(); + voxel_anims::init(); - world::outline::init(); - world::chunk_mesher::init(); - world::chunk_renderer::init(); + outline::init(); + chunk_mesher::init(); + chunk_renderer::init(); globals::world_fbo = 0; globals::world_fbo_color = 0; globals::world_fbo_depth = 0; - world::voxel_sounds::init(); + voxel_sounds::init(); - world::skybox::init(); + skybox::init(); ImGuiStyle& style = ImGui::GetStyle(); @@ -237,94 +237,91 @@ void client_game::init(void) // Rounding on elements looks cool but I am // aiming for a more or less blocky and // visually simple HiDPI-friendly UI style - style.TabRounding = 0.0f; - style.GrabRounding = 0.0f; style.ChildRounding = 0.0f; style.FrameRounding = 0.0f; + style.GrabRounding = 0.0f; style.PopupRounding = 0.0f; - style.WindowRounding = 0.0f; style.ScrollbarRounding = 0.0f; + style.TabRounding = 0.0f; + style.WindowRounding = 0.0f; - style.Colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - style.Colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); - style.Colors[ImGuiCol_WindowBg] = ImVec4(0.06f, 0.06f, 0.06f, 0.94f); - style.Colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - style.Colors[ImGuiCol_PopupBg] = ImVec4(0.08f, 0.08f, 0.08f, 0.94f); style.Colors[ImGuiCol_Border] = ImVec4(0.79f, 0.79f, 0.79f, 0.50f); style.Colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + style.Colors[ImGuiCol_Button] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); + style.Colors[ImGuiCol_ButtonActive] = ImVec4(0.25f, 0.25f, 0.25f, 1.00f); + style.Colors[ImGuiCol_ButtonHovered] = ImVec4(0.12f, 0.12f, 0.12f, 1.00f); + style.Colors[ImGuiCol_CheckMark] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); + style.Colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.38f); + style.Colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 1.00f); style.Colors[ImGuiCol_FrameBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.54f); - style.Colors[ImGuiCol_FrameBgHovered] = ImVec4(0.36f, 0.36f, 0.36f, 0.40f); style.Colors[ImGuiCol_FrameBgActive] = ImVec4(0.63f, 0.63f, 0.63f, 0.67f); - style.Colors[ImGuiCol_TitleBg] = ImVec4(0.04f, 0.04f, 0.04f, 1.00f); - style.Colors[ImGuiCol_TitleBgActive] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); - style.Colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 0.51f); + style.Colors[ImGuiCol_FrameBgHovered] = ImVec4(0.36f, 0.36f, 0.36f, 0.40f); + style.Colors[ImGuiCol_Header] = ImVec4(0.00f, 0.00f, 0.00f, 0.75f); + style.Colors[ImGuiCol_HeaderActive] = ImVec4(0.25f, 0.25f, 0.25f, 1.00f); + style.Colors[ImGuiCol_HeaderHovered] = ImVec4(0.12f, 0.12f, 0.12f, 1.00f); style.Colors[ImGuiCol_MenuBarBg] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); + style.Colors[ImGuiCol_NavCursor] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + style.Colors[ImGuiCol_NavHighlight] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + style.Colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + style.Colors[ImGuiCol_NavWindowingHighlight] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + style.Colors[ImGuiCol_PlotHistogram] = ImVec4(0.00f, 1.00f, 0.20f, 1.00f); + style.Colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); + style.Colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f); + style.Colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.69f, 0.00f, 0.00f, 1.00f); + style.Colors[ImGuiCol_PopupBg] = ImVec4(0.08f, 0.08f, 0.08f, 0.94f); + style.Colors[ImGuiCol_ResizeGrip] = ImVec4(0.34f, 0.34f, 0.34f, 0.20f); + style.Colors[ImGuiCol_ResizeGripActive] = ImVec4(1.00f, 1.00f, 1.00f, 0.95f); + style.Colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.57f, 0.57f, 0.57f, 0.67f); style.Colors[ImGuiCol_ScrollbarBg] = ImVec4(0.02f, 0.02f, 0.02f, 0.53f); style.Colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.00f, 0.00f, 0.00f, 0.75f); - style.Colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.12f, 0.12f, 0.12f, 1.00f); style.Colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.25f, 0.25f, 0.25f, 1.00f); - style.Colors[ImGuiCol_CheckMark] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - style.Colors[ImGuiCol_SliderGrab] = ImVec4(0.81f, 0.81f, 0.81f, 0.75f); - style.Colors[ImGuiCol_SliderGrabActive] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); - style.Colors[ImGuiCol_Button] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); - style.Colors[ImGuiCol_ButtonHovered] = ImVec4(0.12f, 0.12f, 0.12f, 1.00f); - style.Colors[ImGuiCol_ButtonActive] = ImVec4(0.25f, 0.25f, 0.25f, 1.00f); - style.Colors[ImGuiCol_Header] = ImVec4(0.00f, 0.00f, 0.00f, 0.75f); - style.Colors[ImGuiCol_HeaderHovered] = ImVec4(0.12f, 0.12f, 0.12f, 1.00f); - style.Colors[ImGuiCol_HeaderActive] = ImVec4(0.25f, 0.25f, 0.25f, 1.00f); + style.Colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.12f, 0.12f, 0.12f, 1.00f); style.Colors[ImGuiCol_Separator] = ImVec4(0.49f, 0.49f, 0.49f, 0.50f); - style.Colors[ImGuiCol_SeparatorHovered] = ImVec4(0.56f, 0.56f, 0.56f, 0.78f); style.Colors[ImGuiCol_SeparatorActive] = ImVec4(0.90f, 0.90f, 0.90f, 1.00f); - style.Colors[ImGuiCol_ResizeGrip] = ImVec4(0.34f, 0.34f, 0.34f, 0.20f); - style.Colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.57f, 0.57f, 0.57f, 0.67f); - style.Colors[ImGuiCol_ResizeGripActive] = ImVec4(1.00f, 1.00f, 1.00f, 0.95f); + style.Colors[ImGuiCol_SeparatorHovered] = ImVec4(0.56f, 0.56f, 0.56f, 0.78f); + style.Colors[ImGuiCol_SliderGrab] = ImVec4(0.81f, 0.81f, 0.81f, 0.75f); + style.Colors[ImGuiCol_SliderGrabActive] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); style.Colors[ImGuiCol_Tab] = ImVec4(0.00f, 0.00f, 0.00f, 0.75f); - style.Colors[ImGuiCol_TabHovered] = ImVec4(0.12f, 0.12f, 0.12f, 1.00f); style.Colors[ImGuiCol_TabActive] = ImVec4(0.25f, 0.25f, 0.25f, 1.00f); - style.Colors[ImGuiCol_TabUnfocused] = ImVec4(0.13f, 0.13f, 0.13f, 0.97f); - style.Colors[ImGuiCol_TabUnfocusedActive] = ImVec4(0.44f, 0.44f, 0.44f, 1.00f); - style.Colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f); - style.Colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.69f, 0.00f, 0.00f, 1.00f); - style.Colors[ImGuiCol_PlotHistogram] = ImVec4(0.00f, 1.00f, 0.20f, 1.00f); - style.Colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); - style.Colors[ImGuiCol_TableHeaderBg] = ImVec4(0.19f, 0.19f, 0.20f, 1.00f); - style.Colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.35f, 1.00f); + style.Colors[ImGuiCol_TabHovered] = ImVec4(0.12f, 0.12f, 0.12f, 1.00f); style.Colors[ImGuiCol_TableBorderLight] = ImVec4(0.23f, 0.23f, 0.25f, 1.00f); + style.Colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.35f, 1.00f); + style.Colors[ImGuiCol_TableHeaderBg] = ImVec4(0.19f, 0.19f, 0.20f, 1.00f); style.Colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); style.Colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.06f); + style.Colors[ImGuiCol_TabUnfocused] = ImVec4(0.13f, 0.13f, 0.13f, 0.97f); + style.Colors[ImGuiCol_TabUnfocusedActive] = ImVec4(0.44f, 0.44f, 0.44f, 1.00f); + style.Colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); + style.Colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); style.Colors[ImGuiCol_TextSelectedBg] = ImVec4(0.61f, 0.61f, 0.61f, 0.35f); - style.Colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 1.00f); - style.Colors[ImGuiCol_NavHighlight] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); - style.Colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f); - style.Colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f); - style.Colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.35f); - - // Making my own Game UI for Source Engine - // taught me one important thing: dimensions - // of UI elements must be calculated at semi-runtime - // so there's simply no point for an INI file. + style.Colors[ImGuiCol_TitleBg] = ImVec4(0.04f, 0.04f, 0.04f, 1.00f); + style.Colors[ImGuiCol_TitleBgActive] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); + style.Colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 0.51f); + style.Colors[ImGuiCol_WindowBg] = ImVec4(0.06f, 0.06f, 0.06f, 0.94f); + style.Colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.75f); + io.IniFilename = nullptr; toggles::init(); - gui::background::init(); + background::init(); - gui::scoreboard::init(); + scoreboard::init(); - gui::client_chat::init(); + client_chat::init(); - gui::bother::init(); + bother::init(); - gui::main_menu::init(); - gui::play_menu::init(); - gui::progress_bar::init(); - gui::message_box::init(); - gui::direct_connection::init(); + main_menu::init(); + play_menu::init(); + progress_bar::init(); + message_box::init(); + direct_connection::init(); - gui::crosshair::init(); - gui::hotbar::init(); - gui::metrics::init(); - gui::status_lines::init(); + crosshair::init(); + hotbar::init(); + metrics::init(); + status_lines::init(); screenshot::init(); @@ -342,8 +339,8 @@ void client_game::init(void) experiments::init(); - globals::dispatcher.sink<io::GlfwFramebufferSizeEvent>().connect<&on_glfw_framebuffer_size>(); - globals::dispatcher.sink<io::GlfwKeyEvent>().connect<&on_glfw_key>(); + globals::dispatcher.sink<GlfwFramebufferSizeEvent>().connect<&on_glfw_framebuffer_size>(); + globals::dispatcher.sink<GlfwKeyEvent>().connect<&on_glfw_key>(); } void client_game::init_late(void) @@ -354,13 +351,13 @@ void client_game::init_late(void) sound::init_late(); } - gui::language::init_late(); + language::init_late(); settings::init_late(); - gui::client_chat::init_late(); + client_chat::init_late(); - gui::status_lines::init_late(); + status_lines::init_late(); game_voxels::populate(); game_items::populate(); @@ -371,35 +368,35 @@ void client_game::init_late(void) // NOTE: this is very debug, early and a quite // conservative limit choice; there must be a better // way to make this limit way smaller than it currently is - for(const auto& voxel : world::voxel_registry::voxels) { + for(const auto& voxel : voxel_registry::voxels) { max_texture_count += voxel->get_default_textures().size(); - max_texture_count += voxel->get_face_textures(world::VFACE_NORTH).size(); - max_texture_count += voxel->get_face_textures(world::VFACE_SOUTH).size(); - max_texture_count += voxel->get_face_textures(world::VFACE_EAST).size(); - max_texture_count += voxel->get_face_textures(world::VFACE_WEST).size(); - max_texture_count += voxel->get_face_textures(world::VFACE_TOP).size(); - max_texture_count += voxel->get_face_textures(world::VFACE_BOTTOM).size(); - max_texture_count += voxel->get_face_textures(world::VFACE_CROSS_NWSE).size(); - max_texture_count += voxel->get_face_textures(world::VFACE_CROSS_NESW).size(); + max_texture_count += voxel->get_face_textures(VFACE_NORTH).size(); + max_texture_count += voxel->get_face_textures(VFACE_SOUTH).size(); + max_texture_count += voxel->get_face_textures(VFACE_EAST).size(); + max_texture_count += voxel->get_face_textures(VFACE_WEST).size(); + max_texture_count += voxel->get_face_textures(VFACE_TOP).size(); + max_texture_count += voxel->get_face_textures(VFACE_BOTTOM).size(); + max_texture_count += voxel->get_face_textures(VFACE_CROSS_NWSE).size(); + max_texture_count += voxel->get_face_textures(VFACE_CROSS_NESW).size(); } // UNDONE: asset packs for non-16x16 stuff - world::voxel_atlas::create(16, 16, max_texture_count); + voxel_atlas::create(16, 16, max_texture_count); - for(auto& voxel : world::voxel_registry::voxels) { + for(auto& voxel : voxel_registry::voxels) { constexpr std::array faces = { - world::VFACE_NORTH, - world::VFACE_SOUTH, - world::VFACE_EAST, - world::VFACE_WEST, - world::VFACE_TOP, - world::VFACE_BOTTOM, - world::VFACE_CROSS_NWSE, - world::VFACE_CROSS_NESW, + VFACE_NORTH, + VFACE_SOUTH, + VFACE_EAST, + VFACE_WEST, + VFACE_TOP, + VFACE_BOTTOM, + VFACE_CROSS_NWSE, + VFACE_CROSS_NESW, }; for(auto face : faces) { - if(auto strip = world::voxel_atlas::find_or_load(voxel->get_face_textures(face))) { + if(auto strip = voxel_atlas::find_or_load(voxel->get_face_textures(face))) { voxel->set_face_cache(face, strip->offset, strip->plane); continue; } @@ -409,22 +406,22 @@ void client_game::init_late(void) } } - world::voxel_atlas::generate_mipmaps(); + voxel_atlas::generate_mipmaps(); - for(auto& item : world::item_registry::items) { + for(auto& item : item_registry::items) { item->set_cached_texture(resource::load<TextureGUI>(item->get_texture(), TEXTURE_GUI_LOAD_CLAMP_S | TEXTURE_GUI_LOAD_CLAMP_T)); } experiments::init_late(); - gui::client_splash::init_late(); + client_splash::init_late(); - gui::window_title::update(); + window_title::update(); } void client_game::shutdown(void) { - world::voxel_sounds::shutdown(); + voxel_sounds::shutdown(); experiments::shutdown(); @@ -434,60 +431,60 @@ void client_game::shutdown(void) sound::shutdown(); } - gui::hotbar::shutdown(); - gui::main_menu::shutdown(); - gui::play_menu::shutdown(); + hotbar::shutdown(); + main_menu::shutdown(); + play_menu::shutdown(); - gui::bother::shutdown(); + bother::shutdown(); - gui::client_chat::shutdown(); + client_chat::shutdown(); - gui::background::shutdown(); + background::shutdown(); - gui::crosshair::shutdown(); + crosshair::shutdown(); delete globals::dimension; globals::player = entt::null; globals::dimension = nullptr; - world::item_registry::purge(); - world::voxel_registry::purge(); + item_registry::purge(); + voxel_registry::purge(); - world::voxel_atlas::destroy(); + voxel_atlas::destroy(); glDeleteRenderbuffers(1, &globals::world_fbo_depth); glDeleteTextures(1, &globals::world_fbo_color); glDeleteFramebuffers(1, &globals::world_fbo); - world::outline::shutdown(); - world::chunk_renderer::shutdown(); - world::chunk_mesher::shutdown(); + outline::shutdown(); + chunk_renderer::shutdown(); + chunk_mesher::shutdown(); enet_host_destroy(globals::client_host); } void client_game::fixed_update(void) { - entity::player_move::fixed_update(); + player_move::fixed_update(); // Only update world simulation gamesystems // if the player can actually observe all the // changes these gamesystems cause visually if(session::is_ingame()) { - entity::Collision::fixed_update(globals::dimension); - entity::Velocity::fixed_update(globals::dimension); - entity::Transform::fixed_update(globals::dimension); - entity::Gravity::fixed_update(globals::dimension); - entity::Stasis::fixed_update(globals::dimension); + Collision::fixed_update(globals::dimension); + Velocity::fixed_update(globals::dimension); + Transform::fixed_update(globals::dimension); + Gravity::fixed_update(globals::dimension); + Stasis::fixed_update(globals::dimension); } } void client_game::fixed_update_late(void) { if(session::is_ingame()) { - const auto& head = globals::dimension->entities.get<entity::Head>(globals::player); - const auto& transform = globals::dimension->entities.get<entity::Transform>(globals::player); - const auto& velocity = globals::dimension->entities.get<entity::Velocity>(globals::player); + const auto& head = globals::dimension->entities.get<Head>(globals::player); + const auto& transform = globals::dimension->entities.get<Transform>(globals::player); + const auto& velocity = globals::dimension->entities.get<Velocity>(globals::player); protocol::EntityHead head_packet; head_packet.entity = entt::null; // ignored by server @@ -513,49 +510,42 @@ void client_game::update(void) { if(session::is_ingame()) { if(toggles::get(TOGGLE_PM_FLIGHT)) { - globals::dimension->entities.remove<entity::Gravity>(globals::player); + globals::dimension->entities.remove<Gravity>(globals::player); } else { - globals::dimension->entities.emplace_or_replace<entity::Gravity>(globals::player); + globals::dimension->entities.emplace_or_replace<Gravity>(globals::player); } } if(globals::sound_ctx) { sound::update(); - entity::listener::update(); + listener::update(); - entity::SoundEmitter::update(); + SoundEmitter::update(); } - entity::interpolation::update(); + interpolation::update(); - world::player_target::update(); + player_target::update(); - entity::camera::update(); + camera::update(); - world::voxel_anims::update(); + voxel_anims::update(); - world::chunk_mesher::update(); + chunk_mesher::update(); - gui::client_chat::update(); + client_chat::update(); experiments::update(); - constexpr auto half_base_width = 0.5f * static_cast<float>(BASE_WIDTH); - constexpr auto half_base_height = 0.5f * static_cast<float>(BASE_HEIGHT); - - auto twice_scale_x = static_cast<float>(globals::width) / half_base_width; - auto twice_scale_y = static_cast<float>(globals::height) / half_base_height; - - auto scale_x = glm::max(1.0f, 0.5f * glm::floor(twice_scale_x)); - auto scale_y = glm::max(1.0f, 0.5f * glm::floor(twice_scale_y)); - auto scale_min = static_cast<unsigned int>(glm::ceil(glm::min(scale_x, scale_y))); - auto scale_int = glm::max<unsigned int>(1U, (scale_min / 2U) * 2U); + auto scale_x = glm::max(1.0f, glm::floor(static_cast<float>(globals::width) / static_cast<float>(BASE_WIDTH))); + auto scale_y = glm::max(1.0f, glm::floor(static_cast<float>(globals::height) / static_cast<float>(BASE_HEIGHT))); + auto scale_min = glm::min(scale_x, scale_y); auto& io = ImGui::GetIO(); - io.FontGlobalScale = scale_int; - globals::gui_scale = scale_int; + io.FontGlobalScale = scale_min; + globals::gui_scale = scale_min; } void client_game::update_late(void) @@ -577,18 +567,18 @@ void client_game::update_late(void) } } - entity::player_look::update_late(); - entity::player_move::update_late(); + player_look::update_late(); + player_move::update_late(); - gui::play_menu::update_late(); + play_menu::update_late(); - gui::bother::update_late(); + bother::update_late(); experiments::update_late(); - io::gamepad::update_late(); + gamepad::update_late(); - world::chunk_visibility::update_late(); + chunk_visibility::update_late(); if(client_game::vertical_sync.get_value()) { glfwSwapInterval(1); @@ -602,22 +592,21 @@ void client_game::render(void) { glViewport(0, 0, globals::width, globals::height); glBindFramebuffer(GL_FRAMEBUFFER, globals::world_fbo); - glClearColor(world::skybox::fog_color.r, world::skybox::fog_color.g, world::skybox::fog_color.b, 1.000f); + glClearColor(skybox::fog_color.r, skybox::fog_color.g, skybox::fog_color.b, 1.000f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(globals::dimension) { - world::chunk_renderer::render(); + chunk_renderer::render(); } glEnable(GL_DEPTH_TEST); - world::player_target::render(); + player_target::render(); if(globals::dimension) { - auto group = globals::dimension->entities.group( - entt::get<entity::Player, entity::Collision, entity::client::HeadIntr, entity::client::TransformIntr>); + auto group = globals::dimension->entities.group(entt::get<Player, Collision, client::HeadIntr, client::TransformIntr>); - world::outline::prepare(); + outline::prepare(); for(const auto [entity, collision, head, transform] : group.each()) { if(entity == globals::player) { @@ -633,8 +622,8 @@ void client_game::render(void) glm::fvec3 hull_fpos = transform.local + collision.aabb.min; glm::fvec3 look = transform.local + head.offset; - world::outline::cube(transform.chunk, hull_fpos, hull_size, 1.0f, glm::fvec4(1.0f, 0.0f, 0.0f, 1.0f)); - world::outline::line(transform.chunk, look, forward, 1.0f, glm::fvec4(0.9f, 0.9f, 0.9f, 1.0f)); + outline::cube(transform.chunk, hull_fpos, hull_size, 1.0f, glm::fvec4(1.0f, 0.0f, 0.0f, 1.0f)); + outline::line(transform.chunk, look, forward, 1.0f, glm::fvec4(0.9f, 0.9f, 0.9f, 1.0f)); } } @@ -653,7 +642,7 @@ void client_game::render(void) void client_game::layout(void) { if(!session::is_ingame()) { - gui::background::layout(); + background::layout(); } if(!globals::gui_screen || (globals::gui_screen == GUI_CHAT)) { @@ -661,47 +650,50 @@ void client_game::layout(void) // This contains Minecraft-esque debug information // about the hardware, world state and other // things that might be uesful - gui::metrics::layout(); + metrics::layout(); } } if(session::is_ingame()) { - gui::client_chat::layout(); - gui::scoreboard::layout(); + client_chat::layout(); + scoreboard::layout(); if(!globals::gui_screen && !client_game::hide_hud) { - gui::hotbar::layout(); - gui::status_lines::layout(); - gui::crosshair::layout(); + hotbar::layout(); + status_lines::layout(); + crosshair::layout(); } } if(globals::gui_screen) { if(session::is_ingame() && (globals::gui_screen != GUI_CHAT)) { - const float width_f = static_cast<float>(globals::width); - const float height_f = static_cast<float>(globals::height); - const ImU32 darken = ImGui::GetColorU32(ImVec4(0.00f, 0.00f, 0.00f, 0.75f)); - ImGui::GetBackgroundDrawList()->AddRectFilled(ImVec2(), ImVec2(width_f, height_f), darken); + auto width_f = static_cast<float>(globals::width); + auto height_f = static_cast<float>(globals::height); + auto darken = ImGui::GetColorU32(ImVec4(0.00f, 0.00f, 0.00f, 0.75f)); + auto darker = ImGui::GetColorU32(ImVec4(0.00f, 0.00f, 0.00f, 0.95f)); + auto draw_list = ImGui::GetBackgroundDrawList(); + + draw_list->AddRectFilledMultiColor({}, { width_f, height_f }, darker, darken, darken, darker); } switch(globals::gui_screen) { case GUI_MAIN_MENU: - gui::main_menu::layout(); + main_menu::layout(); break; case GUI_PLAY_MENU: - gui::play_menu::layout(); + play_menu::layout(); break; case GUI_SETTINGS: settings::layout(); break; case GUI_PROGRESS_BAR: - gui::progress_bar::layout(); + progress_bar::layout(); break; case GUI_MESSAGE_BOX: - gui::message_box::layout(); + message_box::layout(); break; case GUI_DIRECT_CONNECTION: - gui::direct_connection::layout(); + direct_connection::layout(); break; } } diff --git a/src/game/client/globals.cc b/src/game/client/globals.cc index 1932675..85e5cd6 100644 --- a/src/game/client/globals.cc +++ b/src/game/client/globals.cc @@ -6,7 +6,7 @@ #include "client/gui/gui_screen.hh" -io::ConfigMap globals::client_config; +ConfigMap globals::client_config; GLFWwindow* globals::window; @@ -30,7 +30,7 @@ std::size_t globals::num_triangles; ENetHost* globals::client_host; -world::Dimension* globals::dimension = nullptr; +Dimension* globals::dimension = nullptr; entt::entity globals::player; ImFont* globals::font_unscii16; diff --git a/src/game/client/globals.hh b/src/game/client/globals.hh index ba57a9e..a6c2de6 100644 --- a/src/game/client/globals.hh +++ b/src/game/client/globals.hh @@ -9,22 +9,16 @@ class GamepadAxis; class GamepadButton; } // namespace config -namespace io -{ class ConfigMap; -} // namespace io struct GLFWwindow; struct ImFont; -namespace world -{ class Dimension; -} // namespace world namespace globals { -extern io::ConfigMap client_config; +extern ConfigMap client_config; extern GLFWwindow* window; @@ -53,7 +47,7 @@ extern std::size_t num_triangles; extern ENetHost* client_host; -extern world::Dimension* dimension; +extern Dimension* dimension; extern entt::entity player; extern ImFont* font_unscii16; diff --git a/src/game/client/gui/CMakeLists.txt b/src/game/client/gui/CMakeLists.txt index 46d64a1..e3d8b7a 100644 --- a/src/game/client/gui/CMakeLists.txt +++ b/src/game/client/gui/CMakeLists.txt @@ -12,8 +12,12 @@ target_sources(vclient PRIVATE "${CMAKE_CURRENT_LIST_DIR}/gui_screen.hh" "${CMAKE_CURRENT_LIST_DIR}/hotbar.cc" "${CMAKE_CURRENT_LIST_DIR}/hotbar.hh" - "${CMAKE_CURRENT_LIST_DIR}/imdraw_ext.cc" - "${CMAKE_CURRENT_LIST_DIR}/imdraw_ext.hh" + "${CMAKE_CURRENT_LIST_DIR}/imutils_button.cc" + "${CMAKE_CURRENT_LIST_DIR}/imutils_button.hh" + "${CMAKE_CURRENT_LIST_DIR}/imutils_popup.cc" + "${CMAKE_CURRENT_LIST_DIR}/imutils_popup.hh" + "${CMAKE_CURRENT_LIST_DIR}/imutils_text.cc" + "${CMAKE_CURRENT_LIST_DIR}/imutils_text.hh" "${CMAKE_CURRENT_LIST_DIR}/language.cc" "${CMAKE_CURRENT_LIST_DIR}/language.hh" "${CMAKE_CURRENT_LIST_DIR}/main_menu.cc" diff --git a/src/game/client/gui/background.cc b/src/game/client/gui/background.cc index 50fef01..81fb764 100644 --- a/src/game/client/gui/background.cc +++ b/src/game/client/gui/background.cc @@ -12,9 +12,9 @@ static resource_ptr<TextureGUI> texture; -void gui::background::init(void) +void background::init(void) { - texture = resource::load<TextureGUI>("textures/gui/background.png", TEXTURE_GUI_LOAD_VFLIP); + texture = resource::load<TextureGUI>("textures/gui/background.png"); if(texture == nullptr) { spdlog::critical("background: texture load failed"); @@ -22,18 +22,14 @@ void gui::background::init(void) } } -void gui::background::shutdown(void) +void background::shutdown(void) { texture = nullptr; } -void gui::background::layout(void) +void background::layout(void) { auto viewport = ImGui::GetMainViewport(); auto draw_list = ImGui::GetBackgroundDrawList(); - - auto scaled_width = 0.75f * static_cast<float>(globals::width / globals::gui_scale); - auto scaled_height = 0.75f * static_cast<float>(globals::height / globals::gui_scale); - auto scale_uv = ImVec2(scaled_width / static_cast<float>(texture->size.x), scaled_height / static_cast<float>(texture->size.y)); - draw_list->AddImage(texture->handle, ImVec2(0.0f, 0.0f), viewport->Size, ImVec2(0.0f, 0.0f), scale_uv); + draw_list->AddImage(texture->handle, {}, viewport->Size); } diff --git a/src/game/client/gui/background.hh b/src/game/client/gui/background.hh index 5c72a3f..51497d1 100644 --- a/src/game/client/gui/background.hh +++ b/src/game/client/gui/background.hh @@ -1,8 +1,8 @@ #pragma once -namespace gui::background +namespace background { void init(void); void shutdown(void); void layout(void); -} // namespace gui::background +} // namespace background diff --git a/src/game/client/gui/bother.cc b/src/game/client/gui/bother.cc index a045284..7309bbc 100644 --- a/src/game/client/gui/bother.cc +++ b/src/game/client/gui/bother.cc @@ -28,7 +28,7 @@ static void on_status_response_packet(const protocol::StatusResponse& packet) bother_set.erase(identity); - gui::BotherResponseEvent event; + BotherResponseEvent event; event.identity = identity; event.is_server_unreachable = false; event.num_players = packet.num_players; @@ -42,7 +42,7 @@ static void on_status_response_packet(const protocol::StatusResponse& packet) enet_peer_disconnect(packet.peer, protocol::CHANNEL); } -void gui::bother::init(void) +void bother::init(void) { bother_host = enet_host_create(nullptr, BOTHER_PEERS, 1, 0, 0); bother_dispatcher.clear(); @@ -51,14 +51,14 @@ void gui::bother::init(void) bother_dispatcher.sink<protocol::StatusResponse>().connect<&on_status_response_packet>(); } -void gui::bother::shutdown(void) +void bother::shutdown(void) { enet_host_destroy(bother_host); bother_dispatcher.clear(); bother_set.clear(); } -void gui::bother::update_late(void) +void bother::update_late(void) { unsigned int free_peers = 0U; @@ -121,7 +121,7 @@ void gui::bother::update_late(void) } } -void gui::bother::ping(unsigned int identity, std::string_view host, std::uint16_t port) +void bother::ping(unsigned int identity, std::string_view host, std::uint16_t port) { if(bother_set.count(identity)) { // Already in the process @@ -143,7 +143,7 @@ void gui::bother::ping(unsigned int identity, std::string_view host, std::uint16 bother_queue.push_back(item); } -void gui::bother::cancel(unsigned int identity) +void bother::cancel(unsigned int identity) { bother_set.erase(identity); diff --git a/src/game/client/gui/bother.hh b/src/game/client/gui/bother.hh index b0355ca..ed4f84f 100644 --- a/src/game/client/gui/bother.hh +++ b/src/game/client/gui/bother.hh @@ -1,7 +1,5 @@ #pragma once -namespace gui -{ struct BotherResponseEvent final { unsigned int identity; bool is_server_unreachable; @@ -12,13 +10,12 @@ struct BotherResponseEvent final { std::uint32_t game_version_patch; std::string motd; }; -} // namespace gui -namespace gui::bother +namespace bother { void init(void); void shutdown(void); void update_late(void); void ping(unsigned int identity, std::string_view host, std::uint16_t port); void cancel(unsigned int identity); -} // namespace gui::bother +} // namespace bother diff --git a/src/game/client/gui/chat.cc b/src/game/client/gui/chat.cc index 70a1668..76260af 100644 --- a/src/game/client/gui/chat.cc +++ b/src/game/client/gui/chat.cc @@ -16,7 +16,7 @@ #include "client/config/keybind.hh" #include "client/gui/gui_screen.hh" -#include "client/gui/imdraw_ext.hh" +#include "client/gui/imutils_text.hh" #include "client/gui/language.hh" #include "client/gui/settings.hh" @@ -65,7 +65,7 @@ static void append_player_join(const std::string& sender) { GuiChatMessage message; message.spawn = globals::curtime; - message.text = std::format("{} {}", sender, gui::language::resolve("chat.client_join")); + message.text = std::format("{} {}", sender, language::resolve("chat.client_join")); message.color = ImGui::GetStyleColorVec4(ImGuiCol_DragDropTarget); history.push_back(message); @@ -78,7 +78,7 @@ static void append_player_leave(const std::string& sender, const std::string& re { GuiChatMessage message; message.spawn = globals::curtime; - message.text = std::format("{} {} ({})", sender, gui::language::resolve("chat.client_left"), gui::language::resolve(reason.c_str())); + message.text = std::format("{} {} ({})", sender, language::resolve("chat.client_left"), language::resolve(reason.c_str())); message.color = ImGui::GetStyleColorVec4(ImGuiCol_DragDropTarget); history.push_back(message); @@ -105,7 +105,7 @@ static void on_chat_message_packet(const protocol::ChatMessage& packet) } } -static void on_glfw_key(const io::GlfwKeyEvent& event) +static void on_glfw_key(const GlfwKeyEvent& event) { if(event.action == GLFW_PRESS) { if((event.key == GLFW_KEY_ENTER) && (globals::gui_screen == GUI_CHAT)) { @@ -138,7 +138,7 @@ static void on_glfw_key(const io::GlfwKeyEvent& event) } } -void gui::client_chat::init(void) +void client_chat::init(void) { globals::client_config.add_value("chat.key", key_chat); globals::client_config.add_value("chat.history_size", history_size); @@ -147,28 +147,28 @@ void gui::client_chat::init(void) settings::add_slider(1, history_size, settings_location::VIDEO_GUI, "chat.history_size", false); globals::dispatcher.sink<protocol::ChatMessage>().connect<&on_chat_message_packet>(); - globals::dispatcher.sink<io::GlfwKeyEvent>().connect<&on_glfw_key>(); + globals::dispatcher.sink<GlfwKeyEvent>().connect<&on_glfw_key>(); sfx_chat_message = resource::load<SoundEffect>("sounds/ui/chat_message.wav"); } -void gui::client_chat::init_late(void) +void client_chat::init_late(void) { } -void gui::client_chat::shutdown(void) +void client_chat::shutdown(void) { sfx_chat_message = nullptr; } -void gui::client_chat::update(void) +void client_chat::update(void) { while(history.size() > history_size.get_value()) { history.pop_front(); } } -void gui::client_chat::layout(void) +void client_chat::layout(void) { auto viewport = ImGui::GetMainViewport(); auto window_start = ImVec2(0.0f, 0.0f); @@ -177,7 +177,7 @@ void gui::client_chat::layout(void) ImGui::SetNextWindowPos(window_start); ImGui::SetNextWindowSize(window_size); - ImGui::PushFont(globals::font_unscii16, 8.0f); + ImGui::PushFont(globals::font_unscii16, 16.0f); if(!ImGui::Begin("###chat", nullptr, WINDOW_FLAGS)) { ImGui::End(); @@ -235,7 +235,7 @@ void gui::client_chat::layout(void) draw_list->AddRectFilled(rect_pos, rect_end, rect_col); - imdraw_ext::text_shadow_w(it->text, text_pos, text_col, shadow_col, font, draw_list, 8.0f, window_size.x); + imutils::text_wr(draw_list, it->text, text_pos, text_col, shadow_col, font, window_size.x, ImGui::GetFontSize()); ypos -= rect_size.y; } @@ -245,12 +245,12 @@ void gui::client_chat::layout(void) ImGui::PopFont(); } -void gui::client_chat::clear(void) +void client_chat::clear(void) { history.clear(); } -void gui::client_chat::refresh_timings(void) +void client_chat::refresh_timings(void) { for(auto it = history.begin(); it < history.end(); ++it) { // Reset the spawn time so the fadeout timer @@ -259,7 +259,7 @@ void gui::client_chat::refresh_timings(void) } } -void gui::client_chat::print(const std::string& text) +void client_chat::print(const std::string& text) { GuiChatMessage message = {}; message.spawn = globals::curtime; diff --git a/src/game/client/gui/chat.hh b/src/game/client/gui/chat.hh index 6a3ea33..91c3740 100644 --- a/src/game/client/gui/chat.hh +++ b/src/game/client/gui/chat.hh @@ -1,17 +1,17 @@ #pragma once -namespace gui::client_chat +namespace client_chat { void init(void); void init_late(void); void shutdown(void); void update(void); void layout(void); -} // namespace gui::client_chat +} // namespace client_chat -namespace gui::client_chat +namespace client_chat { void clear(void); void refresh_timings(void); void print(const std::string& string); -} // namespace gui::client_chat +} // namespace client_chat diff --git a/src/game/client/gui/crosshair.cc b/src/game/client/gui/crosshair.cc index 649602f..758a10b 100644 --- a/src/game/client/gui/crosshair.cc +++ b/src/game/client/gui/crosshair.cc @@ -13,7 +13,7 @@ static resource_ptr<TextureGUI> texture; -void gui::crosshair::init(void) +void crosshair::init(void) { texture = resource::load<TextureGUI>("textures/gui/hud_crosshair.png", TEXTURE_GUI_LOAD_CLAMP_S | TEXTURE_GUI_LOAD_CLAMP_T | TEXTURE_GUI_LOAD_VFLIP); @@ -24,12 +24,12 @@ void gui::crosshair::init(void) } } -void gui::crosshair::shutdown(void) +void crosshair::shutdown(void) { texture = nullptr; } -void gui::crosshair::layout(void) +void crosshair::layout(void) { auto viewport = ImGui::GetMainViewport(); auto draw_list = ImGui::GetForegroundDrawList(); diff --git a/src/game/client/gui/crosshair.hh b/src/game/client/gui/crosshair.hh index 589727e..6789e1e 100644 --- a/src/game/client/gui/crosshair.hh +++ b/src/game/client/gui/crosshair.hh @@ -1,8 +1,8 @@ #pragma once -namespace gui::crosshair +namespace crosshair { void init(void); void shutdown(void); void layout(void); -} // namespace gui::crosshair +} // namespace crosshair diff --git a/src/game/client/gui/direct_connection.cc b/src/game/client/gui/direct_connection.cc index 39ea2b5..d7cea64 100644 --- a/src/game/client/gui/direct_connection.cc +++ b/src/game/client/gui/direct_connection.cc @@ -29,7 +29,7 @@ static std::string str_password; static std::string direct_hostname; static std::string direct_password; -static void on_glfw_key(const io::GlfwKeyEvent& event) +static void on_glfw_key(const GlfwKeyEvent& event) { if((event.key == GLFW_KEY_ESCAPE) && (event.action == GLFW_PRESS)) { if(globals::gui_screen == GUI_DIRECT_CONNECTION) { @@ -39,14 +39,14 @@ static void on_glfw_key(const io::GlfwKeyEvent& event) } } -static void on_language_set(const gui::LanguageSetEvent& event) +static void on_language_set(const LanguageSetEvent& event) { - str_title = gui::language::resolve("direct_connection.title"); - str_connect = gui::language::resolve_gui("direct_connection.connect"); - str_cancel = gui::language::resolve_gui("direct_connection.cancel"); + str_title = language::resolve("direct_connection.title"); + str_connect = language::resolve_gui("direct_connection.connect"); + str_cancel = language::resolve_gui("direct_connection.cancel"); - str_hostname = gui::language::resolve("direct_connection.hostname"); - str_password = gui::language::resolve("direct_connection.password"); + str_hostname = language::resolve("direct_connection.hostname"); + str_password = language::resolve("direct_connection.password"); } static void connect_to_server(void) @@ -72,13 +72,13 @@ static void connect_to_server(void) session::connect(parsed_hostname.c_str(), parsed_port, direct_password.c_str()); } -void gui::direct_connection::init(void) +void direct_connection::init(void) { - globals::dispatcher.sink<io::GlfwKeyEvent>().connect<&on_glfw_key>(); + globals::dispatcher.sink<GlfwKeyEvent>().connect<&on_glfw_key>(); globals::dispatcher.sink<LanguageSetEvent>().connect<&on_language_set>(); } -void gui::direct_connection::layout(void) +void direct_connection::layout(void) { auto viewport = ImGui::GetMainViewport(); auto window_start = ImVec2(0.25f * viewport->Size.x, 0.20f * viewport->Size.y); diff --git a/src/game/client/gui/direct_connection.hh b/src/game/client/gui/direct_connection.hh index aa02d7c..0a09a3f 100644 --- a/src/game/client/gui/direct_connection.hh +++ b/src/game/client/gui/direct_connection.hh @@ -1,7 +1,7 @@ #pragma once -namespace gui::direct_connection +namespace direct_connection { void init(void); void layout(void); -} // namespace gui::direct_connection +} // namespace direct_connection diff --git a/src/game/client/gui/hotbar.cc b/src/game/client/gui/hotbar.cc index 663f263..b38c368 100644 --- a/src/game/client/gui/hotbar.cc +++ b/src/game/client/gui/hotbar.cc @@ -19,13 +19,13 @@ #include "client/globals.hh" -constexpr static float ITEM_SIZE = 20.0f; -constexpr static float ITEM_PADDING = 2.0f; -constexpr static float SELECTOR_PADDING = 1.0f; -constexpr static float HOTBAR_PADDING = 2.0f; +constexpr static float ITEM_SIZE = 40.0f; +constexpr static float ITEM_PADDING = 4.0f; +constexpr static float SELECTOR_PADDING = 2.0f; +constexpr static float HOTBAR_PADDING = 4.0f; -unsigned int gui::hotbar::active_slot = 0U; -std::array<const world::Item*, HOTBAR_SIZE> gui::hotbar::slots = {}; +unsigned int hotbar::active_slot = 0U; +std::array<const Item*, HOTBAR_SIZE> hotbar::slots = {}; static config::KeyBind hotbar_keys[HOTBAR_SIZE]; @@ -40,22 +40,22 @@ static ImU32 get_color_alpha(ImGuiCol style_color, float alpha) static void update_hotbar_item(void) { - auto current_item = gui::hotbar::slots[gui::hotbar::active_slot]; + auto current_item = hotbar::slots[hotbar::active_slot]; if(current_item == nullptr) { - gui::status_lines::unset(gui::STATUS_HOTBAR); + status_lines::unset(STATUS_HOTBAR); } else { - gui::status_lines::set(gui::STATUS_HOTBAR, current_item->get_name(), ImVec4(1.0f, 1.0f, 1.0f, 1.0f), 5.0f); + status_lines::set(STATUS_HOTBAR, current_item->get_name(), ImVec4(1.0f, 1.0f, 1.0f, 1.0f), 5.0f); } } -static void on_glfw_key(const io::GlfwKeyEvent& event) +static void on_glfw_key(const GlfwKeyEvent& event) { if((event.action == GLFW_PRESS) && !globals::gui_screen) { for(unsigned int i = 0U; i < HOTBAR_SIZE; ++i) { if(hotbar_keys[i].equals(event.key)) { - gui::hotbar::active_slot = i; + hotbar::active_slot = i; update_hotbar_item(); break; } @@ -63,22 +63,22 @@ static void on_glfw_key(const io::GlfwKeyEvent& event) } } -static void on_glfw_scroll(const io::GlfwScrollEvent& event) +static void on_glfw_scroll(const GlfwScrollEvent& event) { if(!globals::gui_screen) { if(event.dy < 0.0) { - gui::hotbar::next_slot(); + hotbar::next_slot(); return; } if(event.dy > 0.0) { - gui::hotbar::prev_slot(); + hotbar::prev_slot(); return; } } } -void gui::hotbar::init(void) +void hotbar::init(void) { hotbar_keys[0].set_key(GLFW_KEY_1); hotbar_keys[1].set_key(GLFW_KEY_2); @@ -113,17 +113,17 @@ void gui::hotbar::init(void) hotbar_background = resource::load<TextureGUI>("textures/gui/hud_hotbar.png", TEXTURE_GUI_LOAD_CLAMP_S | TEXTURE_GUI_LOAD_CLAMP_T); hotbar_selector = resource::load<TextureGUI>("textures/gui/hud_selector.png", TEXTURE_GUI_LOAD_CLAMP_S | TEXTURE_GUI_LOAD_CLAMP_T); - globals::dispatcher.sink<io::GlfwKeyEvent>().connect<&on_glfw_key>(); - globals::dispatcher.sink<io::GlfwScrollEvent>().connect<&on_glfw_scroll>(); + globals::dispatcher.sink<GlfwKeyEvent>().connect<&on_glfw_key>(); + globals::dispatcher.sink<GlfwScrollEvent>().connect<&on_glfw_scroll>(); } -void gui::hotbar::shutdown(void) +void hotbar::shutdown(void) { hotbar_background = nullptr; hotbar_selector = nullptr; } -void gui::hotbar::layout(void) +void hotbar::layout(void) { auto& style = ImGui::GetStyle(); @@ -142,7 +142,7 @@ void gui::hotbar::layout(void) // Draw the hotbar selector image auto selector_padding_a = SELECTOR_PADDING * globals::gui_scale; auto selector_padding_b = SELECTOR_PADDING * globals::gui_scale * 2.0f; - auto selector_start = ImVec2(background_start.x + gui::hotbar::active_slot * item_size - selector_padding_a, + auto selector_start = ImVec2(background_start.x + hotbar::active_slot * item_size - selector_padding_a, background_start.y - selector_padding_a); auto selector_end = ImVec2(selector_start.x + item_size + selector_padding_b, selector_start.y + item_size + selector_padding_b); draw_list->AddImage(hotbar_selector->handle, selector_start, selector_end); @@ -153,7 +153,7 @@ void gui::hotbar::layout(void) // Draw individual item textures in the hotbar for(std::size_t i = 0; i < HOTBAR_SIZE; ++i) { - auto item = gui::hotbar::slots[i]; + auto item = hotbar::slots[i]; if((item == nullptr) || (item->get_cached_texture() == nullptr)) { // There's either no item in the slot @@ -167,16 +167,16 @@ void gui::hotbar::layout(void) } } -void gui::hotbar::next_slot(void) +void hotbar::next_slot(void) { - gui::hotbar::active_slot += 1U; - gui::hotbar::active_slot %= HOTBAR_SIZE; + hotbar::active_slot += 1U; + hotbar::active_slot %= HOTBAR_SIZE; update_hotbar_item(); } -void gui::hotbar::prev_slot(void) +void hotbar::prev_slot(void) { - gui::hotbar::active_slot += HOTBAR_SIZE - 1U; - gui::hotbar::active_slot %= HOTBAR_SIZE; + hotbar::active_slot += HOTBAR_SIZE - 1U; + hotbar::active_slot %= HOTBAR_SIZE; update_hotbar_item(); } diff --git a/src/game/client/gui/hotbar.hh b/src/game/client/gui/hotbar.hh index c529230..bba5e63 100644 --- a/src/game/client/gui/hotbar.hh +++ b/src/game/client/gui/hotbar.hh @@ -3,28 +3,25 @@ // TODO: design an inventory system and an item // registry and integrate the hotbar into that system -namespace world -{ class Item; -} // namespace world constexpr static unsigned int HOTBAR_SIZE = 9U; -namespace gui::hotbar +namespace hotbar { extern unsigned int active_slot; -extern std::array<const world::Item*, HOTBAR_SIZE> slots; -} // namespace gui::hotbar +extern std::array<const Item*, HOTBAR_SIZE> slots; +} // namespace hotbar -namespace gui::hotbar +namespace hotbar { void init(void); void shutdown(void); void layout(void); -} // namespace gui::hotbar +} // namespace hotbar -namespace gui::hotbar +namespace hotbar { void next_slot(void); void prev_slot(void); -} // namespace gui::hotbar +} // namespace hotbar diff --git a/src/game/client/gui/imdraw_ext.cc b/src/game/client/gui/imdraw_ext.cc deleted file mode 100644 index 4b44d5f..0000000 --- a/src/game/client/gui/imdraw_ext.cc +++ /dev/null @@ -1,34 +0,0 @@ -#include "client/pch.hh" - -#include "client/gui/imdraw_ext.hh" - -#include "client/globals.hh" - -void gui::imdraw_ext::text_shadow(const std::string& text, const ImVec2& position, ImU32 text_color, ImU32 shadow_color, ImFont* font, - ImDrawList* draw_list) -{ - imdraw_ext::text_shadow(text, position, text_color, shadow_color, font, draw_list, font->LegacySize); -} - -void gui::imdraw_ext::text_shadow(const std::string& text, const ImVec2& position, ImU32 text_color, ImU32 shadow_color, ImFont* font, - ImDrawList* draw_list, float font_size) -{ - const auto shadow_position = ImVec2(position.x + 0.5f * globals::gui_scale, position.y + 0.5f * globals::gui_scale); - draw_list->AddText(font, globals::gui_scale * font_size, shadow_position, shadow_color, text.c_str(), text.c_str() + text.size()); - draw_list->AddText(font, globals::gui_scale * font_size, position, text_color, text.c_str(), text.c_str() + text.size()); -} - -void gui::imdraw_ext::text_shadow_w(const std::string& text, const ImVec2& position, ImU32 text_color, ImU32 shadow_color, ImFont* font, - ImDrawList* draw_list, float wrap_width) -{ - imdraw_ext::text_shadow_w(text, position, text_color, shadow_color, font, draw_list, font->LegacySize, wrap_width); -} - -void gui::imdraw_ext::text_shadow_w(const std::string& text, const ImVec2& position, ImU32 text_color, ImU32 shadow_color, ImFont* font, - ImDrawList* draw_list, float font_size, float wrap_width) -{ - const auto shadow_position = ImVec2(position.x + 0.5f * globals::gui_scale, position.y + 0.5f * globals::gui_scale); - draw_list->AddText(font, globals::gui_scale * font_size, shadow_position, shadow_color, text.c_str(), text.c_str() + text.size(), - wrap_width); - draw_list->AddText(font, globals::gui_scale * font_size, position, text_color, text.c_str(), text.c_str() + text.size(), wrap_width); -} diff --git a/src/game/client/gui/imdraw_ext.hh b/src/game/client/gui/imdraw_ext.hh deleted file mode 100644 index a7e1503..0000000 --- a/src/game/client/gui/imdraw_ext.hh +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -namespace gui::imdraw_ext -{ -void text_shadow(const std::string& text, const ImVec2& position, ImU32 text_color, ImU32 shadow_color, ImFont* font, - ImDrawList* draw_list); -void text_shadow(const std::string& text, const ImVec2& position, ImU32 text_color, ImU32 shadow_color, ImFont* font, ImDrawList* draw_list, - float font_size); -} // namespace gui::imdraw_ext - -namespace gui::imdraw_ext -{ -void text_shadow_w(const std::string& text, const ImVec2& position, ImU32 text_color, ImU32 shadow_color, ImFont* font, - ImDrawList* draw_list, float wrap_width); -void text_shadow_w(const std::string& text, const ImVec2& position, ImU32 text_color, ImU32 shadow_color, ImFont* font, - ImDrawList* draw_list, float font_size, float wrap_width); -} // namespace gui::imdraw_ext diff --git a/src/game/client/gui/imutils_button.cc b/src/game/client/gui/imutils_button.cc new file mode 100644 index 0000000..2017e33 --- /dev/null +++ b/src/game/client/gui/imutils_button.cc @@ -0,0 +1,95 @@ +#include "client/pch.hh" + +#include "client/gui/imutils_button.hh" + +void imutils::button(const char* title, const ImVec2& size, void (*callback)(void)) +{ + assert(title); + assert(callback); + + if(ImGui::Button(title, size)) { + callback(); + } +} + +void imutils::button(const char* title, void (*callback)(void)) +{ + assert(title); + assert(callback); + + if(ImGui::Button(title)) { + callback(); + } +} + +bool imutils::selectable_button(const char* label, const ImVec2& size, bool value) +{ + assert(label); + + auto value_changed = false; + + if(value) { + ImVec4 button_color(0.750f, 0.750f, 0.750f, 1.000f); + ImGui::PushStyleColor(ImGuiCol_Button, button_color); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, button_color); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, button_color); + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg)); + } + else { + ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg)); + } + + if(ImGui::Button(label, size)) { + value_changed = true; + } + + ImGui::PopStyleColor(value ? 4 : 1); + + return value_changed; +} + +bool imutils::toggle_button(const char* label, const ImVec2& size, bool& value) +{ + assert(label); + + auto use_custom_color = !value; + auto value_changed = false; + + if(use_custom_color) { + ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg)); + } + + if(ImGui::Button(label, size)) { + value_changed = true; + value = !value; + } + + if(use_custom_color) { + ImGui::PopStyleColor(); + } + + return value_changed; +} + +bool imutils::toggle_button(const char* label, bool& value) +{ + assert(label); + + auto use_custom_color = !value; + auto value_changed = false; + + if(use_custom_color) { + ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg)); + } + + if(ImGui::Button(label)) { + value_changed = true; + value = !value; + } + + if(use_custom_color) { + ImGui::PopStyleColor(); + } + + return value_changed; +} diff --git a/src/game/client/gui/imutils_button.hh b/src/game/client/gui/imutils_button.hh new file mode 100644 index 0000000..0c80694 --- /dev/null +++ b/src/game/client/gui/imutils_button.hh @@ -0,0 +1,14 @@ +#pragma once + +namespace imutils +{ +void button(const char* title, const ImVec2& size, void (*callback)(void)); +void button(const char* title, void (*callback)(void)); +} // namespace imutils + +namespace imutils +{ +bool selectable_button(const char* label, const ImVec2& size, bool value); +bool toggle_button(const char* label, const ImVec2& size, bool& value); +bool toggle_button(const char* label, bool& value); +} // namespace imutils diff --git a/src/game/client/gui/imutils_popup.cc b/src/game/client/gui/imutils_popup.cc new file mode 100644 index 0000000..f97facb --- /dev/null +++ b/src/game/client/gui/imutils_popup.cc @@ -0,0 +1,56 @@ +#include "client/pch.hh" + +#include "client/gui/imutils_popup.hh" + +#include "client/globals.hh" + +int imutils::popup(const std::string& title, const std::string& question, const std::string* choices, std::size_t num_choices, + float font_scale) +{ + assert(choices); + assert(num_choices); + + int result = POPUP_WAIT; + + ImGui::PushFont(globals::font_unscii16, globals::font_unscii16->LegacySize); + + if(ImGui::BeginPopupModal(title.c_str(), nullptr, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize)) { + const auto viewport = ImGui::GetMainViewport(); + const auto& viewport_size = viewport->Size; + + ImVec2 popup_size(ImGui::GetWindowSize()); + ImVec2 popup_pos(viewport_size.x * 0.5f - popup_size.x * 0.5f, viewport_size.y * 0.5f - popup_size.y * 0.5f); + + ImGui::PushTextWrapPos(popup_size.x); + ImGui::TextUnformatted(question.c_str()); + ImGui::PopTextWrapPos(); + + ImGui::NewLine(); + + auto& style = ImGui::GetStyle(); + auto& spacing = style.ItemSpacing; + ImVec2 button_size(0.5f * (ImGui::CalcItemWidth() - spacing.x), 0.0f); + + for(std::size_t i = 0; i < num_choices; ++i) { + if(ImGui::Button(choices[i].c_str(), button_size)) { + result = static_cast<int>(i); + ImGui::CloseCurrentPopup(); + } + + if((i + 1) % 2 == 1) { + ImGui::SameLine(); + } + else if(i + 1 < num_choices) { + ImGui::Dummy(ImVec2(0.0, spacing.y)); + } + } + + ImGui::SetWindowPos(popup_pos, ImGuiCond_Always); + + ImGui::EndPopup(); + } + + ImGui::PopFont(); + + return result; +} diff --git a/src/game/client/gui/imutils_popup.hh b/src/game/client/gui/imutils_popup.hh new file mode 100644 index 0000000..1678f87 --- /dev/null +++ b/src/game/client/gui/imutils_popup.hh @@ -0,0 +1,11 @@ +#pragma once + +/// Returned by popup::show whenever the popup is opened +/// but there is no user action yet, so the UI should wait +constexpr static int POPUP_WAIT = -1; + +namespace imutils +{ +int popup(const std::string& title, const std::string& question, const std::string* choices, std::size_t num_choices, + float font_scale = 1.75f); +} // namespace imutils diff --git a/src/game/client/gui/imutils_text.cc b/src/game/client/gui/imutils_text.cc new file mode 100644 index 0000000..1058c7f --- /dev/null +++ b/src/game/client/gui/imutils_text.cc @@ -0,0 +1,46 @@ +#include "client/pch.hh" + +#include "client/gui/imutils_text.hh" + +#include "client/globals.hh" + +void imutils::text_nw(ImDrawList* list, std::string_view text, const ImVec2& pos, ImU32 color, ImU32 shadow, ImFont* font) +{ + assert(list); + assert(font); + + imutils::text_nw(list, text, pos, color, shadow, font, font->LegacySize); +} + +void imutils::text_nw(ImDrawList* list, std::string_view text, const ImVec2& pos, ImU32 color, ImU32 shadow, ImFont* font, float size) +{ + assert(list); + assert(font); + + auto shift = static_cast<float>(globals::gui_scale); + auto shadow_pos = ImVec2(pos.x + shift, pos.y + shift); + + list->AddText(font, size, shadow_pos, shadow, text.data(), text.data() + text.size()); + list->AddText(font, size, pos, color, text.data(), text.data() + text.size()); +} + +void imutils::text_wr(ImDrawList* list, std::string_view text, const ImVec2& pos, ImU32 color, ImU32 shadow, ImFont* font, float wrap) +{ + assert(list); + assert(font); + + imutils::text_wr(list, text, pos, color, shadow, font, wrap, font->LegacySize); +} + +void imutils::text_wr(ImDrawList* list, std::string_view text, const ImVec2& pos, ImU32 color, ImU32 shadow, ImFont* font, float wrap, + float size) +{ + assert(list); + assert(font); + + auto shift = static_cast<float>(globals::gui_scale); + auto shadow_pos = ImVec2(pos.x + shift, pos.y + shift); + + list->AddText(font, size, shadow_pos, shadow, text.data(), text.data() + text.size(), wrap); + list->AddText(font, size, pos, color, text.data(), text.data() + text.size(), wrap); +} diff --git a/src/game/client/gui/imutils_text.hh b/src/game/client/gui/imutils_text.hh new file mode 100644 index 0000000..64d06a4 --- /dev/null +++ b/src/game/client/gui/imutils_text.hh @@ -0,0 +1,9 @@ +#pragma once + +namespace imutils +{ +void text_nw(ImDrawList* list, std::string_view text, const ImVec2& pos, ImU32 color, ImU32 shadow, ImFont* font); +void text_nw(ImDrawList* list, std::string_view text, const ImVec2& pos, ImU32 color, ImU32 shadow, ImFont* font, float size); +void text_wr(ImDrawList* list, std::string_view text, const ImVec2& pos, ImU32 color, ImU32 shadow, ImFont* font, float wrap); +void text_wr(ImDrawList* list, std::string_view text, const ImVec2& pos, ImU32 color, ImU32 shadow, ImFont* font, float wrap, float size); +} // namespace imutils diff --git a/src/game/client/gui/language.cc b/src/game/client/gui/language.cc index 0109ae6..8a2d8d1 100644 --- a/src/game/client/gui/language.cc +++ b/src/game/client/gui/language.cc @@ -19,20 +19,20 @@ constexpr static std::string_view DEFAULT_LANGUAGE = "en_US"; // system knows what language it can load and will act accordingly constexpr static std::string_view MANIFEST_PATH = "lang/manifest.json"; -static gui::LanguageManifest manifest; -static gui::LanguageIterator current_language; +static LanguageManifest manifest; +static LanguageIterator current_language; static std::unordered_map<std::string, std::string> language_map; -static std::unordered_map<std::string, gui::LanguageIterator> ietf_map; +static std::unordered_map<std::string, LanguageIterator> ietf_map; static config::String config_language(DEFAULT_LANGUAGE); -static void send_language_event(gui::LanguageIterator new_language) +static void send_language_event(LanguageIterator new_language) { - gui::LanguageSetEvent event; + LanguageSetEvent event; event.new_language = new_language; globals::dispatcher.trigger(event); } -void gui::language::init(void) +void language::init(void) { globals::client_config.add_value("language", config_language); @@ -41,7 +41,7 @@ void gui::language::init(void) auto file = PHYSFS_openRead(std::string(MANIFEST_PATH).c_str()); if(file == nullptr) { - spdlog::critical("language: {}: {}", MANIFEST_PATH, io::physfs_error()); + spdlog::critical("language: {}: {}", MANIFEST_PATH, physfs_error()); std::terminate(); } @@ -85,19 +85,19 @@ void gui::language::init(void) current_language = manifest.cend(); } -void gui::language::init_late(void) +void language::init_late(void) { auto user_language = ietf_map.find(config_language.get_value()); if(user_language != ietf_map.cend()) { - gui::language::set(user_language->second); + language::set(user_language->second); return; } auto fallback = ietf_map.find(std::string(DEFAULT_LANGUAGE)); if(fallback != ietf_map.cend()) { - gui::language::set(fallback->second); + language::set(fallback->second); return; } @@ -106,7 +106,7 @@ void gui::language::init_late(void) std::terminate(); } -void gui::language::set(LanguageIterator new_language) +void language::set(LanguageIterator new_language) { if(new_language != manifest.cend()) { auto path = std::format("lang/lang.{}.json", new_language->ietf); @@ -114,7 +114,7 @@ void gui::language::set(LanguageIterator new_language) auto file = PHYSFS_openRead(path.c_str()); if(file == nullptr) { - spdlog::warn("language: {}: {}", path, io::physfs_error()); + spdlog::warn("language: {}: {}", path, physfs_error()); send_language_event(new_language); return; } @@ -156,12 +156,12 @@ void gui::language::set(LanguageIterator new_language) send_language_event(new_language); } -gui::LanguageIterator gui::language::get_current(void) +LanguageIterator language::get_current(void) { return current_language; } -gui::LanguageIterator gui::language::find(std::string_view ietf) +LanguageIterator language::find(std::string_view ietf) { const auto it = ietf_map.find(std::string(ietf)); if(it != ietf_map.cend()) { @@ -172,17 +172,17 @@ gui::LanguageIterator gui::language::find(std::string_view ietf) } } -gui::LanguageIterator gui::language::cbegin(void) +LanguageIterator language::cbegin(void) { return manifest.cbegin(); } -gui::LanguageIterator gui::language::cend(void) +LanguageIterator language::cend(void) { return manifest.cend(); } -std::string_view gui::language::resolve(std::string_view key) +std::string_view language::resolve(std::string_view key) { const auto it = language_map.find(std::string(key)); @@ -193,10 +193,10 @@ std::string_view gui::language::resolve(std::string_view key) return key; } -std::string gui::language::resolve_gui(std::string_view key) +std::string language::resolve_gui(std::string_view key) { // We need window tags to retain their hierarchy when a language // dynamically changes; ImGui allows to provide hidden unique identifiers // to GUI primitives that have their name change dynamically, so we're using this - return std::format("{}###{}", gui::language::resolve(key), key); + return std::format("{}###{}", language::resolve(key), key); } diff --git a/src/game/client/gui/language.hh b/src/game/client/gui/language.hh index 90132d7..20c7520 100644 --- a/src/game/client/gui/language.hh +++ b/src/game/client/gui/language.hh @@ -1,7 +1,5 @@ #pragma once -namespace gui -{ struct LanguageInfo final { std::string endonym; // Language's self-name std::string display; // Display for the settings GUI @@ -14,29 +12,28 @@ using LanguageIterator = LanguageManifest::const_iterator; struct LanguageSetEvent final { LanguageIterator new_language; }; -} // namespace gui -namespace gui::language +namespace language { void init(void); void init_late(void); -} // namespace gui::language +} // namespace language -namespace gui::language +namespace language { void set(LanguageIterator new_language); -} // namespace gui::language +} // namespace language -namespace gui::language +namespace language { LanguageIterator get_current(void); LanguageIterator find(std::string_view ietf); LanguageIterator cbegin(void); LanguageIterator cend(void); -} // namespace gui::language +} // namespace language -namespace gui::language +namespace language { std::string_view resolve(std::string_view key); std::string resolve_gui(std::string_view key); -} // namespace gui::language +} // namespace language diff --git a/src/game/client/gui/main_menu.cc b/src/game/client/gui/main_menu.cc index d60a507..d764449 100644 --- a/src/game/client/gui/main_menu.cc +++ b/src/game/client/gui/main_menu.cc @@ -9,6 +9,8 @@ #include "core/version.hh" #include "client/gui/gui_screen.hh" +#include "client/gui/imutils_button.hh" +#include "client/gui/imutils_popup.hh" #include "client/gui/language.hh" #include "client/gui/window_title.hh" @@ -19,18 +21,17 @@ #include "client/globals.hh" #include "client/session.hh" -constexpr static ImGuiWindowFlags WINDOW_FLAGS = ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoDecoration; +static std::string str_button_play; +static std::string str_button_resume; +static std::string str_button_settings; +static std::string str_button_disconnect; +static std::string str_button_quit; -static std::string str_play; -static std::string str_resume; -static std::string str_settings; -static std::string str_leave; -static std::string str_quit; +static std::string str_quit_popup_title; +static std::string str_quit_popup_question; +static std::string str_quit_popup_choices[2]; -static resource_ptr<TextureGUI> title; -static float title_aspect; - -static void on_glfw_key(const io::GlfwKeyEvent& event) +static void on_glfw_key(const GlfwKeyEvent& event) { if(session::is_ingame() && (event.key == GLFW_KEY_ESCAPE) && (event.action == GLFW_PRESS)) { if(globals::gui_screen == GUI_SCREEN_NONE) { @@ -45,127 +46,106 @@ static void on_glfw_key(const io::GlfwKeyEvent& event) } } -static void on_language_set(const gui::LanguageSetEvent& event) +static void on_language_set(const LanguageSetEvent& event) { - str_play = gui::language::resolve_gui("main_menu.play"); - str_resume = gui::language::resolve_gui("main_menu.resume"); - str_settings = gui::language::resolve("main_menu.settings"); - str_leave = gui::language::resolve("main_menu.leave"); - str_quit = gui::language::resolve("main_menu.quit"); + str_button_play = language::resolve_gui("main_menu.button.play"); + str_button_resume = language::resolve_gui("main_menu.button.resume"); + str_button_settings = language::resolve("main_menu.button.settings"); + str_button_disconnect = language::resolve("main_menu.button.disconnect"); + str_button_quit = language::resolve("main_menu.button.quit"); + + str_quit_popup_title = language::resolve_gui("main_menu.quit_popup.title"); + str_quit_popup_question = language::resolve("main_menu.quit_popup.question"); + str_quit_popup_choices[0] = language::resolve_gui("main_menu.quit_popup.choice.yes"); + str_quit_popup_choices[1] = language::resolve_gui("main_menu.quit_popup.choice.no"); } -void gui::main_menu::init(void) +void main_menu::init(void) { - title = resource::load<TextureGUI>("textures/gui/menu_title.png", TEXTURE_GUI_LOAD_CLAMP_S | TEXTURE_GUI_LOAD_CLAMP_T); - - if(title == nullptr) { - spdlog::critical("main_menu: texture load failed"); - std::terminate(); - } - - if(title->size.x > title->size.y) { - title_aspect = static_cast<float>(title->size.x) / static_cast<float>(title->size.y); - } - else { - title_aspect = static_cast<float>(title->size.y) / static_cast<float>(title->size.x); - } - - globals::dispatcher.sink<io::GlfwKeyEvent>().connect<&on_glfw_key>(); + globals::dispatcher.sink<GlfwKeyEvent>().connect<&on_glfw_key>(); globals::dispatcher.sink<LanguageSetEvent>().connect<&on_language_set>(); } -void gui::main_menu::shutdown(void) +void main_menu::shutdown(void) { - title = nullptr; + // empty } -void gui::main_menu::layout(void) +void main_menu::layout(void) { const auto viewport = ImGui::GetMainViewport(); - const auto window_start = ImVec2(0.0f, viewport->Size.y * 0.15f); - const auto window_size = ImVec2(viewport->Size.x, viewport->Size.y); + const auto& viewport_size = viewport->Size; - ImGui::SetNextWindowPos(window_start); - ImGui::SetNextWindowSize(window_size); + ImVec2 margin(globals::gui_scale * 8.0f, globals::gui_scale * 8.0f); + ImVec2 control(globals::gui_scale * 256.0f, globals::gui_scale * 32.0f); - if(ImGui::Begin("###main_menu", nullptr, WINDOW_FLAGS)) { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 2.0f * globals::gui_scale)); + ImGui::SetNextWindowPos({}); + ImGui::SetNextWindowSize(viewport_size); - if(session::is_ingame()) { - ImGui::Dummy(ImVec2(0.0f, 32.0f * globals::gui_scale)); - } - else { - auto reference_height = 0.225f * window_size.y; - auto image_width = glm::min(window_size.x, reference_height * title_aspect); - auto image_height = image_width / title_aspect; - ImGui::SetCursorPosX(0.5f * (window_size.x - image_width)); - ImGui::Image(title->handle, ImVec2(image_width, image_height)); - } - - ImGui::Dummy(ImVec2(0.0f, 24.0f * globals::gui_scale)); - - const float button_width = 240.0f * globals::gui_scale; - const float button_xpos = 0.5f * (window_size.x - button_width); - - if(session::is_ingame()) { - ImGui::SetCursorPosX(button_xpos); - - if(ImGui::Button(str_resume.c_str(), ImVec2(button_width, 0.0f))) { - globals::gui_screen = GUI_SCREEN_NONE; - } - - ImGui::Spacing(); - } - else { - ImGui::SetCursorPosX(button_xpos); + ImGuiWindowFlags flags = 0U; + flags |= ImGuiWindowFlags_NoBackground; + flags |= ImGuiWindowFlags_NoDecoration; - if(ImGui::Button(str_play.c_str(), ImVec2(button_width, 0.0f))) { - globals::gui_screen = GUI_PLAY_MENU; - } - - ImGui::Spacing(); - } + if(!ImGui::Begin("###gui::main_menu", nullptr, flags)) { + ImGui::End(); + return; + } - ImGui::SetCursorPosX(button_xpos); + ImGui::PushFont(globals::font_unscii16, 16.0f); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.000f, 0.000f, 0.000f, 0.000f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.500f, 0.500f, 0.500f, 0.125f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.500f, 0.500f, 0.500f, 0.500f)); + ImGui::PushStyleVarX(ImGuiStyleVar_FramePadding, 16.0f * globals::gui_scale); + ImGui::PushStyleVarX(ImGuiStyleVar_ButtonTextAlign, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); - if(ImGui::Button(str_settings.c_str(), ImVec2(button_width, 0.0f))) { - globals::gui_screen = GUI_SETTINGS; - } + ImVec2 cursor_pos(margin.x, viewport_size.y - margin.y); - ImGui::Spacing(); + cursor_pos.y -= control.y * 1.5f; + ImGui::SetCursorPos(cursor_pos); - if(session::is_ingame()) { - ImGui::SetCursorPosX(button_xpos); + if(session::is_ingame()) { + imutils::button(str_button_disconnect.c_str(), control, [] { + session::disconnect("protocol.client_disconnect"); + }); + } + else { + imutils::button(str_button_quit.c_str(), control, [] { + ImGui::OpenPopup(str_quit_popup_title.c_str()); + }); + } - if(ImGui::Button(str_leave.c_str(), ImVec2(button_width, 0.0f))) { - session::disconnect("protocol.client_disconnect"); - globals::gui_screen = GUI_PLAY_MENU; - gui::window_title::update(); - } + cursor_pos.y -= control.y; + ImGui::SetCursorPos(cursor_pos); - ImGui::Spacing(); - } - else { - ImGui::SetCursorPosX(button_xpos); + imutils::button(str_button_settings.c_str(), control, [] { + globals::gui_screen = GUI_SETTINGS; + }); - if(ImGui::Button(str_quit.c_str(), ImVec2(button_width, 0.0f))) { - glfwSetWindowShouldClose(globals::window, true); - } + cursor_pos.y -= control.y * 1.5f; + ImGui::SetCursorPos(cursor_pos); - ImGui::Spacing(); - } - - if(!session::is_ingame()) { - const auto& padding = ImGui::GetStyle().FramePadding; - const auto& spacing = ImGui::GetStyle().ItemSpacing; + if(session::is_ingame()) { + imutils::button(str_button_resume.c_str(), control, [] { + globals::gui_screen = GUI_SCREEN_NONE; + }); + } + else { + imutils::button(str_button_play.c_str(), control, [] { + globals::gui_screen = GUI_PLAY_MENU; + }); + } - ImGui::PushFont(globals::font_unscii8, 4.0f); - ImGui::SetCursorScreenPos(ImVec2(padding.x + spacing.x, window_size.y - ImGui::GetFontSize() - padding.y - spacing.y)); - ImGui::Text("Voxelius %*s", version::full.size(), version::full.data()); // string_view is not always null-terminated - ImGui::PopFont(); - } + ImGui::PopStyleVar(3); + ImGui::PopStyleColor(3); + ImGui::PopFont(); - ImGui::PopStyleVar(); + if(0 == imutils::popup(str_quit_popup_title, str_quit_popup_question, str_quit_popup_choices, 2)) { + // We don't really have a good way to + // pass "i want to quit" boolean to the main loop, + // so instead we just raise an external interrupt signal + // which handler latches an internal flag in the main loop + std::raise(SIGINT); } ImGui::End(); diff --git a/src/game/client/gui/main_menu.hh b/src/game/client/gui/main_menu.hh index 205f078..b5333d4 100644 --- a/src/game/client/gui/main_menu.hh +++ b/src/game/client/gui/main_menu.hh @@ -1,8 +1,8 @@ #pragma once -namespace gui::main_menu +namespace main_menu { void init(void); void shutdown(void); void layout(void); -} // namespace gui::main_menu +} // namespace main_menu diff --git a/src/game/client/gui/message_box.cc b/src/game/client/gui/message_box.cc index 59e2d33..d97267a 100644 --- a/src/game/client/gui/message_box.cc +++ b/src/game/client/gui/message_box.cc @@ -10,7 +10,7 @@ constexpr static ImGuiWindowFlags WINDOW_FLAGS = ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoDecoration; struct Button final { - gui::message_box_action action; + message_box_action action; std::string str_title; }; @@ -18,14 +18,14 @@ static std::string str_title; static std::string str_subtitle; static std::vector<Button> buttons; -void gui::message_box::init(void) +void message_box::init(void) { str_title = std::string(); str_subtitle = std::string(); buttons.clear(); } -void gui::message_box::layout(void) +void message_box::layout(void) { const auto viewport = ImGui::GetMainViewport(); const auto window_start = ImVec2(0.0f, viewport->Size.y * 0.30f); @@ -68,27 +68,27 @@ void gui::message_box::layout(void) ImGui::End(); } -void gui::message_box::reset(void) +void message_box::reset(void) { str_title.clear(); str_subtitle.clear(); buttons.clear(); } -void gui::message_box::set_title(std::string_view title) +void message_box::set_title(std::string_view title) { - str_title = gui::language::resolve(title); + str_title = language::resolve(title); } -void gui::message_box::set_subtitle(std::string_view subtitle) +void message_box::set_subtitle(std::string_view subtitle) { - str_subtitle = gui::language::resolve(subtitle); + str_subtitle = language::resolve(subtitle); } -void gui::message_box::add_button(std::string_view text, const message_box_action& action) +void message_box::add_button(std::string_view text, const message_box_action& action) { Button button = {}; - button.str_title = std::format("{}###MessageBox_Button{}", gui::language::resolve(text), buttons.size()); + button.str_title = std::format("{}###MessageBox_Button{}", language::resolve(text), buttons.size()); button.action = action; buttons.push_back(button); diff --git a/src/game/client/gui/message_box.hh b/src/game/client/gui/message_box.hh index 74a6fbf..9da5358 100644 --- a/src/game/client/gui/message_box.hh +++ b/src/game/client/gui/message_box.hh @@ -1,20 +1,17 @@ #pragma once -namespace gui -{ using message_box_action = void (*)(void); -} // namespace gui -namespace gui::message_box +namespace message_box { void init(void); void layout(void); void reset(void); -} // namespace gui::message_box +} // namespace message_box -namespace gui::message_box +namespace message_box { void set_title(std::string_view title); void set_subtitle(std::string_view subtitle); void add_button(std::string_view text, const message_box_action& action); -} // namespace gui::message_box +} // namespace message_box diff --git a/src/game/client/gui/metrics.cc b/src/game/client/gui/metrics.cc index bf46649..51b1ffa 100644 --- a/src/game/client/gui/metrics.cc +++ b/src/game/client/gui/metrics.cc @@ -15,7 +15,7 @@ #include "client/entity/camera.hh" -#include "client/gui/imdraw_ext.hh" +#include "client/gui/imutils_text.hh" #include "client/game.hh" #include "client/globals.hh" @@ -27,13 +27,13 @@ constexpr static ImGuiWindowFlags WINDOW_FLAGS = ImGuiWindowFlags_NoBackground | static std::basic_string<GLubyte> r_version; static std::basic_string<GLubyte> r_renderer; -void gui::metrics::init(void) +void metrics::init(void) { r_version = std::basic_string<GLubyte>(glGetString(GL_VERSION)); r_renderer = std::basic_string<GLubyte>(glGetString(GL_RENDERER)); } -void gui::metrics::layout(void) +void metrics::layout(void) { if(!session::is_ingame()) { // Sanity check; we are checking this @@ -54,50 +54,50 @@ void gui::metrics::layout(void) // Draw version auto version_line = std::format("Voxelius {}", version::full); - gui::imdraw_ext::text_shadow(version_line, position, text_color, shadow_color, globals::font_unscii8, draw_list, font_size); + imutils::text_nw(draw_list, version_line, position, text_color, shadow_color, globals::font_unscii8, font_size); position.y += 1.5f * y_step; // Draw client-side window framerate metrics auto window_framerate = 1.0f / globals::window_frametime_avg; auto window_frametime = 1000.0f * globals::window_frametime_avg; auto window_fps_line = std::format("{:.02f} FPS [{:.02f} ms]", window_framerate, window_frametime); - gui::imdraw_ext::text_shadow(window_fps_line, position, text_color, shadow_color, globals::font_unscii8, draw_list, font_size); + imutils::text_nw(draw_list, window_fps_line, position, text_color, shadow_color, globals::font_unscii8, font_size); position.y += y_step; // Draw world rendering metrics auto drawcall_line = std::format("World: {} DC / {} TRI", globals::num_drawcalls, globals::num_triangles); - gui::imdraw_ext::text_shadow(drawcall_line, position, text_color, shadow_color, globals::font_unscii8, draw_list, font_size); + imutils::text_nw(draw_list, drawcall_line, position, text_color, shadow_color, globals::font_unscii8, font_size); position.y += y_step; // Draw OpenGL version string auto r_version_line = std::format("GL_VERSION: {}", reinterpret_cast<const char*>(r_version.c_str())); - gui::imdraw_ext::text_shadow(r_version_line, position, text_color, shadow_color, globals::font_unscii8, draw_list, font_size); + imutils::text_nw(draw_list, r_version_line, position, text_color, shadow_color, globals::font_unscii8, font_size); position.y += y_step; // Draw OpenGL renderer string auto r_renderer_line = std::format("GL_RENDERER: {}", reinterpret_cast<const char*>(r_renderer.c_str())); - gui::imdraw_ext::text_shadow(r_renderer_line, position, text_color, shadow_color, globals::font_unscii8, draw_list, font_size); + imutils::text_nw(draw_list, r_renderer_line, position, text_color, shadow_color, globals::font_unscii8, font_size); position.y += 1.5f * y_step; - const auto& head = globals::dimension->entities.get<entity::Head>(globals::player); - const auto& transform = globals::dimension->entities.get<entity::Transform>(globals::player); - const auto& velocity = globals::dimension->entities.get<entity::Velocity>(globals::player); + const auto& head = globals::dimension->entities.get<Head>(globals::player); + const auto& transform = globals::dimension->entities.get<Transform>(globals::player); + const auto& velocity = globals::dimension->entities.get<Velocity>(globals::player); // Draw player voxel position auto voxel_position = coord::to_voxel(transform.chunk, transform.local); auto voxel_line = std::format("voxel: [{} {} {}]", voxel_position.x, voxel_position.y, voxel_position.z); - gui::imdraw_ext::text_shadow(voxel_line, position, text_color, shadow_color, globals::font_unscii8, draw_list, font_size); + imutils::text_nw(draw_list, voxel_line, position, text_color, shadow_color, globals::font_unscii8, font_size); position.y += y_step; // Draw player world position auto world_line = std::format("world: [{} {} {}] [{:.03f} {:.03f} {:.03f}]", transform.chunk.x, transform.chunk.y, transform.chunk.z, transform.local.x, transform.local.y, transform.local.z); - gui::imdraw_ext::text_shadow(world_line, position, text_color, shadow_color, globals::font_unscii8, draw_list, font_size); + imutils::text_nw(draw_list, world_line, position, text_color, shadow_color, globals::font_unscii8, font_size); position.y += y_step; // Draw player look angles auto angles = glm::degrees(transform.angles + head.angles); auto angle_line = std::format("angle: [{: .03f} {: .03f} {: .03f}]", angles[0], angles[1], angles[2]); - gui::imdraw_ext::text_shadow(angle_line, position, text_color, shadow_color, globals::font_unscii8, draw_list, font_size); + imutils::text_nw(draw_list, angle_line, position, text_color, shadow_color, globals::font_unscii8, font_size); position.y += y_step; } diff --git a/src/game/client/gui/metrics.hh b/src/game/client/gui/metrics.hh index 4898332..ab09c34 100644 --- a/src/game/client/gui/metrics.hh +++ b/src/game/client/gui/metrics.hh @@ -1,7 +1,7 @@ #pragma once -namespace gui::metrics +namespace metrics { void init(void); void layout(void); -} // namespace gui::metrics +} // namespace metrics diff --git a/src/game/client/gui/play_menu.cc b/src/game/client/gui/play_menu.cc index 5b1ecde..ec263a7 100644 --- a/src/game/client/gui/play_menu.cc +++ b/src/game/client/gui/play_menu.cc @@ -146,7 +146,7 @@ static void edit_selected_server(void) static void remove_selected_server(void) { - gui::bother::cancel(selected_server->identity); + bother::cancel(selected_server->identity); for(auto it = servers_deque.cbegin(); it != servers_deque.cend(); ++it) { if(selected_server == (*it)) { @@ -165,7 +165,7 @@ static void join_selected_server(void) } } -static void on_glfw_key(const io::GlfwKeyEvent& event) +static void on_glfw_key(const GlfwKeyEvent& event) { if((event.key == GLFW_KEY_ESCAPE) && (event.action == GLFW_PRESS)) { if(globals::gui_screen == GUI_PLAY_MENU) { @@ -173,14 +173,13 @@ static void on_glfw_key(const io::GlfwKeyEvent& event) if(adding_server) { remove_selected_server(); } - else { - input_itemname.clear(); - input_hostname.clear(); - input_password.clear(); - editing_server = false; - adding_server = false; - return; - } + + input_itemname.clear(); + input_hostname.clear(); + input_password.clear(); + editing_server = false; + adding_server = false; + return; } globals::gui_screen = GUI_MAIN_MENU; @@ -190,23 +189,23 @@ static void on_glfw_key(const io::GlfwKeyEvent& event) } } -static void on_language_set(const gui::LanguageSetEvent& event) +static void on_language_set(const LanguageSetEvent& event) { - str_tab_servers = gui::language::resolve_gui("play_menu.tab.servers"); - - str_join = gui::language::resolve_gui("play_menu.join"); - str_connect = gui::language::resolve_gui("play_menu.connect"); - str_add = gui::language::resolve_gui("play_menu.add"); - str_edit = gui::language::resolve_gui("play_menu.edit"); - str_remove = gui::language::resolve_gui("play_menu.remove"); - str_refresh = gui::language::resolve_gui("play_menu.refresh"); - - str_status_init = gui::language::resolve("play_menu.status.init"); - str_status_ping = gui::language::resolve("play_menu.status.ping"); - str_status_fail = gui::language::resolve("play_menu.status.fail"); + str_tab_servers = language::resolve_gui("play_menu.tab.servers"); + + str_join = language::resolve_gui("play_menu.join"); + str_connect = language::resolve_gui("play_menu.connect"); + str_add = language::resolve_gui("play_menu.add"); + str_edit = language::resolve_gui("play_menu.edit"); + str_remove = language::resolve_gui("play_menu.remove"); + str_refresh = language::resolve_gui("play_menu.refresh"); + + str_status_init = language::resolve("play_menu.status.init"); + str_status_ping = language::resolve("play_menu.status.ping"); + str_status_fail = language::resolve("play_menu.status.fail"); } -static void on_bother_response(const gui::BotherResponseEvent& event) +static void on_bother_response(const BotherResponseEvent& event) { for(auto item : servers_deque) { if(item->identity == event.identity) { @@ -284,7 +283,7 @@ static void layout_server_item(ServerStatusItem* item) version_color = ImGui::GetColorU32(ImGuiCol_PlotHistogram); } - ImGui::PushFont(globals::font_unscii8, 4.0f); + ImGui::PushFont(globals::font_unscii8, 8.0f); std::string version_toast; @@ -366,7 +365,7 @@ static void layout_server_edit(ServerStatusItem* item) input_itemname.clear(); input_hostname.clear(); - gui::bother::cancel(item->identity); + bother::cancel(item->identity); } ImGui::EndDisabled(); @@ -461,14 +460,14 @@ static void layout_servers_buttons(void) if(item->status != item_status::PINGING) { if(!editing_server || item != selected_server) { item->status = item_status::UNKNOWN; - gui::bother::cancel(item->identity); + bother::cancel(item->identity); } } } } } -void gui::play_menu::init(void) +void play_menu::init(void) { if(auto file = PHYSFS_openRead(std::string(SERVERS_TXT).c_str())) { auto source = std::string(PHYSFS_fileLength(file), char(0x00)); @@ -513,12 +512,12 @@ void gui::play_menu::init(void) } } - globals::dispatcher.sink<io::GlfwKeyEvent>().connect<&on_glfw_key>(); + globals::dispatcher.sink<GlfwKeyEvent>().connect<&on_glfw_key>(); globals::dispatcher.sink<LanguageSetEvent>().connect<&on_language_set>(); globals::dispatcher.sink<BotherResponseEvent>().connect<&on_bother_response>(); } -void gui::play_menu::shutdown(void) +void play_menu::shutdown(void) { std::ostringstream stream; @@ -537,7 +536,7 @@ void gui::play_menu::shutdown(void) servers_deque.clear(); } -void gui::play_menu::layout(void) +void play_menu::layout(void) { const auto viewport = ImGui::GetMainViewport(); const auto window_start = ImVec2(viewport->Size.x * 0.05f, viewport->Size.y * 0.05f); @@ -582,11 +581,11 @@ void gui::play_menu::layout(void) ImGui::End(); } -void gui::play_menu::update_late(void) +void play_menu::update_late(void) { for(auto item : servers_deque) { if(item->status == item_status::UNKNOWN) { - gui::bother::ping(item->identity, item->hostname.c_str(), item->port); + bother::ping(item->identity, item->hostname.c_str(), item->port); item->status = item_status::PINGING; continue; } diff --git a/src/game/client/gui/play_menu.hh b/src/game/client/gui/play_menu.hh index 1b1f003..5069592 100644 --- a/src/game/client/gui/play_menu.hh +++ b/src/game/client/gui/play_menu.hh @@ -1,9 +1,9 @@ #pragma once -namespace gui::play_menu +namespace play_menu { void init(void); void shutdown(void); void layout(void); void update_late(void); -} // namespace gui::play_menu +} // namespace play_menu diff --git a/src/game/client/gui/progress_bar.cc b/src/game/client/gui/progress_bar.cc index 1732f72..6cc7fae 100644 --- a/src/game/client/gui/progress_bar.cc +++ b/src/game/client/gui/progress_bar.cc @@ -12,16 +12,16 @@ constexpr static ImGuiWindowFlags WINDOW_FLAGS = ImGuiWindowFlags_NoBackground | static std::string str_title; static std::string str_button; -static gui::progress_bar_action button_action; +static progress_bar_action button_action; -void gui::progress_bar::init(void) +void progress_bar::init(void) { str_title = "Loading"; str_button = std::string(); button_action = nullptr; } -void gui::progress_bar::layout(void) +void progress_bar::layout(void) { const auto viewport = ImGui::GetMainViewport(); const auto window_start = ImVec2(0.0f, viewport->Size.y * 0.30f); @@ -92,20 +92,20 @@ void gui::progress_bar::layout(void) ImGui::End(); } -void gui::progress_bar::reset(void) +void progress_bar::reset(void) { str_title.clear(); str_button.clear(); button_action = nullptr; } -void gui::progress_bar::set_title(std::string_view title) +void progress_bar::set_title(std::string_view title) { - str_title = gui::language::resolve(title); + str_title = language::resolve(title); } -void gui::progress_bar::set_button(std::string_view text, const progress_bar_action& action) +void progress_bar::set_button(std::string_view text, const progress_bar_action& action) { - str_button = std::format("{}###ProgressBar_Button", gui::language::resolve(text)); + str_button = std::format("{}###ProgressBar_Button", language::resolve(text)); button_action = action; } diff --git a/src/game/client/gui/progress_bar.hh b/src/game/client/gui/progress_bar.hh index 7a0581d..931cad0 100644 --- a/src/game/client/gui/progress_bar.hh +++ b/src/game/client/gui/progress_bar.hh @@ -1,19 +1,16 @@ #pragma once -namespace gui -{ using progress_bar_action = void (*)(void); -} // namespace gui -namespace gui::progress_bar +namespace progress_bar { void init(void); void layout(void); -} // namespace gui::progress_bar +} // namespace progress_bar -namespace gui::progress_bar +namespace progress_bar { void reset(void); void set_title(std::string_view title); void set_button(std::string_view text, const progress_bar_action& action); -} // namespace gui::progress_bar +} // namespace progress_bar diff --git a/src/game/client/gui/scoreboard.cc b/src/game/client/gui/scoreboard.cc index 4f14de8..efd2d6d 100644 --- a/src/game/client/gui/scoreboard.cc +++ b/src/game/client/gui/scoreboard.cc @@ -28,7 +28,7 @@ static void on_scoreboard_update_packet(const protocol::ScoreboardUpdate& packet max_username_size = 0.0f; } -void gui::scoreboard::init(void) +void scoreboard::init(void) { globals::client_config.add_value("scoreboard.key", list_key); @@ -37,7 +37,7 @@ void gui::scoreboard::init(void) globals::dispatcher.sink<protocol::ScoreboardUpdate>().connect<&on_scoreboard_update_packet>(); } -void gui::scoreboard::layout(void) +void scoreboard::layout(void) { if(globals::gui_screen == GUI_SCREEN_NONE && session::is_ingame() && glfwGetKey(globals::window, list_key.get_key()) == GLFW_PRESS) { const auto viewport = ImGui::GetMainViewport(); diff --git a/src/game/client/gui/scoreboard.hh b/src/game/client/gui/scoreboard.hh index 320e185..86f8088 100644 --- a/src/game/client/gui/scoreboard.hh +++ b/src/game/client/gui/scoreboard.hh @@ -1,7 +1,7 @@ #pragma once -namespace gui::scoreboard +namespace scoreboard { void init(void); void layout(void); -} // namespace gui::scoreboard +} // namespace scoreboard diff --git a/src/game/client/gui/settings.cc b/src/game/client/gui/settings.cc index 70852b2..b456909 100644 --- a/src/game/client/gui/settings.cc +++ b/src/game/client/gui/settings.cc @@ -15,6 +15,7 @@ #include "client/config/keybind.hh" #include "client/gui/gui_screen.hh" +#include "client/gui/imutils_button.hh" #include "client/gui/language.hh" #include "client/io/gamepad.hh" @@ -25,22 +26,33 @@ constexpr static ImGuiWindowFlags WINDOW_FLAGS = ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoDecoration; constexpr static unsigned int NUM_LOCATIONS = static_cast<unsigned int>(settings_location::COUNT); +constexpr static const char* TOOLTIP_TEXT = "[?]"; + +enum class setting_type { + CHECKBOX, ///< config::Boolean + INPUT_INT, ///< config::Number<int> + INPUT_FLOAT, ///< config::Number<float> + INPUT_UINT, ///< config::Number<unsigned int> + INPUT_STRING, ///< config::String + SLIDER_INT, ///< config::Number<int> + SLIDER_FLOAT, ///< config::Number<float> + SLIDER_UINT, ///< config::Number<unsigned int> + STEPPER_INT, ///< config::Number<int> + STEPPER_UINT, ///< config::Number<unsigned int> + KEYBIND, ///< config::KeyBind + GAMEPAD_AXIS, ///< config::GamepadAxis + GAMEPAD_BUTTON, ///< config::GamepadButton + LANGUAGE_SELECT, ///< config::String internally +}; -enum class setting_type : unsigned int { - CHECKBOX = 0x0000U, ///< config::Boolean - INPUT_INT = 0x0001U, ///< config::Number<int> - INPUT_FLOAT = 0x0002U, ///< config::Number<float> - INPUT_UINT = 0x0003U, ///< config::Number<unsigned int> - INPUT_STRING = 0x0004U, ///< config::String - SLIDER_INT = 0x0005U, ///< config::Number<int> - SLIDER_FLOAT = 0x0006U, ///< config::Number<float> - SLIDER_UINT = 0x0007U, ///< config::Number<unsigned int> - STEPPER_INT = 0x0008U, ///< config::Number<int> - STEPPER_UINT = 0x0009U, ///< config::Number<unsigned int> - KEYBIND = 0x000AU, ///< config::KeyBind - GAMEPAD_AXIS = 0x000BU, ///< config::GamepadAxis - GAMEPAD_BUTTON = 0x000CU, ///< config::GamepadButton - LANGUAGE_SELECT = 0x000DU, ///< config::String internally +enum class gui_location { + GENERAL, + BINDINGS, + AUDIO, + VIDEO, + KEYBOARD, + MOUSE, + GAMEPAD, }; class SettingValue { @@ -206,42 +218,41 @@ public: virtual void layout(void) const override; }; -static std::string str_checkbox_false; -static std::string str_checkbox_true; +static std::string str_label_movement; +static std::string str_label_gameplay; +static std::string str_label_miscellaneous; +static std::string str_label_gui; +static std::string str_label_levels; -static std::string str_tab_general; -static std::string str_tab_input; -static std::string str_tab_video; -static std::string str_tab_sound; +static std::string str_location_general; +static std::string str_location_video; +static std::string str_location_audio; +static std::string str_location_keyboard; +static std::string str_location_mouse; +static std::string str_location_gamepad; -static std::string str_input_keyboard; -static std::string str_input_gamepad; -static std::string str_input_mouse; +static std::string str_separator_settings; +static std::string str_separator_devices; -static std::string str_keyboard_movement; -static std::string str_keyboard_gameplay; -static std::string str_keyboard_misc; +static std::string str_checkbox_false; +static std::string str_checkbox_true; -static std::string str_gamepad_movement; -static std::string str_gamepad_gameplay; -static std::string str_gamepad_misc; +static std::vector<std::shared_ptr<SettingValue>> values_all; +static std::vector<std::shared_ptr<SettingValue>> values[NUM_LOCATIONS]; static std::string str_gamepad_axis_prefix; static std::string str_gamepad_button_prefix; static std::string str_gamepad_checkbox_tooltip; -static std::string str_video_gui; - -static std::string str_sound_levels; - -static std::vector<SettingValue*> values_all; -static std::vector<SettingValue*> values[NUM_LOCATIONS]; +static gui_location selected_location; void SettingValue::layout_tooltip(void) const { if(has_tooltip) { - ImGui::SameLine(); - ImGui::TextDisabled("[?]"); + ImVec2 tooltip_size(ImGui::CalcTextSize(TOOLTIP_TEXT)); + + ImGui::SameLine(ImGui::GetWindowWidth() - tooltip_size.x - ImGui::GetStyle().WindowPadding.x); + ImGui::TextDisabled(TOOLTIP_TEXT); if(ImGui::BeginItemTooltip()) { ImGui::PushTextWrapPos(ImGui::GetFontSize() * 16.0f); @@ -397,7 +408,7 @@ void SettingValue_StepperInt::refresh_wids(void) { for(std::size_t i = 0; i < wids.size(); ++i) { auto key = std::format("settings.value.{}.{}", name, i); - wids[i] = std::format("{}###{}", gui::language::resolve(key.c_str()), static_cast<const void*>(value)); + wids[i] = std::format("{}###{}", language::resolve(key.c_str()), static_cast<const void*>(value)); } } @@ -428,7 +439,7 @@ void SettingValue_StepperUnsigned::refresh_wids(void) { for(std::size_t i = 0; i < wids.size(); ++i) { auto key = std::format("settings.value.{}.{}", name, i); - wids[i] = std::format("{}###{}", gui::language::resolve(key.c_str()), static_cast<const void*>(value)); + wids[i] = std::format("{}###{}", language::resolve(key.c_str()), static_cast<const void*>(value)); } } @@ -509,12 +520,12 @@ void SettingValue_GamepadButton::refresh_wids(void) void SettingValue_Language::layout(void) const { - auto current_language = gui::language::get_current(); + auto current_language = language::get_current(); if(ImGui::BeginCombo(wid.c_str(), current_language->endonym.c_str())) { - for(auto it = gui::language::cbegin(); it != gui::language::cend(); ++it) { + for(auto it = language::cbegin(); it != language::cend(); ++it) { if(ImGui::Selectable(it->display.c_str(), it == current_language)) { - gui::language::set(it); + language::set(it); continue; } } @@ -528,27 +539,27 @@ void SettingValue_Language::layout(void) const static void refresh_input_wids(void) { - for(SettingValue* value : values_all) { + for(auto& value : values_all) { if(value->type == setting_type::KEYBIND) { - auto keybind = static_cast<SettingValue_KeyBind*>(value); + auto keybind = std::static_pointer_cast<SettingValue_KeyBind>(value); keybind->refresh_wids(); continue; } if(value->type == setting_type::GAMEPAD_AXIS) { - auto gamepad_axis = static_cast<SettingValue_GamepadAxis*>(value); + auto gamepad_axis = std::static_pointer_cast<SettingValue_GamepadAxis>(value); gamepad_axis->refresh_wids(); continue; } if(value->type == setting_type::GAMEPAD_BUTTON) { - auto gamepad_button = static_cast<SettingValue_GamepadButton*>(value); + auto gamepad_button = std::static_pointer_cast<SettingValue_GamepadButton>(value); gamepad_button->refresh_wids(); } } } -static void on_glfw_key(const io::GlfwKeyEvent& event) +static void on_glfw_key(const GlfwKeyEvent& event) { if((event.action == GLFW_PRESS) && (event.key != DEBUG_KEY)) { if(globals::gui_keybind_ptr || globals::gui_gamepad_axis_ptr || globals::gui_gamepad_button_ptr) { @@ -581,7 +592,7 @@ static void on_glfw_key(const io::GlfwKeyEvent& event) } } -static void on_gamepad_axis(const io::GamepadAxisEvent& event) +static void on_gamepad_axis(const GamepadAxisEvent& event) { if(globals::gui_gamepad_axis_ptr) { auto& io = ImGui::GetIO(); @@ -596,7 +607,7 @@ static void on_gamepad_axis(const io::GamepadAxisEvent& event) } } -static void on_gamepad_button(const io::GamepadButtonEvent& event) +static void on_gamepad_button(const GamepadButtonEvent& event) { if(globals::gui_gamepad_button_ptr) { auto& io = ImGui::GetIO(); @@ -611,56 +622,51 @@ static void on_gamepad_button(const io::GamepadButtonEvent& event) } } -static void on_language_set(const gui::LanguageSetEvent& event) +static void on_language_set(const LanguageSetEvent& event) { - str_checkbox_false = gui::language::resolve("settings.checkbox.false"); - str_checkbox_true = gui::language::resolve("settings.checkbox.true"); - - str_tab_general = gui::language::resolve("settings.tab.general"); - str_tab_input = gui::language::resolve("settings.tab.input"); - str_tab_video = gui::language::resolve("settings.tab.video"); - str_tab_sound = gui::language::resolve("settings.tab.sound"); - - str_input_keyboard = gui::language::resolve("settings.input.keyboard"); - str_input_gamepad = gui::language::resolve("settings.input.gamepad"); - str_input_mouse = gui::language::resolve("settings.input.mouse"); - - str_keyboard_movement = gui::language::resolve("settings.keyboard.movement"); - str_keyboard_gameplay = gui::language::resolve("settings.keyboard.gameplay"); - str_keyboard_misc = gui::language::resolve("settings.keyboard.misc"); - - str_gamepad_movement = gui::language::resolve("settings.gamepad.movement"); - str_gamepad_gameplay = gui::language::resolve("settings.gamepad.gameplay"); - str_gamepad_misc = gui::language::resolve("settings.gamepad.misc"); - - str_gamepad_axis_prefix = gui::language::resolve("settings.gamepad.axis"); - str_gamepad_button_prefix = gui::language::resolve("settings.gamepad.button"); - str_gamepad_checkbox_tooltip = gui::language::resolve("settings.gamepad.checkbox_tooltip"); - - str_video_gui = gui::language::resolve("settings.video.gui"); - - str_sound_levels = gui::language::resolve("settings.sound.levels"); - - for(SettingValue* value : values_all) { + str_label_movement = language::resolve("settings.label.movement"); + str_label_gameplay = language::resolve("settings.label.gameplay"); + str_label_miscellaneous = language::resolve("settings.label.miscellaneous"); + str_label_gui = language::resolve("settings.label.gui"); + str_label_levels = language::resolve("settings.label.levels"); + + str_location_general = language::resolve_gui("settings.location.general"); + str_location_keyboard = language::resolve_gui("settings.location.keyboard"); + str_location_mouse = language::resolve_gui("settings.location.mouse"); + str_location_gamepad = language::resolve_gui("settings.location.gamepad"); + str_location_video = language::resolve_gui("settings.location.video"); + str_location_audio = language::resolve_gui("settings.location.audio"); + + str_separator_settings = language::resolve("settings.separator.settings"); + str_separator_devices = language::resolve("settings.separator.devices"); + + str_checkbox_false = language::resolve("settings.checkbox.false"); + str_checkbox_true = language::resolve("settings.checkbox.true"); + + str_gamepad_axis_prefix = language::resolve("settings.gamepad.axis"); + str_gamepad_button_prefix = language::resolve("settings.gamepad.button"); + str_gamepad_checkbox_tooltip = language::resolve("settings.gamepad.checkbox_tooltip"); + + for(auto value : values_all) { if(value->type == setting_type::CHECKBOX) { - auto checkbox = static_cast<SettingValue_CheckBox*>(value); + auto checkbox = std::static_pointer_cast<SettingValue_CheckBox>(value); checkbox->refresh_wids(); } if(value->type == setting_type::STEPPER_INT) { - auto stepper = static_cast<SettingValue_StepperInt*>(value); + auto stepper = std::static_pointer_cast<SettingValue_StepperInt>(value); stepper->refresh_wids(); } if(value->type == setting_type::STEPPER_UINT) { - auto stepper = static_cast<SettingValue_StepperUnsigned*>(value); + auto stepper = std::static_pointer_cast<SettingValue_StepperUnsigned>(value); stepper->refresh_wids(); } - value->title = gui::language::resolve(std::format("settings.value.{}", value->name).c_str()); + value->title = language::resolve(std::format("settings.value.{}", value->name).c_str()); if(value->has_tooltip) { - value->tooltip = gui::language::resolve(std::format("settings.tooltip.{}", value->name).c_str()); + value->tooltip = language::resolve(std::format("settings.tooltip.{}", value->name).c_str()); } } } @@ -669,120 +675,32 @@ static void layout_values(settings_location location) { ImGui::PushItemWidth(ImGui::CalcItemWidth() * 0.70f); - for(const SettingValue* value : values[static_cast<unsigned int>(location)]) { + for(auto& value : values[static_cast<unsigned int>(location)]) { value->layout(); } ImGui::PopItemWidth(); } -static void layout_general(void) -{ - if(ImGui::BeginChild("###settings.general.child")) { - layout_values(settings_location::GENERAL); - } - - ImGui::EndChild(); -} - -static void layout_input_keyboard(void) -{ - if(ImGui::BeginChild("###settings.input.keyboard.child")) { - ImGui::SeparatorText(str_keyboard_movement.c_str()); - layout_values(settings_location::KEYBOARD_MOVEMENT); - ImGui::SeparatorText(str_keyboard_gameplay.c_str()); - layout_values(settings_location::KEYBOARD_GAMEPLAY); - ImGui::SeparatorText(str_keyboard_misc.c_str()); - layout_values(settings_location::KEYBOARD_MISC); - } - - ImGui::EndChild(); -} - -static void layout_input_gamepad(void) -{ - if(ImGui::BeginChild("###settings.input.gamepad.child")) { - layout_values(settings_location::GAMEPAD); - ImGui::SeparatorText(str_gamepad_movement.c_str()); - layout_values(settings_location::GAMEPAD_MOVEMENT); - ImGui::SeparatorText(str_gamepad_gameplay.c_str()); - layout_values(settings_location::GAMEPAD_GAMEPLAY); - ImGui::SeparatorText(str_gamepad_misc.c_str()); - layout_values(settings_location::GAMEPAD_MISC); - } - - ImGui::EndChild(); -} - -static void layout_input_mouse(void) -{ - if(ImGui::BeginChild("###settings.input.mouse.child")) { - layout_values(settings_location::MOUSE); - } - - ImGui::EndChild(); -} - -static void layout_input(void) -{ - if(ImGui::BeginTabBar("###settings.input.tabs", ImGuiTabBarFlags_FittingPolicyResizeDown)) { - if(ImGui::BeginTabItem(str_input_keyboard.c_str())) { - layout_input_keyboard(); - ImGui::EndTabItem(); - } - - if(io::gamepad::available) { - if(ImGui::BeginTabItem(str_input_gamepad.c_str())) { - globals::gui_keybind_ptr = nullptr; - layout_input_gamepad(); - ImGui::EndTabItem(); - } - } - - if(ImGui::BeginTabItem(str_input_mouse.c_str())) { - globals::gui_keybind_ptr = nullptr; - layout_input_mouse(); - ImGui::EndTabItem(); - } - - ImGui::EndTabBar(); - } -} - -static void layout_video(void) -{ - if(ImGui::BeginChild("###settings.video.child")) { - layout_values(settings_location::VIDEO); - ImGui::SeparatorText(str_video_gui.c_str()); - layout_values(settings_location::VIDEO_GUI); - } - - ImGui::EndChild(); -} - -static void layout_sound(void) +static void layout_location_selectable(const std::string& label, gui_location target_location, const ImVec2& size) { - if(ImGui::BeginChild("###settings.sound.child")) { - layout_values(settings_location::SOUND); - ImGui::SeparatorText(str_sound_levels.c_str()); - layout_values(settings_location::SOUND_LEVELS); + if(imutils::selectable_button(label.c_str(), size, selected_location == target_location)) { + selected_location = target_location; } - - ImGui::EndChild(); } void settings::init(void) { - globals::dispatcher.sink<io::GlfwKeyEvent>().connect<&on_glfw_key>(); - globals::dispatcher.sink<io::GamepadAxisEvent>().connect<&on_gamepad_axis>(); - globals::dispatcher.sink<io::GamepadButtonEvent>().connect<&on_gamepad_button>(); - globals::dispatcher.sink<gui::LanguageSetEvent>().connect<&on_language_set>(); + globals::dispatcher.sink<GlfwKeyEvent>().connect<&on_glfw_key>(); + globals::dispatcher.sink<GamepadAxisEvent>().connect<&on_gamepad_axis>(); + globals::dispatcher.sink<GamepadButtonEvent>().connect<&on_gamepad_button>(); + globals::dispatcher.sink<LanguageSetEvent>().connect<&on_language_set>(); } void settings::init_late(void) { for(std::size_t i = 0; i < NUM_LOCATIONS; ++i) { - std::sort(values[i].begin(), values[i].end(), [](const SettingValue* a, const SettingValue* b) { + std::sort(values[i].begin(), values[i].end(), [](const auto& a, const auto& b) { return a->priority < b->priority; }); } @@ -792,68 +710,122 @@ void settings::init_late(void) void settings::shutdown(void) { - for(const SettingValue* value : values_all) - delete value; - for(std::size_t i = 0; i < NUM_LOCATIONS; values[i++].clear()) - ; + for(std::size_t i = 0; i < NUM_LOCATIONS; ++i) { + values[i].clear(); + } + values_all.clear(); } void settings::layout(void) { - const ImGuiViewport* viewport = ImGui::GetMainViewport(); - const ImVec2 window_start = ImVec2(viewport->Size.x * 0.05f, viewport->Size.y * 0.05f); - const ImVec2 window_size = ImVec2(viewport->Size.x * 0.90f, viewport->Size.y * 0.90f); + const auto viewport = ImGui::GetMainViewport(); + auto window_start = ImVec2(viewport->Size.x * 0.025f, viewport->Size.y * 0.025f); + auto window_size = ImVec2(viewport->Size.x * 0.95f, viewport->Size.y * 0.95f); ImGui::SetNextWindowPos(window_start); ImGui::SetNextWindowSize(window_size); - if(ImGui::Begin("###settings", nullptr, WINDOW_FLAGS)) { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(3.0f * globals::gui_scale, 3.0f * globals::gui_scale)); + ImGui::PushFont(globals::font_unscii16, 16.0f); + ImGui::PushStyleVarX(ImGuiStyleVar_FramePadding, 8.0f * globals::gui_scale); + ImGui::PushStyleVarY(ImGuiStyleVar_FramePadding, 3.2f * globals::gui_scale); - if(ImGui::BeginTabBar("###settings.tabs", ImGuiTabBarFlags_FittingPolicyResizeDown)) { - if(ImGui::TabItemButton("<<")) { - globals::gui_screen = GUI_MAIN_MENU; - globals::gui_keybind_ptr = nullptr; - } + if(ImGui::Begin("###settings.window", nullptr, WINDOW_FLAGS)) { + auto sidebar_width = 0.25f * window_size.x; + auto draw_list = ImGui::GetWindowDrawList(); + auto separator_color = ImGui::GetColorU32(ImGuiCol_Text); - if(ImGui::BeginTabItem(str_tab_general.c_str())) { - globals::gui_keybind_ptr = nullptr; - layout_general(); - ImGui::EndTabItem(); - } + if(ImGui::BeginChild("###settings.window.sidebar", ImVec2(sidebar_width, -1.0f), 0, ImGuiWindowFlags_AlwaysUseWindowPadding)) { + auto selectable_height = 24.0f * globals::gui_scale; + auto selectable_size = ImVec2(ImGui::GetContentRegionAvail().x, selectable_height); - if(ImGui::BeginTabItem(str_tab_input.c_str())) { - layout_input(); - ImGui::EndTabItem(); - } + ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, ImVec2(0.5f, 0.5f)); - if(ImGui::BeginTabItem(str_tab_video.c_str())) { - globals::gui_keybind_ptr = nullptr; - layout_video(); - ImGui::EndTabItem(); - } + ImGui::BeginDisabled(globals::gui_gamepad_axis_ptr || globals::gui_gamepad_button_ptr || globals::gui_keybind_ptr); + + if(ImGui::Button("<<###settings.window.back", ImVec2(-1.0f, 0.0f))) { + globals::gui_screen = GUI_MAIN_MENU; - if(globals::sound_ctx && globals::sound_dev) { - if(ImGui::BeginTabItem(str_tab_sound.c_str())) { + if(globals::gui_keybind_ptr) { + globals::gui_keybind_ptr->set_key(GLFW_KEY_UNKNOWN); globals::gui_keybind_ptr = nullptr; - layout_sound(); - ImGui::EndTabItem(); } } - ImGui::EndTabBar(); + ImGui::SeparatorText(str_separator_settings.c_str()); + layout_location_selectable(str_location_general, gui_location::GENERAL, selectable_size); + layout_location_selectable(str_location_video, gui_location::VIDEO, selectable_size); + layout_location_selectable(str_location_audio, gui_location::AUDIO, selectable_size); + + ImGui::SeparatorText(str_separator_devices.c_str()); + layout_location_selectable(str_location_keyboard, gui_location::KEYBOARD, selectable_size); + layout_location_selectable(str_location_mouse, gui_location::MOUSE, selectable_size); + layout_location_selectable(str_location_gamepad, gui_location::GAMEPAD, selectable_size); + + ImGui::EndDisabled(); + + ImGui::PopStyleVar(); } - ImGui::PopStyleVar(); + ImGui::EndChild(); + ImGui::SameLine(); + + if(ImGui::BeginChild("###settings.window.contents", ImVec2(-1.0f, -1.0f), 0, ImGuiWindowFlags_AlwaysUseWindowPadding)) { + switch(selected_location) { + case gui_location::GENERAL: + layout_values(settings_location::GENERAL); + break; + + case gui_location::VIDEO: + layout_values(settings_location::VIDEO); + ImGui::SeparatorText(str_label_gui.c_str()); + layout_values(settings_location::VIDEO_GUI); + break; + + case gui_location::AUDIO: + ImGui::BeginDisabled(globals::sound_ctx == nullptr); + layout_values(settings_location::SOUND); + ImGui::SeparatorText(str_label_levels.c_str()); + layout_values(settings_location::SOUND_LEVELS); + ImGui::EndDisabled(); + break; + + case gui_location::KEYBOARD: + ImGui::SeparatorText(str_label_movement.c_str()); + layout_values(settings_location::KEYBOARD_MOVEMENT); + ImGui::SeparatorText(str_label_gameplay.c_str()); + layout_values(settings_location::KEYBOARD_GAMEPLAY); + ImGui::SeparatorText(str_label_miscellaneous.c_str()); + layout_values(settings_location::KEYBOARD_MISC); + break; + + case gui_location::MOUSE: + layout_values(settings_location::MOUSE); + break; + + case gui_location::GAMEPAD: + ImGui::SeparatorText(str_label_movement.c_str()); + layout_values(settings_location::GAMEPAD_MOVEMENT); + ImGui::SeparatorText(str_label_gameplay.c_str()); + layout_values(settings_location::GAMEPAD_GAMEPLAY); + ImGui::SeparatorText(str_label_miscellaneous.c_str()); + layout_values(settings_location::GAMEPAD_MISC); + break; + } + } + + ImGui::EndChild(); } + ImGui::PopStyleVar(2); + ImGui::PopFont(); + ImGui::End(); } void settings::add_checkbox(int priority, config::Boolean& value, settings_location location, std::string_view name, bool tooltip) { - auto setting_value = new SettingValue_CheckBox; + auto setting_value = std::make_shared<SettingValue_CheckBox>(); setting_value->type = setting_type::CHECKBOX; setting_value->priority = priority; setting_value->has_tooltip = tooltip; @@ -868,7 +840,7 @@ void settings::add_checkbox(int priority, config::Boolean& value, settings_locat void settings::add_input(int priority, config::Int& value, settings_location location, std::string_view name, bool tooltip) { - auto setting_value = new SettingValue_InputInt; + auto setting_value = std::make_shared<SettingValue_InputInt>(); setting_value->type = setting_type::INPUT_INT; setting_value->priority = priority; setting_value->has_tooltip = tooltip; @@ -884,7 +856,7 @@ void settings::add_input(int priority, config::Int& value, settings_location loc void settings::add_input(int priority, config::Float& value, settings_location location, std::string_view name, bool tooltip, std::string_view fmt) { - auto setting_value = new SettingValue_InputFloat; + auto setting_value = std::make_shared<SettingValue_InputFloat>(); setting_value->type = setting_type::INPUT_FLOAT; setting_value->priority = priority; setting_value->has_tooltip = tooltip; @@ -900,7 +872,7 @@ void settings::add_input(int priority, config::Float& value, settings_location l void settings::add_input(int priority, config::Unsigned& value, settings_location location, std::string_view name, bool tooltip) { - auto setting_value = new SettingValue_InputUnsigned; + auto setting_value = std::make_shared<SettingValue_InputUnsigned>(); setting_value->type = setting_type::INPUT_UINT; setting_value->priority = priority; setting_value->has_tooltip = tooltip; @@ -916,7 +888,7 @@ void settings::add_input(int priority, config::Unsigned& value, settings_locatio void settings::add_input(int priority, config::String& value, settings_location location, std::string_view name, bool tooltip, bool allow_whitespace) { - auto setting_value = new SettingValue_InputString; + auto setting_value = std::make_shared<SettingValue_InputString>(); setting_value->type = setting_type::INPUT_STRING; setting_value->priority = priority; setting_value->has_tooltip = tooltip; @@ -932,7 +904,7 @@ void settings::add_input(int priority, config::String& value, settings_location void settings::add_slider(int priority, config::Int& value, settings_location location, std::string_view name, bool tooltip) { - auto setting_value = new SettingValue_SliderInt; + auto setting_value = std::make_shared<SettingValue_SliderInt>(); setting_value->type = setting_type::SLIDER_INT; setting_value->priority = priority; setting_value->has_tooltip = tooltip; @@ -948,7 +920,7 @@ void settings::add_slider(int priority, config::Int& value, settings_location lo void settings::add_slider(int priority, config::Float& value, settings_location location, std::string_view name, bool tooltip, std::string_view fmt) { - auto setting_value = new SettingValue_SliderFloat; + auto setting_value = std::make_shared<SettingValue_SliderFloat>(); setting_value->type = setting_type::SLIDER_FLOAT; setting_value->priority = priority; setting_value->has_tooltip = tooltip; @@ -964,7 +936,7 @@ void settings::add_slider(int priority, config::Float& value, settings_location void settings::add_slider(int priority, config::Unsigned& value, settings_location location, std::string_view name, bool tooltip) { - auto setting_value = new SettingValue_SliderUnsigned; + auto setting_value = std::make_shared<SettingValue_SliderUnsigned>(); setting_value->type = setting_type::SLIDER_UINT; setting_value->priority = priority; setting_value->has_tooltip = tooltip; @@ -979,7 +951,7 @@ void settings::add_slider(int priority, config::Unsigned& value, settings_locati void settings::add_stepper(int priority, config::Int& value, settings_location location, std::string_view name, bool tooltip) { - auto setting_value = new SettingValue_StepperInt; + auto setting_value = std::make_shared<SettingValue_StepperInt>(); setting_value->type = setting_type::STEPPER_INT; setting_value->priority = priority; setting_value->has_tooltip = tooltip; @@ -995,7 +967,7 @@ void settings::add_stepper(int priority, config::Int& value, settings_location l void settings::add_stepper(int priority, config::Unsigned& value, settings_location location, std::string_view name, bool tooltip) { - auto setting_value = new SettingValue_StepperUnsigned; + auto setting_value = std::make_shared<SettingValue_StepperUnsigned>(); setting_value->type = setting_type::STEPPER_UINT; setting_value->priority = priority; setting_value->has_tooltip = tooltip; @@ -1011,7 +983,7 @@ void settings::add_stepper(int priority, config::Unsigned& value, settings_locat void settings::add_keybind(int priority, config::KeyBind& value, settings_location location, std::string_view name) { - auto setting_value = new SettingValue_KeyBind; + auto setting_value = std::make_shared<SettingValue_KeyBind>(); setting_value->type = setting_type::KEYBIND; setting_value->priority = priority; setting_value->has_tooltip = false; @@ -1026,7 +998,7 @@ void settings::add_keybind(int priority, config::KeyBind& value, settings_locati void settings::add_gamepad_axis(int priority, config::GamepadAxis& value, settings_location location, std::string_view name) { - auto setting_value = new SettingValue_GamepadAxis; + auto setting_value = std::make_shared<SettingValue_GamepadAxis>(); setting_value->type = setting_type::GAMEPAD_AXIS; setting_value->priority = priority; setting_value->has_tooltip = false; @@ -1041,7 +1013,7 @@ void settings::add_gamepad_axis(int priority, config::GamepadAxis& value, settin void settings::add_gamepad_button(int priority, config::GamepadButton& value, settings_location location, std::string_view name) { - auto setting_value = new SettingValue_GamepadButton; + auto setting_value = std::make_shared<SettingValue_GamepadButton>(); setting_value->type = setting_type::GAMEPAD_BUTTON; setting_value->priority = priority; setting_value->has_tooltip = false; @@ -1056,13 +1028,13 @@ void settings::add_gamepad_button(int priority, config::GamepadButton& value, se void settings::add_language_select(int priority, settings_location location, std::string_view name) { - auto setting_value = new SettingValue_Language; + auto setting_value = std::make_shared<SettingValue_Language>(); setting_value->type = setting_type::LANGUAGE_SELECT; setting_value->priority = priority; setting_value->has_tooltip = false; setting_value->name = name; - setting_value->wid = std::format("###{}", static_cast<const void*>(setting_value)); + setting_value->wid = std::format("###{}", static_cast<const void*>(setting_value.get())); values[static_cast<unsigned int>(location)].push_back(setting_value); values_all.push_back(setting_value); diff --git a/src/game/client/gui/splash.cc b/src/game/client/gui/splash.cc index fab3ad8..cb035e9 100644 --- a/src/game/client/gui/splash.cc +++ b/src/game/client/gui/splash.cc @@ -32,24 +32,24 @@ static float texture_alpha; static std::uint64_t end_time; static std::string current_text; -static void on_glfw_key(const io::GlfwKeyEvent& event) +static void on_glfw_key(const GlfwKeyEvent& event) { end_time = UINT64_C(0); } -static void on_glfw_mouse_button(const io::GlfwMouseButtonEvent& event) +static void on_glfw_mouse_button(const GlfwMouseButtonEvent& event) { end_time = UINT64_C(0); } -static void on_glfw_scroll(const io::GlfwScrollEvent& event) +static void on_glfw_scroll(const GlfwScrollEvent& event) { end_time = UINT64_C(0); } -void gui::client_splash::init(void) +void client_splash::init(void) { - if(io::cmdline::contains("nosplash")) { + if(cmdline::contains("nosplash")) { texture = nullptr; texture_aspect = 0.0f; texture_alpha = 0.0f; @@ -74,7 +74,7 @@ void gui::client_splash::init(void) } } -void gui::client_splash::init_late(void) +void client_splash::init_late(void) { if(!texture) { // We don't have to waste time @@ -84,11 +84,11 @@ void gui::client_splash::init_late(void) end_time = utils::unix_microseconds() + DELAY_MICROSECONDS; - globals::dispatcher.sink<io::GlfwKeyEvent>().connect<&on_glfw_key>(); - globals::dispatcher.sink<io::GlfwMouseButtonEvent>().connect<&on_glfw_mouse_button>(); - globals::dispatcher.sink<io::GlfwScrollEvent>().connect<&on_glfw_scroll>(); + globals::dispatcher.sink<GlfwKeyEvent>().connect<&on_glfw_key>(); + globals::dispatcher.sink<GlfwMouseButtonEvent>().connect<&on_glfw_mouse_button>(); + globals::dispatcher.sink<GlfwScrollEvent>().connect<&on_glfw_scroll>(); - current_text = gui::language::resolve("splash.skip_prompt"); + current_text = language::resolve("splash.skip_prompt"); while(!glfwWindowShouldClose(globals::window)) { const std::uint64_t curtime = utils::unix_microseconds(); @@ -100,12 +100,12 @@ void gui::client_splash::init_late(void) texture_alpha = glm::smoothstep(0.25f, 0.6f, static_cast<float>(remains) / static_cast<float>(DELAY_MICROSECONDS)); - gui::client_splash::render(); + client_splash::render(); } - globals::dispatcher.sink<io::GlfwKeyEvent>().disconnect<&on_glfw_key>(); - globals::dispatcher.sink<io::GlfwMouseButtonEvent>().disconnect<&on_glfw_mouse_button>(); - globals::dispatcher.sink<io::GlfwScrollEvent>().disconnect<&on_glfw_scroll>(); + globals::dispatcher.sink<GlfwKeyEvent>().disconnect<&on_glfw_key>(); + globals::dispatcher.sink<GlfwMouseButtonEvent>().disconnect<&on_glfw_mouse_button>(); + globals::dispatcher.sink<GlfwScrollEvent>().disconnect<&on_glfw_scroll>(); texture = nullptr; texture_aspect = 0.0f; @@ -113,7 +113,7 @@ void gui::client_splash::init_late(void) end_time = UINT64_C(0); } -void gui::client_splash::render(void) +void client_splash::render(void) { if(!texture) { // We don't have to waste time @@ -152,7 +152,7 @@ void gui::client_splash::render(void) const ImVec2 image_pos = ImVec2(image_x, image_y); if(!current_text.empty()) { - ImGui::PushFont(globals::font_unscii8, 16.0f); + ImGui::PushFont(globals::font_unscii8, 8.0f); ImGui::SetCursorPos(ImVec2(16.0f, 16.0f)); ImGui::TextDisabled("%s", current_text.c_str()); ImGui::PopFont(); diff --git a/src/game/client/gui/splash.hh b/src/game/client/gui/splash.hh index 3ce63e4..ca612fe 100644 --- a/src/game/client/gui/splash.hh +++ b/src/game/client/gui/splash.hh @@ -1,8 +1,8 @@ #pragma once -namespace gui::client_splash +namespace client_splash { void init(void); void init_late(void); void render(void); -} // namespace gui::client_splash +} // namespace client_splash diff --git a/src/game/client/gui/status_lines.cc b/src/game/client/gui/status_lines.cc index 74d0dbe..ce661a3 100644 --- a/src/game/client/gui/status_lines.cc +++ b/src/game/client/gui/status_lines.cc @@ -2,21 +2,21 @@ #include "client/gui/status_lines.hh" -#include "client/gui/imdraw_ext.hh" +#include "client/gui/imutils_text.hh" #include "client/globals.hh" -static float line_offsets[gui::STATUS_COUNT]; -static ImFont* line_fonts[gui::STATUS_COUNT]; -static float line_sizes[gui::STATUS_COUNT]; +static float line_offsets[STATUS_COUNT]; +static ImFont* line_fonts[STATUS_COUNT]; +static float line_sizes[STATUS_COUNT]; -static ImVec4 line_text_colors[gui::STATUS_COUNT]; -static ImVec4 line_shadow_colors[gui::STATUS_COUNT]; -static std::string line_strings[gui::STATUS_COUNT]; -static std::uint64_t line_spawns[gui::STATUS_COUNT]; -static float line_fadeouts[gui::STATUS_COUNT]; +static ImVec4 line_text_colors[STATUS_COUNT]; +static ImVec4 line_shadow_colors[STATUS_COUNT]; +static std::string line_strings[STATUS_COUNT]; +static std::uint64_t line_spawns[STATUS_COUNT]; +static float line_fadeouts[STATUS_COUNT]; -void gui::status_lines::init(void) +void status_lines::init(void) { for(unsigned int i = 0U; i < STATUS_COUNT; ++i) { line_text_colors[i] = ImVec4(0.0f, 0.0f, 0.0f, 0.0f); @@ -27,19 +27,19 @@ void gui::status_lines::init(void) } } -void gui::status_lines::init_late(void) +void status_lines::init_late(void) { - line_offsets[STATUS_DEBUG] = 64.0f; - line_offsets[STATUS_HOTBAR] = 40.0f; + line_offsets[STATUS_DEBUG] = 128.0f; + line_offsets[STATUS_HOTBAR] = 80.0f; } -void gui::status_lines::layout(void) +void status_lines::layout(void) { line_fonts[STATUS_DEBUG] = globals::font_unscii8; - line_sizes[STATUS_DEBUG] = 4.0f; + line_sizes[STATUS_DEBUG] = 8.0f; line_fonts[STATUS_HOTBAR] = globals::font_unscii16; - line_sizes[STATUS_HOTBAR] = 8.0f; + line_sizes[STATUS_HOTBAR] = 16.0f; auto viewport = ImGui::GetMainViewport(); auto draw_list = ImGui::GetForegroundDrawList(); @@ -61,11 +61,11 @@ void gui::status_lines::layout(void) auto color_U32 = ImGui::GetColorU32(ImVec4(color.x, color.y, color.z, color.w * alpha)); auto shadow_U32 = ImGui::GetColorU32(ImVec4(shadow.x, shadow.y, shadow.z, color.w * alpha)); - gui::imdraw_ext::text_shadow(text, pos, color_U32, shadow_U32, font, draw_list, line_sizes[i]); + imutils::text_nw(draw_list, text, pos, color_U32, shadow_U32, font, line_sizes[i] * globals::gui_scale); } } -void gui::status_lines::set(unsigned int line, std::string_view text, const ImVec4& color, float fadeout) +void status_lines::set(unsigned int line, std::string_view text, const ImVec4& color, float fadeout) { line_text_colors[line] = ImVec4(color.x, color.y, color.z, color.w); line_shadow_colors[line] = ImVec4(color.x * 0.1f, color.y * 0.1f, color.z * 0.1f, color.w); @@ -74,7 +74,7 @@ void gui::status_lines::set(unsigned int line, std::string_view text, const ImVe line_fadeouts[line] = fadeout; } -void gui::status_lines::unset(unsigned int line) +void status_lines::unset(unsigned int line) { line_text_colors[line] = ImVec4(0.0f, 0.0f, 0.0f, 0.0f); line_shadow_colors[line] = ImVec4(0.0f, 0.0f, 0.0f, 0.0f); diff --git a/src/game/client/gui/status_lines.hh b/src/game/client/gui/status_lines.hh index 98cbde1..b921947 100644 --- a/src/game/client/gui/status_lines.hh +++ b/src/game/client/gui/status_lines.hh @@ -1,21 +1,18 @@ #pragma once -namespace gui -{ constexpr static unsigned int STATUS_DEBUG = 0x0000; // generic debug line constexpr static unsigned int STATUS_HOTBAR = 0x0001; // hotbar item line constexpr static unsigned int STATUS_COUNT = 0x0002; -} // namespace gui -namespace gui::status_lines +namespace status_lines { void init(void); void init_late(void); void layout(void); -} // namespace gui::status_lines +} // namespace status_lines -namespace gui::status_lines +namespace status_lines { void set(unsigned int line, std::string_view text, const ImVec4& color, float fadeout); void unset(unsigned int line); -} // namespace gui::status_lines +} // namespace status_lines diff --git a/src/game/client/gui/window_title.cc b/src/game/client/gui/window_title.cc index 787a7fa..b15f2c5 100644 --- a/src/game/client/gui/window_title.cc +++ b/src/game/client/gui/window_title.cc @@ -8,7 +8,7 @@ #include "client/globals.hh" -void gui::window_title::update(void) +void window_title::update(void) { glfwSetWindowTitle(globals::window, std::format("Voxelius {}: {}", version::triplet, splash::get()).c_str()); } diff --git a/src/game/client/gui/window_title.hh b/src/game/client/gui/window_title.hh index af1ab7c..544ed44 100644 --- a/src/game/client/gui/window_title.hh +++ b/src/game/client/gui/window_title.hh @@ -1,6 +1,6 @@ #pragma once -namespace gui::window_title +namespace window_title { void update(void); -} // namespace gui::window_title +} // namespace window_title diff --git a/src/game/client/io/gamepad.cc b/src/game/client/io/gamepad.cc index 3661769..2c99107 100644 --- a/src/game/client/io/gamepad.cc +++ b/src/game/client/io/gamepad.cc @@ -21,16 +21,16 @@ constexpr static float GAMEPAD_AXIS_EVENT_THRESHOLD = 0.5f; static int active_gamepad_id; -bool io::gamepad::available = false; -config::Float io::gamepad::deadzone(0.00f, 0.00f, 0.66f); -config::Boolean io::gamepad::active(false); -GLFWgamepadstate io::gamepad::state; -GLFWgamepadstate io::gamepad::last_state; +bool gamepad::available = false; +config::Float gamepad::deadzone(0.00f, 0.00f, 0.66f); +config::Boolean gamepad::active(false); +GLFWgamepadstate gamepad::state; +GLFWgamepadstate gamepad::last_state; static void on_toggle_enable(const ToggleEnabledEvent& event) { if(event.type == TOGGLE_USE_GAMEPAD) { - io::gamepad::active.set_value(true); + gamepad::active.set_value(true); return; } } @@ -38,23 +38,23 @@ static void on_toggle_enable(const ToggleEnabledEvent& event) static void on_toggle_disable(const ToggleDisabledEvent& event) { if(event.type == TOGGLE_USE_GAMEPAD) { - io::gamepad::active.set_value(false); + gamepad::active.set_value(false); return; } } -static void on_glfw_joystick_event(const io::GlfwJoystickEvent& event) +static void on_glfw_joystick_event(const GlfwJoystickEvent& event) { if((event.event_type == GLFW_CONNECTED) && glfwJoystickIsGamepad(event.joystick_id) && (active_gamepad_id == INVALID_GAMEPAD_ID)) { - io::gamepad::available = true; + gamepad::available = true; active_gamepad_id = event.joystick_id; - for(int i = 0; i < NUM_AXES; io::gamepad::last_state.axes[i++] = 0.0f) { + for(int i = 0; i < NUM_AXES; gamepad::last_state.axes[i++] = 0.0f) { // empty } - for(int i = 0; i < NUM_BUTTONS; io::gamepad::last_state.buttons[i++] = GLFW_RELEASE) { + for(int i = 0; i < NUM_BUTTONS; gamepad::last_state.buttons[i++] = GLFW_RELEASE) { // empty } @@ -64,15 +64,15 @@ static void on_glfw_joystick_event(const io::GlfwJoystickEvent& event) } if((event.event_type == GLFW_DISCONNECTED) && (active_gamepad_id == event.joystick_id)) { - io::gamepad::available = false; + gamepad::available = false; active_gamepad_id = INVALID_GAMEPAD_ID; - for(int i = 0; i < NUM_AXES; io::gamepad::last_state.axes[i++] = 0.0f) { + for(int i = 0; i < NUM_AXES; gamepad::last_state.axes[i++] = 0.0f) { // empty } - for(int i = 0; i < NUM_BUTTONS; io::gamepad::last_state.buttons[i++] = GLFW_RELEASE) { + for(int i = 0; i < NUM_BUTTONS; gamepad::last_state.buttons[i++] = GLFW_RELEASE) { // empty } @@ -82,19 +82,19 @@ static void on_glfw_joystick_event(const io::GlfwJoystickEvent& event) } } -void io::gamepad::init(void) +void gamepad::init(void) { - io::gamepad::available = false; + gamepad::available = false; active_gamepad_id = INVALID_GAMEPAD_ID; - globals::client_config.add_value("gamepad.deadzone", io::gamepad::deadzone); - globals::client_config.add_value("gamepad.active", io::gamepad::active); + globals::client_config.add_value("gamepad.deadzone", gamepad::deadzone); + globals::client_config.add_value("gamepad.active", gamepad::active); - settings::add_checkbox(0, io::gamepad::active, settings_location::GAMEPAD, "gamepad.active", true); - settings::add_slider(1, io::gamepad::deadzone, settings_location::GAMEPAD, "gamepad.deadzone", true, "%.03f"); + settings::add_checkbox(0, gamepad::active, settings_location::GAMEPAD, "gamepad.active", true); + settings::add_slider(1, gamepad::deadzone, settings_location::GAMEPAD, "gamepad.deadzone", true, "%.03f"); - auto mappings_path = io::cmdline::get_cstr("gpmap", "misc/gamecontrollerdb.txt"); + auto mappings_path = cmdline::get_cstr("gpmap", "misc/gamecontrollerdb.txt"); auto mappings_file = PHYSFS_openRead(mappings_path); if(mappings_file) { @@ -107,15 +107,15 @@ void io::gamepad::init(void) for(int joystick = 0; joystick <= GLFW_JOYSTICK_LAST; joystick += 1) { if(glfwJoystickIsGamepad(joystick)) { - io::gamepad::available = true; + gamepad::available = true; active_gamepad_id = joystick; - for(int i = 0; i < NUM_AXES; io::gamepad::last_state.axes[i++] = 0.0f) { + for(int i = 0; i < NUM_AXES; gamepad::last_state.axes[i++] = 0.0f) { // empty } - for(int i = 0; i < NUM_BUTTONS; io::gamepad::last_state.buttons[i++] = GLFW_RELEASE) { + for(int i = 0; i < NUM_BUTTONS; gamepad::last_state.buttons[i++] = GLFW_RELEASE) { // empty } @@ -125,11 +125,11 @@ void io::gamepad::init(void) } } - for(int i = 0; i < NUM_AXES; io::gamepad::state.axes[i++] = 0.0f) { + for(int i = 0; i < NUM_AXES; gamepad::state.axes[i++] = 0.0f) { // empty } - for(int i = 0; i < NUM_BUTTONS; io::gamepad::state.buttons[i++] = GLFW_RELEASE) { + for(int i = 0; i < NUM_BUTTONS; gamepad::state.buttons[i++] = GLFW_RELEASE) { // empty } @@ -138,17 +138,17 @@ void io::gamepad::init(void) globals::dispatcher.sink<GlfwJoystickEvent>().connect<&on_glfw_joystick_event>(); } -void io::gamepad::update_late(void) +void gamepad::update_late(void) { if(active_gamepad_id == INVALID_GAMEPAD_ID) { // No active gamepad found return; } - if(glfwGetGamepadState(active_gamepad_id, &io::gamepad::state)) { + if(glfwGetGamepadState(active_gamepad_id, &gamepad::state)) { for(int i = 0; i < NUM_AXES; ++i) { - if((glm::abs(io::gamepad::state.axes[i]) > GAMEPAD_AXIS_EVENT_THRESHOLD) - && (glm::abs(io::gamepad::last_state.axes[i]) <= GAMEPAD_AXIS_EVENT_THRESHOLD)) { + if((glm::abs(gamepad::state.axes[i]) > GAMEPAD_AXIS_EVENT_THRESHOLD) + && (glm::abs(gamepad::last_state.axes[i]) <= GAMEPAD_AXIS_EVENT_THRESHOLD)) { GamepadAxisEvent event; event.action = GLFW_PRESS; event.axis = i; @@ -156,8 +156,8 @@ void io::gamepad::update_late(void) continue; } - if((glm::abs(io::gamepad::state.axes[i]) <= GAMEPAD_AXIS_EVENT_THRESHOLD) - && (glm::abs(io::gamepad::last_state.axes[i]) > GAMEPAD_AXIS_EVENT_THRESHOLD)) { + if((glm::abs(gamepad::state.axes[i]) <= GAMEPAD_AXIS_EVENT_THRESHOLD) + && (glm::abs(gamepad::last_state.axes[i]) > GAMEPAD_AXIS_EVENT_THRESHOLD)) { GamepadAxisEvent event; event.action = GLFW_RELEASE; event.axis = i; @@ -167,17 +167,17 @@ void io::gamepad::update_late(void) } for(int i = 0; i < NUM_BUTTONS; ++i) { - if(io::gamepad::state.buttons[i] == io::gamepad::last_state.buttons[i]) { + if(gamepad::state.buttons[i] == gamepad::last_state.buttons[i]) { // Nothing happens continue; } GamepadButtonEvent event; - event.action = io::gamepad::state.buttons[i]; + event.action = gamepad::state.buttons[i]; event.button = i; globals::dispatcher.enqueue(event); } } - io::gamepad::last_state = io::gamepad::state; + gamepad::last_state = gamepad::state; } diff --git a/src/game/client/io/gamepad.hh b/src/game/client/io/gamepad.hh index 9c56894..5f76277 100644 --- a/src/game/client/io/gamepad.hh +++ b/src/game/client/io/gamepad.hh @@ -1,10 +1,7 @@ #pragma once -namespace io -{ constexpr static int INVALID_GAMEPAD_AXIS = INT_MAX; constexpr static int INVALID_GAMEPAD_BUTTON = INT_MAX; -} // namespace io namespace config { @@ -14,23 +11,21 @@ class Float; struct GLFWgamepadstate; -namespace io::gamepad +namespace gamepad { extern bool available; extern config::Float deadzone; extern config::Boolean active; extern GLFWgamepadstate state; extern GLFWgamepadstate last_state; -} // namespace io::gamepad +} // namespace gamepad -namespace io::gamepad +namespace gamepad { void init(void); void update_late(void); -} // namespace io::gamepad +} // namespace gamepad -namespace io -{ // This simulates buttons using axes. When an axis // value exceeds 1.5 times the deadzone, the event is // queued with a GLFW_PRESS action, when it falls back @@ -47,4 +42,3 @@ struct GamepadButtonEvent final { int action; int button; }; -} // namespace io diff --git a/src/game/client/io/glfw.hh b/src/game/client/io/glfw.hh index cd6d882..ad445f9 100644 --- a/src/game/client/io/glfw.hh +++ b/src/game/client/io/glfw.hh @@ -1,7 +1,5 @@ #pragma once -namespace io -{ struct GlfwCursorPosEvent final { glm::fvec2 pos; }; @@ -33,4 +31,3 @@ struct GlfwScrollEvent final { float dx; float dy; }; -} // namespace io diff --git a/src/game/client/main.cc b/src/game/client/main.cc index c96d4a4..32333db 100644 --- a/src/game/client/main.cc +++ b/src/game/client/main.cc @@ -47,7 +47,7 @@ static void on_glfw_cursor_enter(GLFWwindow* window, int entered) static void on_glfw_cursor_pos(GLFWwindow* window, double xpos, double ypos) { - io::GlfwCursorPosEvent event; + GlfwCursorPosEvent event; event.pos.x = static_cast<float>(xpos); event.pos.y = static_cast<float>(ypos); globals::dispatcher.trigger(event); @@ -68,7 +68,7 @@ static void on_glfw_framebuffer_size(GLFWwindow* window, int width, int height) globals::height = height; globals::aspect = static_cast<float>(width) / static_cast<float>(height); - io::GlfwFramebufferSizeEvent fb_event; + GlfwFramebufferSizeEvent fb_event; fb_event.size.x = globals::width; fb_event.size.y = globals::height; fb_event.aspect = globals::aspect; @@ -77,7 +77,7 @@ static void on_glfw_framebuffer_size(GLFWwindow* window, int width, int height) static void on_glfw_key(GLFWwindow* window, int key, int scancode, int action, int mods) { - io::GlfwKeyEvent event; + GlfwKeyEvent event; event.key = key; event.scancode = scancode; event.action = action; @@ -89,7 +89,7 @@ static void on_glfw_key(GLFWwindow* window, int key, int scancode, int action, i static void on_glfw_joystick(int joystick_id, int event_type) { - io::GlfwJoystickEvent event; + GlfwJoystickEvent event; event.joystick_id = joystick_id; event.event_type = event_type; globals::dispatcher.trigger(event); @@ -102,7 +102,7 @@ static void on_glfw_monitor_event(GLFWmonitor* monitor, int event) static void on_glfw_mouse_button(GLFWwindow* window, int button, int action, int mods) { - io::GlfwMouseButtonEvent event; + GlfwMouseButtonEvent event; event.button = button; event.action = action; event.mods = mods; @@ -113,7 +113,7 @@ static void on_glfw_mouse_button(GLFWwindow* window, int button, int action, int static void on_glfw_scroll(GLFWwindow* window, double dx, double dy) { - io::GlfwScrollEvent event; + GlfwScrollEvent event; event.dx = static_cast<float>(dx); event.dy = static_cast<float>(dy); globals::dispatcher.trigger(event); @@ -140,17 +140,17 @@ static void on_termination_signal(int) int main(int argc, char** argv) { - io::cmdline::create(argc, argv); + cmdline::create(argc, argv); #if defined(_WIN32) #if defined(NDEBUG) - if(GetConsoleWindow() && !io::cmdline::contains("debug")) { + if(GetConsoleWindow() && !cmdline::contains("debug")) { // Hide the console window on release builds // unless explicitly specified to preserve it instead FreeConsole(); } #else - if(GetConsoleWindow() && io::cmdline::contains("nodebug")) { + if(GetConsoleWindow() && cmdline::contains("nodebug")) { // Hide the console window on debug builds when // explicitly specified by the user to hide it FreeConsole(); @@ -201,7 +201,7 @@ int main(int argc, char** argv) } if(GLAD_GL_KHR_debug) { - if(!io::cmdline::contains("nodebug")) { + if(!cmdline::contains("nodebug")) { glEnable(GL_DEBUG_OUTPUT); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); glDebugMessageCallback(&on_opengl_message, nullptr); @@ -261,7 +261,7 @@ int main(int argc, char** argv) glfwSetWindowIcon(globals::window, 1, &icon_image); } - if(io::cmdline::contains("nosound")) { + if(cmdline::contains("nosound")) { spdlog::warn("client: sound disabled [per command line]"); globals::sound_dev = nullptr; globals::sound_ctx = nullptr; @@ -298,7 +298,7 @@ int main(int argc, char** argv) splash::init_client(); - gui::window_title::update(); + window_title::update(); ImGuiIO& io = ImGui::GetIO(); io.ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad; @@ -319,7 +319,7 @@ int main(int argc, char** argv) int vmode_width = DEFAULT_WIDTH; int vmode_height = DEFAULT_HEIGHT; - if(auto vmode = io::cmdline::get_cstr("mode")) { + if(auto vmode = cmdline::get_cstr("mode")) { std::sscanf(vmode, "%dx%d", &vmode_width, &vmode_height); vmode_height = glm::max(vmode_height, MIN_HEIGHT); vmode_width = glm::max(vmode_width, MIN_WIDTH); diff --git a/src/game/client/program.cc b/src/game/client/program.cc index 88cbe28..37cc964 100644 --- a/src/game/client/program.cc +++ b/src/game/client/program.cc @@ -78,7 +78,7 @@ bool GL_Program::setup(std::string_view vpath, std::string_view fpath) auto vfile = PHYSFS_openRead(vert_path.c_str()); if(vfile == nullptr) { - spdlog::warn("gl_program: {}: {}", vpath, io::physfs_error()); + spdlog::warn("gl_program: {}: {}", vpath, physfs_error()); return false; } @@ -89,7 +89,7 @@ bool GL_Program::setup(std::string_view vpath, std::string_view fpath) auto ffile = PHYSFS_openRead(frag_path.c_str()); if(ffile == nullptr) { - spdlog::warn("gl_program: {}: {}", fpath, io::physfs_error()); + spdlog::warn("gl_program: {}: {}", fpath, physfs_error()); return false; } diff --git a/src/game/client/receive.cc b/src/game/client/receive.cc index a253911..a6fdf8e 100644 --- a/src/game/client/receive.cc +++ b/src/game/client/receive.cc @@ -23,7 +23,7 @@ #include "client/globals.hh" #include "client/session.hh" -static bool synchronize_entity_id(world::Dimension* dimension, entt::entity entity) +static bool synchronize_entity_id(Dimension* dimension, entt::entity entity) { if(dimension->entities.valid(entity)) { // Entity ID already exists @@ -41,12 +41,12 @@ static bool synchronize_entity_id(world::Dimension* dimension, entt::entity enti spdlog::critical("receive: entity desync: network {} resolved as client {}", static_cast<std::uint64_t>(entity), static_cast<std::uint64_t>(created)); - gui::message_box::reset(); - gui::message_box::set_title("disconnected.disconnected"); - gui::message_box::set_subtitle("protocol.entity_id_desync"); - gui::message_box::add_button("disconnected.back", [](void) { + message_box::reset(); + message_box::set_title("disconnected.disconnected"); + message_box::set_subtitle("protocol.entity_id_desync"); + message_box::add_button("disconnected.back", [](void) { globals::gui_screen = GUI_PLAY_MENU; - gui::window_title::update(); + window_title::update(); }); globals::gui_screen = GUI_MESSAGE_BOX; @@ -63,7 +63,7 @@ static void on_dimension_info_packet(const protocol::DimensionInfo& packet) globals::player = entt::null; } - globals::dimension = new world::Dimension(packet.name.c_str(), packet.gravity); + globals::dimension = new Dimension(packet.name.c_str(), packet.gravity); } } @@ -73,7 +73,7 @@ static void on_chunk_voxels_packet(const protocol::ChunkVoxels& packet) auto chunk = globals::dimension->create_chunk(packet.chunk); chunk->set_voxels(packet.voxels); - world::ChunkUpdateEvent event; + ChunkUpdateEvent event; event.dimension = globals::dimension; event.cpos = packet.chunk; event.chunk = chunk; @@ -88,8 +88,8 @@ static void on_entity_head_packet(const protocol::EntityHead& packet) { if(session::peer && globals::dimension) { if(synchronize_entity_id(globals::dimension, packet.entity)) { - auto& component = globals::dimension->entities.get_or_emplace<entity::Head>(packet.entity); - auto& prevcomp = globals::dimension->entities.get_or_emplace<entity::client::HeadPrev>(packet.entity); + auto& component = globals::dimension->entities.get_or_emplace<Head>(packet.entity); + auto& prevcomp = globals::dimension->entities.get_or_emplace<client::HeadPrev>(packet.entity); // Store the previous component state prevcomp.angles = component.angles; @@ -105,8 +105,8 @@ static void on_entity_transform_packet(const protocol::EntityTransform& packet) { if(session::peer && globals::dimension) { if(synchronize_entity_id(globals::dimension, packet.entity)) { - auto& component = globals::dimension->entities.get_or_emplace<entity::Transform>(packet.entity); - auto& prevcomp = globals::dimension->entities.get_or_emplace<entity::client::TransformPrev>(packet.entity); + auto& component = globals::dimension->entities.get_or_emplace<Transform>(packet.entity); + auto& prevcomp = globals::dimension->entities.get_or_emplace<client::TransformPrev>(packet.entity); // Store the previous component state prevcomp.angles = component.angles; @@ -125,7 +125,7 @@ static void on_entity_velocity_packet(const protocol::EntityVelocity& packet) { if(session::peer && globals::dimension) { if(synchronize_entity_id(globals::dimension, packet.entity)) { - auto& component = globals::dimension->entities.get_or_emplace<entity::Velocity>(packet.entity); + auto& component = globals::dimension->entities.get_or_emplace<Velocity>(packet.entity); component.value = packet.value; } } @@ -135,7 +135,7 @@ static void on_entity_player_packet(const protocol::EntityPlayer& packet) { if(session::peer && globals::dimension) { if(synchronize_entity_id(globals::dimension, packet.entity)) { - entity::client::create_player(globals::dimension, packet.entity); + client::create_player(globals::dimension, packet.entity); } } } @@ -144,14 +144,14 @@ static void on_spawn_player_packet(const protocol::SpawnPlayer& packet) { if(session::peer && globals::dimension) { if(synchronize_entity_id(globals::dimension, packet.entity)) { - entity::client::create_player(globals::dimension, packet.entity); + client::create_player(globals::dimension, packet.entity); globals::player = packet.entity; globals::gui_screen = GUI_SCREEN_NONE; - gui::client_chat::refresh_timings(); + client_chat::refresh_timings(); - gui::window_title::update(); + window_title::update(); } } } diff --git a/src/game/client/resource/sound_effect.cc b/src/game/client/resource/sound_effect.cc index 5bbb949..4cc5b70 100644 --- a/src/game/client/resource/sound_effect.cc +++ b/src/game/client/resource/sound_effect.cc @@ -35,7 +35,7 @@ static const void* sound_effect_load_func(const char* name, std::uint32_t flags) auto file = PHYSFS_openRead(name); if(file == nullptr) { - spdlog::warn("sfx: {}: {}", name, io::physfs_error()); + spdlog::warn("sfx: {}: {}", name, physfs_error()); return nullptr; } diff --git a/src/game/client/screenshot.cc b/src/game/client/screenshot.cc index 9b573ef..d704f47 100644 --- a/src/game/client/screenshot.cc +++ b/src/game/client/screenshot.cc @@ -24,7 +24,7 @@ static void stbi_png_physfs_callback(void* context, void* data, int size) PHYSFS_writeBytes(reinterpret_cast<PHYSFS_File*>(context), data, size); } -static void on_glfw_key(const io::GlfwKeyEvent& event) +static void on_glfw_key(const GlfwKeyEvent& event) { if(!globals::gui_keybind_ptr && !toggles::is_sequence_await) { if(screenshot_key.equals(event.key) && (event.action == GLFW_PRESS)) { @@ -40,7 +40,7 @@ void screenshot::init(void) settings::add_keybind(0, screenshot_key, settings_location::KEYBOARD_MISC, "key.screenshot"); - globals::dispatcher.sink<io::GlfwKeyEvent>().connect<&on_glfw_key>(); + globals::dispatcher.sink<GlfwKeyEvent>().connect<&on_glfw_key>(); } void screenshot::take(void) @@ -77,7 +77,7 @@ void screenshot::take(void) spdlog::info("screenshot: wrote {}", filepath); - gui::client_chat::print(std::format("{} {}", gui::language::resolve("chat.screenshot_message"), filename)); + client_chat::print(std::format("{} {}", language::resolve("chat.screenshot_message"), filename)); PHYSFS_close(file); } diff --git a/src/game/client/session.cc b/src/game/client/session.cc index 36acfb4..94af475 100644 --- a/src/game/client/session.cc +++ b/src/game/client/session.cc @@ -57,7 +57,7 @@ static void on_login_response_packet(const protocol::LoginResponse& packet) set_fixed_tickrate(packet.server_tickrate); - gui::progress_bar::set_title("connecting.loading_world"); + progress_bar::set_title("connecting.loading_world"); } static void on_disconnect_packet(const protocol::Disconnect& packet) @@ -66,7 +66,7 @@ static void on_disconnect_packet(const protocol::Disconnect& packet) spdlog::info("session: disconnected: {}", packet.reason); - gui::client_chat::clear(); + client_chat::clear(); session::peer = nullptr; session::client_index = UINT16_MAX; @@ -82,12 +82,12 @@ static void on_disconnect_packet(const protocol::Disconnect& packet) globals::player = entt::null; globals::dimension = nullptr; - gui::message_box::reset(); - gui::message_box::set_title("disconnected.disconnected"); - gui::message_box::set_subtitle(packet.reason.c_str()); - gui::message_box::add_button("disconnected.back", [](void) { + message_box::reset(); + message_box::set_title("disconnected.disconnected"); + message_box::set_subtitle(packet.reason.c_str()); + message_box::add_button("disconnected.back", [](void) { globals::gui_screen = GUI_PLAY_MENU; - gui::window_title::update(); + window_title::update(); }); globals::gui_screen = GUI_MESSAGE_BOX; @@ -100,18 +100,18 @@ static void on_set_voxel_packet(const protocol::SetVoxel& packet) auto index = coord::to_index(lpos); if(auto chunk = globals::dimension->find_chunk(cpos)) { - auto packet_voxel = world::voxel_registry::find(packet.voxel); + auto packet_voxel = voxel_registry::find(packet.voxel); if(chunk->get_voxel(index) != packet_voxel) { chunk->set_voxel(packet_voxel, index); - world::ChunkUpdateEvent event; + ChunkUpdateEvent event; event.dimension = globals::dimension; event.chunk = chunk; event.cpos = cpos; // Send a generic ChunkUpdate event to shake - // up the mesher; directly calling world::set_voxel + // up the mesher; directly calling set_voxel // here would result in a networked feedback loop // caused by event handler below tripping globals::dispatcher.trigger(event); @@ -122,7 +122,7 @@ static void on_set_voxel_packet(const protocol::SetVoxel& packet) // NOTE: [session] is a good place for this since [receive] // handles entity data sent by the server and [session] handles // everything else network related that is not player movement -static void on_voxel_set(const world::VoxelSetEvent& event) +static void on_voxel_set(const VoxelSetEvent& event) { if(session::peer) { // Propagate changes to the server @@ -151,7 +151,7 @@ void session::init(void) globals::dispatcher.sink<protocol::Disconnect>().connect<&on_disconnect_packet>(); globals::dispatcher.sink<protocol::SetVoxel>().connect<&on_set_voxel_packet>(); - globals::dispatcher.sink<world::VoxelSetEvent>().connect<&on_voxel_set>(); + globals::dispatcher.sink<VoxelSetEvent>().connect<&on_voxel_set>(); } void session::shutdown(void) @@ -168,18 +168,18 @@ void session::invalidate(void) if(session::peer) { enet_peer_reset(session::peer); - gui::message_box::reset(); - gui::message_box::set_title("disconnected.disconnected"); - gui::message_box::set_subtitle("enet.peer_connection_timeout"); - gui::message_box::add_button("disconnected.back", [](void) { + message_box::reset(); + message_box::set_title("disconnected.disconnected"); + message_box::set_subtitle("enet.peer_connection_timeout"); + message_box::add_button("disconnected.back", [](void) { globals::gui_screen = GUI_PLAY_MENU; - gui::window_title::update(); + window_title::update(); }); globals::gui_screen = GUI_MESSAGE_BOX; } - gui::client_chat::clear(); + client_chat::clear(); session::peer = nullptr; session::client_index = UINT16_MAX; @@ -215,12 +215,12 @@ void session::connect(std::string_view host, std::uint16_t port, std::string_vie if(!session::peer) { server_password_hash = UINT64_MAX; - gui::message_box::reset(); - gui::message_box::set_title("disconnected.disconnected"); - gui::message_box::set_subtitle("enet.peer_connection_failed"); - gui::message_box::add_button("disconnected.back", [](void) { + message_box::reset(); + message_box::set_title("disconnected.disconnected"); + message_box::set_subtitle("enet.peer_connection_failed"); + message_box::add_button("disconnected.back", [](void) { globals::gui_screen = GUI_PLAY_MENU; - gui::window_title::update(); + window_title::update(); }); globals::gui_screen = GUI_MESSAGE_BOX; @@ -228,9 +228,9 @@ void session::connect(std::string_view host, std::uint16_t port, std::string_vie return; } - gui::progress_bar::reset(); - gui::progress_bar::set_title("connecting.connecting"); - gui::progress_bar::set_button("connecting.cancel_button", [](void) { + progress_bar::reset(); + progress_bar::set_title("connecting.connecting"); + progress_bar::set_button("connecting.cancel_button", [](void) { enet_peer_disconnect(session::peer, 0); session::peer = nullptr; @@ -279,7 +279,7 @@ void session::disconnect(std::string_view reason) globals::player = entt::null; globals::dimension = nullptr; - gui::client_chat::clear(); + client_chat::clear(); } } @@ -287,8 +287,8 @@ void session::send_login_request(void) { protocol::LoginRequest packet; packet.game_version_major = version::major; - packet.voxel_registry_checksum = world::voxel_registry::get_checksum(); - packet.item_registry_checksum = world::item_registry::get_checksum(); + packet.voxel_registry_checksum = voxel_registry::get_checksum(); + packet.item_registry_checksum = item_registry::get_checksum(); packet.password_hash = server_password_hash; packet.username = client_game::username.get(); packet.game_version_minor = version::minor; @@ -298,7 +298,7 @@ void session::send_login_request(void) server_password_hash = UINT64_MAX; - gui::progress_bar::set_title("connecting.logging_in"); + progress_bar::set_title("connecting.logging_in"); globals::gui_screen = GUI_PROGRESS_BAR; } diff --git a/src/game/client/sound/sound.cc b/src/game/client/sound/sound.cc index 7dfe562..11c9286 100644 --- a/src/game/client/sound/sound.cc +++ b/src/game/client/sound/sound.cc @@ -157,7 +157,7 @@ void sound::play_generic(resource_ptr<SoundEffect> sound, bool looping, float pi void sound::play_entity(entt::entity entity, resource_ptr<SoundEffect> sound, bool looping, float pitch) { if(globals::dimension && globals::dimension->entities.valid(entity)) { - if(auto emitter = globals::dimension->entities.try_get<entity::SoundEmitter>(entity)) { + if(auto emitter = globals::dimension->entities.try_get<SoundEmitter>(entity)) { alSourceRewind(emitter->source); emitter->sound = sound; diff --git a/src/game/client/toggles.cc b/src/game/client/toggles.cc index 833e099..60b2f25 100644 --- a/src/game/client/toggles.cc +++ b/src/game/client/toggles.cc @@ -27,10 +27,10 @@ static void print_toggle_state(const ToggleInfo& info) { if(info.description.size()) { if(info.is_enabled) { - gui::client_chat::print(std::format("[toggles] {} ON", info.description)); + client_chat::print(std::format("[toggles] {} ON", info.description)); } else { - gui::client_chat::print(std::format("[toggles] {} OFF", info.description)); + client_chat::print(std::format("[toggles] {} OFF", info.description)); } } } @@ -49,7 +49,7 @@ static void toggle_value(ToggleInfo& info, toggle_type type) print_toggle_state(info); } -static void on_glfw_key(const io::GlfwKeyEvent& event) +static void on_glfw_key(const GlfwKeyEvent& event) { if(globals::gui_keybind_ptr) { // The UI keybind subsystem has the authority @@ -76,7 +76,7 @@ static void on_glfw_key(const io::GlfwKeyEvent& event) // This causes the language subsystem // to re-parse the JSON file essentially // causing the game to soft-reload language - gui::language::set(gui::language::get_current()); + language::set(language::get_current()); return; } @@ -115,7 +115,7 @@ void toggles::init(void) toggle_infos[TOGGLE_PM_FLIGHT].glfw_keycode = GLFW_KEY_F; toggle_infos[TOGGLE_PM_FLIGHT].is_enabled = false; - globals::dispatcher.sink<io::GlfwKeyEvent>().connect<&on_glfw_key>(); + globals::dispatcher.sink<GlfwKeyEvent>().connect<&on_glfw_key>(); } void toggles::init_late(void) diff --git a/src/game/client/world/chunk_mesher.cc b/src/game/client/world/chunk_mesher.cc index 5e58760..47ef4cb 100644 --- a/src/game/client/world/chunk_mesher.cc +++ b/src/game/client/world/chunk_mesher.cc @@ -19,7 +19,7 @@ #include "client/globals.hh" #include "client/session.hh" -using QuadBuilder = std::vector<world::ChunkQuad>; +using QuadBuilder = std::vector<ChunkQuad>; using CachedChunkCoord = unsigned short; constexpr static CachedChunkCoord CPOS_ITSELF = 0x0000; @@ -65,14 +65,14 @@ public: virtual void finalize(void) override; private: - bool vis_test(const world::Voxel* voxel, const local_pos& lpos) const; - void push_quad_a(const world::Voxel* voxel, const glm::fvec3& pos, const glm::fvec2& size, world::VoxelFace face); - void push_quad_v(const world::Voxel* voxel, const glm::fvec3& pos, const glm::fvec2& size, world::VoxelFace face, std::size_t entropy); - void make_cube(const world::Voxel* voxel, const local_pos& lpos, world::VoxelVisBits vis, std::size_t entropy); + bool vis_test(const Voxel* voxel, const local_pos& lpos) const; + void push_quad_a(const Voxel* voxel, const glm::fvec3& pos, const glm::fvec2& size, VoxelFace face); + void push_quad_v(const Voxel* voxel, const glm::fvec3& pos, const glm::fvec2& size, VoxelFace face, std::size_t entropy); + void make_cube(const Voxel* voxel, const local_pos& lpos, VoxelVisBits vis, std::size_t entropy); void cache_chunk(const chunk_pos& cpos); private: - std::array<world::VoxelStorage, NUM_CACHED_CPOS> m_cache; + std::array<VoxelStorage, NUM_CACHED_CPOS> m_cache; std::vector<QuadBuilder> m_quads_b; // blending std::vector<QuadBuilder> m_quads_s; // solid entt::entity m_entity; @@ -95,8 +95,8 @@ GL_MeshingTask::GL_MeshingTask(entt::entity entity, const chunk_pos& cpos) void GL_MeshingTask::process(void) { - m_quads_b.resize(world::voxel_atlas::plane_count()); - m_quads_s.resize(world::voxel_atlas::plane_count()); + m_quads_b.resize(voxel_atlas::plane_count()); + m_quads_s.resize(voxel_atlas::plane_count()); const auto& voxels = m_cache.at(CPOS_ITSELF); @@ -108,7 +108,7 @@ void GL_MeshingTask::process(void) } const auto lpos = coord::to_local(i); - const auto voxel = world::voxel_registry::find(voxels[i]); + const auto voxel = voxel_registry::find(voxels[i]); if(voxel == nullptr) { // Either a NULL_VOXEL_ID or something went @@ -119,27 +119,27 @@ void GL_MeshingTask::process(void) unsigned int vis = 0U; if(vis_test(voxel, lpos + DIR_NORTH<local_pos::value_type>)) { - vis |= world::VVIS_NORTH; + vis |= VVIS_NORTH; } if(vis_test(voxel, lpos + DIR_SOUTH<local_pos::value_type>)) { - vis |= world::VVIS_SOUTH; + vis |= VVIS_SOUTH; } if(vis_test(voxel, lpos + DIR_EAST<local_pos::value_type>)) { - vis |= world::VVIS_EAST; + vis |= VVIS_EAST; } if(vis_test(voxel, lpos + DIR_WEST<local_pos::value_type>)) { - vis |= world::VVIS_WEST; + vis |= VVIS_WEST; } if(vis_test(voxel, lpos + DIR_UP<local_pos::value_type>)) { - vis |= world::VVIS_UP; + vis |= VVIS_UP; } if(vis_test(voxel, lpos + DIR_DOWN<local_pos::value_type>)) { - vis |= world::VVIS_DOWN; + vis |= VVIS_DOWN; } const auto vpos = coord::to_voxel(m_cpos, lpos); @@ -147,7 +147,7 @@ void GL_MeshingTask::process(void) const auto entropy = math::crc64(&entropy_src, sizeof(entropy_src)); // FIXME: handle different voxel types - make_cube(voxel, lpos, world::VoxelVisBits(vis), entropy); + make_cube(voxel, lpos, VoxelVisBits(vis), entropy); } } @@ -159,7 +159,7 @@ void GL_MeshingTask::finalize(void) return; } - auto& component = globals::dimension->chunks.emplace_or_replace<world::ChunkMesh>(m_entity); + auto& component = globals::dimension->chunks.emplace_or_replace<ChunkMesh>(m_entity); const std::size_t plane_count_nb = m_quads_s.size(); const std::size_t plane_count_b = m_quads_b.size(); @@ -187,7 +187,7 @@ void GL_MeshingTask::finalize(void) } glBindBuffer(GL_ARRAY_BUFFER, buffer.handle); - glBufferData(GL_ARRAY_BUFFER, sizeof(world::ChunkQuad) * builder.size(), builder.data(), GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(ChunkQuad) * builder.size(), builder.data(), GL_STATIC_DRAW); buffer.size = builder.size(); has_no_submeshes_nb = false; } @@ -210,18 +210,18 @@ void GL_MeshingTask::finalize(void) } glBindBuffer(GL_ARRAY_BUFFER, buffer.handle); - glBufferData(GL_ARRAY_BUFFER, sizeof(world::ChunkQuad) * builder.size(), builder.data(), GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(ChunkQuad) * builder.size(), builder.data(), GL_STATIC_DRAW); buffer.size = builder.size(); has_no_submeshes_b = false; } } if(has_no_submeshes_b && has_no_submeshes_nb) { - globals::dimension->chunks.remove<world::ChunkMesh>(m_entity); + globals::dimension->chunks.remove<ChunkMesh>(m_entity); } } -bool GL_MeshingTask::vis_test(const world::Voxel* voxel, const local_pos& lpos) const +bool GL_MeshingTask::vis_test(const Voxel* voxel, const local_pos& lpos) const { const auto pvpos = coord::to_voxel(m_cpos, lpos); const auto pcpos = coord::to_chunk(pvpos); @@ -230,7 +230,7 @@ bool GL_MeshingTask::vis_test(const world::Voxel* voxel, const local_pos& lpos) const auto cached_cpos = get_cached_cpos(m_cpos, pcpos); const auto& voxels = m_cache.at(cached_cpos); - const auto neighbour = world::voxel_registry::find(voxels[index]); + const auto neighbour = voxel_registry::find(voxels[index]); bool result; @@ -250,25 +250,24 @@ bool GL_MeshingTask::vis_test(const world::Voxel* voxel, const local_pos& lpos) return result; } -void GL_MeshingTask::push_quad_a(const world::Voxel* voxel, const glm::fvec3& pos, const glm::fvec2& size, world::VoxelFace face) +void GL_MeshingTask::push_quad_a(const Voxel* voxel, const glm::fvec3& pos, const glm::fvec2& size, VoxelFace face) { auto cached_offset = voxel->get_cached_face_offset(face); auto cached_plane = voxel->get_cached_face_plane(face); auto& textures = voxel->get_face_textures(face); switch(voxel->get_render_mode()) { - case world::VRENDER_OPAQUE: + case VRENDER_OPAQUE: m_quads_s[cached_plane].push_back(make_chunk_quad(pos, size, face, cached_offset, textures.size())); break; - case world::VRENDER_BLEND: + case VRENDER_BLEND: m_quads_b[cached_plane].push_back(make_chunk_quad(pos, size, face, cached_offset, textures.size())); break; } } -void GL_MeshingTask::push_quad_v(const world::Voxel* voxel, const glm::fvec3& pos, const glm::fvec2& size, world::VoxelFace face, - std::size_t entropy) +void GL_MeshingTask::push_quad_v(const Voxel* voxel, const glm::fvec3& pos, const glm::fvec2& size, VoxelFace face, std::size_t entropy) { auto cached_offset = voxel->get_cached_face_offset(face); auto cached_plane = voxel->get_cached_face_plane(face); @@ -276,69 +275,69 @@ void GL_MeshingTask::push_quad_v(const world::Voxel* voxel, const glm::fvec3& po auto index = entropy % textures.size(); switch(voxel->get_render_mode()) { - case world::VRENDER_OPAQUE: + case VRENDER_OPAQUE: m_quads_s[cached_plane].push_back(make_chunk_quad(pos, size, face, cached_offset + index, 0)); break; - case world::VRENDER_BLEND: + case VRENDER_BLEND: m_quads_b[cached_plane].push_back(make_chunk_quad(pos, size, face, cached_offset + index, 0)); break; } } -void GL_MeshingTask::make_cube(const world::Voxel* voxel, const local_pos& lpos, world::VoxelVisBits vis, std::size_t entropy) +void GL_MeshingTask::make_cube(const Voxel* voxel, const local_pos& lpos, VoxelVisBits vis, std::size_t entropy) { const glm::fvec3 fpos = glm::fvec3(lpos); const glm::fvec2 fsize = glm::fvec2(1.0f, 1.0f); if(voxel->is_animated()) { - if(vis & world::VVIS_NORTH) { - push_quad_a(voxel, fpos, fsize, world::VFACE_NORTH); + if(vis & VVIS_NORTH) { + push_quad_a(voxel, fpos, fsize, VFACE_NORTH); } - if(vis & world::VVIS_SOUTH) { - push_quad_a(voxel, fpos, fsize, world::VFACE_SOUTH); + if(vis & VVIS_SOUTH) { + push_quad_a(voxel, fpos, fsize, VFACE_SOUTH); } - if(vis & world::VVIS_EAST) { - push_quad_a(voxel, fpos, fsize, world::VFACE_EAST); + if(vis & VVIS_EAST) { + push_quad_a(voxel, fpos, fsize, VFACE_EAST); } - if(vis & world::VVIS_WEST) { - push_quad_a(voxel, fpos, fsize, world::VFACE_WEST); + if(vis & VVIS_WEST) { + push_quad_a(voxel, fpos, fsize, VFACE_WEST); } - if(vis & world::VVIS_UP) { - push_quad_a(voxel, fpos, fsize, world::VFACE_TOP); + if(vis & VVIS_UP) { + push_quad_a(voxel, fpos, fsize, VFACE_TOP); } - if(vis & world::VVIS_DOWN) { - push_quad_a(voxel, fpos, fsize, world::VFACE_BOTTOM); + if(vis & VVIS_DOWN) { + push_quad_a(voxel, fpos, fsize, VFACE_BOTTOM); } } else { - if(vis & world::VVIS_NORTH) { - push_quad_v(voxel, fpos, fsize, world::VFACE_NORTH, entropy); + if(vis & VVIS_NORTH) { + push_quad_v(voxel, fpos, fsize, VFACE_NORTH, entropy); } - if(vis & world::VVIS_SOUTH) { - push_quad_v(voxel, fpos, fsize, world::VFACE_SOUTH, entropy); + if(vis & VVIS_SOUTH) { + push_quad_v(voxel, fpos, fsize, VFACE_SOUTH, entropy); } - if(vis & world::VVIS_EAST) { - push_quad_v(voxel, fpos, fsize, world::VFACE_EAST, entropy); + if(vis & VVIS_EAST) { + push_quad_v(voxel, fpos, fsize, VFACE_EAST, entropy); } - if(vis & world::VVIS_WEST) { - push_quad_v(voxel, fpos, fsize, world::VFACE_WEST, entropy); + if(vis & VVIS_WEST) { + push_quad_v(voxel, fpos, fsize, VFACE_WEST, entropy); } - if(vis & world::VVIS_UP) { - push_quad_v(voxel, fpos, fsize, world::VFACE_TOP, entropy); + if(vis & VVIS_UP) { + push_quad_v(voxel, fpos, fsize, VFACE_TOP, entropy); } - if(vis & world::VVIS_DOWN) { - push_quad_v(voxel, fpos, fsize, world::VFACE_BOTTOM, entropy); + if(vis & VVIS_DOWN) { + push_quad_v(voxel, fpos, fsize, VFACE_BOTTOM, entropy); } } } @@ -356,7 +355,7 @@ void GL_MeshingTask::cache_chunk(const chunk_pos& cpos) // Bogus internal flag component struct NeedsMeshingComponent final {}; -static void on_chunk_create(const world::ChunkCreateEvent& event) +static void on_chunk_create(const ChunkCreateEvent& event) { const std::array<chunk_pos, 6> neighbours = { event.cpos + DIR_NORTH<chunk_pos::value_type>, @@ -370,14 +369,14 @@ static void on_chunk_create(const world::ChunkCreateEvent& event) globals::dimension->chunks.emplace_or_replace<NeedsMeshingComponent>(event.chunk->get_entity()); for(const chunk_pos& cpos : neighbours) { - if(const world::Chunk* chunk = globals::dimension->find_chunk(cpos)) { + if(const Chunk* chunk = globals::dimension->find_chunk(cpos)) { globals::dimension->chunks.emplace_or_replace<NeedsMeshingComponent>(chunk->get_entity()); continue; } } } -static void on_chunk_update(const world::ChunkUpdateEvent& event) +static void on_chunk_update(const ChunkUpdateEvent& event) { const std::array<chunk_pos, 6> neighbours = { event.cpos + DIR_NORTH<chunk_pos::value_type>, @@ -391,14 +390,14 @@ static void on_chunk_update(const world::ChunkUpdateEvent& event) globals::dimension->chunks.emplace_or_replace<NeedsMeshingComponent>(event.chunk->get_entity()); for(const chunk_pos& cpos : neighbours) { - if(const world::Chunk* chunk = globals::dimension->find_chunk(cpos)) { + if(const Chunk* chunk = globals::dimension->find_chunk(cpos)) { globals::dimension->chunks.emplace_or_replace<NeedsMeshingComponent>(chunk->get_entity()); continue; } } } -static void on_voxel_set(const world::VoxelSetEvent& event) +static void on_voxel_set(const VoxelSetEvent& event) { globals::dimension->chunks.emplace_or_replace<NeedsMeshingComponent>(event.chunk->get_entity()); @@ -420,25 +419,25 @@ static void on_voxel_set(const world::VoxelSetEvent& event) } for(const chunk_pos& cpos : neighbours) { - if(const world::Chunk* chunk = globals::dimension->find_chunk(cpos)) { + if(const Chunk* chunk = globals::dimension->find_chunk(cpos)) { globals::dimension->chunks.emplace_or_replace<NeedsMeshingComponent>(chunk->get_entity()); continue; } } } -void world::chunk_mesher::init(void) +void chunk_mesher::init(void) { globals::dispatcher.sink<ChunkCreateEvent>().connect<&on_chunk_create>(); globals::dispatcher.sink<ChunkUpdateEvent>().connect<&on_chunk_update>(); globals::dispatcher.sink<VoxelSetEvent>().connect<&on_voxel_set>(); } -void world::chunk_mesher::shutdown(void) +void chunk_mesher::shutdown(void) { } -void world::chunk_mesher::update(void) +void chunk_mesher::update(void) { if(session::is_ingame()) { const auto group = globals::dimension->chunks.group<NeedsMeshingComponent>(entt::get<ChunkComponent>); diff --git a/src/game/client/world/chunk_mesher.hh b/src/game/client/world/chunk_mesher.hh index cb0c7c5..d3ead5c 100644 --- a/src/game/client/world/chunk_mesher.hh +++ b/src/game/client/world/chunk_mesher.hh @@ -2,17 +2,14 @@ #include "client/world/chunk_vbo.hh" -namespace world -{ struct ChunkMesh final { std::vector<ChunkVBO> quad_nb; std::vector<ChunkVBO> quad_b; }; -} // namespace world -namespace world::chunk_mesher +namespace chunk_mesher { void init(void); void shutdown(void); void update(void); -} // namespace world::chunk_mesher +} // namespace chunk_mesher diff --git a/src/game/client/world/chunk_quad.hh b/src/game/client/world/chunk_quad.hh index 01ed5f2..a28193a 100644 --- a/src/game/client/world/chunk_quad.hh +++ b/src/game/client/world/chunk_quad.hh @@ -4,15 +4,10 @@ #include "shared/world/voxel_registry.hh" -namespace world -{ // [0] XXXXXXXXYYYYYYYYZZZZZZZZWWWWHHHH // [1] FFFFTTTTTTTTTTTAAAAA------------ using ChunkQuad = std::array<std::uint32_t, 2>; -} // namespace world -namespace world -{ constexpr inline static ChunkQuad make_chunk_quad(const glm::fvec3& position, const glm::fvec2& size, VoxelFace face, std::size_t texture, std::size_t frames) { @@ -38,4 +33,3 @@ constexpr inline static ChunkQuad make_chunk_quad(const glm::fvec3& position, co return result; } -} // namespace world diff --git a/src/game/client/world/chunk_renderer.cc b/src/game/client/world/chunk_renderer.cc index 573d1b7..ea85eee 100644 --- a/src/game/client/world/chunk_renderer.cc +++ b/src/game/client/world/chunk_renderer.cc @@ -45,7 +45,7 @@ static std::size_t u_quad_textures; static GLuint quad_vaobj; static GLuint quad_vbo; -void world::chunk_renderer::init(void) +void chunk_renderer::init(void) { globals::client_config.add_value("chunk_renderer.depth_sort_chunks", depth_sort_chunks); @@ -82,14 +82,14 @@ void world::chunk_renderer::init(void) glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(glm::fvec3), nullptr); } -void world::chunk_renderer::shutdown(void) +void chunk_renderer::shutdown(void) { glDeleteBuffers(1, &quad_vbo); glDeleteVertexArrays(1, &quad_vaobj); quad_program.destroy(); } -void world::chunk_renderer::render(void) +void chunk_renderer::render(void) { glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); @@ -115,17 +115,17 @@ void world::chunk_renderer::render(void) GLuint timings[3]; timings[0] = static_cast<GLuint>(globals::window_frametime); timings[1] = static_cast<GLuint>(globals::window_frametime_avg); - timings[2] = static_cast<GLuint>(world::voxel_anims::frame); + timings[2] = static_cast<GLuint>(voxel_anims::frame); - const auto group = globals::dimension->chunks.group<ChunkComponent>(entt::get<world::ChunkMesh>); + const auto group = globals::dimension->chunks.group<ChunkComponent>(entt::get<ChunkMesh>); if(depth_sort_chunks.get_value()) { // FIXME: speed! sorting every frame doesn't look // like a good idea. Can we store the group elsewhere and // still have all the up-to-date chunk things inside? group.sort([](entt::entity ea, entt::entity eb) { - const auto dir_a = globals::dimension->chunks.get<ChunkComponent>(ea).cpos - entity::camera::position_chunk; - const auto dir_b = globals::dimension->chunks.get<ChunkComponent>(eb).cpos - entity::camera::position_chunk; + const auto dir_a = globals::dimension->chunks.get<ChunkComponent>(ea).cpos - camera::position_chunk; + const auto dir_b = globals::dimension->chunks.get<ChunkComponent>(eb).cpos - camera::position_chunk; const auto da = dir_a[0] * dir_a[0] + dir_a[1] * dir_a[1] + dir_a[2] * dir_a[2]; const auto db = dir_b[0] * dir_b[0] + dir_b[1] * dir_b[1] + dir_b[2] * dir_b[2]; @@ -134,18 +134,18 @@ void world::chunk_renderer::render(void) }); } - for(std::size_t plane_id = 0; plane_id < world::voxel_atlas::plane_count(); ++plane_id) { + for(std::size_t plane_id = 0; plane_id < voxel_atlas::plane_count(); ++plane_id) { glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D_ARRAY, world::voxel_atlas::plane_texture(plane_id)); + glBindTexture(GL_TEXTURE_2D_ARRAY, voxel_atlas::plane_texture(plane_id)); glBindVertexArray(quad_vaobj); glUseProgram(quad_program.handle); - glUniformMatrix4fv(quad_program.uniforms[u_quad_vproj_matrix].location, 1, false, glm::value_ptr(entity::camera::matrix)); + glUniformMatrix4fv(quad_program.uniforms[u_quad_vproj_matrix].location, 1, false, glm::value_ptr(camera::matrix)); glUniform3uiv(quad_program.uniforms[u_quad_timings].location, 1, timings); - glUniform4fv(quad_program.uniforms[u_quad_fog_color].location, 1, glm::value_ptr(world::skybox::fog_color)); + glUniform4fv(quad_program.uniforms[u_quad_fog_color].location, 1, glm::value_ptr(skybox::fog_color)); glUniform1f(quad_program.uniforms[u_quad_view_distance].location, - static_cast<GLfloat>(entity::camera::view_distance.get_value() * CHUNK_SIZE)); + static_cast<GLfloat>(camera::view_distance.get_value() * CHUNK_SIZE)); glUniform1i(quad_program.uniforms[u_quad_textures].location, 0); // GL_TEXTURE0 glDisable(GL_BLEND); @@ -156,7 +156,7 @@ void world::chunk_renderer::render(void) for(const auto [entity, chunk, mesh] : group.each()) { if(plane_id < mesh.quad_nb.size() && mesh.quad_nb[plane_id].handle && mesh.quad_nb[plane_id].size) { - const auto wpos = coord::to_fvec3(chunk.cpos - entity::camera::position_chunk); + const auto wpos = coord::to_fvec3(chunk.cpos - camera::position_chunk); glUniform3fv(quad_program.uniforms[u_quad_world_position].location, 1, glm::value_ptr(wpos)); glBindBuffer(GL_ARRAY_BUFFER, mesh.quad_nb[plane_id].handle); @@ -177,7 +177,7 @@ void world::chunk_renderer::render(void) for(const auto [entity, chunk, mesh] : group.each()) { if(plane_id < mesh.quad_b.size() && mesh.quad_b[plane_id].handle && mesh.quad_b[plane_id].size) { - const auto wpos = coord::to_fvec3(chunk.cpos - entity::camera::position_chunk); + const auto wpos = coord::to_fvec3(chunk.cpos - camera::position_chunk); glUniform3fv(quad_program.uniforms[u_quad_world_position].location, 1, glm::value_ptr(wpos)); glBindBuffer(GL_ARRAY_BUFFER, mesh.quad_b[plane_id].handle); @@ -195,11 +195,11 @@ void world::chunk_renderer::render(void) } if(toggles::get(TOGGLE_CHUNK_AABB)) { - world::outline::prepare(); + outline::prepare(); for(const auto [entity, chunk, mesh] : group.each()) { const auto size = glm::fvec3(CHUNK_SIZE, CHUNK_SIZE, CHUNK_SIZE); - world::outline::cube(chunk.cpos, glm::fvec3(0.0f, 0.0f, 0.0f), size, 1.0f, glm::fvec4(1.0f, 1.0f, 0.0f, 1.0f)); + outline::cube(chunk.cpos, glm::fvec3(0.0f, 0.0f, 0.0f), size, 1.0f, glm::fvec4(1.0f, 1.0f, 0.0f, 1.0f)); } } } diff --git a/src/game/client/world/chunk_renderer.hh b/src/game/client/world/chunk_renderer.hh index 2b73225..53272a4 100644 --- a/src/game/client/world/chunk_renderer.hh +++ b/src/game/client/world/chunk_renderer.hh @@ -1,8 +1,8 @@ #pragma once -namespace world::chunk_renderer +namespace chunk_renderer { void init(void); void shutdown(void); void render(void); -} // namespace world::chunk_renderer +} // namespace chunk_renderer diff --git a/src/game/client/world/chunk_vbo.hh b/src/game/client/world/chunk_vbo.hh index 175b34f..da8270e 100644 --- a/src/game/client/world/chunk_vbo.hh +++ b/src/game/client/world/chunk_vbo.hh @@ -1,7 +1,5 @@ #pragma once -namespace world -{ class ChunkVBO final { public: std::size_t size; @@ -19,4 +17,3 @@ public: } } }; -} // namespace world diff --git a/src/game/client/world/chunk_visibility.cc b/src/game/client/world/chunk_visibility.cc index 871c04b..5af2901 100644 --- a/src/game/client/world/chunk_visibility.cc +++ b/src/game/client/world/chunk_visibility.cc @@ -23,8 +23,8 @@ // we throttle the client's ever increasing itch for new chunks constexpr static unsigned int MAX_CHUNKS_REQUESTS_PER_FRAME = 16U; -static world::ChunkAABB current_view_box; -static world::ChunkAABB previous_view_box; +static ChunkAABB current_view_box; +static ChunkAABB previous_view_box; static std::vector<chunk_pos> requests; static void update_requests(void) @@ -42,16 +42,16 @@ static void update_requests(void) } std::sort(requests.begin(), requests.end(), [](const chunk_pos& cpos_a, const chunk_pos& cpos_b) { - auto da = math::distance2(cpos_a, entity::camera::position_chunk); - auto db = math::distance2(cpos_b, entity::camera::position_chunk); + auto da = math::distance2(cpos_a, camera::position_chunk); + auto db = math::distance2(cpos_b, camera::position_chunk); return da > db; }); } -void world::chunk_visibility::update_late(void) +void chunk_visibility::update_late(void) { - current_view_box.min = entity::camera::position_chunk - static_cast<chunk_pos::value_type>(entity::camera::view_distance.get_value()); - current_view_box.max = entity::camera::position_chunk + static_cast<chunk_pos::value_type>(entity::camera::view_distance.get_value()); + current_view_box.min = camera::position_chunk - static_cast<chunk_pos::value_type>(camera::view_distance.get_value()); + current_view_box.max = camera::position_chunk + static_cast<chunk_pos::value_type>(camera::view_distance.get_value()); if(!session::is_ingame()) { // This makes sure the previous view box diff --git a/src/game/client/world/chunk_visibility.hh b/src/game/client/world/chunk_visibility.hh index 8d1f3cd..d0b4487 100644 --- a/src/game/client/world/chunk_visibility.hh +++ b/src/game/client/world/chunk_visibility.hh @@ -1,6 +1,6 @@ #pragma once -namespace world::chunk_visibility +namespace chunk_visibility { void update_late(void); -} // namespace world::chunk_visibility +} // namespace chunk_visibility diff --git a/src/game/client/world/outline.cc b/src/game/client/world/outline.cc index 763debf..d4980c2 100644 --- a/src/game/client/world/outline.cc +++ b/src/game/client/world/outline.cc @@ -28,7 +28,7 @@ static GLuint vaobj; static GLuint cube_vbo; static GLuint line_vbo; -void world::outline::init(void) +void outline::init(void) { if(!program.setup("shaders/outline.vert", "shaders/outline.frag")) { spdlog::critical("outline: program setup failed"); @@ -90,7 +90,7 @@ void world::outline::init(void) glVertexAttribDivisor(0, 0); } -void world::outline::shutdown(void) +void outline::shutdown(void) { glDeleteVertexArrays(1, &vaobj); glDeleteBuffers(1, &line_vbo); @@ -98,7 +98,7 @@ void world::outline::shutdown(void) program.destroy(); } -void world::outline::prepare(void) +void outline::prepare(void) { program.set_variant_vert(WORLD_CURVATURE, client_game::world_curvature.get_value()); @@ -111,17 +111,17 @@ void world::outline::prepare(void) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glUseProgram(program.handle); - glUniformMatrix4fv(program.uniforms[u_vpmatrix].location, 1, false, glm::value_ptr(entity::camera::matrix)); - glUniform1f(program.uniforms[u_viewdist].location, static_cast<GLfloat>(CHUNK_SIZE * entity::camera::view_distance.get_value())); + glUniformMatrix4fv(program.uniforms[u_vpmatrix].location, 1, false, glm::value_ptr(camera::matrix)); + glUniform1f(program.uniforms[u_viewdist].location, static_cast<GLfloat>(CHUNK_SIZE * camera::view_distance.get_value())); glBindVertexArray(vaobj); glEnableVertexAttribArray(0); glVertexAttribDivisor(0, 0); } -void world::outline::cube(const chunk_pos& cpos, const glm::fvec3& fpos, const glm::fvec3& size, float thickness, const glm::fvec4& color) +void outline::cube(const chunk_pos& cpos, const glm::fvec3& fpos, const glm::fvec3& size, float thickness, const glm::fvec4& color) { - auto patch_cpos = cpos - entity::camera::position_chunk; + auto patch_cpos = cpos - camera::position_chunk; glLineWidth(thickness); @@ -134,9 +134,9 @@ void world::outline::cube(const chunk_pos& cpos, const glm::fvec3& fpos, const g glDrawArrays(GL_LINES, 0, 24); } -void world::outline::line(const chunk_pos& cpos, const glm::fvec3& fpos, const glm::fvec3& size, float thickness, const glm::fvec4& color) +void outline::line(const chunk_pos& cpos, const glm::fvec3& fpos, const glm::fvec3& size, float thickness, const glm::fvec4& color) { - auto patch_cpos = cpos - entity::camera::position_chunk; + auto patch_cpos = cpos - camera::position_chunk; glLineWidth(thickness); diff --git a/src/game/client/world/outline.hh b/src/game/client/world/outline.hh index 2456a32..8fdfdeb 100644 --- a/src/game/client/world/outline.hh +++ b/src/game/client/world/outline.hh @@ -2,15 +2,15 @@ #include "shared/types.hh" -namespace world::outline +namespace outline { void init(void); void shutdown(void); void prepare(void); -} // namespace world::outline +} // namespace outline -namespace world::outline +namespace outline { void cube(const chunk_pos& cpos, const glm::fvec3& fpos, const glm::fvec3& size, float thickness, const glm::fvec4& color); void line(const chunk_pos& cpos, const glm::fvec3& fpos, const glm::fvec3& size, float thickness, const glm::fvec4& color); -} // namespace world::outline +} // namespace outline diff --git a/src/game/client/world/player_target.cc b/src/game/client/world/player_target.cc index 5969381..c8a7583 100644 --- a/src/game/client/world/player_target.cc +++ b/src/game/client/world/player_target.cc @@ -16,49 +16,49 @@ constexpr static float MAX_REACH = 16.0f; -voxel_pos world::player_target::coord; -voxel_pos world::player_target::normal; -const world::Voxel* world::player_target::voxel; +voxel_pos player_target::coord; +voxel_pos player_target::normal; +const Voxel* player_target::voxel; -void world::player_target::init(void) +void player_target::init(void) { - world::player_target::coord = voxel_pos(); - world::player_target::normal = voxel_pos(); - world::player_target::voxel = nullptr; + player_target::coord = voxel_pos(); + player_target::normal = voxel_pos(); + player_target::voxel = nullptr; } -void world::player_target::update(void) +void player_target::update(void) { if(session::is_ingame()) { - RayDDA ray(globals::dimension, entity::camera::position_chunk, entity::camera::position_local, entity::camera::direction); + RayDDA ray(globals::dimension, camera::position_chunk, camera::position_local, camera::direction); do { - world::player_target::voxel = ray.step(); + player_target::voxel = ray.step(); - if(world::player_target::voxel) { - world::player_target::coord = ray.vpos; - world::player_target::normal = ray.vnormal; + if(player_target::voxel) { + player_target::coord = ray.vpos; + player_target::normal = ray.vnormal; break; } - world::player_target::coord = voxel_pos(); - world::player_target::normal = voxel_pos(); + player_target::coord = voxel_pos(); + player_target::normal = voxel_pos(); } while(ray.distance < MAX_REACH); } else { - world::player_target::voxel = nullptr; - world::player_target::coord = voxel_pos(); - world::player_target::normal = voxel_pos(); + player_target::voxel = nullptr; + player_target::coord = voxel_pos(); + player_target::normal = voxel_pos(); } } -void world::player_target::render(void) +void player_target::render(void) { - if(world::player_target::voxel && !client_game::hide_hud) { - auto cpos = coord::to_chunk(world::player_target::coord); - auto fpos = coord::to_local(world::player_target::coord); + if(player_target::voxel && !client_game::hide_hud) { + auto cpos = coord::to_chunk(player_target::coord); + auto fpos = coord::to_local(player_target::coord); - world::outline::prepare(); - world::outline::cube(cpos, glm::fvec3(fpos), glm::fvec3(1.0f), 2.0f, glm::fvec4(0.0f, 0.0f, 0.0f, 1.0f)); + outline::prepare(); + outline::cube(cpos, glm::fvec3(fpos), glm::fvec3(1.0f), 2.0f, glm::fvec4(0.0f, 0.0f, 0.0f, 1.0f)); } } diff --git a/src/game/client/world/player_target.hh b/src/game/client/world/player_target.hh index 175be02..2c8bd22 100644 --- a/src/game/client/world/player_target.hh +++ b/src/game/client/world/player_target.hh @@ -2,16 +2,16 @@ #include "shared/world/voxel_registry.hh" -namespace world::player_target +namespace player_target { extern voxel_pos coord; extern voxel_pos normal; extern const Voxel* voxel; -} // namespace world::player_target +} // namespace player_target -namespace world::player_target +namespace player_target { void init(void); void update(void); void render(void); -} // namespace world::player_target +} // namespace player_target diff --git a/src/game/client/world/skybox.cc b/src/game/client/world/skybox.cc index 5e52fa4..393c260 100644 --- a/src/game/client/world/skybox.cc +++ b/src/game/client/world/skybox.cc @@ -2,10 +2,10 @@ #include "client/world/skybox.hh" -glm::fvec3 world::skybox::fog_color; +glm::fvec3 skybox::fog_color; -void world::skybox::init(void) +void skybox::init(void) { // https://convertingcolors.com/hex-color-B1F3FF.html - world::skybox::fog_color = glm::fvec3(0.690f, 0.950f, 1.000f); + skybox::fog_color = glm::fvec3(0.690f, 0.950f, 1.000f); } diff --git a/src/game/client/world/skybox.hh b/src/game/client/world/skybox.hh index 40113cd..d90336a 100644 --- a/src/game/client/world/skybox.hh +++ b/src/game/client/world/skybox.hh @@ -1,11 +1,11 @@ #pragma once -namespace world::skybox +namespace skybox { extern glm::fvec3 fog_color; -} // namespace world::skybox +} // namespace skybox -namespace world::skybox +namespace skybox { void init(void); -} // namespace world::skybox +} // namespace skybox diff --git a/src/game/client/world/voxel_anims.cc b/src/game/client/world/voxel_anims.cc index 3d7cfd4..2286027 100644 --- a/src/game/client/world/voxel_anims.cc +++ b/src/game/client/world/voxel_anims.cc @@ -12,22 +12,21 @@ static config::Unsigned base_framerate(16U, 1U, 16U); -std::uint64_t world::voxel_anims::nextframe = 0U; -std::uint32_t world::voxel_anims::frame = 0U; +std::uint64_t voxel_anims::nextframe = 0U; +std::uint32_t voxel_anims::frame = 0U; -void world::voxel_anims::init(void) +void voxel_anims::init(void) { globals::client_config.add_value("voxel_anims.base_framerate", base_framerate); - world::voxel_anims::nextframe = 0U; - world::voxel_anims::frame = 0U; + voxel_anims::nextframe = 0U; + voxel_anims::frame = 0U; } -void world::voxel_anims::update(void) +void voxel_anims::update(void) { - if(globals::curtime >= world::voxel_anims::nextframe) { - world::voxel_anims::nextframe = globals::curtime - + static_cast<std::uint64_t>(1000000.0 / static_cast<float>(base_framerate.get_value())); - world::voxel_anims::frame += 1U; + if(globals::curtime >= voxel_anims::nextframe) { + voxel_anims::nextframe = globals::curtime + static_cast<std::uint64_t>(1000000.0 / static_cast<float>(base_framerate.get_value())); + voxel_anims::frame += 1U; } } diff --git a/src/game/client/world/voxel_anims.hh b/src/game/client/world/voxel_anims.hh index 0d8a0d0..63a4fc1 100644 --- a/src/game/client/world/voxel_anims.hh +++ b/src/game/client/world/voxel_anims.hh @@ -1,13 +1,13 @@ #pragma once -namespace world::voxel_anims +namespace voxel_anims { extern std::uint64_t nextframe; extern std::uint32_t frame; -} // namespace world::voxel_anims +} // namespace voxel_anims -namespace world::voxel_anims +namespace voxel_anims { void init(void); void update(void); -} // namespace world::voxel_anims +} // namespace voxel_anims diff --git a/src/game/client/world/voxel_atlas.cc b/src/game/client/world/voxel_atlas.cc index 4307dad..9762998 100644 --- a/src/game/client/world/voxel_atlas.cc +++ b/src/game/client/world/voxel_atlas.cc @@ -10,7 +10,7 @@ struct AtlasPlane final { std::unordered_map<std::size_t, std::size_t> lookup; - std::vector<world::AtlasStrip> strips; + std::vector<AtlasStrip> strips; std::size_t layer_count_max; std::size_t layer_count; std::size_t plane_id; @@ -46,7 +46,7 @@ static void plane_setup(AtlasPlane& plane) glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT); } -static world::AtlasStrip* plane_lookup(AtlasPlane& plane, std::size_t hash_value) +static AtlasStrip* plane_lookup(AtlasPlane& plane, std::size_t hash_value) { const auto it = plane.lookup.find(hash_value); @@ -57,9 +57,9 @@ static world::AtlasStrip* plane_lookup(AtlasPlane& plane, std::size_t hash_value return nullptr; } -static world::AtlasStrip* plane_new_strip(AtlasPlane& plane, const std::vector<std::string>& paths, std::size_t hash_value) +static AtlasStrip* plane_new_strip(AtlasPlane& plane, const std::vector<std::string>& paths, std::size_t hash_value) { - world::AtlasStrip strip = {}; + AtlasStrip strip = {}; strip.offset = plane.layer_count; strip.plane = plane.plane_id; @@ -86,7 +86,7 @@ static world::AtlasStrip* plane_new_strip(AtlasPlane& plane, const std::vector<s return &plane.strips[index]; } -void world::voxel_atlas::create(int width, int height, std::size_t count) +void voxel_atlas::create(int width, int height, std::size_t count) { GLint max_plane_layers; @@ -115,7 +115,7 @@ void world::voxel_atlas::create(int width, int height, std::size_t count) spdlog::debug("voxel_atlas: max_plane_layers={}", max_plane_layers); } -void world::voxel_atlas::destroy(void) +void voxel_atlas::destroy(void) { for(const AtlasPlane& plane : planes) glDeleteTextures(1, &plane.gl_texture); @@ -124,12 +124,12 @@ void world::voxel_atlas::destroy(void) planes.clear(); } -std::size_t world::voxel_atlas::plane_count(void) +std::size_t voxel_atlas::plane_count(void) { return planes.size(); } -GLuint world::voxel_atlas::plane_texture(std::size_t plane_id) +GLuint voxel_atlas::plane_texture(std::size_t plane_id) { if(plane_id < planes.size()) { return planes[plane_id].gl_texture; @@ -139,7 +139,7 @@ GLuint world::voxel_atlas::plane_texture(std::size_t plane_id) } } -void world::voxel_atlas::generate_mipmaps(void) +void voxel_atlas::generate_mipmaps(void) { for(const AtlasPlane& plane : planes) { glBindTexture(GL_TEXTURE_2D_ARRAY, plane.gl_texture); @@ -147,7 +147,7 @@ void world::voxel_atlas::generate_mipmaps(void) } } -world::AtlasStrip* world::voxel_atlas::find_or_load(const std::vector<std::string>& paths) +AtlasStrip* voxel_atlas::find_or_load(const std::vector<std::string>& paths) { const std::size_t hash_value = vector_hash(paths); @@ -170,7 +170,7 @@ world::AtlasStrip* world::voxel_atlas::find_or_load(const std::vector<std::strin return nullptr; } -world::AtlasStrip* world::voxel_atlas::find(const std::vector<std::string>& paths) +AtlasStrip* voxel_atlas::find(const std::vector<std::string>& paths) { const std::size_t hash_value = vector_hash(paths); diff --git a/src/game/client/world/voxel_atlas.hh b/src/game/client/world/voxel_atlas.hh index 70e8a1e..acfcfbd 100644 --- a/src/game/client/world/voxel_atlas.hh +++ b/src/game/client/world/voxel_atlas.hh @@ -1,28 +1,25 @@ #pragma once -namespace world -{ struct AtlasStrip final { std::size_t offset; std::size_t plane; }; -} // namespace world -namespace world::voxel_atlas +namespace voxel_atlas { void create(int width, int height, std::size_t count); void destroy(void); -} // namespace world::voxel_atlas +} // namespace voxel_atlas -namespace world::voxel_atlas +namespace voxel_atlas { std::size_t plane_count(void); GLuint plane_texture(std::size_t plane_id); void generate_mipmaps(void); -} // namespace world::voxel_atlas +} // namespace voxel_atlas -namespace world::voxel_atlas +namespace voxel_atlas { AtlasStrip* find_or_load(const std::vector<std::string>& paths); AtlasStrip* find(const std::vector<std::string>& paths); -} // namespace world::voxel_atlas +} // namespace voxel_atlas diff --git a/src/game/client/world/voxel_sounds.cc b/src/game/client/world/voxel_sounds.cc index 42552f5..b60df94 100644 --- a/src/game/client/world/voxel_sounds.cc +++ b/src/game/client/world/voxel_sounds.cc @@ -4,21 +4,21 @@ #include "client/resource/sound_effect.hh" -static std::vector<resource_ptr<SoundEffect>> footsteps_sounds[world::VMAT_COUNT]; +static std::vector<resource_ptr<SoundEffect>> footsteps_sounds[VMAT_COUNT]; static std::mt19937_64 randomizer; -static void add_footsteps_effect(world::VoxelMaterial material, std::string_view name) +static void add_footsteps_effect(VoxelMaterial material, std::string_view name) { if(auto effect = resource::load<SoundEffect>(name)) { footsteps_sounds[material].push_back(effect); } } -static resource_ptr<SoundEffect> get_footsteps_effect(world::VoxelMaterial material) +static resource_ptr<SoundEffect> get_footsteps_effect(VoxelMaterial material) { auto surface_index = static_cast<std::size_t>(material); - if(surface_index >= world::VMAT_COUNT) { + if(surface_index >= VMAT_COUNT) { // Surface index out of range return nullptr; } @@ -34,7 +34,7 @@ static resource_ptr<SoundEffect> get_footsteps_effect(world::VoxelMaterial mater return sounds.at(dist(randomizer)); } -void world::voxel_sounds::init(void) +void voxel_sounds::init(void) { add_footsteps_effect(VMAT_DEFAULT, "sounds/surface/default1.wav"); add_footsteps_effect(VMAT_DEFAULT, "sounds/surface/default2.wav"); @@ -57,14 +57,14 @@ void world::voxel_sounds::init(void) add_footsteps_effect(VMAT_WOOD, "sounds/surface/wood3.wav"); } -void world::voxel_sounds::shutdown(void) +void voxel_sounds::shutdown(void) { - for(std::size_t i = 0; i < world::VMAT_COUNT; ++i) { + for(std::size_t i = 0; i < VMAT_COUNT; ++i) { footsteps_sounds[i].clear(); } } -resource_ptr<SoundEffect> world::voxel_sounds::get_footsteps(world::VoxelMaterial material) +resource_ptr<SoundEffect> voxel_sounds::get_footsteps(VoxelMaterial material) { if(auto effect = get_footsteps_effect(material)) { return effect; @@ -77,7 +77,7 @@ resource_ptr<SoundEffect> world::voxel_sounds::get_footsteps(world::VoxelMateria return nullptr; } -resource_ptr<SoundEffect> world::voxel_sounds::get_placebreak(world::VoxelMaterial material) +resource_ptr<SoundEffect> voxel_sounds::get_placebreak(VoxelMaterial material) { return nullptr; } diff --git a/src/game/client/world/voxel_sounds.hh b/src/game/client/world/voxel_sounds.hh index dc02cbd..1b14698 100644 --- a/src/game/client/world/voxel_sounds.hh +++ b/src/game/client/world/voxel_sounds.hh @@ -6,14 +6,14 @@ struct SoundEffect; -namespace world::voxel_sounds +namespace voxel_sounds { void init(void); void shutdown(void); -} // namespace world::voxel_sounds +} // namespace voxel_sounds -namespace world::voxel_sounds +namespace voxel_sounds { resource_ptr<SoundEffect> get_footsteps(VoxelMaterial material); resource_ptr<SoundEffect> get_placebreak(VoxelMaterial material); -} // namespace world::voxel_sounds +} // namespace voxel_sounds |
