Skip to content

Commit

Permalink
- Lightgun cursor support (no input plugin support yet)
Browse files Browse the repository at this point in the history
  • Loading branch information
emukidid committed Jun 15, 2023
1 parent 976b6ac commit b345d80
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 83 deletions.
2 changes: 1 addition & 1 deletion Gamecube/GamecubeMain.cpp
Expand Up @@ -143,7 +143,7 @@ static struct {
{ "PadAssign2", &padAssign[1], PADASSIGN_INPUT0, PADASSIGN_INPUT3 },
{ "RumbleEnabled", &rumbleEnabled, RUMBLE_DISABLE, RUMBLE_ENABLE },
{ "LoadButtonSlot", &loadButtonSlot, LOADBUTTON_SLOT0, LOADBUTTON_DEFAULT },
{ "ControllerType", &controllerType, CONTROLLERTYPE_STANDARD, CONTROLLERTYPE_ANALOG },
{ "ControllerType", &controllerType, CONTROLLERTYPE_STANDARD, CONTROLLERTYPE_LIGHTGUN },
// { "NumberMultitaps", &numMultitaps, MULTITAPS_NONE, MULTITAPS_TWO },
{ "smbusername", smbUserName, CONFIG_STRING_TYPE, CONFIG_STRING_TYPE },
{ "smbpassword", smbPassWord, CONFIG_STRING_TYPE, CONFIG_STRING_TYPE },
Expand Down
37 changes: 29 additions & 8 deletions Gamecube/menu/SettingsFrame.cpp
Expand Up @@ -76,6 +76,7 @@ void Func_ConfigureInput();
void Func_ConfigureButtons();
void Func_PsxTypeStandard();
void Func_PsxTypeAnalog();
void Func_PsxTypeLightgun();
void Func_DisableRumbleYes();
void Func_DisableRumbleNo();
void Func_SaveButtonsSD();
Expand Down Expand Up @@ -118,7 +119,7 @@ void pauseAudio(void); void pauseInput(void);
void resumeAudio(void); void resumeInput(void);
}

#define NUM_FRAME_BUTTONS 56
#define NUM_FRAME_BUTTONS 57
#define NUM_TAB_BUTTONS 5
#define FRAME_BUTTONS settingsFrameButtons
#define FRAME_STRINGS settingsFrameStrings
Expand All @@ -144,7 +145,7 @@ Dithering: None; Game Dependent; Always
Input Tab:
Assign Controllers (assign player->pad)
Configure Button Mappings
PSX Controller Type: Standard/Analog/Light Gun
PSX Controller Type: Standard/Analog/Gun
Number of Multitaps: 0, 1, 2
Audio Tab:
Expand All @@ -153,6 +154,7 @@ Disable XA: Yes; No
Disable CDDA: Yes; No
Volume Level: ("0: low", "1: medium", "2: loud", "3: loudest")
Note: volume=4-ComboBox_GetCurSel(hWC);, so 1 is loudest and 4 is low; default is medium
Disable Reverb: Yes; No
Saves Tab:
Memcard Save Device: SD; USB; CardA; CardB
Expand Down Expand Up @@ -223,7 +225,7 @@ static char FRAME_STRINGS[57][24] =
"CardA",
"CardB",
// New Strings
"Disable Reverb"
"Gun"
};


Expand Down Expand Up @@ -280,8 +282,8 @@ struct ButtonInfo
//Buttons for Input Tab (starts at button[30])
{ NULL, BTN_A_NRM, FRAME_STRINGS[34], 90.0, 100.0, 220.0, 56.0, 2, 32, 31, 31, Func_ConfigureInput, Func_ReturnFromSettingsFrame }, // Configure Input Assignment
{ NULL, BTN_A_NRM, FRAME_STRINGS[35], 325.0, 100.0, 235.0, 56.0, 2, 32, 30, 30, Func_ConfigureButtons, Func_ReturnFromSettingsFrame }, // Configure Button Mappings
{ NULL, BTN_A_SEL, FRAME_STRINGS[38], 285.0, 170.0, 130.0, 56.0, 30, 34, 33, 33, Func_PsxTypeStandard, Func_ReturnFromSettingsFrame }, // PSX Controller Type: Standard
{ NULL, BTN_A_SEL, FRAME_STRINGS[39], 425.0, 170.0, 110.0, 56.0, 31, 35, 32, 32, Func_PsxTypeAnalog, Func_ReturnFromSettingsFrame }, // PSX Controller Type: Analog
{ NULL, BTN_A_SEL, FRAME_STRINGS[38], 285.0, 170.0, 130.0, 56.0, 30, 34, 56, 33, Func_PsxTypeStandard, Func_ReturnFromSettingsFrame }, // PSX Controller Type: Standard
{ NULL, BTN_A_SEL, FRAME_STRINGS[39], 425.0, 170.0, 110.0, 56.0, 31, 35, 32, 56, Func_PsxTypeAnalog, Func_ReturnFromSettingsFrame }, // PSX Controller Type: Analog
{ NULL, BTN_A_SEL, FRAME_STRINGS[16], 285.0, 240.0, 75.0, 56.0, 32, 36, 35, 35, Func_DisableRumbleYes, Func_ReturnFromSettingsFrame }, // Disable Rumble: Yes
{ NULL, BTN_A_SEL, FRAME_STRINGS[17], 380.0, 240.0, 75.0, 56.0, 33, 37, 34, 34, Func_DisableRumbleNo, Func_ReturnFromSettingsFrame }, // Disable Rumble: No
{ NULL, BTN_A_NRM, FRAME_STRINGS[13], 285.0, 310.0, 55.0, 56.0, 34, 38, 37, 37, Func_SaveButtonsSD, Func_ReturnFromSettingsFrame }, // Save Button Mappings: SD
Expand All @@ -307,6 +309,7 @@ struct ButtonInfo
// New buttons [54]
{ NULL, BTN_A_SEL, FRAME_STRINGS[16], 345.0, 380.0, 75.0, 56.0, 45, 3, 55, 55, Func_DisableReverbYes, Func_ReturnFromSettingsFrame }, // Disable Reverb: Yes
{ NULL, BTN_A_SEL, FRAME_STRINGS[17], 440.0, 380.0, 75.0, 56.0, 45, 3, 54, 54, Func_DisableReverbNo, Func_ReturnFromSettingsFrame }, // Disable Reverb: No
{ NULL, BTN_A_SEL, FRAME_STRINGS[56], 550.0, 170.0, 75.0, 56.0, 31, 35, 33, 32, Func_PsxTypeLightgun, Func_ReturnFromSettingsFrame }, // PSX Controller Type: Gun

};

Expand All @@ -333,7 +336,7 @@ struct TextBoxInfo
{ NULL, FRAME_STRINGS[22], 130.0, 408.0, 1.0, true }, // Dithering: None/Game Dependent/Always
{ NULL, FRAME_STRINGS[23], 190.0, 478.0, 1.0, true }, // Scaling: None/2xSai
//TextBoxes for Input Tab (starts at textBox[10])
{ NULL, FRAME_STRINGS[36], 145.0, 198.0, 1.0, true }, // PSX Controller Type: Analog/Digital/Light Gun
{ NULL, FRAME_STRINGS[36], 145.0, 198.0, 1.0, true }, // PSX Controller Type: Analog/Digital/Gun
{ NULL, FRAME_STRINGS[37], 145.0, 268.0, 1.0, true }, // Disable Rumble: Yes/No
{ NULL, FRAME_STRINGS[40], 145.0, 338.0, 1.0, true }, // Save Button Configs: SD/USB
{ NULL, FRAME_STRINGS[41], 145.0, 408.0, 1.0, true }, // Auto Load Slot: Default/1/2/3/4
Expand Down Expand Up @@ -478,13 +481,21 @@ void SettingsFrame::activateSubmenu(int submenu)
for (int i = 10; i < 14; i++)
FRAME_TEXTBOXES[i].textBox->setVisible(true);
FRAME_BUTTONS[2].button->setSelected(true);
FRAME_BUTTONS[32+controllerType].button->setSelected(true);
if(controllerType == CONTROLLERTYPE_LIGHTGUN) {
FRAME_BUTTONS[56].button->setSelected(true);
}
else {
FRAME_BUTTONS[32+controllerType].button->setSelected(true);
}
FRAME_BUTTONS[34+rumbleEnabled].button->setSelected(true);
for (int i = 30; i < 39; i++)
{
FRAME_BUTTONS[i].button->setVisible(true);
FRAME_BUTTONS[i].button->setActive(true);
}
// Enable Lightgun button
FRAME_BUTTONS[56].button->setVisible(true);
FRAME_BUTTONS[56].button->setActive(true);
break;
case SUBMENU_AUDIO:
setDefaultFocus(FRAME_BUTTONS[3].button);
Expand Down Expand Up @@ -512,7 +523,7 @@ void SettingsFrame::activateSubmenu(int submenu)
FRAME_BUTTONS[i].button->setVisible(true);
FRAME_BUTTONS[i].button->setActive(true);
}
// Disable Reverb buttons
// Enable Reverb buttons
FRAME_BUTTONS[54].button->setVisible(true);
FRAME_BUTTONS[54].button->setActive(true);
FRAME_BUTTONS[55].button->setVisible(true);
Expand Down Expand Up @@ -1019,6 +1030,7 @@ void Func_PsxTypeStandard()
{
for (int i = 32; i <= 33; i++)
FRAME_BUTTONS[i].button->setSelected(false);
FRAME_BUTTONS[56].button->setSelected(false);
FRAME_BUTTONS[32].button->setSelected(true);
controllerType = CONTROLLERTYPE_STANDARD;
}
Expand All @@ -1027,10 +1039,19 @@ void Func_PsxTypeAnalog()
{
for (int i = 32; i <= 33; i++)
FRAME_BUTTONS[i].button->setSelected(false);
FRAME_BUTTONS[56].button->setSelected(false);
FRAME_BUTTONS[33].button->setSelected(true);
controllerType = CONTROLLERTYPE_ANALOG;
}

void Func_PsxTypeLightgun()
{
for (int i = 32; i <= 33; i++)
FRAME_BUTTONS[i].button->setSelected(false);
FRAME_BUTTONS[56].button->setSelected(true);
controllerType = CONTROLLERTYPE_LIGHTGUN;
}

void Func_DisableRumbleYes()
{
for (int i = 34; i <= 35; i++)
Expand Down
119 changes: 46 additions & 73 deletions PeopsSoftGPU/drawGX.c
Expand Up @@ -50,8 +50,10 @@ int iUseNoStretchBlt=0;
int iFastFwd=0;
int iDebugMode=0;
int iFVDisplay=0;
// Lightgun vars
PSXPoint_t ptCursorPoint[8];
unsigned short usCursorActive=0;
static unsigned long crCursorColor32[8][3]={{0xff,0x00,0x00},{0x00,0xff,0x00},{0x00,0x00,0xff},{0xff,0x00,0xff},{0xff,0xff,0x00},{0x00,0xff,0xff},{0xff,0xff,0xff},{0x7f,0x7f,0x7f}};

//Some GX specific variables
#define RESX_MAX 1024 //Vmem width
Expand Down Expand Up @@ -105,9 +107,6 @@ void DoBufferSwap(void) // SWAP BUFFERS
iOldDX=iDX;iOldDY=iDY;
}

// TODO: Show Gun cursor
// if(usCursorActive) ShowGunCursor(pBackBuffer,PreviousPSXDisplay.Range.x0+PreviousPSXDisplay.Range.x1);

// TODO: Show menu text
if(ulKeybits&KEY_SHOWFPS) //DisplayText(); // paint menu text
{
Expand Down Expand Up @@ -242,7 +241,7 @@ void ShowTextGpuPic(void)

////////////////////////////////////////////////////////////////////////
void GX_Flip(short width, short height, u8 * buffer, int pitch, u8 fmt)
{
{
int h, w;
static int oldwidth=0;
static int oldheight=0;
Expand Down Expand Up @@ -409,6 +408,49 @@ void GX_Flip(short width, short height, u8 * buffer, int pitch, u8 fmt)
GX_Position2f32(-xcoord,-ycoord);
GX_TexCoord2f32( 0.0, 1.0);
GX_End();

// Show lightgun cursors
if(usCursorActive) {
for(int iPlayer=0;iPlayer<8;iPlayer++) // -> loop all possible players
{
if(usCursorActive&(1<<iPlayer)) // -> player active?
{
// show a small semi-transparent square for the gun target
int gx = ptCursorPoint[iPlayer].x;
int gy = ptCursorPoint[iPlayer].y;
float startX = (gx < 255 ? (-1 + ((gx-8)/512.0f)) : ((gx-8)/512.0f));
float endX = (gx < 255 ? (-1 + ((gx+8)/512.0f)) : ((gx+8)/512.0f));

float startY = (gy > 127 ? (-1 * ((gy-6)/256.0f)) : (1 - ((gy-6)/256.0f)));
float endY = (gy > 127 ? (-1 * ((gy+6)/256.0f)) : (1 - ((gy+6)/256.0f)));

GX_InvVtxCache();
GX_InvalidateTexAll();
GX_ClearVtxDesc();
GX_SetVtxDesc(GX_VA_POS, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_F32, 0);
GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
// No textures
GX_SetNumChans(1);
GX_SetNumTexGens(0);
GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORDNULL, GX_TEXMAP_NULL, GX_COLOR0A0);
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);

GX_Begin(GX_QUADS, GX_VTXFMT0, 4);
GX_Position2f32(endX, endY);
GX_Color4u8(crCursorColor32[iPlayer][0], crCursorColor32[iPlayer][1], crCursorColor32[iPlayer][2], 0x80);
GX_Position2f32( startX, endY);
GX_Color4u8(crCursorColor32[iPlayer][0], crCursorColor32[iPlayer][1], crCursorColor32[iPlayer][2], 0x80);
GX_Position2f32( startX,startY);
GX_Color4u8(crCursorColor32[iPlayer][0], crCursorColor32[iPlayer][1], crCursorColor32[iPlayer][2], 0x80);
GX_Position2f32(endX,startY);
GX_Color4u8(crCursorColor32[iPlayer][0], crCursorColor32[iPlayer][1], crCursorColor32[iPlayer][2], 0x80);
GX_End();

}
}
}

//Write menu/debug text on screen
GXColor fontColor = {150,255,150,255};
Expand All @@ -435,72 +477,3 @@ void GX_Flip(short width, short height, u8 * buffer, int pitch, u8 fmt)
VIDEO_Flush();
// VIDEO_WaitVSync();
}

////////////////////////////////////////////////////////////////////////

/* TODO - add this function
void ShowGunCursor(unsigned char * surf,int iPitch)
{
unsigned short dx=(unsigned short)PreviousPSXDisplay.Range.x1;
unsigned short dy=(unsigned short)PreviousPSXDisplay.DisplayMode.y;
int x,y,iPlayer,sx,ex,sy,ey;
if(iColDepth==32) iPitch=iPitch<<2;
else iPitch=iPitch<<1;
if(PreviousPSXDisplay.Range.y0) // centering needed?
{
surf+=PreviousPSXDisplay.Range.y0*iPitch;
dy-=PreviousPSXDisplay.Range.y0;
}
if(iColDepth==32) // 32 bit color depth
{
const unsigned long crCursorColor32[8]={0xffff0000,0xff00ff00,0xff0000ff,0xffff00ff,0xffffff00,0xff00ffff,0xffffffff,0xff7f7f7f};
surf+=PreviousPSXDisplay.Range.x0<<2; // -> add x left border
for(iPlayer=0;iPlayer<8;iPlayer++) // -> loop all possible players
{
if(usCursorActive&(1<<iPlayer)) // -> player active?
{
const int ty=(ptCursorPoint[iPlayer].y*dy)/256; // -> calculate the cursor pos in the current display
const int tx=(ptCursorPoint[iPlayer].x*dx)/512;
sx=tx-5;if(sx<0) {if(sx&1) sx=1; else sx=0;}
sy=ty-5;if(sy<0) {if(sy&1) sy=1; else sy=0;}
ex=tx+6;if(ex>dx) ex=dx;
ey=ty+6;if(ey>dy) ey=dy;
for(x=tx,y=sy;y<ey;y+=2) // -> do dotted y line
*((unsigned long *)((surf)+(y*iPitch)+x*4))=crCursorColor32[iPlayer];
for(y=ty,x=sx;x<ex;x+=2) // -> do dotted x line
*((unsigned long *)((surf)+(y*iPitch)+x*4))=crCursorColor32[iPlayer];
}
}
}
else // 16 bit color depth
{
const unsigned short crCursorColor16[8]={0xf800,0x07c0,0x001f,0xf81f,0xffc0,0x07ff,0xffff,0x7bdf};
surf+=PreviousPSXDisplay.Range.x0<<1; // -> same stuff as above
for(iPlayer=0;iPlayer<8;iPlayer++)
{
if(usCursorActive&(1<<iPlayer))
{
const int ty=(ptCursorPoint[iPlayer].y*dy)/256;
const int tx=(ptCursorPoint[iPlayer].x*dx)/512;
sx=tx-5;if(sx<0) {if(sx&1) sx=1; else sx=0;}
sy=ty-5;if(sy<0) {if(sy&1) sy=1; else sy=0;}
ex=tx+6;if(ex>dx) ex=dx;
ey=ty+6;if(ey>dy) ey=dy;
for(x=tx,y=sy;y<ey;y+=2)
*((unsigned short *)((surf)+(y*iPitch)+x*2))=crCursorColor16[iPlayer];
for(y=ty,x=sx;x<ex;x+=2)
*((unsigned short *)((surf)+(y*iPitch)+x*2))=crCursorColor16[iPlayer];
}
}
}
}
*/
5 changes: 4 additions & 1 deletion PeopsSoftGPU/gpu.c
Expand Up @@ -919,8 +919,11 @@ void ChangeWindowMode(void) // TOGGLE FULLSCREEN - WI
////////////////////////////////////////////////////////////////////////
// gun cursor func: player=0-7, x=0-511, y=0-255
////////////////////////////////////////////////////////////////////////

#ifndef __GX__
void CALLBACK GPUcursor(int iPlayer,int x,int y)
#else //!__GX__
void GPUcursor(int iPlayer,int x,int y)
#endif
{
if(iPlayer<0) return;
if(iPlayer>7) return;
Expand Down

0 comments on commit b345d80

Please sign in to comment.