package com.sunny;
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 static final String LOG_TAG=VortexRenderer.class.getSimpleName();
private float _red=0.9f;//用浮點數來定義RGB顏色系統中的每一個顏色
private float _green=0.2f;
private float _blue=0.2f;
private ShortBuffer _indexBuffer;//儲存索引
private ShortBuffer _indexBufferStatic;
private FloatBuffer _vertexBuffer;//為三角形儲存座標
private FloatBuffer _vertexBufferStatic;
private FloatBuffer _colorBuffer;
private short[] _indicesArray={0,1,2};
private int _nrOfVertices=3;//定義需要多少個頂點.對於一個三角形來說,一共需要三個頂點
private float _angle;
public void setAngle(float angle){
_angle=angle;
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {//surface建立以後調用
// TODO Auto-generated method stub
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//設定OpenGL使用vertex數組來畫
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
initTriangle();
//initStaticTriangle();
}
@Override
public void onSurfaceChanged(GL10 gl, int w, int h) {//surface發生改變以後調用,例如從豎屏切換到橫屏的時候
// TODO Auto-generated method stub
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(_red, _green, _blue, 1.0f);
//reset the matrix - good to fix the rotation to a static angle
gl.glLoadIdentity();
// clear the color buffer to show the ClearColor we called above...
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glRotatef(_angle, 0f, 1f, 0f);//繞y軸旋,參數中的值表示一個向量,標誌三角形繞著旋轉的座標軸
// set the color of our element 設定三角形為暗紅色
//gl.glColor4f(0.5f, 0f, 0f, 0.5f);
// define the vertices we want to draw
/*使用glVertexPointer()初始化Vertex Pointer.
* 第一個參數是大小,也是頂點的維數。我們使用的是x,y,z三維座標。
* 第二個參數,GL_FLOAT定義buffer中使用的資料類型。
* 第三個變數是0,是因為我們的座標是在數組中緊湊的排列的,沒有使用offset。
* 最後第四個參數頂點緩衝。
*/
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);
// finally draw the vertices
/*glDrawElements()將所有這些元素畫出來。
* 第一個參數定義了什麼樣的圖元將被畫出來。
* 第二個參數定義有多少個元素,
* 第三個是indices使用的資料類型。
* 最後一個是繪製頂點使用的索引緩衝。
*/
gl.glColorPointer(4, GL10.GL_FLOAT, 0, _colorBuffer);
gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);
}
public void setColor(float r, float g, float b) {
_red = r;
_green = g;
_blue = b;
}
private void initTriangle(){
//為這裡兩個buffer分配必須的記憶體
// float has 4 bytes
ByteBuffer vbb=ByteBuffer.allocateDirect(_nrOfVertices*3*4);
vbb.order(ByteOrder.nativeOrder());
_vertexBuffer=vbb.asFloatBuffer();
// short has 2 bytes
ByteBuffer ibb=ByteBuffer.allocateDirect(_nrOfVertices*2);
ibb.order(ByteOrder.nativeOrder());
_indexBuffer=ibb.asShortBuffer();
ByteBuffer cbb=ByteBuffer.allocateDirect(4*_nrOfVertices*4);
cbb.order(ByteOrder.nativeOrder());
_colorBuffer=cbb.asFloatBuffer();
float[] coords={
-0.5f,-0.5f,0f, // (x1, y1, z1)
0.5f,-0.5f,0f,// (x2, y2, z2)
0f,0.5f,0f// (x3, y3, z3)
};
float[] colors={//RGBA(Red,Green,Blue,alpha)
1f,0f,0f,1f,
0f,1f,0f,1f,
0f,0f,1f,1f
};
_vertexBuffer.put(coords);
_indexBuffer.put(_indicesArray);
_colorBuffer.put(colors);
_vertexBuffer.position(0);
_indexBuffer.position(0);
_colorBuffer.position(0);
}
}