Headless CloneImportExport Bug?

I've been using CloneImportExport for awhile on my client without issues, but I've recently tried this with a Headless StandardGame and it throws an error when cloning a node using loadClone():



java.lang.InstantiationException: com.jme.system.dummy.DummyDisplaySystem$1$3

at java.lang.Class.newInstance0(Unknown Source)

at java.lang.Class.newInstance(Unknown Source)

at com.jme.util.CloneImportExport.create(CloneImportExport.java:348)

at com.jme.util.CloneImportExport.access$6(CloneImportExport.java:342)

at com.jme.util.CloneImportExport$CloneCapsule.readSavableArray(CloneImportExport.java:1377)

at com.jme.scene.SceneElement.read(SceneElement.java:853)

at com.jme.scene.Spatial.read(Spatial.java:824)

at com.jme.scene.Node.read(Node.java:648)

at com.jme.util.CloneImportExport.load(CloneImportExport.java:246)

at com.jme.util.CloneImportExport.loadClone(CloneImportExport.java:304)

at imp.common.model.Model.cloneModelNode(Model.java:62)

at imp.common.space.astronomical.Planet.load(Planet.java:95)

at imp.common.space.Sector.load(Sector.java:107)

at imp.server.play.state.PlaySpaceState.<init>(PlaySpaceState.java:61)

at imp.server.play.ImperiousPlay.<init>(ImperiousPlay.java:82)

at imp.server.play.ImperiousPlay.main(ImperiousPlay.java:96)

Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: java.lang.InstantiationException: com.jme.system.dummy.DummyDisplaySystem$1$3

at com.jme.util.CloneImportExport.load(CloneImportExport.java:251)

at com.jme.util.CloneImportExport.loadClone(CloneImportExport.java:304)

at imp.common.model.Model.cloneModelNode(Model.java:62)

at imp.common.space.astronomical.Planet.load(Planet.java:95)

at imp.common.space.Sector.load(Sector.java:107)

at imp.server.play.state.PlaySpaceState.<init>(PlaySpaceState.java:61)

at imp.server.play.ImperiousPlay.<init>(ImperiousPlay.java:82)

at imp.server.play.ImperiousPlay.main(ImperiousPlay.java:96)



If I switch it to graphical, it runs just fine.

hmm, I wonder if it comes from trying to clone the render states…



Can you wipe up a small test case showing the problem?

Testcase to reproduce the problem


public class TestHeadlessGame {
   public static void main(String[] args) throws Exception {
      StandardGame game = new StandardGame("Test Headless", StandardGame.GameType.HEADLESS);
      game.start();
      // try to create a MaterialState
      MaterialState ms = DisplaySystem.getDisplaySystem().getRenderer().createMaterialState();
      CloneImportExport cloner = new CloneImportExport();
      cloner.saveClone(ms);
      Savable clone = cloner.loadClone();
   }
}



it seems it can't find a empty constructor in DummyRenderer

i don't get why the above test case throws a InstantiationException.



Caused by: java.lang.InstantiationException: com.jme.system.dummy.DummyRenderer$5

at java.lang.Class.newInstance0(Class.java:340)

at java.lang.Class.newInstance(Class.java:308)

at com.jme.util.CloneImportExport.load(CloneImportExport.java:242)



DummyRenderer has a emtpy constructor.  :?

i think this clone stuff cannot work with DummyRenderer yet.



DummyRenderer .createMaterialState() returns a anonymous MaterialState.



MaterialState ms = DisplaySystem.getDisplaySystem().getRenderer().createMaterialState();
System.out.println(ms.getClass().getName());



"com.jme.system.dummy.DummyRenderer$5"

This is not something which could be instantiated again, thus the InstantiationException.

I guess you would have to implement actual DummyMaterialState classes to be able to save and load them again.
Or implement some kind of workaround so that CloneImportExport ignores such dummy instances.