@@ -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-
5339struct 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