From 0741c52be5184c28b201e1a8ac7900bf5227c0ab Mon Sep 17 00:00:00 2001 From: pelya Date: Sun, 11 Nov 2012 22:59:24 +0200 Subject: [PATCH] Updated OpenGL test app --- project/jni/application/opengl_hello/Makefile | 3 - .../application/opengl_hello/sdl_hello.cpp | 151 ------------ .../AndroidAppSettings.cfg | 29 ++- .../AndroidData/data2.zip | Bin 24948 -> 37512 bytes project/jni/application/test-opengl/Makefile | 4 + .../{opengl_hello => test-opengl}/icon.png | Bin .../jni/application/test-opengl/sdl_hello.cpp | 228 ++++++++++++++++++ 7 files changed, 256 insertions(+), 159 deletions(-) delete mode 100644 project/jni/application/opengl_hello/Makefile delete mode 100644 project/jni/application/opengl_hello/sdl_hello.cpp rename project/jni/application/{opengl_hello => test-opengl}/AndroidAppSettings.cfg (57%) rename project/jni/application/{opengl_hello => test-opengl}/AndroidData/data2.zip (66%) create mode 100644 project/jni/application/test-opengl/Makefile rename project/jni/application/{opengl_hello => test-opengl}/icon.png (100%) create mode 100644 project/jni/application/test-opengl/sdl_hello.cpp diff --git a/project/jni/application/opengl_hello/Makefile b/project/jni/application/opengl_hello/Makefile deleted file mode 100644 index 204680d27..000000000 --- a/project/jni/application/opengl_hello/Makefile +++ /dev/null @@ -1,3 +0,0 @@ - -sdl_hello: *.cpp - g++ -o $@ $? `sdl-config --cflags` `sdl-config --libs` -lGL diff --git a/project/jni/application/opengl_hello/sdl_hello.cpp b/project/jni/application/opengl_hello/sdl_hello.cpp deleted file mode 100644 index 1d741e068..000000000 --- a/project/jni/application/opengl_hello/sdl_hello.cpp +++ /dev/null @@ -1,151 +0,0 @@ -#include -#include -#include - -GLuint texture; - -// I've tweaked coordinates a bit to my taste -GLfloat textureCoordinates[] = { 0.0f, 1.0f, - 0.0f, 0.0f, - 1.0f, 0.0f, - 1.0f, 1.0f }; -GLfloat vertices[] = { - 100, 100, - 100, 300, - 300, 300, - 300, 100 }; - -int loadImage() { - SDL_Surface *pic; - SDL_Surface *tmp; - - glGenTextures(1, &texture); - - glBindTexture(GL_TEXTURE_2D, texture); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); - - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - pic = IMG_Load("test.png"); - - // check power of 2 - if (!pic || !pic->w || !pic->h || (pic->w & 1) || (pic->h & 1)) { - - return -1; - } - - tmp = SDL_CreateRGBSurface(0, pic->w, pic->h, 16, 0xF800, 0x7E0, 0x1F, 0); // Correct bits of RGB565 color format - SDL_BlitSurface(pic, NULL, tmp, NULL); - - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pic->w, pic->h, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, tmp->pixels); - - SDL_FreeSurface(pic); - SDL_FreeSurface(tmp); - - return 0; -} - - -int width = 640; -int height = 480; - - -static void -initGL() -{ - - glViewport(0, 0, width, height); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - glOrthof(0.0f, width, 0.0f, height, -1.0f, 1.0f); - glMatrixMode(GL_MODELVIEW); - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glDisable(GL_DEPTH_TEST); - glEnable(GL_TEXTURE_2D); - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - -} - -static void -draw() -{ - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Always clear your scene before rendering, unless you're sure that you'll fill whole screen with textures/models etc - - // You have to this each frame, because SDL messes up with your GL context when drawing on-screen keyboard, however is taves/restores your matrices - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Just to be sure - glEnable(GL_TEXTURE_2D); - glDisable(GL_BLEND); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - glBindTexture(GL_TEXTURE_2D, texture); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glVertexPointer(2, GL_FLOAT, 0, vertices); - glTexCoordPointer(2, GL_FLOAT, 0, textureCoordinates); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); // You may just replace all your GL_QUADS with GL_TRIANGLE_FAN and it will draw absolutely identically with same coordinates, if you have just 4 coords. - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); -} - - - - -int -main(int argc, char *argv[]) -{ - - SDL_Surface *screen; - int done; - Uint8 *keys; - - SDL_Init(SDL_INIT_VIDEO); - - // Set native device screen resolution, if you want 640x480 select SdlVideoResize=y in AndroidAppSettings.cfg - width = SDL_ListModes(NULL, 0)[0]->w; - height = SDL_ListModes(NULL, 0)[0]->h; - - screen = SDL_SetVideoMode(width, height, 16, SDL_OPENGL|SDL_DOUBLEBUF); - if ( ! screen ) { - fprintf(stderr, "Couldn't set GL video mode: %s\n", SDL_GetError()); - SDL_Quit(); - exit(2); - } - SDL_WM_SetCaption("test", "test"); - - initGL(); - loadImage(); - while ( ! SDL_GetKeyState(NULL)[SDLK_ESCAPE] ) // Exit by pressing Back button - { - draw(); - SDL_GL_SwapBuffers(); - SDL_Event event; - while( SDL_PollEvent(&event) ) ; // Do nothing, just process keyboard/mouse events internally - // Some kinda animation - //SDL_Delay(200); - static float diff = 1.0f; - vertices[0] += diff; - vertices[2] += diff; - vertices[4] += diff; - vertices[6] += diff; - if( vertices[4] > width ) - diff = -1.0f; - if( vertices[0] < 0 ) - diff = 1.0f; - } - - SDL_Quit(); - return 0; -} diff --git a/project/jni/application/opengl_hello/AndroidAppSettings.cfg b/project/jni/application/test-opengl/AndroidAppSettings.cfg similarity index 57% rename from project/jni/application/opengl_hello/AndroidAppSettings.cfg rename to project/jni/application/test-opengl/AndroidAppSettings.cfg index 8352ab7ed..a2f1d5938 100644 --- a/project/jni/application/opengl_hello/AndroidAppSettings.cfg +++ b/project/jni/application/test-opengl/AndroidAppSettings.cfg @@ -1,34 +1,53 @@ # The application settings for Android libSDL port -AppSettingVersion=16 +AppSettingVersion=17 LibSdlVersion=1.2 AppName="OpenGL SDL test" AppFullName=org.opengl.sdl.test ScreenOrientation=h InhibitSuspend=n AppDataDownloadUrl="Gamedata|data2.zip" +VideoDepthBpp=24 +NeedDepthBuffer=y +NeedStencilBuffer=n +NeedGles2=n +SwVideoMode=n SdlVideoResize=n SdlVideoResizeKeepAspect=n -NeedDepthBuffer=y -AppUsesMouse=n +CompatibilityHacks=n +CompatibilityHacksStaticInit=n +CompatibilityHacksTextInputEmulatesHwKeyboard=n +CompatibilityHacksPreventAudioChopping=n +AppUsesMouse=y AppNeedsTwoButtonMouse=n +ShowMouseCursor=n +ForceRelativeMouseMode=n AppNeedsArrowKeys=n AppNeedsTextInput=n AppUsesJoystick=n -AppHandlesJoystickSensitivity=n +AppUsesAccelerometer=n AppUsesMultitouch=n NonBlockingSwapBuffers=n RedefinedKeys="RETURN" AppTouchscreenKeyboardKeysAmount=0 AppTouchscreenKeyboardKeysAmountAutoFire=0 RedefinedKeysScreenKb="RETURN" +StartupMenuButtonTimeout=0 +HiddenMenuOptions='' +FirstStartMenuOptions='' MultiABI=n +AppMinimumRAM=0 AppVersionCode=1 AppVersionName="1" +ResetSdlConfigForThisVersion=n +DeleteFilesOnUpgrade="n" CompiledLibraries="sdl_image" CustomBuildScript=n AppCflags='-finline-functions -O2' AppLdflags='' AppSubdirsBuild='' -AppUseCrystaXToolchain=n AppCmdline='' ReadmeText='^text' +MinimumScreenSize=s +AdmobPublisherId=n +AdmobTestDeviceId= +AdmobBannerSize= diff --git a/project/jni/application/opengl_hello/AndroidData/data2.zip b/project/jni/application/test-opengl/AndroidData/data2.zip similarity index 66% rename from project/jni/application/opengl_hello/AndroidData/data2.zip rename to project/jni/application/test-opengl/AndroidData/data2.zip index 8c8d8210976cc63aa81be9b2aba429810f7cfa1e..a5c69820bd9d729b504e25f19d07cd7d6172df20 100644 GIT binary patch delta 12677 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 A?*IS* delta 34 ncmeBJ%Jk(B;|8I`$@eDsiLkOUFfcGMGB7guF)%O)B!YMVxzGnW diff --git a/project/jni/application/test-opengl/Makefile b/project/jni/application/test-opengl/Makefile new file mode 100644 index 000000000..65234a0e0 --- /dev/null +++ b/project/jni/application/test-opengl/Makefile @@ -0,0 +1,4 @@ + +sdl_hello: *.cpp + g++ -g3 -O0 -o $@ $? `sdl-config --cflags` `sdl-config --libs` -lGL -lSDL_image + unzip -o AndroidData/*.zip diff --git a/project/jni/application/opengl_hello/icon.png b/project/jni/application/test-opengl/icon.png similarity index 100% rename from project/jni/application/opengl_hello/icon.png rename to project/jni/application/test-opengl/icon.png diff --git a/project/jni/application/test-opengl/sdl_hello.cpp b/project/jni/application/test-opengl/sdl_hello.cpp new file mode 100644 index 000000000..2b01a0a25 --- /dev/null +++ b/project/jni/application/test-opengl/sdl_hello.cpp @@ -0,0 +1,228 @@ +#include +#include +#include +#include + +#ifdef ANDROID +#include +#define glOrtho glOrthof + +#include +#define fprintf(X, ...) __android_log_print(ANDROID_LOG_INFO, "Ballfield", __VA_ARGS__) +#define printf(...) __android_log_print(ANDROID_LOG_INFO, "Ballfield", __VA_ARGS__) +#else +#include +#endif + +int screenWidth = 0; +int screenHeight = 0; + +struct Sprite { + + Sprite(const char * path) + { + w = h = upload_w = upload_h = texture = 0; + imagePath = path; + loadTexture(); + } + + bool loadTexture() + { + SDL_Surface *pic; + + pic = IMG_Load(imagePath.c_str()); + + if(!pic) + { + printf("Error: image %s cannot be loaded\n", imagePath.c_str()); + return false; + } + if(pic->format->BitsPerPixel != 32 && pic->format->BitsPerPixel != 24) + { + printf("Error: image %s is %dbpp - it should be either 24bpp or 32bpp, images with palette are not supported\n", imagePath.c_str(), pic->format->BitsPerPixel); + SDL_FreeSurface(pic); + return false; + } + + GLenum glFormat = (pic->format->BitsPerPixel == 32 ? GL_RGBA : GL_RGB); + w = pic->w; + h = pic->h; + upload_w = powerOfTwo(w); + upload_h = powerOfTwo(h); + + glGenTextures(1, &texture); + + glBindTexture(GL_TEXTURE_2D, texture); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + + glTexImage2D(GL_TEXTURE_2D, 0, glFormat, upload_w, upload_h, 0, glFormat, GL_UNSIGNED_BYTE, NULL); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, glFormat, GL_UNSIGNED_BYTE, pic->pixels); + + SDL_FreeSurface(pic); + + return 0; + } + + int powerOfTwo(int i) + { + int r; + for (r = 1; r < i; r *= 2) {} + return r; + } + + void draw(GLfloat x, GLfloat y, GLfloat width, GLfloat height, GLfloat r = 1.0f, GLfloat g = 1.0f, GLfloat b = 1.0f, GLfloat a = 1.0f) + { + if(texture == 0) + return; + // GL coordinates start at bottom-left corner, which is counter-intuitive for sprite graphics, so we have to flip Y coordinate + GLfloat textureCoordinates[] = { 0.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + 1.0f, 0.0f }; + GLfloat vertices[] = { x, screenHeight - y, + x, screenHeight - (y + height), + x + width, screenHeight - (y + height), + x + width, screenHeight - y }; + glColor4f(r, g, b, a); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, texture); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, vertices); + glTexCoordPointer(2, GL_FLOAT, 0, textureCoordinates); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); // You may just replace all your GL_QUADS with GL_TRIANGLE_FAN and it will draw absolutely identically with same coordinates, if you have just 4 coords. + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + } + + void draw(GLfloat x, GLfloat y) + { + draw(x, y, w, h); + } + + GLuint texture; + int w, h, upload_w, upload_h; + std::string imagePath; +}; + +static void +initGL() +{ + + glViewport(0, 0, screenWidth, screenHeight); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glOrtho(0.0f, screenWidth, 0.0f, screenHeight, -1.0f, 1.0f); + glMatrixMode(GL_MODELVIEW); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glDisable(GL_DEPTH_TEST); +} + +static void +clearScreen() +{ + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Always clear your scene before rendering, unless you're sure that you'll fill whole screen with textures/models etc + + // You have to do this each frame, because SDL messes up with your GL context when drawing on-screen keyboard, however is saves/restores your matrices + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +} + + +static void initSDL() +{ + SDL_Init(SDL_INIT_VIDEO); + + screenWidth = SDL_GetVideoInfo()->current_w; + screenHeight = SDL_GetVideoInfo()->current_h; + + if ( ! SDL_SetVideoMode(screenWidth, screenHeight, 24, SDL_OPENGL|SDL_DOUBLEBUF|SDL_FULLSCREEN) ) + { + fprintf(stderr, "Couldn't set GL video mode: %s\n", SDL_GetError()); + SDL_Quit(); + exit(2); + } + SDL_WM_SetCaption("test", "test"); +} + +int +main(int argc, char *argv[]) +{ + initSDL(); + initGL(); + + std::vector sprites; + sprites.push_back(Sprite("test.png")); + sprites.push_back(Sprite("element0.png")); + sprites.push_back(Sprite("element1.png")); + sprites.push_back(Sprite("element2.png")); + sprites.push_back(Sprite("element3.png")); + + int coords[][2] = { {0, 0}, + {200, 0}, + {300, 200}, + {400, 300} }; + + float pulse = 1.0f, pulseChange = 0.01f; + int anim = 1; + + while ( ! SDL_GetKeyState(NULL)[SDLK_ESCAPE] ) // Exit by pressing Back button + { + clearScreen(); + int mouseX = 0, mouseY = 0, buttons = 0; + buttons = SDL_GetMouseState(&mouseX, &mouseY); + + sprites[0].draw(mouseX - sprites[0].w/2, mouseY - sprites[0].h/2, sprites[0].w, sprites[0].h, buttons ? 0 : 1, 1, 1, pulse); + + sprites[1].draw(coords[0][0], coords[0][1]); + sprites[2].draw(coords[1][0], coords[1][1], sprites[2].w * pulse * 4, sprites[2].h * pulse * 4); + sprites[3].draw(coords[2][0], coords[2][1], sprites[3].w * pulse * 4, sprites[3].h * 2); + sprites[4].draw(coords[3][0], coords[3][1], sprites[4].w, sprites[4].h * pulse * 2); + + SDL_GL_SwapBuffers(); + SDL_Event event; + while( SDL_PollEvent(&event) ) + { + if(event.type == SDL_VIDEORESIZE) + { + // Reload textures to OpenGL + initGL(); + for(int i = 0; i < sprites.size(); i++) + sprites[i].loadTexture(); + } + } + + // Some kinda animation + + pulse += pulseChange; + if(pulse > 1.0f) + pulseChange = -0.01f; + if(pulse < 0) + pulseChange = 0.01f; + + for(int i = 0; i < 4; i++) + { + coords[i][0] += anim; + coords[i][1] += anim; + } + if( coords[0][0] < 0 ) + anim = 1; + if( coords[3][1] > screenHeight ) + anim = -1; + } + + SDL_Quit(); + return 0; +}