@Override
 public Runnable getRenderRunnable() {
   return () -> {
     ensureSceneThread();
     if (sceneState.views.isEmpty()) return;
     renderer.submit(() -> sceneState.create(renderer));
   };
 }
 /**
  * Updates the state of this object based on the current state of its nativeWindow.
  *
  * <p>May only be called from the event thread.
  */
 public void update() {
   super.update();
   if (scene != null) {
     // These variables and others from the super class need be kept up to date to
     // minimize rendering.  For now, claim that the embedded scene is always visible
     // and not minimized so that rendering can occur
     isWindowVisible = true;
     isWindowMinimized = false;
   }
 }
 @Override
 public void removeMesh(IMesh mesh) {
   ensureSceneThread();
   sceneState.removeMesh(mesh);
 }
 @Override
 public void removeLight(ILight light) {
   ensureSceneThread();
   sceneState.removeLight(light);
 }
 @Override
 public void addMesh(IMesh mesh) {
   ensureSceneThread();
   sceneState.addMesh(mesh);
 }
 @Override
 public IViewCameraState getViewCameraState(IView view) {
   ensureSceneThread();
   return sceneState.getViewCameraState(view);
 }
 @Override
 public void addLight(ILight light) {
   ensureSceneThread();
   sceneState.addLight(light);
 }
 @Override
 public void lockCamera(IView view, Mat4 viewMatrix, Mat4 projMatrix) {
   ensureSceneThread();
   sceneState.lockCamera(view, viewMatrix, projMatrix);
 }
 @Override
 public void setCamera(IView view, ICamera camera) {
   ensureSceneThread();
   sceneState.setCamera(view, camera);
 }
 @Override
 public ICamera getCamera(IView view) {
   ensureSceneThread();
   return sceneState.getCamera(view);
 }
 @Override
 public void removeView(IView view) {
   ensureSceneThread();
   sceneState.removeView(view);
 }
 @Override
 public void addView(IView view) {
   ensureSceneThread();
   sceneState.addView(view);
 }