Ciao
Sono finalmente riuscito a ritagliarmi un po' di tempo per fare alcune prove, e devo dire di essere soddisfatto di questi risultati parziali.
Per cercare di spiegare ancora un po' meglio il problema, riporto di seguito uno screenshot dove ho inserito alcuni valori:
PointBlank_1080_values.png
La prima riga, in bianco, indica i pixel della risoluzione per visualizzare l'immagine in 4:3 in uno schermo 16:9, in pratica l'immagine di gioco è 1440x1080 co dei bordi di 240 pixel per lato.
La seconda riga in rosso indica i valori del rawinput alle varie posizioni
La terza riga in azzurro indica come attualmente il MAME calcola la posizione
L'ultima riga è come dovrebbe calcolare la posizione, in pratica il range -65536:65536 deve limitarsi al quadro di gioco, andando oltre per la dimensione dello schermo, in base alla risoluzione stessa.
La funzione che è attualmente usata è la medesima per X ed Y, quindi io intanto ho fatto le prove solo sull'asse X, mantenendo l'immagine a schermo intero sull'asse Y (In pratica stretch + keep aspect ratio)
Nel file
src\osd\modules\input\input_rawinput.cpp ho modificato la riga 408, andando a richiamare una funzione diversa per l'asse X rispetto a quella originale usata sull'asse Y:
Codice: Seleziona tutto
lightgun.lX = normalize_absolute_axis_testx(rawinput.data.mouse.lLastX, 0, osd::INPUT_ABSOLUTE_MAX);
lightgun.lY = normalize_absolute_axis(rawinput.data.mouse.lLastY, 0, osd::INPUT_ABSOLUTE_MAX);
Nel file
src\osd\modules\input\input_common.h invece ho sdoppiato la funzione normalize_absolute_axis creandomi la mia, dove ho aggiunto i calcoli relativi. Di seguito entrambe le funzioni, originale e nuova:
Codice: Seleziona tutto
inline int32_t normalize_absolute_axis(double raw, double rawmin, double rawmax)
{
double center = (rawmax + rawmin) / 2.0;
// make sure we have valid data
if (rawmin >= rawmax)
return int32_t(raw);
if (raw >= center)
{
// above center
double result = (raw - center) * osd::INPUT_ABSOLUTE_MAX / (rawmax - center);
return std::min(result, (double)osd::INPUT_ABSOLUTE_MAX);
}
else
{
// below center
double result = -((center - raw) * (double)-osd::INPUT_ABSOLUTE_MIN / (center - rawmin));
return std::max(result, (double)osd::INPUT_ABSOLUTE_MIN);
}
}
inline int32_t normalize_absolute_axis_testx(double raw, double rawmin, double rawmax)
{
double center = (rawmax + rawmin) / 2.0;
double screen_resolution_x = 1920; // X Resolution of the screen
double image_size_x = 1440; // X size of the game window
double black_border_size_x = (screen_resolution_x - image_size_x) / 2; // Size in pixel of each black border
double screen_center_x = screen_resolution_x / 2;
// To be recalculated from screen resolution and image size
//double SCREEN_ABSOLUTE_MAX = 87397;
//double SCREEN_ABSOLUTE_MIN = -87397;
double SCREEN_ABSOLUTE_MAX = (screen_resolution_x-screen_center_x) * osd::INPUT_ABSOLUTE_MAX / (image_size_x+black_border_size_x-screen_center_x);
double SCREEN_ABSOLUTE_MIN = -SCREEN_ABSOLUTE_MAX;
// make sure we have valid data
if (rawmin >= rawmax)
return int32_t(raw);
if (raw >= center)
{
// above center
//double result = (raw - center) * osd::INPUT_ABSOLUTE_MAX / (rawmax - center); // Original code
//double result = (raw - center) * (double)87397 / (rawmax - center); // Test #1
double result = (raw - center) * SCREEN_ABSOLUTE_MAX / (rawmax - center); // Test #2
return std::min(result, (double)osd::INPUT_ABSOLUTE_MAX);
}
else
{
// below center
//double result = -((center - raw) * (double)-osd::INPUT_ABSOLUTE_MIN / (center - rawmin)); // Original code
//double result = -((center - raw) * (double)-87397 / (center - rawmin)); // Test #1 ==> Wrong, while on left side of the screen, the crosshair is on right side of the screen
double result = -((center - raw) * -SCREEN_ABSOLUTE_MIN / (center - rawmin)); // Test #2
return std::max(result, (double)osd::INPUT_ABSOLUTE_MIN);
}
}
Ora il puntatore è perfettamente allineato al crosshair in 4:3, ma visto l'hard coding sia della risoluzione che della dimensione di gioco, questo workaround è usabile solo a 1920x1080 in 4:3 (O andandosi a modificare i valori e ricompilando...ma non è comodissimo, sopratutto per il tempo di compilazione).
Non è che qualcuno mi saprebbe guidare per capire quale siano esattamente le variabili/oggetti contenenti sia la risoluzione video che la dimensione della finestra? Se ho visto bene per la dimensione dello schermo dovrei usare la funzione GetWindowRect, ma non sono sicuro di come ottenere la dimensione corretta, e per l'area di gioco invece non ho ancora trovato nulla.
Almeno adesso però posso ingannare il tempo facendomi qualche partita mantenendo il form factor corretto di 4:3, senza dover stratchare le immagini

Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.