Shadow problem

When I first start the game shadows are working, but when I restart the game (hitting a "restart" button in the game, not stopping/starting the application)

it crashes with a nullpointer exception:

Exception in thread "OpenGL" java.lang.NullPointerException

at com.jme.scene.shadow.MeshShadows.createGeometry(MeshShadows.java:129)

at com.jme.renderer.pass.ShadowedRenderPass.generateVolumes(ShadowedRenderPass.java:525)

at com.jme.renderer.pass.ShadowedRenderPass.doRender(ShadowedRenderPass.java:313)

at com.jme.renderer.pass.Pass.renderPass(Pass.java:90)

at com.jme.renderer.pass.BasicPassManager.renderPasses(BasicPassManager.java:89)

at net.ob3d.states.BasicState.render(BasicState.java:324)

at net.ob3d.multiplayer.FightState.render(FightState.java:82)

at net.ob3d.multiplayer.FightStateSinglePlayer.render(FightStateSinglePlayer.java:95)

at com.jmex.game.state.GameStateNode.render(GameStateNode.java:84)

at net.ob3d.OBStandardGame.render(OBStandardGame.java:321)

at net.ob3d.OBStandardGame.run(OBStandardGame.java:194)

at java.lang.Thread.run(Thread.java:619)



Anyone has an idea of what this might be ?

I use gamestates and standardgame:


public abstract class BasicState extends GameState implements INodeReceiver,
      IUniverseFactory, IGraphicsSettings {
   boolean lightShadow1Enabled = true;
   boolean lightShadow2enabled = false;
   boolean lightShadow3enabled = true;
   boolean lightShadow4enabled = true;
   protected Node nonShadow;
   Node shadowNode;
   BasicPassManager passManager = new BasicPassManager();
   private static ShadowedRenderPass shadowPass = new ShadowedRenderPass();
   public void addNode(INode node) {
      GraphicsAttributes g = node.getGraphicsAttributes();
      //nonShadow.attachChild((Spatial) node);
      if(g!=null) {
         
         if(g.castShadows) {
            shadowNode.attachChild((Spatial) node);
            
         }else {
            nonShadow.attachChild((Spatial) node);
            
         }
         return;
      }
      nonShadow.attachChild((Spatial) node);
      
   }

   public Node createNode(String name) {
      Node node= new Node(name);
      ZBufferState buf = DisplaySystem.getDisplaySystem().getRenderer()
      .createZBufferState();
      buf.setEnabled(true);
      buf.setFunction(ZBufferState.CF_LEQUAL);
      node.setRenderState(buf);
      
      return node;
   }

   public void init() {
      nonShadow = createNode("nonShadow");
      shadowNode = createNode("shadow");
           shadowPass.setRenderShadows(true);
           shadowPass.setLightingMethod(ShadowedRenderPass.MODULATIVE);
      shadowPass.add(shadowNode);
      shadowPass.addOccluder(shadowNode);
      
        RenderPass renderPass = new RenderPass();
        renderPass.add(nonShadow);
         passManager.add(renderPass);
        passManager.add(shadowPass);
       }
   
   
   public void update(float tpf) {
      if(!isActive()) return;
      shadowNode.updateGeometricState(tpf, true);
      nonShadow.updateGeometricState(tpf, true);
      shadowNode.updateRenderState();
      nonShadow.updateRenderState();
      passManager.updatePasses(tpf);
   
   }

   
   public void render(float tpf) {
      passManager.renderPasses(DisplaySystem.getDisplaySystem().getRenderer());
      
   }

}



Well, StandardGame and NPE are basically always related to Threading problems… Are you restarting your application in the GL thread?

It is restarted same way as started…I create a gamestate and the gamestate checks if it was "inited". If not, it inits, I suppose that would be in the GL thread ?

If that is not the right way, how do I init correctly in the GL thread ?



What I do now is something like



public void update() {

  if(!inited) {

  inited = true;

  //init stuff

  }

}

What fails is while rendering… so I don't think this is the actual problem…  :expressionless: So I think we need more info about your problem… if you could create a small test-case, I could have a look at it.

One or more meshes are empty while the shadow volumes are being computed…