ObjectivelyMVC 0.1.0
Object oriented MVC framework for OpenGL, SDL2 and GNU C
Public Member Functions | Data Fields | Protected Attributes
Renderer Struct Reference

The Renderer is responsible for rasterizing the View hierarchy of a WindowController. More...

#include <Renderer.h>

Inheritance diagram for Renderer:

Public Member Functions

Class * _Renderer (void)
 The Renderer archetype. More...
 
void beginFrame (Renderer *self)
 Sets up OpenGL state. More...
 
GLuint createTexture (const Renderer *self, const SDL_Surface *surface)
 Generates and binds to an OpenGL texture object, uploading the given surface. More...
 
void drawLine (const Renderer *self, const SDL_Point *points)
 Draws a line segment between two points using GL_LINE_STRIP. More...
 
void drawLines (const Renderer *self, const SDL_Point *points, size_t count)
 Draws line segments between adjacent points using GL_LINE_STRIP. More...
 
void drawRect (const Renderer *self, const SDL_Rect *rect)
 Draws a rectangle using GL_LINE_LOOP. More...
 
void drawRectFilled (const Renderer *self, const SDL_Rect *rect)
 Fills a rectangle using glRecti. More...
 
void drawTexture (const Renderer *self, GLuint texture, const SDL_Rect *dest)
 Draws a textured GL_QUAD in the given rectangle. More...
 
void drawView (Renderer *self, View *view)
 Draws the given View, setting the clipping frame and invoking View::render. More...
 
void endFrame (const Renderer *self)
 Resets OpenGL state. Does not swap buffers. More...
 
void endFrame (Renderer *self)
 
Rendererinit (Renderer *self)
 Initializes this Renderer. More...
 
void renderDeviceDidReset (Renderer *self)
 This method is invoked when the render device has reset. More...
 
void renderDeviceWillReset (Renderer *self)
 This method is invoked when the render device will become reset. More...
 
void setClippingFrame (Renderer *self, const SDL_Rect *clippingFrame)
 Sets the clipping frame for draw operations. More...
 
void setDrawColor (Renderer *self, const SDL_Color *color)
 Sets the primary color for drawing operations. More...
 

Data Fields

Object object
 The superclass. More...
 

Protected Attributes

RendererInterface * interface
 The interface. More...
 

Detailed Description

The Renderer is responsible for rasterizing the View hierarchy of a WindowController.

This class provides an OpenGL 1.x implementation of the RendererInterface. Applications may extend this class and provide an implementation that meets their own OpenGL version requirements.

Definition at line 50 of file Renderer.h.

Member Function Documentation

◆ _Renderer()

Class * _Renderer ( void  )

The Renderer archetype.

Returns
The Renderer Class.

Definition at line 312 of file Renderer.c.

312 {
313 static Class *clazz;
314 static Once once;
315
316 do_once(&once, {
317 clazz = _initialize(&(const ClassDef) {
318 .name = "Renderer",
319 .superclass = _Object(),
320 .instanceSize = sizeof(Renderer),
321 .interfaceOffset = offsetof(Renderer, interface),
322 .interfaceSize = sizeof(RendererInterface),
324 });
325 });
326
327 return clazz;
328}
static void initialize(Class *clazz)
Definition: Renderer.c:290
The Renderer is responsible for rasterizing the View hierarchy of a WindowController.
Definition: Renderer.h:50
RendererInterface * interface
The interface.
Definition: Renderer.h:61

◆ beginFrame()

void beginFrame ( Renderer self)

Sets up OpenGL state.

Parameters
selfThe Renderer.
Remarks
This method is called by the WindowController to begin rendering. Override this method for custom OpenGL state setup, if desired.

Definition at line 39 of file Renderer.c.

39 {
40
41 glEnable(GL_BLEND);
42 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
43
44 glEnable(GL_SCISSOR_TEST);
45
46 glEnableClientState(GL_VERTEX_ARRAY);
47 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
48
49 $(self, setDrawColor, &Colors.White);
50}
W3C Color constants.
Definition: Colors.h:37
SDL_Color White
Definition: Colors.h:185
void setDrawColor(Renderer *self, const SDL_Color *color)
Sets the primary color for drawing operations.
Definition: Renderer.c:281

◆ createTexture()

GLuint createTexture ( const Renderer self,
const SDL_Surface *  surface 
)

Generates and binds to an OpenGL texture object, uploading the given surface.

Parameters
selfThe Renderer.
surfaceThe surface.
Returns
The OpenGL texture name, or 0 on error.

Definition at line 56 of file Renderer.c.

56 {
57
58 assert(surface);
59
60 GLenum format;
61 switch (surface->format->BytesPerPixel) {
62 case 1:
63 format = GL_LUMINANCE;
64 break;
65 case 3:
66 format = GL_RGB;
67 break;
68 case 4:
69 format = GL_RGBA;
70 break;
71 default:
72 MVC_LogError("Invalid surface format: %s\n", SDL_GetPixelFormatName(surface->format->format));
73 return 0;
74 }
75
76 GLuint texture;
77 glGenTextures(1, &texture);
78
79 glBindTexture(GL_TEXTURE_2D, texture);
80
81 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
82 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
83 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
84
85 glTexImage2D(GL_TEXTURE_2D, 0, format, surface->w, surface->h, 0, format, GL_UNSIGNED_BYTE, surface->pixels);
86
87 return texture;
88}
#define MVC_LogError(fmt,...)
Definition: Log.h:55

◆ drawLine()

void drawLine ( const Renderer self,
const SDL_Point *  points 
)

Draws a line segment between two points using GL_LINE_STRIP.

Parameters
selfThe Renderer.
pointsThe points.

Definition at line 94 of file Renderer.c.

94 {
95
96 assert(points);
97
98 $(self, drawLines, points, 2);
99}
void drawLines(const Renderer *self, const SDL_Point *points, size_t count)
Draws line segments between adjacent points using GL_LINE_STRIP.
Definition: Renderer.c:105

◆ drawLines()

void drawLines ( const Renderer self,
const SDL_Point *  points,
size_t  count 
)

Draws line segments between adjacent points using GL_LINE_STRIP.

Parameters
selfThe Renderer.
pointsThe points.
countThe length of points.

Definition at line 105 of file Renderer.c.

105 {
106
107 assert(points);
108
109 glVertexPointer(2, GL_INT, 0, points);
110
111 glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) count);
112}

◆ drawRect()

void drawRect ( const Renderer self,
const SDL_Rect *  rect 
)

Draws a rectangle using GL_LINE_LOOP.

Parameters
selfThe Renderer.
rectThe rectangle.

Definition at line 118 of file Renderer.c.

118 {
119
120 assert(rect);
121
122 GLint verts[8];
123
124 verts[0] = rect->x;
125 verts[1] = rect->y;
126
127 verts[2] = rect->x + rect->w;
128 verts[3] = rect->y;
129
130 verts[4] = rect->x + rect->w;
131 verts[5] = rect->y + rect->h;
132
133 verts[6] = rect->x;
134 verts[7] = rect->y + rect->h;
135
136 glVertexPointer(2, GL_INT, 0, verts);
137 glDrawArrays(GL_LINE_LOOP, 0, 4);
138}

◆ drawRectFilled()

void drawRectFilled ( const Renderer self,
const SDL_Rect *  rect 
)

Fills a rectangle using glRecti.

Parameters
selfThe Renderer.
rectThe rectangle.

Definition at line 144 of file Renderer.c.

144 {
145
146 assert(rect);
147
148 glRecti(rect->x - 1, rect->y - 1, rect->x + rect->w + 1, rect->y + rect->h + 1);
149}

◆ drawTexture()

void drawTexture ( const Renderer self,
GLuint  texture,
const SDL_Rect *  dest 
)

Draws a textured GL_QUAD in the given rectangle.

Parameters
selfThe Renderer.
textureThe texture.
destThe destination in screen coordinates.

Definition at line 155 of file Renderer.c.

155 {
156
157 assert(rect);
158
159 const GLfloat texcoords[] = {
160 0.0, 0.0,
161 1.0, 0.0,
162 1.0, 1.0,
163 0.0, 1.0
164 };
165
166 GLint verts[8];
167
168 verts[0] = rect->x;
169 verts[1] = rect->y;
170
171 verts[2] = rect->x + rect->w;
172 verts[3] = rect->y;
173
174 verts[4] = rect->x + rect->w;
175 verts[5] = rect->y + rect->h;
176
177 verts[6] = rect->x;
178 verts[7] = rect->y + rect->h;
179
180 glEnable(GL_TEXTURE_2D);
181 glBindTexture(GL_TEXTURE_2D, texture);
182
183 glVertexPointer(2, GL_INT, 0, verts);
184 glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
185
186 glDrawArrays(GL_QUADS, 0, 4);
187
188 glDisable(GL_TEXTURE_2D);
189}

◆ drawView()

void drawView ( Renderer self,
View view 
)

Draws the given View, setting the clipping frame and invoking View::render.

Parameters
selfThe Renderer.
viewThe View.

Definition at line 195 of file Renderer.c.

195 {
196
197 assert(view);
198
199 const SDL_Rect clippingFrame = $(view, clippingFrame);
200 if (clippingFrame.w && clippingFrame.h) {
201
203
204 $(view, render, self);
205 }
206}
static void render(View *self, Renderer *renderer)
Definition: Control.c:131
static SDL_Rect clippingFrame(const View *self)
Definition: View.c:429
void setClippingFrame(Renderer *self, const SDL_Rect *clippingFrame)
Sets the clipping frame for draw operations.
Definition: Renderer.c:260

◆ endFrame() [1/2]

void endFrame ( const Renderer self)

Resets OpenGL state. Does not swap buffers.

Parameters
selfThe Renderer.
Remarks
This method is called by the WindowController to end rendering. Override this method for custom OpenGL state teardown, if desired.

◆ endFrame() [2/2]

void endFrame ( Renderer self)

Definition at line 212 of file Renderer.c.

212 {
213
214 $(self, setDrawColor, &Colors.White);
215
216 glDisableClientState(GL_VERTEX_ARRAY);
217 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
218
219 $(self, setClippingFrame, NULL);
220
221 glDisable(GL_SCISSOR_TEST);
222
223 glBlendFunc(GL_ONE, GL_ZERO);
224 glDisable(GL_BLEND);
225
226 const GLenum err = glGetError();
227 if (err) {
228 MVC_LogError("GL error: %d\n", err);
229 }
230}

◆ init()

Renderer * init ( Renderer self)

Initializes this Renderer.

Parameters
selfThe Renderer.
Returns
The initialized Renderer, or NULL on error.

Definition at line 236 of file Renderer.c.

236 {
237 return (Renderer *) super(Object, self, init);
238}
Renderer * init(Renderer *self)
Initializes this Renderer.
Definition: Renderer.c:236

◆ renderDeviceDidReset()

void renderDeviceDidReset ( Renderer self)

This method is invoked when the render device has reset.

Parameters
selfThe Renderer.
Remarks
Subclasses may override this method to allocate any OpenGL objects they require.

Definition at line 244 of file Renderer.c.

244 {
245
246}

◆ renderDeviceWillReset()

void renderDeviceWillReset ( Renderer self)

This method is invoked when the render device will become reset.

Parameters
selfThe Renderer.
Remarks
Subclasses should override this method to free any OpenGL objects they own.

Definition at line 252 of file Renderer.c.

252 {
253
254}

◆ setClippingFrame()

void setClippingFrame ( Renderer self,
const SDL_Rect *  clippingFrame 
)

Sets the clipping frame for draw operations.

Primitives which fall outside of the clipping frame will not be visible.

Parameters
selfThe Renderer.
clippingFrameThe clipping frame, or NULL to disable clipping.

Definition at line 260 of file Renderer.c.

260 {
261
262 SDL_Window *window = SDL_GL_GetCurrentWindow();
263
264 SDL_Rect rect;
265 if (clippingFrame) {
266 rect = *clippingFrame;
267 } else {
268 rect = MakeRect(0, 0, 0, 0);
269 SDL_GL_GetDrawableSize(window, &rect.w, &rect.h);
270 }
271
272 const SDL_Rect scissor = MVC_TransformToWindow(window, &rect);
273
274 glScissor(scissor.x - 1, scissor.y - 1, scissor.w + 2, scissor.h + 2);
275}
#define MakeRect(x, y, w, h)
Creates an SDL_Rect with the given origin and size.
Definition: Types.h:74
SDL_Rect MVC_TransformToWindow(SDL_Window *window, const SDL_Rect *rect)
Transforms the specified rectangle to normalized device coordinates in window.
Definition: Window.c:28

◆ setDrawColor()

void setDrawColor ( Renderer self,
const SDL_Color *  color 
)

Sets the primary color for drawing operations.

Parameters
selfThe Renderer.
colorThe color.

Definition at line 281 of file Renderer.c.

281 {
282 glColor4ubv((const GLubyte *) color);
283}

Field Documentation

◆ interface

RendererInterface* Renderer::interface
protected

The interface.

Definition at line 61 of file Renderer.h.

◆ object

Object Renderer::object

The superclass.

Definition at line 55 of file Renderer.h.


The documentation for this struct was generated from the following files: