blob: ef66841f2792a406189952e2118df742f7fc2319 [file] [log] [blame]
Jack Palevicha8fecb82009-09-23 14:48:07 -07001// OpenGL ES 1.0 code
2
3#include <nativehelper/jni.h>
4#define LOG_TAG "GLJNI gl_code.cpp"
Jack Palevich8018f092009-09-30 06:14:24 -07005#include <utils/Log.h>
6
Jack Palevicha8fecb82009-09-23 14:48:07 -07007#include <GLES/gl.h>
8
Jack Palevich8018f092009-09-30 06:14:24 -07009#include <stdio.h>
10
Jack Palevicha8fecb82009-09-23 14:48:07 -070011#include <stdlib.h>
12#include <math.h>
Jack Palevich8018f092009-09-30 06:14:24 -070013
14GLuint texture;
15GLfloat background;
16
17#define FIXED_ONE 0x10000
Jack Palevicha8fecb82009-09-23 14:48:07 -070018
19static void printGLString(const char *name, GLenum s) {
20 const char *v = (const char *) glGetString(s);
21 LOGI("GL %s = %s\n", name, v);
22}
23
24static 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
Jack Palevich8018f092009-09-30 06:14:24 -070083void init_scene(int width, int height)
Jack Palevicha8fecb82009-09-23 14:48:07 -070084{
85 printGLString("Version", GL_VERSION);
86 printGLString("Vendor", GL_VENDOR);
87 printGLString("Renderer", GL_RENDERER);
Jack Palevich8018f092009-09-30 06:14:24 -070088 printGLString("Extensions", GL_EXTENSIONS);
89
Jack Palevicha8fecb82009-09-23 14:48:07 -070090 glDisable(GL_DITHER);
91 glEnable(GL_CULL_FACE);
92
Jack Palevicha8fecb82009-09-23 14:48:07 -070093 float ratio = width / height;
94 glViewport(0, 0, width, height);
95
96 glMatrixMode(GL_PROJECTION);
97 glLoadIdentity();
Jack Palevich8018f092009-09-30 06:14:24 -070098 glFrustumf(-ratio, ratio, -1, 1, 1, 10);
Jack Palevicha8fecb82009-09-23 14:48:07 -070099
Jack Palevich8018f092009-09-30 06:14:24 -0700100 glMatrixMode(GL_MODELVIEW);
Jack Palevicha8fecb82009-09-23 14:48:07 -0700101
Jack Palevicha8fecb82009-09-23 14:48:07 -0700102 glLoadIdentity();
103 gluLookAt(
104 0, 0, 3, // eye
105 0, 0, 0, // center
106 0, 1, 0); // up
Jack Palevich8018f092009-09-30 06:14:24 -0700107
108 glEnable(GL_TEXTURE_2D);
109 glEnableClientState(GL_VERTEX_ARRAY);
Jack Palevicha8fecb82009-09-23 14:48:07 -0700110 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
Jack Palevich8018f092009-09-30 06:14:24 -0700111}
112
113void create_texture()
114{
Jack Palevicha8fecb82009-09-23 14:48:07 -0700115 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,
Jack Palevich8018f092009-09-30 06:14:24 -0700127 };
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);
Jack Palevicha8fecb82009-09-23 14:48:07 -0700135}
136
137extern "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);
Jack Palevich8018f092009-09-30 06:14:24 -0700140 JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_changeBackground(JNIEnv * env, jobject obj);
Jack Palevicha8fecb82009-09-23 14:48:07 -0700141};
Jack Palevicha8fecb82009-09-23 14:48:07 -0700142
Jack Palevich8018f092009-09-30 06:14:24 -0700143JNIEXPORT 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
149JNIEXPORT 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
Jack Palevicha8fecb82009-09-23 14:48:07 -0700165 const GLushort quadIndices[] = { 0, 1, 2, 0, 2, 3 };
Jack Palevich8018f092009-09-30 06:14:24 -0700166 glVertexPointer(3, GL_FLOAT, 0, vertices);
Jack Palevicha8fecb82009-09-23 14:48:07 -0700167 glTexCoordPointer(2, GL_FIXED, 0, texCoords);
168
Jack Palevicha8fecb82009-09-23 14:48:07 -0700169 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 }
Jack Palevich8018f092009-09-30 06:14:24 -0700175 glClearColor(background, grey, grey, 1.0f);
Jack Palevicha8fecb82009-09-23 14:48:07 -0700176 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
Jack Palevich8018f092009-09-30 06:14:24 -0700177 glDrawElements(GL_TRIANGLES, nelem, GL_UNSIGNED_SHORT, quadIndices);
178}
Jack Palevicha8fecb82009-09-23 14:48:07 -0700179
Jack Palevich8018f092009-09-30 06:14:24 -0700180JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_changeBackground(JNIEnv * env, jobject obj)
181{
182 background = 1.0f - background;
Jae-Hyung Ahnf2c1d9e2009-11-30 17:30:21 +0900183}