2 * ***** BEGIN GPL LICENSE BLOCK *****
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.
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.
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.
18 * The Original Code is Copyright (C) 2006 Blender Foundation.
19 * All rights reserved.
21 * The Original Code is: all of this file.
23 * Contributor(s): none yet.
25 * ***** END GPL LICENSE BLOCK *****
28 /** \file RE_pipeline.h
32 #ifndef __RE_PIPELINE_H__
33 #define __RE_PIPELINE_H__
35 #include "DNA_listBase.h"
36 #include "DNA_vec_types.h"
47 struct SceneRenderLayer;
50 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
51 /* this include is what is exposed of render to outside world */
52 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
54 /* length of the scene name + passname */
55 #define RE_MAXNAME ((MAX_ID_NAME - 2) + 10)
57 /* only used as handle */
58 typedef struct Render Render;
60 /* Render Result usage:
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
68 typedef struct RenderPass {
69 struct RenderPass *next, *prev;
70 int passtype, channels;
71 char name[16]; /* amount defined in openexr_multi.h */
72 char chan_id[8]; /* amount defined in openexr_multi.h */
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;
83 /* copy of RenderData */
84 char name[RE_MAXNAME];
85 unsigned int lay, lay_zmask, lay_exclude;
86 int layflag, passflag, pass_xor;
88 struct Material *mat_override;
89 struct Group *light_override;
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 */
96 /* optional saved endresult on disk */
103 typedef struct RenderResult {
104 struct RenderResult *next, *prev;
106 /* target image size */
108 short crop, sample_nr;
110 /* optional, 32 bits version of picture, used for ogl render and image curves */
112 /* if this exists, a copy of one of layers, or result of composited layers */
114 /* if this exists, a copy of one of layers, or result of composited layers */
117 /* coordinates within final image (after cropping) */
119 /* offset to apply to get a border render in full image */
122 /* the main buffers */
125 /* allowing live updates: */
126 volatile rcti renrect;
127 volatile RenderLayer *renlay;
129 /* optional saved endresult on disk */
132 /* for render results in Image, verify validity for sequences */
135 /* for acquire image, to indicate if it there is a combined layer */
138 /* render info text */
144 typedef struct RenderStats {
146 int totface, totvert, totstrand, tothalo, totlamp, totpart;
147 short curfield, curblur, curpart, partsdone, convertdone, curfsa;
149 double starttime, lastframetime;
150 const char *infostr, *statstr;
151 char scene_name[MAX_ID_NAME - 2];
152 float mem_used, mem_peak;
155 /* *********************** API ******************** */
157 /* the name is used as identifier, so elsewhere in blender the result can retrieved */
158 /* calling a new render with same name, frees automatic existing render */
159 struct Render *RE_NewRender(const char *name);
160 struct Render *RE_GetRender(const char *name);
162 /* assign default dummy callbacks */
163 void RE_InitRenderCB(struct Render *re);
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 /* only call on file load */
170 void RE_FreeAllRenderResults(void);
171 /* for external render engines that can keep persistent data */
172 void RE_FreePersistentData(void);
174 /* get results and statistics */
175 void RE_FreeRenderResult(struct RenderResult *rr);
176 struct RenderResult *RE_AcquireResultRead(struct Render *re);
177 struct RenderResult *RE_AcquireResultWrite(struct Render *re);
178 void RE_ReleaseResult(struct Render *re);
179 void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr);
180 void RE_ReleaseResultImage(struct Render *re);
181 void RE_SwapResult(struct Render *re, struct RenderResult **rr);
182 struct RenderStats *RE_GetStats(struct Render *re);
184 void RE_ResultGet32(struct Render *re, unsigned int *rect);
185 void RE_AcquiredResultGet32(struct Render *re, struct RenderResult *result, unsigned int *rect);
187 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
188 float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype);
190 /* obligatory initialize call, disprect is optional */
191 void RE_InitState(struct Render *re, struct Render *source, struct RenderData *rd, struct SceneRenderLayer *srl, int winx, int winy, rcti *disprect);
193 /* set up the viewplane/perspective matrix, three choices */
194 struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */
195 void RE_SetCamera(struct Render *re, struct Object *camera);
196 void RE_SetEnvmapCamera(struct Render *re, struct Object *cam_ob, float viewscale, float clipsta, float clipend);
197 void RE_SetWindow(struct Render *re, rctf *viewplane, float clipsta, float clipend);
198 void RE_SetOrtho(struct Render *re, rctf *viewplane, float clipsta, float clipend);
199 void RE_SetPixelSize(struct Render *re, float pixsize);
201 /* option to set viewmatrix before making dbase */
202 void RE_SetView(struct Render *re, float mat[4][4]);
204 /* get current view and window transform */
205 void RE_GetView(struct Render *re, float mat[4][4]);
206 void RE_GetViewPlane(struct Render *re, rctf *viewplane, rcti *disprect);
208 /* make or free the dbase */
209 void RE_Database_FromScene(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int use_camera_view);
210 void RE_Database_Preprocess(struct Render *re);
211 void RE_Database_Free(struct Render *re);
213 /* project dbase again, when viewplane/perspective changed */
214 void RE_DataBase_ApplyWindow(struct Render *re);
215 /* rotate scene again, for incremental render */
216 void RE_DataBase_IncrementalView(struct Render *re, float viewmat[4][4], int restore);
218 /* override the scene setting for amount threads, commandline */
219 void RE_set_max_threads(int threads);
221 /* set the render threads based on the commandline and autothreads setting */
222 void RE_init_threadcount(Render *re);
224 /* the main processor, assumes all was set OK! */
225 void RE_TileProcessor(struct Render *re);
227 /* only RE_NewRender() needed, main Blender render calls */
228 void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, struct Object *camera_override, unsigned int lay_override, int frame, const short write_still);
229 void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, struct Object *camera_override, unsigned int lay_override, int sfra, int efra, int tfra);
230 #ifdef WITH_FREESTYLE
231 void RE_RenderFreestyleStrokes(struct Render *re, struct Main *bmain, struct Scene *scene, int render);
234 /* error reporting */
235 void RE_SetReports(struct Render *re, struct ReportList *reports);
237 /* main preview render call */
238 void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
240 int RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
241 int RE_WriteRenderResult(struct ReportList *reports, RenderResult *rr, const char *filename, int compress);
242 struct RenderResult *RE_MultilayerConvert(void *exrhandle, const char *colorspace, int predivide, int rectx, int recty);
244 extern const float default_envmap_layout[];
245 int RE_WriteEnvmapResult(struct ReportList *reports, struct Scene *scene, struct EnvMap *env, const char *relpath, const char imtype, float layout[12]);
247 /* do a full sample buffer compo */
248 void RE_MergeFullSample(struct Render *re, struct Main *bmain, struct Scene *sce, struct bNodeTree *ntree);
250 /* ancient stars function... go away! */
251 void RE_make_stars(struct Render *re, struct Scene *scenev3d, void (*initfunc)(void),
252 void (*vertexfunc)(float *), void (*termfunc)(void));
254 /* display and event callbacks */
255 void RE_display_init_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
256 void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
257 void RE_display_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
258 void RE_stats_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
259 void RE_progress_cb (struct Render *re, void *handle, void (*f)(void *handle, float));
260 void RE_draw_lock_cb (struct Render *re, void *handle, void (*f)(void *handle, int));
261 void RE_test_break_cb (struct Render *re, void *handle, int (*f)(void *handle));
263 /* should move to kernel once... still unsure on how/where */
264 float RE_filter_value(int type, float x);
265 /* vector blur zbuffer method */
266 void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, float *newrect, float *imgrect, float *vecbufrect, float *zbufrect);
268 int RE_seq_render_active(struct Scene *scene, struct RenderData *rd);
270 /* shaded view or baking options */
271 #define RE_BAKE_LIGHT 0 /* not listed in rna_scene.c -> can't be enabled! */
272 #define RE_BAKE_ALL 1
274 #define RE_BAKE_NORMALS 3
275 #define RE_BAKE_TEXTURE 4
276 #define RE_BAKE_DISPLACEMENT 5
277 #define RE_BAKE_SHADOW 6
278 #define RE_BAKE_SPEC_COLOR 7
279 #define RE_BAKE_SPEC_INTENSITY 8
280 #define RE_BAKE_MIRROR_COLOR 9
281 #define RE_BAKE_MIRROR_INTENSITY 10
282 #define RE_BAKE_ALPHA 11
283 #define RE_BAKE_EMIT 12
284 #define RE_BAKE_DERIVATIVE 13
285 #define RE_BAKE_VERTEX_COLORS 14
287 void RE_Database_Baking(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, const int type, struct Object *actob);
289 void RE_DataBase_GetView(struct Render *re, float mat[4][4]);
290 void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[4][4]);
291 struct Scene *RE_GetScene(struct Render *re);
293 int RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, struct ReportList *reports);
295 #endif /* __RE_PIPELINE_H__ */