quit = true;
runExit();
  public void run(String[] args) {    canvas = GLDrawableFactory.getFactory().createGLCanvas(new GLCapabilities());    canvas.addGLEventListener(new Listener());    canvas.setNoAutoRedrawMode(true);    Frame frame = new Frame("ARB_shadow Shadows");    frame.setLayout(new BorderLayout());    canvas.setSize(512, 512);    frame.add(canvas, BorderLayout.CENTER);    frame.pack();    frame.show();    canvas.requestFocus();    frame.addWindowListener(new WindowAdapter() {        public void windowClosing(WindowEvent e) {          quit = true;        }      });    try {      while (!quit) {        if (viewer != null) {          viewer.update();          // Grab these values once per render to avoid multithreading          // issues with their values being changed by manipulation from          // the AWT thread during the render          CameraParameters params = viewer.getCameraParameters();          cameraPerspective.set(params.getProjectionMatrix());          cameraInverseTransform.set(params.getModelviewMatrix());          cameraTransform.set(cameraInverseTransform);          cameraTransform.invertRigid();          spotlightTransform.set(spotlight.getTransform());          spotlightInverseTransform.set(spotlightTransform);          spotlightInverseTransform.invertRigid();          objectTransform.set(object.getTransform());        }        if (displayMode == RENDER_SCENE_FROM_CAMERA_VIEW_SHADOWED || !fullyInitialized) {          if (pbuffer != null) {            pbuffer.display();          }        }        canvas.display();      }    } finally {      System.exit(0);    }  }