Files
lace/3-mid/opengl/source/lean/model/opengl-model-grid.adb
2022-07-31 17:34:54 +10:00

173 lines
5.4 KiB
Ada

with
openGL.Palette,
openGL.Primitive.non_indexed;
package body openGL.Model.grid
is
function Line_Count (Extent : in Positive) return Positive
is
begin
if Extent mod 2 /= 0
then
return Extent;
else
return Extent + 1;
end if;
end Line_Count;
---------
--- Forge
--
function to_grid_Model (Color : openGL.Color;
Width : Integer;
Height : Integer) return Item
is
Self : Item;
vertex_Count : constant Positive := ( line_Count (Width)
+ line_Count (Height)) * 2;
half_Width : constant Real := Real (Width) / 2.0;
half_Height : constant Real := Real (Height) / 2.0;
begin
Self.Color := +Color;
Self.Width := Width;
Self.Height := Height;
Self.Bounds := (Ball => <>,
Box => (lower => [-half_Width, -half_Height, -0.01],
upper => [ half_Width, half_Height, 0.01]));
set_Ball_from_Box (Self.Bounds);
Self.Vertices := new Geometry.colored.Vertex_array (1 .. Index_t (vertex_Count));
return Self;
end to_grid_Model;
function new_grid_Model (Color : openGL.Color;
Width : Integer;
Height : Integer) return View
is
begin
return new Item' (to_grid_Model (Color, Width, Height));
end new_grid_Model;
--------------
--- Attributes
--
overriding
function to_GL_Geometries (Self : access Item; Textures : access Texture.name_Map_of_texture'Class;
Fonts : in Font.font_id_Map_of_font) return Geometry.views
is
pragma unreferenced (Textures, Fonts);
use Palette,
Geometry.colored;
the_Primitive : Primitive.non_indexed.view;
begin
if Self.Geometry = null
then
Self.Geometry := Geometry.colored.new_Geometry;
end if;
set_Sites :
declare
row_Count : constant Positive := line_Count (Self.Height);
col_Count : constant Positive := line_Count (Self.Width);
vertex_Count : Index_t := 0;
half_Width : constant Real := Real (Self.Width) / 2.0;
half_Height : constant Real := Real (Self.Height) / 2.0;
x_Adjust,
y_Adjust : Real;
Color : openGL.rgb_Color := Self.Color;
begin
if Self.Width mod 2 = 0
then x_Adjust := 0.0;
else x_Adjust := 0.5;
end if;
if Self.Height mod 2 = 0
then y_Adjust := 0.0;
else y_Adjust := 0.5;
end if;
for Row in 1 .. row_Count
loop
if Row = row_Count / 2 + 1
then
Color := +White;
end if;
vertex_Count := vertex_Count + 1;
Self.Vertices (vertex_Count).Site := [-half_Width,
Real (Row - 1) - half_Height + y_Adjust,
0.16];
Self.Vertices (vertex_Count).Color := (primary => Color,
Alpha => opaque_Value);
vertex_Count := vertex_Count + 1;
Self.Vertices (vertex_Count).Site := [half_Width,
Real (Row - 1) - half_Height + y_Adjust,
0.16];
Self.Vertices (vertex_Count).Color := (primary => Color,
Alpha => opaque_Value);
if Row = row_Count / 2 + 1
then
Color := Self.Color;
end if;
end loop;
for Col in 1 .. col_Count
loop
if Col = col_Count / 2 + 1
then
Color := +White;
end if;
vertex_Count := vertex_Count + 1;
Self.Vertices (vertex_Count).Site := [Real (Col - 1) - half_Width + x_Adjust,
-half_Height,
0.16];
Self.Vertices (vertex_Count).Color := (primary => Color,
Alpha => opaque_Value);
vertex_Count := vertex_Count + 1;
Self.Vertices (vertex_Count).Site := [Real (Col - 1) - half_Width + x_Adjust,
half_Height,
0.16];
Self.Vertices (vertex_Count).Color := (primary => Color,
Alpha => opaque_Value);
if Col = col_Count / 2 + 1
then
Color := Self.Color;
end if;
end loop;
end set_Sites;
Self.Geometry.is_Transparent (False);
Vertices_are (Self.Geometry.all,
Self.Vertices.all);
the_Primitive := Primitive.non_indexed.new_Primitive (openGL.primitive.Lines,
Self.Vertices'Length);
Self.Geometry.add (Primitive.view (the_Primitive));
return [1 => Self.Geometry.all'Access];
end to_GL_Geometries;
end openGL.Model.grid;