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/event.c

118 lines
3.0 KiB
C

#include "./event.h"
#include <assert.h>
#include <stddef.h>
#include "util/math/vector.h"
#include "util/glyphas/block.h"
#include "util/glyphas/cache.h"
#include "core/locommon/easing.h"
#include "core/locommon/screen.h"
#include "core/locommon/ticker.h"
#include "core/loplayer/event.h"
#include "core/loplayer/player.h"
#include "core/loresource/set.h"
#include "core/loresource/text.h"
#include "core/loshader/set.h"
#define LINE_MAX_CHARS_ 256
#define CINESCOPE_SIZE_ .23f
#define LINE_COLOR_ vec4(1, 1, 1, 1)
static void loui_event_update_line_(loui_event_t* ev) {
assert(ev != NULL);
if (ev->player->event.ctx.line.last_update <= ev->last_line_update) {
return;
}
ev->last_line_update = ev->player->event.ctx.line.last_update;
const char* id = ev->player->event.ctx.line.text_id;
const char* s = id == NULL? "": loresource_text_get(ev->res->lang, id);
glyphas_block_clear(ev->line);
glyphas_block_add_characters(
ev->line, ev->font, &LINE_COLOR_, s, strlen(s));
glyphas_block_scale(
ev->line,
&vec2(2/ev->screen->resolution.x, 2/ev->screen->resolution.y));
glyphas_block_set_origin(ev->line, &vec2(.5f, -.5f));
vec2_t sz, offset;
glyphas_block_calculate_geometry(ev->line, &sz, &offset);
const float y = -1 + CINESCOPE_SIZE_/2 + sz.y/2;
glyphas_block_translate(ev->line, &vec2(0, y));
}
void loui_event_initialize(
loui_event_t* ev,
loresource_set_t* res,
loshader_set_t* shaders,
const locommon_screen_t* screen,
const locommon_ticker_t* ticker,
loplayer_t* player) {
assert(ev != NULL);
assert(res != NULL);
assert(shaders != NULL);
assert(screen != NULL);
assert(ticker != NULL);
assert(player != NULL);
vec2_t fontpx;
locommon_screen_calc_pixels_from_inch(screen, &fontpx, &vec2(.15f, .15f));
*ev = (typeof(*ev)) {
.res = res,
.shaders = shaders,
.screen = screen,
.ticker = ticker,
.player = player,
.font = glyphas_cache_new(
shaders->tex.event_line,
&res->font.serif,
fontpx.x,
fontpx.y),
.line = glyphas_block_new(
GLYPHAS_ALIGNER_DIRECTION_HORIZONTAL,
-fontpx.y,
INT32_MAX,
LINE_MAX_CHARS_),
};
}
void loui_event_deinitialize(loui_event_t* ev) {
assert(ev != NULL);
glyphas_block_delete(ev->line);
glyphas_cache_delete(ev->font);
}
void loui_event_update(loui_event_t* ev) {
assert(ev != NULL);
loui_event_update_line_(ev);
const float dt = ev->ticker->delta_f;
locommon_easing_smooth_float(
&ev->cinescope, ev->player->event.ctx.cinescope*CINESCOPE_SIZE_, dt);
}
void loui_event_draw(const loui_event_t* ev) {
assert(ev != NULL);
loshader_event_line_drawer_add_block(
&ev->shaders->drawer.event_line, ev->line);
loshader_cinescope_drawer_set_param(
&ev->shaders->drawer.cinescope,
&(loshader_cinescope_drawer_param_t) {
.size = ev->cinescope,
.color = vec4(0, 0, 0, 1),
});
}