1a198b1ec2ab5638747ad0a6f9478d4069a8d9992hofordpackage com.example.android.rs.nbody_gl; 2a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 3a198b1ec2ab5638747ad0a6f9478d4069a8d9992hofordimport javax.microedition.khronos.egl.EGLConfig; 4a198b1ec2ab5638747ad0a6f9478d4069a8d9992hofordimport javax.microedition.khronos.opengles.GL10; 5a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 6a198b1ec2ab5638747ad0a6f9478d4069a8d9992hofordimport android.content.Context; 7a198b1ec2ab5638747ad0a6f9478d4069a8d9992hofordimport android.opengl.GLES20; 8a198b1ec2ab5638747ad0a6f9478d4069a8d9992hofordimport android.opengl.GLSurfaceView; 9a198b1ec2ab5638747ad0a6f9478d4069a8d9992hofordimport android.opengl.Matrix; 10a198b1ec2ab5638747ad0a6f9478d4069a8d9992hofordimport android.util.Log; 11a198b1ec2ab5638747ad0a6f9478d4069a8d9992hofordimport android.view.KeyEvent; 12a198b1ec2ab5638747ad0a6f9478d4069a8d9992hofordimport android.view.MotionEvent; 13a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 14a198b1ec2ab5638747ad0a6f9478d4069a8d9992hofordpublic class BasicGLRenderer implements GLSurfaceView.Renderer { 15a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 16a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford private static final String TAG = "BasicGLRenderer"; 17a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford private Swarm mSwarm; 18a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford Context mContext; 19a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford private final float[] mMVPMatrix = new float[16]; 20a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford private final float[] mProjectionMatrix = new float[16]; 21a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford private final float[] mViewMatrix = new float[16]; 22a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford private final float[] mRotationMatrix = new float[16]; 23a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford private float mAngle; 24a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 25a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford GLSurfaceView mGLSurfaceView; 26a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 27a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public BasicGLRenderer(Context context, GLSurfaceView view) { 28a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mContext = context; 29a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mGLSurfaceView = view; 30a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 31a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 32a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford @Override 33a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public void onSurfaceCreated(GL10 unused, EGLConfig config) { 34a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 35a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford GLES20.glEnable(GLES20.GL_DEPTH_TEST); 36a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 37a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford if (mSwarm != null) { 38a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mSwarm.onPause(); 39a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 40a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mSwarm = new Swarm(mContext, mGLSurfaceView); 41a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mSwarm.onSurfaceCreated(); 42a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mSwarm.onResume(); 43a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 44a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 45a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford @Override 46a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public void onDrawFrame(GL10 unused) { 47a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford float[] scratch = new float[16]; 48a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 49a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 50a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford Matrix.setLookAtM(mViewMatrix, 0, 51a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 0, 0, -3, 0f, 52a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 0f, 0f, 0f, 53a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 1.0f, 0.0f); 54a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0); 55a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 56a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mSwarm.draw(mMVPMatrix); 57a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 58a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, 1.0f); 59a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0); 60a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 61a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 62a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 63a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford @Override 64a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public void onSurfaceChanged(GL10 unused, int width, int height) { 65a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford GLES20.glViewport(0, 0, width, height); 66a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford float ratio = (float) width / height; 67a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford Matrix.frustumM(mProjectionMatrix, 0, -ratio / 10, ratio / 10, -.1f, .1f, .1f, 200); 68a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 69a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 70a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public static int loadShader(int type, String shaderCode) { 71a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford int shader = GLES20.glCreateShader(type); 72a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford GLES20.glShaderSource(shader, shaderCode); 73a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford GLES20.glCompileShader(shader); 74a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 75a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford return shader; 76a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 77a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 78a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public static void checkGlError(String glOperation) { 79a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford int error; 80a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) { 81a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford Log.e(TAG, glOperation + ": glError " + error); 82a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford throw new RuntimeException(glOperation + ": glError " + error); 83a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 84a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 85a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 86a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public float getAngle() { 87a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford return mAngle; 88a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 89a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 90a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public void setAngle(float angle) { 91a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mAngle = angle; 92a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 93a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 94a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public void onResume() { 95a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford if (mSwarm != null) { 96a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mSwarm.onResume(); 97a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 98a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 99a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 100a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public void onPause() { 101a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford if (mSwarm != null) { 102a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mSwarm.onPause(); 103a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 104a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 105a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 106a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public void onTouchEvent(MotionEvent e) { 107a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mSwarm.onTouchEvent(e); 108a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 109a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 110a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public void onJoystick(float dx, float dy) { 111a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mSwarm.onJoystick(dx, dy); 112a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 113a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 114a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford public void onKeyDown(int keyCode, KeyEvent event) { 115a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford 116a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford mSwarm.onKeyDown(keyCode, event); 117a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford } 118a198b1ec2ab5638747ad0a6f9478d4069a8d9992hoford}