1 // OpenGL ES 1.0 code 2 3 #include <nativehelper/jni.h> 4 #define LOG_TAG "GLJNI gl_code.cpp" 5 #include <utils/Log.h> 6 7 #include <GLES/gl.h> 8 9 #include <stdio.h> 10 11 #include <stdlib.h> 12 #include <math.h> 13 14 GLuint texture; 15 GLfloat background; 16 17 #define FIXED_ONE 0x10000 18 19 static void printGLString(const char *name, GLenum s) { 20 const char *v = (const char *) glGetString(s); 21 ALOGI("GL %s = %s\n", name, v); 22 } 23 24 static void gluLookAt(float eyeX, float eyeY, float eyeZ, 25 float centerX, float centerY, float centerZ, float upX, float upY, 26 float upZ) 27 { 28 // See the OpenGL GLUT documentation for gluLookAt for a description 29 // of the algorithm. We implement it in a straightforward way: 30 31 float fx = centerX - eyeX; 32 float fy = centerY - eyeY; 33 float fz = centerZ - eyeZ; 34 35 // Normalize f 36 float rlf = 1.0f / sqrtf(fx*fx + fy*fy + fz*fz); 37 fx *= rlf; 38 fy *= rlf; 39 fz *= rlf; 40 41 // Normalize up 42 float rlup = 1.0f / sqrtf(upX*upX + upY*upY + upZ*upZ); 43 upX *= rlup; 44 upY *= rlup; 45 upZ *= rlup; 46 47 // compute s = f x up (x means "cross product") 48 49 float sx = fy * upZ - fz * upY; 50 float sy = fz * upX - fx * upZ; 51 float sz = fx * upY - fy * upX; 52 53 // compute u = s x f 54 float ux = sy * fz - sz * fy; 55 float uy = sz * fx - sx * fz; 56 float uz = sx * fy - sy * fx; 57 58 float m[16] ; 59 m[0] = sx; 60 m[1] = ux; 61 m[2] = -fx; 62 m[3] = 0.0f; 63 64 m[4] = sy; 65 m[5] = uy; 66 m[6] = -fy; 67 m[7] = 0.0f; 68 69 m[8] = sz; 70 m[9] = uz; 71 m[10] = -fz; 72 m[11] = 0.0f; 73 74 m[12] = 0.0f; 75 m[13] = 0.0f; 76 m[14] = 0.0f; 77 m[15] = 1.0f; 78 79 glMultMatrixf(m); 80 glTranslatef(-eyeX, -eyeY, -eyeZ); 81 } 82 83 void init_scene(int width, int height) 84 { 85 printGLString("Version", GL_VERSION); 86 printGLString("Vendor", GL_VENDOR); 87 printGLString("Renderer", GL_RENDERER); 88 printGLString("Extensions", GL_EXTENSIONS); 89 90 glDisable(GL_DITHER); 91 glEnable(GL_CULL_FACE); 92 93 float ratio = width / height; 94 glViewport(0, 0, width, height); 95 96 glMatrixMode(GL_PROJECTION); 97 glLoadIdentity(); 98 glFrustumf(-ratio, ratio, -1, 1, 1, 10); 99 100 glMatrixMode(GL_MODELVIEW); 101 102 glLoadIdentity(); 103 gluLookAt( 104 0, 0, 3, // eye 105 0, 0, 0, // center 106 0, 1, 0); // up 107 108 glEnable(GL_TEXTURE_2D); 109 glEnableClientState(GL_VERTEX_ARRAY); 110 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 111 } 112 113 void create_texture() 114 { 115 const unsigned int on = 0xff0000ff; 116 const unsigned int off = 0xffffffff; 117 const unsigned int pixels[] = 118 { 119 on, off, on, off, on, off, on, off, 120 off, on, off, on, off, on, off, on, 121 on, off, on, off, on, off, on, off, 122 off, on, off, on, off, on, off, on, 123 on, off, on, off, on, off, on, off, 124 off, on, off, on, off, on, off, on, 125 on, off, on, off, on, off, on, off, 126 off, on, off, on, off, on, off, on, 127 }; 128 129 glGenTextures(1, &texture); 130 glBindTexture(GL_TEXTURE_2D, texture); 131 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 132 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 133 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 134 glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 135 } 136 137 extern "C" { 138 JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_init(JNIEnv * env, jobject obj, jint width, jint height); 139 JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_step(JNIEnv * env, jobject obj); 140 JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_changeBackground(JNIEnv * env, jobject obj); 141 }; 142 143 JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_init(JNIEnv * env, jobject obj, jint width, jint height) 144 { 145 init_scene(width, height); 146 create_texture(); 147 } 148 149 JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_step(JNIEnv * env, jobject obj) 150 { 151 const GLfloat vertices[] = { 152 -1, -1, 0, 153 1, -1, 0, 154 1, 1, 0, 155 -1, 1, 0 156 }; 157 158 const GLfixed texCoords[] = { 159 0, 0, 160 FIXED_ONE, 0, 161 FIXED_ONE, FIXED_ONE, 162 0, FIXED_ONE 163 }; 164 165 const GLushort quadIndices[] = { 0, 1, 2, 0, 2, 3 }; 166 glVertexPointer(3, GL_FLOAT, 0, vertices); 167 glTexCoordPointer(2, GL_FIXED, 0, texCoords); 168 169 int nelem = sizeof(quadIndices)/sizeof(quadIndices[0]); 170 static float grey; 171 grey += 0.01f; 172 if (grey > 1.0f) { 173 grey = 0.0f; 174 } 175 glClearColor(background, grey, grey, 1.0f); 176 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 177 glDrawElements(GL_TRIANGLES, nelem, GL_UNSIGNED_SHORT, quadIndices); 178 } 179 180 JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_changeBackground(JNIEnv * env, jobject obj) 181 { 182 background = 1.0f - background; 183 } 184