with openGL.Primitive.indexed, openGL.Geometry.textured, openGL.io, ada.unchecked_Deallocation; package body openGL.Model.billboard.textured is --------- --- Forge -- package body Forge is function new_Billboard (Size : in Size_t := default_Size; Plane : in billboard.Plane; Texture : in asset_Name; Lucid : in Boolean := False) return View is Self : constant View := new Item (Lucid); begin Self.Plane := Plane; Self.Texture_Name := Texture; Self.define (Size); return Self; end new_Billboard; end Forge; -------------- --- Attributes -- overriding function to_GL_Geometries (Self : access Item; Textures : access openGL.Texture.name_Map_of_texture'Class; Fonts : in Font.font_id_Map_of_font) return Geometry.views is pragma unreferenced (Textures, Fonts); use Geometry, Geometry.textured, openGL.Texture; the_Indices : aliased constant Indices := (1, 2, 3, 4); the_Sites : constant billboard.Sites := vertex_Sites (Self.Plane, Self.Width, Self.Height); function new_Face (Vertices : in Geometry.textured.Vertex_array) return Geometry.textured.view is use Primitive; the_Geometry : constant Geometry.textured.view := Geometry.textured.new_Geometry; the_Primitive : constant Primitive.view := Primitive.indexed.new_Primitive (triangle_Fan, the_Indices).all'Access; begin the_Geometry.Vertices_are (Vertices); the_Geometry.add (the_Primitive); the_Geometry.is_Transparent; return the_Geometry; end new_Face; the_Face : Geometry.textured.view; begin declare the_Vertices : constant Geometry.textured.Vertex_array := (1 => (site => the_Sites (1), coords => Self.texture_Coords (1)), 2 => (site => the_Sites (2), coords => Self.texture_Coords (2)), 3 => (site => the_Sites (3), coords => Self.texture_Coords (3)), 4 => (site => the_Sites (4), coords => Self.texture_Coords (4))); begin the_Face := new_Face (Vertices => the_Vertices); if Self.texture_Name /= null_Asset then Self.Texture := IO.to_Texture (Self.texture_Name); end if; if Self.Lucid then if Self.lucid_Image /= null then if Self.Texture /= null_Object then set_Image (Self.Texture, Self.lucid_Image.all); else Self.Texture := openGL.Texture.Forge.to_Texture (Self.lucid_Image.all); end if; end if; else if Self.Image /= null then if Self.Texture /= null_Object then Self.Texture.set_Image (Self.Image.all); else Self.Texture := openGL.Texture.Forge.to_Texture (Self.Image.all); end if; end if; end if; if Self.Texture /= null_Object then the_Face.Texture_is (Self.Texture); end if; end; return (1 => the_Face.all'Access); end to_GL_Geometries; procedure Texture_is (Self : in out Item; Now : in openGL.Texture.Object) is begin Self.Texture := Now; end Texture_is; function Texture (Self : in Item) return openGL.Texture.Object is begin return Self.Texture; end Texture; procedure Texture_Coords_are (Self : in out Item; Now : in Coordinates) is begin Self.texture_Coords := Now; Self.needs_Rebuild := True; end Texture_Coords_are; procedure Size_is (Self : in out Item; Now : in Size_t) is begin Self.Size := Now; Self.needs_Rebuild := True; end Size_is; procedure Image_is (Self : in out Item; Now : in Image) is procedure deallocate is new ada.unchecked_Deallocation (Image, Image_view); begin if Self.Image = null then Self.Image := new Image' (Now); elsif Self.Image'Length (1) = Now'Length (1) and Self.Image'Length (2) = Now'Length (2) then Self.Image.all := Now; else deallocate (Self.Image); Self.Image := new Image' (Now); end if; Self.needs_Rebuild := True; end Image_is; procedure Image_is (Self : in out Item; Now : in lucid_Image) is procedure deallocate is new ada.unchecked_Deallocation (lucid_Image, lucid_Image_view); begin if Self.lucid_Image = null then Self.lucid_Image := new lucid_Image' (Now); elsif Self.lucid_Image'Length (1) = Now'Length (1) and Self.lucid_Image'Length (2) = Now'Length (2) then Self.lucid_Image.all := Now; else deallocate (Self.lucid_Image); Self.lucid_Image := new lucid_Image' (Now); end if; Self.needs_Rebuild := True; end Image_is; end openGL.Model.billboard.textured;