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