public void preIntroSetup() {
    try {

      int bgWidth = env.bgImg.getWidth(env);
      int bgHeight = env.bgImg.getHeight(env);
      int[] bgPixels = new int[bgWidth * bgHeight];
      for (int i = 0; i < bgPixels.length; i++) if (bgPixels[i] != 0) System.out.print(bgPixels[i]);
      overlay = new PImage(bgWidth, bgHeight);
      overlay.format = ARGB;
      overlay.pixels = bgPixels;
      runNum = 0;
      controls.setEnabled(false);

      /** * get into looping */
      afterFirstStreaming = true;
      /** overview shut */
      draw();
      /*theCamera.moveToNow(new FVector(0.0f, 0.0f, 1000));
      theCamera.lookAtNow(new FVector(0.0f, 1.0f, 0));
      */
      draw();
      ortho(-1500, 800, -800, 800, 1000, 2000);
      loadPixels();
      noStroke();
      getOverviewShut();
      afterOverviewShot = true;
      draw();
      loop();

      /** give the environment the hint to swop the surfaces */
      env.addThem();
      /** * intro */
      theCamera.moveToNow(new FVector(-200.0f, 950.0f, 1000));
      theCamera.lookAtNow(new FVector(-200.51917f, 851.8057f, 0));
      theCamera.lookAtInter(
          new FVector(1341.8213f, 757.865f, 0), new Integer(4000), new Integer(3));
      Object[] actionObjects = {new FVector(0, 0, -88), new Integer(2000), new Integer(0)};
      theCamera.queueAction("lookAtInter", 4000, actionObjects);
      theCamera.moveToNow(new FVector(-500.51917f, 951.8057f, 200));
      theCamera.moveToInter(
          new FVector(1341.8213f, 857.865f, 200), new Integer(4000), new Integer(3));
      Object[] actionObjects2 = {
        new FVector(0, 800, Camera.maxCameraHeight), new Integer(2000), new Integer(1)
      };
      theCamera.queueAction("moveToInter", 0, actionObjects2);
      Object[] actionObjects3 = {Boolean.valueOf(true)};
      theCamera.queueAction("setControlsEnabled", 3500, actionObjects3);
    } catch (Exception e) {
      e.printStackTrace();
      env.setErrorDisplay(
          "Das Applet konnte nicht gestartet werden. Eventuell ist dies ein Speicherproblem. Bitte stoppen sie alle anderen Java-Anwendungen. GGf. muss der Browser neu gestartet werden um den Cache zu leeren.");
    }
  }
  public void draw() {
    if (!afterFirstStreaming) return;
    runNum++;

    if (afterOverviewShot) returnChanges = theCamera.apply();

    // test world Objects with screen frustum
    if (returnChanges) {
      for (int i = 0; i < objectManager.worldObjects.size(); i++) {
        if (((ObjectOfInterest) (objectManager.worldObjects.elementAt(i))).selectable)
          ((Building) (objectManager.worldObjects.elementAt(i))).testIfOnScreen();
      }
    }
    // process moving objects
    movingObjectsManager.process();
    // draw time and weather conditions
    naturalFactor.putIntoEffect();
    // korrdinatensystem
    groundPlane.draw(touring);
    clearZBuffer();
    // houses.draw();
    boxes.draw();

    pushMatrix();
    scale(buildingUniScale);
    // draw models
    for (int i = 0; i < objectManager.worldObjects.size(); i++) {
      if (((ObjectOfInterest) (objectManager.worldObjects.elementAt(i))).selectable) {
        ((Building) (objectManager.worldObjects.elementAt(i)))
            .draw(this, false /* Don't draw in gray old:touring*/);
      } else ((ObjectOfInterest) (objectManager.worldObjects.elementAt(i))).draw(this, touring);
    }
    popMatrix();

    /**
     * ****************** AFTER INTRO
     * **************************************************************************************
     */
    if (afterIntro) { //
      if (theCamera.getPos() != null) Overview.setLookPoint(theCamera.getPos()); //
      locator.draw(); //
      //
      // draw moving objects                                                                //
      movingObjectsManager.draw(); //
      //
      if (drawDebugSpheres) { //
        sphereDetail(20); //
        for (int i = 0; i < objectManager.worldObjects.size(); i++) { //
          if (((ObjectOfInterest) (objectManager.worldObjects.elementAt(i)))
              . //
              selectable) //
          ((Building) (objectManager.worldObjects.elementAt(i))).debugDraw(this); //
        } //
      } //
      //
      fill(255, 255, 255, 255); //
      noStroke(); //
      //
      // sphere list drawing for testing                                                     //
      for (int i = 0; i < spheres.size(); i++) { //
        FVector pos = ((FVector) (spheres.elementAt(i))).cloneMe(); //
        fill(255, 100, 100, 255); //
        pushMatrix(); //
        translate(pos.getX(), pos.getY(), pos.getZ()); //
        sphere(10 + 5 * i); //
        popMatrix(); //
      } //
      //
    } //
    /**
     * ************************************************************************************* END
     * AFTER INTRO **************************
     */
    naturalFactor.applySurroundings();

    if (selectedBuilding != null) {
      pushMatrix();
      scale(buildingUniScale);
      selectedBuilding.draw(this, false);
      popMatrix();
    }

    // clearZBuffer();
    hint(DISABLE_DEPTH_TEST);

    /*
     * if (overviewImage != null) { for (int y = 0, y2 = 0; y <
     * (overviewImage.height * width); y += width, y2 +=
     * overviewImage.width) { for (int x = width - overviewImage.width,
     * x2 = 0; x < width; x++, x2++) { //System.out.println("" + (x + y) + " " +
     * (x2+y2)); pixels[y+x] = 0xff000000 + color( (red(pixels[y+x]) +
     * red (overviewImage.pixels[y2+x2]))/2, (green(pixels[y+x]) + green
     * (overviewImage.pixels[y2+x2]))/2, (blue(pixels[y+x]) +
     * blue(overviewImage.pixels[y2+x2]))/2); } } }
     */

    // 2D interface (buttons and sliders so far)
    camera(); // reset camera
    // lights();

    fill(0, 20, 150, 20);
    stroke(255, 0, 0);
    noFill();

    // render SlideCases
    renderSlideCases(mouseX, mouseY);

    if (touring) {
      if (preparingForTouring) {
        detailPreparingStep();
      } else {
        paintTouringRope();
        drawDetailBraces();
      }
    }

    if (overlay != null) {
      image(overlay, 0, 250);
    }

    theCamera.drawFramerate();

    // clean up and similar
    // *****************************************************
    controls.reset();
    env.repaintEnv();

    // wait delay to allow processing of other system tasks
    try {
      delay(30);
    } catch (java.lang.IllegalMonitorStateException e) {
      //        	  e.printStackTrace();
    }
    noHint(DISABLE_DEPTH_TEST);
  }