1. pragma Warnings (Off); 
  2. pragma Style_Checks (Off); 
  3.  
  4. with GLOBE_3D.Textures, 
  5.      GLOBE_3D.Math; 
  6.  
  7. package body GLOBE_3D.Sprite is 
  8.  
  9.    package G3DT renames GLOBE_3D.Textures; 
  10.    package G3DM renames GLOBE_3D.Math; 
  11.  
  12.    function skinned_Geometrys (o  : in Sprite) return GL.skinned_geometry.skinned_Geometrys 
  13.    is 
  14.    begin 
  15.       return o.skinned_Geometrys (1 .. o.skinned_geometry_Count); 
  16.    end; 
  17.  
  18.    procedure add (o  : in out Sprite;   Geometry  : access GL.geometry.Geometry_t'Class; 
  19.                                        Skin      : access GL.skins.Skin'Class) 
  20.    is 
  21.       new_skinned_Geometry  : access GL.skinned_Geometry.Skinned_Geometry_t := new GL.skinned_Geometry.Skinned_Geometry_t; 
  22.    begin 
  23.       o.skinned_geometry_Count                       := o.skinned_geometry_Count + 1; 
  24.       o.skinned_Geometrys (o.skinned_geometry_Count) := (geometry => Geometry.all'Access, 
  25.                                                          skin     => Skin.all'Access, 
  26.                                                          veneer   => Skin.new_Veneer (for_geometry => Geometry.all)); 
  27.    end; 
  28.  
  29.    procedure Pre_calculate (o : in out Sprite) 
  30.    is 
  31.       use GL, GL.Geometry, G3DM; 
  32.    begin 
  33.       --vertex_cache_optimise (o);  -- tbd : doesn't seem to help !! . .. : ( 
  34.                                   -- at least with terrain . .. (terrain dataset may already naturally be in optimal order ?) 
  35.                                   -- so need to test with other dataset 
  36.  
  37.       o.Bounds     := null_Bounds; 
  38.       o.face_Count := 0; 
  39.  
  40.       for Each in 1 .. o.skinned_geometry_Count loop 
  41.          o.Bounds     := max (o.Bounds,  o.skinned_Geometrys (Each).geometry.Bounds); 
  42.          o.face_Count := o.face_Count + o.skinned_Geometrys (Each).geometry.face_Count; 
  43.       end loop; 
  44.  
  45.       -- setup bounding_sphere (for debug) 
  46.       -- 
  47.  --        declare 
  48.  --           use GLU; 
  49.  --        begin 
  50.  --           if o.bounding_sphere_Quadric /= null then 
  51.  --              glu.quadricDrawStyle (o.bounding_sphere_Quadric, glu.glu_LINE); 
  52.  --           end if; 
  53.  --        end; 
  54.  
  55.     -- Ooof. Now we can certify: 
  56.       --o.pre_calculated := True; 
  57.    end Pre_calculate; 
  58.  
  59.    procedure destroy (o  : in out Sprite) 
  60.    is 
  61.    begin 
  62.       null; 
  63.    end; 
  64.  
  65.    function face_Count (o  : in Sprite) return Natural 
  66.    is 
  67.    begin 
  68.       return o.face_Count; 
  69.    end; 
  70.  
  71.    function Bounds (o  : in Sprite) return GL.geometry.Bounds_record 
  72.    is 
  73.    begin 
  74.       return o.Bounds; 
  75.    end; 
  76.  
  77.    procedure Display (o     : in out Sprite; 
  78.                       clip  : in     Clipping_data) 
  79.    is 
  80.    begin 
  81.       null;   -- actual display is done by the renderer (ie glut.Windows), which requests all skinned Geometry's 
  82.               -- and then applies 'gl state' sorting for performance, before drawing. 
  83.    end Display; 
  84.  
  85.    procedure set_Alpha (o     : in out Sprite;   Alpha  : in GL.Double) 
  86.    is 
  87.    begin 
  88.       null;   -- tbd 
  89.    end; 
  90.  
  91.    function  is_Transparent (o     : in Sprite) return Boolean 
  92.    is 
  93.    begin 
  94.       return o.is_Transparent;  -- tbd : ensure this is updated when new primitives (with possible transparent appearance' are added. 
  95.    end; 
  96.  
  97. end GLOBE_3D.Sprite; 
  98.