2011年5月25日水曜日

AndroidでMetasequoiaのmqoを読み込むコード その1 VBO

以前書いた記事でmqo読んでるぜーって書いたらなんだか奇特な方がソースを晒してくれってな事だったので、ざっと。

でも、結構絡み合ってるんですよ? これが?

まず、VertexObjectで描画が基本なので、VBOクラスから。

  1. import java.nio.FloatBuffer;  
  2. import java.util.ArrayList;  
  3.   
  4. import javax.microedition.khronos.opengles.GL10;  
  5. import javax.microedition.khronos.opengles.GL11;  
  6.   
  7. /** 
  8.  * VertexBufferObjectクラス 
  9.  * @author ksz 
  10.  */  
  11. public class Vbo {  
  12.  public float r=1,g=1,b=1,a=1,diffuse=1,ambient=1;  
  13.  public int vSize, tSize;  
  14.  private int vboID = -1;  
  15.  private static int oldID = -1;  
  16.   
  17.  /** 
  18.   * GLにVBOをセット 
  19.   */  
  20.  public void bindVBO() {  
  21.   if (oldID == vboID) return//既に同じバッファがセットされていたら無視  
  22.   if (vboID < 0return//makeBufferされてないようなので無視  
  23.   
  24.   oldID = vboID;  
  25.   GL11 gl = Global.gl;  
  26.   gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, vboID);  
  27.   gl.glVertexPointer(3, GL11.GL_FLOAT, 00); //頂点バッファ  
  28.   
  29.   if (tSize != 0) {  
  30.    gl.glTexCoordPointer(2, GL11.GL_FLOAT, 0, vSize); //UVバッファ  
  31.   }  
  32.  }  
  33.   
  34.  /** 
  35.   * VBOを描画します 
  36.   */  
  37.  public void draw() {  
  38.   GL11 gl = Global.gl;  
  39.     
  40.   //テクスチャ行列を外す  
  41.   gl.glMatrixMode(GL10.GL_TEXTURE);  
  42.   gl.glLoadIdentity();  
  43.   
  44.   gl.glColor4f(r, g, b, a);  
  45.   
  46.   bindVBO();  
  47.     
  48.   //vSizeは頂点配列のバイト数なので、floatにするのに/4 TRIANGLESなので3角ポリで/3 で/12  
  49.   gl.glDrawArrays(GL10.GL_TRIANGLES, 0, vSize / 12);  
  50.  }  
  51.   
  52.  /** 
  53.   * 頂点とUVの配列からVBO作成 
  54.   * @param v 頂点配列 
  55.   * @param t UV配列 
  56.   */  
  57.  public void makeBuffer(float v[], float t[]) {  
  58.   vSize = v.length;  
  59.   tSize = 0;  
  60.   if (t != null && t.length != 0) {  
  61.    tSize = t.length;  
  62.   }  
  63.   makeBuffer(v,vSize, t,tSize);    
  64.  }  
  65.   
  66.  /** 
  67.   * 頂点とUVの配列からVBO作成(サイズ指定版) 
  68.   * @param v  頂点配列 
  69.   * @param vCnt 頂点配列の有効要素数 
  70.   * @param t  UV配列 
  71.   * @param tCnt UV配列の有効要素数 
  72.   */  
  73.  public void makeBuffer(float v[],int vCnt, float t[],int tCnt) {  
  74.   GL11 gl = Global.gl;  
  75.   vSize = vCnt * 4;  
  76.   tSize = tCnt * 4;  
  77.   
  78.   int vbo[] = new int[1];  
  79.   gl.glGenBuffers(1, vbo, 0);  
  80.   gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, vbo[0]);  
  81.   gl.glBufferData(GL11.GL_ARRAY_BUFFER, vSize + tSize, null, GL11.GL_STATIC_DRAW);  
  82.   gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, 0, vSize, FloatBuffer.wrap(v));  
  83.   if (tSize != 0) {  
  84.    gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, vSize, tSize, FloatBuffer.wrap(t));  
  85.   }  
  86.   vboID = vbo[0];  
  87.  }  
  88. }  

ちなみに、ライティングは無視してるので、勝手に拡張してね。
Global.gl とかがさも当然のように使われてますが、GL11インスタンスはいろんなところから使うので、グローバルっぽく使うためにpublic static な領域にGl11インスタンスを渡してある前提で。

まだまだ続きます。

0 件のコメント:

コメントを投稿