186 lines
3.8 KiB
Ada
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;
|