with
     GL,
     system.storage_Elements;

package openGL.Attribute
--
--  Models an openGL shader attribute.
--
is
   type Item  is tagged private;
   type View  is access all Item'Class;
   type Views is array (Positive range <>) of View;

   type data_Kind is (GL_BYTE,  GL_UNSIGNED_BYTE,
                      GL_SHORT, GL_UNSIGNED_SHORT,
                      GL_INT,   GL_UNSIGNED_INT,
                      GL_FLOAT, GL_FIXED);
   ---------
   --- Forge
   --

   procedure define  (Self : in out Item);
   procedure destroy (Self : in out Item);

   package Forge
   is
      use system.storage_Elements;

      function  to_Attribute (Name        : in String;
                              gl_Location : in gl.GLuint;
                              Size        : in gl.GLint;
                              data_Kind   : in Attribute.data_Kind;
                              Stride      : in Natural;
                              Offset      : in storage_Offset;
                              Normalized  : in Boolean) return Item;

      function new_Attribute (Name        : in String;
                              gl_Location : in gl.GLuint;
                              Size        : in gl.GLint;
                              data_Kind   : in Attribute.data_Kind;
                              Stride      : in Natural;
                              Offset      : in storage_Offset;
                              Normalized  : in Boolean) return View;
   end Forge;


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

   function Name        (Self : in Item'Class) return String;
   function gl_Location (Self : in Item'Class) return gl.GLuint;


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

   procedure enable (Self : in Item);



private

   type String_view is access String;


   type Item is tagged
      record
         Name          : String_view;
         Location      : gl.GLuint;
         Size          : gl.GLint;
         data_Kind     : Attribute.data_Kind;
         vertex_Stride : gl.GLint;
         Offset        : system.storage_Elements.storage_Offset;
         Normalized    : gl.GLboolean;
      end record;

   for data_Kind use (GL_BYTE           => 16#1400#,
                      GL_UNSIGNED_BYTE  => 16#1401#,
                      GL_SHORT          => 16#1402#,
                      GL_UNSIGNED_SHORT => 16#1403#,
                      GL_INT            => 16#1404#,
                      GL_UNSIGNED_INT   => 16#1405#,
                      GL_FLOAT          => 16#1406#,
                      GL_FIXED          => 16#140c#);

end openGL.Attribute;
