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}