docs: public void Parse(InputStream inputStream, ShaderSettings shaderSettings) {
          try {
              this.shaderSettings = shaderSettings;
  
              // Parse the initial X3D file
              SAXParserFactory factory = SAXParserFactory.newInstance();
              SAXParser saxParser = factory.newSAXParser();
              UserHandler userhandler = new UserHandler();
              saxParser.parse(inputStream, userhandler);
  
              // parse the Inline files
              if (inlineObjects.size() != 0) {
                  for (int i = 0; i < inlineObjects.size(); i++) {
                      InlineObject inlineObject = inlineObjects.get(i);
                      String[] urls = inlineObject.getURL();
                      for (int j = 0; j < urls.length; j++) {
                          GVRAndroidResource gvrAndroidResource = null;
                          GVRResourceVolume gvrResourceVolume = null;
                          try {
                              String filename = urls[j];
                              inlineSubdirectory = "";
                              int lastIndex = urls[j].lastIndexOf('/');
                              if (lastIndex != -1) {
                                  inlineSubdirectory = urls[j].substring(0, urls[j].lastIndexOf('/')+1);
                                  filename = urls[j].substring(urls[j].lastIndexOf('/')+1, urls[j].length());
                              }
  
                              // Get rid of any single or double quotes surrounding the filename.
                              // this happens when the url = '"filename.x3d"' for example
                              if ( (filename.indexOf("\"") == 0) || (filename.indexOf("\'") == 0) ) {
                                  filename = filename.substring(1, filename.length());
                              }
                              if ( (filename.indexOf("\"") == (filename.length()-1)) || (filename.indexOf("\'") == (filename.length()-1)) ) {
                                  filename = filename.substring(0, filename.length()-1);
                              }
  
                              gvrResourceVolume = new GVRResourceVolume(gvrContext, urls[j]);
                              gvrAndroidResource = gvrResourceVolume.openResource( filename );
  
                              if ( filename.toLowerCase().endsWith(".x3d")) {
                                  inputStream = gvrAndroidResource.getStream();
                                  currentSceneObject = inlineObject.getInlineGVRSceneObject();
                                  saxParser.parse(inputStream, userhandler);
                              }
                              else {
                                  GVRExternalScene gvrExternalScene = new GVRExternalScene(gvrContext, urls[j], false);
                                  currentSceneObject = inlineObject.getInlineGVRSceneObject();
                                  if (currentSceneObject == null) root.attachComponent(gvrExternalScene);
                                  else currentSceneObject.attachComponent(gvrExternalScene);
                                  GVRScene gvrScene = gvrContext.getMainScene();
                                  gvrExternalScene.load(gvrScene);
                                  GVRAnimator gvrAnimator = gvrExternalScene.getAnimator();
                              }
                          } catch (FileNotFoundException e) {
                              Log.e(TAG,
                                      "Inline file reading: File Not Found: url " + urls[j] + ", Exception "
                                              + e);
                          } catch (IOException ioException) {
                              Log.e(TAG,
                                      "Inline file reading url " + urls[j]);
                              Log.e(TAG, "IOException: " + ioException.toString());
                          } catch (Exception exception) {
                              Log.e(TAG, "Inline file reading error: Exception "
                                      + exception);
                          }
                      }
                  }
              }
  
              try {
                  animationInteractivityManager.initAnimationsAndInteractivity();
                  // Need to build a JavaScript function that constructs the
                  // X3D data type objects used with a SCRIPT.
                  // Scripts can also have an initialize() method.
                  animationInteractivityManager.InitializeScript();
              }
              catch (Exception exception) {
                  Log.e(TAG, "Error initialing X3D <ROUTE> or <Script> node related to Animation or Interactivity.");
              }
  
          } catch (Exception exception) {
  
              Log.e(TAG, "X3D/XML Parsing Exception = " + exception);
          }
  
      }