This repository has been archived on 2022-05-21. You can view files and clone it, but cannot push or open issues or pull requests.
LEFTONE/core/loui/ui.c

131 lines
2.9 KiB
C

#include "./ui.h"
#include <assert.h>
#include <stdbool.h>
#include <stddef.h>
#include "core/locommon/easing.h"
#include "core/locommon/input.h"
#include "core/locommon/screen.h"
#include "core/locommon/ticker.h"
#include "core/loplayer/player.h"
#include "core/loresource/set.h"
#include "core/loshader/set.h"
#include "core/loworld/chunk.h"
#include "core/loworld/view.h"
#include "./combat.h"
#include "./event.h"
#include "./hud.h"
#include "./menu.h"
#define FADE_SPEED_ 4
void loui_initialize(
loui_t* ui,
loresource_set_t* res,
loshader_set_t* shaders,
const locommon_screen_t* screen,
const locommon_ticker_t* ticker,
loplayer_t* player,
const loworld_view_t* view) {
assert(ui != NULL);
assert(res != NULL);
assert(shaders != NULL);
assert(ticker != NULL);
assert(player != NULL);
assert(view != NULL);
assert(locommon_screen_valid(screen));
*ui = (typeof(*ui)) {
.ticker = ticker,
.view = view,
};
loui_combat_initialize(
&ui->combat,
shaders,
ticker,
player);
loui_hud_initialize(
&ui->hud,
res,
shaders,
screen,
ticker,
player);
loui_popup_initialize(
&ui->popup,
res,
shaders,
screen,
ticker,
player);
loui_menu_initialize(
&ui->menu,
res,
shaders,
screen,
ticker,
player);
loui_event_initialize(
&ui->event,
res,
shaders,
screen,
ticker,
player);
}
void loui_deinitialize(loui_t* ui) {
assert(ui != NULL);
loui_event_deinitialize(&ui->event);
loui_menu_deinitialize(&ui->menu);
loui_popup_deinitialize(&ui->popup);
loui_hud_deinitialize(&ui->hud);
loui_combat_deinitialize(&ui->combat);
}
void loui_update(loui_t* ui, const locommon_input_t* input) {
assert(ui != NULL);
assert(input != NULL);
const bool pressed = input->buttons & LOCOMMON_INPUT_BUTTON_MENU;
const float dt = ui->ticker->delta_f;
if (pressed && !ui->pressed) ui->menu_shown = !ui->menu_shown;
ui->pressed = pressed;
locommon_easing_smooth_float(
&ui->menu.alpha, !!ui->menu_shown, dt*FADE_SPEED_);
const bool hud = !ui->menu_shown;
locommon_easing_smooth_float(
&ui->hud.alpha, !!hud, dt*FADE_SPEED_);
const loworld_chunk_t* chunk = loworld_view_get_looking_chunk(ui->view);
ui->hud.current_biome = chunk->biome;
loui_combat_update(&ui->combat);
loui_hud_update(&ui->hud);
loui_popup_update(&ui->popup);
loui_menu_update(&ui->menu, ui->menu_shown? input: NULL);
loui_event_update(&ui->event);
}
void loui_draw(const loui_t* ui) {
assert(ui != NULL);
loui_combat_draw(&ui->combat);
loui_hud_draw(&ui->hud);
loui_popup_draw(&ui->popup);
loui_menu_draw(&ui->menu);
loui_event_draw(&ui->event);
}
bool loui_is_grabbing_input(const loui_t* ui) {
assert(ui != NULL);
return ui->menu_shown;
}