Author Topic: NullPointerException: Attempt to invoke virtual method 'int com.threed.jpct.Text  (Read 1589 times)

Offline rbj

  • byte
  • *
  • Posts: 4
    • View Profile

I am experiencing an exception on a S5 which does not occur on another S5.

There is an older similar thread from 2015 here: Re: Object3D's transparency issue,4232.45.html

This is the problem that occurs in a world.draw(fb) statement:
java.lang.NullPointerException: Attempt to invoke virtual method 'int com.threed.jpct.Texture.getOpenGLID(int)' on a null object reference
        at com.threed.jpct.GLRenderer.setTextures(
        at com.threed.jpct.GLRenderer.drawVertexArray(
        at com.threed.jpct.World.draw(
        at com.threed.jpct.World.draw(
        at android.opengl.GLSurfaceView$GLThread.guardedRun(
        at android.opengl.GLSurfaceView$

If I look at the code in GLRenderer I wonder why there is no check for a null texture:

   private void setTextures(Object3D obj, int number, int modeNumber, FrameBuffer buffer, World world) {
        int texInd = false;
        if (obj.oneTextureSet) {
            number = 0;
        Texture texture = this.texMan.textures[obj.texture[number]];
        if (texture.getOpenGLID(this.myID) == 0 || texture.getMarker(this.myID) == Texture.MARKER_DELETE_AND_UPLOAD) {

Of course the deeper question is why the texture is missing on one device and not on another.
Any tips?

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12273
    • View Profile
There's no check, because an object without a texture shouldn't happen. If you create a new object, the dummy texture will be assigned. If you assign another one, then it will be that one. The only case in which this can happen is when you call flush() on the TextureManager but are still rendering the object that uses them. And in that case, a crash is just fine to me because you are not supposed to do that. Are you by any chance doing something like this?