      1: package com.programmez.opengl.exercice1;
      2:
      3: import java.nio.ByteBuffer;
      4: import java.nio.ByteOrder;
      5: import java.nio.IntBuffer;
      6:
      7: import javax.microedition.khronos.opengles.GL10;
      8:
      9: import android.content.Context;
     10: import android.graphics.Bitmap;
     11: import android.graphics.BitmapFactory;
     12: import android.opengl.GLUtils;
     13:
     14: class GLCube {
     15:    private final IntBuffer mVertexBuffer;
     16:    private final IntBuffer mTextureBuffer;
     17:
     18:
     19:    public GLCube() {
     20:
     21:       int one = 65536;
     22:       int half = one / 2;
     23:       int vertices[] = {
     24:             // FRONT

     25:             -half, -half, half, half, -half, half,
     26:             -half, half, half, half, half, half,
     27:             // BACK

     28:             -half, -half, -half, -half, half, -half,
     29:             half, -half, -half, half, half, -half,
     30:             // LEFT

     31:             -half, -half, half, -half, half, half,
     32:             -half, -half, -half, -half, half, -half,
     33:             // RIGHT

     34:             half, -half, -half, half, half, -half,
     35:             half, -half, half, half, half, half,
     36:             // TOP

     37:             -half, half, half, half, half, half,
     38:             -half, half, -half, half, half, -half,
     39:             // BOTTOM

     40:             -half, -half, half, -half, -half, -half,
     41:             half, -half, half, half, -half, -half, };
     42:
     43:
     44:
     45:       int texCoords[] = {
     46:             // FRONT

     47:             0, one, one, one, 0, 0, one, 0,
     48:             // BACK

     49:             one, one, one, 0, 0, one, 0, 0,
     50:             // LEFT

     51:             one, one, one, 0, 0, one, 0, 0,
     52:             // RIGHT

     53:             one, one, one, 0, 0, one, 0, 0,
     54:             // TOP

     55:             one, 0, 0, 0, one, one, 0, one,
     56:             // BOTTOM

     57:             0, 0, 0, one, one, 0, one, one, };
     58:
     59:
     60:
     61:       // Buffers to be passed to gl*Pointer() functions must be

     62:       // direct, i.e., they must be placed on the native heap

     63:       // where the garbage collector cannot move them.

     64:       //

     65:       // Buffers with multi-byte data types (e.g., short, int,

     66:       // float) must have their byte order set to native order

     67:       ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
     68:       vbb.order(ByteOrder.nativeOrder());
     69:       mVertexBuffer = vbb.asIntBuffer();
     70:       mVertexBuffer.put(vertices);
     71:       mVertexBuffer.position(0);
     72:
     73:
     74:
     75:       // ...

     76:       ByteBuffer tbb = ByteBuffer.allocateDirect(texCoords.length * 4);
     77:       tbb.order(ByteOrder.nativeOrder());
     78:       mTextureBuffer = tbb.asIntBuffer();
     79:       mTextureBuffer.put(texCoords);
     80:       mTextureBuffer.position(0);
     81:
     82:    }
     83:
     84:
     85:    public void draw(GL10 gl) {
     86:       gl.glVertexPointer(3, GL10.GL_FIXED, 0, mVertexBuffer);
     87:       gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, mTextureBuffer);
     88:
     89:
     90:
     91:       gl.glColor4f(1, 1, 1, 1);
     92:       gl.glNormal3f(0, 0, 1);
     93:       gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
     94:       gl.glNormal3f(0, 0, -1);
     95:       gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4);
     96:
     97:       gl.glColor4f(1, 1, 1, 1);
     98:       gl.glNormal3f(-1, 0, 0);
     99:       gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4);
    100:       gl.glNormal3f(1, 0, 0);
    101:       gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4);
    102:
    103:       gl.glColor4f(1, 1, 1, 1);
    104:       gl.glNormal3f(0, 1, 0);
    105:       gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4);
    106:       gl.glNormal3f(0, -1, 0);
    107:       gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4);
    108:    }
    109:
    110:
    111:    static void loadTexture(GL10 gl, Context context, int resource) {
    112:       Bitmap bmp = BitmapFactory.decodeResource(
    113:             context.getResources(), resource);
    114:       GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
    115:       gl.glTexParameterx(GL10.GL_TEXTURE_2D,
    116:             GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    117:       gl.glTexParameterx(GL10.GL_TEXTURE_2D,
    118:             GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    119:       bmp.recycle();
    120:    }
    121:
    122: }
    123: