Multi-View and Stereo 3D
[blender-staging.git] / source / blender / render / extern / include / RE_pipeline.h
index 2bcd39ab71ba238dd826f7fe8069cb5916d7c8ee..2a07246eaba505b9f9701f2645429f568d145b8e 100644 (file)
 #include "DNA_listBase.h"
 #include "DNA_vec_types.h"
 
+struct bMovieHandle;
 struct bNodeTree;
 struct Image;
+struct ImageFormatData;
 struct Main;
 struct NodeBlurData;
 struct Object;
@@ -46,6 +48,7 @@ struct ReportList;
 struct Scene;
 struct SceneRenderLayer;
 struct EnvMap;
+struct RenderResult;
 
 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 /* this include is what is exposed of render to outside world */
@@ -65,18 +68,41 @@ typedef struct Render Render;
  *   and how it's converted
  */
 
+typedef struct RenderView {
+       struct RenderView *next, *prev;
+       char name[64];          /* EXR_VIEW_MAXNAME */
+
+       /* if this exists, result of composited layers */
+       float *rectf;
+       /* if this exists, result of composited layers */
+       float *rectz;
+       /* optional, 32 bits version of picture, used for sequencer, ogl render and image curves */
+       int *rect32;
+
+} RenderView;
+
 typedef struct RenderPass {
        struct RenderPass *next, *prev;
        int passtype, channels;
-       char name[16];          /* amount defined in openexr_multi.h */
+       char name[64];          /* amount defined in openexr_multi.h */
        char chan_id[8];        /* amount defined in openexr_multi.h */
        float *rect;
        int rectx, recty;
+
+       char internal_name[64]; /* EXR_PASS_MAXNAME */
+       char view[64];          /* EXR_VIEW_MAXNAME */
+       int view_id;    /* quick lookup */
+
+       int debug_type;
 } RenderPass;
 
+enum {
+       RENDER_PASS_DEBUG_BVH_TRAVERSAL_STEPS = 0,
+};
+
 /* a renderlayer is a full image, but with all passes and samples */
 /* size of the rects is defined in RenderResult */
-/* after render, the Combined pass is in rectf, for renderlayers read from files it is a real pass */
+/* after render, the Combined pass is in combined, for renderlayers read from files it is a real pass */
 typedef struct RenderLayer {
        struct RenderLayer *next, *prev;
        
@@ -87,10 +113,14 @@ typedef struct RenderLayer {
        
        struct Material *mat_override;
        struct Group *light_override;
-       
-       float *rectf;           /* 4 float, standard rgba buffer (read not above!) */
+
+       /* MULTIVIEW_TODO: acolrect and scolrect are not supported by multiview at the moment.
+        * If they are really required they should be in RenderView instead */
+
        float *acolrect;        /* 4 float, optional transparent buffer, needs storage for display updates */
        float *scolrect;        /* 4 float, optional strand buffer, needs storage for display updates */
+       int *display_buffer;    /* 4 char, optional color managed display buffer which is used when
+                                * Save Buffer is enabled to display combined pass of the screen. */
        int rectx, recty;
 
        /* optional saved endresult on disk */
@@ -122,6 +152,9 @@ typedef struct RenderResult {
        /* the main buffers */
        ListBase layers;
        
+       /* multiView maps to a StringVector in OpenEXR */
+       ListBase views;
+
        /* allowing live updates: */
        volatile rcti renrect;
        volatile RenderLayer *renlay;
@@ -137,7 +170,7 @@ typedef struct RenderResult {
 
        /* render info text */
        char *text;
-       
+       char *error;
 } RenderResult;
 
 
@@ -145,6 +178,7 @@ typedef struct RenderStats {
        int cfra;
        int totface, totvert, totstrand, tothalo, totlamp, totpart;
        short curfield, curblur, curpart, partsdone, convertdone, curfsa;
+       bool localview;
        double starttime, lastframetime;
        const char *infostr, *statstr;
        char scene_name[MAX_ID_NAME - 2];
@@ -155,12 +189,9 @@ typedef struct RenderStats {
 
 /* the name is used as identifier, so elsewhere in blender the result can retrieved */
 /* calling a new render with same name, frees automatic existing render */
-struct Render *RE_NewRender (const char *name);
+struct Render *RE_NewRender(const char *name);
 struct Render *RE_GetRender(const char *name);
 
-/* returns 1 while render is working (or renders called from within render) */
-int RE_RenderInProgress(struct Render *re);
-
 /* assign default dummy callbacks */
 void RE_InitRenderCB(struct Render *re);
 
@@ -178,19 +209,29 @@ void RE_FreeRenderResult(struct RenderResult *rr);
 struct RenderResult *RE_AcquireResultRead(struct Render *re);
 struct RenderResult *RE_AcquireResultWrite(struct Render *re);
 void RE_ReleaseResult(struct Render *re);
-void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr);
+void RE_AcquireResultImageViews(struct Render *re, struct RenderResult *rr);
+void RE_ReleaseResultImageViews(struct Render *re, struct RenderResult *rr);
+void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr, const int view_id);
 void RE_ReleaseResultImage(struct Render *re);
 void RE_SwapResult(struct Render *re, struct RenderResult **rr);
 struct RenderStats *RE_GetStats(struct Render *re);
+
 void RE_ResultGet32(struct Render *re, unsigned int *rect);
+void RE_AcquiredResultGet32(struct Render *re, struct RenderResult *result, unsigned int *rect, const int view_id);
+
 struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
-float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype);
+float *RE_RenderLayerGetPass(volatile struct RenderLayer *rl, int passtype, const char *viewname);
 
 /* obligatory initialize call, disprect is optional */
-void RE_InitState(struct Render *re, struct Render *source, struct RenderData *rd, struct SceneRenderLayer *srl, int winx, int winy, rcti *disprect);
+void RE_InitState(struct Render *re, struct Render *source, struct RenderData *rd,
+                  struct SceneRenderLayer *srl,
+                  int winx, int winy, rcti *disprect);
+void RE_ChangeResolution(struct Render *re, int winx, int winy, rcti *disprect);
+void RE_ChangeModeFlag(struct Render *re, int flag, bool clear);
 
 /* set up the viewplane/perspective matrix, three choices */
 struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */
+void RE_SetOverrideCamera(struct Render *re, struct Object *camera);
 void RE_SetCamera(struct Render *re, struct Object *camera);
 void RE_SetEnvmapCamera(struct Render *re, struct Object *cam_ob, float viewscale, float clipsta, float clipend);
 void RE_SetWindow(struct Render *re, rctf *viewplane, float clipsta, float clipend);
@@ -200,15 +241,19 @@ void RE_SetPixelSize(struct Render *re, float pixsize);
 /* option to set viewmatrix before making dbase */
 void RE_SetView(struct Render *re, float mat[4][4]);
 
+/* get current view and window transform */
+void RE_GetView(struct Render *re, float mat[4][4]);
+void RE_GetViewPlane(struct Render *re, rctf *viewplane, rcti *disprect);
+
 /* make or free the dbase */
 void RE_Database_FromScene(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int use_camera_view);
+void RE_Database_Preprocess(struct Render *re);
 void RE_Database_Free(struct Render *re);
 
 /* project dbase again, when viewplane/perspective changed */
 void RE_DataBase_ApplyWindow(struct Render *re);
-
-/* override the scene setting for amount threads, commandline */
-void RE_set_max_threads(int threads);
+/* rotate scene again, for incremental render */
+void RE_DataBase_IncrementalView(struct Render *re, float viewmat[4][4], int restore);
 
 /* set the render threads based on the commandline and autothreads setting */
 void RE_init_threadcount(Render *re);
@@ -216,41 +261,50 @@ void RE_init_threadcount(Render *re);
 /* the main processor, assumes all was set OK! */
 void RE_TileProcessor(struct Render *re);
 
+bool RE_WriteRenderViewsImage(struct ReportList *reports, struct RenderResult *rr, struct Scene *scene, struct Object *camera, const bool stamp, char *name);
+bool RE_WriteRenderViewsMovie(struct ReportList *reports, struct RenderResult *rr, struct Scene *scene, struct RenderData *rd,
+                              struct bMovieHandle *mh, const size_t width, const size_t height, void **movie_ctx_arr,
+                              const size_t totvideos);
+
 /* only RE_NewRender() needed, main Blender render calls */
-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);
-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);
+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 bool write_still);
+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);
 #ifdef WITH_FREESTYLE
-void RE_RenderFreestyleStrokes(struct Render *re, struct Main *bmain, struct Scene *scene);
+void RE_RenderFreestyleStrokes(struct Render *re, struct Main *bmain, struct Scene *scene, int render);
+void RE_RenderFreestyleExternal(struct Render *re);
 #endif
 
+void RE_SetActiveRenderView(struct Render *re, const char *viewname);
+const char *RE_GetActiveRenderView(struct Render *re);
+
 /* error reporting */
 void RE_SetReports(struct Render *re, struct ReportList *reports);
 
 /* main preview render call */
 void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
 
-int RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
-int RE_WriteRenderResult(struct ReportList *reports, RenderResult *rr, const char *filename, int compress);
-struct RenderResult *RE_MultilayerConvert(void *exrhandle, const char *colorspace, int predivide, int rectx, int recty);
+bool RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
+bool RE_WriteRenderResult(struct ReportList *reports, RenderResult *rr, const char *filename, struct ImageFormatData *imf, const bool multiview, const char *view);
+struct RenderResult *RE_MultilayerConvert(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty);
 
 extern const float default_envmap_layout[];
-int RE_WriteEnvmapResult(struct ReportList *reports, struct Scene *scene, struct EnvMap *env, const char *relpath, const char imtype, float layout[12]);
+bool RE_WriteEnvmapResult(struct ReportList *reports, struct Scene *scene, struct EnvMap *env, const char *relpath, const char imtype, float layout[12]);
 
 /* do a full sample buffer compo */
 void RE_MergeFullSample(struct Render *re, struct Main *bmain, struct Scene *sce, struct bNodeTree *ntree);
 
-/* ancient stars function... go away! */
-void RE_make_stars(struct Render *re, struct Scene *scenev3d, void (*initfunc)(void),
-                   void (*vertexfunc)(float *),  void (*termfunc)(void));
-
 /* display and event callbacks */
 void RE_display_init_cb        (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
 void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
-void RE_display_draw_cb        (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
+void RE_display_update_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
 void RE_stats_draw_cb  (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
 void RE_progress_cb    (struct Render *re, void *handle, void (*f)(void *handle, float));
 void RE_draw_lock_cb           (struct Render *re, void *handle, void (*f)(void *handle, int));
 void RE_test_break_cb  (struct Render *re, void *handle, int (*f)(void *handle));
+void RE_current_scene_update_cb(struct Render *re, void *handle, void (*f)(void *handle, struct Scene *scene));
 
 /* should move to kernel once... still unsure on how/where */
 float RE_filter_value(int type, float x);
@@ -259,6 +313,8 @@ void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize,
 
 int RE_seq_render_active(struct Scene *scene, struct RenderData *rd);
 
+bool RE_layers_have_name(struct RenderResult *result);
+
 /* shaded view or baking options */
 #define RE_BAKE_LIGHT                          0       /* not listed in rna_scene.c -> can't be enabled! */
 #define RE_BAKE_ALL                                    1
@@ -273,14 +329,31 @@ int RE_seq_render_active(struct Scene *scene, struct RenderData *rd);
 #define RE_BAKE_MIRROR_INTENSITY       10
 #define RE_BAKE_ALPHA                          11
 #define RE_BAKE_EMIT                           12
+#define RE_BAKE_DERIVATIVE                     13
+#define RE_BAKE_VERTEX_COLORS          14
 
 void RE_Database_Baking(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, const int type, struct Object *actob);
 
 void RE_DataBase_GetView(struct Render *re, float mat[4][4]);
 void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[4][4]);
+void RE_GetCameraModelMatrix(struct Render *re, struct Object *camera, float r_mat[4][4]);
 struct Scene *RE_GetScene(struct Render *re);
 
-int RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, struct ReportList *reports);
+bool RE_force_single_renderlayer(struct Scene *scene);
+bool RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, struct ReportList *reports);
+
+bool RE_allow_render_generic_object(struct Object *ob);
+
+/******* defined in render_result.c *********/
+
+bool RE_HasFakeLayer(RenderResult *res);
+bool RE_RenderResult_is_stereo(RenderResult *res);
+
+float *RE_RenderViewGetRectf(struct RenderResult *rr, const int view_id);
+float *RE_RenderViewGetRectz(struct RenderResult *rr, const int view_id);
+int   *RE_RenderViewGetRect32(struct RenderResult *rr, const int view_id);
+void   RE_RenderViewSetRectf(struct RenderResult *res, const int view_id, float *rect);
+void   RE_RenderViewSetRectz(struct RenderResult *res, const int view_id, float *rect);
 
 #endif /* __RE_PIPELINE_H__ */