OK...now I've completely switched my loading code around to look like the browsers (see attached).
It all compiles and runs, but now I can't get it to load a file at all...I keep getting the
following exception at line 137:
org.ietf.uri.UnsupportedServiceException: file is not supported
at org.ietf.uri.URL.getResource(URL.java:472)
at org.web3d.vrml.sav.InputSource.getCharacterStream(InputSource.java:158)
at org.web3d.parser.GeneralisedReader.parse(GeneralisedReader.java:139)
at org.web3d.vrml.nodes.loader.DefaultWorldLoader.loadNow(DefaultWorldLoader.java:144)
at org.web3d.vrml.nodes.loader.DefaultWorldLoader.loadNow(DefaultWorldLoader.java:95)
at org.mikemccutcheon.sandbox.java3d.cubeworld.X3DUtil.loadX3D(X3DUtil.java:137)
at org.mikemccutcheon.sandbox.java3d.cubeworld.TestWorldBranch.init(TestWorldBranch.java:246
)
at org.mikemccutcheon.sandbox.java3d.cubeworld.Controller.<init>(Controller.java:123)
at org.mikemccutcheon.sandbox.java3d.cubeworld.Controller.main(Controller.java:48)
Note that when I print out the file, it does exist and the inputsource is also there (not null)
What am I doing wrong?
(see attached)
Mike
package org.mikemccutcheon.sandbox.java3d.cubeworld;
import java.io.File;
import javax.media.j3d.SceneGraphObject;
import javax.media.j3d.Canvas3D;
import org.web3d.browser.BrowserCore;
import org.web3d.parser.DefaultVRMLParserFactory;
import org.web3d.vrml.parser.VRMLParserFactory;
import org.web3d.vrml.nodes.FrameStateManager;
import org.web3d.vrml.sav.InputSource;
import org.web3d.vrml.nodes.VRMLNodeType;
import org.web3d.vrml.nodes.loader.SceneBuilder;
import org.web3d.vrml.nodes.loader.WorldLoaderManager;
import org.web3d.vrml.nodes.loader.WorldLoader;
import org.web3d.vrml.nodes.loader.DefaultWorldLoaderManager;
import org.web3d.vrml.nodes.loader.ScriptLoader;
import org.web3d.vrml.nodes.loader.DefaultScriptLoader;
import org.web3d.vrml.nodes.loader.ExternalLoadManager;
import org.web3d.vrml.nodes.loader.MemCacheLoadManager;
import org.web3d.vrml.nodes.VRMLScene;
import org.web3d.vrml.nodes.runtime.GeneralisedFrameStateManager;
import org.web3d.vrml.nodes.runtime.EventModelEvaluator;
import org.web3d.vrml.nodes.runtime.GeneralisedEventModelEvaluator;
import org.web3d.vrml.nodes.runtime.ScriptManager;
import org.web3d.vrml.nodes.runtime.DefaultScriptManager;
import org.web3d.vrml.nodes.runtime.RouteManager;
import org.web3d.vrml.nodes.runtime.DefaultRouteManager;
import org.web3d.vrml.nodes.runtime.ListsRouterFactory;
import org.web3d.vrml.nodes.runtime.AWTListenerEventBuffer;
import org.web3d.vrml.renderer.j3d.J3DSceneBuilderFactory;
import org.web3d.vrml.renderer.j3d.input.J3DSensorManager;
import org.web3d.vrml.renderer.j3d.input.DefaultSensorManager;
import org.web3d.vrml.renderer.j3d.browser.OverlayHandler;
import org.web3d.vrml.renderer.j3d.browser.VRMLUniverse;
import org.web3d.vrml.renderer.j3d.nodes.J3DWorldRootNodeType;
import org.web3d.net.protocol.JavascriptResourceFactory;
import org.web3d.net.resolve.Web3DURNResolver;
import org.web3d.net.content.VRMLContentHandlerFactory;
import org.web3d.net.content.VRMLFileNameMap;
import org.ietf.uri.URI;
import org.ietf.uri.URN;
import org.ietf.uri.URIResourceStreamFactory;
import org.ietf.uri.ContentHandlerFactory;
import org.ietf.uri.FileNameMap;
public class X3DUtil
{
public SceneGraphObject loadX3D(String inFileName, Canvas3D inCanvas3D)
{
// ---------------------
// SETUP SCRIPT MANAGER
// ---------------------
ScriptLoader script_loader = new DefaultScriptLoader();
ScriptManager script_manager = new DefaultScriptManager();
script_manager.setScriptLoader(script_loader);
System.out.println("ScriptLoader: "+script_loader);
System.out.println("ScriptManager: "+script_manager);
// --------------------
// SETUP ROUTE MANAGER
// --------------------
RouteManager route_manager = new DefaultRouteManager();
ListsRouterFactory listsRouterFactory = new ListsRouterFactory();
route_manager.setRouterFactory(listsRouterFactory);
System.out.println("RouteManager: "+route_manager);
System.out.println("ListsRouterFactory: "+listsRouterFactory);
// -------------------------
// SETUP THE SENSOR MANAGER
// -------------------------
AWTListenerEventBuffer i_buf = new AWTListenerEventBuffer();
J3DSensorManager sensor_manager = new DefaultSensorManager();
sensor_manager.setInputBuffer(i_buf);
System.out.println("AWTListenerEventBuffer: "+i_buf);
System.out.println("J3DSensorManager: "+sensor_manager);
// ------------------------
// SETUP THE STATE MANAGER
// ------------------------
FrameStateManager state_manager = new GeneralisedFrameStateManager();
System.out.println("FrameStateManager: "+state_manager);
// -------------------
// SETUP LOAD MANAGER
// -------------------
ExternalLoadManager load_manager = new MemCacheLoadManager();
System.out.println("ExternalLoadManager: "+load_manager);
// ----------------------------
// SETUP EVENT MODEL EVAULATOR
// ----------------------------
EventModelEvaluator event_model = new GeneralisedEventModelEvaluator();
event_model.initialize(script_manager, route_manager,sensor_manager,
state_manager, load_manager);
System.out.println("EventModelEvaluator: "+event_model);
// -----------------------------------
// SETUP PARSER AND BUILDER FACTORIES
// -----------------------------------
J3DSceneBuilderFactory sbf = new J3DSceneBuilderFactory(false, true,true,
true, true, true, true);
VRMLParserFactory vpf = new DefaultVRMLParserFactory();
System.out.println("J3DSceneBuilderFactory: "+sbf);
System.out.println("VRMLParserFactory: "+vpf);
// -------------------
// SETUP WORLD LOADER
// -------------------
WorldLoaderManager worldLoaderManager = new
DefaultWorldLoaderManager(state_manager);
worldLoaderManager.registerBuilderFactory(BrowserCore.JAVA3D_RENDERER, sbf);
worldLoaderManager.registerParserFactory(BrowserCore.JAVA3D_RENDERER, vpf);
System.out.println("WorldLoaderManager: "+worldLoaderManager);
// ----------------------
// SETUP OVERLAY HANDLER
// ----------------------
OverlayHandler overlayHandler = new DefaultOverlayHandler(inCanvas3D);
// -------------------------------------
// SETUP VRML UNIVERSE AND WORLD LOADER
// -------------------------------------
VRMLUniverse universe = new VRMLUniverse(event_model,overlayHandler);
WorldLoader loader = worldLoaderManager.fetchLoader();
// ----------------
// LOAD PROPERTIES
// ----------------
setupProperties(universe, worldLoaderManager);
// --------------------
// LOAD/PARSE X3D FILE
// --------------------
File file = new File(inFileName);
System.out.println("file.exists(): "+file.exists());
InputSource is = new InputSource(file);
System.out.println("is: "+is);
VRMLScene parsed_scene = null;
try
{
parsed_scene = loader.loadNow(universe, is);
}
catch(Exception e)
{
e.printStackTrace();
}
// --------------------------------------
// EXTRACT AND RETURN SCENE GRAPH OBJECT
// --------------------------------------
SceneGraphObject sceneObject = null;
if(parsed_scene!=null)
{
VRMLNodeType baseRootNode = parsed_scene.getRootNode();
J3DWorldRootNodeType rootNode = (J3DWorldRootNodeType)baseRootNode;
sceneObject = rootNode.getSceneGraphObject();
}
return sceneObject;
}
private class DefaultOverlayHandler implements OverlayHandler
{
Canvas3D canvas3D;
public DefaultOverlayHandler(Canvas3D inCanvas3D)
{
canvas3D = inCanvas3D;
}
public Canvas3D getPrimaryCanvas()
{
return canvas3D;
}
}
private void setupProperties(BrowserCore core, WorldLoaderManager loader)
{
System.setProperty("sun.awt.font.advancecache", "off");
System.setProperty("uri.content.handler.pkgs", "vlc.net.content");
System.setProperty("uri.protocol.handler.pkgs", "vlc.net.protocol");
System.setProperty("java.content.handler.pkgs", "vlc.content");
URIResourceStreamFactory res_fac = URI.getURIResourceStreamFactory();
if(!(res_fac instanceof JavascriptResourceFactory))
{
res_fac = new JavascriptResourceFactory(res_fac);
URI.setURIResourceStreamFactory(res_fac);
}
ContentHandlerFactory c_fac = URI.getContentHandlerFactory();
if(!(c_fac instanceof VRMLContentHandlerFactory))
{
c_fac = new VRMLContentHandlerFactory(core, loader, c_fac);
URI.setContentHandlerFactory(c_fac);
}
FileNameMap fn_map = URI.getFileNameMap();
if(!(fn_map instanceof VRMLFileNameMap))
{
fn_map = new VRMLFileNameMap(fn_map);
URI.setFileNameMap(fn_map);
}
Web3DURNResolver resolver = new Web3DURNResolver();
URN.addResolver(resolver);
}
}
/*
import java.io.File;
import java.io.FileReader;
import java.io.FileNotFoundException;
import javax.media.j3d.SceneGraphObject;
import org.web3d.j3d.loaders.Web3DLoader;
import org.web3d.vrml.nodes.VRMLScene;
import org.web3d.vrml.nodes.VRMLNodeType;
import org.web3d.vrml.renderer.j3d.nodes.J3DWorldRootNodeType;
public class X3DUtil
{
public SceneGraphObject loadX3D(String inFileName)
{
File file = new File(inFileName);
FileReader reader = null;
try
{
reader = new FileReader(file);
}
catch(FileNotFoundException fnfe)
{
fnfe.printStackTrace();
System.exit(1);
}
Web3DLoader loader = new Web3DLoader();
loader.load(reader);
VRMLScene scene = loader.getVRMLScene();
VRMLNodeType baseRootNode = scene.getRootNode();
J3DWorldRootNodeType rootNode = (J3DWorldRootNodeType)baseRootNode;
SceneGraphObject sceneObject = rootNode.getSceneGraphObject();
return sceneObject;
}
}
*/
/*
// good code...
//canvas.addMouseListener(i_buf);
//canvas.addMouseMotionListener(i_buf);
//canvas.addKeyListener(i_buf);
//canvas.addKeyListener(this);
// code does not work
//import org.web3d.j3d.loaders.Web3DLoader;
//import org.web3d.vrml.nodes.VRMLScene;
//import org.web3d.vrml.nodes.VRMLNodeType;
//import org.web3d.vrml.renderer.j3d.nodes.J3DWorldRootNodeType;
Web3DLoader loader = new Web3DLoader();
System.out.println("file: "+file);
System.out.println("reader: "+reader);
loader.load(reader);
VRMLScene scene = loader.getVRMLScene();
VRMLNodeType baseRootNode = scene.getRootNode();
J3DWorldRootNodeType rootNode = (J3DWorldRootNodeType)baseRootNode;
SceneGraphObject sceneObject = rootNode.getSceneGraphObject();
return sceneObject;
*/