Skip to content

Commit eaf2bb7

Browse files
committed
Simplify some render code.
1 parent 740bb69 commit eaf2bb7

6 files changed

Lines changed: 65 additions & 125 deletions

File tree

src/engine_lib/include/game/camera.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,9 @@ float camera_get_far_clip(te_camera* camera);
5656
// Position of the top-left corner of the viewport rectangle in XY and size in ZW (in range [0; 1]).
5757
void camera_get_viewport(te_camera* camera, vec4 out);
5858

59-
// Returns camara's view matrix.
60-
void camera_get_view_mat(te_camera* camera, mat4 out);
61-
62-
// Returns camera's projection matrix.
63-
void camera_get_proj_mat(te_camera* camera, mat4 out);
59+
// Returns camera's view projection matrix.
60+
// Do not free/destroy returned pointer, valid while the camera exists.
61+
mat4* camera_get_view_proj_mat(te_camera* camera);
6462

6563
// Returns NULL if the camera is not spawned in a world.
6664
struct te_world* camera_get_world(te_camera* camera);

src/engine_lib/src/debug_console.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -284,13 +284,12 @@ prv_debug_console_draw(float delta_time_sec) {
284284
prv_debug_console_draw_stat(screen_pos, "FPS: %u (limit: %u)", stats->fps, fps_limit);
285285

286286
// RAM.
287+
const char* ram_fmt = "RAM used (MB): %u (%u/%u)";
287288
#if defined(ENGINE_ASAN_ENABLED)
288-
prv_debug_console_draw_stat(screen_pos, "RAM used (MB): %zu (%zu/%zu) (ASan enabled)",
289-
stats->process_mem, stats->total_used_mem, stats->total_mem);
290-
#else
291-
prv_debug_console_draw_stat(screen_pos, "RAM used (MB): %zu (%zu/%zu)", stats->process_mem,
292-
stats->total_used_mem, stats->total_mem);
289+
ram_fmt = "RAM used (MB): %u (%u/%u) (ASan enabled)";
293290
#endif
291+
prv_debug_console_draw_stat(screen_pos, ram_fmt, stats->process_mem, stats->total_used_mem,
292+
stats->total_mem);
294293

295294
// Rendered model count.
296295
prv_debug_console_draw_stat(screen_pos, "rendered model count: %u", stats->rendered_model_count);

src/engine_lib/src/game/camera.c

Lines changed: 40 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ struct te_camera {
1919
// Projection matrix. May be outdated, see @ref is_proj_mat_outdated.
2020
mat4 proj_mat;
2121

22+
// @ref view_mat and @ref proj_mat multiplied. May be outdated.
23+
mat4 view_proj_mat;
24+
2225
// Position of the top-left corner of the viewport rectangle in XY and size in ZW (in range [0; 1]).
2326
vec4 viewport;
2427

@@ -222,41 +225,36 @@ prv_camera_recalc_frustum(te_camera* camera) {
222225
(float)camera->render_width / (float)camera->render_height);
223226
}
224227

225-
void
226-
camera_get_view_mat(te_camera* camera, mat4 out) {
227-
if (camera->is_view_mat_outdated) {
228-
vec3 forward;
229-
vec3 up;
230-
camera_get_forward(camera, forward);
231-
camera_get_up(camera, up);
232-
233-
glm_look_rh(camera->location, forward, up, camera->view_mat);
234-
prv_camera_recalc_frustum(camera);
228+
mat4*
229+
camera_get_view_proj_mat(te_camera* camera) {
230+
if (camera->is_view_mat_outdated || camera->is_proj_mat_outdated) {
231+
if (camera->is_view_mat_outdated) {
232+
vec3 forward;
233+
vec3 up;
234+
camera_get_forward(camera, forward);
235+
camera_get_up(camera, up);
235236

236-
camera->is_view_mat_outdated = false;
237-
}
237+
glm_look_rh(camera->location, forward, up, camera->view_mat);
238+
camera->is_view_mat_outdated = false;
239+
}
238240

239-
glm_mat4_copy(camera->view_mat, out);
240-
}
241-
242-
void
243-
camera_get_proj_mat(te_camera* camera, mat4 out) {
244241
#if defined(DEBUG)
245-
if (camera->render_width == 0 || camera->render_height == 0) {
246-
show_error_and_abort("expected render target width/height to be set at this point");
247-
}
242+
if (camera->render_width == 0 || camera->render_height == 0) {
243+
show_error_and_abort("expected render target width/height to be set at this point");
244+
}
248245
#endif
246+
if (camera->is_proj_mat_outdated) {
247+
glm_perspective_rh_no(glm_rad(camera->vertical_fov),
248+
(float)camera->render_width / (float)camera->render_height,
249+
camera->near_clip, camera->far_clip, camera->proj_mat);
250+
camera->is_proj_mat_outdated = false;
251+
}
249252

250-
if (camera->is_proj_mat_outdated) {
251-
glm_perspective_rh_no(glm_rad(camera->vertical_fov),
252-
(float)camera->render_width / (float)camera->render_height, camera->near_clip,
253-
camera->far_clip, camera->proj_mat);
254253
prv_camera_recalc_frustum(camera);
255-
256-
camera->is_proj_mat_outdated = false;
254+
glm_mat4_mul(camera->proj_mat, camera->view_mat, camera->view_proj_mat);
257255
}
258256

259-
glm_mat4_copy(camera->proj_mat, out);
257+
return &camera->view_proj_mat;
260258
}
261259

262260
struct te_world*
@@ -272,28 +270,26 @@ camera_get_frustum(te_camera* camera) {
272270
}
273271
#endif
274272

275-
const bool was_outdated = camera->is_view_mat_outdated || camera->is_proj_mat_outdated;
273+
if (camera->is_view_mat_outdated || camera->is_proj_mat_outdated) {
274+
if (camera->is_view_mat_outdated) {
275+
vec3 forward;
276+
vec3 up;
277+
camera_get_forward(camera, forward);
278+
camera_get_up(camera, up);
276279

277-
if (camera->is_view_mat_outdated) {
278-
vec3 forward;
279-
vec3 up;
280-
camera_get_forward(camera, forward);
281-
camera_get_up(camera, up);
280+
glm_look_rh(camera->location, forward, up, camera->view_mat);
282281

283-
glm_look_rh(camera->location, forward, up, camera->view_mat);
282+
camera->is_view_mat_outdated = false;
283+
}
284284

285-
camera->is_view_mat_outdated = false;
286-
}
287-
288-
if (camera->is_proj_mat_outdated) {
289-
glm_perspective_rh_no(glm_rad(camera->vertical_fov),
290-
(float)camera->render_width / (float)camera->render_height, camera->near_clip,
291-
camera->far_clip, camera->proj_mat);
285+
if (camera->is_proj_mat_outdated) {
286+
glm_perspective_rh_no(glm_rad(camera->vertical_fov),
287+
(float)camera->render_width / (float)camera->render_height,
288+
camera->near_clip, camera->far_clip, camera->proj_mat);
292289

293-
camera->is_proj_mat_outdated = false;
294-
}
290+
camera->is_proj_mat_outdated = false;
291+
}
295292

296-
if (was_outdated) {
297293
prv_camera_recalc_frustum(camera);
298294
}
299295

src/engine_lib/src/render/model_renderer.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,13 +280,13 @@ model_renderer_get_render_data_tmp(te_model_renderer* renderer, unsigned int han
280280
}
281281

282282
void
283-
model_renderer_draw(te_model_renderer* renderer, ivec4 gl_viewport, mat4 view_proj_mat,
283+
model_renderer_draw(te_model_renderer* renderer, ivec4* gl_viewport, mat4* view_proj_mat,
284284
te_frustum_shape* camera_frustum) {
285285
#if defined(ENGINE_DEBUG_TOOLS)
286286
te_debug_stats* debug_stats = prv_debug_console_get_stats();
287287
#endif
288288

289-
glViewport(gl_viewport[0], gl_viewport[1], gl_viewport[2], gl_viewport[3]);
289+
glViewport((*gl_viewport)[0], (*gl_viewport)[1], (*gl_viewport)[2], (*gl_viewport)[3]);
290290

291291
unsigned int render_data_idx = 0;
292292

@@ -295,7 +295,7 @@ model_renderer_draw(te_model_renderer* renderer, ivec4 gl_viewport, mat4 view_pr
295295

296296
glUseProgram(group->prog_id);
297297

298-
glUniformMatrix4fv(group->uniform_view_proj_mat, 1, GL_FALSE, view_proj_mat[0]);
298+
glUniformMatrix4fv(group->uniform_view_proj_mat, 1, GL_FALSE, (*view_proj_mat)[0]);
299299

300300
for (unsigned int unused = 0; unused < group->count; unused++, render_data_idx++) {
301301
te_model_render_data* data = &renderer->render_data[render_data_idx];

src/engine_lib/src/render/model_renderer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,5 @@ void model_renderer_remove_model(te_model_renderer* renderer, unsigned int handl
5858
te_model_render_data* model_renderer_get_render_data_tmp(te_model_renderer* renderer, unsigned int handle);
5959

6060
// Draws models to the currently set framebuffer.
61-
void model_renderer_draw(te_model_renderer* renderer, ivec4 gl_viewport, mat4 view_proj_mat,
61+
void model_renderer_draw(te_model_renderer* renderer, ivec4* gl_viewport, mat4* view_proj_mat,
6262
struct te_frustum_shape* camera_frustum);

src/engine_lib/src/render/renderer.c

Lines changed: 14 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,6 @@ typedef struct te_renderer_frame_stats {
3636
unsigned int fps;
3737
} te_renderer_frame_stats;
3838

39-
// Groups info used during the rendering of a world.
40-
typedef struct te_world_render_info {
41-
// Do not free/destroy this pointer.
42-
te_world* world;
43-
44-
struct te_frustum_shape* camera_frustum;
45-
46-
// View projection matrix of the camera.
47-
mat4 view_proj_mat;
48-
49-
// OpenGL viewport in pixels (left-bottom origin).
50-
ivec4 gl_viewport;
51-
} te_world_render_info;
52-
5339
struct te_renderer {
5440
// Always valid pointer, window that owns the renderer. This pointer should not be freed.
5541
struct te_window* window;
@@ -61,15 +47,8 @@ struct te_renderer {
6147
te_texture_manager* texture_manager;
6248
te_font_manager* font_manager;
6349

64-
// Preallocated array to keep active cameras while submitting a new frame.
65-
// Size of this array is @ref worlds_render_info_array_size.
66-
te_world_render_info* worlds_render_info;
67-
6850
te_renderer_frame_stats frame_stats;
6951

70-
// Size of the array @ref worlds_render_info.
71-
unsigned int worlds_render_info_array_size;
72-
7352
unsigned int fps_limit;
7453
};
7554

@@ -113,10 +92,6 @@ renderer_create(struct te_window* window) {
11392
renderer->texture_manager = prv_texture_manager_create();
11493
renderer->font_manager = prv_font_manager_create(renderer);
11594

116-
renderer->worlds_render_info_array_size = 2;
117-
renderer->worlds_render_info =
118-
malloc(sizeof(te_world_render_info) * renderer->worlds_render_info_array_size);
119-
12095
renderer->frame_stats.frame_count = 0;
12196
renderer->frame_stats.time_sec_since_update = 0.0f;
12297
renderer->frame_stats.fps = 0;
@@ -191,7 +166,6 @@ renderer_destroy(te_renderer* renderer) {
191166
prv_texture_manager_destroy(renderer->texture_manager);
192167
prv_shader_manager_destroy(renderer->shader_manager);
193168
prv_font_manager_destroy(renderer->font_manager);
194-
free(renderer->worlds_render_info);
195169

196170
if (!SDL_GL_DestroyContext(renderer->gl_context)) {
197171
show_error_and_abort(SDL_GetError());
@@ -295,67 +269,40 @@ prv_renderer_draw_frame(te_renderer* renderer, float delta_time_sec) {
295269
unsigned int window_height = 0;
296270
window_get_size(renderer->window, &window_width, &window_height);
297271

272+
// Rendering to window's framebuffer.
273+
glBindFramebuffer(GL_FRAMEBUFFER, 0);
274+
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
275+
298276
// Get worlds.
299277
te_game_manager* game_manager = window_get_game_manager(renderer->window);
300278
unsigned int world_count = 0;
301279
te_world** worlds = game_manager_get_worlds(game_manager, &world_count);
302280

303-
if (world_count > renderer->worlds_render_info_array_size) {
304-
// Expand the array.
305-
te_world_render_info* new_worlds = malloc(sizeof(te_world_render_info) * world_count);
306-
free(renderer->worlds_render_info);
307-
renderer->worlds_render_info = new_worlds;
308-
renderer->worlds_render_info_array_size = world_count;
309-
}
310-
311-
// Get active cameras.
312-
unsigned int active_world_count = 0;
313281
for (unsigned int i = 0; i < world_count; i++) {
314282
te_camera* camera = world_get_active_camera(worlds[i]);
315283
if (camera == NULL) {
316284
continue;
317285
}
318286

287+
te_model_renderer* model_renderer = world_get_model_renderer(worlds[i]);
288+
319289
// Set aspect ratio to the camera.
320290
vec4 viewport;
321291
camera_get_viewport(camera, viewport);
322292
const unsigned int viewport_width = (unsigned int)((float)window_width * viewport[2]);
323293
const unsigned int viewport_height = (unsigned int)((float)window_height * viewport[3]);
324294
prv_camera_set_render_target_size(camera, viewport_width, viewport_height);
325295

326-
// Save info.
327-
te_world_render_info* info = &renderer->worlds_render_info[active_world_count];
328-
329-
info->world = worlds[i];
330-
331-
mat4 view_mat;
332-
mat4 proj_mat;
333-
camera_get_view_mat(camera, view_mat);
334-
camera_get_proj_mat(camera, proj_mat);
335-
glm_mat4_mul(proj_mat, view_mat, info->view_proj_mat);
336-
337-
info->gl_viewport[0] = (int)((float)window_width * viewport[0]);
338-
info->gl_viewport[1] = (int)((float)window_height * (1.0f - fmin(1.0f, viewport[1] + viewport[3])));
339-
info->gl_viewport[2] = (int)viewport_width;
340-
info->gl_viewport[3] = (int)viewport_height;
341-
342-
info->camera_frustum = camera_get_frustum(camera);
343-
344-
active_world_count += 1;
345-
}
346-
347-
// Rendering to window's framebuffer.
348-
glBindFramebuffer(GL_FRAMEBUFFER, 0);
349-
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
296+
mat4* view_proj_mat = camera_get_view_proj_mat(camera);
350297

351-
if (active_world_count > 0) {
352-
// Draw models.
353-
for (unsigned int world_idx = 0; world_idx < active_world_count; world_idx++) {
354-
te_world_render_info* info = &renderer->worlds_render_info[world_idx];
355-
te_model_renderer* model_renderer = world_get_model_renderer(info->world);
298+
ivec4 gl_viewport;
299+
gl_viewport[0] = (int)((float)window_width * viewport[0]);
300+
gl_viewport[1] = (int)((float)window_height * (1.0f - fmin(1.0f, viewport[1] + viewport[3])));
301+
gl_viewport[2] = (int)viewport_width;
302+
gl_viewport[3] = (int)viewport_height;
356303

357-
model_renderer_draw(model_renderer, info->gl_viewport, info->view_proj_mat, info->camera_frustum);
358-
}
304+
struct te_frustum_shape* camera_frustum = camera_get_frustum(camera);
305+
model_renderer_draw(model_renderer, &gl_viewport, view_proj_mat, camera_frustum);
359306
}
360307

361308
#if defined(ENGINE_DEBUG_TOOLS)

0 commit comments

Comments
 (0)