173 lines
5.4 KiB
Ada
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;
|