/** * TGAGLSurfaceView.java * * Copyright (c) 2014 Kenji Sasaki * Released under the MIT license. * https://github.com/npedotnet/TGAReader/blob/master/LICENSE * * English document * https://github.com/npedotnet/TGAReader/blob/master/README.md * * Japanese document * http://3dtech.jp/wiki/index.php?TGAReader * */ package com.example.tgaglviewer; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.opengl.GLSurfaceView; import android.opengl.GLU; import static javax.microedition.khronos.opengles.GL10.*; public class TGAGLSurfaceView extends GLSurfaceView implements GLSurfaceView.Renderer { public TGAGLSurfaceView(Context context) { super(context); setRenderer(this); float POSITIONS[] = { // front -0.5f, +0.5f, +0.5f, -0.5f, -0.5f, +0.5f, +0.5f, +0.5f, +0.5f, +0.5f, -0.5f, +0.5f, // back +0.5f, +0.5f, -0.5f, +0.5f, -0.5f, -0.5f, -0.5f, +0.5f, -0.5f, -0.5f, -0.5f, -0.5f, }; float TEXCOORDS[] = { // front 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, // back 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, }; positionBuffer = createFloatBuffer(POSITIONS); texcoordBuffer = createFloatBuffer(TEXCOORDS); } private FloatBuffer createFloatBuffer(float [] buffer) { ByteBuffer byteBuffer = ByteBuffer.allocateDirect(buffer.length*4); byteBuffer.order(ByteOrder.nativeOrder()); FloatBuffer floatBuffer = byteBuffer.asFloatBuffer(); floatBuffer.put(buffer); floatBuffer.position(0); return floatBuffer; } public int createTGATexture(GL10 gl, String path) { int texture = 0; try { InputStream is = getContext().getAssets().open(path); byte [] buffer = new byte[is.available()]; is.read(buffer); is.close(); int [] pixels = TGAReader.read(buffer, TGAReader.ABGR); int width = TGAReader.getWidth(buffer); int height = TGAReader.getHeight(buffer); int [] textures = new int[1]; gl.glGenTextures(1, textures, 0); gl.glEnable(GL_TEXTURE_2D); gl.glBindTexture(GL_TEXTURE_2D, textures[0]); gl.glPixelStorei(GL_UNPACK_ALIGNMENT, 4); IntBuffer texBuffer = IntBuffer.wrap(pixels); gl.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texBuffer); gl.glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); gl.glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); gl.glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gl.glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); texture = textures[0]; } catch (IOException e) { e.printStackTrace(); } return texture; } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { tgaTextures[0] = createTGATexture(gl, "images/rgb_rle_LL.tga"); tgaTextures[1] = createTGATexture(gl, "images/grayscale_rle_LL.tga"); tgaTextures[2] = createTGATexture(gl, "images/indexed_rle_LL.tga"); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL_PROJECTION); gl.glLoadIdentity(); GLU.gluPerspective(gl, 45, (float)width/height, 1, 10); } @Override public void onDrawFrame(GL10 gl) { gl.glClearColor(0.5f, 0.5f, 0.5f, 1); gl.glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, positionBuffer); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texcoordBuffer); gl.glEnable(GL_CULL_FACE); gl.glCullFace(GL_BACK); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); GLU.gluLookAt(gl, 3, 3, 3, 0, 0, 0, 0, 1, 0); // draw front and back draw(gl, tgaTextures[0]); // draw left and right gl.glPushMatrix(); gl.glRotatef(90, 0, 1, 0); draw(gl, tgaTextures[1]); gl.glPopMatrix(); // draw top and bottom gl.glPushMatrix(); gl.glRotatef(-90, 1, 0, 0); draw(gl, tgaTextures[2]); gl.glPopMatrix(); } private void draw(GL10 gl, int texture) { gl.glEnable(GL_TEXTURE_2D); gl.glActiveTexture(GL_TEXTURE0); gl.glBindTexture(GL_TEXTURE_2D, texture); // front gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); // back gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4); gl.glDisable(GL_TEXTURE_2D); } private FloatBuffer positionBuffer; private FloatBuffer texcoordBuffer; private int [] tgaTextures = new int[3]; }