Add initial prototype.
This commit is contained in:
172
3-mid/opengl/source/lean/model/opengl-model-grid.adb
Normal file
172
3-mid/opengl/source/lean/model/opengl-model-grid.adb
Normal file
@@ -0,0 +1,172 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user