Files

91 lines
2.2 KiB
C
Raw Permalink Normal View History

2023-09-26 19:40:16 +02:00
// 2d: Functions to render 2d things immediatly. Simple things like meshes, lines, triangles, quads.
// render: Renderer, takes complex objects with materials and renders them.
// Might use an object buffer/queue and render things later, to enable
// sorting and other complex rendering procedures (culling).
// shader: Shaders! They have enough code to have their own source files
// object: Objects, materials, maybe other things. To be used by the renderer.
// light: Lights to be used by the renderer. There are enought types to separate them from objects.
// Might (or might not) add: compute shaders, vfx/postprocessing passes, animations
#ifndef _PIUMA_RENDER_RENDER_H_
#define _PIUMA_RENDER_RENDER_H_
#include "primitives.h"
#include "shader.h"
#include "2d.h"
#include "lights.h"
#include "object.h"
#include "state.h"
void r_init();
void r_deinit();
void r_size_update(u32 width, u32 height);
void r_time_update(f64 time);
void r_clear(v4 color = {0.0, 0.0, 0.0, 0.0});
void r_swap();
struct r_shadow_map
{
// FBO + depth
u32 gl_FBO;
u32 gl_depth_texture;
m4 view_matrix;
};
struct r_scene
{
m4 view_matrix;
m4 view_matrix_inverse;
m4 projection_matrix;
m4 projection_matrix_inverse;
r_object *objects;
u64 objects_count;
r_light_container lights;
GLuint gl_lights;
r_shadow_map shadow_map;
r_cubemap environment_map;
};
r_scene r_scene_create();
void r_scene_destroy(r_scene *scene);
void r_scene_set_view (r_scene *scene, m4 m);
void r_scene_set_projection(r_scene *scene, m4 m);
void r_update_lights(r_scene *scene);
void r_render_scene(r_scene *scene);
// Single object rendering functions (batched funcs are below)
void r_render_object(r_scene *scene, r_object *object, r_shader *shader_override = NULL);
void r_render_object_wireframe(r_scene *scene, r_object *object);
void r_render_line(r_scene *scene, v3 a, v3 b, v4 a_color, v4 b_color, f32 thickness = 1.0);
// Batch render functions
void r_render_objects(r_scene *scene, u64 count, r_object **objects);
// Shadow maps
r_shadow_map r_build_shadow_map_sun(r_scene *scene, r_sun_light *sun);
void r_free_shadow_map(r_shadow_map *sm);
void r_framebuffer_select(r_framebuffer *fb);
void r_merge_and_postprocess();
#endif