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