AnimEngine
Renderbuffer.hpp
1 #pragma once
2 #ifndef KJY_OBJECT_ORIENTED_OPENGL_RENDERBUFFER_HPP_
3 #define KJY_OBJECT_ORIENTED_OPENGL_RENDERBUFFER_HPP_
4 #include "../OOOGL_Core.hpp"
5 #include "fbo_interface.hpp"
6 
7 namespace OOOGL{
8 
10  GLint width = 0;
11  GLint height = 0;
12  GLenum internal_format = 0;
13  GLint samples = 0;
14  };
15 
17  public:
18  Renderbuffer() : FramebufferAttachable(_destroyer) {
19  glGenRenderbuffers(1, getIdPtr());
20  }
21 
22  void bind() const {glBindRenderbuffer(GL_RENDERBUFFER, getNameDirect());}
23  void unbind() const {glBindRenderbuffer(GL_RENDERBUFFER, 0);}
24 
25  void bufferStorage(GLenum internal_format, GLsizei width, GLsizei height);
26  void bufferStorageMultisample(GLsizei samples, GLenum internal_format, GLsizei width, GLsizei height);
27 
28  virtual AttachmentType getAttachmentType() const override{return(AttachmentType::ATTACHMENT_RENDERBUFFER);}
29 
30  private:
31  static void _destroyer(const GLuint* name){
32  glDeleteRenderbuffers(1, name);
33  }
34 
35  };
36 
37  class ThinRenderbuffer : public Renderbuffer{};
39  public:
41  SpecifiedRenderbuffer(GLsizei width, GLsizei height, GLenum internal_format = GL_RGBA) : Renderbuffer() {
42  bufferStorage(internal_format, width, height);
43  }
44 
45  const RenderbufferParameters& getParameters() const {return(parameters);}
46  GLint getWidth() const {return(parameters.width);}
47  GLint getHeight() const {return(parameters.height);}
48  GLenum getInternalFormat() const {return(parameters.internal_format);}
49  GLenum getNumSamples() const {return(parameters.samples);}
50  void setWidth(GLsizei width){
51  bool needs_update = parameters.width != width;
52  parameters.width = width;
53  if(needs_update) _update_renderbuffer(parameters);
54  }
55  void setHeight(GLsizei height){
56  bool needs_update = parameters.height != height;
57  parameters.height = height;
58  if(needs_update) _update_renderbuffer(parameters);
59  }
60  void setInternalFormat(GLenum internal_format) {
61  bool needs_update = parameters.internal_format != internal_format;
62  parameters.internal_format = internal_format;
63  if(needs_update) _update_renderbuffer(parameters);
64  }
65  void setNumSamples(GLenum samples) {
66  bool needs_update = parameters.samples != samples;
67  parameters.samples = samples;
68  if(needs_update) _update_renderbuffer(parameters);
69  }
70  void setParameters(const RenderbufferParameters& parameters){
71  this->parameters = parameters;
72  _update_renderbuffer(parameters);
73  }
74 
75  protected:
76  RenderbufferParameters parameters;
77  private:
78  inline void _update_renderbuffer(const RenderbufferParameters& params){
79  glBindRenderbuffer(GL_RENDERBUFFER, getNameDirect());
80  glRenderbufferStorageMultisample(GL_RENDERBUFFER, params.samples, params.internal_format, params.width, params.height);
81  glBindRenderbuffer(GL_FRAMEBUFFER, 0);
82  }
83  };
84 }
85 
86 #endif
Definition: Renderbuffer.hpp:9
Definition: Renderbuffer.hpp:38
Definition: Renderbuffer.hpp:16
Definition: fbo_interface.hpp:10
Definition: Core_Utilities.cpp:3
Definition: Renderbuffer.hpp:37