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

162 lines
4.9 KiB
Ada

package body openGL.Texture.Coordinates
is
overriding
function to_Coordinates (Self : in xz_Generator; the_Vertices : access Sites) return Coordinates_2D
is
the_Coords : Coordinates_2D (1 .. the_Vertices'Length);
begin
for Each in the_Coords'Range
loop
declare
the_Vertex : Site renames the_Vertices (Each);
S, T : Real;
begin
-- Normalise.
--
S := ( the_Vertex (1)
+ Self.Normalise.S.Offset) * Self.Normalise.S.Scale;
T := 1.0 - ( the_Vertex (3)
+ Self.Normalise.T.Offset)
* Self.Normalise.T.Scale;
-- Tile.
--
S := (S + Self.Tile.S.Offset)
* Self.Tile.S.Scale;
T := (T + Self.Tile.T.Offset)
* Self.Tile.T.Scale;
the_Coords (Each).S := S;
the_Coords (Each).T := T;
end;
end loop;
return the_Coords;
end to_Coordinates;
overriding
function to_Coordinates (Self : in xy_Generator; the_Vertices : access Sites) return Coordinates_2D
is
the_Coords : Coordinates_2D (1 .. the_Vertices'Length);
begin
for Each in the_Coords'Range
loop
declare
the_Vertex : Site renames the_Vertices (Index_t (Each));
S, T : Real;
begin
-- Normalise.
--
S := (the_Vertex (1) + Self.Normalise.S.Offset)
* Self.Normalise.S.Scale;
T := 1.0 - ( the_Vertex (2)
+ Self.Normalise.T.Offset)
* Self.Normalise.T.Scale;
-- Tile.
--
S := (S + Self.Tile.S.Offset)
* Self.Tile.S.Scale;
T := (T + Self.Tile.T.Offset)
* Self.Tile.T.Scale;
the_Coords (Each).S := S;
the_Coords (Each).T := T;
end;
end loop;
return the_Coords;
end to_Coordinates;
overriding
function to_Coordinates (Self : in zy_Generator; the_Vertices : access Sites) return Coordinates_2D
is
the_Coords : Coordinates_2D (1 .. the_Vertices'Length);
begin
for Each in the_Coords'Range
loop
declare
the_Vertex : Site renames the_Vertices (Index_t (Each));
S, T : Real;
begin
-- Normalise.
--
S := (the_Vertex (3) + Self.Normalise.S.Offset)
* Self.Normalise.S.Scale;
T := 1.0 - ( the_Vertex (2)
+ Self.Normalise.T.Offset)
* Self.Normalise.T.Scale;
-- Tile.
--
S := (S + Self.Tile.S.Offset)
* Self.Tile.S.Scale;
T := (T + Self.Tile.T.Offset)
* Self.Tile.T.Scale;
the_Coords (Each).S := S;
the_Coords (Each).T := T;
end;
end loop;
return the_Coords;
end to_Coordinates;
-- TODO: - Below does not cater for 'right edge' case where 's' should be
-- 1.0 rather than 0.0
--
-- - Would be possible given a known set of vertices
-- ie - First vertex is North Pole,
-- - Last vertex is South Pole,
-- - Middle vertices are a set of latitude rings.
-- - Each rings first vertex site should map s => 0.0
-- - Each rings last vertex is a duplicate of the first and
-- will be mapped to s => 1.0
--
overriding
function to_Coordinates (Self : in mercator_Generator; the_Vertices : access Sites) return Coordinates_2D
is
pragma Unreferenced (Self);
the_Coords : Coordinates_2D (1 .. the_Vertices'Length);
begin
for Each in the_Coords'Range
loop
declare
use real_Functions;
the_Vertex : Site renames the_Vertices (Index_t (Each));
x : Real renames the_Vertex (1);
y : Real renames the_Vertex (2);
z : Real renames the_Vertex (3);
Degrees_90 : constant := Pi / 2.0;
Degrees_180 : constant := Pi;
Radius : constant Real := SqRt (x * x + y * y + z * z);
Latitude : constant Real := arcSin (y / Radius);
Longitude : Real;
begin
if z = 0.0
and then x = 0.0
then
the_Coords (Each).S := 0.5;
else
Longitude := arcTan (-z, x);
the_Coords (Each).S := (Longitude / Degrees_180 + 1.0) / 2.0;
end if;
the_Coords (Each).T := (Latitude / Degrees_90 + 1.0) / 2.0;
end;
end loop;
return the_Coords;
end to_Coordinates;
end openGL.Texture.Coordinates;