@Override
  public void cleanup() {
    localRootNode.removeLight(ai);
    localRootNode.removeLight(dl);

    this.app.getTimer().reset();
    rootNode.detachChild(localRootNode);
    viewPort.removeProcessor(niftyDisplay);
    audio.stop();
    nifty.exit();
    cam.setRotation(Quaternion.IDENTITY);
    cam.setLocation(Vector3f.ZERO);
    cam.setViewPort(0, 1, 0, 1);
    super.cleanup();
  }
  public void postQueue(RenderQueue rq) {
    Camera sceneCam = rm.getCurrentCamera();

    // update refraction cam
    refractionCam.setLocation(sceneCam.getLocation());
    refractionCam.setRotation(sceneCam.getRotation());
    refractionCam.setFrustum(
        sceneCam.getFrustumNear(),
        sceneCam.getFrustumFar(),
        sceneCam.getFrustumLeft(),
        sceneCam.getFrustumRight(),
        sceneCam.getFrustumTop(),
        sceneCam.getFrustumBottom());
    refractionCam.setParallelProjection(sceneCam.isParallelProjection());

    // update reflection cam
    WaterUtils.updateReflectionCam(reflectionCam, plane, sceneCam);

    // Rendering reflection and refraction
    rm.renderViewPort(reflectionView, savedTpf);
    rm.renderViewPort(refractionView, savedTpf);
    rm.getRenderer().setFrameBuffer(vp.getOutputFrameBuffer());
    rm.setCamera(sceneCam, false);
  }