#ifndef INPUTHANDLER_H
#define INPUTHANDLER_H
#include "../defines.h"
enum
{
MOUSE_DOWN,
MOUSE_UP,
BUTTON_DOWN,
BUTTON_UP
};
class InputHandler
{
public:
InputHandler() {}
virtual ~InputHandler() {}
void PassEventHandler(SDL_Event ev)
{
SDL_GetMouseState(&x,&y);
while (SDL_PollEvent(&ev))
{
switch (ev.type)
{
case SDL_QUIT:
eFunc();
break;
case SDL_KEYDOWN:
if (ev.key.keysym.sym == SDLK_ESCAPE)
{
eFunc();
}
else
{
Keys[ev.key.keysym.sym] = true;
if(ev.key.keysym.sym == SDLK_F1)
{
ssFunc();
}
cbFunc(ev.key.keysym.sym,BUTTON_DOWN,ClassPointer);
}
break;
case SDL_KEYUP:
Keys[ev.key.keysym.sym] = false;
cbFunc(ev.key.keysym.sym,BUTTON_UP,ClassPointer);
break;
case SDL_MOUSEBUTTONDOWN:
if (ev.button.button == SDL_BUTTON_LEFT)
{
cbFunc(1,MOUSE_DOWN,ClassPointer);
mbl = true;
}
if (ev.button.button == SDL_BUTTON_RIGHT)
{
cbFunc(2,MOUSE_DOWN,ClassPointer);
mbr = true;
}
break;
case SDL_MOUSEBUTTONUP:
if (ev.button.button == SDL_BUTTON_LEFT)
{
cbFunc(1,MOUSE_UP,ClassPointer);
mbl = false;
}
if (ev.button.button == SDL_BUTTON_RIGHT)
{
cbFunc(2,MOUSE_UP,ClassPointer);
mbr = false;
}
break;
case SDL_MOUSEMOTION:
x = ev.button.x;
y = ev.button.y;
break;
}
}
}
int GetWinMousePosX()
{
return x;
}
int GetWinMousePosY()
{
return y;
}
float GetSDLMousePosX()
{
int viewport[4];
double modelview[16], projection[16];
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
int mx = x;
int my = viewport[3]-0;
GLdouble WinX,WinY,WinZ;
gluProject(0,0,0,modelview, projection, viewport, &WinX,&WinY,&WinZ);
GLdouble X,Y,Z;
gluUnProject((double)mx, (double)my,WinZ, modelview, projection, viewport, &X, &Y, &Z);
float Xf,Yf,Zf;
Xf = (float)X;
Yf = (float)Y;
Zf = (float)Z;
//std::cout<<"x: "<<X<<" y: "<<Y<<"\n";
//std::cout<<"iX: "<<x<<" iY "<<y<<"\n";
return Xf;
}
float GetSDLMousePosY()
{
int viewport[4];
double modelview[16], projection[16];
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
int mx = 0;
int my = viewport[3]-y;
GLdouble WinX,WinY,WinZ;
gluProject(0,0,0,modelview, projection, viewport, &WinX,&WinY,&WinZ);
GLdouble X,Y,Z;
gluUnProject((double)mx, (double)my,WinZ, modelview, projection, viewport, &X, &Y, &Z);
float Xf,Yf,Zf;
Xf = (float)X;
Yf = (float)Y;
Zf = (float)Z;
//std::cout<<"x: "<<X<<" y: "<<Y<<"\n";
return Yf;
}
bool ButtonDown(int Button)
{
return Keys[Button];
}
bool MouseDown(char button)
{
if(button=='l')
{
return mbl;
}
if(button=='r')
{
return mbr;
}else{
return false;
}
}
int RegisterExitCallback(void (*pt2Func)(void))
{
if (pt2Func == NULL)
{
return 1;
}
eFunc = pt2Func;
return 0;
}
int RegisterSSCallback(void (*pt2Func)(void))
{
if(pt2Func == NULL)
{
return 1;
}
ssFunc = pt2Func;
return 0;
}
int RegisterCallback(void (*pt2Func)(int,int,void*),void* pt2Class)
{
if (pt2Class != NULL)
{
ClassPointer = pt2Class;
}
else
{
return 1;
}
if (pt2Func != NULL)
{
cbFunc = pt2Func;
}
else
{
return 2;
}
return 0;
}
void (*ssFunc)(void);
protected:
private:
bool Keys[322];
bool mbl, mbr;
//bool left, right;
int x,y;
void (*cbFunc)(int,int,void*);
void (*eFunc)(void);
void* ClassPointer;
};
#endif // INPUTHANDLER_H