Files
lace/3-mid/opengl/source/lean/buffer/opengl-buffer-general.adb
2025-10-22 14:11:39 +11:00

110 lines
2.8 KiB
Ada

with
openGL.Errors,
openGL.Tasks,
GL.Pointers;
package body openGL.Buffer.general
is
--------------------------
-- 'vertex buffer' Object
--
package body Forge
is
function to_Buffer (From : access constant Element_Array;
Usage : in Buffer.Usage) return Object
is
use GL.Pointers;
begin
Tasks.check;
return new_Buffer : Object
do
new_Buffer.Usage := Usage;
new_Buffer.Length := From'Length;
new_Buffer.verify_Name;
new_Buffer.enable;
glBufferData (to_GL_Enum (new_Buffer.Kind),
From.all'Size / 8,
+From (From'First)'Address,
to_GL_Enum (Usage));
Errors.log;
end return;
end to_Buffer;
function to_Buffer (From : in Element_Array;
Usage : in Buffer.Usage) return Object
is
use GL.Pointers;
begin
Tasks.check;
return new_Buffer : Object
do
new_Buffer.Usage := Usage;
new_Buffer.Length := From'Length;
new_Buffer.verify_Name;
new_Buffer.enable;
glBufferData (to_GL_Enum (new_Buffer.Kind),
From'Size / 8,
+From (From'First)'Address,
to_GL_Enum (Usage));
Errors.log;
end return;
end to_Buffer;
end Forge;
procedure set (Self : in out Object; Position : in Positive := 1;
To : in Element_Array)
is
use GL.Pointers;
new_Vertices : aliased Element_Array := To;
Vertex_Size_in_bits : constant Natural := To (To'First)'Size;
begin
Tasks.check;
if Self.Length = To'Length
then
Self.enable;
glBufferSubData (Target => to_GL_Enum (Self.Kind),
Offset => GLintptr ((Position - 1) * Vertex_Size_in_bits / 8),
Size => new_Vertices'Size / 8,
Data => +new_Vertices (new_Vertices'First)'Address);
Errors.log;
else
Self.destroy;
Self.verify_Name;
Self.Length := To'Length;
Self.enable;
glBufferData (to_GL_Enum (Self.Kind),
To'Size / 8,
+To (To'First)'Address,
to_GL_Enum (Self.Usage));
Errors.log;
end if;
end set;
procedure set (Self : in out Object; Position : in Positive := 1;
To : access constant Element_Array)
is
begin
Self.set (Position, To.all);
end set;
end openGL.Buffer.general;