package openGL.Model.billboard
--
--  Models a rectangle capable of displaying an image.
--
is
   type Item   is abstract new Model.item with private;

   type Plane  is (xy, xz, yz);

   type Size_t is
      record
         Width  : Real;
         Height : Real;
      end record;

   type Coordinates is array (1 .. 4) of Coordinate_2D;


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

   default_Size : constant Size_t;

   procedure define (Self : out Item;   Size : Size_t := default_Size);


   --------------
   --- Attributes
   --

   function Size   (Self : in Item) return Size_t;
   function Width  (Self : in Item) return Real;
   function Height (Self : in Item) return Real;



private

   type Item is abstract new Model.item with
      record
         Plane  : billboard.Plane := xy;
         Size   : Size_t;
      end record;


   subtype site_Id is Index_t range 1 .. 4;
   subtype Sites   is Vector_3_array (site_Id'Range);

   function vertex_Sites (for_Plane     : in Plane;
                          Width, Height : in Real) return Sites;

   Normal       : constant Vector_3 := [0.0,  0.0,  1.0];
   default_Size : constant Size_t   := (Width  => 1.0,
                                        Height => 1.0);

end openGL.Model.billboard;
