Workspace: Move engines to workspace and Properties Editor cleanup
[blender.git] / source / blender / render / extern / include / RE_pipeline.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version. 
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2006 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file RE_pipeline.h
29  *  \ingroup render
30  */
31
32 #ifndef __RE_PIPELINE_H__
33 #define __RE_PIPELINE_H__
34
35 #include "DNA_listBase.h"
36 #include "DNA_vec_types.h"
37
38 struct bMovieHandle;
39 struct bNodeTree;
40 struct Depsgraph;
41 struct EvaluationContext;
42 struct Image;
43 struct ImageFormatData;
44 struct Main;
45 struct NodeBlurData;
46 struct Object;
47 struct RenderData;
48 struct RenderResult;
49 struct ReportList;
50 struct Scene;
51 struct SceneRenderLayer;
52 struct EnvMap;
53 struct StampData;
54 struct ViewRender;
55
56 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
57 /* this include is what is exposed of render to outside world */
58 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
59
60 /* length of the scene name + passname */
61 #define RE_MAXNAME      ((MAX_ID_NAME - 2) + 10)
62
63 /* only used as handle */
64 typedef struct Render Render;
65
66 /* Render Result usage:
67  *
68  * - render engine allocates/frees and delivers raw floating point rects
69  * - right now it's full rects, but might become tiles or file
70  * - the display client has to allocate display rects, sort out what to display,
71  *   and how it's converted
72  */
73
74 typedef struct RenderView {
75         struct RenderView *next, *prev;
76         char name[64];          /* EXR_VIEW_MAXNAME */
77
78         /* if this exists, result of composited layers */
79         float *rectf;
80         /* if this exists, result of composited layers */
81         float *rectz;
82         /* optional, 32 bits version of picture, used for sequencer, ogl render and image curves */
83         int *rect32;
84
85 } RenderView;
86
87 typedef struct RenderPass {
88         struct RenderPass *next, *prev;
89         int channels;
90         char name[64];          /* amount defined in openexr_multi.h */
91         char chan_id[8];        /* amount defined in openexr_multi.h */
92         float *rect;
93         int rectx, recty;
94
95         char fullname[64]; /* EXR_PASS_MAXNAME */
96         char view[64];          /* EXR_VIEW_MAXNAME */
97         int view_id;    /* quick lookup */
98
99         int pad;
100 } RenderPass;
101
102
103 /* a renderlayer is a full image, but with all passes and samples */
104 /* size of the rects is defined in RenderResult */
105 /* after render, the Combined pass is in combined, for renderlayers read from files it is a real pass */
106 typedef struct RenderLayer {
107         struct RenderLayer *next, *prev;
108         
109         /* copy of RenderData */
110         char name[RE_MAXNAME];
111         unsigned int lay, lay_zmask, lay_exclude;
112         int layflag, passflag, pass_xor;
113         
114         struct Material *mat_override;
115         struct Group *light_override;
116
117         /* MULTIVIEW_TODO: acolrect and scolrect are not supported by multiview at the moment.
118          * If they are really required they should be in RenderView instead */
119
120         float *acolrect;        /* 4 float, optional transparent buffer, needs storage for display updates */
121         float *scolrect;        /* 4 float, optional strand buffer, needs storage for display updates */
122         int *display_buffer;    /* 4 char, optional color managed display buffer which is used when
123                                  * Save Buffer is enabled to display combined pass of the screen. */
124         int rectx, recty;
125
126         /* optional saved endresult on disk */
127         void *exrhandle;
128         
129         ListBase passes;
130         
131 } RenderLayer;
132
133 typedef struct RenderResult {
134         struct RenderResult *next, *prev;
135         
136         /* target image size */
137         int rectx, recty;
138         short crop, sample_nr;
139         
140         /* the following rect32, rectf and rectz buffers are for temporary storage only, for RenderResult structs
141          * created in #RE_AcquireResultImage - which do not have RenderView */
142
143         /* optional, 32 bits version of picture, used for ogl render and image curves */
144         int *rect32;
145         /* if this exists, a copy of one of layers, or result of composited layers */
146         float *rectf;
147         /* if this exists, a copy of one of layers, or result of composited layers */
148         float *rectz;
149         
150         /* coordinates within final image (after cropping) */
151         rcti tilerect;
152         /* offset to apply to get a border render in full image */
153         int xof, yof;
154         
155         /* the main buffers */
156         ListBase layers;
157         
158         /* multiView maps to a StringVector in OpenEXR */
159         ListBase views;  /* RenderView */
160
161         /* allowing live updates: */
162         volatile rcti renrect;
163         volatile RenderLayer *renlay;
164         
165         /* optional saved endresult on disk */
166         int do_exr_tile;
167         
168         /* for render results in Image, verify validity for sequences */
169         int framenr;
170
171         /* for acquire image, to indicate if it there is a combined layer */
172         int have_combined;
173
174         /* render info text */
175         char *text;
176         char *error;
177
178         struct StampData *stamp_data;
179 } RenderResult;
180
181
182 typedef struct RenderStats {
183         int cfra;
184         int totface, totvert, totstrand, tothalo, totlamp, totpart;
185         short curfield, curblur, curpart, partsdone, convertdone, curfsa;
186         bool localview;
187         double starttime, lastframetime;
188         const char *infostr, *statstr;
189         char scene_name[MAX_ID_NAME - 2];
190         float mem_used, mem_peak;
191 } RenderStats;
192
193 /* *********************** API ******************** */
194
195 /* the name is used as identifier, so elsewhere in blender the result can retrieved */
196 /* calling a new render with same name, frees automatic existing render */
197 struct Render *RE_NewRender(const char *name);
198 struct Render *RE_GetRender(const char *name);
199
200 struct Scene;
201 struct Render *RE_NewSceneRender(const struct Scene *scene);
202 struct Render *RE_GetSceneRender(const struct Scene *scene);
203
204 /* assign default dummy callbacks */
205 void RE_InitRenderCB(struct Render *re);
206
207 /* use free render as signal to do everything over (previews) */
208 void RE_FreeRender(struct Render *re);
209 /* only called on exit */
210 void RE_FreeAllRender(void);
211 /* Free memory used by persistent data.
212  * Invoked when loading new file.
213  */
214 void RE_FreeAllPersistentData(void);
215 /* only call on file load */
216 void RE_FreeAllRenderResults(void);
217 /* for external render engines that can keep persistent data */
218 void RE_FreePersistentData(void);
219
220 /* get results and statistics */
221 void RE_FreeRenderResult(struct RenderResult *rr);
222 struct RenderResult *RE_AcquireResultRead(struct Render *re);
223 struct RenderResult *RE_AcquireResultWrite(struct Render *re);
224 void RE_ReleaseResult(struct Render *re);
225 void RE_AcquireResultImageViews(struct Render *re, struct RenderResult *rr);
226 void RE_ReleaseResultImageViews(struct Render *re, struct RenderResult *rr);
227 void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr, const int view_id);
228 void RE_ReleaseResultImage(struct Render *re);
229 void RE_SwapResult(struct Render *re, struct RenderResult **rr);
230 struct RenderStats *RE_GetStats(struct Render *re);
231
232 void RE_ResultGet32(struct Render *re, unsigned int *rect);
233 void RE_AcquiredResultGet32(struct Render *re, struct RenderResult *result, unsigned int *rect, const int view_id);
234
235 void RE_render_result_rect_from_ibuf(
236         struct RenderResult *rr, struct RenderData *rd,
237         struct ImBuf *ibuf, const int view_id);
238
239 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
240 float *RE_RenderLayerGetPass(volatile struct RenderLayer *rl, const char *name, const char *viewname);
241
242 /* add passes for grease pencil */
243 struct RenderPass *RE_create_gp_pass(struct RenderResult *rr, const char *layername, const char *viewname);
244
245 /* obligatory initialize call, disprect is optional */
246 void RE_InitState(struct Render *re, struct Render *source, struct RenderData *rd,
247                   struct ViewRender *view_render, struct SceneRenderLayer *srl,
248                   int winx, int winy, 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 *camera);
255 void RE_SetCamera(struct Render *re, struct Object *camera);
256 void RE_SetDepsgraph(struct Render *re, struct Depsgraph *graph);
257 void RE_SetEnvmapCamera(struct Render *re, struct Object *cam_ob, float viewscale, float clipsta, float clipend);
258 void RE_SetWindow(struct Render *re, const rctf *viewplane, float clipsta, float clipend);
259 void RE_SetOrtho(struct Render *re, const rctf *viewplane, float clipsta, float clipend);
260 void RE_SetPixelSize(struct Render *re, float pixsize);
261
262 /* option to set viewmatrix before making dbase */
263 void RE_SetView(struct Render *re, float mat[4][4]);
264
265 /* get current view and window transform */
266 void RE_GetView(struct Render *re, float mat[4][4]);
267 void RE_GetViewPlane(struct Render *re, rctf *r_viewplane, rcti *r_disprect);
268
269 /* make or free the dbase */
270 void RE_Database_FromScene(
271         struct Render *re, struct Main *bmain, struct Scene *scene,
272         unsigned int lay, int use_camera_view);
273 void RE_Database_Preprocess(struct Render *re);
274 void RE_Database_Free(struct Render *re);
275
276 /* project dbase again, when viewplane/perspective changed */
277 void RE_DataBase_ApplyWindow(struct Render *re);
278 /* rotate scene again, for incremental render */
279 void RE_DataBase_IncrementalView(struct Render *re, float viewmat[4][4], int restore);
280
281 /* set the render threads based on the commandline and autothreads setting */
282 void RE_init_threadcount(Render *re);
283
284 /* the main processor, assumes all was set OK! */
285 void RE_TileProcessor(struct Render *re);
286
287 bool RE_WriteRenderViewsImage(
288         struct ReportList *reports, struct RenderResult *rr, struct Scene *scene, const bool stamp, char *name);
289 bool RE_WriteRenderViewsMovie(
290         struct ReportList *reports, struct RenderResult *rr, struct Scene *scene, struct RenderData *rd,
291         struct bMovieHandle *mh, void **movie_ctx_arr,
292         const int totvideos, bool preview);
293
294 /* only RE_NewRender() needed, main Blender render calls */
295 void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene,
296                      struct SceneRenderLayer *srl, struct Object *camera_override,
297                      unsigned int lay_override, int frame, const bool write_still);
298 void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, struct Object *camera_override,
299                     unsigned int lay_override, int sfra, int efra, int tfra);
300 #ifdef WITH_FREESTYLE
301 void RE_RenderFreestyleStrokes(struct Render *re, struct Main *bmain, struct Scene *scene, int render);
302 void RE_RenderFreestyleExternal(struct Render *re);
303 #endif
304
305 void RE_SetActiveRenderView(struct Render *re, const char *viewname);
306 const char *RE_GetActiveRenderView(struct Render *re);
307
308 void RE_SetEngineByID(struct Render *re, const char *engine_id);
309
310 /* error reporting */
311 void RE_SetReports(struct Render *re, struct ReportList *reports);
312
313 /* main preview render call */
314 void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene, struct ViewRender *render_view);
315
316 bool RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
317 bool RE_WriteRenderResult(
318         struct ReportList *reports, RenderResult *rr, const char *filename,
319         struct ImageFormatData *imf, const bool multiview, const char *view);
320 struct RenderResult *RE_MultilayerConvert(
321         void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty);
322
323 extern const float default_envmap_layout[];
324 bool RE_WriteEnvmapResult(
325         struct ReportList *reports, struct Scene *scene, struct EnvMap *env,
326         const char *relpath, const char imtype, float layout[12]);
327
328 /* do a full sample buffer compo */
329 void RE_MergeFullSample(struct Render *re, struct Main *bmain, struct Scene *sce, struct bNodeTree *ntree);
330
331 /* display and event callbacks */
332 void RE_display_init_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
333 void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
334 void RE_display_update_cb(struct Render *re, void *handle, 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, void *handle, void (*f)(void *handle, struct Scene *scene));
340
341 /* should move to kernel once... still unsure on how/where */
342 float RE_filter_value(int type, float x);
343 /* vector blur zbuffer method */
344 void RE_zbuf_accumulate_vecblur(
345         struct NodeBlurData *nbd, int xsize, int ysize, float *newrect,
346         const float *imgrect, float *vecbufrect, const float *zbufrect);
347
348 int RE_seq_render_active(struct Scene *scene, struct RenderData *rd);
349
350 bool RE_layers_have_name(struct RenderResult *result);
351
352 struct RenderPass *RE_pass_find_by_name(volatile struct RenderLayer *rl, const char *name, const char *viewname);
353 struct RenderPass *RE_pass_find_by_type(volatile struct RenderLayer *rl, int passtype, const char *viewname);
354
355 /* shaded view or baking options */
356 #define RE_BAKE_LIGHT                           0       /* not listed in rna_scene.c -> can't be enabled! */
357 #define RE_BAKE_ALL                                     1
358 #define RE_BAKE_AO                                      2
359 #define RE_BAKE_NORMALS                         3
360 #define RE_BAKE_TEXTURE                         4
361 #define RE_BAKE_DISPLACEMENT            5
362 #define RE_BAKE_SHADOW                          6
363 #define RE_BAKE_SPEC_COLOR                      7
364 #define RE_BAKE_SPEC_INTENSITY          8
365 #define RE_BAKE_MIRROR_COLOR            9
366 #define RE_BAKE_MIRROR_INTENSITY        10
367 #define RE_BAKE_ALPHA                           11
368 #define RE_BAKE_EMIT                            12
369 #define RE_BAKE_DERIVATIVE                      13
370 #define RE_BAKE_VERTEX_COLORS           14
371
372 void RE_Database_Baking(
373         struct Render *re, struct Main *bmain, struct Scene *scene,
374         unsigned int lay, const int type, struct Object *actob);
375
376 void RE_DataBase_GetView(struct Render *re, float mat[4][4]);
377 void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[4][4]);
378 void RE_GetCameraModelMatrix(struct Render *re, struct Object *camera, float r_mat[4][4]);
379 struct Scene *RE_GetScene(struct Render *re);
380 struct EvaluationContext *RE_GetEvalCtx(struct Render *re);
381
382 bool RE_force_single_renderlayer(struct Scene *scene);
383 bool RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, struct ReportList *reports);
384
385 bool RE_allow_render_generic_object(struct Object *ob);
386
387 /* RE_updateRenderInstances flag */
388 enum {
389         RE_OBJECT_INSTANCES_UPDATE_VIEW  = (1 << 0),
390         RE_OBJECT_INSTANCES_UPDATE_OBMAT = (1 << 1)
391 };
392 void RE_updateRenderInstances(Render *re, int flag);
393
394 /******* defined in render_result.c *********/
395
396 bool RE_HasFakeLayer(RenderResult *res);
397 bool RE_RenderResult_is_stereo(RenderResult *res);
398 struct RenderView *RE_RenderViewGetById(struct RenderResult *res, const int view_id);
399 struct RenderView *RE_RenderViewGetByName(struct RenderResult *res, const char *viewname);
400
401 RenderResult *RE_DuplicateRenderResult(RenderResult *rr);
402
403 #endif /* __RE_PIPELINE_H__ */
404