Search in sources :

Example 6 with GLImageFormat

use of com.jme3.renderer.opengl.GLImageFormat in project jmonkeyengine by jMonkeyEngine.

the class TextureUtil method uploadTexture.

public static void uploadTexture(Image image, int target, int index, int border, boolean linearizeSrgb) {
    GL gl = GLContext.getCurrentGL();
    Image.Format fmt = image.getFormat();
    GLImageFormat glFmt = getImageFormatWithError(fmt, image.getColorSpace() == ColorSpace.sRGB && linearizeSrgb);
    ByteBuffer data;
    if (index >= 0 && image.getData() != null && image.getData().size() > 0) {
        data = image.getData(index);
    } else {
        data = null;
    }
    int width = image.getWidth();
    int height = image.getHeight();
    int depth = image.getDepth();
    if (data != null) {
        if (abgrToRgbaConversionEnabled) {
            convertABGRtoRGBA(data);
        }
        gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);
    }
    int[] mipSizes = image.getMipMapSizes();
    int pos = 0;
    // TODO: Remove unneccessary allocation
    if (mipSizes == null) {
        if (data != null)
            mipSizes = new int[] { data.capacity() };
        else
            mipSizes = new int[] { width * height * fmt.getBitsPerPixel() / 8 };
    }
    boolean subtex = false;
    int samples = image.getMultiSamples();
    for (int i = 0; i < mipSizes.length; i++) {
        int mipWidth = Math.max(1, width >> i);
        int mipHeight = Math.max(1, height >> i);
        int mipDepth = Math.max(1, depth >> i);
        if (data != null) {
            data.position(pos);
            data.limit(pos + mipSizes[i]);
        }
        if (glFmt.compressed && data != null) {
            if (target == GL2ES2.GL_TEXTURE_3D) {
                gl.getGL2ES2().glCompressedTexImage3D(target, i, glFmt.internalFormat, mipWidth, mipHeight, mipDepth, data.remaining(), border, data);
            } else {
                //all other targets use 2D: array, cubemap, 2d
                gl.glCompressedTexImage2D(target, i, glFmt.internalFormat, mipWidth, mipHeight, data.remaining(), border, data);
            }
        } else {
            if (target == GL2ES2.GL_TEXTURE_3D) {
                gl.getGL2ES2().glTexImage3D(target, i, glFmt.internalFormat, mipWidth, mipHeight, mipDepth, border, glFmt.format, glFmt.dataType, data);
            } else if (target == GL2ES3.GL_TEXTURE_2D_ARRAY) {
                // or upload slice
                if (index == -1) {
                    gl.getGL2ES2().glTexImage3D(target, 0, glFmt.internalFormat, mipWidth, mipHeight, //# of slices
                    image.getData().size(), border, glFmt.format, glFmt.dataType, data);
                } else {
                    gl.getGL2ES2().glTexSubImage3D(target, // level
                    i, // xoffset
                    0, // yoffset
                    0, // zoffset
                    index, // width
                    width, // height
                    height, // depth
                    1, glFmt.format, glFmt.dataType, data);
                }
            } else {
                if (subtex) {
                    if (samples > 1) {
                        throw new IllegalStateException("Cannot update multisample textures");
                    }
                    gl.glTexSubImage2D(target, i, 0, 0, mipWidth, mipHeight, glFmt.format, glFmt.dataType, data);
                } else {
                    if (samples > 1) {
                        if (gl.isGL2GL3()) {
                            gl.getGL3().glTexImage2DMultisample(target, samples, glFmt.internalFormat, mipWidth, mipHeight, true);
                        }
                    } else {
                        gl.glTexImage2D(target, i, glFmt.internalFormat, mipWidth, mipHeight, border, glFmt.format, glFmt.dataType, data);
                    }
                }
            }
        }
        pos += mipSizes[i];
    }
}
Also used : GL(com.jogamp.opengl.GL) Format(com.jme3.texture.Image.Format) Image(com.jme3.texture.Image) ByteBuffer(java.nio.ByteBuffer)

Aggregations

ByteBuffer (java.nio.ByteBuffer)5 Image (com.jme3.texture.Image)4 Format (com.jme3.texture.Image.Format)4 GLImageFormat (com.jme3.renderer.opengl.GLImageFormat)2 GL (com.jogamp.opengl.GL)2 Caps (com.jme3.renderer.Caps)1 DataOutput (java.io.DataOutput)1 DataOutputStream (java.io.DataOutputStream)1 File (java.io.File)1 FileNotFoundException (java.io.FileNotFoundException)1 FileOutputStream (java.io.FileOutputStream)1 IOException (java.io.IOException)1