svn merge -r 22571:22800 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender-staging.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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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 #ifndef RE_PIPELINE_H
31 #define RE_PIPELINE_H
32
33 #include "DNA_listBase.h"
34 #include "DNA_vec_types.h"
35 #include "BKE_utildefines.h"
36 #include "RNA_types.h"
37
38 struct bNodeTree;
39 struct Image;
40 struct NodeBlurData;
41 struct Object;
42 struct ReportList;
43 struct RenderData;
44 struct RenderEngine;
45 struct RenderEngineType;
46 struct RenderResult;
47 struct Scene;
48
49 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
50 /* this include is what is exposed of render to outside world */
51 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
52
53
54 #define RE_MAXNAME      32
55
56 /* only used as handle */
57 typedef struct Render Render;
58
59 /* Render Result usage:
60
61 - render engine allocates/frees and delivers raw floating point rects
62 - right now it's full rects, but might become tiles or file 
63 - the display client has to allocate display rects, sort out what to display, 
64   and how it's converted
65 */
66
67 typedef struct RenderPass {
68         struct RenderPass *next, *prev;
69         int passtype, channels;
70         char name[16];          /* amount defined in openexr_multi.h */
71         char chan_id[8];        /* amount defined in openexr_multi.h */
72         float *rect;
73         int rectx, recty;
74 } RenderPass;
75
76 /* a renderlayer is a full image, but with all passes and samples */
77 /* size of the rects is defined in RenderResult */
78 /* after render, the Combined pass is in rectf, for renderlayers read from files it is a real pass */
79 typedef struct RenderLayer {
80         struct RenderLayer *next, *prev;
81         
82         /* copy of RenderData */
83         char name[RE_MAXNAME];          
84         unsigned int lay, lay_zmask;
85         int layflag, passflag, pass_xor;                
86         
87         struct Material *mat_override;
88         struct Group *light_override;
89         
90         float *rectf;           /* 4 float, standard rgba buffer (read not above!) */
91         float *acolrect;        /* 4 float, optional transparent buffer, needs storage for display updates */
92         float *scolrect;        /* 4 float, optional strand buffer, needs storage for display updates */
93         int rectx, recty;
94         
95         ListBase passes;
96         
97 } RenderLayer;
98
99 typedef struct RenderResult {
100         struct RenderResult *next, *prev;
101         
102         /* target image size */
103         int rectx, recty;
104         short crop, sample_nr;
105         
106         /* optional, 32 bits version of picture, used for ogl render and image curves */
107         int *rect32;
108         /* if this exists, a copy of one of layers, or result of composited layers */
109         float *rectf;
110         /* if this exists, a copy of one of layers, or result of composited layers */
111         float *rectz;
112         
113         /* coordinates within final image (after cropping) */
114         rcti tilerect;
115         /* offset to apply to get a border render in full image */
116         int xof, yof;
117         
118         /* the main buffers */
119         ListBase layers;
120         
121         /* allowing live updates: */
122         volatile rcti renrect;
123         volatile RenderLayer *renlay;
124         
125         /* optional saved endresult on disk */
126         void *exrhandle;
127         
128         /* for render results in Image, verify validity for sequences */
129         int framenr;
130         
131 } RenderResult;
132
133
134 typedef struct RenderStats {
135         int cfra;
136         int totface, totvert, totstrand, tothalo, totlamp, totpart;
137         short curfield, curblur, curpart, partsdone, convertdone;
138         double starttime, lastframetime;
139         char *infostr, *statstr, scenename[32];
140         
141 } RenderStats;
142
143 /* *********************** API ******************** */
144
145 /* the name is used as identifier, so elsewhere in blender the result can retrieved */
146 /* calling a new render with same name, frees automatic existing render */
147 struct Render *RE_NewRender (const char *name);
148 struct Render *RE_GetRender(const char *name);
149
150 /* returns 1 while render is working (or renders called from within render) */
151 int RE_RenderInProgress(struct Render *re);
152
153 /* use free render as signal to do everything over (previews) */
154 void RE_FreeRender (struct Render *re);
155 /* only called on exit */
156 void RE_FreeAllRender (void);
157
158 /* get results and statistics */
159 void RE_FreeRenderResult(struct RenderResult *rr);
160 struct RenderResult *RE_GetResult(struct Render *re);
161 void RE_GetResultImage(struct Render *re, struct RenderResult *rr);
162 struct RenderStats *RE_GetStats(struct Render *re);
163 void RE_ResultGet32(struct Render *re, unsigned int *rect);
164 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
165 float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype);
166
167 /* obligatory initialize call, disprect is optional */
168 void RE_InitState (struct Render *re, struct Render *source, struct RenderData *rd, int winx, int winy, rcti *disprect);
169
170 /* use this to change disprect of active render */
171 void RE_SetDispRect (struct Render *re, rcti *disprect);
172
173 /* set up the viewplane/perspective matrix, three choices */
174 void RE_SetCamera(struct Render *re, struct Object *camera);
175 void RE_SetWindow (struct Render *re, rctf *viewplane, float clipsta, float clipend);
176 void RE_SetOrtho (struct Render *re, rctf *viewplane, float clipsta, float clipend);
177 void RE_SetPixelSize(struct Render *re, float pixsize);
178
179 /* option to set viewmatrix before making dbase */
180 void RE_SetView (struct Render *re, float mat[][4]);
181
182 /* make or free the dbase */
183 void RE_Database_FromScene(struct Render *re, struct Scene *scene, int use_camera_view);
184 void RE_Database_Free (struct Render *re);
185
186 /* project dbase again, when viewplane/perspective changed */
187 void RE_DataBase_ApplyWindow(struct Render *re);
188
189 /* override the scene setting for amount threads, commandline */
190 void RE_set_max_threads(int threads);
191
192 /* set the render threads based on the commandline and autothreads setting */
193 void RE_init_threadcount(Render *re);
194
195 /* the main processor, assumes all was set OK! */
196 void RE_TileProcessor(struct Render *re, int firsttile, int threaded);
197
198 /* only RE_NewRender() needed, main Blender render calls */
199 void RE_BlenderFrame(struct Render *re, struct Scene *scene, int frame);
200 void RE_BlenderAnim(struct Render *re, struct Scene *scene, int sfra, int efra, int tfra);
201
202 void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
203 void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress);
204 struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty);
205
206 /* do a full sample buffer compo */
207 void RE_MergeFullSample(struct Render *re, struct Scene *sce, struct bNodeTree *ntree);
208
209 /* ancient stars function... go away! */
210 void RE_make_stars(struct Render *re, struct Scene *scenev3d, void (*initfunc)(void),
211                                    void (*vertexfunc)(float*),  void (*termfunc)(void));
212
213 /* display and event callbacks */
214 void RE_display_init_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
215 void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
216 void RE_display_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
217 void RE_stats_draw_cb   (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
218 void RE_timecursor_cb   (struct Render *re, void *handle, void (*f)(void *handle, int));
219 void RE_test_break_cb   (struct Render *re, void *handle, int (*f)(void *handle));
220 void RE_error_cb                (struct Render *re, void *handle, void (*f)(void *handle, char *str));
221
222 /* should move to kernel once... still unsure on how/where */
223 float RE_filter_value(int type, float x);
224 /* vector blur zbuffer method */
225 void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, float *newrect, float *imgrect, float *vecbufrect, float *zbufrect);
226
227 /* shaded view or baking options */
228 #define RE_BAKE_LIGHT                   0
229 #define RE_BAKE_ALL                             1
230 #define RE_BAKE_AO                              2
231 #define RE_BAKE_NORMALS                 3
232 #define RE_BAKE_TEXTURE                 4
233 #define RE_BAKE_DISPLACEMENT    5
234 #define RE_BAKE_SHADOW                  6
235
236 void RE_Database_Baking(struct Render *re, struct Scene *scene, int type, struct Object *actob);
237
238 void RE_DataBase_GetView(struct Render *re, float mat[][4]);
239 void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4]);
240 struct Scene *RE_GetScene(struct Render *re);
241
242 /* External Engine */
243
244 #define RE_INTERNAL             1
245 #define RE_GAME                 2
246
247 extern ListBase R_engines;
248
249 typedef struct RenderEngineType {
250         struct RenderEngineType *next, *prev;
251
252         /* type info */
253         char idname[32];
254         char name[32];
255         int flag;
256
257         void (*render)(struct RenderEngine *engine, struct Scene *scene);
258
259         /* RNA integration */
260         ExtensionRNA ext;
261 } RenderEngineType;
262
263 typedef struct RenderEngine {
264         RenderEngineType *type;
265         struct Render *re;
266         ListBase fullresult;
267 } RenderEngine;
268
269 void RE_layer_load_from_file(RenderLayer *layer, struct ReportList *reports, char *filename);
270 void RE_result_load_from_file(RenderResult *result, struct ReportList *reports, char *filename);
271
272 struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h);
273 void RE_engine_update_result(RenderEngine *engine, struct RenderResult *result);
274 void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result);
275
276 int RE_engine_test_break(RenderEngine *engine);
277 void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info);
278
279 void RE_engines_init(void);
280 void RE_engines_exit(void);
281
282 #endif /* RE_PIPELINE_H */
283