138 lines
3.4 KiB
C
138 lines
3.4 KiB
C
|
#include "./popup.h"
|
||
|
|
||
|
#include <assert.h>
|
||
|
#include <stddef.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#include "util/glyphas/block.h"
|
||
|
#include "util/glyphas/cache.h"
|
||
|
#include "util/math/vector.h"
|
||
|
|
||
|
#include "core/locommon/easing.h"
|
||
|
#include "core/locommon/screen.h"
|
||
|
#include "core/locommon/ticker.h"
|
||
|
#include "core/loplayer/player.h"
|
||
|
#include "core/loplayer/popup.h"
|
||
|
#include "core/loresource/set.h"
|
||
|
#include "core/loresource/text.h"
|
||
|
#include "core/loshader/set.h"
|
||
|
|
||
|
#define DURATION_ 4 /* [sec] */
|
||
|
|
||
|
#define HEAD_COLOR_ vec4(1, 1, 1, 1)
|
||
|
|
||
|
static void loui_popup_calculate_geometry_(
|
||
|
loui_popup_t* popup, const locommon_screen_t* screen) {
|
||
|
assert(popup != NULL);
|
||
|
assert(screen != NULL);
|
||
|
|
||
|
typeof(popup->geo)* g = &popup->geo;
|
||
|
|
||
|
locommon_screen_calc_pixels_from_inch(
|
||
|
screen, &g->big_fontpx, &vec2(.6f, .6f));
|
||
|
locommon_screen_calc_winpos_from_pixels(
|
||
|
screen, &g->big_fontsz, &g->big_fontpx);
|
||
|
}
|
||
|
|
||
|
static glyphas_block_t* loui_popup_create_head_text_(
|
||
|
loui_popup_t* popup, const locommon_screen_t* screen, const char* str) {
|
||
|
assert(popup != NULL);
|
||
|
assert(screen != NULL);
|
||
|
assert(str != NULL);
|
||
|
|
||
|
glyphas_block_t* b = glyphas_block_new(
|
||
|
GLYPHAS_ALIGNER_DIRECTION_HORIZONTAL,
|
||
|
-popup->geo.big_fontpx.y,
|
||
|
INT32_MAX,
|
||
|
32);
|
||
|
glyphas_block_add_characters(
|
||
|
b,
|
||
|
popup->font.serif.big,
|
||
|
&HEAD_COLOR_,
|
||
|
str,
|
||
|
strlen(str));
|
||
|
glyphas_block_scale(
|
||
|
b, &vec2(2/screen->resolution.x, 2/screen->resolution.y));
|
||
|
|
||
|
glyphas_block_set_origin(b, &vec2(.5f, -1));
|
||
|
return b;
|
||
|
}
|
||
|
|
||
|
void loui_popup_initialize(
|
||
|
loui_popup_t* popup,
|
||
|
loresource_set_t* res,
|
||
|
loshader_set_t* shaders,
|
||
|
const locommon_screen_t* screen,
|
||
|
const locommon_ticker_t* ticker,
|
||
|
loplayer_t* player) {
|
||
|
assert(popup != NULL);
|
||
|
assert(res != NULL);
|
||
|
assert(shaders != NULL);
|
||
|
assert(screen != NULL);
|
||
|
assert(ticker != NULL);
|
||
|
assert(player != NULL);
|
||
|
|
||
|
*popup = (typeof(*popup)) {
|
||
|
.shaders = shaders,
|
||
|
.ticker = ticker,
|
||
|
.player = player,
|
||
|
};
|
||
|
loui_popup_calculate_geometry_(popup, screen);
|
||
|
|
||
|
popup->font = (typeof(popup->font)) {
|
||
|
.serif = {
|
||
|
.big = glyphas_cache_new(
|
||
|
shaders->tex.popup_text,
|
||
|
&res->font.serif,
|
||
|
popup->geo.big_fontpx.x,
|
||
|
popup->geo.big_fontpx.y),
|
||
|
},
|
||
|
};
|
||
|
|
||
|
# define text_(v) loresource_text_get(res->lang, v)
|
||
|
|
||
|
popup->head = (typeof(popup->head)) {
|
||
|
.new_stance = loui_popup_create_head_text_(
|
||
|
popup, screen, text_("popup_new_stance_head")),
|
||
|
};
|
||
|
|
||
|
# undef text_
|
||
|
}
|
||
|
|
||
|
void loui_popup_deinitialize(loui_popup_t* popup) {
|
||
|
assert(popup != NULL);
|
||
|
|
||
|
glyphas_block_delete(popup->head.new_stance);
|
||
|
glyphas_cache_delete(popup->font.serif.big);
|
||
|
}
|
||
|
|
||
|
void loui_popup_update(loui_popup_t* popup) {
|
||
|
assert(popup != NULL);
|
||
|
|
||
|
const float dt = popup->ticker->delta_f;
|
||
|
locommon_easing_linear_float(&popup->alpha, 0, dt/DURATION_);
|
||
|
if (popup->alpha > 0) return;
|
||
|
|
||
|
const loplayer_popup_item_t* item =
|
||
|
loplayer_popup_enqueue(&popup->player->popup);
|
||
|
if (item == NULL) return;
|
||
|
|
||
|
popup->item = *item;
|
||
|
popup->alpha = 1;
|
||
|
}
|
||
|
|
||
|
void loui_popup_draw(const loui_popup_t* popup) {
|
||
|
assert(popup != NULL);
|
||
|
|
||
|
if (popup->alpha <= 0) return;
|
||
|
|
||
|
popup->shaders->drawer.popup_text.alpha = popup->alpha;
|
||
|
|
||
|
switch (popup->item.type) {
|
||
|
case LOPLAYER_POPUP_ITEM_TYPE_NEW_STANCE:
|
||
|
loshader_popup_text_drawer_add_block(
|
||
|
&popup->shaders->drawer.popup_text, popup->head.new_stance);
|
||
|
break;
|
||
|
}
|
||
|
}
|