with
     openGL,
     Physics,

     float_Math.Geometry.D2,
     float_Math.Geometry.D3,
     float_Math.Algebra.linear.D2,
     float_Math.Algebra.linear.D3;


package GEL
--
--  A game engine library.
--
is
   pragma Pure;

   Error : exception;


   --------
   --- Math
   --
   package Math              renames float_Math;
   package Geometry          renames math.Geometry;
   package Geometry_2d       renames Geometry.D2;
   package Geometry_3d       renames Geometry.D3;
   package Algebra           renames math.Algebra;
   package linear_Algebra    renames Algebra.linear;
   package linear_Algebra_2D renames linear_Algebra.D2;
   package linear_Algebra_3D renames linear_Algebra.D3;



   ---------------
   --- Constraints
   --
   max_Worlds          : constant := 1_000;
   max_Cameras         : constant := 1_000;
   max_graphics_Models : constant := 2**32 - 1;
--     max_physics_Models  : constant := 2**32 - 1;
   max_Sprites         : constant := 2**32 - 1;



   -------
   --- Ids
   --

   type          world_Id is range 0 .. max_Worlds;
   type         camera_Id is range 0 .. max_Cameras;

   subtype graphics_model_Id is openGL.model_Id;
-- type  physics_model_Id is range 0 .. max_physics_Models;
   type         sprite_Id is range 0 .. max_Sprites;

   null_graphics_model_Id : constant graphics_model_Id;
-- null_physics_model_Id  : constant physics.model_Id;
   null_sprite_Id         : constant sprite_Id;

   type graphics_model_Ids is array (Positive range <>) of graphics_model_Id;
   type  physics_model_Ids is array (Positive range <>) of  physics.model_Id;
   type         sprite_Ids is array (Positive range <>) of         sprite_Id;


   ----------
   --- Assets
   --

   type asset_Name is new String (1 .. 128);    -- TODO: Make private.
   --
   --  Name of a file containing textures, images, fonts, sounds, media or other resources.

   null_Asset : constant asset_Name;

   function to_Asset  (Self : in String)     return asset_Name;
   function to_String (Self : in asset_Name) return String;



private

   null_graphics_model_Id : constant graphics_model_Id := 0;
-- null_physics_model_Id  : constant physics.model_Id  := 0;
   null_sprite_Id         : constant sprite_Id         := 0;

   null_Asset : constant asset_Name := (others => ' ');
end GEL;
