mirror of
https://github.com/gopher64/gopher64.git
synced 2026-07-11 01:25:20 +02:00
use timer for message lengths (#799)
* use timer for message lengths * more * more * more * more * more * more
This commit is contained in:
+27
-22
@@ -82,6 +82,7 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
std::string message;
|
||||
uint64_t milliseconds;
|
||||
Vulkan::ImageHandle image;
|
||||
} Message;
|
||||
|
||||
@@ -102,7 +103,6 @@ uint64_t sync_signal;
|
||||
|
||||
static TTF_Font *message_font;
|
||||
static std::queue<Message> messages;
|
||||
static uint64_t message_timer;
|
||||
|
||||
static TTF_Font *achievement_challenge_indicator_font;
|
||||
static std::vector<const char *> achievement_challenge_indicators;
|
||||
@@ -114,8 +114,6 @@ static bool display_challenge_indicator;
|
||||
static bool display_fps;
|
||||
static Vulkan::ImageHandle fps_image;
|
||||
|
||||
#define MESSAGE_TIME 3000 // 3 seconds
|
||||
|
||||
typedef struct {
|
||||
float SourceSize[4];
|
||||
float OutputSize[4];
|
||||
@@ -169,7 +167,7 @@ bool sdl_event_filter(void *userdata, SDL_Event *event) {
|
||||
break;
|
||||
case SDL_SCANCODE_F8:
|
||||
if (messages.empty())
|
||||
SDL_RunOnMainThread(ra_display_inprogress_achievements, nullptr, true);
|
||||
SDL_RunOnMainThread(ra_display_inprogress_achievements, nullptr, false);
|
||||
break;
|
||||
case SDL_SCANCODE_F9:
|
||||
display_challenge_indicator = !display_challenge_indicator;
|
||||
@@ -177,7 +175,7 @@ bool sdl_event_filter(void *userdata, SDL_Event *event) {
|
||||
std::format("Challenge indicators: {}",
|
||||
display_challenge_indicator ? "ON" : "OFF")
|
||||
.c_str(),
|
||||
false);
|
||||
MESSAGE_SHORT);
|
||||
break;
|
||||
case SDL_SCANCODE_F12:
|
||||
callback.reset_game = true;
|
||||
@@ -334,7 +332,6 @@ void rdp_init(void *_window, GFX_INFO _gfx_info, const void *font,
|
||||
crop_letterbox = false;
|
||||
|
||||
messages = std::queue<Message>();
|
||||
message_timer = 0;
|
||||
|
||||
display_challenge_indicator = true;
|
||||
achievement_challenge_indicators.clear();
|
||||
@@ -444,6 +441,13 @@ static void draw_fps(CommandBufferHandle cmd, VkViewport vp) {
|
||||
cmd->draw(3);
|
||||
}
|
||||
|
||||
static void pop_message(void *userdata) { messages.pop(); }
|
||||
static uint32_t pop_message_callback(void *userdata, SDL_TimerID timerID,
|
||||
uint32_t interval) {
|
||||
SDL_RunOnMainThread(pop_message, NULL, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void render_frame(Vulkan::Device &device) {
|
||||
RDP::ScanoutOptions options = {};
|
||||
options.persist_frame_on_invalid_input = true;
|
||||
@@ -519,6 +523,7 @@ static void render_frame(Vulkan::Device &device) {
|
||||
if (!message->image) {
|
||||
message->image = create_message_image(device, vp.width, message_font,
|
||||
message->message.c_str());
|
||||
SDL_AddTimer(message->milliseconds, pop_message_callback, NULL);
|
||||
}
|
||||
cmd->set_texture(0, 0, message->image->get_view(),
|
||||
Vulkan::StockSampler::NearestClamp);
|
||||
@@ -529,11 +534,6 @@ static void render_frame(Vulkan::Device &device) {
|
||||
cmd->set_viewport(vp);
|
||||
|
||||
cmd->draw(3);
|
||||
|
||||
if (SDL_GetTicks() > message_timer) {
|
||||
messages.pop();
|
||||
message_timer = SDL_GetTicks() + MESSAGE_TIME;
|
||||
}
|
||||
} else if (achievement_progress_indicator_image) {
|
||||
draw_indicator(cmd, achievement_progress_indicator_image, vp);
|
||||
} else if (achievement_challenge_indicator_image &&
|
||||
@@ -608,16 +608,18 @@ void rdp_load_state(const uint8_t *state) {
|
||||
memcpy(&rdp_device, state, sizeof(RDP_DEVICE));
|
||||
}
|
||||
|
||||
static void push_onscreen_message(void *message) {
|
||||
if (messages.empty())
|
||||
message_timer = SDL_GetTicks() + MESSAGE_TIME;
|
||||
messages.push({std::string((const char *)message), Vulkan::ImageHandle()});
|
||||
static void push_onscreen_message(void *data) {
|
||||
Message *message = (Message *)data;
|
||||
messages.push(*message);
|
||||
delete message;
|
||||
}
|
||||
|
||||
void rdp_onscreen_message(const char *message, bool long_message) {
|
||||
SDL_RunOnMainThread(push_onscreen_message, (void *)message, true);
|
||||
if (long_message)
|
||||
SDL_RunOnMainThread(push_onscreen_message, (void *)message, true);
|
||||
void rdp_onscreen_message(const char *message, MESSAGE_LENGTH milliseconds) {
|
||||
Message *data = new Message;
|
||||
data->message = message;
|
||||
data->milliseconds = static_cast<uint64_t>(milliseconds);
|
||||
data->image = Vulkan::ImageHandle();
|
||||
SDL_RunOnMainThread(push_onscreen_message, data, false);
|
||||
}
|
||||
|
||||
uint32_t pixel_size(uint32_t pixel_type, uint32_t area) {
|
||||
@@ -849,17 +851,20 @@ uint64_t rdp_process_commands() {
|
||||
return interrupt_timer;
|
||||
}
|
||||
|
||||
void rdp_set_fps_callback(void *userdata) {
|
||||
static void rdp_set_fps_callback(void *userdata) {
|
||||
FPS_DATA *data = (FPS_DATA *)userdata;
|
||||
fps_image = create_message_image(
|
||||
wsi->get_device(), 0, achievement_challenge_indicator_font,
|
||||
std::format("FPS: {} VI/S: {}", data->fps, data->vis).c_str());
|
||||
delete data;
|
||||
}
|
||||
|
||||
void rdp_set_fps(uint32_t fps, uint32_t vis) {
|
||||
if (display_fps) {
|
||||
FPS_DATA data = {fps, vis};
|
||||
SDL_RunOnMainThread(rdp_set_fps_callback, &data, true);
|
||||
FPS_DATA *data = new FPS_DATA;
|
||||
data->fps = fps;
|
||||
data->vis = vis;
|
||||
SDL_RunOnMainThread(rdp_set_fps_callback, data, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user