1 /* 2 * This program is free software; you can redistribute it and/or 3 * modify it under the terms of the GNU General Public License 4 * as published by the Free Software Foundation; either version 2 5 * of the License, or (at your option) any later version. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License 13 * along with this program; if not, write to the Free Software Foundation, 14 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 15 * 16 * The Original Code is Copyright (C) 2006 Blender Foundation. 17 * All rights reserved. 18 */ 19 20 /** \file 21 * \ingroup render 22 */ 23 24 #pragma once 25 26 #include "DEG_depsgraph.h" 27 #include "DNA_listBase.h" 28 #include "DNA_vec_types.h" 29 30 struct Image; 31 struct ImageFormatData; 32 struct Main; 33 struct Object; 34 struct RenderData; 35 struct RenderResult; 36 struct ReportList; 37 struct Scene; 38 struct StampData; 39 struct ViewLayer; 40 struct bMovieHandle; 41 42 #ifdef __cplusplus 43 extern "C" { 44 #endif 45 46 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ 47 /* this include is what is exposed of render to outside world */ 48 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ 49 50 /* length of the scene name + passname */ 51 #define RE_MAXNAME ((MAX_ID_NAME - 2) + 10) 52 53 /* only used as handle */ 54 typedef struct Render Render; 55 56 /* Render Result usage: 57 * 58 * - render engine allocates/frees and delivers raw floating point rects 59 * - right now it's full rects, but might become tiles or file 60 * - the display client has to allocate display rects, sort out what to display, 61 * and how it's converted 62 */ 63 64 typedef struct RenderView { 65 struct RenderView *next, *prev; 66 char name[64]; /* EXR_VIEW_MAXNAME */ 67 68 /* if this exists, result of composited layers */ 69 float *rectf; 70 /* if this exists, result of composited layers */ 71 float *rectz; 72 /* optional, 32 bits version of picture, used for sequencer, ogl render and image curves */ 73 int *rect32; 74 75 } RenderView; 76 77 typedef struct RenderPass { 78 struct RenderPass *next, *prev; 79 int channels; 80 char name[64]; /* amount defined in openexr_multi.h */ 81 char chan_id[8]; /* amount defined in openexr_multi.h */ 82 float *rect; 83 int rectx, recty; 84 85 char fullname[64]; /* EXR_PASS_MAXNAME */ 86 char view[64]; /* EXR_VIEW_MAXNAME */ 87 int view_id; /* quick lookup */ 88 89 int pad; 90 } RenderPass; 91 92 /* a renderlayer is a full image, but with all passes and samples */ 93 /* size of the rects is defined in RenderResult */ 94 /* after render, the Combined pass is in combined, 95 * for renderlayers read from files it is a real pass */ 96 typedef struct RenderLayer { 97 struct RenderLayer *next, *prev; 98 99 /** copy of RenderData */ 100 char name[RE_MAXNAME]; 101 int layflag, passflag, pass_xor; 102 103 int rectx, recty; 104 105 /** Optional saved endresult on disk. */ 106 void *exrhandle; 107 108 ListBase passes; 109 110 } RenderLayer; 111 112 typedef struct RenderResult { 113 struct RenderResult *next, *prev; 114 115 /* target image size */ 116 int rectx, recty; 117 short crop, sample_nr; 118 119 /* The following rect32, rectf and rectz buffers are for temporary storage only, 120 * for RenderResult structs created in #RE_AcquireResultImage - which do not have RenderView */ 121 122 /* optional, 32 bits version of picture, used for ogl render and image curves */ 123 int *rect32; 124 /* if this exists, a copy of one of layers, or result of composited layers */ 125 float *rectf; 126 /* if this exists, a copy of one of layers, or result of composited layers */ 127 float *rectz; 128 129 /* coordinates within final image (after cropping) */ 130 rcti tilerect; 131 /* offset to apply to get a border render in full image */ 132 int xof, yof; 133 134 /* the main buffers */ 135 ListBase layers; 136 137 /* multiView maps to a StringVector in OpenEXR */ 138 ListBase views; /* RenderView */ 139 140 /* allowing live updates: */ 141 volatile rcti renrect; 142 volatile RenderLayer *renlay; 143 144 /* optional saved endresult on disk */ 145 int do_exr_tile; 146 147 /* for render results in Image, verify validity for sequences */ 148 int framenr; 149 150 /* for acquire image, to indicate if it there is a combined layer */ 151 int have_combined; 152 153 /* render info text */ 154 char *text; 155 char *error; 156 157 struct StampData *stamp_data; 158 } RenderResult; 159 160 typedef struct RenderStats { 161 int cfra; 162 int totface, totvert, totlamp, totpart; 163 bool localview; 164 double starttime, lastframetime; 165 const char *infostr, *statstr; 166 char scene_name[MAX_ID_NAME - 2]; 167 float mem_used, mem_peak; 168 } RenderStats; 169 170 /* *********************** API ******************** */ 171 172 /* the name is used as identifier, so elsewhere in blender the result can retrieved */ 173 /* calling a new render with same name, frees automatic existing render */ 174 struct Render *RE_NewRender(const char *name); 175 struct Render *RE_GetRender(const char *name); 176 177 struct Scene; 178 struct Render *RE_NewSceneRender(const struct Scene *scene); 179 struct Render *RE_GetSceneRender(const struct Scene *scene); 180 181 /* assign default dummy callbacks */ 182 void RE_InitRenderCB(struct Render *re); 183 184 /* use free render as signal to do everything over (previews) */ 185 void RE_FreeRender(struct Render *re); 186 /* only called on exit */ 187 void RE_FreeAllRender(void); 188 /* Free memory used by persistent data. 189 * Invoked when loading new file. 190 */ 191 void RE_FreeAllPersistentData(void); 192 /* only call on file load */ 193 void RE_FreeAllRenderResults(void); 194 /* for external render engines that can keep persistent data */ 195 void RE_FreePersistentData(void); 196 197 /* get results and statistics */ 198 void RE_FreeRenderResult(struct RenderResult *rr); 199 struct RenderResult *RE_AcquireResultRead(struct Render *re); 200 struct RenderResult *RE_AcquireResultWrite(struct Render *re); 201 void RE_ReleaseResult(struct Render *re); 202 void RE_AcquireResultImageViews(struct Render *re, struct RenderResult *rr); 203 void RE_ReleaseResultImageViews(struct Render *re, struct RenderResult *rr); 204 void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr, const int view_id); 205 void RE_ReleaseResultImage(struct Render *re); 206 void RE_SwapResult(struct Render *re, struct RenderResult **rr); 207 void RE_ClearResult(struct Render *re); 208 struct RenderStats *RE_GetStats(struct Render *re); 209 210 void RE_ResultGet32(struct Render *re, unsigned int *rect); 211 void RE_AcquiredResultGet32(struct Render *re, 212 struct RenderResult *result, 213 unsigned int *rect, 214 const int view_id); 215 216 void RE_render_result_rect_from_ibuf(struct RenderResult *rr, 217 struct RenderData *rd, 218 struct ImBuf *ibuf, 219 const int view_id); 220 221 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name); 222 float *RE_RenderLayerGetPass(volatile struct RenderLayer *rl, 223 const char *name, 224 const char *viewname); 225 226 bool RE_HasSingleLayer(struct Render *re); 227 228 /* add passes for grease pencil */ 229 struct RenderPass *RE_create_gp_pass(struct RenderResult *rr, 230 const char *layername, 231 const char *viewname); 232 233 void RE_create_render_pass(struct RenderResult *rr, 234 const char *name, 235 int channels, 236 const char *chan_id, 237 const char *layername, 238 const char *viewname); 239 240 /* obligatory initialize call, disprect is optional */ 241 void RE_InitState(struct Render *re, 242 struct Render *source, 243 struct RenderData *rd, 244 struct ListBase *render_layers, 245 struct ViewLayer *single_layer, 246 int winx, 247 int winy, 248 rcti *disprect); 249 void RE_ChangeResolution(struct Render *re, int winx, int winy, rcti *disprect); 250 void RE_ChangeModeFlag(struct Render *re, int flag, bool clear); 251 252 /* set up the viewplane/perspective matrix, three choices */ 253 struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */ 254 void RE_SetOverrideCamera(struct Render *re, struct Object *cam_ob); 255 void RE_SetCamera(struct Render *re, struct Object *cam_ob); 256 void RE_SetWindow(struct Render *re, const rctf *viewplane, float clip_start, float clip_end); 257 void RE_SetOrtho(struct Render *re, const rctf *viewplane, float clip_start, float clip_end); 258 259 /* get current view and window transform */ 260 void RE_GetViewPlane(struct Render *re, rctf *r_viewplane, rcti *r_disprect); 261 262 /* set the render threads based on the command-line and autothreads setting */ 263 void RE_init_threadcount(Render *re); 264 265 bool RE_WriteRenderViewsImage(struct ReportList *reports, 266 struct RenderResult *rr, 267 struct Scene *scene, 268 const bool stamp, 269 char *name); 270 bool RE_WriteRenderViewsMovie(struct ReportList *reports, 271 struct RenderResult *rr, 272 struct Scene *scene, 273 struct RenderData *rd, 274 struct bMovieHandle *mh, 275 void **movie_ctx_arr, 276 const int totvideos, 277 bool preview); 278 279 /* only RE_NewRender() needed, main Blender render calls */ 280 void RE_RenderFrame(struct Render *re, 281 struct Main *bmain, 282 struct Scene *scene, 283 struct ViewLayer *single_layer, 284 struct Object *camera_override, 285 int frame, 286 const bool write_still); 287 void RE_RenderAnim(struct Render *re, 288 struct Main *bmain, 289 struct Scene *scene, 290 struct ViewLayer *single_layer, 291 struct Object *camera_override, 292 int sfra, 293 int efra, 294 int tfra); 295 #ifdef WITH_FREESTYLE 296 void RE_RenderFreestyleStrokes(struct Render *re, 297 struct Main *bmain, 298 struct Scene *scene, 299 int render); 300 void RE_RenderFreestyleExternal(struct Render *re); 301 #endif 302 303 /* Free memory and clear runtime data which is only needed during rendering. */ 304 void RE_CleanAfterRender(struct Render *re); 305 306 void RE_SetActiveRenderView(struct Render *re, const char *viewname); 307 const char *RE_GetActiveRenderView(struct Render *re); 308 309 /* error reporting */ 310 void RE_SetReports(struct Render *re, struct ReportList *reports); 311 312 /* main preview render call */ 313 void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene); 314 315 bool RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode); 316 bool RE_WriteRenderResult(struct ReportList *reports, 317 RenderResult *rr, 318 const char *filename, 319 struct ImageFormatData *imf, 320 const char *view, 321 int layer); 322 struct RenderResult *RE_MultilayerConvert( 323 void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty); 324 325 /* display and event callbacks */ 326 void RE_display_init_cb(struct Render *re, 327 void *handle, 328 void (*f)(void *handle, RenderResult *rr)); 329 void RE_display_clear_cb(struct Render *re, 330 void *handle, 331 void (*f)(void *handle, RenderResult *rr)); 332 void RE_display_update_cb(struct Render *re, 333 void *handle, 334 void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect)); 335 void RE_stats_draw_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs)); 336 void RE_progress_cb(struct Render *re, void *handle, void (*f)(void *handle, float)); 337 void RE_draw_lock_cb(struct Render *re, void *handle, void (*f)(void *handle, int)); 338 void RE_test_break_cb(struct Render *re, void *handle, int (*f)(void *handle)); 339 void RE_current_scene_update_cb(struct Render *re, 340 void *handle, 341 void (*f)(void *handle, struct Scene *scene)); 342 343 void RE_gl_context_create(Render *re); 344 void RE_gl_context_destroy(Render *re); 345 void *RE_gl_context_get(Render *re); 346 void *RE_gpu_context_get(Render *re); 347 348 /* should move to kernel once... still unsure on how/where */ 349 float RE_filter_value(int type, float x); 350 351 int RE_seq_render_active(struct Scene *scene, struct RenderData *rd); 352 353 bool RE_layers_have_name(struct RenderResult *result); 354 bool RE_passes_have_name(struct RenderLayer *rl); 355 356 struct RenderPass *RE_pass_find_by_name(volatile struct RenderLayer *rl, 357 const char *name, 358 const char *viewname); 359 struct RenderPass *RE_pass_find_by_type(volatile struct RenderLayer *rl, 360 int passtype, 361 const char *viewname); 362 363 /* shaded view or baking options */ 364 #define RE_BAKE_NORMALS 0 365 #define RE_BAKE_DISPLACEMENT 1 366 #define RE_BAKE_AO 2 367 368 void RE_GetCameraWindow(struct Render *re, struct Object *camera, float mat[4][4]); 369 void RE_GetCameraWindowWithOverscan(struct Render *re, float overscan, float r_winmat[4][4]); 370 void RE_GetCameraModelMatrix(struct Render *re, struct Object *camera, float r_modelmat[4][4]); 371 struct Scene *RE_GetScene(struct Render *re); 372 void RE_SetScene(struct Render *re, struct Scene *sce); 373 374 bool RE_is_rendering_allowed(struct Scene *scene, 375 struct ViewLayer *single_layer, 376 struct Object *camera_override, 377 struct ReportList *reports); 378 379 bool RE_allow_render_generic_object(struct Object *ob); 380 381 /******* defined in render_result.c *********/ 382 383 bool RE_HasCombinedLayer(RenderResult *res); 384 bool RE_HasFloatPixels(RenderResult *res); 385 bool RE_RenderResult_is_stereo(RenderResult *res); 386 struct RenderView *RE_RenderViewGetById(struct RenderResult *rr, const int view_id); 387 struct RenderView *RE_RenderViewGetByName(struct RenderResult *rr, const char *viewname); 388 389 RenderResult *RE_DuplicateRenderResult(RenderResult *rr); 390 391 #ifdef __cplusplus 392 } 393 #endif 394