|
Blender
V2.59
|
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