package com.example.opengltrying;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.Matrix;
import android.os.SystemClock;
public class TexturedCube {
private FloatBuffer mVertexBuffer;
private ShortBuffer mIndexBuffer;
private float mVerticesData[] = {
// Front face
-1.0f, 1.0f, 1.0f,
0.0f, 0.0f,
-1.0f, -1.0f, 1.0f,
0.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 0.0f,
-1.0f, -1.0f, 1.0f,
0.0f, 1.0f,
1.0f, -1.0f, 1.0f,
1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 0.0f,
// Right face
1.0f, 1.0f, 1.0f,
0.0f, 0.0f,
1.0f, -1.0f, 1.0f,
0.0f, 1.0f,
1.0f, 1.0f, -1.0f,
1.0f, 0.0f,
1.0f, -1.0f, 1.0f,
0.0f, 1.0f,
1.0f, -1.0f, -1.0f,
1.0f, 1.0f,
1.0f, 1.0f, -1.0f,
1.0f, 0.0f,
// Back face
1.0f, 1.0f, -1.0f,
0.0f, 0.0f,
1.0f, -1.0f, -1.0f,
0.0f, 1.0f,
-1.0f, 1.0f, -1.0f,
1.0f, 0.0f,
1.0f, -1.0f, -1.0f,
0.0f, 1.0f,
-1.0f, -1.0f, -1.0f,
1.0f, 1.0f,
-1.0f, 1.0f, -1.0f,
1.0f, 0.0f,
// Left face
-1.0f, 1.0f, -1.0f,
0.0f, 0.0f,
-1.0f, -1.0f, -1.0f,
0.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 0.0f,
-1.0f, -1.0f, -1.0f,
0.0f, 1.0f,
-1.0f, -1.0f, 1.0f,
1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 0.0f,
// Top face
-1.0f, 1.0f, -1.0f,
0.0f, 0.0f,
-1.0f, 1.0f, 1.0f,
0.0f, 1.0f,
1.0f, 1.0f, -1.0f,
1.0f, 0.0f,
-1.0f, 1.0f, 1.0f,
0.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f,
1.0f, 1.0f, -1.0f,
1.0f, 0.0f,
// Bottom face
1.0f, -1.0f, -1.0f,
0.0f, 0.0f,
1.0f, -1.0f, 1.0f,
0.0f, 1.0f,
-1.0f, -1.0f, -1.0f,
1.0f, 0.0f,
1.0f, -1.0f, 1.0f,
0.0f, 1.0f,
-1.0f, -1.0f, 1.0f,
1.0f, 1.0f,
-1.0f, -1.0f, -1.0f,
1.0f, 0.0f
};
// Number of coordinates per vertex in this array
private final int FLOATS_PER_VERTEX = 5;
private final int BYTES_PER_FLOAT = 4;
private final int BYTES_PER_SHORT = 2;
private final int mVertexPositionDataSize = 3;
private final int mVertexTextureCoordsDataSize = 2;
private short mIndices[] = { 0, 1, 2, 0, 2, 3 };
private final String mVertexShaderCode =
"uniform mat4 uWVPMatrix;" +
"attribute vec4 aPosition;" +
"attribute vec2 aTexCoord;" +
"varying vec2 vTexCoord;" +
"void main() {" +
" vTexCoord = aTexCoord;" +
" gl_Position = aPosition * uWVPMatrix;" +
"}";
private final String mFragmentShaderCode =
"precision mediump float;" +
"varying vec2 vTexCoord;" +
"uniform sampler2D uTexture;" +
"void main() {" +
" gl_FragColor = texture2D( uTexture, vTexCoord );" +
//" gl_FragColor = vec4( 0.1f, 0.12f, 0.52f, 1.0f );" +
"}";
private int mProgram;
private int mPositionHandle;
private int mTexCoordHandle;
private final int mVertexStrideBytes = FLOATS_PER_VERTEX * BYTES_PER_FLOAT; // bytes per vertex
private final int mVerticesCount = mVerticesData.length / FLOATS_PER_VERTEX;
private int mWVPMatrixHandle;
private int mTextureHandle;
private int mTexture;
private float[] mModelMatrix = new float[16];
private float[] mMVPMatrix = new float[16];
public TexturedCube( final Context context ) {
Matrix.setIdentityM( mModelMatrix, 0 );
// Initialize vertex byte buffer for shape coordinates
ByteBuffer bb = ByteBuffer.allocateDirect(
// ( # of coordinate values * 4 bytes per float )
mVerticesData.length * BYTES_PER_FLOAT );
bb.order( ByteOrder.nativeOrder() );
mVertexBuffer = bb.asFloatBuffer();
mVertexBuffer.put( mVerticesData );
mVertexBuffer.position( 0 );
// Initialize byte buffer for the draw list
ByteBuffer dlb = ByteBuffer.allocateDirect(
// ( # of coordinate values * 2 bytes per short )
mIndices.length * BYTES_PER_SHORT );
dlb.order( ByteOrder.nativeOrder() );
mIndexBuffer = dlb.asShortBuffer();
mIndexBuffer.put( mIndices );
mIndexBuffer.position( 0 );
// Configure rendering
int vertexShader = MyRenderer.LoadShader( GLES20.GL_VERTEX_SHADER,
mVertexShaderCode );
int fragmentShader = MyRenderer.LoadShader( GLES20.GL_FRAGMENT_SHADER,
mFragmentShaderCode );
mProgram = GLES20.glCreateProgram();
GLES20.glAttachShader( mProgram, vertexShader );
GLES20.glAttachShader( mProgram, fragmentShader );
GLES20.glLinkProgram( mProgram );
// Load texture resource
mTexture = GFXUtils.LoadTexture( context, R.drawable.brick );
}
public void draw( float[] viewProjMatrix ) {
// Add program to OpenGL ES environment
GLES20.glUseProgram( mProgram );
int err = GLES20.glGetError();
// Get handle to vertex shader's vPosition member
mPositionHandle = GLES20.glGetAttribLocation( mProgram, "aPosition" );
err = GLES20.glGetError();
mTexCoordHandle = GLES20.glGetAttribLocation( mProgram, "aTexCoord" );
err = GLES20.glGetError();
// Set the array offset to the start of position data
mVertexBuffer.position( 0 );
// Prepare the position coordinate data
GLES20.glVertexAttribPointer( mPositionHandle, mVertexPositionDataSize,
GLES20.GL_FLOAT, false,
mVertexStrideBytes, mVertexBuffer );
err = GLES20.glGetError();
// Enable a handle to position chunk of data
GLES20.glEnableVertexAttribArray( mPositionHandle );
// Set the array offset to the start of color data
mVertexBuffer.position( 0 + mVertexPositionDataSize );
// Prepare the color coordinate data
GLES20.glVertexAttribPointer( mTexCoordHandle, mVertexTextureCoordsDataSize,
GLES20.GL_FLOAT, false,
mVertexStrideBytes, mVertexBuffer );
// Enable a handle to color chunk of data
GLES20.glEnableVertexAttribArray( mTexCoordHandle );
// Get handle to the vertex shader's uWVPMatrix member
mWVPMatrixHandle = GLES20.glGetUniformLocation( mProgram, "uWVPMatrix" );
// Set the transformation matrix
// Get rotation angle based on system time
long time = SystemClock.uptimeMillis() % 4000L;
float angle = 0.0090f * ((int) time);
// Create rotation matrix around -Z axis
float[] rotationMatrix = new float[16];
Matrix.setRotateM( rotationMatrix, 0, angle, 0.0f, -1.0f, 0.0f );
Matrix.multiplyMM( mModelMatrix, 0, rotationMatrix, 0, mModelMatrix, 0 );
Matrix.multiplyMM( mMVPMatrix, 0, viewProjMatrix, 0, mModelMatrix, 0 );
GLES20.glUniformMatrix4fv( mWVPMatrixHandle, 1, false, mMVPMatrix, 0 );
mTextureHandle = GLES20.glGetUniformLocation( mProgram, "uTexture" );
GLES20.glActiveTexture( GLES20.GL_TEXTURE0 );
GLES20.glBindTexture( GLES20.GL_TEXTURE_2D, mTexture );
GLES20.glUniform1i( mTextureHandle, 0);
// Draw the triangle
GLES20.glDrawArrays( GLES20.GL_TRIANGLES, 0, mVerticesCount );
// Disable vertex position chunk of data in array
//GLES20.glDisableVertexAttribArray( mPositionHandle );
// Disable vertex color chunk of data in array
//GLES20.glDisableVertexAttribArray( mColorHandle );
}
}