package com.kaveri.sample.opengl;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView;
public class VortexRenderer implements GLSurfaceView.Renderer {
private float _red = 0f;
private float _green = 0f;
private float _blue = 0f;
// a raw buffer to hold indices allowing a reuse of points.
private ShortBuffer _indexBuffer;
// a raw buffer to hold the vertices
private FloatBuffer _vertexBuffer0;
private FloatBuffer _vertexBuffer1;
private FloatBuffer _vertexBuffer2;
private FloatBuffer _vertexBuffer3;
private FloatBuffer _vertexBuffer4;
private short[] _indicesArray = {0, 1, 2, 3, 4};
private float[] _verticesArray0 = {
0f, 0f, 0f,
0.1f, 0f, 0f,
0.1f, 0.1f, 0f,
0f, 0.1f, 0f
};
private float[] _verticesArray1 = {
0f, 0f, 0f,
0.2f, 0f, 0f,
0.2f, 0.2f, 0f,
0f, 0.2f, 0f
};
private float[] _verticesArray2 = {
0f, 0f, 0f,
0.3f, 0f, 0f,
0.3f, 0.3f, 0f,
0f, 0.3f, 0f
};
private float[] _verticesArray3 = {
0f, 0f, 0f,
0.4f, 0f, 0f,
0.4f, 0.4f, 0f,
0f, 0.4f, 0f
};
private float[] _verticesArray4 = {
0f, 0f, 0f,
0.5f, 0f, 0f,
0.5f, 0.5f, 0f,
0f, 0.5f, 0f
};
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// preparation
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
initTriangle();
}
@Override
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
}
@Override
public void onDrawFrame(GL10 gl) {
// define the color we want to be displayed as the “clipping wall”
gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
// clear the color buffer to show the ClearColor we called above…
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glLineWidth(2f);
gl.glColor4f(_red, _green, _blue, 0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer0);
gl.glDrawElements(GL10.GL_LINE_LOOP, 4 , GL10.GL_UNSIGNED_SHORT, _indexBuffer);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer1);
gl.glDrawElements(GL10.GL_LINE_LOOP, 4 , GL10.GL_UNSIGNED_SHORT, _indexBuffer);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer2);
gl.glDrawElements(GL10.GL_LINE_LOOP, 4 , GL10.GL_UNSIGNED_SHORT, _indexBuffer);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer3);
gl.glDrawElements(GL10.GL_LINE_LOOP, 4 , GL10.GL_UNSIGNED_SHORT, _indexBuffer);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer4);
gl.glDrawElements(GL10.GL_LINE_LOOP, 4 , GL10.GL_UNSIGNED_SHORT, _indexBuffer);
}
protected static FloatBuffer makeFloatBuffer(float[] arr)
{
ByteBuffer bb = ByteBuffer.allocateDirect(arr.length * 4);
bb.order(ByteOrder.nativeOrder());
FloatBuffer fb = bb.asFloatBuffer();
fb.put(arr);
fb.position(0);
return fb;
}
protected static ShortBuffer makeShortBuffer(short[] arr)
{
ByteBuffer bb = ByteBuffer.allocateDirect(arr.length * 2);
bb.order(ByteOrder.nativeOrder());
ShortBuffer sb = bb.asShortBuffer();
sb.put(arr);
sb.position(0);
return sb;
}
private void initTriangle() {
_vertexBuffer0 = makeFloatBuffer(_verticesArray0);
_vertexBuffer1 = makeFloatBuffer(_verticesArray1);
_vertexBuffer2 = makeFloatBuffer(_verticesArray2);
_vertexBuffer3 = makeFloatBuffer(_verticesArray3);
_vertexBuffer4 = makeFloatBuffer(_verticesArray4);
_indexBuffer = makeShortBuffer(_indicesArray);
}
public void setColor(float r, float g, float b) {
_red = r;
_green = g;
_blue = b;
}
}