/** main renderer */
  public void run() {

    // MEASURE ELAPSED TIME AND FRAMERATE
    elapsed += getCurrentTime() - currentTime;
    currentTime = getCurrentTime();

    if (isDamage) {

      frameRate = .9 * frameRate + .1 / elapsed;
      elapsed = 0;

      // LET THE APPLICATION PROGRAMMER MOVE THINGS INTO PLACE

      identity(); // APPLIC. MATRIX STARTS UNTRANSFORMED
      // isDamage = true;

      renderer.rotateView(theta, phi);
      theta = phi = 0;

      ianimate(currentTime - startTime);
      // APPLICATION ANIMATES THINGS

      // SHADE AND SCAN CONVERT GEOMETRY INTO FRAME BUFFER
      renderer.refresh();
      renderer.render();

      // KEEP REFINING LEVEL OF DETAIL UNTIL PERFECT (WHEN LOD=1)

      if (renderer.lod > 1) {
        isDamage = true;
        renderer.lod--;
      }
    }
  }
 /** Forces a refresh of the renderer. Sets isDamage true. */
 public void damage() {
   renderer.refresh();
   isDamage = true;
 }