From 63132b3d01ee0ad797e797057687facf43f4f26d Mon Sep 17 00:00:00 2001 From: "therealmogminer@gmail.com" Date: Sat, 28 May 2016 15:36:50 +0200 Subject: [PATCH] More slider cleanup, nw --- src/frontend/mame/ui/slider.h | 7 +- src/frontend/mame/ui/sliderchangednotifier.h | 29 +++ src/frontend/mame/ui/sliders.cpp | 10 +- src/frontend/mame/ui/ui.cpp | 221 ++++++++++++------- src/frontend/mame/ui/ui.h | 86 +++++++- src/osd/modules/render/bgfx/chainmanager.cpp | 17 +- src/osd/modules/render/bgfx/chainmanager.h | 6 +- src/osd/modules/render/bgfx/inputpair.cpp | 12 +- src/osd/modules/render/bgfx/inputpair.h | 4 +- src/osd/modules/render/bgfx/slider.cpp | 9 +- src/osd/modules/render/bgfx/slider.h | 5 +- src/osd/modules/render/d3d/d3dhlsl.cpp | 11 +- src/osd/modules/render/d3d/d3dhlsl.h | 5 +- 13 files changed, 301 insertions(+), 121 deletions(-) create mode 100644 src/frontend/mame/ui/sliderchangednotifier.h diff --git a/src/frontend/mame/ui/slider.h b/src/frontend/mame/ui/slider.h index a7873db800a..7cd4b580831 100644 --- a/src/frontend/mame/ui/slider.h +++ b/src/frontend/mame/ui/slider.h @@ -14,16 +14,19 @@ #ifndef __UI_SLIDER__ #define __UI_SLIDER__ +#include + #include "emu.h" +#include "sliderchangednotifier.h" #define SLIDER_NOCHANGE 0x12345678 -typedef INT32(*slider_update)(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); +typedef std::function slider_update; struct slider_state { slider_state * next; /* pointer to next slider */ - slider_update update; /* callback */ + slider_update update; /* callback */ void * arg; /* argument */ INT32 minval; /* minimum value */ INT32 defval; /* default value */ diff --git a/src/frontend/mame/ui/sliderchangednotifier.h b/src/frontend/mame/ui/sliderchangednotifier.h new file mode 100644 index 00000000000..40e6df4b4bf --- /dev/null +++ b/src/frontend/mame/ui/sliderchangednotifier.h @@ -0,0 +1,29 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +//====================================================================== +// +// sliderchangednotifier.cpp - Interface for a slider-changed callback +// +//====================================================================== + +#pragma once + +#ifndef __SLIDER_CHANGED_NOTIFIER__ +#define __SLIDER_CHANGED_NOTIFIER__ + +#include +#include + +using INT32 = std::int32_t; + +class running_machine; + +class slider_changed_notifier +{ +public: + virtual ~slider_changed_notifier() { } + + virtual INT32 slider_changed(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) = 0; +}; + +#endif // __SLIDER_CHANGED_NOTIFIER__ diff --git a/src/frontend/mame/ui/sliders.cpp b/src/frontend/mame/ui/sliders.cpp index 920d2ede4b4..b94b8f00055 100644 --- a/src/frontend/mame/ui/sliders.cpp +++ b/src/frontend/mame/ui/sliders.cpp @@ -43,7 +43,7 @@ void menu_sliders::handle() if (menu_event->itemref != nullptr && menu_event->type == menu_item_type::SLIDER) { const slider_state *slider = (const slider_state *)menu_event->itemref; - INT32 curvalue = (*slider->update)(machine(), slider->arg, slider->id, nullptr, SLIDER_NOCHANGE); + INT32 curvalue = slider->update(machine(), slider->arg, slider->id, nullptr, SLIDER_NOCHANGE); INT32 increment = 0; bool alt_pressed = machine().input().code_pressed(KEYCODE_LALT) || machine().input().code_pressed(KEYCODE_RALT); bool ctrl_pressed = machine().input().code_pressed(KEYCODE_LCONTROL) || machine().input().code_pressed(KEYCODE_RCONTROL); @@ -105,7 +105,7 @@ void menu_sliders::handle() newvalue = slider->maxval; /* update the slider and recompute the menu */ - (*slider->update)(machine(), slider->arg, slider->id, nullptr, newvalue); + slider->update(machine(), slider->arg, slider->id, nullptr, newvalue); reset(reset_options::REMEMBER_REF); } } @@ -147,7 +147,7 @@ void menu_sliders::populate() if (item.type == menu_item_type::SLIDER) { slider_state* slider = reinterpret_cast(item.ref); - INT32 curval = (*slider->update)(machine(), slider->arg, slider->id, &tempstring, SLIDER_NOCHANGE); + INT32 curval = slider->update(machine(), slider->arg, slider->id, &tempstring, SLIDER_NOCHANGE); UINT32 flags = 0; if (curval > slider->minval) flags |= FLAG_LEFT_ARROW; @@ -170,7 +170,7 @@ void menu_sliders::populate() if (item.type == menu_item_type::SLIDER) { slider_state* slider = reinterpret_cast(item.ref); - INT32 curval = (*slider->update)(machine(), slider->arg, slider->id, &tempstring, SLIDER_NOCHANGE); + INT32 curval = slider->update(machine(), slider->arg, slider->id, &tempstring, SLIDER_NOCHANGE); UINT32 flags = 0; if (curval > slider->minval) flags |= FLAG_LEFT_ARROW; @@ -205,7 +205,7 @@ void menu_sliders::custom_render(void *selectedref, float top, float bottom, flo INT32 curval; /* determine the current value and text */ - curval = (*curslider->update)(machine(), curslider->arg, curslider->id, &tempstring, SLIDER_NOCHANGE); + curval = curslider->update(machine(), curslider->arg, curslider->id, &tempstring, SLIDER_NOCHANGE); /* compute the current and default percentages */ percentage = (float)(curval - curslider->minval) / (float)(curslider->maxval - curslider->minval); diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index 4f01102abb4..08bcfa0ceac 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -125,39 +125,6 @@ std::vector mame_ui_manager::slider_list; slider_state *mame_ui_manager::slider_current; -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -// slider controls -static slider_state *slider_alloc(running_machine &machine, const char *title, INT32 minval, INT32 defval, INT32 maxval, INT32 incval, slider_update update, void *arg); -static INT32 slider_volume(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_mixervol(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_adjuster(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_overclock(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_refresh(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_brightness(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_contrast(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_gamma(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_xscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_yscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_xoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_yoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_overxscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_overyscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_overxoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_overyoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_flicker(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_beam_width_min(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_beam_width_max(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_beam_intensity_weight(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static std::string slider_get_screen_desc(screen_device &screen); -#ifdef MAME_DEBUG -static INT32 slider_crossscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -static INT32 slider_crossoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); -#endif - - /*************************************************************************** INLINE FUNCTIONS ***************************************************************************/ @@ -1896,7 +1863,7 @@ std::vector& mame_ui_manager::get_slider_list(void) // slider_alloc - allocate a new slider entry //------------------------------------------------- -static slider_state *slider_alloc(running_machine &machine, const char *title, INT32 minval, INT32 defval, INT32 maxval, INT32 incval, slider_update update, void *arg) +slider_state* mame_ui_manager::slider_alloc(running_machine &machine, int id, const char *title, INT32 minval, INT32 defval, INT32 maxval, INT32 incval, void *arg) { int size = sizeof(slider_state) + strlen(title); slider_state *state = (slider_state *)auto_alloc_array_clear(machine, UINT8, size); @@ -1905,9 +1872,12 @@ static slider_state *slider_alloc(running_machine &machine, const char *title, I state->defval = defval; state->maxval = maxval; state->incval = incval; - state->update = update; + + using namespace std::placeholders; + state->update = std::bind(&mame_ui_manager::slider_changed, this, _1, _2, _3, _4, _5); + state->arg = arg; - state->id = -1; + state->id = id; strcpy(state->description, title); return state; @@ -1924,7 +1894,7 @@ std::vector mame_ui_manager::slider_init(running_machine &machine std::vector sliders; // add overall volume - sliders.push_back(slider_alloc(machine, _("Master Volume"), -32, 0, 0, 1, slider_volume, nullptr)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_VOLUME, _("Master Volume"), -32, 0, 0, 1, nullptr)); // add per-channel volume mixer_input info; @@ -1934,34 +1904,37 @@ std::vector mame_ui_manager::slider_init(running_machine &machine INT32 defval = 1000; std::string str = string_format(_("%1$s Volume"), info.stream->input_name(info.inputnum)); - sliders.push_back(slider_alloc(machine, str.c_str(), 0, defval, maxval, 20, slider_mixervol, (void *)(FPTR)item)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_MIXERVOL + item, str.c_str(), 0, defval, maxval, 20, (void *)(FPTR)item)); } // add analog adjusters + int slider_index = 0; for (ioport_port &port : machine.ioport().ports()) { for (ioport_field &field : port.fields()) { if (field.type() == IPT_ADJUSTER) { - sliders.push_back(slider_alloc(machine, field.name(), field.minval(), field.defvalue(), field.maxval(), 1, slider_adjuster, (void *)&field)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_ADJUSTER + slider_index++, field.name(), field.minval(), field.defvalue(), field.maxval(), 1, (void *)&field)); } } } // add CPU overclocking (cheat only) + slider_index = 0; if (machine.options().cheat()) { for (device_execute_interface &exec : execute_interface_iterator(machine.root_device())) { void *param = (void *)&exec.device(); std::string str = string_format(_("Overclock CPU %1$s"), exec.device().tag()); - sliders.push_back(slider_alloc(machine, str.c_str(), 10, 1000, 2000, 1, slider_overclock, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_OVERCLOCK + slider_index++, str.c_str(), 10, 1000, 2000, 1, param)); } } // add screen parameters screen_device_iterator scriter(machine.root_device()); + slider_index = 0; for (screen_device &screen : scriter) { int defxscale = floor(screen.xscale() * 1000.0f + 0.5f); @@ -1975,28 +1948,30 @@ std::vector mame_ui_manager::slider_init(running_machine &machine if (machine.options().cheat()) { std::string str = string_format(_("%1$s Refresh Rate"), screen_desc); - sliders.push_back(slider_alloc(machine, str.c_str(), -10000, 0, 10000, 1000, slider_refresh, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_REFRESH + slider_index, str.c_str(), -10000, 0, 10000, 1000, param)); } // add standard brightness/contrast/gamma controls per-screen std::string str = string_format(_("%1$s Brightness"), screen_desc); - sliders.push_back(slider_alloc(machine, str.c_str(), 100, 1000, 2000, 10, slider_brightness, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_BRIGHTNESS + slider_index, str.c_str(), 100, 1000, 2000, 10, param)); str = string_format(_("%1$s Contrast"), screen_desc); - sliders.push_back(slider_alloc(machine, str.c_str(), 100, 1000, 2000, 50, slider_contrast, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_CONTRAST + slider_index, str.c_str(), 100, 1000, 2000, 50, param)); str = string_format(_("%1$s Gamma"), screen_desc); - sliders.push_back(slider_alloc(machine, str.c_str(), 100, 1000, 3000, 50, slider_gamma, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_GAMMA + slider_index, str.c_str(), 100, 1000, 3000, 50, param)); // add scale and offset controls per-screen str = string_format(_("%1$s Horiz Stretch"), screen_desc); - sliders.push_back(slider_alloc(machine, str.c_str(), 500, defxscale, 1500, 2, slider_xscale, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_XSCALE + slider_index, str.c_str(), 500, defxscale, 1500, 2, param)); str = string_format(_("%1$s Horiz Position"), screen_desc); - sliders.push_back(slider_alloc(machine, str.c_str(), -500, defxoffset, 500, 2, slider_xoffset, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_XOFFSET + slider_index, str.c_str(), -500, defxoffset, 500, 2, param)); str = string_format(_("%1$s Vert Stretch"), screen_desc); - sliders.push_back(slider_alloc(machine, str.c_str(), 500, defyscale, 1500, 2, slider_yscale, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_YSCALE + slider_index, str.c_str(), 500, defyscale, 1500, 2, param)); str = string_format(_("%1$s Vert Position"), screen_desc); - sliders.push_back(slider_alloc(machine, str.c_str(), -500, defyoffset, 500, 2, slider_yoffset, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_YOFFSET + slider_index, str.c_str(), -500, defyoffset, 500, 2, param)); + slider_index++; } + slider_index = 0; for (laserdisc_device &laserdisc : laserdisc_device_iterator(machine.root_device())) { if (laserdisc.overlay_configured()) @@ -2011,30 +1986,34 @@ std::vector mame_ui_manager::slider_init(running_machine &machine // add scale and offset controls per-overlay std::string str = string_format(_("Laserdisc '%1$s' Horiz Stretch"), laserdisc.tag()); - sliders.push_back(slider_alloc(machine, str.c_str(), 500, (defxscale == 0) ? 1000 : defxscale, 1500, 2, slider_overxscale, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_OVERLAY_XSCALE + slider_index, str.c_str(), 500, (defxscale == 0) ? 1000 : defxscale, 1500, 2, param)); str = string_format(_("Laserdisc '%1$s' Horiz Position"), laserdisc.tag()); - sliders.push_back(slider_alloc(machine, str.c_str(), -500, defxoffset, 500, 2, slider_overxoffset, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_OVERLAY_YSCALE + slider_index, str.c_str(), -500, defxoffset, 500, 2, param)); str = string_format(_("Laserdisc '%1$s' Vert Stretch"), laserdisc.tag()); - sliders.push_back(slider_alloc(machine, str.c_str(), 500, (defyscale == 0) ? 1000 : defyscale, 1500, 2, slider_overyscale, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_OVERLAY_XOFFSET + slider_index, str.c_str(), 500, (defyscale == 0) ? 1000 : defyscale, 1500, 2, param)); str = string_format(_("Laserdisc '%1$s' Vert Position"), laserdisc.tag()); - sliders.push_back(slider_alloc(machine, str.c_str(), -500, defyoffset, 500, 2, slider_overyoffset, param)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_OVERLAY_YOFFSET + slider_index, str.c_str(), -500, defyoffset, 500, 2, param)); + slider_index++; } } + slider_index = 0; for (screen_device &screen : scriter) { if (screen.screen_type() == SCREEN_TYPE_VECTOR) { // add vector control - sliders.push_back(slider_alloc(machine, _("Vector Flicker"), 0, 0, 1000, 10, slider_flicker, nullptr)); - sliders.push_back(slider_alloc(machine, _("Beam Width Minimum"), 1, 100, 1000, 1, slider_beam_width_min, nullptr)); - sliders.push_back(slider_alloc(machine, _("Beam Width Maximum"), 1, 100, 1000, 1, slider_beam_width_max, nullptr)); - sliders.push_back(slider_alloc(machine, _("Beam Intensity Weight"), -1000, 0, 1000, 10, slider_beam_intensity_weight, nullptr)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_FLICKER + slider_index, _("Vector Flicker"), 0, 0, 1000, 10, nullptr)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_BEAM_WIDTH_MIN + slider_index, _("Beam Width Minimum"), 1, 100, 1000, 1, nullptr)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_BEAM_WIDTH_MAX + slider_index, _("Beam Width Maximum"), 1, 100, 1000, 1, nullptr)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_BEAM_INTENSITY + slider_index, _("Beam Intensity Weight"), -1000, 0, 1000, 10, nullptr)); + slider_index++; break; } } #ifdef MAME_DEBUG + slider_index = 0; // add crosshair adjusters for (ioport_port &port : machine.ioport().ports()) { @@ -2043,9 +2022,9 @@ std::vector mame_ui_manager::slider_init(running_machine &machine if (field.crosshair_axis() != CROSSHAIR_AXIS_NONE && field.player() == 0) { std::string str = string_format(_("Crosshair Scale %1$s"), (field.crosshair_axis() == CROSSHAIR_AXIS_X) ? _("X") : _("Y")); - sliders.push_back(slider_alloc(machine, str.c_str(), -3000, 1000, 3000, 100, slider_crossscale, (void *)&field)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_CROSSHAIR_SCALE + slider_index, str.c_str(), -3000, 1000, 3000, 100, (void *)&field)); str = string_format(_("Crosshair Offset %1$s"), (field.crosshair_axis() == CROSSHAIR_AXIS_X) ? _("X") : _("Y")); - sliders.push_back(slider_alloc(machine, str.c_str(), -3000, 0, 3000, 100, slider_crossoffset, (void *)&field)); + sliders.push_back(slider_alloc(machine, SLIDER_ID_CROSSHAIR_OFFSET + slider_index, str.c_str(), -3000, 0, 3000, 100, (void *)&field)); } } } @@ -2066,12 +2045,92 @@ std::vector mame_ui_manager::slider_init(running_machine &machine return items; } +//---------------------------------------------------- +// slider_changed - global slider-modified callback +//---------------------------------------------------- + +INT32 mame_ui_manager::slider_changed(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +{ + switch (id) + { + case SLIDER_ID_VOLUME: + return slider_volume(machine, arg, id, str, newval); + + case SLIDER_ID_MIXERVOL ... SLIDER_ID_MIXERVOL_LAST: + return slider_mixervol(machine, arg, id, str, newval); + + case SLIDER_ID_ADJUSTER ... SLIDER_ID_ADJUSTER_LAST: + return slider_adjuster(machine, arg, id, str, newval); + + case SLIDER_ID_OVERCLOCK ... SLIDER_ID_OVERCLOCK_LAST: + return slider_overclock(machine, arg, id, str, newval); + + case SLIDER_ID_REFRESH ... SLIDER_ID_REFRESH_LAST: + return slider_refresh(machine, arg, id, str, newval); + + case SLIDER_ID_BRIGHTNESS ... SLIDER_ID_BRIGHTNESS_LAST: + return slider_brightness(machine, arg, id, str, newval); + + case SLIDER_ID_CONTRAST ... SLIDER_ID_CONTRAST_LAST: + return slider_contrast(machine, arg, id, str, newval); + + case SLIDER_ID_GAMMA ... SLIDER_ID_GAMMA_LAST: + return slider_gamma(machine, arg, id, str, newval); + + case SLIDER_ID_XSCALE ... SLIDER_ID_XSCALE_LAST: + return slider_xscale(machine, arg, id, str, newval); + + case SLIDER_ID_YSCALE ... SLIDER_ID_YSCALE_LAST: + return slider_yscale(machine, arg, id, str, newval); + + case SLIDER_ID_XOFFSET ... SLIDER_ID_XOFFSET_LAST: + return slider_xoffset(machine, arg, id, str, newval); + + case SLIDER_ID_YOFFSET ... SLIDER_ID_YOFFSET_LAST: + return slider_yoffset(machine, arg, id, str, newval); + + case SLIDER_ID_OVERLAY_XSCALE ... SLIDER_ID_OVERLAY_XSCALE_LAST: + return slider_overxscale(machine, arg, id, str, newval); + + case SLIDER_ID_OVERLAY_YSCALE ... SLIDER_ID_OVERLAY_YSCALE_LAST: + return slider_overyscale(machine, arg, id, str, newval); + + case SLIDER_ID_OVERLAY_XOFFSET ... SLIDER_ID_OVERLAY_XOFFSET_LAST: + return slider_overxoffset(machine, arg, id, str, newval); + + case SLIDER_ID_OVERLAY_YOFFSET ... SLIDER_ID_OVERLAY_YOFFSET_LAST: + return slider_overyoffset(machine, arg, id, str, newval); + + case SLIDER_ID_FLICKER ... SLIDER_ID_FLICKER_LAST: + return slider_flicker(machine, arg, id, str, newval); + + case SLIDER_ID_BEAM_WIDTH_MIN ... SLIDER_ID_BEAM_WIDTH_MIN_LAST: + return slider_beam_width_min(machine, arg, id, str, newval); + + case SLIDER_ID_BEAM_WIDTH_MAX ... SLIDER_ID_BEAM_WIDTH_MAX_LAST: + return slider_beam_width_max(machine, arg, id, str, newval); + + case SLIDER_ID_BEAM_INTENSITY ... SLIDER_ID_BEAM_INTENSITY_LAST: + return slider_beam_intensity_weight(machine, arg, id, str, newval); + +#ifdef MAME_DEBUG + case SLIDER_ID_CROSSHAIR_SCALE ... SLIDER_ID_CROSSHAIR_SCALE_LAST: + return slider_crossscale(machine, arg, id, str, newval); + + case SLIDER_ID_CROSSHAIR_OFFSET ... SLIDER_ID_CROSSHAIR_OFFSET_LAST: + return slider_crossoffset(machine, arg, id, str, newval); +#endif + } + + return 0; +} + //------------------------------------------------- // slider_volume - global volume slider callback //------------------------------------------------- -static INT32 slider_volume(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_volume(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { if (newval != SLIDER_NOCHANGE) machine.sound().set_attenuation(newval); @@ -2086,7 +2145,7 @@ static INT32 slider_volume(running_machine &machine, void *arg, int id, std::str // slider callback //------------------------------------------------- -static INT32 slider_mixervol(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_mixervol(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { mixer_input info; if (!machine.sound().indexed_mixer_input((FPTR)arg, info)) @@ -2108,7 +2167,7 @@ static INT32 slider_mixervol(running_machine &machine, void *arg, int id, std::s // callback //------------------------------------------------- -static INT32 slider_adjuster(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_adjuster(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { ioport_field *field = (ioport_field *)arg; ioport_field::user_settings settings; @@ -2130,7 +2189,7 @@ static INT32 slider_adjuster(running_machine &machine, void *arg, int id, std::s // callback //------------------------------------------------- -static INT32 slider_overclock(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_overclock(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { device_t *cpu = (device_t *)arg; if (newval != SLIDER_NOCHANGE) @@ -2145,7 +2204,7 @@ static INT32 slider_overclock(running_machine &machine, void *arg, int id, std:: // slider_refresh - refresh rate slider callback //------------------------------------------------- -static INT32 slider_refresh(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_refresh(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { screen_device *screen = reinterpret_cast(arg); double defrefresh = ATTOSECONDS_TO_HZ(screen->refresh_attoseconds()); @@ -2170,7 +2229,7 @@ static INT32 slider_refresh(running_machine &machine, void *arg, int id, std::st // callback //------------------------------------------------- -static INT32 slider_brightness(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_brightness(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { screen_device *screen = reinterpret_cast(arg); render_container::user_settings settings; @@ -2192,7 +2251,7 @@ static INT32 slider_brightness(running_machine &machine, void *arg, int id, std: // callback //------------------------------------------------- -static INT32 slider_contrast(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_contrast(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { screen_device *screen = reinterpret_cast(arg); render_container::user_settings settings; @@ -2213,7 +2272,7 @@ static INT32 slider_contrast(running_machine &machine, void *arg, int id, std::s // slider_gamma - screen gamma slider callback //------------------------------------------------- -static INT32 slider_gamma(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_gamma(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { screen_device *screen = reinterpret_cast(arg); render_container::user_settings settings; @@ -2235,7 +2294,7 @@ static INT32 slider_gamma(running_machine &machine, void *arg, int id, std::stri // callback //------------------------------------------------- -static INT32 slider_xscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_xscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { screen_device *screen = reinterpret_cast(arg); render_container::user_settings settings; @@ -2257,7 +2316,7 @@ static INT32 slider_xscale(running_machine &machine, void *arg, int id, std::str // callback //------------------------------------------------- -static INT32 slider_yscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_yscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { screen_device *screen = reinterpret_cast(arg); render_container::user_settings settings; @@ -2279,7 +2338,7 @@ static INT32 slider_yscale(running_machine &machine, void *arg, int id, std::str // slider callback //------------------------------------------------- -static INT32 slider_xoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_xoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { screen_device *screen = reinterpret_cast(arg); render_container::user_settings settings; @@ -2301,7 +2360,7 @@ static INT32 slider_xoffset(running_machine &machine, void *arg, int id, std::st // slider callback //------------------------------------------------- -static INT32 slider_yoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_yoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { screen_device *screen = reinterpret_cast(arg); render_container::user_settings settings; @@ -2323,7 +2382,7 @@ static INT32 slider_yoffset(running_machine &machine, void *arg, int id, std::st // callback //------------------------------------------------- -static INT32 slider_overxscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_overxscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { laserdisc_device *laserdisc = (laserdisc_device *)arg; laserdisc_overlay_config settings; @@ -2345,7 +2404,7 @@ static INT32 slider_overxscale(running_machine &machine, void *arg, int id, std: // callback //------------------------------------------------- -static INT32 slider_overyscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_overyscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { laserdisc_device *laserdisc = (laserdisc_device *)arg; laserdisc_overlay_config settings; @@ -2367,7 +2426,7 @@ static INT32 slider_overyscale(running_machine &machine, void *arg, int id, std: // slider callback //------------------------------------------------- -static INT32 slider_overxoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_overxoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { laserdisc_device *laserdisc = (laserdisc_device *)arg; laserdisc_overlay_config settings; @@ -2389,7 +2448,7 @@ static INT32 slider_overxoffset(running_machine &machine, void *arg, int id, std // slider callback //------------------------------------------------- -static INT32 slider_overyoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_overyoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { laserdisc_device *laserdisc = (laserdisc_device *)arg; laserdisc_overlay_config settings; @@ -2411,7 +2470,7 @@ static INT32 slider_overyoffset(running_machine &machine, void *arg, int id, std // callback //------------------------------------------------- -static INT32 slider_flicker(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_flicker(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { if (newval != SLIDER_NOCHANGE) vector_options::s_flicker = (float)newval * 0.001f; @@ -2426,7 +2485,7 @@ static INT32 slider_flicker(running_machine &machine, void *arg, int id, std::st // callback //------------------------------------------------- -static INT32 slider_beam_width_min(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_beam_width_min(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { if (newval != SLIDER_NOCHANGE) vector_options::s_beam_width_min = MIN((float)newval * 0.01f, vector_options::s_beam_width_max); @@ -2441,7 +2500,7 @@ static INT32 slider_beam_width_min(running_machine &machine, void *arg, int id, // callback //------------------------------------------------- -static INT32 slider_beam_width_max(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_beam_width_max(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { if (newval != SLIDER_NOCHANGE) vector_options::s_beam_width_max = MAX((float)newval * 0.01f, vector_options::s_beam_width_min); @@ -2456,7 +2515,7 @@ static INT32 slider_beam_width_max(running_machine &machine, void *arg, int id, // callback //------------------------------------------------- -static INT32 slider_beam_intensity_weight(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_beam_intensity_weight(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { if (newval != SLIDER_NOCHANGE) vector_options::s_beam_intensity_weight = (float)newval * 0.001f; @@ -2471,7 +2530,7 @@ static INT32 slider_beam_intensity_weight(running_machine &machine, void *arg, i // description for a given screen //------------------------------------------------- -static std::string slider_get_screen_desc(screen_device &screen) +std::string mame_ui_manager::slider_get_screen_desc(screen_device &screen) { if (screen_device_iterator(screen.machine().root_device()).count() > 1) return string_format(_("Screen '%1$s'"), screen.tag()); @@ -2485,7 +2544,7 @@ static std::string slider_get_screen_desc(screen_device &screen) //------------------------------------------------- #ifdef MAME_DEBUG -static INT32 slider_crossscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_crossscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { ioport_field *field = (ioport_field *)arg; @@ -2504,7 +2563,7 @@ static INT32 slider_crossscale(running_machine &machine, void *arg, int id, std: //------------------------------------------------- #ifdef MAME_DEBUG -static INT32 slider_crossoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 mame_ui_manager::slider_crossoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { ioport_field *field = (ioport_field *)arg; diff --git a/src/frontend/mame/ui/ui.h b/src/frontend/mame/ui/ui.h index b81114c939c..299465e2d67 100644 --- a/src/frontend/mame/ui/ui.h +++ b/src/frontend/mame/ui/ui.h @@ -93,6 +93,59 @@ enum DRAW_OPAQUE }; +#define SLIDER_DEVICE_SPACING 0x0ff +#define SLIDER_SCREEN_SPACING 0x0f +#define SLIDER_INPUT_SPACING 0x0f + +enum +{ + SLIDER_ID_VOLUME = 0, + SLIDER_ID_MIXERVOL, + SLIDER_ID_MIXERVOL_LAST = SLIDER_ID_MIXERVOL + SLIDER_DEVICE_SPACING, + SLIDER_ID_ADJUSTER, + SLIDER_ID_ADJUSTER_LAST = SLIDER_ID_ADJUSTER + SLIDER_DEVICE_SPACING, + SLIDER_ID_OVERCLOCK, + SLIDER_ID_OVERCLOCK_LAST = SLIDER_ID_OVERCLOCK + SLIDER_DEVICE_SPACING, + SLIDER_ID_REFRESH, + SLIDER_ID_REFRESH_LAST = SLIDER_ID_REFRESH + SLIDER_SCREEN_SPACING, + SLIDER_ID_BRIGHTNESS, + SLIDER_ID_BRIGHTNESS_LAST = SLIDER_ID_BRIGHTNESS + SLIDER_SCREEN_SPACING, + SLIDER_ID_CONTRAST, + SLIDER_ID_CONTRAST_LAST = SLIDER_ID_CONTRAST + SLIDER_SCREEN_SPACING, + SLIDER_ID_GAMMA, + SLIDER_ID_GAMMA_LAST = SLIDER_ID_GAMMA + SLIDER_SCREEN_SPACING, + SLIDER_ID_XSCALE, + SLIDER_ID_XSCALE_LAST = SLIDER_ID_XSCALE + SLIDER_SCREEN_SPACING, + SLIDER_ID_YSCALE, + SLIDER_ID_YSCALE_LAST = SLIDER_ID_YSCALE + SLIDER_SCREEN_SPACING, + SLIDER_ID_XOFFSET, + SLIDER_ID_XOFFSET_LAST = SLIDER_ID_XOFFSET + SLIDER_SCREEN_SPACING, + SLIDER_ID_YOFFSET, + SLIDER_ID_YOFFSET_LAST = SLIDER_ID_YOFFSET + SLIDER_SCREEN_SPACING, + SLIDER_ID_OVERLAY_XSCALE, + SLIDER_ID_OVERLAY_XSCALE_LAST = SLIDER_ID_OVERLAY_XSCALE + SLIDER_SCREEN_SPACING, + SLIDER_ID_OVERLAY_YSCALE, + SLIDER_ID_OVERLAY_YSCALE_LAST = SLIDER_ID_OVERLAY_YSCALE + SLIDER_SCREEN_SPACING, + SLIDER_ID_OVERLAY_XOFFSET, + SLIDER_ID_OVERLAY_XOFFSET_LAST = SLIDER_ID_OVERLAY_XOFFSET + SLIDER_SCREEN_SPACING, + SLIDER_ID_OVERLAY_YOFFSET, + SLIDER_ID_OVERLAY_YOFFSET_LAST = SLIDER_ID_OVERLAY_YOFFSET + SLIDER_SCREEN_SPACING, + SLIDER_ID_FLICKER, + SLIDER_ID_FLICKER_LAST = SLIDER_ID_FLICKER + SLIDER_SCREEN_SPACING, + SLIDER_ID_BEAM_WIDTH_MIN, + SLIDER_ID_BEAM_WIDTH_MIN_LAST = SLIDER_ID_BEAM_WIDTH_MIN + SLIDER_SCREEN_SPACING, + SLIDER_ID_BEAM_WIDTH_MAX, + SLIDER_ID_BEAM_WIDTH_MAX_LAST = SLIDER_ID_BEAM_WIDTH_MAX + SLIDER_SCREEN_SPACING, + SLIDER_ID_BEAM_INTENSITY, + SLIDER_ID_BEAM_INTENSITY_LAST = SLIDER_ID_BEAM_INTENSITY + SLIDER_SCREEN_SPACING, + SLIDER_ID_CROSSHAIR_SCALE, + SLIDER_ID_CROSSHAIR_SCALE_LAST = SLIDER_ID_CROSSHAIR_SCALE + SLIDER_INPUT_SPACING, + SLIDER_ID_CROSSHAIR_OFFSET, + SLIDER_ID_CROSSHAIR_OFFSET_LAST = SLIDER_ID_CROSSHAIR_OFFSET + SLIDER_INPUT_SPACING, + + SLIDER_ID_CORE_LAST = SLIDER_ID_CROSSHAIR_OFFSET, + SLIDER_ID_CORE_COUNT +}; /*************************************************************************** TYPE DEFINITIONS @@ -103,7 +156,7 @@ typedef UINT32 (*ui_callback)(mame_ui_manager &, render_container *, UINT32); // ======================> mame_ui_manager -class mame_ui_manager : public ui_manager +class mame_ui_manager : public ui_manager, public slider_changed_notifier { public: // construction/destruction @@ -179,6 +232,7 @@ public: virtual void image_display(const device_type &type, device_image_interface *image) override; virtual void menu_reset() override; + private: // instance variables render_font * m_font; @@ -215,6 +269,36 @@ private: // private methods void exit(); + slider_state* slider_alloc(running_machine &machine, int id, const char *title, INT32 minval, INT32 defval, INT32 maxval, INT32 incval, void *arg); + + // slider controls + virtual INT32 slider_changed(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) override; + + INT32 slider_volume(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_mixervol(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_adjuster(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_overclock(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_refresh(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_brightness(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_contrast(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_gamma(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_xscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_yscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_xoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_yoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_overxscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_overyscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_overxoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_overyoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_flicker(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_beam_width_min(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_beam_width_max(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_beam_intensity_weight(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + std::string slider_get_screen_desc(screen_device &screen); + #ifdef MAME_DEBUG + INT32 slider_crossscale(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + INT32 slider_crossoffset(running_machine &machine, void *arg, int id, std::string *str, INT32 newval); + #endif }; diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp index d6e596cfc6b..34c891eb009 100644 --- a/src/osd/modules/render/bgfx/chainmanager.cpp +++ b/src/osd/modules/render/bgfx/chainmanager.cpp @@ -364,16 +364,7 @@ void chain_manager::update_screen_count(uint32_t screen_count) } } -static INT32 update_trampoline(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) -{ - if (arg != nullptr) - { - return reinterpret_cast(arg)->chain_changed(id, str, newval); - } - return 0; -} - -int32_t chain_manager::chain_changed(int32_t id, std::string *str, int32_t newval) +INT32 chain_manager::slider_changed(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { if (newval != SLIDER_NOCHANGE) { @@ -409,7 +400,9 @@ void chain_manager::create_selection_slider(uint32_t screen_index) state->defval = m_current_chain[screen_index]; state->maxval = m_available_chains.size() - 1; state->incval = 1; - state->update = update_trampoline; + + using namespace std::placeholders; + state->update = std::bind(&chain_manager::slider_changed, this, _1, _2, _3, _4, _5); state->arg = this; state->id = screen_index; strcpy(state->description, description.c_str()); @@ -461,7 +454,7 @@ uint32_t chain_manager::handle_screen_chains(uint32_t view, render_primitive *st } } } - + process_screen_quad(view + used_views, screen_index, prim, window); used_views += screen_chain(screen_index)->applicable_passes(); diff --git a/src/osd/modules/render/bgfx/chainmanager.h b/src/osd/modules/render/bgfx/chainmanager.h index a2531fdbc8f..083c93d634c 100644 --- a/src/osd/modules/render/bgfx/chainmanager.h +++ b/src/osd/modules/render/bgfx/chainmanager.h @@ -22,6 +22,7 @@ #include "targetmanager.h" #include "effectmanager.h" #include "../frontend/mame/ui/menuitem.h" +#include "../frontend/mame/ui/sliderchangednotifier.h" class running_machine; class osd_window; @@ -44,14 +45,13 @@ public: const std::string m_path; }; -class chain_manager +class chain_manager : public slider_changed_notifier { public: chain_manager(running_machine& machine, osd_options& options, texture_manager& textures, target_manager& targets, effect_manager& effects, uint32_t window_index, slider_dirty_notifier& slider_notifier); ~chain_manager(); uint32_t handle_screen_chains(uint32_t view, render_primitive *starting_prim, osd_window& window); - int32_t chain_changed(int32_t index, std::string *str, int32_t newval); // Getters running_machine& machine() const { return m_machine; } @@ -83,6 +83,8 @@ private: std::vector split_option_string(std::string chain_str) const; void update_screen_count(uint32_t screen_count); + + virtual INT32 slider_changed(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) override; void create_selection_slider(uint32_t screen_index); bool needs_sliders(); diff --git a/src/osd/modules/render/bgfx/inputpair.cpp b/src/osd/modules/render/bgfx/inputpair.cpp index b859667899e..bbe1ba503de 100644 --- a/src/osd/modules/render/bgfx/inputpair.cpp +++ b/src/osd/modules/render/bgfx/inputpair.cpp @@ -55,13 +55,9 @@ void bgfx_input_pair::bind(bgfx_effect *effect, const int32_t screen) const bgfx::setTexture(m_index, effect->uniform(m_sampler)->handle(), chains().textures().handle(name)); } -static INT32 update_trampoline(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 bgfx_input_pair::slider_changed(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) { - if (arg != nullptr) - { - return reinterpret_cast(arg)->texture_changed(id, str, newval); - } - return 0; + return texture_changed(id, str, newval); } int32_t bgfx_input_pair::texture_changed(int32_t id, std::string *str, int32_t newval) @@ -106,7 +102,9 @@ void bgfx_input_pair::create_selection_slider(uint32_t screen_index) state->defval = m_current_texture; state->maxval = m_available_textures.size() - 1; state->incval = 1; - state->update = update_trampoline; + + using namespace std::placeholders; + state->update = std::bind(&bgfx_input_pair::slider_changed, this, _1, _2, _3, _4, _5); state->arg = this; state->id = screen_index; strcpy(state->description, description.c_str()); diff --git a/src/osd/modules/render/bgfx/inputpair.h b/src/osd/modules/render/bgfx/inputpair.h index 4ec81552f19..37c890c3f13 100644 --- a/src/osd/modules/render/bgfx/inputpair.h +++ b/src/osd/modules/render/bgfx/inputpair.h @@ -17,11 +17,12 @@ #include #include "../frontend/mame/ui/menuitem.h" +#include "../frontend/mame/ui/sliderchangednotifier.h" class bgfx_effect; class chain_manager; -class bgfx_input_pair +class bgfx_input_pair : public slider_changed_notifier { public: bgfx_input_pair(int index, std::string sampler, std::string texture, std::vector available_textures, std::string selection, chain_manager& chains, uint32_t screen_index); @@ -36,6 +37,7 @@ public: std::vector get_slider_list(); private: + virtual INT32 slider_changed(running_machine &machine, void *arg, int /*id*/, std::string *str, INT32 newval) override; void create_selection_slider(uint32_t screen_index); bool needs_sliders(); diff --git a/src/osd/modules/render/bgfx/slider.cpp b/src/osd/modules/render/bgfx/slider.cpp index 29d7fd0f821..3b269eb08e6 100644 --- a/src/osd/modules/render/bgfx/slider.cpp +++ b/src/osd/modules/render/bgfx/slider.cpp @@ -37,7 +37,7 @@ bgfx_slider::~bgfx_slider() { } -static INT32 update_trampoline(running_machine &machine, void *arg, int /*id*/, std::string *str, INT32 newval) +INT32 bgfx_slider::slider_changed(running_machine& /*machine*/, void *arg, int /*id*/, std::string *str, INT32 newval) { if (arg != nullptr) { @@ -49,7 +49,7 @@ static INT32 update_trampoline(running_machine &machine, void *arg, int /*id*/, void bgfx_slider::import(float val) { m_value = val; - update_trampoline(m_machine, this, m_slider_state->id, nullptr, int32_t(floor(m_value / m_step + 0.5f))); + slider_changed(m_machine, this, m_slider_state->id, nullptr, int32_t(floor(m_value / m_step + 0.5f))); } slider_state* bgfx_slider::create_core_slider(running_machine& machine) @@ -61,7 +61,10 @@ slider_state* bgfx_slider::create_core_slider(running_machine& machine) state->defval = int32_t(floor(m_default / m_step + 0.5f)); state->maxval = int32_t(floor(m_max / m_step + 0.5f)); state->incval = int32_t(floor(m_step / m_step + 0.5f)); - state->update = update_trampoline; + + using namespace std::placeholders; + state->update = std::bind(&bgfx_slider::slider_changed, this, _1, _2, _3, _4, _5); + state->arg = this; state->id = 0; strcpy(state->description, m_description.c_str()); diff --git a/src/osd/modules/render/bgfx/slider.h b/src/osd/modules/render/bgfx/slider.h index fca9d43f6a8..88b8ef6b6cb 100644 --- a/src/osd/modules/render/bgfx/slider.h +++ b/src/osd/modules/render/bgfx/slider.h @@ -19,7 +19,7 @@ #include "emu.h" #include "../frontend/mame/ui/slider.h" -class bgfx_slider +class bgfx_slider : public slider_changed_notifier { public: enum slider_type @@ -44,7 +44,7 @@ public: }; bgfx_slider(running_machine& machine, std::string name, float min, float def, float max, float step, slider_type type, screen_type screen, std::string format, std::string description, std::vector& strings); - ~bgfx_slider(); + virtual ~bgfx_slider(); int32_t update(std::string *str, int32_t newval); @@ -61,6 +61,7 @@ public: void import(float val); protected: + virtual INT32 slider_changed(running_machine &machine, void *arg, int /*id*/, std::string *str, INT32 newval) override; slider_state* create_core_slider(running_machine &machine); int32_t as_int() const { return int32_t(floor(m_value / m_step + 0.5f)); } diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index a2496408d8d..2864d740bb7 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -2184,7 +2184,7 @@ static void get_vector(const char *data, int count, float *out, bool report_erro // be done in a more ideal way. //============================================================ -static slider_state *slider_alloc(running_machine &machine, int id, const char *title, INT32 minval, INT32 defval, INT32 maxval, INT32 incval, slider_update update, void *arg) +slider_state* shaders::slider_alloc(running_machine &machine, int id, const char *title, INT32 minval, INT32 defval, INT32 maxval, INT32 incval, void *arg) { int size = sizeof(slider_state) + strlen(title); slider_state *state = reinterpret_cast(auto_alloc_array_clear(machine, UINT8, size)); @@ -2193,7 +2193,10 @@ static slider_state *slider_alloc(running_machine &machine, int id, const char * state->defval = defval; state->maxval = maxval; state->incval = incval; - state->update = update; + + using namespace std::placeholders; + state->update = std::bind(&shaders::slider_changed, this, _1, _2, _3, _4, _5); + state->arg = arg; state->id = id; strcpy(state->description, title); @@ -2267,7 +2270,7 @@ INT32 slider::update(std::string *str, INT32 newval) return 0; } -static INT32 slider_update_trampoline(running_machine &machine, void *arg, int id, std::string *str, INT32 newval) +INT32 shaders::slider_changed(running_machine& /*machine*/, void *arg, int /*id*/, std::string *str, INT32 newval) { if (arg != nullptr) { @@ -2558,7 +2561,7 @@ std::vector shaders::init_slider_list() break; } - slider_state* core_slider = slider_alloc(*machine, desc->id, name.c_str(), desc->minval, desc->defval, desc->maxval, desc->step, slider_update_trampoline, slider_arg); + slider_state* core_slider = slider_alloc(*machine, desc->id, name.c_str(), desc->minval, desc->defval, desc->maxval, desc->step, slider_arg); ui::menu_item item; item.text = core_slider->description; diff --git a/src/osd/modules/render/d3d/d3dhlsl.h b/src/osd/modules/render/d3d/d3dhlsl.h index 96491c9491b..abf1e48a549 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.h +++ b/src/osd/modules/render/d3d/d3dhlsl.h @@ -12,6 +12,7 @@ #include #include "aviio.h" #include "../frontend/mame/ui/menuitem.h" +#include "../frontend/mame/ui/slider.h" //============================================================ // CONSTANTS @@ -290,7 +291,7 @@ private: bool * m_dirty; }; -class shaders +class shaders : public slider_changed_notifier { friend class effect; friend class uniform; @@ -342,6 +343,8 @@ public: void delete_resources(bool reset); // slider-related functions + virtual INT32 slider_changed(running_machine &machine, void *arg, int /*id*/, std::string *str, INT32 newval) override; + slider_state* slider_alloc(running_machine &machine, int id, const char *title, INT32 minval, INT32 defval, INT32 maxval, INT32 incval, void *arg); std::vector init_slider_list(); void *get_slider_option(int id, int index = 0);