Checkpoint on getting touch events to come through SDL. This (deliberately) breaks the mouse emulation & cripples input on Android, as those calls are being replaced with real finger down/up/motion commands instead. More to come...

This commit is contained in:
wrenczes
2011-06-07 00:32:26 +00:00
parent 92dd1f2d40
commit f7cad41013
2 changed files with 448 additions and 358 deletions
@@ -23,6 +23,7 @@
#include <android/log.h> #include <android/log.h>
#include "SDL_events.h" #include "SDL_events.h"
#include "SDL_touch.h"
#include "../../events/SDL_mouse_c.h" #include "../../events/SDL_mouse_c.h"
#include "SDL_androidtouch.h" #include "SDL_androidtouch.h"
@@ -34,25 +35,65 @@
#define ACTION_CANCEL 3 #define ACTION_CANCEL 3
#define ACTION_OUTSIDE 4 #define ACTION_OUTSIDE 4
static SDL_TouchID gTouchID = 0;
SDL_Touch* CreateTouchInstance()
{
SDL_Touch touch;
touch.id = gTouchID;
touch.x_min = 0;
touch.x_max = 1;
touch.native_xres = touch.x_max - touch.x_min;
touch.y_min = 0;
touch.y_max = 1;
touch.native_yres = touch.y_max - touch.y_min;
touch.pressure_min = 0;
touch.pressure_max = 1;
touch.native_pressureres = touch.pressure_max - touch.pressure_min;
SDL_AddTouch(&touch, "");
return SDL_GetTouch(touch.id);
}
void Android_OnTouch(int action, float x, float y, float p) void Android_OnTouch(int action, float x, float y, float p)
{ {
if (!Android_Window) { if (!Android_Window)
{
return; return;
} }
if ((action != ACTION_CANCEL) && (action != ACTION_OUTSIDE)) { if ((action != ACTION_CANCEL) && (action != ACTION_OUTSIDE))
SDL_SetMouseFocus(Android_Window); {
SDL_SendMouseMotion(Android_Window, 0, (int)x, (int)y); //SDL_SetMouseFocus(Android_Window);
switch(action) { //SDL_SendMouseMotion(Android_Window, 0, (int)x, (int)y);
SDL_Touch* touch = SDL_GetTouch(gTouchID);
if (touch == NULL)
{
touch = CreateTouchInstance();
}
switch(action)
{
case ACTION_DOWN: case ACTION_DOWN:
SDL_SendMouseButton(Android_Window, SDL_PRESSED, SDL_BUTTON_LEFT); SDL_SendFingerDown(touch->id, 1, 1, x, y, p);
//SDL_SendMouseButton(Android_Window, SDL_PRESSED, SDL_BUTTON_LEFT);
break; break;
case ACTION_MOVE:
SDL_SendTouchMotion(touch->id, 1, 0, x, y, 1);
break;
case ACTION_UP: case ACTION_UP:
SDL_SendMouseButton(Android_Window, SDL_RELEASED, SDL_BUTTON_LEFT); SDL_SendFingerDown(touch->id, 1, 0, x, y, p);
//SDL_SendMouseButton(Android_Window, SDL_RELEASED, SDL_BUTTON_LEFT);
break; break;
} }
} else { }
SDL_SetMouseFocus(NULL); else
{
//SDL_SetMouseFocus(NULL);
} }
} }
+398 -349
View File
@@ -40,162 +40,188 @@ enum eDisplayMode
unsigned int gDisplayMode = DisplayMode_lowRes; unsigned int gDisplayMode = DisplayMode_lowRes;
class SdlApp { class SdlApp
public: /* For easy interfacing with JGE static functions */ {
bool Running; public: /* For easy interfacing with JGE static functions */
SDL_Window* window; bool Running;
SDL_Surface* Surf_Display; SDL_Window* window;
SDL_Rect viewPort; SDL_Surface* Surf_Display;
Uint32 lastMouseUpTime; SDL_Rect viewPort;
int windowed_w; Uint32 lastMouseUpTime;
int windowed_h; int windowed_w;
int windowed_pos_x; int windowed_h;
int windowed_pos_y; int windowed_pos_x;
int windowed_pos_y;
public: public:
SdlApp() { SdlApp() : Surf_Display(NULL), window(NULL), lastMouseUpTime(0), Running(true)
Surf_Display = NULL; {
window = NULL; }
lastMouseUpTime = 0;
Running = true;
};
int OnExecute() { int OnExecute()
if(OnInit() == false) { {
return -1; if (OnInit() == false)
} {
return -1;
}
SDL_Event Event; SDL_Event Event;
while(Running) { while(Running)
while(SDL_WaitEventTimeout(&Event, 0)) { {
OnEvent(&Event); while(SDL_WaitEventTimeout(&Event, 0))
{
OnEvent(&Event);
} }
OnUpdate(); OnUpdate();
} }
OnCleanup(); OnCleanup();
return 0; return 0;
}; };
public: public:
bool OnInit(); bool OnInit();
void OnResize(int width, int height) { void OnResize(int width, int height)
DebugTrace("OnResize Width " << width << " height " << height); {
DebugTrace("OnResize Width " << width << " height " << height);
if ((GLfloat)width / (GLfloat)height <= ACTUAL_RATIO) if ((GLfloat)width / (GLfloat)height <= ACTUAL_RATIO)
{ {
viewPort.x = 0; viewPort.x = 0;
viewPort.y = -(static_cast<int>(width / ACTUAL_RATIO) - height) / 2; viewPort.y = -(static_cast<int>(width / ACTUAL_RATIO) - height) / 2;
viewPort.w = width; viewPort.w = width;
viewPort.h = static_cast<int>(width / ACTUAL_RATIO); viewPort.h = static_cast<int>(width / ACTUAL_RATIO);
} }
else else
{ {
viewPort.x = -(static_cast<int>(height * ACTUAL_RATIO) - width) / 2; viewPort.x = -(static_cast<int>(height * ACTUAL_RATIO) - width) / 2;
viewPort.y = 0; viewPort.y = 0;
viewPort.w = static_cast<int>(height * ACTUAL_RATIO); viewPort.w = static_cast<int>(height * ACTUAL_RATIO);
viewPort.h = height; viewPort.h = height;
} }
glViewport(viewPort.x, viewPort.y, viewPort.w, viewPort.h); glViewport(viewPort.x, viewPort.y, viewPort.w, viewPort.h);
JRenderer::GetInstance()->SetActualWidth(static_cast<float>(viewPort.w)); JRenderer::GetInstance()->SetActualWidth(static_cast<float>(viewPort.w));
JRenderer::GetInstance()->SetActualHeight(static_cast<float>(viewPort.h)); JRenderer::GetInstance()->SetActualHeight(static_cast<float>(viewPort.h));
glScissor(0, 0, width, height); glScissor(0, 0, width, height);
#if (!defined GL_ES_VERSION_2_0) && (!defined GL_VERSION_2_0) #if (!defined GL_ES_VERSION_2_0) && (!defined GL_VERSION_2_0)
glMatrixMode (GL_PROJECTION); // Select The Projection Matrix glMatrixMode (GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity (); // Reset The Projection Matrix glLoadIdentity (); // Reset The Projection Matrix
#if (defined GL_VERSION_ES_CM_1_1) #if (defined GL_VERSION_ES_CM_1_1)
glOrthof(0.0f, (float) (viewPort.w)-1.0f, 0.0f, (float) (viewPort.h)-1.0f, -1.0f, 1.0f); glOrthof(0.0f, (float) (viewPort.w)-1.0f, 0.0f, (float) (viewPort.h)-1.0f, -1.0f, 1.0f);
#else #else
gluOrtho2D(0.0f, (float) (viewPort.w)-1.0f, 0.0f, (float) (viewPort.h)-1.0f); gluOrtho2D(0.0f, (float) (viewPort.w)-1.0f, 0.0f, (float) (viewPort.h)-1.0f);
#endif #endif
glMatrixMode (GL_MODELVIEW); // Select The Modelview Matrix glMatrixMode (GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity (); // Reset The Modelview Matrix glLoadIdentity (); // Reset The Modelview Matrix
glDisable (GL_DEPTH_TEST); glDisable (GL_DEPTH_TEST);
#endif #endif
}; }
void OnKeyPressed(const SDL_KeyboardEvent& event);
void OnMouseDoubleClicked(const SDL_MouseButtonEvent& event);
void OnMouseClicked(const SDL_MouseButtonEvent& event);
void OnMouseMoved(const SDL_MouseMotionEvent& event);
void OnEvent(SDL_Event* Event) {
/* if(Event->type < SDL_USEREVENT)
DebugTrace("Event received" << Event->type);*/
switch(Event->type){
case SDL_QUIT:
{
Running = false;
break;
}
case SDL_WINDOWEVENT:
{ /* On Android, this is triggered when the device orientation changed */
window = SDL_GetWindowFromID(Event->window.windowID);
int h,w;
SDL_GetWindowSize(window, &w, &h);
OnResize(w, h);
break;
}
case SDL_KEYDOWN: void OnKeyPressed(const SDL_KeyboardEvent& event);
case SDL_KEYUP: void OnMouseDoubleClicked(const SDL_MouseButtonEvent& event);
OnKeyPressed(Event->key); void OnMouseClicked(const SDL_MouseButtonEvent& event);
break; void OnMouseMoved(const SDL_MouseMotionEvent& event);
case SDL_MOUSEMOTION:
OnMouseMoved(Event->motion); void OnEvent(SDL_Event* Event)
break; {
case SDL_MOUSEBUTTONDOWN: /* if(Event->type < SDL_USEREVENT)
OnMouseClicked(Event->button); DebugTrace("Event received" << Event->type);*/
break; switch(Event->type)
case SDL_MOUSEBUTTONUP: {
{ case SDL_QUIT:
Uint32 eventTime = SDL_GetTicks(); Running = false;
if(eventTime - lastMouseUpTime <= 500) { break;
OnMouseDoubleClicked(Event->button);
} else { /* On Android, this is triggered when the device orientation changed */
OnMouseClicked(Event->button); case SDL_WINDOWEVENT:
} window = SDL_GetWindowFromID(Event->window.windowID);
lastMouseUpTime = eventTime; int h,w;
break; SDL_GetWindowSize(window, &w, &h);
} OnResize(w, h);
case SDL_FINGERMOTION: break;
{
DebugTrace("FingerMotion : touchId " << Event->tfinger.touchId case SDL_KEYDOWN:
<< ", fingerId " << Event->tfinger.fingerId case SDL_KEYUP:
<< ", state " << Event->tfinger.state OnKeyPressed(Event->key);
<< ", x " << Event->tfinger.x break;
<< ", y " << Event->tfinger.y
<< ", dy " << Event->tfinger.dx case SDL_MOUSEMOTION:
<< ", dy " << Event->tfinger.dy OnMouseMoved(Event->motion);
<< ", pressure " << Event->tfinger.pressure break;
);
break; case SDL_MOUSEBUTTONDOWN:
} OnMouseClicked(Event->button);
case SDL_MULTIGESTURE: break;
{
DebugTrace("Multigesure : touchId " << Event->mgesture.touchId case SDL_MOUSEBUTTONUP:
<< ", x " << Event->mgesture.x {
<< ", y " << Event->mgesture.y Uint32 eventTime = SDL_GetTicks();
<< ", dTheta " << Event->mgesture.dTheta if (eventTime - lastMouseUpTime <= 500)
<< ", dDist " << Event->mgesture.dDist {
<< ", numFinder " << Event->mgesture.numFingers); OnMouseDoubleClicked(Event->button);
break; }
} else
{
OnMouseClicked(Event->button);
}
lastMouseUpTime = eventTime;
} }
}
void OnUpdate(); break;
void OnCleanup() {
SDL_FreeSurface(Surf_Display); case SDL_FINGERMOTION:
SDL_Quit(); DebugTrace("FingerMotion : touchId " << Event->tfinger.touchId
} << ", fingerId " << Event->tfinger.fingerId
<< ", state " << Event->tfinger.state
<< ", x " << Event->tfinger.x
<< ", y " << Event->tfinger.y
<< ", dy " << Event->tfinger.dx
<< ", dy " << Event->tfinger.dy
<< ", pressure " << Event->tfinger.pressure
);
OnMouseMoved(Event->motion);
break;
case SDL_FINGERDOWN:
DebugTrace("FingerDown msg");
OnMouseClicked(Event->button);
break;
case SDL_FINGERUP:
DebugTrace("FingerUp msg");
DebugTrace("X: " << Event->button.x << ", Y: " << Event->button.y);
OnMouseDoubleClicked(Event->button);
break;
case SDL_MULTIGESTURE:
DebugTrace("Multigesture : touchId " << Event->mgesture.touchId
<< ", x " << Event->mgesture.x
<< ", y " << Event->mgesture.y
<< ", dTheta " << Event->mgesture.dTheta
<< ", dDist " << Event->mgesture.dDist
<< ", numFinder " << Event->mgesture.numFingers);
break;
}
}
void OnUpdate();
void OnCleanup()
{
SDL_FreeSurface(Surf_Display);
SDL_Quit();
}
}; };
uint64_t lastTickCount; uint64_t lastTickCount;
@@ -208,52 +234,52 @@ SdlApp *g_SdlApp = NULL;
static const struct { LocalKeySym keysym; JButton keycode; } gDefaultBindings[] = static const struct { LocalKeySym keysym; JButton keycode; } gDefaultBindings[] =
{ {
/* windows controls */ /* windows controls */
{ SDLK_LCTRL, JGE_BTN_CTRL }, { SDLK_LCTRL, JGE_BTN_CTRL },
{ SDLK_RCTRL, JGE_BTN_CTRL }, { SDLK_RCTRL, JGE_BTN_CTRL },
{ SDLK_RETURN, JGE_BTN_MENU }, { SDLK_RETURN, JGE_BTN_MENU },
{ SDLK_KP_ENTER, JGE_BTN_MENU }, { SDLK_KP_ENTER, JGE_BTN_MENU },
{ SDLK_ESCAPE, JGE_BTN_MENU }, { SDLK_ESCAPE, JGE_BTN_MENU },
{ SDLK_UP, JGE_BTN_UP }, { SDLK_UP, JGE_BTN_UP },
{ SDLK_DOWN, JGE_BTN_DOWN }, { SDLK_DOWN, JGE_BTN_DOWN },
{ SDLK_LEFT, JGE_BTN_LEFT }, { SDLK_LEFT, JGE_BTN_LEFT },
{ SDLK_RIGHT, JGE_BTN_RIGHT }, { SDLK_RIGHT, JGE_BTN_RIGHT },
{ SDLK_z, JGE_BTN_UP }, { SDLK_z, JGE_BTN_UP },
{ SDLK_d, JGE_BTN_RIGHT }, { SDLK_d, JGE_BTN_RIGHT },
{ SDLK_s, JGE_BTN_DOWN }, { SDLK_s, JGE_BTN_DOWN },
{ SDLK_q, JGE_BTN_LEFT }, { SDLK_q, JGE_BTN_LEFT },
{ SDLK_a, JGE_BTN_PREV }, { SDLK_a, JGE_BTN_PREV },
{ SDLK_e, JGE_BTN_NEXT }, { SDLK_e, JGE_BTN_NEXT },
{ SDLK_i, JGE_BTN_CANCEL }, { SDLK_i, JGE_BTN_CANCEL },
{ SDLK_l, JGE_BTN_OK }, { SDLK_l, JGE_BTN_OK },
{ SDLK_SPACE, JGE_BTN_OK }, { SDLK_SPACE, JGE_BTN_OK },
{ SDLK_k, JGE_BTN_SEC }, { SDLK_k, JGE_BTN_SEC },
{ SDLK_j, JGE_BTN_PRI }, { SDLK_j, JGE_BTN_PRI },
{ SDLK_f, JGE_BTN_FULLSCREEN }, { SDLK_f, JGE_BTN_FULLSCREEN },
/* old Qt ones, basically modified to comply with the N900 keyboard /* old Qt ones, basically modified to comply with the N900 keyboard
{ SDLK_a, JGE_BTN_NEXT }, { SDLK_a, JGE_BTN_NEXT },
{ SDLK_TAB, JGE_BTN_CANCEL }, { SDLK_TAB, JGE_BTN_CANCEL },
{ SDLK_q, JGE_BTN_PREV }, { SDLK_q, JGE_BTN_PREV },
{ SDLK_BACKSPACE, JGE_BTN_CTRL }, { SDLK_BACKSPACE, JGE_BTN_CTRL },
*/ */
/* Android customs */ /* Android customs */
{ SDLK_AC_BACK, JGE_BTN_MENU }, { SDLK_AC_BACK, JGE_BTN_MENU },
/* Android/maemo volume button mapping */ /* Android/maemo volume button mapping */
{ SDLK_VOLUMEUP, JGE_BTN_PREV }, { SDLK_VOLUMEUP, JGE_BTN_PREV },
{ SDLK_VOLUMEDOWN, JGE_BTN_SEC}, { SDLK_VOLUMEDOWN, JGE_BTN_SEC},
}; };
void JGECreateDefaultBindings() void JGECreateDefaultBindings()
{ {
for (signed int i = sizeof(gDefaultBindings)/sizeof(gDefaultBindings[0]) - 1; i >= 0; --i) for (signed int i = sizeof(gDefaultBindings)/sizeof(gDefaultBindings[0]) - 1; i >= 0; --i)
g_engine->BindKey(gDefaultBindings[i].keysym, gDefaultBindings[i].keycode); g_engine->BindKey(gDefaultBindings[i].keysym, gDefaultBindings[i].keycode);
} }
int JGEGetTime() int JGEGetTime()
{ {
return (int)SDL_GetTicks(); return (int)SDL_GetTicks();
} }
bool JGEToggleFullscreen() bool JGEToggleFullscreen()
@@ -305,250 +331,273 @@ bool JGEToggleFullscreen()
bool InitGame(void) bool InitGame(void)
{ {
g_engine = JGE::GetInstance(); g_engine = JGE::GetInstance();
g_app = g_launcher->GetGameApp(); g_app = g_launcher->GetGameApp();
g_app->Create(); g_app->Create();
g_engine->SetApp(g_app); g_engine->SetApp(g_app);
JRenderer::GetInstance()->Enable2D(); JRenderer::GetInstance()->Enable2D();
lastTickCount = JGEGetTime(); lastTickCount = JGEGetTime();
return true; return true;
} }
void DestroyGame(void) void DestroyGame(void)
{ {
g_engine->SetApp(NULL); g_engine->SetApp(NULL);
if (g_app) if (g_app)
{ {
g_app->Destroy(); g_app->Destroy();
delete g_app; delete g_app;
g_app = NULL; g_app = NULL;
} }
JGE::Destroy(); JGE::Destroy();
g_engine = NULL; g_engine = NULL;
} }
void SdlApp::OnUpdate() void SdlApp::OnUpdate()
{ {
static int tickCount = 0; static int tickCount = 0;
tickCount = JGEGetTime(); tickCount = JGEGetTime();
int64_t dt = (tickCount - lastTickCount); int64_t dt = (tickCount - lastTickCount);
lastTickCount = tickCount; lastTickCount = tickCount;
if(g_engine->IsDone()) { if(g_engine->IsDone())
SDL_Event event; {
event.user.type = SDL_QUIT; SDL_Event event;
SDL_PushEvent(&event); event.user.type = SDL_QUIT;
} SDL_PushEvent(&event);
}
try { try
g_engine->SetDelta((float)dt / 1000.0f); {
g_engine->Update((float)dt / 1000.0f); g_engine->SetDelta((float)dt / 1000.0f);
} catch(out_of_range& oor) { g_engine->Update((float)dt / 1000.0f);
cerr << oor.what(); }
} catch(out_of_range& oor)
{
cerr << oor.what();
}
if(g_engine) if(g_engine)
g_engine->Render(); g_engine->Render();
SDL_GL_SwapBuffers(); SDL_GL_SwapBuffers();
} }
void SdlApp::OnKeyPressed(const SDL_KeyboardEvent& event) void SdlApp::OnKeyPressed(const SDL_KeyboardEvent& event)
{ {
if(event.type == SDL_KEYDOWN) { if (event.type == SDL_KEYDOWN)
g_engine->HoldKey_NoRepeat((LocalKeySym)event.keysym.sym); {
} else if(event.type == SDL_KEYUP) { g_engine->HoldKey_NoRepeat((LocalKeySym)event.keysym.sym);
g_engine->ReleaseKey((LocalKeySym)event.keysym.sym); }
} else if(event.type == SDL_KEYUP)
{
g_engine->ReleaseKey((LocalKeySym)event.keysym.sym);
}
} }
void SdlApp::OnMouseMoved(const SDL_MouseMotionEvent& event) void SdlApp::OnMouseMoved(const SDL_MouseMotionEvent& event)
{ {
int actualWidth = (int) JRenderer::GetInstance()->GetActualWidth(); int actualWidth = (int) JRenderer::GetInstance()->GetActualWidth();
int actualHeight = (int) JRenderer::GetInstance()->GetActualHeight(); int actualHeight = (int) JRenderer::GetInstance()->GetActualHeight();
if (event.y >= viewPort.y && if (event.y >= viewPort.y &&
event.y <= viewPort.y + viewPort.h && event.y <= viewPort.y + viewPort.h &&
event.x >= viewPort.x && event.x >= viewPort.x &&
event.x <= viewPort.x + viewPort.w) { event.x <= viewPort.x + viewPort.w)
g_engine->LeftClicked( {
((event.x-viewPort.x)*SCREEN_WIDTH)/actualWidth, g_engine->LeftClicked(
((event.y-viewPort.y)*SCREEN_HEIGHT)/actualHeight); ((event.x-viewPort.x)*SCREEN_WIDTH)/actualWidth,
} ((event.y-viewPort.y)*SCREEN_HEIGHT)/actualHeight);
}
} }
void SdlApp::OnMouseDoubleClicked(const SDL_MouseButtonEvent& event) void SdlApp::OnMouseDoubleClicked(const SDL_MouseButtonEvent& event)
{ {
#if (defined ANDROID) || (defined IOS) #if (defined ANDROID) || (defined IOS)
if(event.button == SDL_BUTTON_LEFT) /* Left button */ if(event.button == SDL_BUTTON_LEFT) /* Left button */
{ {
g_engine->HoldKey_NoRepeat(JGE_BTN_OK); g_engine->HoldKey_NoRepeat(JGE_BTN_OK);
} }
#endif #endif
} }
void SdlApp::OnMouseClicked(const SDL_MouseButtonEvent& event) void SdlApp::OnMouseClicked(const SDL_MouseButtonEvent& event)
{ {
if(event.type == SDL_MOUSEBUTTONDOWN) if (event.type == SDL_MOUSEBUTTONDOWN)
{ {
if(event.button == SDL_BUTTON_LEFT) /* Left button */ if (event.button == SDL_BUTTON_LEFT) /* Left button */
{ {
// this is intended to convert window coordinate into game coordinate. // this is intended to convert window coordinate into game coordinate.
// this is correct only if the game and window have the same aspect ratio, otherwise, it's just wrong // this is correct only if the game and window have the same aspect ratio, otherwise, it's just wrong
int actualWidth = (int) JRenderer::GetInstance()->GetActualWidth(); int actualWidth = (int) JRenderer::GetInstance()->GetActualWidth();
int actualHeight = (int) JRenderer::GetInstance()->GetActualHeight(); int actualHeight = (int) JRenderer::GetInstance()->GetActualHeight();
if (event.y >= viewPort.y && if (event.y >= viewPort.y &&
event.y <= viewPort.y + viewPort.h && event.y <= viewPort.y + viewPort.h &&
event.x >= viewPort.x && event.x >= viewPort.x &&
event.x <= viewPort.x + viewPort.w) { event.x <= viewPort.x + viewPort.w)
g_engine->LeftClicked( {
((event.x-viewPort.x)*SCREEN_WIDTH)/actualWidth, g_engine->LeftClicked(
((event.y-viewPort.y)*SCREEN_HEIGHT)/actualHeight); ((event.x-viewPort.x)*SCREEN_WIDTH)/actualWidth,
((event.y-viewPort.y)*SCREEN_HEIGHT)/actualHeight);
#if (!defined ANDROID) && (!defined IOS) #if (!defined ANDROID) && (!defined IOS)
g_engine->HoldKey_NoRepeat(JGE_BTN_OK); g_engine->HoldKey_NoRepeat(JGE_BTN_OK);
#endif #endif
} else if(event.y < viewPort.y) { }
g_engine->HoldKey_NoRepeat(JGE_BTN_MENU); else if(event.y < viewPort.y)
} else if(event.y > viewPort.y + viewPort.h) { {
g_engine->HoldKey_NoRepeat(JGE_BTN_NEXT); g_engine->HoldKey_NoRepeat(JGE_BTN_MENU);
} }
} else if(event.y > viewPort.y + viewPort.h)
else if(event.button == SDL_BUTTON_RIGHT) /* Right button */ {
{ /* next phase please */ g_engine->HoldKey_NoRepeat(JGE_BTN_NEXT);
g_engine->HoldKey_NoRepeat(JGE_BTN_PREV); }
} }
else if(event.button == SDL_BUTTON_MIDDLE) /* Middle button */ else if(event.button == SDL_BUTTON_RIGHT) /* Right button */
{ /* interrupt please */ { /* next phase please */
g_engine->HoldKey_NoRepeat(JGE_BTN_SEC); g_engine->HoldKey_NoRepeat(JGE_BTN_PREV);
} }
} else if (event.type == SDL_MOUSEBUTTONUP) else if(event.button == SDL_BUTTON_MIDDLE) /* Middle button */
{ { /* interrupt please */
if(event.button == SDL_BUTTON_LEFT) g_engine->HoldKey_NoRepeat(JGE_BTN_SEC);
{ }
if (event.y >= viewPort.y && }
event.y <= viewPort.y + viewPort.h && else if (event.type == SDL_MOUSEBUTTONUP)
event.x >= viewPort.x && {
event.x <= viewPort.x + viewPort.w) { if(event.button == SDL_BUTTON_LEFT)
{
if (event.y >= viewPort.y &&
event.y <= viewPort.y + viewPort.h &&
event.x >= viewPort.x &&
event.x <= viewPort.x + viewPort.w)
{
#if (!defined ANDROID) && (!defined IOS) #if (!defined ANDROID) && (!defined IOS)
g_engine->ReleaseKey(JGE_BTN_OK); g_engine->ReleaseKey(JGE_BTN_OK);
#endif #endif
} else if(event.y < viewPort.y) { }
g_engine->ReleaseKey(JGE_BTN_MENU); else if(event.y < viewPort.y)
} else if(event.y > viewPort.y + viewPort.h) { {
g_engine->ReleaseKey(JGE_BTN_NEXT); g_engine->ReleaseKey(JGE_BTN_MENU);
} }
} else if(event.y > viewPort.y + viewPort.h)
else if(event.button == SDL_BUTTON_RIGHT) {
{ /* next phase please */ g_engine->ReleaseKey(JGE_BTN_NEXT);
g_engine->ReleaseKey(JGE_BTN_PREV); }
} }
else if(event.button == SDL_BUTTON_MIDDLE) else if(event.button == SDL_BUTTON_RIGHT)
{ /* interrupt please */ { /* next phase please */
g_engine->ReleaseKey(JGE_BTN_SEC); g_engine->ReleaseKey(JGE_BTN_PREV);
} }
} else if(event.button == SDL_BUTTON_MIDDLE)
{ /* interrupt please */
g_engine->ReleaseKey(JGE_BTN_SEC);
}
}
} }
bool SdlApp::OnInit() { bool SdlApp::OnInit()
int window_w, window_h; {
int window_w, window_h;
if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
return false; {
} return false;
}
const SDL_VideoInfo *pVideoInfo = SDL_GetVideoInfo(); const SDL_VideoInfo *pVideoInfo = SDL_GetVideoInfo();
DebugTrace("Video Display : h " << pVideoInfo->current_h << ", w " << pVideoInfo->current_w); DebugTrace("Video Display : h " << pVideoInfo->current_h << ", w " << pVideoInfo->current_w);
#if (defined ANDROID) || (defined IOS) #if (defined ANDROID) || (defined IOS)
window_w = pVideoInfo->current_w; window_w = pVideoInfo->current_w;
window_h = pVideoInfo->current_h; window_h = pVideoInfo->current_h;
#else #else
window_w = ACTUAL_SCREEN_WIDTH; window_w = ACTUAL_SCREEN_WIDTH;
window_h = ACTUAL_SCREEN_HEIGHT; window_h = ACTUAL_SCREEN_HEIGHT;
#endif #endif
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32); SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
if((Surf_Display = SDL_SetVideoMode(window_w, window_h, 32, if((Surf_Display = SDL_SetVideoMode(window_w, window_h, 32,
#ifdef ANDROID #ifdef ANDROID
SDL_OPENGL | SDL_FULLSCREEN | SDL_WINDOW_BORDERLESS)) == NULL) { SDL_OPENGL | SDL_FULLSCREEN | SDL_WINDOW_BORDERLESS)) == NULL)
{
#else #else
SDL_OPENGL | SDL_RESIZABLE )) == NULL) { SDL_OPENGL | SDL_RESIZABLE )) == NULL)
{
#endif #endif
return false; return false;
} }
SDL_WM_SetCaption(g_launcher->GetName(), ""); SDL_WM_SetCaption(g_launcher->GetName(), "");
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background (yes that's the way fuckers) glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background (yes that's the way fuckers)
#if (defined GL_ES_VERSION_2_0) || (defined GL_VERSION_2_0) #if (defined GL_ES_VERSION_2_0) || (defined GL_VERSION_2_0)
#if (defined GL_ES_VERSION_2_0) #if (defined GL_ES_VERSION_2_0)
glClearDepthf(1.0f); // Depth Buffer Setup glClearDepthf(1.0f); // Depth Buffer Setup
#else #else
glClearDepth(1.0f); // Depth Buffer Setup glClearDepth(1.0f); // Depth Buffer Setup
#endif// (defined GL_ES_VERSION_2_0) #endif// (defined GL_ES_VERSION_2_0)
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing (Less Or Equal) glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing (Less Or Equal)
glEnable(GL_DEPTH_TEST); // Enable Depth Testing glEnable(GL_DEPTH_TEST); // Enable Depth Testing
#else #else
#if (defined GL_VERSION_ES_CM_1_1) #if (defined GL_VERSION_ES_CM_1_1)
glClearDepthf(1.0f); // Depth Buffer Setup glClearDepthf(1.0f); // Depth Buffer Setup
#else #else
glClearDepth(1.0f); // Depth Buffer Setup glClearDepth(1.0f); // Depth Buffer Setup
#endif #endif
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing (Less Or Equal) glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing (Less Or Equal)
glEnable(GL_DEPTH_TEST); // Enable Depth Testing glEnable(GL_DEPTH_TEST); // Enable Depth Testing
glShadeModel(GL_SMOOTH); // Select Smooth Shading glShadeModel(GL_SMOOTH); // Select Smooth Shading
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Set Perspective Calculations To Most Accurate glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Set Perspective Calculations To Most Accurate
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Set Line Antialiasing glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Set Line Antialiasing
glEnable(GL_LINE_SMOOTH); // Enable it! glEnable(GL_LINE_SMOOTH); // Enable it!
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
#endif #endif
glEnable(GL_CULL_FACE); // do not calculate inside of poly's glEnable(GL_CULL_FACE); // do not calculate inside of poly's
glFrontFace(GL_CCW); // counter clock-wise polygons are out glFrontFace(GL_CCW); // counter clock-wise polygons are out
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_SCISSOR_TEST); // Enable Clipping glEnable(GL_SCISSOR_TEST); // Enable Clipping
if (!InitGame()) if (!InitGame())
{ {
cerr << "Could not init the game\n"; cerr << "Could not init the game\n";
return false; return false;
} }
OnResize(window_w, window_h); OnResize(window_w, window_h);
JGECreateDefaultBindings(); JGECreateDefaultBindings();
return true; return true;
}; };
#if (defined ANDROID) || (defined WIN32) #if (defined ANDROID) || (defined WIN32)
@@ -559,27 +608,27 @@ int main(int argc, char* argv[])
{ {
DebugTrace("I R in da native"); DebugTrace("I R in da native");
g_launcher = new JGameLauncher(); g_launcher = new JGameLauncher();
u32 flags = g_launcher->GetInitFlags(); u32 flags = g_launcher->GetInitFlags();
if ((flags&JINIT_FLAG_ENABLE3D)!=0) if ((flags&JINIT_FLAG_ENABLE3D)!=0)
{ {
JRenderer::Set3DFlag(true); JRenderer::Set3DFlag(true);
} }
g_SdlApp = new SdlApp(); g_SdlApp = new SdlApp();
int result = g_SdlApp->OnExecute(); int result = g_SdlApp->OnExecute();
if (g_launcher) if (g_launcher)
delete g_launcher; delete g_launcher;
if(g_SdlApp) if(g_SdlApp)
delete g_SdlApp; delete g_SdlApp;
// Shutdown // Shutdown
DestroyGame(); DestroyGame();
return result; return result;
} }