Blender  V2.59
RE_pipeline.h
Go to the documentation of this file.
00001 /*
00002  * $Id: RE_pipeline.h 37969 2011-06-30 01:40:20Z campbellbarton $
00003  *
00004  * ***** BEGIN GPL LICENSE BLOCK *****
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License
00008  * as published by the Free Software Foundation; either version 2
00009  * of the License, or (at your option) any later version. 
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software Foundation,
00018  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019  *
00020  * The Original Code is Copyright (C) 2006 Blender Foundation.
00021  * All rights reserved.
00022  *
00023  * The Original Code is: all of this file.
00024  *
00025  * Contributor(s): none yet.
00026  *
00027  * ***** END GPL LICENSE BLOCK *****
00028  */
00029 
00034 #ifndef RE_PIPELINE_H
00035 #define RE_PIPELINE_H
00036 
00037 #include "DNA_listBase.h"
00038 #include "DNA_vec_types.h"
00039 #include "RNA_types.h"
00040 
00041 struct bNodeTree;
00042 struct Image;
00043 struct Main;
00044 struct NodeBlurData;
00045 struct Object;
00046 struct RenderData;
00047 struct RenderEngine;
00048 struct RenderEngineType;
00049 struct RenderResult;
00050 struct ReportList;
00051 struct ReportList;
00052 struct Scene;
00053 struct SceneRenderLayer;
00054 
00055 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
00056 /* this include is what is exposed of render to outside world */
00057 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
00058 
00059 
00060 #define RE_MAXNAME      32
00061 
00062 /* only used as handle */
00063 typedef struct Render Render;
00064 
00065 /* Render Result usage:
00066 
00067 - render engine allocates/frees and delivers raw floating point rects
00068 - right now it's full rects, but might become tiles or file 
00069 - the display client has to allocate display rects, sort out what to display, 
00070   and how it's converted
00071 */
00072 
00073 typedef struct RenderPass {
00074         struct RenderPass *next, *prev;
00075         int passtype, channels;
00076         char name[16];          /* amount defined in openexr_multi.h */
00077         char chan_id[8];        /* amount defined in openexr_multi.h */
00078         float *rect;
00079         int rectx, recty;
00080 } RenderPass;
00081 
00082 /* a renderlayer is a full image, but with all passes and samples */
00083 /* size of the rects is defined in RenderResult */
00084 /* after render, the Combined pass is in rectf, for renderlayers read from files it is a real pass */
00085 typedef struct RenderLayer {
00086         struct RenderLayer *next, *prev;
00087         
00088         /* copy of RenderData */
00089         char name[RE_MAXNAME];          
00090         unsigned int lay, lay_zmask;
00091         int layflag, passflag, pass_xor;                
00092         
00093         struct Material *mat_override;
00094         struct Group *light_override;
00095         
00096         float *rectf;           /* 4 float, standard rgba buffer (read not above!) */
00097         float *acolrect;        /* 4 float, optional transparent buffer, needs storage for display updates */
00098         float *scolrect;        /* 4 float, optional strand buffer, needs storage for display updates */
00099         int rectx, recty;
00100         
00101         ListBase passes;
00102         
00103 } RenderLayer;
00104 
00105 typedef struct RenderResult {
00106         struct RenderResult *next, *prev;
00107         
00108         /* target image size */
00109         int rectx, recty;
00110         short crop, sample_nr;
00111         
00112         /* optional, 32 bits version of picture, used for ogl render and image curves */
00113         int *rect32;
00114         /* if this exists, a copy of one of layers, or result of composited layers */
00115         float *rectf;
00116         /* if this exists, a copy of one of layers, or result of composited layers */
00117         float *rectz;
00118         
00119         /* coordinates within final image (after cropping) */
00120         rcti tilerect;
00121         /* offset to apply to get a border render in full image */
00122         int xof, yof;
00123         
00124         /* the main buffers */
00125         ListBase layers;
00126         
00127         /* allowing live updates: */
00128         volatile rcti renrect;
00129         volatile RenderLayer *renlay;
00130         
00131         /* optional saved endresult on disk */
00132         void *exrhandle;
00133         
00134         /* for render results in Image, verify validity for sequences */
00135         int framenr;
00136 
00137         /* for acquire image, to indicate if it there is a combined layer */
00138         int have_combined;
00139 
00140         /* render info text */
00141         char *text;
00142         
00143 } RenderResult;
00144 
00145 
00146 typedef struct RenderStats {
00147         int cfra;
00148         int totface, totvert, totstrand, tothalo, totlamp, totpart;
00149         short curfield, curblur, curpart, partsdone, convertdone, curfsa;
00150         double starttime, lastframetime;
00151         const char *infostr, *statstr;
00152         char scenename[32];
00153         
00154 } RenderStats;
00155 
00156 /* *********************** API ******************** */
00157 
00158 /* the name is used as identifier, so elsewhere in blender the result can retrieved */
00159 /* calling a new render with same name, frees automatic existing render */
00160 struct Render *RE_NewRender (const char *name);
00161 struct Render *RE_GetRender(const char *name);
00162 
00163 /* returns 1 while render is working (or renders called from within render) */
00164 int RE_RenderInProgress(struct Render *re);
00165 
00166 /* assign default dummy callbacks */
00167 void RE_InitRenderCB(struct Render *re);
00168 
00169 /* use free render as signal to do everything over (previews) */
00170 void RE_FreeRender (struct Render *re);
00171 /* only called on exit */
00172 void RE_FreeAllRender (void);
00173 
00174 /* get results and statistics */
00175 void RE_FreeRenderResult(struct RenderResult *rr);
00176 struct RenderResult *RE_AcquireResultRead(struct Render *re);
00177 struct RenderResult *RE_AcquireResultWrite(struct Render *re);
00178 void RE_ReleaseResult(struct Render *re);
00179 void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr);
00180 void RE_ReleaseResultImage(struct Render *re);
00181 void RE_SwapResult(struct Render *re, struct RenderResult **rr);
00182 struct RenderStats *RE_GetStats(struct Render *re);
00183 void RE_ResultGet32(struct Render *re, unsigned int *rect);
00184 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
00185 float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype);
00186 
00187 /* obligatory initialize call, disprect is optional */
00188 void RE_InitState (struct Render *re, struct Render *source, struct RenderData *rd, struct SceneRenderLayer *srl, int winx, int winy, rcti *disprect);
00189 
00190 /* use this to change disprect of active render */
00191 void RE_SetDispRect (struct Render *re, rcti *disprect);
00192 
00193 /* set up the viewplane/perspective matrix, three choices */
00194 struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */
00195 void RE_SetCamera(struct Render *re, struct Object *camera);
00196 void RE_SetWindow (struct Render *re, rctf *viewplane, float clipsta, float clipend);
00197 void RE_SetOrtho (struct Render *re, rctf *viewplane, float clipsta, float clipend);
00198 void RE_SetPixelSize(struct Render *re, float pixsize);
00199 
00200 /* option to set viewmatrix before making dbase */
00201 void RE_SetView (struct Render *re, float mat[][4]);
00202 
00203 /* make or free the dbase */
00204 void RE_Database_FromScene(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int use_camera_view);
00205 void RE_Database_Free (struct Render *re);
00206 
00207 /* project dbase again, when viewplane/perspective changed */
00208 void RE_DataBase_ApplyWindow(struct Render *re);
00209 
00210 /* override the scene setting for amount threads, commandline */
00211 void RE_set_max_threads(int threads);
00212 
00213 /* set the render threads based on the commandline and autothreads setting */
00214 void RE_init_threadcount(Render *re);
00215 
00216 /* the main processor, assumes all was set OK! */
00217 void RE_TileProcessor(struct Render *re);
00218 
00219 /* only RE_NewRender() needed, main Blender render calls */
00220 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);
00221 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);
00222 
00223 /* error reporting */
00224 void RE_SetReports(struct Render *re, struct ReportList *reports);
00225 
00226 /* main preview render call */
00227 void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
00228 
00229 void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
00230 void RE_WriteRenderResult(RenderResult *rr, const char *filename, int compress);
00231 struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty);
00232 
00233 /* do a full sample buffer compo */
00234 void RE_MergeFullSample(struct Render *re, struct Main *bmain, struct Scene *sce, struct bNodeTree *ntree);
00235 
00236 /* ancient stars function... go away! */
00237 void RE_make_stars(struct Render *re, struct Scene *scenev3d, void (*initfunc)(void),
00238                                    void (*vertexfunc)(float*),  void (*termfunc)(void));
00239 
00240 /* display and event callbacks */
00241 void RE_display_init_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
00242 void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
00243 void RE_display_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
00244 void RE_stats_draw_cb   (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
00245 void RE_progress_cb     (struct Render *re, void *handle, void (*f)(void *handle, float));
00246 void RE_draw_lock_cb            (struct Render *re, void *handle, void (*f)(void *handle, int));
00247 void RE_test_break_cb   (struct Render *re, void *handle, int (*f)(void *handle));
00248 
00249 /* should move to kernel once... still unsure on how/where */
00250 float RE_filter_value(int type, float x);
00251 /* vector blur zbuffer method */
00252 void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, float *newrect, float *imgrect, float *vecbufrect, float *zbufrect);
00253 
00254 /* shaded view or baking options */
00255 #define RE_BAKE_LIGHT                           0       /* not listed in rna_scene.c -> can't be enabled! */
00256 #define RE_BAKE_ALL                                     1
00257 #define RE_BAKE_AO                                      2
00258 #define RE_BAKE_NORMALS                         3
00259 #define RE_BAKE_TEXTURE                         4
00260 #define RE_BAKE_DISPLACEMENT            5
00261 #define RE_BAKE_SHADOW                          6
00262 #define RE_BAKE_SPEC_COLOR                      7
00263 #define RE_BAKE_SPEC_INTENSITY          8
00264 #define RE_BAKE_MIRROR_COLOR            9
00265 #define RE_BAKE_MIRROR_INTENSITY        10
00266 #define RE_BAKE_ALPHA                           11
00267 #define RE_BAKE_EMIT                            12
00268 
00269 void RE_Database_Baking(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, const int type, struct Object *actob);
00270 
00271 void RE_DataBase_GetView(struct Render *re, float mat[][4]);
00272 void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4]);
00273 struct Scene *RE_GetScene(struct Render *re);
00274 
00275 /* External Engine */
00276 
00277 #define RE_INTERNAL                     1
00278 #define RE_GAME                         2
00279 #define RE_DO_PREVIEW           4
00280 #define RE_DO_ALL                       8
00281 
00282 extern ListBase R_engines;
00283 
00284 typedef struct RenderEngineType {
00285         struct RenderEngineType *next, *prev;
00286 
00287         /* type info */
00288         char idname[64]; // best keep the same size as BKE_ST_MAXNAME
00289         char name[64];
00290         int flag;
00291 
00292         void (*render)(struct RenderEngine *engine, struct Scene *scene);
00293 
00294         /* RNA integration */
00295         ExtensionRNA ext;
00296 } RenderEngineType;
00297 
00298 typedef struct RenderEngine {
00299         RenderEngineType *type;
00300         struct Render *re;
00301         ListBase fullresult;
00302 } RenderEngine;
00303 
00304 void RE_layer_load_from_file(RenderLayer *layer, struct ReportList *reports, const char *filename, int x, int y);
00305 void RE_result_load_from_file(RenderResult *result, struct ReportList *reports, const char *filename);
00306 
00307 struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h);
00308 void RE_engine_update_result(RenderEngine *engine, struct RenderResult *result);
00309 void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result);
00310 
00311 int RE_engine_test_break(RenderEngine *engine);
00312 void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info);
00313 void RE_engine_report(RenderEngine *engine, int type, const char *msg);
00314 
00315 void RE_engines_init(void);
00316 void RE_engines_exit(void);
00317 
00318 int RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, struct ReportList *reports);
00319 
00320 #endif /* RE_PIPELINE_H */
00321