Browse Source

make SDL_Handles an opaque pointer for render_state

testing
cinnaboot 6 years ago
parent
commit
e7f80875d2
  1. 19
      include/renderer.h
  2. 44
      src/renderer.cpp

19
include/renderer.h

@ -16,13 +16,6 @@
#include "shader_program.h"
struct SDL_Handles
{
SDL_Window *window;
SDL_GLContext glContext;
SDL_DisplayMode currentDisplayMode;
};
// NOTE: array of entities rendered with the same shader program
struct render_group
{
@ -31,14 +24,24 @@ struct render_group
uint entity_count;
shader_wrapper shader;
// TODO: does it makes sense to have the mesh_type stored on the
// render_group? can then easily pass to roDraw() along with the entity
// render_objects...
// only the mesh object and render object really need to know about the
// mesh_type...
//
//mesh_t mesh_type;
};
struct SDL_Handles;
struct render_state
{
glm::vec2 viewport_dims;
SDL_Handles handles;
camera cam;
util_RGBA clear_col;
SDL_Handles* handles;
// TODO: this really needs to be a resizable array, or linked list, or
// ...gasp, std::vector

44
src/renderer.cpp

@ -25,12 +25,20 @@
// forward declarations
struct SDL_Handles
{
SDL_Window *window;
SDL_GLContext glContext;
SDL_DisplayMode currentDisplayMode;
};
bool createWindow(const char* title,
SDL_Handles& handles,
SDL_Handles* handles,
glm::vec2& viewport_dims);
bool initContext(SDL_Handles& handles);
bool initContext(SDL_Handles* handles);
bool initGlOptions();
bool initSDL(SDL_Handles& handles);
bool initSDL(SDL_Handles* handles);
bool initShaders(render_state* rs);
void openglDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity,
GLsizei length, const GLchar* message, const void* userParam);
@ -43,6 +51,7 @@ render_state*
renInit(const char* title, glm::vec2 viewport_dims)
{
render_state* rs = UTIL_ALLOC(1, render_state);
rs->handles = UTIL_ALLOC(1, SDL_Handles);
setDefaults(rs, viewport_dims);
if (initSDL(rs->handles) &&
@ -75,9 +84,10 @@ renShutdown(render_state* rs)
utilSafeFree(rs->render_groups);
utilSafeFree(rs->default_shader);
meShutdownAssimp();
SDL_GL_DeleteContext(rs->handles.glContext);
SDL_DestroyWindow(rs->handles.window);
SDL_GL_DeleteContext(rs->handles->glContext);
SDL_DestroyWindow(rs->handles->window);
SDL_Quit();
utilSafeFree(rs->handles);
}
render_group*
@ -112,7 +122,7 @@ renDoRenderLoop(render_state* rs, uint framerate, frame_callback_fn cb_func)
if (cb_func != nullptr) cb_func(rs);
renRenderFrame(rs);
SDL_GL_SwapWindow(rs->handles.window);
SDL_GL_SwapWindow(rs->handles->window);
frameTime = SDL_GetTicks() - frameStart;
if (delay > frameTime)
@ -132,7 +142,7 @@ renRenderFrame(render_state* rs)
for (uint i = 0; i < rs->render_group_count; i++) {
render_group& rg = rs->render_groups[i];
if (rg.shader.type == SIMPLE_SHADER) {
if (rg.shader.shader_type == SIMPLE_SHADER) {
for (uint j = 0; j < rg.entity_count; j++) {
entity& e = rg.entities[j];
@ -143,7 +153,8 @@ renRenderFrame(render_state* rs)
}
}
if (rg.shader.type == DEFAULT_SHADER) {
#if 0
if (rg.shader.shader_type == DEFAULT_SHADER) {
for (uint j = 0; j < rg.entity_count; j++) {
entity& e = rg.entities[j];
@ -155,6 +166,7 @@ renRenderFrame(render_state* rs)
}
}
}
#endif
}
}
@ -173,13 +185,13 @@ renAddLight(render_state* rs, glm::vec3 pos, glm::vec3 color, float intensity)
// internal
bool
createWindow(const char* title, SDL_Handles& handles, glm::vec2& viewport_dims)
createWindow(const char* title, SDL_Handles* handles, glm::vec2& viewport_dims)
{
uint display_id = 0;
if (USE_SECOND_MONITOR && SDL_GetNumVideoDisplays() > 1)
display_id = 1;
handles.window = SDL_CreateWindow(
handles->window = SDL_CreateWindow(
title,
SDL_WINDOWPOS_CENTERED_DISPLAY(display_id),
SDL_WINDOWPOS_CENTERED_DISPLAY(display_id),
@ -188,7 +200,7 @@ createWindow(const char* title, SDL_Handles& handles, glm::vec2& viewport_dims)
SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE
);
if (!handles.window) {
if (!handles->window) {
LOG(Error) << "Error creating window: " << SDL_GetError() << "\n";
return false;
}
@ -197,11 +209,11 @@ createWindow(const char* title, SDL_Handles& handles, glm::vec2& viewport_dims)
}
bool
initContext(SDL_Handles& handles)
initContext(SDL_Handles* handles)
{
handles.glContext = SDL_GL_CreateContext(handles.window);
handles->glContext = SDL_GL_CreateContext(handles->window);
if (!handles.glContext) {
if (!handles->glContext) {
LOG(Error) << "Error creating glContext: " << SDL_GetError() << "\n";
return false;
}
@ -247,7 +259,7 @@ initGlOptions()
}
bool
initSDL(SDL_Handles& handles)
initSDL(SDL_Handles* handles)
{
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
LOG(Error) << "Error, SDL_Init: " << SDL_GetError() << "\n";
@ -261,7 +273,7 @@ initSDL(SDL_Handles& handles)
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GetCurrentDisplayMode(0, &handles.currentDisplayMode);
SDL_GetCurrentDisplayMode(0, &handles->currentDisplayMode);
return true;
}

Loading…
Cancel
Save