summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/inptport.c
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2009-09-07 00:53:53 +0000
committer Aaron Giles <aaron@aarongiles.com>2009-09-07 00:53:53 +0000
commit10b6e7e106ad706c29b8e25cbac0b990f0cdb501 (patch)
treefecbeddfd5487265b4fb9fef7b6c406be2624bff /src/emu/inptport.c
parent03b5da1a5563c867808c6ac2ba98f5ad74066a39 (diff)
Added PORT_CROSSHAIR_MAPPER() allowing you to specify an alternate, non-linear mapping
function from the raw crosshair value to its position onscreen. [Aaron Giles]
Diffstat (limited to 'src/emu/inptport.c')
-rw-r--r--src/emu/inptport.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/emu/inptport.c b/src/emu/inptport.c
index 36902c7938b..98b6a68eef1 100644
--- a/src/emu/inptport.c
+++ b/src/emu/inptport.c
@@ -1320,6 +1320,10 @@ int input_port_get_crosshair_position(running_machine *machine, int player, floa
else
value *= field->crossscale;
value += field->crossoffset;
+
+ /* apply custom mapping if necessary */
+ if (field->crossmapper != NULL)
+ value = (*field->crossmapper)(field, value);
/* handle X axis */
if (field->crossaxis == CROSSHAIR_AXIS_X)
@@ -2713,6 +2717,17 @@ static input_port_config *port_config_detokenize(input_port_config *listhead, co
curfield->crossoffset *= 1.0f / 65536.0f;
break;
+ /* crosshair mapper callback */
+ case INPUT_TOKEN_CROSSHAIR_MAPPER:
+ if (curfield == NULL)
+ {
+ error_buf_append(errorbuf, errorbuflen, "INPUT_TOKEN_CROSSHAIR_MAPPER encountered with no active field\n");
+ TOKEN_SKIP_PTR(ipt);
+ break;
+ }
+ curfield->crossmapper = TOKEN_GET_PTR(ipt, crossmapptr);
+ break;
+
/* analog decrement sequence */
case INPUT_TOKEN_CODE_DEC:
TOKEN_UNGET_UINT32(ipt);