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:
@@ -144,28 +144,28 @@ is
|
|||||||
declare
|
declare
|
||||||
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;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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,44 +16,43 @@ 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;
|
||||||
begin
|
begin
|
||||||
for i in the_Vertices'Range
|
for i in the_Vertices'Range
|
||||||
loop
|
loop
|
||||||
Coords := the_Vertices (i) - Centroid; -- The centroid is now the origin.
|
Coords := the_Vertices (i) - Centroid; -- The centroid is now the origin.
|
||||||
|
|
||||||
Coords (1) := Coords (1) / half_Width;
|
Coords (1) := Coords (1) / half_Width;
|
||||||
Coords (2) := Coords (2) / half_Height; -- The coords are now in range -1.0 .. 1.0.
|
Coords (2) := Coords (2) / half_Height; -- The coords are now in range -1.0 .. 1.0.
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user