2
0

renderer.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. /**
  2. *** :: Deferred Renderer ::
  3. ***
  4. *** A (fairly) simple deferred renderer.
  5. ***
  6. *** Can render most of the built-in entities.
  7. *** Does a HDR and tonemapping stage, composition stage
  8. *** as well as various post-effects and also SSAO.
  9. ***
  10. **/
  11. #ifndef renderer_h
  12. #define renderer_h
  13. #include "cengine.h"
  14. #include "assets/texture.h"
  15. #include "assets/shader.h"
  16. #include "assets/cmesh.h"
  17. #include "assets/config.h"
  18. #include "entities/camera.h"
  19. #include "entities/light.h"
  20. #include "entities/static_object.h"
  21. #include "entities/instance_object.h"
  22. #include "entities/animated_object.h"
  23. #include "entities/particles.h"
  24. #include "entities/landscape.h"
  25. #include "rendering/sky.h"
  26. enum {
  27. RENDERER_MAX_LIGHTS = 16,
  28. RENDERER_MAX_DYN_LIGHTS = 13,
  29. };
  30. enum {
  31. RO_TYPE_AXIS = 0,
  32. RO_TYPE_STATIC = 1,
  33. RO_TYPE_INSTANCE = 2,
  34. RO_TYPE_ANIMATED = 3,
  35. RO_TYPE_PARTICLES = 4,
  36. RO_TYPE_LIGHT = 5,
  37. RO_TYPE_LANDSCAPE = 6,
  38. RO_TYPE_PAINT = 7,
  39. RO_TYPE_SPHERE = 8,
  40. RO_TYPE_ELLIPSOID = 9,
  41. RO_TYPE_CMESH = 10,
  42. RO_TYPE_FRUSTUM = 11,
  43. RO_TYPE_PLANE = 12,
  44. RO_TYPE_LINE = 13,
  45. RO_TYPE_POINT = 14,
  46. };
  47. typedef struct {
  48. int type;
  49. union {
  50. /* Geometry */
  51. mat4 axis;
  52. sphere sphere;
  53. ellipsoid ellipsoid;
  54. struct { cmesh* colmesh; mat4 colworld; };
  55. frustum frustum;
  56. plane plane;
  57. struct { vec3 line_start; vec3 line_end; vec3 line_color; float line_thickness; };
  58. struct { vec3 point_pos; vec3 point_color; float point_size; };
  59. /* Objects */
  60. static_object* static_object;
  61. instance_object* instance_object;
  62. animated_object* animated_object;
  63. landscape* landscape;
  64. particles* particles;
  65. /* UI */
  66. light* light;
  67. struct { mat4 paint_axis; float paint_radius; };
  68. };
  69. } render_object;
  70. render_object render_object_static(static_object* s);
  71. render_object render_object_instance(instance_object* s);
  72. render_object render_object_animated(animated_object* a);
  73. render_object render_object_particles(particles* p);
  74. render_object render_object_light(light* l);
  75. render_object render_object_axis(mat4 a);
  76. render_object render_object_sphere(sphere s);
  77. render_object render_object_ellipsoid(ellipsoid e);
  78. render_object render_object_frustum(frustum f);
  79. render_object render_object_plane(plane p);
  80. render_object render_object_cmesh(cmesh* cm, mat4 world);
  81. render_object render_object_landscape(landscape* l);
  82. render_object render_object_paint(mat4 paint_axis, float paint_radius);
  83. render_object render_object_line(vec3 start, vec3 end, vec3 color, float thickness);
  84. render_object render_object_point(vec3 pos, vec3 color, float size);
  85. typedef struct {
  86. /* Options */
  87. asset_hndl options;
  88. /* Camera */
  89. camera* camera;
  90. /* Lights */
  91. int dyn_lights_num;
  92. light* dyn_light[RENDERER_MAX_DYN_LIGHTS];
  93. /* Sky */
  94. sky* sky;
  95. /* Materials */
  96. asset_hndl mat_static;
  97. asset_hndl mat_skin;
  98. asset_hndl mat_instance;
  99. asset_hndl mat_animated;
  100. asset_hndl mat_vegetation;
  101. asset_hndl mat_terrain;
  102. asset_hndl mat_clear;
  103. asset_hndl mat_ui;
  104. asset_hndl mat_ssao;
  105. asset_hndl mat_compose;
  106. asset_hndl mat_tonemap;
  107. asset_hndl mat_post0;
  108. asset_hndl mat_post1;
  109. asset_hndl mat_skydome;
  110. asset_hndl mat_depth;
  111. asset_hndl mat_depth_ins;
  112. asset_hndl mat_depth_ani;
  113. asset_hndl mat_depth_veg;
  114. asset_hndl mat_depth_ter;
  115. asset_hndl mat_sun;
  116. asset_hndl mat_clouds;
  117. asset_hndl mat_particles;
  118. asset_hndl mat_sea;
  119. /* Meshes */
  120. asset_hndl mesh_skydome;
  121. asset_hndl mesh_sphere;
  122. asset_hndl mesh_sea;
  123. /* Textures */
  124. asset_hndl tex_color_correction;
  125. asset_hndl tex_random;
  126. asset_hndl tex_random_perlin;
  127. asset_hndl tex_environment;
  128. asset_hndl tex_vignetting;
  129. asset_hndl tex_sea_bump0;
  130. asset_hndl tex_sea_bump1;
  131. asset_hndl tex_sea_bump2;
  132. asset_hndl tex_sea_bump3;
  133. asset_hndl tex_sea_env;
  134. asset_hndl tex_cube_sea;
  135. asset_hndl tex_cube_field;
  136. asset_hndl tex_white;
  137. asset_hndl tex_grey;
  138. asset_hndl tex_skin_lookup;
  139. /* Buffers */
  140. GLuint gfbo;
  141. GLuint gdepth_buffer;
  142. GLuint gdiffuse_buffer;
  143. GLuint gnormals_buffer;
  144. GLuint gdiffuse_texture;
  145. GLuint gnormals_texture;
  146. GLuint gdepth_texture;
  147. GLuint ssao_fbo;
  148. GLuint ssao_buffer;
  149. GLuint ssao_texture;
  150. GLuint hdr_fbo;
  151. GLuint hdr_buffer;
  152. GLuint hdr_texture;
  153. GLuint ldr_front_fbo;
  154. GLuint ldr_front_buffer;
  155. GLuint ldr_front_texture;
  156. GLuint ldr_back_fbo;
  157. GLuint ldr_back_buffer;
  158. GLuint ldr_back_texture;
  159. GLuint shadows_fbo[3];
  160. GLuint shadows_buffer[3];
  161. GLuint shadows_texture[3];
  162. /* Shadows */
  163. float shadows_start[3];
  164. float shadows_end[3];
  165. int shadows_widths[3];
  166. int shadows_heights[3];
  167. /* Variables */
  168. int seed;
  169. float glitch;
  170. float time;
  171. float time_of_day;
  172. float exposure;
  173. float exposure_speed;
  174. float exposure_target;
  175. bool skydome_enabled;
  176. bool sea_enabled;
  177. /* Objects */
  178. int render_objects_num;
  179. render_object* render_objects;
  180. /* Preprocessed */
  181. mat4 camera_view;
  182. mat4 camera_proj;
  183. mat4 camera_inv_view;
  184. mat4 camera_inv_proj;
  185. float camera_near;
  186. float camera_far;
  187. box camera_frustum;
  188. mat4 shadow_view[3];
  189. mat4 shadow_proj[3];
  190. float shadow_near[3];
  191. float shadow_far[3];
  192. box shadow_frustum[3];
  193. } renderer;
  194. renderer* renderer_new(asset_hndl options);
  195. void renderer_delete(renderer* dr);
  196. void renderer_set_camera(renderer* dr, camera* cam);
  197. void renderer_set_color_correction(renderer* dr, asset_hndl t);
  198. void renderer_set_vignetting(renderer* dr, asset_hndl v);
  199. void renderer_set_glitch(renderer* dr, float glitch);
  200. void renderer_set_skydome_enabled(renderer* dr, bool enabled);
  201. void renderer_set_sea_enabled(renderer* dr, bool enabled);
  202. void renderer_set_tod(renderer* dr, float tod, int seed);
  203. void renderer_add(renderer* dr, render_object ro);
  204. void renderer_add_dyn_light(renderer* dr, light* l);
  205. void renderer_render(renderer* dr);
  206. #endif