Cycles: svn merge -r36352:36495 https://svn.blender.org/svnroot/bf-blender/trunk...
[blender.git] / source / blender / render / extern / include / RE_pipeline.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2006 Blender Foundation.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 /** \file RE_pipeline.h
31  *  \ingroup render
32  */
33
34 #ifndef RE_PIPELINE_H
35 #define RE_PIPELINE_H
36
37 #include "DNA_listBase.h"
38 #include "DNA_vec_types.h"
39
40 struct bNodeTree;
41 struct Image;
42 struct Main;
43 struct NodeBlurData;
44 struct Object;
45 struct RenderData;
46 struct RenderResult;
47 struct ReportList;
48 struct Scene;
49 struct SceneRenderLayer;
50
51 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
52 /* this include is what is exposed of render to outside world */
53 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
54
55
56 #define RE_MAXNAME      32
57
58 /* only used as handle */
59 typedef struct Render Render;
60
61 /* Render Result usage:
62
63 - render engine allocates/frees and delivers raw floating point rects
64 - right now it's full rects, but might become tiles or file 
65 - the display client has to allocate display rects, sort out what to display, 
66   and how it's converted
67 */
68
69 typedef struct RenderPass {
70         struct RenderPass *next, *prev;
71         int passtype, channels;
72         char name[16];          /* amount defined in openexr_multi.h */
73         char chan_id[8];        /* amount defined in openexr_multi.h */
74         float *rect;
75         int rectx, recty;
76 } RenderPass;
77
78 /* a renderlayer is a full image, but with all passes and samples */
79 /* size of the rects is defined in RenderResult */
80 /* after render, the Combined pass is in rectf, for renderlayers read from files it is a real pass */
81 typedef struct RenderLayer {
82         struct RenderLayer *next, *prev;
83         
84         /* copy of RenderData */
85         char name[RE_MAXNAME];          
86         unsigned int lay, lay_zmask;
87         int layflag, passflag, pass_xor;                
88         
89         struct Material *mat_override;
90         struct Group *light_override;
91         
92         float *rectf;           /* 4 float, standard rgba buffer (read not above!) */
93         float *acolrect;        /* 4 float, optional transparent buffer, needs storage for display updates */
94         float *scolrect;        /* 4 float, optional strand buffer, needs storage for display updates */
95         int rectx, recty;
96         
97         ListBase passes;
98         
99 } RenderLayer;
100
101 typedef struct RenderResult {
102         struct RenderResult *next, *prev;
103         
104         /* target image size */
105         int rectx, recty;
106         short crop, sample_nr;
107         
108         /* optional, 32 bits version of picture, used for ogl render and image curves */
109         int *rect32;
110         /* if this exists, a copy of one of layers, or result of composited layers */
111         float *rectf;
112         /* if this exists, a copy of one of layers, or result of composited layers */
113         float *rectz;
114         
115         /* coordinates within final image (after cropping) */
116         rcti tilerect;
117         /* offset to apply to get a border render in full image */
118         int xof, yof;
119         
120         /* the main buffers */
121         ListBase layers;
122         
123         /* allowing live updates: */
124         volatile rcti renrect;
125         volatile RenderLayer *renlay;
126         
127         /* optional saved endresult on disk */
128         void *exrhandle;
129         
130         /* for render results in Image, verify validity for sequences */
131         int framenr;
132
133         /* for acquire image, to indicate if it there is a combined layer */
134         int have_combined;
135
136         /* render info text */
137         char *text;
138         
139 } RenderResult;
140
141
142 typedef struct RenderStats {
143         int cfra;
144         int totface, totvert, totstrand, tothalo, totlamp, totpart;
145         short curfield, curblur, curpart, partsdone, convertdone;
146         double starttime, lastframetime;
147         const char *infostr, *statstr;
148         char scenename[32];
149         
150 } RenderStats;
151
152 /* *********************** API ******************** */
153
154 /* the name is used as identifier, so elsewhere in blender the result can retrieved */
155 /* calling a new render with same name, frees automatic existing render */
156 struct Render *RE_NewRender (const char *name);
157 struct Render *RE_GetRender(const char *name);
158
159 /* returns 1 while render is working (or renders called from within render) */
160 int RE_RenderInProgress(struct Render *re);
161
162 /* assign default dummy callbacks */
163 void RE_InitRenderCB(struct Render *re);
164
165 /* use free render as signal to do everything over (previews) */
166 void RE_FreeRender (struct Render *re);
167 /* only called on exit */
168 void RE_FreeAllRender (void);
169
170 /* get results and statistics */
171 void RE_FreeRenderResult(struct RenderResult *rr);
172 struct RenderResult *RE_AcquireResultRead(struct Render *re);
173 struct RenderResult *RE_AcquireResultWrite(struct Render *re);
174 void RE_ReleaseResult(struct Render *re);
175 void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr);
176 void RE_ReleaseResultImage(struct Render *re);
177 void RE_SwapResult(struct Render *re, struct RenderResult **rr);
178 struct RenderStats *RE_GetStats(struct Render *re);
179 void RE_ResultGet32(struct Render *re, unsigned int *rect);
180 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
181 float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype);
182
183 /* obligatory initialize call, disprect is optional */
184 void RE_InitState (struct Render *re, struct Render *source, struct RenderData *rd, struct SceneRenderLayer *srl, int winx, int winy, rcti *disprect);
185
186 /* use this to change disprect of active render */
187 void RE_SetDispRect (struct Render *re, rcti *disprect);
188
189 /* set up the viewplane/perspective matrix, three choices */
190 struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */
191 void RE_SetCamera(struct Render *re, struct Object *camera);
192 void RE_SetWindow (struct Render *re, rctf *viewplane, float clipsta, float clipend);
193 void RE_SetOrtho (struct Render *re, rctf *viewplane, float clipsta, float clipend);
194 void RE_SetPixelSize(struct Render *re, float pixsize);
195
196 /* option to set viewmatrix before making dbase */
197 void RE_SetView (struct Render *re, float mat[][4]);
198
199 /* make or free the dbase */
200 void RE_Database_FromScene(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int use_camera_view);
201 void RE_Database_Free (struct Render *re);
202
203 /* project dbase again, when viewplane/perspective changed */
204 void RE_DataBase_ApplyWindow(struct Render *re);
205
206 /* override the scene setting for amount threads, commandline */
207 void RE_set_max_threads(int threads);
208
209 /* set the render threads based on the commandline and autothreads setting */
210 void RE_init_threadcount(Render *re);
211
212 /* the main processor, assumes all was set OK! */
213 void RE_TileProcessor(struct Render *re);
214
215 /* only RE_NewRender() needed, main Blender render calls */
216 void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, struct Object *camera_override, unsigned int lay, int frame, const short write_still);
217 void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, struct Object *camera_override, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports);
218
219 /* main preview render call */
220 void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
221
222 void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
223 void RE_WriteRenderResult(RenderResult *rr, const char *filename, int compress);
224 struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty);
225
226 /* do a full sample buffer compo */
227 void RE_MergeFullSample(struct Render *re, struct Main *bmain, struct Scene *sce, struct bNodeTree *ntree);
228
229 /* ancient stars function... go away! */
230 void RE_make_stars(struct Render *re, struct Scene *scenev3d, void (*initfunc)(void),
231                                    void (*vertexfunc)(float*),  void (*termfunc)(void));
232
233 /* display and event callbacks */
234 void RE_display_init_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
235 void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
236 void RE_display_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
237 void RE_stats_draw_cb   (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
238 void RE_progress_cb     (struct Render *re, void *handle, void (*f)(void *handle, float));
239 void RE_draw_lock_cb            (struct Render *re, void *handle, void (*f)(void *handle, int));
240 void RE_test_break_cb   (struct Render *re, void *handle, int (*f)(void *handle));
241 void RE_error_cb                (struct Render *re, void *handle, void (*f)(void *handle, const char *str));
242
243 /* should move to kernel once... still unsure on how/where */
244 float RE_filter_value(int type, float x);
245 /* vector blur zbuffer method */
246 void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, float *newrect, float *imgrect, float *vecbufrect, float *zbufrect);
247
248 /* shaded view or baking options */
249 #define RE_BAKE_LIGHT                   0
250 #define RE_BAKE_ALL                             1
251 #define RE_BAKE_AO                              2
252 #define RE_BAKE_NORMALS                 3
253 #define RE_BAKE_TEXTURE                 4
254 #define RE_BAKE_DISPLACEMENT    5
255 #define RE_BAKE_SHADOW                  6
256
257 void RE_Database_Baking(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int type, struct Object *actob);
258
259 void RE_DataBase_GetView(struct Render *re, float mat[][4]);
260 void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4]);
261 struct Scene *RE_GetScene(struct Render *re);
262
263 int RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, void *erh, void (*error)(void *handle, const char *str));
264
265 #endif /* RE_PIPELINE_H */
266