Does TextureIO.newTextureData work with InputStream textures?

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Does TextureIO.newTextureData work with InputStream textures?

elect
Hi,

I am trying to replace the way to load textures resources from "url-file" to "inputstream" since I want it working even outside the IDE, with the dist/ jar..

But I get a null point exception and I am wondering if I am doing it properly or not

Here I get the inputStream

InputStream inputStream = NvImage.class.getResourceAsStream(filePath);

and then I try to retrieve the textureData

TextureData textureData = TextureIO.newTextureData(gl4.getGLProfile(), inputStream, false, TextureIO.DDS);

But I get this exception

Mai 04, 2015 10:56:46 AM nvGlSamples.bindlessApp.BindlessApp initBindlessTextures
SCHWERWIEGEND: null
java.io.EOFException
        at java.io.DataInputStream.readShort(DataInputStream.java:315)
        at com.jogamp.opengl.util.texture.spi.SGIImage.isSGIImage(SGIImage.java:206)
        at com.jogamp.opengl.util.texture.TextureIO$SGITextureProvider.newTextureData(TextureIO.java:1055)
        at com.jogamp.opengl.util.texture.TextureIO.newTextureDataImpl(TextureIO.java:834)
        at com.jogamp.opengl.util.texture.TextureIO.newTextureData(TextureIO.java:247)
        at nvGlSamples.util.NvImage.uploadTextureFromDDSFile(NvImage.java:40)
        at nvGlSamples.bindlessApp.BindlessApp.initBindlessTextures(BindlessApp.java:379)
        at nvGlSamples.bindlessApp.BindlessApp.initRendering(BindlessApp.java:195)
        at nvGlSamples.util.NvSampleApp.init(NvSampleApp.java:75)
        at jogamp.opengl.GLDrawableHelper.init(GLDrawableHelper.java:641)
        at jogamp.opengl.GLDrawableHelper.init(GLDrawableHelper.java:663)
        at jogamp.opengl.GLAutoDrawableBase$1.run(GLAutoDrawableBase.java:430)
        at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1275)
        at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:1131)
        at com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:680)
        at jogamp.opengl.GLAutoDrawableBase.defaultWindowResizedOp(GLAutoDrawableBase.java:259)
        at com.jogamp.newt.opengl.GLWindow.access$200(GLWindow.java:119)
        at com.jogamp.newt.opengl.GLWindow$2.windowResized(GLWindow.java:141)
        at jogamp.newt.WindowImpl.consumeWindowEvent(WindowImpl.java:3682)
        at jogamp.newt.WindowImpl.sendWindowEvent(WindowImpl.java:3616)
        at jogamp.newt.WindowImpl.setVisibleActionImpl(WindowImpl.java:1003)
        at jogamp.newt.WindowImpl$VisibleAction.run(WindowImpl.java:1015)
        at com.jogamp.common.util.RunnableTask.run(RunnableTask.java:150)
        at jogamp.newt.DefaultEDTUtil$NEDT.run(DefaultEDTUtil.java:372)

Looking at the place where it fails, it is in the TextureIO.SGITextureProvide:

    //----------------------------------------------------------------------
    // SGI RGB image provider
    static class SGITextureProvider extends StreamBasedTextureProvider {
        @Override
        public TextureData newTextureData(final GLProfile glp, final InputStream stream,
                                          int internalFormat,
                                          int pixelFormat,
                                          final boolean mipmap,
                                          final String fileSuffix) throws IOException {
            if (SGI.equals(fileSuffix) ||
                SGI_RGB.equals(fileSuffix) ||
                SGIImage.isSGIImage(stream)) {
                final SGIImage image = SGIImage.read(stream);
                if (pixelFormat == 0) {
                    pixelFormat = image.getFormat();
                }
                if (internalFormat == 0) {
                    internalFormat = image.getFormat();
                }
                return new TextureData(glp, internalFormat,
                                       image.getWidth(),
                                       image.getHeight(),
                                       0,
                                       pixelFormat,
                                       GL.GL_UNSIGNED_BYTE,
                                       mipmap,
                                       false,
                                       false,
                                       ByteBuffer.wrap(image.getData()),
                                       null);
            }

            return null;
        }
    }

at the .isSGIImage:

    /** Determines from the magic number whether the given InputStream
        points to an SGI RGB image. The given InputStream must return
        true from markSupported() and support a minimum of two bytes
        of read-ahead. */
    public static boolean isSGIImage(InputStream in) throws IOException {
        if (!(in instanceof BufferedInputStream)) {
            in = new BufferedInputStream(in);
        }
        if (!in.markSupported()) {
            throw new IOException("Can not test non-destructively whether given InputStream is an SGI RGB image");
        }
        final DataInputStream dIn = new DataInputStream(in);
        dIn.mark(4);
        final short magic = dIn.readShort();
        dIn.reset();
        return (magic == MAGIC);
    }

at the .dIn.readShort()

Do you think it is a bug or I did some stupid mistake?
Reply | Threaded
Open this post in threaded view
|

Re: Does TextureIO.newTextureData work with InputStream textures?

jmaasing
For me at least the usual (99.99%) cases where I get EOFs like that is because the resource wasn't found on the classpath. Remember it's a classpath and not a file-path, for example "foo/baz.resource" is not a relative filepath to the current directory.
Reply | Threaded
Open this post in threaded view
|

Re: Does TextureIO.newTextureData work with InputStream textures?

elect
jmaasing wrote
Remember it's a classpath and not a file-path, for example "foo/baz.resource" is not a relative filepath to the current directory.
What do you mean?

I am passing the String "filePath = (java.lang.String) "/nvGlSamples/bindlessApp/assets/textures/NV0.dds""

and it looks correct to me..
Reply | Threaded
Open this post in threaded view
|

Re: Does TextureIO.newTextureData work with InputStream textures?

gouessej
Administrator
You should use Class.getResource() or Class.getResourceAsStream() in order to determine whether you provide the right path to retrieve your file. It will return null if no resource is found.
Julien Gouesse | Personal blog | Website