Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

package com.gebauz.pingK.common.framework;

import java.io.IOException;
import java.io.InputStream;

import javax.microedition.khronos.opengles.GL10;


import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLUtils;

public class Texture extends Resource
{
        public enum Filter
        {
                NEAREST,
                LINEAR
        };
       
        public enum WrapMode
        {
                CLAMP_TO_EDGE,
                REPEAT
        };
       
        protected int mTextureID = 0;
        private int mResourceID = -1;
       
        public int width;
        public int height;
       
        private Filter mMinFilter = Filter.LINEAR;
        private Filter mMagFilter = Filter.LINEAR;
        private WrapMode mWrapModeS = WrapMode.CLAMP_TO_EDGE;
        private WrapMode mWrapModeT = WrapMode.CLAMP_TO_EDGE;
       
       
        public Texture()
        {      
        }
       
        public void recreate()
        {
                if (mResourceID != -1)
                {
                        loadTexture(mResourceID);
                }
        }
       
        public void loadTexture(int resourceID)
        {
                Resources resources = ResourceManager.getResources();
                InputStream is = resources.openRawResource(resourceID);
                Bitmap bitmap = null;
                try
                {
                        bitmap = BitmapFactory.decodeStream(is);
                }
                finally
                {
                        try
                        {
                                is.close();
                                is = null;
                        }
                        catch (IOException e)
                        {                              
                        }
                }
               
                width = bitmap.getWidth();
                height = bitmap.getHeight();
                mResourceID = resourceID;
               
                createTexture();
               
                GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
               
                bitmap.recycle();
        }
       
        public void createTexture()
        {
                GL10 gl = GLUtil.getGL();
               
                int textures[] = new int[1];           
                gl.glGenTextures(1, textures, 0);
                mTextureID = textures[0];
               
                setFiltering(mMinFilter, mMagFilter);
                setWrapMode(mWrapModeS, mWrapModeT);
        }
       
        public void bind()
        {
                GL10 gl = GLUtil.getGL();
                gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);
        }
       
        public void unbind()
        {
                GL10 gl = GLUtil.getGL();
                gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
        }
       
        public final int getHandle()
        {
                return mTextureID;
        }
       
        public void setFiltering(Filter minFilter, Filter magFilter)
        {              
                bind();
               
                GL10 gl = GLUtil.getGL();
                               
                mMinFilter = minFilter;
                switch (mMinFilter)
                {
                case NEAREST:
                        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
                        break;
                case LINEAR:
                        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
                        break;
                }
               
                mMagFilter = magFilter;
                switch (mMagFilter)
                {
                case NEAREST:
                        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
                        break;
                case LINEAR:
                        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
                        break;
                }
        }

        public void setWrapMode(WrapMode wrapModeS, WrapMode wrapModeT)
        {
                bind();
               
                GL10 gl = GLUtil.getGL();
               
                mWrapModeS = wrapModeS;
                switch (mWrapModeS)
                {
                case CLAMP_TO_EDGE:
                        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
                        break;
                case REPEAT:
                        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
                        break;                 
                }
               
                mWrapModeT = wrapModeT;
                switch (mWrapModeT)
                {
                case CLAMP_TO_EDGE:
                        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
                        break;
                case REPEAT:
                        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
                        break;                 
                }
        }
       
}