blob: ca9a5b521b66a6b7d91ac17ed72fcbfbfdf1c560 [file] [log] [blame]
package com.example.android.rs.nbody_gl;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class BasicGLRenderer implements GLSurfaceView.Renderer {
private static final String TAG = "BasicGLRenderer";
private Swarm mSwarm;
Context mContext;
private final float[] mMVPMatrix = new float[16];
private final float[] mProjectionMatrix = new float[16];
private final float[] mViewMatrix = new float[16];
private final float[] mRotationMatrix = new float[16];
private float mAngle;
GLSurfaceView mGLSurfaceView;
public BasicGLRenderer(Context context, GLSurfaceView view) {
mContext = context;
mGLSurfaceView = view;
}
@Override
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
if (mSwarm != null) {
mSwarm.onPause();
}
mSwarm = new Swarm(mContext, mGLSurfaceView);
mSwarm.onSurfaceCreated();
mSwarm.onResume();
}
@Override
public void onDrawFrame(GL10 unused) {
float[] scratch = new float[16];
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
Matrix.setLookAtM(mViewMatrix, 0,
0, 0, -3, 0f,
0f, 0f, 0f,
1.0f, 0.0f);
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
mSwarm.draw(mMVPMatrix);
Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, 1.0f);
Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);
}
@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
Matrix.frustumM(mProjectionMatrix, 0, -ratio / 10, ratio / 10, -.1f, .1f, .1f, 200);
}
public static int loadShader(int type, String shaderCode) {
int shader = GLES20.glCreateShader(type);
GLES20.glShaderSource(shader, shaderCode);
GLES20.glCompileShader(shader);
return shader;
}
public static void checkGlError(String glOperation) {
int error;
while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
Log.e(TAG, glOperation + ": glError " + error);
throw new RuntimeException(glOperation + ": glError " + error);
}
}
public float getAngle() {
return mAngle;
}
public void setAngle(float angle) {
mAngle = angle;
}
public void onResume() {
if (mSwarm != null) {
mSwarm.onResume();
}
}
public void onPause() {
if (mSwarm != null) {
mSwarm.onPause();
}
}
public void onTouchEvent(MotionEvent e) {
mSwarm.onTouchEvent(e);
}
public void onJoystick(float dx, float dy) {
mSwarm.onJoystick(dx, dy);
}
public void onKeyDown(int keyCode, KeyEvent event) {
mSwarm.onKeyDown(keyCode, event);
}
}