Joystick Implementation

I have just recently completed renderring a scene using OpenGL. I have found out in doing so that I vastly prefer OpenGL to DirectX, when it comes to putting graphics on the monitor, but I must admit that I am uncertain how to create an input class.

What interface(s) do I have at my disposal that will allow me to query a joystick. I would also prefer it if the interface is one that is commonly used in Playstation games. Any PS platform is acceptable.

Thanks for you help,

Kevin


//------------[ this is part of the windowing code ]---------------------------------------[
char keys[256]={0};
char keysNew[256];

static LRESULT CALLBACK WndProc(HWND hWnd,UINT	uMsg,WPARAM	wParam,LPARAM	lParam){
	switch(uMsg){
		...
		case WM_KEYDOWN:
		{
			keys[wParam&255] = TRUE;
			keysNew[wParam&255]= TRUE;
			if(wParam==VK_ESCAPE)GameShouldExit=true;
			return 0;
		}

		case WM_KEYUP:
		{
			keys[wParam&255] = FALSE;
			return 0;
		}
		...
}

void xEnd(){
	SwapBuffers(hDC);
	//------[ message-pump ]------------------------[
	for(int i=0;i<256;i++)keysNew[i]=0;
	MSG	msg;
	while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
		if(msg.message==WM_QUIT)GameShouldExit=true;
		else{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	//---------------------------------------------/
}
//-----------------------------------------------------------------------------------------/


#define U8 unsigned char

typedef struct{
	U8 TRIANGLE,CIRCLE,CROSS,SQUARE,L2,R2,L1,R1,SELECT,START,L3,R3,LEFT,RIGHT,UP,DOWN;
}BUTTONS;
typedef struct{
	int x,y;
}SPOINT; // signed point

typedef struct{
	SPOINT LStick;
	SPOINT RStick;
	union{
		U8 buttons[16];
		BUTTONS Cur;
	};
	union{
		U8 newbuttons[16];
		BUTTONS New;
	};

	//enum{
	//	TRIANGLE,CIRCLE,CROSS,SQUARE,L2,R2,L1,R1,SELECT,START,L3,R3,LEFT,RIGHT,UP,DOWN
	//};
}JOYSTICK;

JOYSTICK Joy1={0};



void UpdateJoystick(){
	JOYSTICK j;
	JOYINFOEX t;
	int i;
	t.dwSize=sizeof(t);
	t.dwFlags=JOY_RETURNALL;
	memclear(&j,sizeof(j));
	if(JOYERR_NOERROR==joyGetPosEx(JOYSTICKID1,&t)){
		j.LStick.x = (t.dwXpos - 32768);
		j.LStick.y = (t.dwYpos - 32768);
		j.RStick.x = (t.dwRpos - 32768);
		j.RStick.y = (t.dwZpos - 32768);
		for(i=0;i<16;i++){
			j.buttons[i]= (t.dwButtons>>i)&1;
		}
		j.LStick.x/=256;
		j.LStick.y/=256;
		j.RStick.x/=256;
		j.RStick.y/=256;
		
		#define fixup(what) if(what>33)what-=33; else if(what<-33)what+=33; else what=0;
		fixup(j.LStick.x);
		fixup(j.LStick.y);
		fixup(j.RStick.x);
		fixup(j.RStick.y);
		#undef fixup

		if(t.dwPOV==27000)j.Cur.LEFT =1;
		if(t.dwPOV==9000 )j.Cur.RIGHT=1;
		if(t.dwPOV==0    )j.Cur.UP   =1;
		if(t.dwPOV==18000)j.Cur.DOWN =1;
	}

	//---------[ process keyboard ]-------------------[
	if(keys['A'])j.LStick.x= -128;
	if(keys['D'])j.LStick.x=  128;
	if(keys['W'])j.LStick.y= -128;
	if(keys['S'])j.LStick.y=  128;
	if(keys[VK_LEFT ])j.RStick.x= -128;
	if(keys[VK_RIGHT])j.RStick.x=  128;
	if(keys[VK_UP   ])j.RStick.y= -128;
	if(keys[VK_DOWN ])j.RStick.y=  128;

	if(keys['I'])j.Cur.TRIANGLE=1;
	if(keys['L'])j.Cur.CIRCLE=1;
	if(keys['K'])j.Cur.CROSS=1;
	if(keys['J'])j.Cur.SQUARE=1;
	if(keys[192])j.Cur.SELECT=1; // '~'
	if(keys['1'])j.Cur.START=1;
	if(keys[VK_RETURN])j.Cur.START=1;
	if(keys['U'])j.Cur.L1=1;
	if(keys['Y'])j.Cur.L2=1;
	if(keys['O'])j.Cur.R1=1;
	if(keys['P'])j.Cur.R2=1;
	if(keys['N'])j.Cur.L3=1;
	if(keys['M'])j.Cur.R3=1;
	if(keys['T'])j.Cur.UP=1;
	if(keys['G'])j.Cur.DOWN=1;
	if(keys['F'])j.Cur.LEFT=1;
	if(keys['H'])j.Cur.RIGHT=1;
	//------------------------------------------------/

	for(i=0;i<16;i++){
		U8 b1,b2;
		b1 = Joy1.buttons[i];
		b2 = j.buttons[i];
		j.newbuttons[i] = (b1^b2)&b2;
		j.buttons[i]=b2;
	}

	

	memcpy(&Joy1,&j,sizeof(j));

	
}



// this is example use of the gamepad:
void TranslateJoystick(){
	vec2 LStick = vec2(Joy1.LStick.x,Joy1.LStick.y);
	vec2 RStick = vec2(Joy1.RStick.x,Joy1.RStick.y);
	if(keys[VK_SHIFT]){LStick*=20;} // accelerate movement on holding SHIFT
	if(keys[VK_CONTROL]){LStick*=1.0/20.0;RStick*=1.0/20.0;}//decelerate movement on holding CONTROL
	CAMERA.MoveByGamepad(LStick.x,LStick.y,RStick.x,RStick.y);

	if(Joy1.New.R1){ // change camera type
		switch(CAMERA.type){
			case XCAMERA::USE_LOOKAT:			CAMERA.type=XCAMERA::USE_ROTATION;break;
			case XCAMERA::USE_ROTATION:		CAMERA.type=XCAMERA::USE_LOOKAT;break;
		}
	}

	extern int FPS_Count_Average;
	if(Joy1.Cur.TRIANGLE)CAMERA.pos.y+= 1.0*(60.0/FPS_Count_Average);
	if(Joy1.Cur.CROSS   )CAMERA.pos.y-= 1.0*(60.0/FPS_Count_Average);
	if(Joy1.New.R2)	CAMERA.Reset();
	if(Joy1.New.CIRCLE) GameShouldExit=true;

	if(Joy1.Cur.LEFT)light0_Pos.x-=1; else if(Joy1.Cur.RIGHT)light0_Pos.x+=1;
	if(Joy1.Cur.UP  )light0_Pos.z-=1; else if(Joy1.Cur.DOWN )light0_Pos.z+=1;


	if(keysNew[VK_F5]){ // reload shaders
		SHADER::FreeManager();
		SHADER::InitManager();
	}
	if(Joy1.Cur.SELECT && Joy1.New.START){
		static int interval=0;
		interval++;		if(interval>2)interval=0;
		wglSwapIntervalEXT(interval);
		//print(interval);
	}

}