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

186 lines
3.8 KiB
Ada

with
GL.lean,
GL.Binding,
openGL.Tasks,
openGL.Errors;
package body openGL.Frame_Buffer
is
package body Forge
is
function to_Frame_Buffer (Width,
Height : in Positive) return Item
is
use openGL.Texture,
GL,
GL.Binding,
GL.lean;
Self : Item;
begin
Tasks.check;
Self.Texture := openGL.Texture.Forge.to_Texture (Dimensions' (Width, Height));
glGenFramebuffers (1, Self.Name'Access);
Errors.log;
-- Attach each texture to the first color buffer of an frame buffer object and clear it.
--
glBindFramebuffer (GL_FRAMEBUFFER, Self.Name);
Errors.log;
glFramebufferTexture2D (GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D,
Self.Texture.Name,
0);
Errors.log;
glClear (GL_COLOR_BUFFER_BIT);
Errors.log;
glBindFramebuffer (GL_FRAMEBUFFER, 0);
Errors.log;
return Self;
end to_frame_Buffer;
function to_Frame_Buffer return Item
is
use openGL.Texture,
GL,
GL.lean;
Self : Item;
begin
Tasks.check;
Self.Texture := openGL.Texture.null_Object;
glGenFramebuffers (1, Self.Name'Access);
Errors.log;
return Self;
end to_frame_Buffer;
end Forge;
procedure destruct (Self : in out Item)
is
use GL.lean;
begin
Tasks.check;
glDeleteFramebuffers (1, Self.Name'Access);
Errors.log;
Self.Texture.destroy;
end destruct;
--------------
--- Attributes
--
function Name (Self : in Item) return Buffer_Name
is
begin
return Self.Name;
end Name;
function Texture (Self : in Item) return openGL.Texture.Object
is
begin
return Self.Texture;
end Texture;
procedure Texture_is (Self : in out Item; Now : in openGL.Texture.Object)
is
use GL,
GL.Binding,
GL.lean;
begin
Tasks.check;
Self.Texture := Now;
-- Attach each texture to the first color buffer of an FBO and clear it.
--
glBindFramebuffer (GL_FRAMEBUFFER, Self.Name);
openGL.Errors.log;
glFramebufferTexture2D (GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D,
Self.Texture.Name,
0);
openGL.Errors.log;
glClear (GL_COLOR_BUFFER_BIT);
openGL.Errors.log;
end Texture_is;
function is_Complete (Self : in Item) return Boolean
is
use GL,
GL.lean;
use type GL.GLenum;
check_is_OK : constant Boolean := Tasks.check with Unreferenced;
Result : constant Boolean := glCheckFramebufferStatus (GL_FRAMEBUFFER) = GL_FRAMEBUFFER_COMPLETE;
begin
openGL.Errors.log;
return Result;
end is_complete;
--------------
--- Operations
--
procedure enable (Self : in Item)
is
use GL,
GL.lean;
check_is_OK : constant Boolean := Tasks.check with Unreferenced;
begin
glBindFramebuffer (GL_FRAMEBUFFER, Self.Name);
Errors.log;
if not Self.is_Complete
then
raise openGL.Error with "GL_FRAMEBUFFER" & Self.Name'Image & " is not 'complete'";
end if;
end enable;
procedure disable (Self : in Item)
is
use GL,
GL.lean;
check_is_OK : constant Boolean := Tasks.check with Unreferenced;
begin
glBindFramebuffer (GL_FRAMEBUFFER, 0);
Errors.log;
end disable;
end openGL.Frame_Buffer;