with
     gel.Sprite,
     openGL.Visual,
     ada.unchecked_Deallocation;


package body gel.Camera
is

   --------
   -- Forge
   --

   procedure free (Self : in out View)
   is
      procedure deallocate is new ada.unchecked_Deallocation (Item'Class, View);
   begin
      Self.destroy;
      deallocate (Self);
   end free;



   --------------
   --  Operations
   --

   procedure render (Self : in out Item;   the_World : in gel.World.view;
                                           To        : in openGL.Surface.view)
   is
      all_Sprites : gel.World.sprite_transform_Pairs renames the_World.sprite_Transforms;

      the_Visuals : openGL.Visual.views (1 .. all_Sprites'Length);
      Count       : Natural := 0;

      the_Sprite  : gel.Sprite.view;
   begin
      for i in all_Sprites'Range
      loop
         the_Sprite := all_Sprites (i).Sprite;

         if         not the_Sprite.is_Destroyed
           and then     the_Sprite.is_Visible
         then
            Count := Count + 1;

            the_Visuals (Count)            := the_Sprite.Visual;
            the_Visuals (Count).Transform_is (all_Sprites (i).Transform);
            the_Visuals (Count).Scale_is     ([1.0, 1.0, 1.0]);

            the_Visuals (Count).program_Parameters_are (the_Sprite.program_Parameters);
         end if;
      end loop;

      Self.render (the_Visuals (1 .. Count));
   end render;


end gel.Camera;
