opengl.texture.coordinates: Add 'centroid' as part of the result in simple function to compute texture coordinates from a set of vertices.

This commit is contained in:
Rod Kay
2023-11-14 22:22:43 +11:00
parent ae8cee1cce
commit fa02760f9c
3 changed files with 38 additions and 32 deletions

View File

@@ -145,27 +145,27 @@ is
use openGL.Texture.Coordinates; use openGL.Texture.Coordinates;
the_Vertices : Geometry.lit_textured.Vertex_array (1 .. the_Sites'Length + 1); the_Vertices : Geometry.lit_textured.Vertex_array (1 .. the_Sites'Length + 1);
the_Coords : constant Coordinates_2D := to_Coordinates (the_Sites); Coords_and_Centroid : constant Coords_2D_and_Centroid := to_Coordinates (the_Sites);
Centroid : Vector_2 := (0.0, 0.0); -- Centroid : Vector_2 := (0.0, 0.0);
begin begin
--- Calculate the centroid and min/max of x and y. --- Calculate the centroid and min/max of x and y.
-- --
for i in the_Sites'Range -- for i in the_Sites'Range
loop -- loop
Centroid := Centroid + the_Sites (i); -- Centroid := Centroid + the_Sites (i);
end loop; -- end loop;
--
Centroid := Centroid / Real (the_Sites'Length); -- Centroid := Centroid / Real (the_Sites'Length);
for i in the_Sites'Range for i in the_Sites'Range
loop loop
the_Vertices (Index_t (i)) := (Site => Vector_3 (the_Sites (i) & 0.0), the_Vertices (Index_t (i)) := (Site => Vector_3 (the_Sites (i) & 0.0),
Normal => Normal, Normal => Normal,
Coords => the_Coords (Index_t (i)), Coords => Coords_and_Centroid.Coords (Index_t (i)),
Shine => default_Shine); Shine => default_Shine);
end loop; end loop;
the_Vertices (the_Vertices'Last) := (Site => Vector_3 (Centroid & 0.0), the_Vertices (the_Vertices'Last) := (Site => Vector_3 (Coords_and_Centroid.Centroid & 0.0),
Normal => Normal, Normal => Normal,
Coords => (0.5, 0.5), Coords => (0.5, 0.5),
Shine => default_Shine); Shine => default_Shine);
@@ -173,7 +173,7 @@ is
upper_Face := new_Face (Vertices => the_Vertices); upper_Face := new_Face (Vertices => the_Vertices);
end; end;
return (1 => upper_Face.all'Access); return [1 => upper_Face.all'Access];
end to_GL_Geometries; end to_GL_Geometries;

View File

@@ -1,14 +1,14 @@
package body openGL.Texture.Coordinates package body openGL.Texture.Coordinates
is is
function to_Coordinates (the_Vertices : in Vector_2_array) return Coordinates_2D function to_Coordinates (the_Vertices : in Vector_2_array) return Coords_2D_and_Centroid
is is
Centroid : Vector_2 := (0.0, 0.0); Centroid : Vector_2 := [0.0, 0.0];
Min : Vector_2 := (Real'Last, Real'Last); Min : Vector_2 := [Real'Last, Real'Last];
Max : Vector_2 := (Real'First, Real'First); Max : Vector_2 := [Real'First, Real'First];
Coords : Vector_2; Coords : Vector_2;
Result : Coordinates_2D (1 .. the_Vertices'Length); Result : Coords_2D_and_Centroid (coords_Count => the_Vertices'Length);
begin begin
--- Calculate the centroid and min/max of x and y. --- Calculate the centroid and min/max of x and y.
-- --
@@ -16,19 +16,17 @@ is
loop loop
Centroid := Centroid + the_Vertices (i); Centroid := Centroid + the_Vertices (i);
Min (1) := Real'Min (Min (1), Min (1) := Real'Min (Min (1), the_Vertices (i) (1));
the_Vertices (i) (1)); Min (2) := Real'Min (Min (2), the_Vertices (i) (2));
Min (2) := Real'Min (Min (2),
the_Vertices (i) (2));
Max (1) := Real'Max (Max (1), Max (1) := Real'Max (Max (1), the_Vertices (i) (1));
the_Vertices (i) (1)); Max (2) := Real'Max (Max (2), the_Vertices (i) (2));
Max (2) := Real'Max (Max (2),
the_Vertices (i) (2));
end loop; end loop;
Centroid := Centroid / Real (the_Vertices'Length); Centroid := Centroid / Real (the_Vertices'Length);
declare declare
half_Width : constant Real := (Max (1) - Min (1)) / 2.0; half_Width : constant Real := (Max (1) - Min (1)) / 2.0;
half_Height : constant Real := (Max (2) - Min (2)) / 2.0; half_Height : constant Real := (Max (2) - Min (2)) / 2.0;
@@ -43,17 +41,18 @@ is
Coords (1) := (Coords (1) + 1.0) / 2.0; Coords (1) := (Coords (1) + 1.0) / 2.0;
Coords (2) := (Coords (2) + 1.0) / 2.0; -- The coords are now in range 0.0 .. 1.0. Coords (2) := (Coords (2) + 1.0) / 2.0; -- The coords are now in range 0.0 .. 1.0.
Result (Index_t (i)) := (Coords (1), Coords (2)); Result.Coords (Index_t (i)) := (Coords (1),
Coords (2));
end loop; end loop;
end; end;
Result.Centroid := Centroid;
return Result; return Result;
end to_Coordinates; end to_Coordinates;
overriding overriding
function to_Coordinates (Self : in xz_Generator; the_Vertices : access Sites) return Coordinates_2D function to_Coordinates (Self : in xz_Generator; the_Vertices : access Sites) return Coordinates_2D
is is

View File

@@ -8,7 +8,14 @@ is
--- 2D --- 2D
-- --
function to_Coordinates (the_Vertices : in Vector_2_array) return Coordinates_2D; type Coords_2D_and_Centroid (coords_Count : Index_t) is
record
Coords : Coordinates_2D (1 .. coords_Count);
Centroid : Vector_2;
end record;
function to_Coordinates (the_Vertices : in Vector_2_array) return Coords_2D_and_Centroid;
-- --
-- Maps the vertices to texture coordinates. -- Maps the vertices to texture coordinates.