with
     openGL.Renderer.lean,
     openGL.Camera,
     openGL.Visual,
     openGL.Palette,
     openGL.Model.box.colored,
     openGL.Demo;

procedure launch_Camera_Demo
--
--  Exercise the camera.
--
is
   use openGL,
       openGL.Model,
       openGL.Model.box,
       openGL.Palette,
       openGL.Math,
       openGL.linear_Algebra_3d;

begin
   Demo.print_Usage;
   Demo.define ("openGL 'Camera' Demo");

   --  Setup the camera.
   --
   Demo.Camera.Position_is ([5.0, 0.0, 10.0],
                            y_Rotation_from (to_Radians (0.0)));

   declare
      --  The Model.
      --
      the_box_Model : constant openGL.Model.Box.colored.view
        := openGL.Model.Box.colored.new_Box (size  => [0.5, 0.5, 0.5],
                                             faces => [front => (colors => [others => (Blue,         Opaque)]),
                                                       rear  => (colors => [others => (light_Blue,   Opaque)]),
                                                       upper => (colors => [others => (Green,        Opaque)]),
                                                       lower => (colors => [others => (forest_Green, Opaque)]),
                                                       left  => (colors => [others => (Dark_Red,     Opaque)]),
                                                       right => (colors => [others => (Red,          Opaque)])]);

      the_Sprite : constant openGL.Visual.view
        := openGL.Visual.Forge.new_Visual (the_box_Model.all'Access);

   begin
      the_Sprite.Site_is ([10.0, 0.0, 0.0]);

      --  Main loop.
      --
      while not Demo.Done
      loop
         Demo.Dolly.evolve;
         Demo.Done := Demo.Dolly.quit_Requested;

         --  Render all sprites.
         --
         Demo.Camera.render (Visuals => [1 => the_Sprite]);

         while not Demo.Camera.cull_Completed
         loop
            delay Duration'Small;
         end loop;

         Demo.Renderer.render;
      end loop;
   end;

   Demo.destroy;
end launch_Camera_Demo;
