1*90c8c64dSAndroid Build Coastguard Worker /* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2007 The Android Open Source Project 3*90c8c64dSAndroid Build Coastguard Worker * 4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*90c8c64dSAndroid Build Coastguard Worker * 8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*90c8c64dSAndroid Build Coastguard Worker * 10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License. 15*90c8c64dSAndroid Build Coastguard Worker */ 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Worker package com.android.objviewer; 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Worker import android.app.Activity; 20*90c8c64dSAndroid Build Coastguard Worker import android.content.AssetManager; 21*90c8c64dSAndroid Build Coastguard Worker import android.content.Context; 22*90c8c64dSAndroid Build Coastguard Worker import android.graphics.Canvas; 23*90c8c64dSAndroid Build Coastguard Worker import android.graphics.OpenGLContext; 24*90c8c64dSAndroid Build Coastguard Worker import android.graphics.Paint; 25*90c8c64dSAndroid Build Coastguard Worker import android.graphics.glutils.GLView; 26*90c8c64dSAndroid Build Coastguard Worker import android.graphics.glutils.Object3D; 27*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle; 28*90c8c64dSAndroid Build Coastguard Worker import android.os.Handler; 29*90c8c64dSAndroid Build Coastguard Worker import android.os.Message; 30*90c8c64dSAndroid Build Coastguard Worker import android.os.SystemClock; 31*90c8c64dSAndroid Build Coastguard Worker import android.view.KeyEvent; 32*90c8c64dSAndroid Build Coastguard Worker import android.view.View; 33*90c8c64dSAndroid Build Coastguard Worker import android.view.Window; 34*90c8c64dSAndroid Build Coastguard Worker 35*90c8c64dSAndroid Build Coastguard Worker import java.io.IOException; 36*90c8c64dSAndroid Build Coastguard Worker import java.io.InputStream; 37*90c8c64dSAndroid Build Coastguard Worker import java.util.ArrayList; 38*90c8c64dSAndroid Build Coastguard Worker import java.util.List; 39*90c8c64dSAndroid Build Coastguard Worker 40*90c8c64dSAndroid Build Coastguard Worker import javax.microedition.khronos.opengles.GL10; 41*90c8c64dSAndroid Build Coastguard Worker 42*90c8c64dSAndroid Build Coastguard Worker class OBJView extends View { 43*90c8c64dSAndroid Build Coastguard Worker 44*90c8c64dSAndroid Build Coastguard Worker // Mathematical constants 45*90c8c64dSAndroid Build Coastguard Worker private static final float PI = (float)Math.PI; 46*90c8c64dSAndroid Build Coastguard Worker private static final float TWO_PI = (float)(2.0*Math.PI); 47*90c8c64dSAndroid Build Coastguard Worker private static final float PI_OVER_TWO = (float)(Math.PI/2.0); 48*90c8c64dSAndroid Build Coastguard Worker 49*90c8c64dSAndroid Build Coastguard Worker // Ambient light to apply 50*90c8c64dSAndroid Build Coastguard Worker // private float[] lightModelAmbient = { 0.0f, 0.0f, 0.0f, 1.0f }; 51*90c8c64dSAndroid Build Coastguard Worker private float[] lightModelAmbient = { 0.2f, 0.2f, 0.2f, 1.0f }; 52*90c8c64dSAndroid Build Coastguard Worker 53*90c8c64dSAndroid Build Coastguard Worker // Paint object for drawing the FPS display 54*90c8c64dSAndroid Build Coastguard Worker private Paint paint = new Paint(); 55*90c8c64dSAndroid Build Coastguard Worker 56*90c8c64dSAndroid Build Coastguard Worker // GLView object to manage drawing 57*90c8c64dSAndroid Build Coastguard Worker private GLView glView = new GLView(); 58*90c8c64dSAndroid Build Coastguard Worker 59*90c8c64dSAndroid Build Coastguard Worker private boolean initialized = false; 60*90c8c64dSAndroid Build Coastguard Worker 61*90c8c64dSAndroid Build Coastguard Worker private OpenGLContext mGLContext; 62*90c8c64dSAndroid Build Coastguard Worker 63*90c8c64dSAndroid Build Coastguard Worker // Next time to draw 64*90c8c64dSAndroid Build Coastguard Worker private long mNextTime; 65*90c8c64dSAndroid Build Coastguard Worker 66*90c8c64dSAndroid Build Coastguard Worker // View transformation controlled by UI 67*90c8c64dSAndroid Build Coastguard Worker private float mRotAngle = 0.0f; 68*90c8c64dSAndroid Build Coastguard Worker private float mRotVelocity = 1.0f; 69*90c8c64dSAndroid Build Coastguard Worker private float mTiltAngle = 0.0f; 70*90c8c64dSAndroid Build Coastguard Worker 71*90c8c64dSAndroid Build Coastguard Worker // Object bounds 72*90c8c64dSAndroid Build Coastguard Worker private float mCenterX = 0.0f; 73*90c8c64dSAndroid Build Coastguard Worker private float mCenterY = 0.0f; 74*90c8c64dSAndroid Build Coastguard Worker private float mCenterZ = 0.0f; 75*90c8c64dSAndroid Build Coastguard Worker private float mScale = 1.0f; 76*90c8c64dSAndroid Build Coastguard Worker 77*90c8c64dSAndroid Build Coastguard Worker // Light direction 78*90c8c64dSAndroid Build Coastguard Worker private float[] mLightDir = { 0.0f, 0.0f, 1.0f, 0.0f }; 79*90c8c64dSAndroid Build Coastguard Worker OBJView(Context context)80*90c8c64dSAndroid Build Coastguard Worker public OBJView(Context context) { 81*90c8c64dSAndroid Build Coastguard Worker super(context); 82*90c8c64dSAndroid Build Coastguard Worker 83*90c8c64dSAndroid Build Coastguard Worker mGLContext = new OpenGLContext(OpenGLContext.DEPTH_BUFFER); 84*90c8c64dSAndroid Build Coastguard Worker 85*90c8c64dSAndroid Build Coastguard Worker Message msg = mHandler.obtainMessage(INVALIDATE); 86*90c8c64dSAndroid Build Coastguard Worker mNextTime = SystemClock.uptimeMillis() + 100; 87*90c8c64dSAndroid Build Coastguard Worker mHandler.sendMessageAtTime(msg, mNextTime); 88*90c8c64dSAndroid Build Coastguard Worker 89*90c8c64dSAndroid Build Coastguard Worker requestFocus(); 90*90c8c64dSAndroid Build Coastguard Worker } 91*90c8c64dSAndroid Build Coastguard Worker reset()92*90c8c64dSAndroid Build Coastguard Worker public void reset() { 93*90c8c64dSAndroid Build Coastguard Worker initialized = false; 94*90c8c64dSAndroid Build Coastguard Worker 95*90c8c64dSAndroid Build Coastguard Worker mRotAngle = 0.0f; 96*90c8c64dSAndroid Build Coastguard Worker mRotVelocity = 1.0f; 97*90c8c64dSAndroid Build Coastguard Worker mTiltAngle = 0.0f; 98*90c8c64dSAndroid Build Coastguard Worker 99*90c8c64dSAndroid Build Coastguard Worker mCenterX = 0.0f; 100*90c8c64dSAndroid Build Coastguard Worker mCenterY = 0.0f; 101*90c8c64dSAndroid Build Coastguard Worker mCenterZ = 0.0f; 102*90c8c64dSAndroid Build Coastguard Worker mScale = 1.0f; 103*90c8c64dSAndroid Build Coastguard Worker } 104*90c8c64dSAndroid Build Coastguard Worker onKeyDown(int keyCode, KeyEvent event)105*90c8c64dSAndroid Build Coastguard Worker public boolean onKeyDown(int keyCode, KeyEvent event) { 106*90c8c64dSAndroid Build Coastguard Worker // Hand the key to the GLView object first 107*90c8c64dSAndroid Build Coastguard Worker if (glView.processKey(keyCode)) { 108*90c8c64dSAndroid Build Coastguard Worker return true; 109*90c8c64dSAndroid Build Coastguard Worker } 110*90c8c64dSAndroid Build Coastguard Worker 111*90c8c64dSAndroid Build Coastguard Worker switch (keyCode) { 112*90c8c64dSAndroid Build Coastguard Worker case KeyEvent.KEYCODE_DPAD_LEFT: 113*90c8c64dSAndroid Build Coastguard Worker mRotVelocity -= 1.0f; 114*90c8c64dSAndroid Build Coastguard Worker break; 115*90c8c64dSAndroid Build Coastguard Worker 116*90c8c64dSAndroid Build Coastguard Worker case KeyEvent.KEYCODE_DPAD_RIGHT: 117*90c8c64dSAndroid Build Coastguard Worker mRotVelocity += 1.0f; 118*90c8c64dSAndroid Build Coastguard Worker break; 119*90c8c64dSAndroid Build Coastguard Worker 120*90c8c64dSAndroid Build Coastguard Worker case KeyEvent.KEYCODE_DPAD_CENTER: 121*90c8c64dSAndroid Build Coastguard Worker mRotVelocity = 0.0f; 122*90c8c64dSAndroid Build Coastguard Worker break; 123*90c8c64dSAndroid Build Coastguard Worker 124*90c8c64dSAndroid Build Coastguard Worker case KeyEvent.KEYCODE_DPAD_UP: 125*90c8c64dSAndroid Build Coastguard Worker mTiltAngle -= 360.0f/24.0f; 126*90c8c64dSAndroid Build Coastguard Worker break; 127*90c8c64dSAndroid Build Coastguard Worker 128*90c8c64dSAndroid Build Coastguard Worker case KeyEvent.KEYCODE_DPAD_DOWN: 129*90c8c64dSAndroid Build Coastguard Worker mTiltAngle += 360.0f/24.0f; 130*90c8c64dSAndroid Build Coastguard Worker break; 131*90c8c64dSAndroid Build Coastguard Worker 132*90c8c64dSAndroid Build Coastguard Worker case KeyEvent.KEYCODE_U: 133*90c8c64dSAndroid Build Coastguard Worker OBJViewer.nextObject(); 134*90c8c64dSAndroid Build Coastguard Worker reset(); 135*90c8c64dSAndroid Build Coastguard Worker break; 136*90c8c64dSAndroid Build Coastguard Worker 137*90c8c64dSAndroid Build Coastguard Worker default: 138*90c8c64dSAndroid Build Coastguard Worker return super.onKeyDown(keyCode, event); 139*90c8c64dSAndroid Build Coastguard Worker } 140*90c8c64dSAndroid Build Coastguard Worker 141*90c8c64dSAndroid Build Coastguard Worker return true; 142*90c8c64dSAndroid Build Coastguard Worker } 143*90c8c64dSAndroid Build Coastguard Worker init(GL10 gl)144*90c8c64dSAndroid Build Coastguard Worker private void init(GL10 gl) { 145*90c8c64dSAndroid Build Coastguard Worker glView.reset(); 146*90c8c64dSAndroid Build Coastguard Worker 147*90c8c64dSAndroid Build Coastguard Worker paint.setColor(0xffffffff); 148*90c8c64dSAndroid Build Coastguard Worker 149*90c8c64dSAndroid Build Coastguard Worker gl.glEnable(gl.GL_DEPTH_TEST); 150*90c8c64dSAndroid Build Coastguard Worker 151*90c8c64dSAndroid Build Coastguard Worker gl.glDisable(gl.GL_SCISSOR_TEST); 152*90c8c64dSAndroid Build Coastguard Worker 153*90c8c64dSAndroid Build Coastguard Worker // Some quality settings... 154*90c8c64dSAndroid Build Coastguard Worker gl.glEnable(gl.GL_DITHER); 155*90c8c64dSAndroid Build Coastguard Worker 156*90c8c64dSAndroid Build Coastguard Worker gl.glShadeModel(gl.GL_SMOOTH); 157*90c8c64dSAndroid Build Coastguard Worker 158*90c8c64dSAndroid Build Coastguard Worker gl.glEnable(gl.GL_CULL_FACE); 159*90c8c64dSAndroid Build Coastguard Worker gl.glFrontFace(gl.GL_CCW); 160*90c8c64dSAndroid Build Coastguard Worker 161*90c8c64dSAndroid Build Coastguard Worker gl.glClearColor(0, 0, 0, 1); 162*90c8c64dSAndroid Build Coastguard Worker 163*90c8c64dSAndroid Build Coastguard Worker gl.glLightModelf(gl.GL_LIGHT_MODEL_TWO_SIDE, 0); 164*90c8c64dSAndroid Build Coastguard Worker gl.glLightModelfv(gl.GL_LIGHT_MODEL_AMBIENT, lightModelAmbient, 0); 165*90c8c64dSAndroid Build Coastguard Worker } 166*90c8c64dSAndroid Build Coastguard Worker 167*90c8c64dSAndroid Build Coastguard Worker @Override onDraw(Canvas canvas)168*90c8c64dSAndroid Build Coastguard Worker protected void onDraw(Canvas canvas) { 169*90c8c64dSAndroid Build Coastguard Worker GL10 gl = (GL10)mGLContext.getGL(); 170*90c8c64dSAndroid Build Coastguard Worker mGLContext.makeCurrent(this); 171*90c8c64dSAndroid Build Coastguard Worker 172*90c8c64dSAndroid Build Coastguard Worker if (!initialized) { 173*90c8c64dSAndroid Build Coastguard Worker init(gl); 174*90c8c64dSAndroid Build Coastguard Worker initialized = true; 175*90c8c64dSAndroid Build Coastguard Worker 176*90c8c64dSAndroid Build Coastguard Worker // Load the object 177*90c8c64dSAndroid Build Coastguard Worker Object3D obj = OBJViewer.getObject(); 178*90c8c64dSAndroid Build Coastguard Worker 179*90c8c64dSAndroid Build Coastguard Worker // Compute a scale factor and translation to bring it 180*90c8c64dSAndroid Build Coastguard Worker // into view 181*90c8c64dSAndroid Build Coastguard Worker mCenterX = (obj.getBoundsMinX() + obj.getBoundsMaxX())/2.0f; 182*90c8c64dSAndroid Build Coastguard Worker mCenterY = (obj.getBoundsMinY() + obj.getBoundsMaxY())/2.0f; 183*90c8c64dSAndroid Build Coastguard Worker mCenterZ = (obj.getBoundsMinZ() + obj.getBoundsMaxZ())/2.0f; 184*90c8c64dSAndroid Build Coastguard Worker float spanX = obj.getBoundsMaxX() - obj.getBoundsMinX(); 185*90c8c64dSAndroid Build Coastguard Worker float spanY = obj.getBoundsMaxY() - obj.getBoundsMinY(); 186*90c8c64dSAndroid Build Coastguard Worker float spanZ = obj.getBoundsMaxZ() - obj.getBoundsMinZ(); 187*90c8c64dSAndroid Build Coastguard Worker float maxSpan = Math.max(spanX, spanY); 188*90c8c64dSAndroid Build Coastguard Worker maxSpan = Math.max(maxSpan, spanZ); 189*90c8c64dSAndroid Build Coastguard Worker mScale = 2.0f/maxSpan; 190*90c8c64dSAndroid Build Coastguard Worker } 191*90c8c64dSAndroid Build Coastguard Worker 192*90c8c64dSAndroid Build Coastguard Worker int w = getWidth(); 193*90c8c64dSAndroid Build Coastguard Worker int h = getHeight(); 194*90c8c64dSAndroid Build Coastguard Worker gl.glViewport(0, 0, w, h); 195*90c8c64dSAndroid Build Coastguard Worker 196*90c8c64dSAndroid Build Coastguard Worker float ratio = (float)w/h; 197*90c8c64dSAndroid Build Coastguard Worker glView.setAspectRatio(ratio); 198*90c8c64dSAndroid Build Coastguard Worker 199*90c8c64dSAndroid Build Coastguard Worker // Clear buffers 200*90c8c64dSAndroid Build Coastguard Worker gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT); 201*90c8c64dSAndroid Build Coastguard Worker 202*90c8c64dSAndroid Build Coastguard Worker // Set up the projection and view 203*90c8c64dSAndroid Build Coastguard Worker glView.setProjection(gl); 204*90c8c64dSAndroid Build Coastguard Worker glView.setView(gl); 205*90c8c64dSAndroid Build Coastguard Worker 206*90c8c64dSAndroid Build Coastguard Worker // Set up lighting 207*90c8c64dSAndroid Build Coastguard Worker gl.glMatrixMode(gl.GL_MODELVIEW); 208*90c8c64dSAndroid Build Coastguard Worker gl.glEnable(gl.GL_LIGHTING); 209*90c8c64dSAndroid Build Coastguard Worker gl.glEnable(gl.GL_LIGHT0); 210*90c8c64dSAndroid Build Coastguard Worker gl.glLightfv(gl.GL_LIGHT0, gl.GL_POSITION, mLightDir, 0); 211*90c8c64dSAndroid Build Coastguard Worker glView.setLights(gl, gl.GL_LIGHT0); 212*90c8c64dSAndroid Build Coastguard Worker 213*90c8c64dSAndroid Build Coastguard Worker // Rotate the viewpoint around the model 214*90c8c64dSAndroid Build Coastguard Worker gl.glRotatef(mTiltAngle, 1, 0, 0); 215*90c8c64dSAndroid Build Coastguard Worker gl.glRotatef(mRotAngle, 0, 1, 0); 216*90c8c64dSAndroid Build Coastguard Worker 217*90c8c64dSAndroid Build Coastguard Worker // Scale object to fit in [-1, 1] 218*90c8c64dSAndroid Build Coastguard Worker gl.glScalef(mScale, mScale, mScale); 219*90c8c64dSAndroid Build Coastguard Worker 220*90c8c64dSAndroid Build Coastguard Worker // Center the object at the origin 221*90c8c64dSAndroid Build Coastguard Worker gl.glTranslatef(-mCenterX, -mCenterY, -mCenterZ); 222*90c8c64dSAndroid Build Coastguard Worker 223*90c8c64dSAndroid Build Coastguard Worker // Increment the rotation angle 224*90c8c64dSAndroid Build Coastguard Worker mRotAngle += mRotVelocity; 225*90c8c64dSAndroid Build Coastguard Worker if (mRotAngle < 0.0f) { 226*90c8c64dSAndroid Build Coastguard Worker mRotAngle += 360.0f; 227*90c8c64dSAndroid Build Coastguard Worker } 228*90c8c64dSAndroid Build Coastguard Worker if (mRotAngle > 360.0f) { 229*90c8c64dSAndroid Build Coastguard Worker mRotAngle -= 360.0f; 230*90c8c64dSAndroid Build Coastguard Worker } 231*90c8c64dSAndroid Build Coastguard Worker 232*90c8c64dSAndroid Build Coastguard Worker // Draw the object 233*90c8c64dSAndroid Build Coastguard Worker Object3D object = OBJViewer.getObject(); 234*90c8c64dSAndroid Build Coastguard Worker object.draw(gl); 235*90c8c64dSAndroid Build Coastguard Worker 236*90c8c64dSAndroid Build Coastguard Worker // Allow GL to complete 237*90c8c64dSAndroid Build Coastguard Worker mGLContext.post(); 238*90c8c64dSAndroid Build Coastguard Worker 239*90c8c64dSAndroid Build Coastguard Worker // Draw GLView messages and/or FPS 240*90c8c64dSAndroid Build Coastguard Worker glView.showMessages(canvas); 241*90c8c64dSAndroid Build Coastguard Worker glView.setNumTriangles(object.getNumTriangles()); 242*90c8c64dSAndroid Build Coastguard Worker glView.showStatistics(canvas, w); 243*90c8c64dSAndroid Build Coastguard Worker } 244*90c8c64dSAndroid Build Coastguard Worker 245*90c8c64dSAndroid Build Coastguard Worker private static final int INVALIDATE = 1; 246*90c8c64dSAndroid Build Coastguard Worker 247*90c8c64dSAndroid Build Coastguard Worker private final Handler mHandler = new Handler() { 248*90c8c64dSAndroid Build Coastguard Worker public void handleMessage(Message msg) { 249*90c8c64dSAndroid Build Coastguard Worker if (msg.what == INVALIDATE) { 250*90c8c64dSAndroid Build Coastguard Worker invalidate(); 251*90c8c64dSAndroid Build Coastguard Worker msg = obtainMessage(INVALIDATE); 252*90c8c64dSAndroid Build Coastguard Worker long current = SystemClock.uptimeMillis(); 253*90c8c64dSAndroid Build Coastguard Worker if (mNextTime < current) { 254*90c8c64dSAndroid Build Coastguard Worker mNextTime = current + 20; 255*90c8c64dSAndroid Build Coastguard Worker } 256*90c8c64dSAndroid Build Coastguard Worker sendMessageAtTime(msg, mNextTime); 257*90c8c64dSAndroid Build Coastguard Worker mNextTime += 20; 258*90c8c64dSAndroid Build Coastguard Worker } 259*90c8c64dSAndroid Build Coastguard Worker } 260*90c8c64dSAndroid Build Coastguard Worker }; 261*90c8c64dSAndroid Build Coastguard Worker } 262*90c8c64dSAndroid Build Coastguard Worker 263*90c8c64dSAndroid Build Coastguard Worker 264*90c8c64dSAndroid Build Coastguard Worker public class OBJViewer extends Activity { 265*90c8c64dSAndroid Build Coastguard Worker 266*90c8c64dSAndroid Build Coastguard Worker private static Object3D object = null; 267*90c8c64dSAndroid Build Coastguard Worker 268*90c8c64dSAndroid Build Coastguard Worker private static List<String> objectFiles = new ArrayList<String>(); 269*90c8c64dSAndroid Build Coastguard Worker private static int objectIndex = 0; 270*90c8c64dSAndroid Build Coastguard Worker 271*90c8c64dSAndroid Build Coastguard Worker static { 272*90c8c64dSAndroid Build Coastguard Worker objectFiles.add("world.gles"); 273*90c8c64dSAndroid Build Coastguard Worker objectFiles.add("al.gles"); 274*90c8c64dSAndroid Build Coastguard Worker objectFiles.add("apple.gles"); 275*90c8c64dSAndroid Build Coastguard Worker objectFiles.add("dolphins.gles"); 276*90c8c64dSAndroid Build Coastguard Worker objectFiles.add("f16.gles"); 277*90c8c64dSAndroid Build Coastguard Worker objectFiles.add("flowers.gles"); 278*90c8c64dSAndroid Build Coastguard Worker objectFiles.add("porsche.gles"); 279*90c8c64dSAndroid Build Coastguard Worker objectFiles.add("rosevase.gles"); 280*90c8c64dSAndroid Build Coastguard Worker objectFiles.add("shuttle.gles"); 281*90c8c64dSAndroid Build Coastguard Worker objectFiles.add("soccerball.gles"); 282*90c8c64dSAndroid Build Coastguard Worker } 283*90c8c64dSAndroid Build Coastguard Worker readInt16(InputStream is)284*90c8c64dSAndroid Build Coastguard Worker private int readInt16(InputStream is) throws Exception { 285*90c8c64dSAndroid Build Coastguard Worker return is.read() | (is.read() << 8); 286*90c8c64dSAndroid Build Coastguard Worker } 287*90c8c64dSAndroid Build Coastguard Worker getObject()288*90c8c64dSAndroid Build Coastguard Worker public static Object3D getObject() { 289*90c8c64dSAndroid Build Coastguard Worker return object; 290*90c8c64dSAndroid Build Coastguard Worker } 291*90c8c64dSAndroid Build Coastguard Worker nextObject()292*90c8c64dSAndroid Build Coastguard Worker public static void nextObject() { 293*90c8c64dSAndroid Build Coastguard Worker try { 294*90c8c64dSAndroid Build Coastguard Worker objectIndex = (objectIndex + 1) % objectFiles.size(); 295*90c8c64dSAndroid Build Coastguard Worker object.load(objectFiles.get(objectIndex)); 296*90c8c64dSAndroid Build Coastguard Worker } catch (IOException e) { 297*90c8c64dSAndroid Build Coastguard Worker throw new RuntimeException(e); 298*90c8c64dSAndroid Build Coastguard Worker } 299*90c8c64dSAndroid Build Coastguard Worker } 300*90c8c64dSAndroid Build Coastguard Worker onCreate(Bundle icicle)301*90c8c64dSAndroid Build Coastguard Worker @Override protected void onCreate(Bundle icicle) { 302*90c8c64dSAndroid Build Coastguard Worker super.onCreate(icicle); 303*90c8c64dSAndroid Build Coastguard Worker 304*90c8c64dSAndroid Build Coastguard Worker // Get rid of the title 305*90c8c64dSAndroid Build Coastguard Worker requestWindowFeature(Window.FEATURE_NO_TITLE); 306*90c8c64dSAndroid Build Coastguard Worker // Make sure we're not drawing a background 307*90c8c64dSAndroid Build Coastguard Worker setTheme(R.style.Theme); 308*90c8c64dSAndroid Build Coastguard Worker setContentView(new OBJView((Context)getApplication())); 309*90c8c64dSAndroid Build Coastguard Worker 310*90c8c64dSAndroid Build Coastguard Worker if (object == null) { 311*90c8c64dSAndroid Build Coastguard Worker try { 312*90c8c64dSAndroid Build Coastguard Worker final AssetManager am = getAssets(); 313*90c8c64dSAndroid Build Coastguard Worker this.object = new Object3D() { 314*90c8c64dSAndroid Build Coastguard Worker public InputStream readFile(String filename) 315*90c8c64dSAndroid Build Coastguard Worker throws IOException { 316*90c8c64dSAndroid Build Coastguard Worker return am.open(filename); 317*90c8c64dSAndroid Build Coastguard Worker 318*90c8c64dSAndroid Build Coastguard Worker } 319*90c8c64dSAndroid Build Coastguard Worker }; 320*90c8c64dSAndroid Build Coastguard Worker object.load(objectFiles.get(0)); 321*90c8c64dSAndroid Build Coastguard Worker } catch (Exception e) { 322*90c8c64dSAndroid Build Coastguard Worker throw new RuntimeException(e); 323*90c8c64dSAndroid Build Coastguard Worker } 324*90c8c64dSAndroid Build Coastguard Worker } 325*90c8c64dSAndroid Build Coastguard Worker } 326*90c8c64dSAndroid Build Coastguard Worker onResume()327*90c8c64dSAndroid Build Coastguard Worker @Override protected void onResume() { 328*90c8c64dSAndroid Build Coastguard Worker super.onResume(); 329*90c8c64dSAndroid Build Coastguard Worker } 330*90c8c64dSAndroid Build Coastguard Worker onStop()331*90c8c64dSAndroid Build Coastguard Worker @Override protected void onStop() { 332*90c8c64dSAndroid Build Coastguard Worker super.onStop(); 333*90c8c64dSAndroid Build Coastguard Worker } 334*90c8c64dSAndroid Build Coastguard Worker } 335