diff --git a/JGE/src/SDLmain.cpp b/JGE/src/SDLmain.cpp index acfe7509c..fe135a27a 100644 --- a/JGE/src/SDLmain.cpp +++ b/JGE/src/SDLmain.cpp @@ -23,15 +23,16 @@ #define WAGIC_UPDATE_EVENT (SDL_USEREVENT + 1) class SdlApp { - private: + public: /* For easy interfacing with JGE static functions */ bool Running; SDL_Surface* Surf_Display; SDL_Rect viewPort; + Uint32 lastMouseUpTime; public: SdlApp() { Surf_Display = NULL; - + lastMouseUpTime = 0; Running = true; }; @@ -60,6 +61,8 @@ class SdlApp { bool OnInit(); void OnResize(int width, int height) { + DebugTrace("OnResize Width " << width << " height " << height); + if ((GLfloat)width / (GLfloat)height <= ACTUAL_RATIO) { viewPort.x = 0; @@ -86,8 +89,6 @@ class SdlApp { glMatrixMode (GL_PROJECTION); // Select The Projection Matrix glLoadIdentity (); // Reset The Projection Matrix - //gluOrtho2D(0.0f, (float) (viewPort.w)-1.0f, 0.0f, (float) (viewPort.h)-1.0f); - #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); #else @@ -101,13 +102,27 @@ class SdlApp { #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("Received Event : " << Event->type); switch(Event->type){ case SDL_QUIT: + { Running = false; break; + } + case SDL_WINDOWEVENT: + { /* On Android, this is triggered when the device orientation changed */ +#ifdef ANDROID + SDL_Window* window = SDL_GetWindowFromID(Event->window.windowID); + int h,w; + SDL_GetWindowSize(window, &w, &h); + OnResize(w, h); +#endif + break; + } case SDL_VIDEORESIZE: OnResize(Event->resize.w, Event->resize.h); break; @@ -119,9 +134,19 @@ class SdlApp { OnMouseMoved(Event->motion); break; case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: OnMouseClicked(Event->button); break; + case SDL_MOUSEBUTTONUP: + { + Uint32 eventTime = SDL_GetTicks(); + if(eventTime - lastMouseUpTime <= 500) { + OnMouseDoubleClicked(Event->button); + } else { + OnMouseClicked(Event->button); + } + lastMouseUpTime = eventTime; + break; + } case WAGIC_UPDATE_EVENT: OnUpdate(); break; @@ -162,8 +187,8 @@ static const struct { LocalKeySym keysym; JButton keycode; } gDefaultBindings[] { SDLK_k, JGE_BTN_SEC }, { SDLK_q, JGE_BTN_PREV }, { SDLK_a, JGE_BTN_NEXT }, -// fullscreen management seems somehow broken in JGE, it works fine with Qt directly -// { Qt::Key_F, JGE_BTN_FULLSCREEN }, + { SDLK_f, JGE_BTN_FULLSCREEN }, + { SDL_SCANCODE_AC_BACK, JGE_BTN_MENU }, }; void JGECreateDefaultBindings() @@ -179,6 +204,7 @@ int JGEGetTime() bool JGEToggleFullscreen() { + SDL_WM_ToggleFullScreen(g_SdlApp->Surf_Display); return true; } @@ -265,6 +291,16 @@ void SdlApp::OnMouseMoved(const SDL_MouseMotionEvent& event) } } +void SdlApp::OnMouseDoubleClicked(const SDL_MouseButtonEvent& event) +{ +#if (defined ANDROID) || (defined IOS) + if(event.button == SDL_BUTTON_LEFT) /* Left button */ + { + g_engine->HoldKey_NoRepeat(JGE_BTN_OK); + } +#endif +} + void SdlApp::OnMouseClicked(const SDL_MouseButtonEvent& event) { if(event.type == SDL_MOUSEBUTTONDOWN) @@ -283,7 +319,9 @@ void SdlApp::OnMouseClicked(const SDL_MouseButtonEvent& event) g_engine->LeftClicked( ((event.x-viewPort.x)*SCREEN_WIDTH)/actualWidth, ((event.y-viewPort.y)*SCREEN_HEIGHT)/actualHeight); +#if (!defined ANDROID) && (!defined IOS) g_engine->HoldKey_NoRepeat(JGE_BTN_OK); +#endif } else if(event.y < viewPort.y) { g_engine->HoldKey_NoRepeat(JGE_BTN_MENU); } else if(event.y > viewPort.y + viewPort.h) { @@ -306,7 +344,9 @@ void SdlApp::OnMouseClicked(const SDL_MouseButtonEvent& event) event.y <= viewPort.y + viewPort.h && event.x >= viewPort.x && event.x <= viewPort.x + viewPort.w) { +#if (!defined ANDROID) && (!defined IOS) g_engine->ReleaseKey(JGE_BTN_OK); +#endif } else if(event.y < viewPort.y) { g_engine->ReleaseKey(JGE_BTN_MENU); } else if(event.y > viewPort.y + viewPort.h) { @@ -325,10 +365,23 @@ void SdlApp::OnMouseClicked(const SDL_MouseButtonEvent& event) } bool SdlApp::OnInit() { + int window_w, window_h; + if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { return false; } + const SDL_VideoInfo *pVideoInfo = SDL_GetVideoInfo(); + DebugTrace("Video Display : h " << pVideoInfo->current_h << ", w " << pVideoInfo->current_w); + +#if (defined ANDROID) || (defined IOS) + window_w = pVideoInfo->current_w; + window_h = pVideoInfo->current_h; +#else + window_w = ACTUAL_SCREEN_WIDTH; + window_h = ACTUAL_SCREEN_HEIGHT; +#endif + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); @@ -343,10 +396,17 @@ bool SdlApp::OnInit() { SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2); - if((Surf_Display = SDL_SetVideoMode(ACTUAL_SCREEN_WIDTH, ACTUAL_SCREEN_HEIGHT, 32, /*SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER |*/ SDL_OPENGL | SDL_RESIZABLE)) == NULL) { + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + + if((Surf_Display = SDL_SetVideoMode(window_w, window_h, 32, +#ifdef ANDROID + SDL_OPENGL | SDL_FULLSCREEN | SDL_WINDOW_BORDERLESS)) == NULL) { +#else + SDL_OPENGL | SDL_RESIZABLE | SDL_WINDOW_BORDERLESS)) == NULL) { +#endif return false; } @@ -389,18 +449,17 @@ bool SdlApp::OnInit() { glEnable(GL_SCISSOR_TEST); // Enable Clipping - OnResize(ACTUAL_SCREEN_WIDTH, ACTUAL_SCREEN_HEIGHT); - - /* opengl needs to be fully initialized before starting the game */ if (!InitGame()) { cerr << "Could not init the game\n"; return false; } + OnResize(window_w, window_h); + JGECreateDefaultBindings(); - SDL_SetTimer(5, OnTimer); + SDL_SetTimer(30, OnTimer); return true; }; diff --git a/JGE/src/pc/JGfx.cpp b/JGE/src/pc/JGfx.cpp index b63fcdeb8..904f43853 100644 --- a/JGE/src/pc/JGfx.cpp +++ b/JGE/src/pc/JGfx.cpp @@ -9,7 +9,7 @@ //------------------------------------------------------------------------------------- #define GL_GLEXT_PROTOTYPES -#if (!defined IOS) && (!defined QT_CONFIG) +#if (!defined IOS) #ifdef WIN32 #pragma warning(disable : 4786) #pragma comment( lib, "giflib.lib" ) @@ -42,18 +42,12 @@ extern "C" { #endif #ifdef _DEBUG -void checkGlError() -{ - GLenum glError = glGetError(); - if(glError != 0) - printf("%s : %u : GLerror is %u\n", __FUNCTION__, __LINE__, glError); -} -/*#define checkGlError() \ +#define checkGlError() \ { \ GLenum glError = glGetError(); \ if(glError != 0) \ printf("%s : %u : GLerror is %u\n", __FUNCTION__, __LINE__, glError); \ -}/*/ +} #else #define checkGlError() (void(0)) #endif @@ -826,7 +820,7 @@ void JRenderer::BeginScene() esMatrixLoadIdentity(&theMvpMatrix); esOrtho(&theMvpMatrix, 0.0f, SCREEN_WIDTH_F, 0.0f, SCREEN_HEIGHT_F-1.0f,-1.0f, 1.0f); #endif //(!defined GL_ES_VERSION_2_0) && (!defined GL_VERSION_2_0) -#ifdef WIN32 +#if (defined WIN32) || (defined ANDROID) float scaleH = mActualHeight/SCREEN_HEIGHT_F; float scaleW = mActualWidth/SCREEN_WIDTH_F; if (scaleH != 1.0f || scaleW != 1.0f) @@ -963,44 +957,37 @@ void JRenderer::RenderQuad(JQuad* quad, float xo, float yo, float angle, float x // Use the program object glUseProgram ( prog2 ); - checkGlError(); // Load the vertex position glVertexAttribPointer ( prog2_positionLoc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), vVertices ); - checkGlError(); + // Load the texture coordinate glVertexAttribPointer ( prog2_texCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), &vVertices[3] ); - checkGlError(); + // Load the colors glVertexAttribPointer ( prog2_colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 4 * sizeof(GLubyte), colorCoords ); - checkGlError(); glEnableVertexAttribArray ( prog2_positionLoc ); - checkGlError(); + glEnableVertexAttribArray ( prog2_texCoordLoc ); - checkGlError(); + glEnableVertexAttribArray ( prog2_colorLoc ); - checkGlError(); // Load the MVP matrix glUniformMatrix4fv( prog2_mvpLoc, 1, GL_FALSE, (GLfloat*) &mvpMatrix.m[0][0] ); - checkGlError(); // Bind the texture glActiveTexture ( GL_TEXTURE0 ); - checkGlError(); + glBindTexture ( GL_TEXTURE_2D, mCurrentTex ); - checkGlError(); // Set the sampler texture unit to 0 glUniform1i ( prog2_samplerLoc, 0 ); - checkGlError(); glDrawArrays(GL_TRIANGLE_STRIP,0,4); - checkGlError(); #else glPushMatrix(); @@ -1273,7 +1260,7 @@ void JRenderer::FillRect(float x, float y, float width, float height, PIXEL_TYPE }; glVertexPointer(2,GL_FLOAT,0,vVertices); - glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors ); + glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors ); glDrawArrays(GL_TRIANGLE_STRIP,0,4); glDisableClientState(GL_COLOR_ARRAY); @@ -1635,7 +1622,7 @@ static int getNextPower2(int width) } -#if (!defined IOS) && (!defined QT_CONFIG) +#if (!defined IOS) static void jpg_null(j_decompress_ptr cinfo __attribute__((unused))) { } diff --git a/projects/mtg/Android/AndroidManifest.xml b/projects/mtg/Android/AndroidManifest.xml index 182232582..854f38694 100644 --- a/projects/mtg/Android/AndroidManifest.xml +++ b/projects/mtg/Android/AndroidManifest.xml @@ -3,8 +3,9 @@ package="org.libsdl.app" android:versionCode="1" android:versionName="1.0"> - + @@ -12,4 +13,5 @@ + diff --git a/projects/mtg/wagic.pro b/projects/mtg/wagic.pro index 6892cfb59..db6cf53d3 100644 --- a/projects/mtg/wagic.pro +++ b/projects/mtg/wagic.pro @@ -32,7 +32,7 @@ OBJECTS_DIR = objs MOC_DIR = objs DESTDIR = bin -unix:LIBS += -ljpeg -lgif -lpng12 +unix:LIBS += -ljpeg -lgif -lpng12 -lboost_thread-mt windows:LIBS += -L../../JGE/Dependencies/lib -llibjpeg-static-mt-debug -lgiflib -llibpng -lfmodvc macx|unix:LIBS += -lz