package com.paar.ch8; import java.util.Iterator; import java.util.Vector; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView; import android.opengl.GLU; import android.util.Log; public class Renderer implements GLSurfaceView.Renderer { private final Vector<Model3D> models; private final Vector3D cameraPosition = new Vector3D(0, 3, 50); long frame,time,timebase=0; public Renderer(Vector<Model3D> models) { this.models = models; } public void addModel(Model3D model) { if(!models.contains(model)) { models.add(model); } } public void onDrawFrame(GL10 gl) { if(ModelViewer.DEBUG) { frame++; time=System.currentTimeMillis(); if (time - timebase > 1000) { Log.d("fps: ", String.valueOf(frame*1000.0f/(time-timebase))); timebase = time; frame = 0; } } gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); GLU.gluLookAt(gl, cameraPosition.x, cameraPosition.y, cameraPosition.z, 0, 0, 0, 0, 1, 0); for (Iterator<Model3D> iterator = models.iterator(); iterator.hasNext();) { Model3D model = iterator.next(); model.draw(gl); } } public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0,0,width,height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); GLU.gluPerspective(gl, 45.0f, ((float)width)/height, 0.11f, 100f); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); } public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glClearColor(1,1,1,1); gl.glClearDepthf(1.0f); gl.glEnable(GL10.GL_DEPTH_TEST); gl.glDepthFunc(GL10.GL_LEQUAL); gl.glEnable(GL10.GL_TEXTURE_2D); gl.glShadeModel(GL10.GL_SMOOTH); gl.glDisable(GL10.GL_COLOR_MATERIAL); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); gl.glEnable(GL10.GL_LIGHTING); float[] ambientlight = {.6f, .6f, .6f, 1f}; float[] diffuselight = {1f, 1f, 1f, 1f}; float[] specularlight = {1f, 1f, 1f, 1f}; gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, MemUtil.makeFloatBuffer(ambientlight)); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, MemUtil.makeFloatBuffer(diffuselight)); gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, MemUtil.makeFloatBuffer(specularlight)); gl.glEnable(GL10.GL_LIGHT0); for (Iterator<Model3D> iterator = models.iterator(); iterator.hasNext();) { Model3D model = iterator.next(); model.init(gl); } } }