Fix warning from rB9925606539.
[blender.git] / source / blender / render / RE_pipeline.h
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 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   /* for render results in Image, verify validity for sequences */
145   int framenr;
146
147   /* for acquire image, to indicate if it there is a combined layer */
148   int have_combined;
149
150   /* render info text */
151   char *text;
152   char *error;
153
154   struct StampData *stamp_data;
155
156   bool passes_allocated;
157 } RenderResult;
158
159 typedef struct RenderStats {
160   int cfra;
161   bool localview;
162   double starttime, lastframetime;
163   const char *infostr, *statstr;
164   char scene_name[MAX_ID_NAME - 2];
165   float mem_used, mem_peak;
166 } RenderStats;
167
168 /* *********************** API ******************** */
169
170 /**
171  * The name is used as identifier, so elsewhere in blender the result can retrieved.
172  * Calling a new render with same name, frees automatic existing render.
173  */
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
183 /**
184  * Called for new renders and when finishing rendering
185  * so we always have valid callbacks on a render.
186  */
187 void RE_InitRenderCB(struct Render *re);
188
189 /**
190  * Use free render as signal to do everything over (previews).
191  *
192  * Only call this while you know it will remove the link too.
193  */
194 void RE_FreeRender(struct Render *re);
195 /**
196  * Only called on exit.
197  */
198 void RE_FreeAllRender(void);
199
200 /**
201  * On file load, free render results.
202  */
203 void RE_FreeAllRenderResults(void);
204 /**
205  * On file load or changes engines, free persistent render data.
206  * Assumes no engines are currently rendering.
207  */
208 void RE_FreeAllPersistentData(void);
209 /**
210  * Free persistent render data, optionally only for the given scene.
211  */
212 void RE_FreePersistentData(const Scene *scene);
213
214 /**
215  * Get results and statistics.
216  */
217 void RE_FreeRenderResult(struct RenderResult *rr);
218 /**
219  * If you want to know exactly what has been done.
220  */
221 struct RenderResult *RE_AcquireResultRead(struct Render *re);
222 struct RenderResult *RE_AcquireResultWrite(struct Render *re);
223 void RE_ReleaseResult(struct Render *re);
224 /**
225  * Same as #RE_AcquireResultImage but creating the necessary views to store the result
226  * fill provided result struct with a copy of thew views of what is done so far the
227  * #RenderResult.views #ListBase needs to be freed after with #RE_ReleaseResultImageViews
228  */
229 void RE_AcquireResultImageViews(struct Render *re, struct RenderResult *rr);
230 /**
231  * Clear temporary #RenderResult struct.
232  */
233 void RE_ReleaseResultImageViews(struct Render *re, struct RenderResult *rr);
234
235 /**
236  * Fill provided result struct with what's currently active or done.
237  * This #RenderResult struct is the only exception to the rule of a #RenderResult
238  * always having at least one #RenderView.
239  */
240 void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr, int view_id);
241 void RE_ReleaseResultImage(struct Render *re);
242 void RE_SwapResult(struct Render *re, struct RenderResult **rr);
243 void RE_ClearResult(struct Render *re);
244 struct RenderStats *RE_GetStats(struct Render *re);
245
246 /**
247  * Caller is responsible for allocating `rect` in correct size!
248  */
249 void RE_ResultGet32(struct Render *re, unsigned int *rect);
250 /**
251  * Only for acquired results, for lock.
252  *
253  * \note The caller is responsible for allocating `rect` in correct size!
254  */
255 void RE_AcquiredResultGet32(struct Render *re,
256                             struct RenderResult *result,
257                             unsigned int *rect,
258                             int view_id);
259
260 void RE_render_result_rect_from_ibuf(struct RenderResult *rr,
261                                      struct RenderData *rd,
262                                      struct ImBuf *ibuf,
263                                      int view_id);
264
265 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
266 float *RE_RenderLayerGetPass(volatile struct RenderLayer *rl,
267                              const char *name,
268                              const char *viewname);
269
270 bool RE_HasSingleLayer(struct Render *re);
271
272 /**
273  * Add passes for grease pencil.
274  * Create a render-layer and render-pass for grease-pencil layer.
275  */
276 struct RenderPass *RE_create_gp_pass(struct RenderResult *rr,
277                                      const char *layername,
278                                      const char *viewname);
279
280 void RE_create_render_pass(struct RenderResult *rr,
281                            const char *name,
282                            int channels,
283                            const char *chan_id,
284                            const char *layername,
285                            const char *viewname,
286                            bool allocate);
287
288 /**
289  * Obligatory initialize call, doesn't change during entire render sequence.
290  * \param disprect: is optional. if NULL it assumes full window render.
291  */
292 void RE_InitState(struct Render *re,
293                   struct Render *source,
294                   struct RenderData *rd,
295                   struct ListBase *render_layers,
296                   struct ViewLayer *single_layer,
297                   int winx,
298                   int winy,
299                   rcti *disprect);
300
301 /**
302  * Set up the view-plane/perspective matrix, three choices.
303  *
304  * \return camera override if set.
305  */
306 struct Object *RE_GetCamera(struct Render *re);
307 void RE_SetOverrideCamera(struct Render *re, struct Object *cam_ob);
308 /**
309  * Per render, there's one persistent view-plane. Parts will set their own view-planes.
310  *
311  * \note call this after #RE_InitState().
312  */
313 void RE_SetCamera(struct Render *re, struct Object *cam_ob);
314
315 /**
316  * Get current view and window transform.
317  */
318 void RE_GetViewPlane(struct Render *re, rctf *r_viewplane, rcti *r_disprect);
319
320 /**
321  * Set the render threads based on the command-line and auto-threads setting.
322  */
323 void RE_init_threadcount(Render *re);
324
325 bool RE_WriteRenderViewsImage(struct ReportList *reports,
326                               struct RenderResult *rr,
327                               struct Scene *scene,
328                               bool stamp,
329                               char *name);
330 bool RE_WriteRenderViewsMovie(struct ReportList *reports,
331                               struct RenderResult *rr,
332                               struct Scene *scene,
333                               struct RenderData *rd,
334                               struct bMovieHandle *mh,
335                               void **movie_ctx_arr,
336                               int totvideos,
337                               bool preview);
338
339 /**
340  * Only #RE_NewRender() needed, main Blender render calls.
341  *
342  * General Blender frame render call.
343  */
344 void RE_RenderFrame(struct Render *re,
345                     struct Main *bmain,
346                     struct Scene *scene,
347                     struct ViewLayer *single_layer,
348                     struct Object *camera_override,
349                     int frame,
350                     bool write_still);
351 /**
352  * Saves images to disk.
353  */
354 void RE_RenderAnim(struct Render *re,
355                    struct Main *bmain,
356                    struct Scene *scene,
357                    struct ViewLayer *single_layer,
358                    struct Object *camera_override,
359                    int sfra,
360                    int efra,
361                    int tfra);
362 #ifdef WITH_FREESTYLE
363 void RE_RenderFreestyleStrokes(struct Render *re,
364                                struct Main *bmain,
365                                struct Scene *scene,
366                                int render);
367 void RE_RenderFreestyleExternal(struct Render *re);
368 #endif
369
370 void RE_SetActiveRenderView(struct Render *re, const char *viewname);
371 const char *RE_GetActiveRenderView(struct Render *re);
372
373 /**
374  * Error reporting.
375  */
376 void RE_SetReports(struct Render *re, struct ReportList *reports);
377
378 /**
379  * Main preview render call.
380  */
381 void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
382
383 /**
384  * Only the temp file!
385  */
386 bool RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
387 /**
388  * Called from the UI and render pipeline, to save multi-layer and multi-view
389  * images, optionally isolating a specific, view, layer or RGBA/Z pass.
390  */
391 bool RE_WriteRenderResult(struct ReportList *reports,
392                           RenderResult *rr,
393                           const char *filename,
394                           struct ImageFormatData *imf,
395                           const char *view,
396                           int layer);
397 struct RenderResult *RE_MultilayerConvert(
398     void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty);
399
400 /* Display and event callbacks. */
401
402 /**
403  * Image and movie output has to move to either imbuf or kernel.
404  */
405 void RE_display_init_cb(struct Render *re,
406                         void *handle,
407                         void (*f)(void *handle, RenderResult *rr));
408 void RE_display_clear_cb(struct Render *re,
409                          void *handle,
410                          void (*f)(void *handle, RenderResult *rr));
411 void RE_display_update_cb(struct Render *re,
412                           void *handle,
413                           void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
414 void RE_stats_draw_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
415 void RE_progress_cb(struct Render *re, void *handle, void (*f)(void *handle, float));
416 void RE_draw_lock_cb(struct Render *re, void *handle, void (*f)(void *handle, bool lock));
417 void RE_test_break_cb(struct Render *re, void *handle, int (*f)(void *handle));
418 void RE_current_scene_update_cb(struct Render *re,
419                                 void *handle,
420                                 void (*f)(void *handle, struct Scene *scene));
421
422 void RE_gl_context_create(Render *re);
423 void RE_gl_context_destroy(Render *re);
424 void *RE_gl_context_get(Render *re);
425 void *RE_gpu_context_get(Render *re);
426
427 /**
428  * \param x: ranges from -1 to 1.
429  *
430  * TODO: Should move to kernel once... still unsure on how/where.
431  */
432 float RE_filter_value(int type, float x);
433
434 int RE_seq_render_active(struct Scene *scene, struct RenderData *rd);
435
436 /**
437  * Used in the interface to decide whether to show layers or passes.
438  */
439 bool RE_layers_have_name(struct RenderResult *result);
440 bool RE_passes_have_name(struct RenderLayer *rl);
441
442 struct RenderPass *RE_pass_find_by_name(volatile struct RenderLayer *rl,
443                                         const char *name,
444                                         const char *viewname);
445 /**
446  * Only provided for API compatibility, don't use this in new code!
447  */
448 struct RenderPass *RE_pass_find_by_type(volatile struct RenderLayer *rl,
449                                         int passtype,
450                                         const char *viewname);
451
452 /* shaded view or baking options */
453 #define RE_BAKE_NORMALS 0
454 #define RE_BAKE_DISPLACEMENT 1
455 #define RE_BAKE_AO 2
456
457 void RE_GetCameraWindow(struct Render *re, struct Object *camera, float mat[4][4]);
458 /**
459  * Must be called after #RE_GetCameraWindow(), does not change `re->winmat`.
460  */
461 void RE_GetCameraWindowWithOverscan(struct Render *re, float overscan, float r_winmat[4][4]);
462 void RE_GetCameraModelMatrix(struct Render *re, struct Object *camera, float r_modelmat[4][4]);
463
464 struct Scene *RE_GetScene(struct Render *re);
465 void RE_SetScene(struct Render *re, struct Scene *sce);
466
467 bool RE_is_rendering_allowed(struct Scene *scene,
468                              struct ViewLayer *single_layer,
469                              struct Object *camera_override,
470                              struct ReportList *reports);
471
472 bool RE_allow_render_generic_object(struct Object *ob);
473
474 /******* defined in render_result.c *********/
475
476 bool RE_HasCombinedLayer(RenderResult *res);
477 bool RE_HasFloatPixels(RenderResult *res);
478 bool RE_RenderResult_is_stereo(RenderResult *res);
479 struct RenderView *RE_RenderViewGetById(struct RenderResult *rr, int view_id);
480 struct RenderView *RE_RenderViewGetByName(struct RenderResult *rr, const char *viewname);
481
482 RenderResult *RE_DuplicateRenderResult(RenderResult *rr);
483
484 #ifdef __cplusplus
485 }
486 #endif