159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.renderer.android; 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport android.graphics.Bitmap; 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport android.opengl.GLES20; 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport android.opengl.GLUtils; 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.AndroidImageInfo; 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.FastMath; 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Image; 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Image.Format; 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ByteBuffer; 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport javax.microedition.khronos.opengles.GL10; 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class TextureUtil { 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static int convertTextureFormat(Format fmt){ 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (fmt){ 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Alpha16: 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Alpha8: 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL10.GL_ALPHA; 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Luminance8Alpha8: 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Luminance16Alpha16: 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL10.GL_LUMINANCE_ALPHA; 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Luminance8: 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Luminance16: 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL10.GL_LUMINANCE; 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGB10: 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGB16: 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case BGR8: 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGB8: 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGB565: 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL10.GL_RGB; 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGB5A1: 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGBA16: 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGBA8: 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GL10.GL_RGBA; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Depth: 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GLES20.GL_DEPTH_COMPONENT; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Depth16: 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return GLES20.GL_DEPTH_COMPONENT16; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Depth24: 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Depth32: 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Depth32F: 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unsupported depth format: " + fmt); 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case DXT1A: 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unsupported format: " + fmt); 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unrecognized format: " + fmt); 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static void buildMipmap(Bitmap bitmap) { 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int level = 0; 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int height = bitmap.getHeight(); 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int width = bitmap.getWidth(); 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta while (height >= 1 || width >= 1) { 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //First of all, generate the texture from our bitmap and set it to the according level 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level, bitmap, 0); 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (height == 1 || width == 1) { 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //Increase the mipmap level 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta level++; 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta height /= 2; 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta width /= 2; 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height, true); 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 73a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta //bitmap.recycle(); 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bitmap = bitmap2; 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>uploadTextureBitmap</code> uploads a native android bitmap 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param target 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param bitmap 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param generateMips 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param powerOf2 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static void uploadTextureBitmap(final int target, Bitmap bitmap, boolean generateMips, boolean powerOf2) 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta { 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!powerOf2) 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta { 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int width = bitmap.getWidth(); 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int height = bitmap.getHeight(); 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!FastMath.isPowerOfTwo(width) || !FastMath.isPowerOfTwo(height)) 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta { 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // scale to power of two 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta width = FastMath.nearestPowerOfTwo(width); 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta height = FastMath.nearestPowerOfTwo(height); 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height, true); 97a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta //bitmap.recycle(); 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bitmap = bitmap2; 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (generateMips) 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta { 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta buildMipmap(bitmap); 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta else 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta { 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta GLUtils.texImage2D(target, 0, bitmap, 0); 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //bitmap.recycle(); 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static void uploadTexture( 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Image img, 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int target, 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int index, 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int border, 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean tdc, 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean generateMips, 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean powerOf2){ 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (img.getEfficentData() instanceof AndroidImageInfo){ 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // If image was loaded from asset manager, use fast path 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta AndroidImageInfo imageInfo = (AndroidImageInfo) img.getEfficentData(); 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta uploadTextureBitmap(target, imageInfo.getBitmap(), generateMips, powerOf2); 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Otherwise upload image directly. 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Prefer to only use power of 2 textures here to avoid errors. 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Image.Format fmt = img.getFormat(); 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ByteBuffer data; 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (index >= 0 || img.getData() != null && img.getData().size() > 0){ 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta data = img.getData(index); 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta data = null; 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int width = img.getWidth(); 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int height = img.getHeight(); 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int depth = img.getDepth(); 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean compress = false; 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int internalFormat = -1; 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int format = -1; 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int dataType = -1; 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (fmt){ 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Alpha16: 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Alpha8: 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_ALPHA; 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Luminance8: 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_LUMINANCE; 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Luminance8Alpha8: 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_LUMINANCE_ALPHA; 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Luminance16Alpha16: 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_LUMINANCE_ALPHA; 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Luminance16: 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_LUMINANCE; 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGB565: 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_RGB; 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta internalFormat = GLES20.GL_RGB565; 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_SHORT_5_6_5; 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case ARGB4444: 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_RGBA; 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_SHORT_4_4_4_4; 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGB10: 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_RGB; 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGB16: 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_RGB; 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGB5A1: 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_RGBA; 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta internalFormat = GLES20.GL_RGB5_A1; 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_SHORT_5_5_5_1; 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGB8: 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_RGB; 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case BGR8: 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_RGB; 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGBA16: 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_RGBA; 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta internalFormat = GLES20.GL_RGBA4; 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case RGBA8: 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_RGBA; 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case DXT1A: 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_COMPRESSED_TEXTURE_FORMATS; 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Depth: 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_DEPTH_COMPONENT; 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Depth16: 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format = GLES20.GL_DEPTH_COMPONENT; 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta internalFormat = GLES20.GL_DEPTH_COMPONENT16; 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType = GLES20.GL_UNSIGNED_BYTE; 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Depth24: 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Depth32: 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Depth32F: 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unsupported depth format: " + fmt); 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Unrecognized format: " + fmt); 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (internalFormat == -1) 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta { 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta internalFormat = format; 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (data != null) 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1); 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int[] mipSizes = img.getMipMapSizes(); 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int pos = 0; 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (mipSizes == null){ 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (data != null) 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mipSizes = new int[]{ data.capacity() }; 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta else 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mipSizes = new int[]{ width * height * fmt.getBitsPerPixel() / 8 }; 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // XXX: might want to change that when support 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // of more than paletted compressions is added.. 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (compress){ 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta data.clear(); 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta GLES20.glCompressedTexImage2D(GLES20.GL_TEXTURE_2D, 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1 - mipSizes.length, 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format, 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta width, 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta height, 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 0, 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta data.capacity(), 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta data); 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < mipSizes.length; i++){ 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int mipWidth = Math.max(1, width >> i); 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int mipHeight = Math.max(1, height >> i); 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int mipDepth = Math.max(1, depth >> i); 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (data != null){ 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta data.position(pos); 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta data.limit(pos + mipSizes[i]); 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (compress && data != null){ 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta GLES20.glCompressedTexImage2D(GLES20.GL_TEXTURE_2D, 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta i, 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format, 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mipWidth, 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mipHeight, 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 0, 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta data.remaining(), 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta data); 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta i, 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta internalFormat, 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mipWidth, 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mipHeight, 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 0, 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta format, 28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dataType, 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta data); 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pos += mipSizes[i]; 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 298