Trying a quick convert to a gamestate

Can anyone assist me i'm getting an issue at       



  rootNode.lock(display.getRenderer());



I'm attempting a quick conversion from simplegame to a gamstate however their seems to be a slight issue its probably a basic issue but if i comment out the above code i only see red




package com.tps1.lvlLoader;

import java.io.IOException;

import trb.jme.imaging.TextureLoader;
import trb.jme.quake3.Quake3Converter;
import trb.jme.quake3.Quake3Loader;

import com.jme.app.SimpleGame;
import com.jme.input.FirstPersonHandler;
import com.jme.input.InputHandler;
import com.jme.math.Vector3f;
import com.jme.scene.state.CullState;
import com.jmex.game.StandardGame;
import com.jmex.game.state.GameState;
import com.jmex.game.state.GameStateManager;
import com.tps1.GameState.Charactertype;
import com.tps1.GameState.DefineGameState;
import com.tps1.GameState.SkyBoxManager.SkyBoxGameState;

public class levelTester extends DefineGameState {
    Quake3Converter converter;
    Vector3f eyePos = new Vector3f();

   
    public levelTester(){
   
       simpleInitGame();
    }
    @Override
   public void update(float tpf) {
       super.update(tpf);
        Vector3f camLoc = cam.getLocation();
        eyePos.set(camLoc);
        converter.setVisibility(eyePos, true);
    }
    public InputHandler input;
    protected void simpleInitGame() {   
        display.getRenderer().getQueue().setTwoPassTransparency(false);
        cam.setFrame(new Vector3f(-14, 1.5f, -2.5f), new Vector3f(0, 0, 1), new Vector3f(0, 1, 0), new Vector3f(-1, 0, 0));
        cam.update();
       // lightState.setEnabled(false);

        input = new FirstPersonHandler(cam, 8, 1);
       
        CullState cullState = display.getRenderer().createCullState();
        cullState.setCullFace(CullState.Face.Front);
        rootNode.setRenderState(cullState);

        // load quake 3 level
      TextureLoader.getInstance().registerPath("D:/games/quake3/unpacked/");
      TextureLoader.getInstance().registerPath("D:/deveddddlopment/myprojects/projects_java/JMonkeyTests/QuakeViewer/MAPPACK/");
      TextureLoader.getInstance().registerPath("D:\development\myprojects\projects_java\JMonkeyTests\QuakeViewerWiki2\data\qdata");
      
        TextureLoader.getInstance().registerPath("src/com/tps1/data/levels/act1/scene1/");
        Quake3Loader loader = new Quake3Loader();
        try {
            loader.load("src/com/tps1/data/levels/act1/level#1.bsp");

//           loader.load("D:\development\myprojects\projects_java\JMonkeyTests\QuakeViewer\MAPPACK\maps\kitnamek.bsp");
//           loader.load("D:\development\myprojects\projects_java\JMonkeyTests\QuakeViewer\MAPPACK\maps\kitroom.bsp");
//           loader.load("D:\games\quake3\baseq3\maps\q3dm1sample.bsp");
//         loader.load("D:\games\quake3\baseq3\maps\q3dm7sample.bsp");
//         loader.load("D:\games\quake3\unpacked\maps\q3dm11.bsp");

           //loader.load("D:\games\quake3\unpacked\maps\q3dm0.bsp");

        } catch (IOException e) {
            e.printStackTrace();
        }
       
        converter = new Quake3Converter();
        converter.convert(loader, display);
        rootNode.attachChild(converter.getRoot());
        rootNode.lock(display.getRenderer());
    }

    protected void cameraPerspective() {
        cam.setFrustumPerspective(55.0f, (float) display.getWidth()
                / (float) display.getHeight(), .1f, 2000);
        cam.setParallelProjection(false);
        cam.update();
    }
   
   
    public static void main(String[] args){
       StandardGame standardGame = new StandardGame("GameControl", StandardGame.GameType.GRAPHICAL, null);
        standardGame.start();
   /**
       try {
         SkyBoxGameState.Manager().setActive(true);
      } catch (Exception e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      Charactertype Avenger = new Charactertype("ninja");      
        Avenger.setActive(true);
       */
        
        
        try {
           levelTester nex = new levelTester();
           GameStateManager.getInstance().attachChild(nex);
           nex.setActive(true);

          
           } catch (Exception e) {
               e.printStackTrace();
           }
      }

   @Override
   public void cleanup() {
      // TODO Auto-generated method stub
      
   }
}




THE ERROR MESSAGE IS

Mar 6, 2009 9:50:36 PM com.jme.scene.Node attachChild
INFO: Child (root) attached to this node (null: RootNode)
java.lang.NullPointerException
   at org.lwjgl.opengl.GL11.glGenLists(GL11.java:1359)
   at com.jme.renderer.lwjgl.LWJGLRenderer.createDisplayList(LWJGLRenderer.java:1613)
   at com.jme.scene.Geometry.lockMeshes(Geometry.java:790)
   at com.jme.scene.Node.lockMeshes(Node.java:454)
   at com.jme.scene.Node.lockMeshes(Node.java:454)
   at com.jme.scene.Node.lockMeshes(Node.java:454)
   at com.jme.scene.Spatial.lock(Spatial.java:1281)
   at com.tps1.lvlLoader.levelTester.simpleInitGame(levelTester.java:107)
   at com.tps1.lvlLoader.levelTester.<init>(levelTester.java:60)
   at com.tps1.lvlLoader.levelTester.main(levelTester.java:134)


locking needs to be done in the openGL thread…

basixs said:

locking needs to be done in the openGL thread...


hmm i tried adding this and it seemingly worked

    GameTaskQueueManager.getManager().update(new Callable<Object>() {
            public Object call() throws Exception {
                rootNode.lock(display.getRenderer());
                return null;
            }
        });



or should i do below instead?


   Future<Object> future = GameTaskQueueManager.getManager().update(new Callable<Object>() {
            public Object call() throws Exception {
                rootNode.lock(display.getRenderer());
               return null;
            }
        });
        try {
         future.get();
      } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch (ExecutionException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }   
       




it seems to be okay especially after i added

ZBufferState buf = display.getRenderer().createZBufferState();
        buf.setEnabled(true);
        buf.setFunction(ZBufferState.TestFunction.LessThanOrEqualTo);
        this.getRootNode().setRenderState(buf);