Mega Code Archive

 
Categories / Android / 2D Graphics
 

OpenGL Utils

//package com.akjava.lib.android.opengl; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.ShortBuffer; import javax.microedition.khronos.opengles.GL10; //import javax.swing.text.html.Option; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.opengl.GLUtils; import android.util.Log; public class OpenGLUtils {   public static FloatBuffer allocateFloatBuffer(int capacity){     ByteBuffer vbb = ByteBuffer.allocateDirect(capacity);         vbb.order(ByteOrder.nativeOrder());         return vbb.asFloatBuffer();   }      public static IntBuffer allocateInttBuffer(int capacity){     ByteBuffer vbb = ByteBuffer.allocateDirect(capacity);         vbb.order(ByteOrder.nativeOrder());         return vbb.asIntBuffer();   }      public static ShortBuffer allocateShortBuffer(int capacity){     ByteBuffer vbb = ByteBuffer.allocateDirect(capacity);         vbb.order(ByteOrder.nativeOrder());         return vbb.asShortBuffer();   }      public static void addVertex3f(FloatBuffer buffer,float x,float y,float z){     buffer.put(x);     buffer.put(y);     buffer.put(z);   }      public static void addIndex(ShortBuffer buffer,int index1,int index2,int index3){     buffer.put((short) index1);     buffer.put((short) index2);     buffer.put((short) index3);   }      public static void addCoord2f(FloatBuffer buffer,float x,float y){     buffer.put(x);     buffer.put(y);   }      public static void addColorf(FloatBuffer buffer,float r,float g,float b,float a){     buffer.put(r);     buffer.put(g);     buffer.put(b);     buffer.put(a);   }   public static FloatBuffer toFloatBufferPositionZero(float[] values) {     ByteBuffer vbb = ByteBuffer.allocateDirect(values.length*4);         vbb.order(ByteOrder.nativeOrder());         FloatBuffer buffer=vbb.asFloatBuffer();         buffer.put(values);         buffer.position(0);     return buffer;   }      public static ShortBuffer toShortBuffer(short[] values) {     ByteBuffer vbb = ByteBuffer.allocateDirect(values.length*2);         vbb.order(ByteOrder.nativeOrder());         ShortBuffer buffer=vbb.asShortBuffer();         buffer.put(values);         buffer.position(0);     return buffer;   }         public static Bitmap loadBitmap(Context mContext,int id){     Options opt=new Options();     Bitmap bitmap= BitmapFactory.decodeResource(mContext.getResources(), id,opt);            System.out.println(bitmap.getConfig());     if(!sizeCheck(bitmap)){       throw new RuntimeException("width or height not 2x size,it make invalid error on OpenGL:"+id);     }     return bitmap;   }   private static boolean sizeCheck(Bitmap bitmap){     boolean ret=true;     int t=2;     int w=bitmap.getWidth();          while(w!=t){       if(w%t==1){         Log.e("glutils w=",w+","+t);         return false;       }       t*=2;       if(t>w){         return false;       }     }          t=2;     int h=bitmap.getHeight();     while(h!=t){       if(h%t==1){         Log.e("glutils h=",h+","+t);         return false;       }       t*=2;       if(t>h){         return false;       }     }          return ret;   }      /**    * this is for  resized    * GLU.gluOrtho2D (gl,-1f, 1.0f, -1f, 1.0f);    * @param x    * @param y    * @param screenWidth    * @param screenHeight    * @return    */   public static float[] toOpenGLCordinate(float x,float y,int screenWidth,int screenHeight){     float sx=((float)x/screenWidth)*2-1.0f;       float sy=((float)y/screenHeight)*2-1.0f;       sy*=-1;       return new float[]{sx,sy};   }      /*    * y should *=-1;    */   public static float toOpenGLCordinate(float x,int screenWidth){     Log.i("myapp","x="+x+","+screenWidth);     float sx=((float)x/screenWidth)*2-1.0f;       return sx;   }         public static float realToVirtialValue(int x,int real,float virtial){       return virtial/real*x;   }      public static int virtualToRealvalue(float x,int real,float virtial){     //using DecimalFormat make gc       return (int) ((float)x/(virtial/real));   }         private static FloatBuffer mTextureBuffer;   private static FloatBuffer mFVertexBuffer;   private static ShortBuffer mIndexBuffer;      public static FloatBuffer getBoxTriangleTextureBuffer(){     if(mTextureBuffer==null){       mTextureBuffer=OpenGLUtils.allocateFloatBuffer(4*6*2);       OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 1.0f);        OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 0.0f);        OpenGLUtils.addCoord2f(mTextureBuffer,1.0f, 1.0f);        OpenGLUtils.addCoord2f(mTextureBuffer,1.0f, 1.0f);          OpenGLUtils.addCoord2f(mTextureBuffer,1.0f, 0.0f);          OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 0.0f);          mTextureBuffer.position(0);     }     return mTextureBuffer;   }         public static FloatBuffer getBoxTriangleFlipVerticalTextureBuffer(){     if(mTextureBuffer==null){       mTextureBuffer=OpenGLUtils.allocateFloatBuffer(4*6*2);       OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 0.0f);        OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 1.0f);        OpenGLUtils.addCoord2f(mTextureBuffer,1.0f, 0.0f);        OpenGLUtils.addCoord2f(mTextureBuffer,1.0f, 0.0f);          OpenGLUtils.addCoord2f(mTextureBuffer,1.0f, 1.0f);          OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 1.0f);          mTextureBuffer.position(0);     }     return mTextureBuffer;   }      public static FloatBuffer getBoxTextureBuffer(){     if(mTextureBuffer==null){       mTextureBuffer=OpenGLUtils.allocateFloatBuffer(4*4*2);       OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 0.0f);        OpenGLUtils.addCoord2f(mTextureBuffer,0.0f, 1.0f);        OpenGLUtils.addCoord2f(mTextureBuffer,1.0f, 0.0f);          OpenGLUtils.addCoord2f(mTextureBuffer,1.0f, 1.0f);          mTextureBuffer.position(0);     }     return mTextureBuffer;   }   public static ShortBuffer getBoxIndexBuffer(){     if(mIndexBuffer==null){       mIndexBuffer=OpenGLUtils.allocateShortBuffer(6*2);         mIndexBuffer.put((short)0);         mIndexBuffer.put((short)1);         mIndexBuffer.put((short)2);         mIndexBuffer.put((short)2);         mIndexBuffer.put((short)3);         mIndexBuffer.put((short)1);         mIndexBuffer.position(0);     }     return mIndexBuffer;   }   public static FloatBuffer getBoxVertexBuffer(){     if(mFVertexBuffer==null){       mFVertexBuffer=OpenGLUtils.allocateFloatBuffer(4*4*3);         OpenGLUtils.addVertex3f(mFVertexBuffer, -1,-1f,0);           OpenGLUtils.addVertex3f(mFVertexBuffer, -1,1f,0);                                 OpenGLUtils.addVertex3f(mFVertexBuffer, 1,-1f,0);           OpenGLUtils.addVertex3f(mFVertexBuffer, 1,1f,0);             mFVertexBuffer.position(0);                }     return mFVertexBuffer;   }         public static FloatBuffer getBoxTriangleVertexBuffer(){     if(mFVertexBuffer==null){       mFVertexBuffer=OpenGLUtils.allocateFloatBuffer(4*6*3);       OpenGLUtils.addVertex3f(mFVertexBuffer, -1,-1f,0);           OpenGLUtils.addVertex3f(mFVertexBuffer, -1,1f,0);           OpenGLUtils.addVertex3f(mFVertexBuffer, 1,-1f,0);                     OpenGLUtils.addVertex3f(mFVertexBuffer, 1,-1f,0);           OpenGLUtils.addVertex3f(mFVertexBuffer, 1,1f,0);            OpenGLUtils.addVertex3f(mFVertexBuffer, -1,1f,0);                      mFVertexBuffer.position(0);                }     return mFVertexBuffer;   }      //TODO ??????????????   /*    * bitmap???????????    */   public static void bindTextureImage(GL10 gl,final int id,final Bitmap bitmap){        gl.glBindTexture(GL10.GL_TEXTURE_2D,  id);          gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);       GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);       bitmap.recycle();   }    }