[GTK3] Improve analog speed controls a bit

This commit is contained in:
Maximilian Mader 2020-05-11 00:05:59 +02:00
parent f7beeb9c98
commit 116ea7d0d7
Signed by: Max
GPG Key ID: F71D56A3151C4FB3
1 changed files with 38 additions and 22 deletions

View File

@ -122,6 +122,7 @@ typedef struct GuiData {
bool turbo_down; bool turbo_down;
double clock_mutliplier; double clock_mutliplier;
double analog_clock_multiplier; double analog_clock_multiplier;
bool analog_clock_multiplier_valid;
// Input // Input
uint8_t pressed_buttons; uint8_t pressed_buttons;
@ -164,6 +165,7 @@ static GuiData gui_data = {
.rewind_paused = false, .rewind_paused = false,
.turbo_down = false, .turbo_down = false,
.clock_mutliplier = 1.0, .clock_mutliplier = 1.0,
.analog_clock_multiplier = 1.0,
}; };
GB_gameboy_t gb; GB_gameboy_t gb;
@ -269,6 +271,22 @@ static void replace_extension(const char *src, size_t length, char *dest, const
strcat(dest, ext); strcat(dest, ext);
} }
static double clamp_double(double min, double max, double value) {
if (value < min) return min;
if (value > max) return max;
return value;
}
static double max_double(double a, double b) {
if (a > b) return a;
return b;
}
static double min_double(double a, double b) {
if (a < b) return a;
return b;
}
static uint32_t rgb_encode(GB_gameboy_t *gb, uint8_t r, uint8_t g, uint8_t b) { static uint32_t rgb_encode(GB_gameboy_t *gb, uint8_t r, uint8_t g, uint8_t b) {
return 0xFF000000 | (r << 16) | (g << 8) | b; return 0xFF000000 | (r << 16) | (g << 8) | b;
} }
@ -1189,17 +1207,26 @@ static void vblank(GB_gameboy_t *gb) {
GB_set_pixels_output(gb, get_pixels()); GB_set_pixels_output(gb, get_pixels());
if (config.analog_speed_controls && gui_data.analog_clock_multiplier != 0.0) { // Handle the speed modifiers:
GB_set_clock_multiplier(gb, gui_data.analog_clock_multiplier); // The binary slowdown is limited to half speed.
} // The analog multiplier can go down to a third and up to three times full speed.
else if (gui_data.underclock_down && gui_data.clock_mutliplier > 0.5) { if (gui_data.underclock_down && gui_data.clock_mutliplier > 0.5) {
gui_data.clock_mutliplier -= 1.0/16; gui_data.clock_mutliplier -= 1.0 / 16;
//gui_data.clock_mutliplier = clamp_double(0.5, 1.0, gui_data.clock_mutliplier - 1.0 / 16);
GB_set_clock_multiplier(gb, gui_data.clock_mutliplier); GB_set_clock_multiplier(gb, gui_data.clock_mutliplier);
} }
else if (!gui_data.underclock_down && gui_data.clock_mutliplier < 1.0) { else if (!gui_data.underclock_down && gui_data.clock_mutliplier < 1.0) {
gui_data.clock_mutliplier += 1.0/16; gui_data.clock_mutliplier += 1.0 / 16;
//gui_data.clock_mutliplier = clamp_double(0.5, 1.0, gui_data.clock_mutliplier + 1.0 / 16);
GB_set_clock_multiplier(gb, gui_data.clock_mutliplier); GB_set_clock_multiplier(gb, gui_data.clock_mutliplier);
} }
else if (config.analog_speed_controls && gui_data.analog_clock_multiplier_valid) {
GB_set_clock_multiplier(gb, gui_data.analog_clock_multiplier);
if (gui_data.analog_clock_multiplier == 1.0) {
gui_data.analog_clock_multiplier_valid = false;
}
}
if (g_strcmp0("vram_viewer_tileset", gui_data.vram_viewer_active_tab) == 0) { if (g_strcmp0("vram_viewer_tileset", gui_data.vram_viewer_active_tab) == 0) {
const gchar *palette_id = gtk_combo_box_get_active_id(builder_get(GTK_COMBO_BOX, "vram_viewer_tileset_palette_selector")); const gchar *palette_id = gtk_combo_box_get_active_id(builder_get(GTK_COMBO_BOX, "vram_viewer_tileset_palette_selector"));
@ -1265,22 +1292,6 @@ static void vblank(GB_gameboy_t *gb) {
g_idle_add((GSourceFunc) on_vblank, NULL); g_idle_add((GSourceFunc) on_vblank, NULL);
} }
static double clamp_double(double min, double max, double value) {
if (value < min) return min;
if (value > max) return max;
return value;
}
static double max_double(double a, double b) {
if (a > b) return a;
return b;
}
static double min_double(double a, double b) {
if (a < b) return a;
return b;
}
static void handle_events(GB_gameboy_t *gb) { static void handle_events(GB_gameboy_t *gb) {
SDL_GameControllerUpdate(); SDL_GameControllerUpdate();
@ -1302,9 +1313,11 @@ static void handle_events(GB_gameboy_t *gb) {
if (left_trigger > 0.0) { if (left_trigger > 0.0) {
analog_clock_multiplier = min_double(analog_clock_multiplier, clamp_double(1.0 / 3, 1.0, 1 - left_trigger + 0.2)); analog_clock_multiplier = min_double(analog_clock_multiplier, clamp_double(1.0 / 3, 1.0, 1 - left_trigger + 0.2));
gui_data.analog_clock_multiplier_valid = true;
} }
else if (right_trigger > 0.0) { else if (right_trigger > 0.0) {
analog_clock_multiplier = max_double(analog_clock_multiplier, clamp_double(1.0, 3.0, right_trigger * 3 + 0.8)); analog_clock_multiplier = max_double(analog_clock_multiplier, clamp_double(1.0, 3.0, right_trigger * 3 + 0.8));
gui_data.analog_clock_multiplier_valid = true;
} }
} }
@ -1673,12 +1686,15 @@ static gboolean on_key_press(GtkWidget *w, GdkEventKey *event, gpointer data) {
if (event->keyval == key_map[INPUT_TURBO]) { if (event->keyval == key_map[INPUT_TURBO]) {
gui_data.turbo_down = event->type == GDK_KEY_PRESS; gui_data.turbo_down = event->type == GDK_KEY_PRESS;
gui_data.analog_clock_multiplier_valid = false;
GB_audio_clear_queue(); GB_audio_clear_queue();
GB_set_turbo_mode(&gb, gui_data.turbo_down, gui_data.turbo_down && gui_data.rewind_down); GB_set_turbo_mode(&gb, gui_data.turbo_down, gui_data.turbo_down && gui_data.rewind_down);
} }
if (event->keyval == key_map[INPUT_SLOWDOWN]) { if (event->keyval == key_map[INPUT_SLOWDOWN]) {
gui_data.underclock_down = event->type == GDK_KEY_PRESS; gui_data.underclock_down = event->type == GDK_KEY_PRESS;
gui_data.analog_clock_multiplier_valid = false;
} }
if (event->keyval == key_map[INPUT_FULLSCREEN]) { if (event->keyval == key_map[INPUT_FULLSCREEN]) {