Subsurface scattering:
[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., 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
37 struct Scene;
38 struct RenderData;
39 struct NodeBlurData;
40
41 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
42 /* this include is what is exposed of render to outside world */
43 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
44
45
46 #define RE_MAXNAME      32
47
48 /* only used as handle */
49 typedef struct Render Render;
50
51 /* Render Result usage:
52
53 - render engine allocates/frees and delivers raw floating point rects
54 - right now it's full rects, but might become tiles or file 
55 - the display client has to allocate display rects, sort out what to display, 
56   and how it's converted
57 */
58
59 typedef struct RenderPass {
60         struct RenderPass *next, *prev;
61         int passtype, channels;
62         char name[16];          /* amount defined in openexr_multi.h */
63         char chan_id[8];        /* amount defined in openexr_multi.h */
64         float *rect;
65 } RenderPass;
66
67 /* a renderlayer is a full image, but with all passes and samples */
68 /* size of the rects is defined in RenderResult */
69 /* after render, the Combined pass is in rectf, for renderlayers read from files it is a real pass */
70 typedef struct RenderLayer {
71         struct RenderLayer *next, *prev;
72         
73         /* copy of RenderData */
74         char name[RE_MAXNAME];          
75         unsigned int lay;                       
76         int layflag, passflag, pass_xor;                
77         
78         struct Material *mat_override;
79         struct Group *light_override;
80         
81         float *rectf;           /* 4 float, standard rgba buffer (read not above!) */
82         float *acolrect;        /* 4 float, optional transparent buffer, needs storage for display updates */
83         
84         ListBase passes;
85         
86 } RenderLayer;
87
88 typedef struct RenderResult {
89         
90         /* target image size */
91         int rectx, recty;
92         short crop, pad;
93         
94         /* optional, 32 bits version of picture, used for ogl render and image curves */
95         int *rect32;
96         /* if this exists, a copy of one of layers, or result of composited layers */
97         float *rectf;
98         /* if this exists, a copy of one of layers, or result of composited layers */
99         float *rectz;
100         
101         /* coordinates within final image (after cropping) */
102         rcti tilerect;
103         /* offset to apply to get a border render in full image */
104         int xof, yof;
105         
106         /* the main buffers */
107         ListBase layers;
108         
109         /* allowing live updates: */
110         volatile rcti renrect;
111         volatile RenderLayer *renlay;
112         
113         /* optional saved endresult on disk */
114         char exrfile[FILE_MAXDIR];
115         void *exrhandle;
116         
117         /* for render results in Image, verify validity for sequences */
118         int framenr;
119         
120 } RenderResult;
121
122 typedef struct RenderStats {
123         int totface, totvert, tothalo, totlamp, totpart;
124         short curfield, curblur, curpart, partsdone, convertdone;
125         double starttime, lastframetime;
126         char *infostr;
127         
128 } RenderStats;
129
130 /* *********************** API ******************** */
131
132 /* the name is used as identifier, so elsewhere in blender the result can retrieved */
133 /* calling a new render with same name, frees automatic existing render */
134 struct Render *RE_NewRender (const char *name);
135 struct Render *RE_GetRender(const char *name);
136
137 /* use free render as signal to do everything over (previews) */
138 void RE_FreeRender (struct Render *re);
139 /* only called on exit */
140 void RE_FreeAllRender (void);
141
142 /* get results and statistics */
143 void RE_FreeRenderResult(struct RenderResult *rr);
144 struct RenderResult *RE_GetResult(struct Render *re);
145 void RE_GetResultImage(struct Render *re, struct RenderResult *rr);
146 struct RenderStats *RE_GetStats(struct Render *re);
147 void RE_ResultGet32(struct Render *re, unsigned int *rect);
148 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
149 float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype);
150
151 /* obligatory initialize call, disprect is optional */
152 void RE_InitState (struct Render *re, struct RenderData *rd, int winx, int winy, rcti *disprect);
153
154 /* use this to change disprect of active render */
155 void RE_SetDispRect (struct Render *re, rcti *disprect);
156
157 /* set up the viewplane/perspective matrix, three choices */
158 void RE_SetCamera(struct Render *re, struct Object *camera);
159 void RE_SetWindow (struct Render *re, rctf *viewplane, float clipsta, float clipend);
160 void RE_SetOrtho (struct Render *re, rctf *viewplane, float clipsta, float clipend);
161
162 /* option to set viewmatrix before making dbase */
163 void RE_SetView (struct Render *re, float mat[][4]);
164
165 /* make or free the dbase */
166 void RE_Database_FromScene(struct Render *re, struct Scene *scene, int use_camera_view);
167 void RE_Database_Free (struct Render *re);
168
169 /* project dbase again, when viewplane/perspective changed */
170 void RE_DataBase_ApplyWindow(struct Render *re);
171
172 /* override the scene setting for amount threads, commandline */
173 void RE_set_max_threads(int threads);
174
175 /* the main processor, assumes all was set OK! */
176 void RE_TileProcessor(struct Render *re, int firsttile, int threaded);
177
178 /* only RE_NewRender() needed, main Blender render calls */
179 void RE_BlenderFrame(struct Render *re, struct Scene *scene, int frame);
180 void RE_BlenderAnim(struct Render *re, struct Scene *scene, int sfra, int efra);
181
182 void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
183 void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress);
184 struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty);
185
186 /* ancient stars function... go away! */
187 void RE_make_stars(struct Render *re, void (*initfunc)(void),
188                                    void (*vertexfunc)(float*),  void (*termfunc)(void));
189
190 /* display and event callbacks */
191 void RE_display_init_cb (struct Render *re, void (*f)(RenderResult *rr));
192 void RE_display_clear_cb(struct Render *re, void (*f)(RenderResult *rr));
193 void RE_display_draw_cb (struct Render *re, void (*f)(RenderResult *rr, volatile struct rcti *rect));
194 void RE_stats_draw_cb   (struct Render *re, void (*f)(RenderStats *rs));
195 void RE_timecursor_cb   (struct Render *re, void (*f)(int));
196 void RE_test_break_cb   (struct Render *re, int (*f)(void));
197 void RE_test_return_cb  (struct Render *re, int (*f)(void));
198 void RE_error_cb                (struct Render *re, void (*f)(char *str));
199
200 /* should move to kernel once... still unsure on how/where */
201 float RE_filter_value(int type, float x);
202 /* vector blur zbuffer method */
203 void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, float *newrect, float *imgrect, float *vecbufrect, float *zbufrect);
204
205 /* shaded view or baking options */
206 #define RE_BAKE_LIGHT   0
207 #define RE_BAKE_ALL             1
208 #define RE_BAKE_AO              2
209 #define RE_BAKE_NORMALS 3
210 #define RE_BAKE_TEXTURE 4
211 void RE_Database_Baking(struct Render *re, struct Scene *scene, int type);
212
213 void RE_DataBase_GetView(struct Render *re, float mat[][4]);
214
215 #endif /* RE_PIPELINE_H */
216