Proof-of-concept implementation of Freestyle support for Cycles.
[blender-staging.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 bNodeTree;
39 struct Image;
40 struct Main;
41 struct NodeBlurData;
42 struct Object;
43 struct RenderData;
44 struct RenderResult;
45 struct ReportList;
46 struct Scene;
47 struct SceneRenderLayer;
48 struct EnvMap;
49
50 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
51 /* this include is what is exposed of render to outside world */
52 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
53
54 /* length of the scene name + passname */
55 #define RE_MAXNAME      ((MAX_ID_NAME - 2) + 10)
56
57 /* only used as handle */
58 typedef struct Render Render;
59
60 /* Render Result usage:
61  *
62  * - render engine allocates/frees and delivers raw floating point rects
63  * - right now it's full rects, but might become tiles or file
64  * - the display client has to allocate display rects, sort out what to display,
65  *   and how it's converted
66  */
67
68 typedef struct RenderPass {
69         struct RenderPass *next, *prev;
70         int passtype, channels;
71         char name[64];          /* amount defined in openexr_multi.h */
72         char chan_id[8];        /* amount defined in openexr_multi.h */
73         float *rect;
74         int rectx, recty;
75 } RenderPass;
76
77 /* a renderlayer is a full image, but with all passes and samples */
78 /* size of the rects is defined in RenderResult */
79 /* after render, the Combined pass is in rectf, for renderlayers read from files it is a real pass */
80 typedef struct RenderLayer {
81         struct RenderLayer *next, *prev;
82         
83         /* copy of RenderData */
84         char name[RE_MAXNAME];
85         unsigned int lay, lay_zmask, lay_exclude;
86         int layflag, passflag, pass_xor;
87         
88         struct Material *mat_override;
89         struct Group *light_override;
90         
91         float *rectf;           /* 4 float, standard rgba buffer (read not above!) */
92         float *acolrect;        /* 4 float, optional transparent buffer, needs storage for display updates */
93         float *scolrect;        /* 4 float, optional strand buffer, needs storage for display updates */
94         int *display_buffer;    /* 4 char, optional color managed display buffer which is used when
95                                  * Save Buffer is enabled to display combined pass of the screen. */
96         int rectx, recty;
97
98         /* optional saved endresult on disk */
99         void *exrhandle;
100         
101         ListBase passes;
102         
103 } RenderLayer;
104
105 typedef struct RenderResult {
106         struct RenderResult *next, *prev;
107         
108         /* target image size */
109         int rectx, recty;
110         short crop, sample_nr;
111         
112         /* optional, 32 bits version of picture, used for ogl render and image curves */
113         int *rect32;
114         /* if this exists, a copy of one of layers, or result of composited layers */
115         float *rectf;
116         /* if this exists, a copy of one of layers, or result of composited layers */
117         float *rectz;
118         
119         /* coordinates within final image (after cropping) */
120         rcti tilerect;
121         /* offset to apply to get a border render in full image */
122         int xof, yof;
123         
124         /* the main buffers */
125         ListBase layers;
126         
127         /* allowing live updates: */
128         volatile rcti renrect;
129         volatile RenderLayer *renlay;
130         
131         /* optional saved endresult on disk */
132         int do_exr_tile;
133         
134         /* for render results in Image, verify validity for sequences */
135         int framenr;
136
137         /* for acquire image, to indicate if it there is a combined layer */
138         int have_combined;
139
140         /* render info text */
141         char *text;
142         
143 } RenderResult;
144
145
146 typedef struct RenderStats {
147         int cfra;
148         int totface, totvert, totstrand, tothalo, totlamp, totpart;
149         short curfield, curblur, curpart, partsdone, convertdone, curfsa;
150         bool localview;
151         double starttime, lastframetime;
152         const char *infostr, *statstr;
153         char scene_name[MAX_ID_NAME - 2];
154         float mem_used, mem_peak;
155 } RenderStats;
156
157 /* *********************** API ******************** */
158
159 /* the name is used as identifier, so elsewhere in blender the result can retrieved */
160 /* calling a new render with same name, frees automatic existing render */
161 struct Render *RE_NewRender(const char *name);
162 struct Render *RE_GetRender(const char *name);
163
164 /* assign default dummy callbacks */
165 void RE_InitRenderCB(struct Render *re);
166
167 /* use free render as signal to do everything over (previews) */
168 void RE_FreeRender(struct Render *re);
169 /* only called on exit */
170 void RE_FreeAllRender(void);
171 /* only call on file load */
172 void RE_FreeAllRenderResults(void);
173 /* for external render engines that can keep persistent data */
174 void RE_FreePersistentData(void);
175
176 /* get results and statistics */
177 void RE_FreeRenderResult(struct RenderResult *rr);
178 struct RenderResult *RE_AcquireResultRead(struct Render *re);
179 struct RenderResult *RE_AcquireResultWrite(struct Render *re);
180 void RE_ReleaseResult(struct Render *re);
181 void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr);
182 void RE_ReleaseResultImage(struct Render *re);
183 void RE_SwapResult(struct Render *re, struct RenderResult **rr);
184 struct RenderStats *RE_GetStats(struct Render *re);
185
186 void RE_ResultGet32(struct Render *re, unsigned int *rect);
187 void RE_AcquiredResultGet32(struct Render *re, struct RenderResult *result, unsigned int *rect);
188
189 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
190 float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype);
191
192 /* obligatory initialize call, disprect is optional */
193 void RE_InitState(struct Render *re, struct Render *source, struct RenderData *rd,
194                   struct SceneRenderLayer *srl,
195                   int winx, int winy, rcti *disprect);
196 void RE_ChangeResolution(struct Render *re, int winx, int winy, rcti *disprect);
197
198 /* set up the viewplane/perspective matrix, three choices */
199 struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */
200 void RE_SetCamera(struct Render *re, struct Object *camera);
201 void RE_SetEnvmapCamera(struct Render *re, struct Object *cam_ob, float viewscale, float clipsta, float clipend);
202 void RE_SetWindow(struct Render *re, rctf *viewplane, float clipsta, float clipend);
203 void RE_SetOrtho(struct Render *re, rctf *viewplane, float clipsta, float clipend);
204 void RE_SetPixelSize(struct Render *re, float pixsize);
205
206 /* option to set viewmatrix before making dbase */
207 void RE_SetView(struct Render *re, float mat[4][4]);
208
209 /* get current view and window transform */
210 void RE_GetView(struct Render *re, float mat[4][4]);
211 void RE_GetViewPlane(struct Render *re, rctf *viewplane, rcti *disprect);
212
213 /* make or free the dbase */
214 void RE_Database_FromScene(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int use_camera_view);
215 void RE_Database_Preprocess(struct Render *re);
216 void RE_Database_Free(struct Render *re);
217
218 /* project dbase again, when viewplane/perspective changed */
219 void RE_DataBase_ApplyWindow(struct Render *re);
220 /* rotate scene again, for incremental render */
221 void RE_DataBase_IncrementalView(struct Render *re, float viewmat[4][4], int restore);
222
223 /* set the render threads based on the commandline and autothreads setting */
224 void RE_init_threadcount(Render *re);
225
226 /* the main processor, assumes all was set OK! */
227 void RE_TileProcessor(struct Render *re);
228
229 /* only RE_NewRender() needed, main Blender render calls */
230 void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene,
231                      struct SceneRenderLayer *srl, struct Object *camera_override,
232                      unsigned int lay_override, int frame, const bool write_still);
233 void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, struct Object *camera_override,
234                     unsigned int lay_override, int sfra, int efra, int tfra);
235 #ifdef WITH_FREESTYLE
236 void RE_RenderFreestyleStrokes(struct Render *re, struct Main *bmain, struct Scene *scene, int render);
237 void RE_RenderFreestyleExternal(struct Render *re);
238 #endif
239
240 /* error reporting */
241 void RE_SetReports(struct Render *re, struct ReportList *reports);
242
243 /* main preview render call */
244 void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
245
246 bool RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
247 bool RE_WriteRenderResult(struct ReportList *reports, RenderResult *rr, const char *filename, int compress);
248 struct RenderResult *RE_MultilayerConvert(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty);
249
250 extern const float default_envmap_layout[];
251 bool RE_WriteEnvmapResult(struct ReportList *reports, struct Scene *scene, struct EnvMap *env, const char *relpath, const char imtype, float layout[12]);
252
253 /* do a full sample buffer compo */
254 void RE_MergeFullSample(struct Render *re, struct Main *bmain, struct Scene *sce, struct bNodeTree *ntree);
255
256 /* display and event callbacks */
257 void RE_display_init_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
258 void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
259 void RE_display_update_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
260 void RE_stats_draw_cb   (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
261 void RE_progress_cb     (struct Render *re, void *handle, void (*f)(void *handle, float));
262 void RE_draw_lock_cb            (struct Render *re, void *handle, void (*f)(void *handle, int));
263 void RE_test_break_cb   (struct Render *re, void *handle, int (*f)(void *handle));
264 void RE_current_scene_update_cb(struct Render *re, void *handle, void (*f)(void *handle, struct Scene *scene));
265
266 /* should move to kernel once... still unsure on how/where */
267 float RE_filter_value(int type, float x);
268 /* vector blur zbuffer method */
269 void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, float *newrect, float *imgrect, float *vecbufrect, float *zbufrect);
270
271 int RE_seq_render_active(struct Scene *scene, struct RenderData *rd);
272
273 /* shaded view or baking options */
274 #define RE_BAKE_LIGHT                           0       /* not listed in rna_scene.c -> can't be enabled! */
275 #define RE_BAKE_ALL                                     1
276 #define RE_BAKE_AO                                      2
277 #define RE_BAKE_NORMALS                         3
278 #define RE_BAKE_TEXTURE                         4
279 #define RE_BAKE_DISPLACEMENT            5
280 #define RE_BAKE_SHADOW                          6
281 #define RE_BAKE_SPEC_COLOR                      7
282 #define RE_BAKE_SPEC_INTENSITY          8
283 #define RE_BAKE_MIRROR_COLOR            9
284 #define RE_BAKE_MIRROR_INTENSITY        10
285 #define RE_BAKE_ALPHA                           11
286 #define RE_BAKE_EMIT                            12
287 #define RE_BAKE_DERIVATIVE                      13
288 #define RE_BAKE_VERTEX_COLORS           14
289
290 void RE_Database_Baking(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, const int type, struct Object *actob);
291
292 void RE_DataBase_GetView(struct Render *re, float mat[4][4]);
293 void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[4][4]);
294 struct Scene *RE_GetScene(struct Render *re);
295
296 bool RE_force_single_renderlayer(struct Scene *scene);
297 bool RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, struct ReportList *reports);
298
299 bool RE_allow_render_generic_object(struct Object *ob);
300
301 #endif /* __RE_PIPELINE_H__ */
302