1bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root/* 2bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Copyright (C) 2009 The Android Open Source Project 3bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * 4bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 5bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * you may not use this file except in compliance with the License. 6bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * You may obtain a copy of the License at 7bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * 8bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * http://www.apache.org/licenses/LICENSE-2.0 9bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * 10bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Unless required by applicable law or agreed to in writing, software 11bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 12bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * See the License for the specific language governing permissions and 14bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * limitations under the License. 15bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root */ 16bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root 179bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichpackage com.android.gldual; 189bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 199bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichimport java.nio.ByteBuffer; 209bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichimport java.nio.ByteOrder; 219bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichimport java.nio.FloatBuffer; 229bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichimport java.nio.ShortBuffer; 239bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 249bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichimport javax.microedition.khronos.egl.EGLConfig; 259bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichimport javax.microedition.khronos.opengles.GL10; 269bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 279bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichimport android.opengl.GLSurfaceView; 289bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichimport android.opengl.GLU; 299bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichimport android.os.SystemClock; 309bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 319bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichpublic class TriangleRenderer implements GLSurfaceView.Renderer{ 329bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 339bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich public TriangleRenderer() { 349bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich mTriangle = new Triangle(); 359bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich } 369bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 379bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich public void onSurfaceCreated(GL10 gl, EGLConfig config) { 389bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich /* 399bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * By default, OpenGL enables features that improve quality 409bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * but reduce performance. One might want to tweak that 419bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * especially on software renderer. 429bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich */ 439bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glDisable(GL10.GL_DITHER); 449bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 459bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich /* 469bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * Some one-time OpenGL initialization can be made here 479bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * probably based on features of this particular context 489bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich */ 499bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, 509bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich GL10.GL_FASTEST); 519bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 529bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glClearColor(.5f, .5f, .5f, 1); 539bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glShadeModel(GL10.GL_SMOOTH); 549bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich } 559bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 569bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich public void onDrawFrame(GL10 gl) { 579bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich /* 589bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * By default, OpenGL enables features that improve quality 599bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * but reduce performance. One might want to tweak that 609bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * especially on software renderer. 619bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich */ 629bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glDisable(GL10.GL_DITHER); 639bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 649bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich /* 659bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * Usually, the first thing one might want to do is to clear 669bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * the screen. The most efficient way of doing this is to use 679bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * glClear(). 689bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich */ 699bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 709bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 719bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 729bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich /* 739bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * Now we're ready to draw some 3D objects 749bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich */ 759bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 769bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glMatrixMode(GL10.GL_MODELVIEW); 779bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glLoadIdentity(); 789bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 799bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 809bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 819bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 829bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 839bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich long time = SystemClock.uptimeMillis() % 4000L; 849bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich float angle = 0.090f * ((int) time); 859bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 869bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glRotatef(angle, 0, 0, 1.0f); 879bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 889bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich mTriangle.draw(gl); 899bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich } 909bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 919bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich public void onSurfaceChanged(GL10 gl, int w, int h) { 929bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glViewport(0, 0, w, h); 939bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 949bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich /* 959bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * Set our projection matrix. This doesn't have to be done 969bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * each time we draw, but usually a new projection needs to 979bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich * be set when the viewport is resized. 989bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich */ 999bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1009bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich float ratio = (float) w / h; 1019bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glMatrixMode(GL10.GL_PROJECTION); 1029bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glLoadIdentity(); 1039bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); 1049bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1059bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich } 1069bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1079bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich private Triangle mTriangle; 1089bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich} 1099bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1109bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevichclass Triangle { 1119bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich public Triangle() { 1129bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1139bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich // Buffers to be passed to gl*Pointer() functions 1149bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich // must be direct, i.e., they must be placed on the 1159bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich // native heap where the garbage collector cannot 1169bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich // move them. 1179bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich // 1189bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich // Buffers with multi-byte datatypes (e.g., short, int, float) 1199bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich // must have their byte order set to native order 1209bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1219bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich ByteBuffer vbb = ByteBuffer.allocateDirect(VERTS * 3 * 4); 1229bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich vbb.order(ByteOrder.nativeOrder()); 1239bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich mFVertexBuffer = vbb.asFloatBuffer(); 1249bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1259bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich ByteBuffer tbb = ByteBuffer.allocateDirect(VERTS * 2 * 4); 1269bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich tbb.order(ByteOrder.nativeOrder()); 1279bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1289bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich ByteBuffer ibb = ByteBuffer.allocateDirect(VERTS * 2); 1299bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich ibb.order(ByteOrder.nativeOrder()); 1309bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich mIndexBuffer = ibb.asShortBuffer(); 1319bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1329bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich // A unit-sided equalateral triangle centered on the origin. 1339bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich float[] coords = { 1349bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich // X, Y, Z 1359bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich -0.5f, -0.25f, 0, 1369bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 0.5f, -0.25f, 0, 1379bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 0.0f, 0.559016994f, 0 1389bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich }; 1399bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1409bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich for (int i = 0; i < VERTS; i++) { 1419bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich for(int j = 0; j < 3; j++) { 1429bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich mFVertexBuffer.put(coords[i*3+j] * 2.0f); 1439bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich } 1449bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich } 1459bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1469bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich for(int i = 0; i < VERTS; i++) { 1479bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich mIndexBuffer.put((short) i); 1489bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich } 1499bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1509bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich mFVertexBuffer.position(0); 1519bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich mIndexBuffer.position(0); 1529bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich } 1539bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1549bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich public void draw(GL10 gl) { 1559bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glFrontFace(GL10.GL_CCW); 1569bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer); 1579bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, VERTS, 1589bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich GL10.GL_UNSIGNED_SHORT, mIndexBuffer); 1599bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich } 1609bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1619bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich private final static int VERTS = 3; 1629bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich 1639bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich private FloatBuffer mFVertexBuffer; 1649bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich private ShortBuffer mIndexBuffer; 1659bd30f05e890b213e97b838e04024d8cd232dbc0Jack Palevich} 166