=bmesh= merge from trunk at r36529
[blender.git] / source / blender / render / intern / source / pipeline.c
index 5f3c473d41d4ea6dc27b0fbb450627f947760678..72ec9bd6613c69446faf138a474a8d548953da21 100644 (file)
@@ -1991,6 +1991,7 @@ static void merge_renderresult_fields(RenderResult *rr, RenderResult *rr1, Rende
 /* interleaves 2 frames */
 static void do_render_fields_3d(Render *re)
 {
+       Object *camera= RE_GetCamera(re);
        RenderResult *rr1, *rr2= NULL;
        
        /* no render result was created, we can safely halve render y */
@@ -2002,7 +2003,7 @@ static void do_render_fields_3d(Render *re)
        re->i.curfield= 1;      /* stats */
        
        /* first field, we have to call camera routine for correct aspect and subpixel offset */
-       RE_SetCamera(re, re->scene->camera);
+       RE_SetCamera(re, camera);
        if(re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE)==0)
                do_render_blur_3d(re);
        else
@@ -2022,7 +2023,7 @@ static void do_render_fields_3d(Render *re)
                if((re->r.mode & R_FIELDSTILL)==0) {
                        re->field_offs = 0.5f;
                }
-               RE_SetCamera(re, re->scene->camera);
+               RE_SetCamera(re, camera);
                if(re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE)==0)
                        do_render_blur_3d(re);
                else
@@ -2097,8 +2098,9 @@ static void load_backbuffer(Render *re)
 /* main render routine, no compositing */
 static void do_render_fields_blur_3d(Render *re)
 {
+       Object *camera= RE_GetCamera(re);
        /* also check for camera here */
-       if(re->scene->camera==NULL) {
+       if(camera == NULL) {
                printf("ERROR: Cannot render, no camera\n");
                G.afbreek= 1;
                return;
@@ -2109,7 +2111,7 @@ static void do_render_fields_blur_3d(Render *re)
                load_backbuffer(re);
 
        /* now use renderdata and camera to set viewplane */
-       RE_SetCamera(re, re->scene->camera);
+       RE_SetCamera(re, camera);
        
        if(re->r.mode & R_FIELDS)
                do_render_fields_3d(re);
@@ -2170,7 +2172,9 @@ static void render_scene(Render *re, Scene *sce, int cfra)
        int winx= re->winx, winy= re->winy;
        
        sce->r.cfra= cfra;
-               
+
+       scene_camera_switch_update(sce);
+
        /* exception: scene uses own size (unfinished code) */
        if(0) {
                winx= (sce->r.size*sce->r.xsch)/100;
@@ -2475,14 +2479,13 @@ static void do_render_composite_fields_blur_3d(Render *re)
        re->display_draw(re->ddh, re->result, NULL);
 }
 
-static void renderresult_stampinfo(Scene *scene)
+static void renderresult_stampinfo(Render *re)
 {
        RenderResult rres;
-       Render *re= RE_GetRender(scene->id.name);
 
        /* this is the basic trick to get the displayed float or char rect from render result */
        RE_AcquireResultImage(re, &rres);
-       BKE_stamp_buf(scene, (unsigned char *)rres.rect32, rres.rectf, rres.rectx, rres.recty, 4);
+       BKE_stamp_buf(re->scene, RE_GetCamera(re), (unsigned char *)rres.rect32, rres.rectf, rres.rectx, rres.recty, 4);
        RE_ReleaseResultImage(re);
 }
 
@@ -2641,16 +2644,16 @@ static void do_render_all_options(Render *re)
        
        /* stamp image info here */
        if((re->r.stamp & R_STAMP_ALL) && (re->r.stamp & R_STAMP_DRAW)) {
-               renderresult_stampinfo(re->scene);
+               renderresult_stampinfo(re);
                re->display_draw(re->ddh, re->result, NULL);
        }
 }
 
-static int check_valid_camera(Scene *scene)
+static int check_valid_camera(Scene *scene, Object *camera_override)
 {
        int check_comp= 1;
 
-       if (scene->camera == NULL)
+       if (camera_override == NULL && scene->camera == NULL)
                scene->camera= scene_find_camera(scene);
 
        if(scene->r.scemode&R_DOSEQ) {
@@ -2695,24 +2698,18 @@ static int check_valid_camera(Scene *scene)
 
                                node= node->next;
                        }
-               } else return scene->camera != NULL;
+               } else {
+                       return (camera_override != NULL || scene->camera != NULL);
+               }
        }
 
        return 1;
 }
 
-int RE_is_rendering_allowed(Scene *scene, void *erh, void (*error)(void *handle, const char *str))
+int RE_is_rendering_allowed(Scene *scene, Object *camera_override, void *erh, void (*error)(void *handle, const char *str))
 {
        SceneRenderLayer *srl;
        
-       /* forbidden combinations */
-       if(scene->r.mode & R_PANORAMA) {
-               if(scene->r.mode & R_ORTHO) {
-                       error(erh, "No Ortho render possible for Panorama");
-                       return 0;
-               }
-       }
-       
        if(scene->r.mode & R_BORDER) {
                if(scene->r.border.xmax <= scene->r.border.xmin ||
                   scene->r.border.ymax <= scene->r.border.ymin) {
@@ -2770,11 +2767,22 @@ int RE_is_rendering_allowed(Scene *scene, void *erh, void (*error)(void *handle,
        }
        
         /* check valid camera, without camera render is OK (compo, seq) */
-       if(!check_valid_camera(scene)) {
+       if(!check_valid_camera(scene, camera_override)) {
                error(erh, "No camera");
                return 0;
        }
        
+       /* get panorama & ortho, only after camera is set */
+       object_camera_mode(&scene->r, camera_override ? camera_override : scene->camera);
+
+       /* forbidden combinations */
+       if(scene->r.mode & R_PANORAMA) {
+               if(scene->r.mode & R_ORTHO) {
+                       error(erh, "No Ortho render possible for Panorama");
+                       return 0;
+               }
+       }
+
        /* layer flag tests */
        if(scene->r.scemode & R_SINGLE_LAYER) {
                srl= BLI_findlink(&scene->r.layers, scene->r.actlay);
@@ -2826,7 +2834,7 @@ static void update_physics_cache(Render *re, Scene *scene, int UNUSED(anim_init)
        BKE_ptcache_bake(&baker);
 }
 /* evaluating scene options for general Blender render */
-static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int anim, int anim_init)
+static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, Object *camera_override, unsigned int lay, int anim, int anim_init)
 {
        int winx, winy;
        rcti disprect;
@@ -2854,6 +2862,7 @@ static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, Sc
        
        re->main= bmain;
        re->scene= scene;
+       re->camera_override= camera_override;
        re->lay= lay;
        
        /* not too nice, but it survives anim-border render */
@@ -2894,14 +2903,14 @@ static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, Sc
 }
 
 /* general Blender frame render call */
-void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int frame, const short write_still)
+void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, Object *camera_override, unsigned int lay, int frame, const short write_still)
 {
        /* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */
        G.rendering= 1;
        
        scene->r.cfra= frame;
        
-       if(render_initialize_from_main(re, bmain, scene, srl, lay, 0, 0)) {
+       if(render_initialize_from_main(re, bmain, scene, srl, camera_override, lay, 0, 0)) {
                MEM_reset_peak_memory();
                do_render_all_options(re);
 
@@ -2928,6 +2937,7 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, R
 {
        char name[FILE_MAX];
        RenderResult rres;
+       Object *camera= RE_GetCamera(re);
        int ok= 1;
        
        RE_AcquireResultImage(re, &rres);
@@ -2982,7 +2992,7 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, R
                                }
                        }
 
-                       ok= BKE_write_ibuf(scene, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
+                       ok= BKE_write_ibuf_stamp(scene, camera, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
                        
                        if(ok==0) {
                                printf("Render error: cannot save %s\n", name);
@@ -2995,7 +3005,7 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, R
                                        name[strlen(name)-4]= 0;
                                BKE_add_image_extension(name, R_JPEG90);
                                ibuf->depth= 24; 
-                               BKE_write_ibuf(scene, ibuf, name, R_JPEG90, scene->r.subimtype, scene->r.quality);
+                               BKE_write_ibuf_stamp(scene, camera, ibuf, name, R_JPEG90, scene->r.subimtype, scene->r.quality);
                                printf("\nSaved: %s", name);
                        }
                        
@@ -3014,14 +3024,14 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, R
 }
 
 /* saves images to disk */
-void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int sfra, int efra, int tfra, ReportList *reports)
+void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_override, unsigned int lay, int sfra, int efra, int tfra, ReportList *reports)
 {
        bMovieHandle *mh= BKE_get_movie_handle(scene->r.imtype);
        int cfrao= scene->r.cfra;
        int nfra;
        
        /* do not fully call for each frame, it initializes & pops output window */
-       if(!render_initialize_from_main(re, bmain, scene, NULL, lay, 0, 1))
+       if(!render_initialize_from_main(re, bmain, scene, NULL, camera_override, lay, 0, 1))
                return;
        
        /* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
@@ -3054,7 +3064,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int
                        char name[FILE_MAX];
                        
                        /* only border now, todo: camera lens. (ton) */
-                       render_initialize_from_main(re, bmain, scene, NULL, lay, 1, 0);
+                       render_initialize_from_main(re, bmain, scene, NULL, camera_override, lay, 1, 0);
 
                        if(nfra!=scene->r.cfra) {
                                /*
@@ -3127,6 +3137,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int
 
 void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
 {
+       Object *camera;
        int winx, winy;
 
        winx= (sce->r.size*sce->r.xsch)/100;
@@ -3138,7 +3149,8 @@ void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
        re->scene = sce;
        re->lay = sce->lay;
 
-       RE_SetCamera(re, sce->camera);
+       camera = RE_GetCamera(re);
+       RE_SetCamera(re, camera);
 
        do_render_3d(re);
 }