@@ -12,70 +12,110 @@ class RenderBuffer
12
12
m_Width (width),
13
13
m_Height (height)
14
14
{
15
- glGenFramebuffers (1 , &m_FrameBufferID);
16
- glBindFramebuffer (GL_FRAMEBUFFER, m_FrameBufferID);
17
- glGenRenderbuffers (1 , &m_DepthBufferID);
18
- glBindRenderbuffer (GL_RENDERBUFFER, m_DepthBufferID);
19
- glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Width, m_Height);
20
- glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_DepthBufferID);
21
- glGenTextures (1 , &m_Texture.id_ref ());
22
- glBindTexture (GL_TEXTURE_2D, m_Texture.id_ref ());
23
- glTexImage2D (GL_TEXTURE_2D, 0 , GL_RGBA8, m_Width, m_Height, 0 , GL_RGBA, GL_UNSIGNED_BYTE, NULL );
24
- // glTexParameters, glGenerateMipmap
25
- glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_Texture.id_ref (), 0 );
26
-
27
- status ();
15
+ GLuint id;
16
+
17
+ // SDL_Surface* tmp = SDL_CreateRGBSurface(0, width, height,
18
+ // 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
19
+
20
+ // GL_TASK_START()
21
+ // glGenTextures(1, &id);
22
+ // glBindTexture(GL_TEXTURE_2D, id);
23
+ // int mode = GL_RGBA;
24
+
25
+ // glTexImage2D(GL_TEXTURE_2D, 0, mode, width, height,
26
+ // 0, mode, GL_UNSIGNED_BYTE, 0);
27
+
28
+ // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
29
+ // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
30
+ // GL_TASK_END()
31
+
32
+ // SDL_FreeSurface(tmp);
28
33
29
- // throwing here will cause memory leak
30
- // if(m_Status!=GL_FRAMEBUFFER_COMPLETE)
31
- // K_ERROR(GENERAL, "Could not create framebuffer");
32
- // assert(m_Status == GL_FRAMEBUFFER_COMPLETE);
34
+ m_pTexture = std::make_shared<Texture>();
35
+
36
+ GL_TASK_START ()
37
+ glGenFramebuffers (1 , &m_FrameBufferID);
38
+ glBindFramebuffer (GL_FRAMEBUFFER, m_FrameBufferID);
39
+ glGenRenderbuffers (1 , &m_DepthBufferID);
40
+ glBindRenderbuffer (GL_RENDERBUFFER, m_DepthBufferID);
41
+ glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Width, m_Height);
42
+ glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_DepthBufferID);
43
+
44
+ glGenTextures (1 , &m_pTexture->id_ref ());
45
+ glBindTexture (GL_TEXTURE_2D, m_pTexture->id_ref ());
46
+ glTexImage2D (GL_TEXTURE_2D, 0 , GL_RGBA8, m_Width, m_Height, 0 , GL_RGBA, GL_UNSIGNED_BYTE, 0 );
47
+
48
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
49
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
50
+
51
+ // glTexParameters, glGenerateMipmap
52
+ glFramebufferTexture (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_pTexture->id_ref (), 0 );
53
+
54
+ GLenum bufs[1 ] = {GL_COLOR_ATTACHMENT0};
55
+ glDrawBuffers (1 , bufs);
56
+
57
+ unbind ();
58
+ GL_TASK_END ()
59
+
60
+ if (not status ()){
61
+ destroy ();
62
+ K_ERROR (GENERAL, " framebuffer" );
63
+ }
33
64
}
34
65
virtual ~RenderBuffer () {
35
- if (m_FrameBufferID)
36
- glDeleteFramebuffers (1 , &m_FrameBufferID);
37
- if (m_DepthBufferID)
38
- glDeleteRenderbuffers (1 , &m_DepthBufferID);
66
+ destroy ();
67
+ }
68
+ void destroy () {
69
+ GL_TASK_START ()
70
+ if (m_FrameBufferID)
71
+ glDeleteFramebuffers (1 , &m_FrameBufferID);
72
+ if (m_DepthBufferID)
73
+ glDeleteRenderbuffers (1 , &m_DepthBufferID);
74
+ GL_TASK_END ()
39
75
}
40
76
void bind () {
41
- glBindFramebuffer (GL_FRAMEBUFFER, m_FrameBufferID);
77
+ GL_TASK_START ()
78
+ glBindFramebuffer (GL_FRAMEBUFFER, m_FrameBufferID);
79
+ GL_TASK_END ()
42
80
}
43
81
static void unbind () {
44
- glBindFramebuffer (GL_FRAMEBUFFER, 0 );
82
+ GL_TASK_START ()
83
+ glBindFramebuffer (GL_FRAMEBUFFER, 0 );
84
+ GL_TASK_END ()
45
85
}
46
- void pushViewport (int x, int y, int w, int h){
86
+ void push (int x= 0 , int y= 0 , int w= 0 , int h= 0 ){
47
87
bind ();
48
- glPushAttrib (GL_VIEWPORT_BIT);
49
- glViewport (x,y,w,h);
50
- }
51
- void pushViewport (int x = 0 , int y = 0 ) {
52
- pushViewport (x,y,m_Width,m_Height);
88
+ GL_TASK_START ()
89
+ glPushAttrib (GL_VIEWPORT_BIT);
90
+ glViewport (x, y, w==0 ?m_Width:w, h==0 ?m_Height:h);
91
+ GL_TASK_END ()
53
92
}
54
- static void popViewport () {
55
- glPopAttrib ();
93
+ static void pop () {
94
+ GL_TASK_START ()
95
+ glPopAttrib ();
96
+ GL_TASK_END ()
56
97
unbind ();
57
98
}
58
99
59
- bool status () {
60
- m_Status = glCheckFramebufferStatus (GL_FRAMEBUFFER);
61
- return m_Status == GL_FRAMEBUFFER_COMPLETE;
100
+ bool status () const {
101
+ unsigned status = 0 ;
102
+ GL_TASK_START ()
103
+ status = glCheckFramebufferStatus (GL_FRAMEBUFFER);
104
+ GL_TASK_END ()
105
+ return status == GL_FRAMEBUFFER_COMPLETE;
62
106
}
63
- bool good () {
64
- return m_FrameBufferID &&
65
- m_DepthBufferID &&
66
- m_Texture.good () &&
67
- m_Status==GL_FRAMEBUFFER_COMPLETE;
107
+ bool good () const {
108
+ return m_pTexture->good ();
68
109
}
69
- bool bad () { return !good (); }
70
- Texture* texture () { return &m_Texture ; }
110
+ bool bad () const { return !good (); }
111
+ std::shared_ptr< Texture> texture () { return m_pTexture ; }
71
112
72
113
private:
73
114
unsigned int m_FrameBufferID = 0 ;
74
115
unsigned int m_DepthBufferID = 0 ;
75
- Texture m_Texture;
76
- unsigned int m_Status = 0 ;
77
116
unsigned int m_Width = 0 ;
78
117
unsigned int m_Height = 0 ;
118
+ std::shared_ptr<Texture> m_pTexture;
79
119
};
80
120
81
121
#endif
0 commit comments