001/*
002
003*/
004
005package renderer.scene;
006
007/**
008   This {@code Camera} data structure represents a camera
009   located at the origin, looking down the negative z-axis.
010<p>
011   This camera has associated to it a "view volume" that
012   determines what part of space the camera "sees" when
013   we use the camera to take a picture (that is, when we
014   render a {@link Scene}).
015<p>
016   This camera can "take a picture" two ways, using a
017   perspective projection or a parallel (orthographic)
018   projection. Each way of taking a picture has a different
019   shape for its view volume.
020<p>
021   For the perspective projection, the view volume is an
022   infinitely long pyramid that is formed by the pyramid
023   with its apex at the origin and its base in the plane
024   {@code z = -1} with edges {@code x = -1}, {@code x = +1},
025   {@code y = -1}, and {@code y = +1}.
026<p>
027   For the orthographic projection, the view volume is an
028   infinitely long rectangular cylinder parallel to the
029   z-axis and with sides {@code x = -1}, {@code x = +1},
030   {@code y = -1}, and {@code y = +1} (an infinite parallelepiped).
031<p>
032   When the graphics rendering {@link renderer.pipeline.Pipeline} uses
033   this Camera to render a Scene, the renderer "sees" the geometry from
034   the scene that is contained in this camera's view volume. (Notice
035   that this means the orthographic camera will see geometry that
036   is behind the camera. In fact, the perspective camera also sees
037   geometry that is behind the camera.) The renderer's
038   {@link renderer.pipeline.Clip} pipeline stage is responsible for making
039   sure that the scene's geometry that is outside of this camera's
040   view volume is not visible.
041<p>
042   The plane {@code z = -1} is the camera's image plane. The
043   rectangle in the image plane with corners {@code (-1, -1, -1)}
044   and {@code (+1, +1, -1)} is the camera's view rectangle. The
045   view rectangle is like the film in a real camera, it is where
046   the camera's image appears when you take a picture. The contents
047   of the camera's view rectangle is what gets rasterized, by the
048   renderer's {@link renderer.pipeline.Viewport} and
049   {@link renderer.pipeline.Rasterize}
050   pipeline stages, into a {@link renderer.framebuffer.FrameBuffer}.
051*/
052public class Camera
053{
054   // Choose either perspective or parallel projection.
055   public boolean perspective;
056
057   /**
058      The default {@code Camera} uses perspective projection.
059   */
060   public Camera()
061   {
062      this.perspective = true;
063   }
064
065
066   /**
067      For debugging.
068
069      @return {@link String} representation of this {@code Camera} object
070   */
071   @Override
072   public String toString()
073   {
074      String result = "";
075      result += "Camera: \n";
076      result += "perspective = " + perspective + "\n";
077      return result;
078   }
079}