From 6dd8ad6d6bd0da0fc46fadb0e122fba6bae05736 Mon Sep 17 00:00:00 2001 From: Sylvain Beucler Date: Thu, 19 Apr 2012 21:10:59 +0000 Subject: [PATCH] Add 'shapes' test for GLES1 (Android and Mesa EGL), as an independent CMake sample app git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1246 7f0cb862-5218-0410-a997-914c9d46530a --- progs/test-shapes-gles1/AndroidManifest.xml | 33 +++ progs/test-shapes-gles1/CMakeLists.txt | 34 +++ progs/test-shapes-gles1/android_toolchain.cmake | 1 + progs/test-shapes-gles1/ndk/AndroidManifest.xml | 34 +++ progs/test-shapes-gles1/ndk/jni/Android.mk | 14 + progs/test-shapes-gles1/ndk/jni/Application.mk | 2 + progs/test-shapes-gles1/test-shapes-gles1.c | 324 +++++++++++++++++++++++ 7 files changed, 442 insertions(+) create mode 100644 progs/test-shapes-gles1/AndroidManifest.xml create mode 100644 progs/test-shapes-gles1/CMakeLists.txt create mode 120000 progs/test-shapes-gles1/android_toolchain.cmake create mode 100644 progs/test-shapes-gles1/ndk/AndroidManifest.xml create mode 100644 progs/test-shapes-gles1/ndk/jni/Android.mk create mode 100644 progs/test-shapes-gles1/ndk/jni/Application.mk create mode 100644 progs/test-shapes-gles1/test-shapes-gles1.c diff --git a/progs/test-shapes-gles1/AndroidManifest.xml b/progs/test-shapes-gles1/AndroidManifest.xml new file mode 100644 index 0000000..3050ecb --- /dev/null +++ b/progs/test-shapes-gles1/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/progs/test-shapes-gles1/CMakeLists.txt b/progs/test-shapes-gles1/CMakeLists.txt new file mode 100644 index 0000000..24e97d1 --- /dev/null +++ b/progs/test-shapes-gles1/CMakeLists.txt @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.6) +project(test-shapes-gles1) + +# FreeGLUT +include(FindPkgConfig) +pkg_check_modules(freeglut REQUIRED freeglut-gles1>=3.0.0) +if(freeglut_FOUND) + include_directories(${freeglut_STATIC_INCLUDE_DIRS}) + link_directories(${freeglut_STATIC_LIBRARY_DIRS}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${freeglut_STATIC_CFLAGS_OTHER}") + add_definitions(${freeglut_STATIC_CFLAGS_OTHER}) +endif() + +if(ANDROID) + add_library(test-shapes-gles1 SHARED test-shapes-gles1.c) + add_custom_target(apk ALL + DEPENDS test-shapes-gles1 + COMMAND ant clean || true + COMMAND rm -rf libs/ src/ res/ bin/ gen/ + COMMAND mkdir -p libs/armeabi/ src/ res/values/ + COMMAND cp -a ${PROJECT_SOURCE_DIR}/AndroidManifest.xml ${PROJECT_BINARY_DIR} + COMMAND cp -a $ libs/armeabi/ + COMMAND echo 'FG_GLES1 test' + > res/values/strings.xml + COMMAND android update project --name cmake-apk --path . --target "android-10" + COMMAND ant debug + COMMAND ant installd + COMMAND adb shell am start -a android.intenon.MAIN -n freeglut.test.gles1/android.app.NativeActivity + ) + # Note: at least one resource and an empty src/ dir is necessary for ant... +else() + add_executable(test-shapes-gles1 test-shapes-gles1.c) +endif() +target_link_libraries(test-shapes-gles1 ${freeglut_STATIC_LIBRARIES}) diff --git a/progs/test-shapes-gles1/android_toolchain.cmake b/progs/test-shapes-gles1/android_toolchain.cmake new file mode 120000 index 0000000..1a710d1 --- /dev/null +++ b/progs/test-shapes-gles1/android_toolchain.cmake @@ -0,0 +1 @@ +../../android_toolchain.cmake \ No newline at end of file diff --git a/progs/test-shapes-gles1/ndk/AndroidManifest.xml b/progs/test-shapes-gles1/ndk/AndroidManifest.xml new file mode 100644 index 0000000..b56c906 --- /dev/null +++ b/progs/test-shapes-gles1/ndk/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/progs/test-shapes-gles1/ndk/jni/Android.mk b/progs/test-shapes-gles1/ndk/jni/Android.mk new file mode 100644 index 0000000..361043c --- /dev/null +++ b/progs/test-shapes-gles1/ndk/jni/Android.mk @@ -0,0 +1,14 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := native-activity +LOCAL_SRC_FILES := +LOCAL_CPPFLAGS := -I/usr/src/glm +LOCAL_CXXFLAGS := -gstabs+ +LOCAL_LDLIBS := -llog -landroid -lGLESv2 -lEGL +LOCAL_STATIC_LIBRARIES := freeglut + +include $(BUILD_SHARED_LIBRARY) + +$(call import-module,freeglut) diff --git a/progs/test-shapes-gles1/ndk/jni/Application.mk b/progs/test-shapes-gles1/ndk/jni/Application.mk new file mode 100644 index 0000000..b31b6a5 --- /dev/null +++ b/progs/test-shapes-gles1/ndk/jni/Application.mk @@ -0,0 +1,2 @@ +APP_PLATFORM := android-9 +APP_STL := gnustl_static diff --git a/progs/test-shapes-gles1/test-shapes-gles1.c b/progs/test-shapes-gles1/test-shapes-gles1.c new file mode 100644 index 0000000..b22cb7f --- /dev/null +++ b/progs/test-shapes-gles1/test-shapes-gles1.c @@ -0,0 +1,324 @@ +/*! \file shapes.c + \ingroup demos + + This program is a test harness for the various shapes + in OpenGLUT. It may also be useful to see which + parameters control what behavior in the OpenGLUT + objects. + + Spinning wireframe and solid-shaded shapes are + displayed. Some parameters can be adjusted. + + Keys: + - Esc   Quit + - q Q   Quit + - i I   Show info + - p P   Toggle perspective or orthographic projection + - = +   Increase \a slices + - - _   Decreate \a slices + - , <   Decreate \a stacks + - . >   Increase \a stacks + - 9 (   Decreate \a depth (Sierpinski Sponge) + - 0 )   Increase \a depth (Sierpinski Sponge) + - up    Increase "outer radius" + - down  Decrease "outer radius" + - left  Decrease "inner radius" + - right Increase "inner radius" + - PgUp  Next shape-drawing function + - PgDn  Prev shape-drawing function + + \author Written by Nigel Stewart November 2003 + + \author Portions Copyright (C) 2004, the OpenGLUT project contributors.
+ OpenGLUT branched from freeglut in February, 2004. + + \image html openglut_shapes.png OpenGLUT Geometric Shapes Demonstration + \include demos/shapes/shapes.c +*/ + +#include + +#include +#include +#include + +#ifdef _MSC_VER +/* DUMP MEMORY LEAKS */ +#include +#endif + +/* + * This macro is only intended to be used on arrays, of course. + */ +#define NUMBEROF(x) ((sizeof(x))/(sizeof(x[0]))) + +#define glRotated glRotatef +#define glTranslated glTranslatef + +/* + * These global variables control which object is drawn, + * and how it is drawn. No object uses all of these + * variables. + */ +static int function_index; +static int slices = 16; +static int stacks = 16; +static double irad = .25; +static double orad = 1.0; /* doubles as size for objects other than Torus */ +static int depth = 4; +static double offset[ 3 ] = { 0, 0, 0 }; +static GLboolean show_info = GL_TRUE; +static float ar; +static GLboolean persProject = GL_TRUE; + +/* + * These one-liners draw particular objects, fetching appropriate + * information from the above globals. They are just thin wrappers + * for the FreeGLUT objects. + */ +static void drawSolidTetrahedron(void) { glutSolidTetrahedron (); } +static void drawWireTetrahedron(void) { glutWireTetrahedron (); } +static void drawSolidCube(void) { glutSolidCube(orad); } /* orad doubles as size input */ +static void drawWireCube(void) { glutWireCube(orad); } /* orad doubles as size input */ +static void drawSolidOctahedron(void) { glutSolidOctahedron (); } +static void drawWireOctahedron(void) { glutWireOctahedron (); } +static void drawSolidDodecahedron(void) { glutSolidDodecahedron (); } +static void drawWireDodecahedron(void) { glutWireDodecahedron (); } +static void drawSolidRhombicDodecahedron(void) { glutSolidRhombicDodecahedron (); } +static void drawWireRhombicDodecahedron(void) { glutWireRhombicDodecahedron (); } +static void drawSolidIcosahedron(void) { glutSolidIcosahedron (); } +static void drawWireIcosahedron(void) { glutWireIcosahedron (); } +static void drawSolidSierpinskiSponge(void) { glutSolidSierpinskiSponge (depth, offset, orad);} /* orad doubles as size input */ +static void drawWireSierpinskiSponge(void) { glutWireSierpinskiSponge (depth, offset, orad); } /* orad doubles as size input */ +static void drawSolidSphere(void) { glutSolidSphere(orad,slices,stacks); } /* orad doubles as size input */ +static void drawWireSphere(void) { glutWireSphere(orad,slices,stacks); } /* orad doubles as size input */ +#ifndef EGL_VERSION_1_0 +static void drawSolidTorus(void) { glutSolidTorus(irad,orad,slices,stacks); } +static void drawWireTorus(void) { glutWireTorus (irad,orad,slices,stacks); } +static void drawSolidCone(void) { glutSolidCone(orad,orad,slices,stacks); } /* orad doubles as size input */ +static void drawWireCone(void) { glutWireCone(orad,orad,slices,stacks); } /* orad doubles as size input */ +static void drawSolidCylinder(void) { glutSolidCylinder(orad,orad,slices,stacks); } /* orad doubles as size input */ +static void drawWireCylinder(void) { glutWireCylinder(orad,orad,slices,stacks); } /* orad doubles as size input */ +#endif + +/* + * This structure defines an entry in our function-table. + */ +typedef struct +{ + const char * const name; + void (*solid) (void); + void (*wire) (void); +} entry; + +#define ENTRY(e) {#e, drawSolid##e, drawWire##e} +static const entry table [] = +{ + ENTRY (Cube), + ENTRY (Tetrahedron), + ENTRY (Octahedron), + ENTRY (Dodecahedron), + ENTRY (RhombicDodecahedron), + ENTRY (Icosahedron), + ENTRY (SierpinskiSponge), + ENTRY (Sphere), +}; +#undef ENTRY + +/*! + Does printf()-like work using freeglut + glutBitmapString(). Uses a fixed font. Prints + at the indicated row/column position. + + Limitation: Cannot address pixels. + Limitation: Renders in screen coords, not model coords. +*/ +static void shapesPrintf (int row, int col, const char *fmt, ...) +{ +} + +/* GLUT callback Handlers */ + +static void +resize(int width, int height) +{ + ar = (float) width / (float) height; + + glViewport(0, 0, width, height); +} + +static void display(void) +{ + const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; + const double a = t*90.0; + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustumf(-ar, ar, -1.0, 1.0, 2.0, 100.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glEnable(GL_LIGHTING); + + glColor4f(1,0,0,1); + + glPushMatrix(); + glTranslated(0,1.2,-6); + glRotated(60,1,0,0); + glRotated(a,0,0,1); + table [function_index].solid (); + glPopMatrix(); + + glPushMatrix(); + glTranslated(0,-1.2,-6); + glRotated(60,1,0,0); + glRotated(a,0,0,1); + table [function_index].wire (); + glPopMatrix(); + + glDisable(GL_LIGHTING); + glColor4f(0.1,0.1,0.4,1.0); + + glutSwapBuffers(); +} + + +static void +key(unsigned char key, int x, int y) +{ + switch (key) + { + case 27 : + case 'Q': + case 'q': glutLeaveMainLoop () ; break; + + case 'I': + case 'i': show_info = ( show_info == GL_TRUE ) ? GL_FALSE : GL_TRUE; break; + + case '=': + case '+': slices++; printf("%d,%d\n", slices, stacks); break; + + case '-': + case '_': if( slices > -1 ) slices--; break; + + case ',': + case '<': if( stacks > -1 ) stacks--; break; + + case '.': + case '>': stacks++; break; + + case '9': + case '(': if( depth > -1 ) depth--; break; + + case '0': + case ')': ++depth; break; + + case 'P': + case 'p': persProject=!persProject; break; + + default: + break; + } + + glutPostRedisplay(); +} + +static void special (int key, int x, int y) +{ + switch (key) + { + case GLUT_KEY_PAGE_UP: ++function_index; break; + case GLUT_KEY_PAGE_DOWN: --function_index; break; + case GLUT_KEY_UP: orad *= 2; break; + case GLUT_KEY_DOWN: orad /= 2; break; + + case GLUT_KEY_RIGHT: irad *= 2; break; + case GLUT_KEY_LEFT: irad /= 2; break; + + default: + break; + } + + if (0 > function_index) + function_index = NUMBEROF (table) - 1; + + if (NUMBEROF (table) <= ( unsigned )function_index) + function_index = 0; +} + + +static void +idle(void) +{ + glutPostRedisplay(); +} + +static void +onMouseClick(int button, int state, int x, int y) { + if (state == GLUT_DOWN) + special(GLUT_KEY_PAGE_DOWN, 0, 0); +} + +const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; +const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; +const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; +const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f }; + +const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f }; +const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; +const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; +const GLfloat high_shininess[] = { 100.0f }; + +/* Program entry point */ + +int +main(int argc, char *argv[]) +{ + glutInitWindowSize(640,480); + glutInitWindowPosition(40,40); + glutInit(&argc, argv); + glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE); + + glutCreateWindow("FreeGLUT Shapes"); + + glutReshapeFunc(resize); + glutDisplayFunc(display); + glutKeyboardFunc(key); + glutSpecialFunc(special); + glutIdleFunc(idle); + glutMouseFunc(onMouseClick); + + glutSetOption ( GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION ) ; + + glClearColor(1,1,1,1); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + + glEnable(GL_LIGHT0); + glEnable(GL_NORMALIZE); + glEnable(GL_COLOR_MATERIAL); + + glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); + glLightfv(GL_LIGHT0, GL_POSITION, light_position); + + glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); + glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); + glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); + glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); + + glutMainLoop(); + +#ifdef _MSC_VER + /* DUMP MEMORY LEAK INFORMATION */ + _CrtDumpMemoryLeaks () ; +#endif + + return EXIT_SUCCESS; +} -- 1.7.10.4