add back support for rendering local view camera.
authorCampbell Barton <ideasman42@gmail.com>
Sat, 30 Apr 2011 04:29:36 +0000 (04:29 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 30 Apr 2011 04:29:36 +0000 (04:29 +0000)
source/blender/blenkernel/intern/sequencer.c
source/blender/editors/render/render_internal.c
source/blender/render/extern/include/RE_pipeline.h
source/blender/render/intern/include/render_types.h
source/blender/render/intern/source/convertblender.c
source/blender/render/intern/source/initrender.c
source/blender/render/intern/source/pipeline.c
source/creator/creator.c

index b2e6f52..a4d11c9 100644 (file)
@@ -1948,7 +1948,7 @@ static ImBuf * seq_render_scene_strip_impl(
                        if(re==NULL)
                                re= RE_NewRender(sce->id.name);
                        
-                       RE_BlenderFrame(re, context.bmain, sce, NULL, sce->lay, frame, FALSE);
+                       RE_BlenderFrame(re, context.bmain, sce, NULL, NULL, sce->lay, frame, FALSE);
 
                        /* restore previous state after it was toggled on & off by RE_BlenderFrame */
                        G.rendering = rendering;
index ce43441..3890eed 100644 (file)
@@ -421,6 +421,7 @@ static int screen_render_exec(bContext *C, wmOperator *op)
        unsigned int lay= (v3d)? v3d->lay: scene->lay;
        const short is_animation= RNA_boolean_get(op->ptr, "animation");
        const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
+       struct Object *camera_override= v3d ? V3D_CAMERA_LOCAL(v3d) : NULL;
 
        if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
                BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected.");
@@ -446,9 +447,9 @@ static int screen_render_exec(bContext *C, wmOperator *op)
        seq_stripelem_cache_cleanup();
 
        if(is_animation)
-               RE_BlenderAnim(re, mainp, scene, lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports);
+               RE_BlenderAnim(re, mainp, scene, camera_override, lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports);
        else
-               RE_BlenderFrame(re, mainp, scene, NULL, lay, scene->r.cfra, is_write_still);
+               RE_BlenderFrame(re, mainp, scene, NULL, camera_override, lay, scene->r.cfra, is_write_still);
 
        // no redraw needed, we leave state as we entered it
        ED_update_for_newframe(mainp, scene, CTX_wm_screen(C), 1);
@@ -464,6 +465,7 @@ typedef struct RenderJob {
        Render *re;
        wmWindow *win;
        SceneRenderLayer *srl;
+       struct Object *camera_override;
        int lay;
        short anim, write_still;
        Image *image;
@@ -590,9 +592,9 @@ static void render_startjob(void *rjv, short *stop, short *do_update, float *pro
        rj->progress= progress;
 
        if(rj->anim)
-               RE_BlenderAnim(rj->re, rj->main, rj->scene, rj->lay, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports);
+               RE_BlenderAnim(rj->re, rj->main, rj->scene, rj->camera_override, rj->lay, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports);
        else
-               RE_BlenderFrame(rj->re, rj->main, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra, rj->write_still);
+               RE_BlenderFrame(rj->re, rj->main, rj->scene, rj->srl, rj->camera_override, rj->lay, rj->scene->r.cfra, rj->write_still);
 }
 
 static void render_endjob(void *rjv)
@@ -679,12 +681,13 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
        int jobflag;
        const short is_animation= RNA_boolean_get(op->ptr, "animation");
        const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
+       struct Object *camera_override= v3d ? V3D_CAMERA_LOCAL(v3d) : NULL;
        
        /* only one render job at a time */
        if(WM_jobs_test(CTX_wm_manager(C), scene))
                return OPERATOR_CANCELLED;
 
-       if(!RE_is_rendering_allowed(scene, op->reports, render_error_reports)) {
+       if(!RE_is_rendering_allowed(scene, camera_override, op->reports, render_error_reports)) {
                return OPERATOR_CANCELLED;
        }
 
@@ -761,6 +764,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
        rj->scene= scene;
        rj->win= CTX_wm_window(C);
        rj->srl = srl;
+       rj->camera_override = camera_override;
        rj->lay = (v3d)? v3d->lay: scene->lay;
        rj->anim= is_animation;
        rj->write_still= is_write_still && !is_animation;
index 4cc3207..145d865 100644 (file)
@@ -191,6 +191,7 @@ void RE_InitState (struct Render *re, struct Render *source, struct RenderData *
 void RE_SetDispRect (struct Render *re, rcti *disprect);
 
 /* set up the viewplane/perspective matrix, three choices */
+struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */
 void RE_SetCamera(struct Render *re, struct Object *camera);
 void RE_SetWindow (struct Render *re, rctf *viewplane, float clipsta, float clipend);
 void RE_SetOrtho (struct Render *re, rctf *viewplane, float clipsta, float clipend);
@@ -216,8 +217,8 @@ void RE_init_threadcount(Render *re);
 void RE_TileProcessor(struct Render *re);
 
 /* only RE_NewRender() needed, main Blender render calls */
-void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame, const short write_still);
-void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports);
+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, struct ReportList *reports);
 
 /* main preview render call */
 void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
@@ -305,7 +306,7 @@ void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char
 void RE_engines_init(void);
 void RE_engines_exit(void);
 
-int RE_is_rendering_allowed(struct Scene *scene, void *erh, void (*error)(void *handle, const char *str));
+int RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, void *erh, void (*error)(void *handle, const char *str));
 
 #endif /* RE_PIPELINE_H */
 
index 672b508..fd5ea7c 100644 (file)
@@ -182,6 +182,7 @@ struct Render
        Scene *scene;
        RenderData r;
        World wrld;
+       struct Object *camera_override;
        unsigned int lay;
        
        ListBase parts;
index 523dd12..b7b97d8 100644 (file)
@@ -164,7 +164,8 @@ void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void),
        World *wrld= NULL;
        HaloRen *har;
        Scene *scene;
-       Camera *camera;
+       Object *camera= re ? RE_GetCamera(re) : scene->camera;
+       Camera *cam;
        double dblrand, hlfrand;
        float vec[4], fx, fy, fz;
        float fac, starmindist, clipend;
@@ -205,11 +206,11 @@ void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void),
                * y = -z | +z
                */
 
-       if(scene->camera==NULL || scene->camera->type != OB_CAMERA)
+       if(camera==NULL || camera->type != OB_CAMERA)
                return;
 
-       camera = scene->camera->data;
-       clipend = camera->clipend;
+       cam = camera->data;
+       clipend = cam->clipend;
        
        /* convert to grid coordinates */
        
@@ -1676,7 +1677,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
                bb.align = part->bb_align;
                bb.anim = part->bb_anim;
                bb.lock = part->draw & PART_DRAW_BB_LOCK;
-               bb.ob = (part->bb_ob ? part->bb_ob : re->scene->camera);
+               bb.ob = (part->bb_ob ? part->bb_ob : RE_GetCamera(re));
                bb.offset[0] = part->bb_offset[0];
                bb.offset[1] = part->bb_offset[1];
                bb.split_offset = part->bb_split_offset;
@@ -4979,6 +4980,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l
        Scene *sce;
        float mat[4][4];
        float amb[3];
+       Object *camera= RE_GetCamera(re);
 
        re->main= bmain;
        re->scene= scene;
@@ -5008,16 +5010,16 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l
                scene_update_for_newframe(re->main, re->scene, lay);
        
        /* if no camera, viewmat should have been set! */
-       if(use_camera_view && re->scene->camera) {
+       if(use_camera_view && camera) {
                /* called before but need to call again incase of lens animation from the
                 * above call to scene_update_for_newframe, fixes bug. [#22702].
                 * following calls dont depend on 'RE_SetCamera' */
-               RE_SetCamera(re, scene->camera);
+               RE_SetCamera(re, camera);
 
-               normalize_m4(re->scene->camera->obmat);
-               invert_m4_m4(mat, re->scene->camera->obmat);
+               normalize_m4(camera->obmat);
+               invert_m4_m4(mat, camera->obmat);
                RE_SetView(re, mat);
-               re->scene->camera->recalc= OB_RECALC_OB; /* force correct matrix for scaled cameras */
+               camera->recalc= OB_RECALC_OB; /* force correct matrix for scaled cameras */
        }
        
        init_render_world(re);  /* do first, because of ambient. also requires re->osa set correct */
@@ -5142,6 +5144,7 @@ void RE_DataBase_GetView(Render *re, float mat[][4])
 
 static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int lay, int timeoffset)
 {
+       Object *camera= RE_GetCamera(re);
        float mat[4][4];
        
        re->scene= scene;
@@ -5165,9 +5168,9 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la
        scene_update_for_newframe(re->main, re->scene, lay);
        
        /* if no camera, viewmat should have been set! */
-       if(re->scene->camera) {
-               normalize_m4(re->scene->camera->obmat);
-               invert_m4_m4(mat, re->scene->camera->obmat);
+       if(camera) {
+               normalize_m4(camera->obmat);
+               invert_m4_m4(mat, camera->obmat);
                RE_SetView(re, mat);
        }
        
@@ -5654,6 +5657,7 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned
 */
 void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, int type, Object *actob)
 {
+       Object *camera= RE_GetCamera(re);
        float mat[4][4];
        float amb[3];
        int onlyselected, nolamps;
@@ -5696,9 +5700,9 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
                lay &= 0xFF000000;
        
        /* if no camera, set unit */
-       if(re->scene->camera) {
-               normalize_m4(re->scene->camera->obmat);
-               invert_m4_m4(mat, re->scene->camera->obmat);
+       if(camera) {
+               normalize_m4(camera->obmat);
+               invert_m4_m4(mat, camera->obmat);
                RE_SetView(re, mat);
        }
        else {
@@ -5762,13 +5766,17 @@ void RE_make_sticky(Scene *scene, View3D *v3d)
        Render *re;
        float ho[4], mat[4][4];
        int a;
-       
+       Object *camera= NULL;
+
        if(v3d==NULL) {
                printf("Need a 3d view to make sticky\n");
                return;
        }
-       
-       if(scene->camera==NULL) {
+
+       if(v3d)                         camera= V3D_CAMERA_LOCAL(v3d);
+       if(camera == NULL)      camera= scene->camera;
+
+       if(camera==NULL) {
                printf("Need camera to make sticky\n");
                return;
        }
@@ -5781,11 +5789,11 @@ void RE_make_sticky(Scene *scene, View3D *v3d)
        RE_InitState(re, NULL, &scene->r, NULL, scene->r.xsch, scene->r.ysch, NULL);
        
        /* use renderdata and camera to set viewplane */
-       RE_SetCamera(re, scene->camera);
+       RE_SetCamera(re, camera);
 
        /* and set view matrix */
-       normalize_m4(scene->camera->obmat);
-       invert_m4_m4(mat, scene->camera->obmat);
+       normalize_m4(camera->obmat);
+       invert_m4_m4(mat, camera->obmat);
        RE_SetView(re, mat);
        
        for(base= FIRSTBASE; base; base= base->next) {
index f87cde2..2f09742 100644 (file)
@@ -447,6 +447,11 @@ void make_sample_tables(Render *re)
 
 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
+struct Object *RE_GetCamera(Render *re)
+{
+       return re->camera_override ? re->camera_override : re->scene->camera;
+}
+
 /* call this after InitState() */
 /* per render, there's one persistant viewplane. Parts will set their own viewplanes */
 void RE_SetCamera(Render *re, Object *camera)
index 3e5b0b5..e57ccdc 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);
@@ -2648,11 +2650,11 @@ static void do_render_all_options(Render *re)
        }
 }
 
-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) {
@@ -2697,13 +2699,15 @@ 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;
        
@@ -2764,13 +2768,13 @@ 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, scene->camera);
+       object_camera_mode(&scene->r, camera_override ? camera_override : scene->camera);
 
        /* forbidden combinations */
        if(scene->r.mode & R_PANORAMA) {
@@ -2831,7 +2835,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;
@@ -2859,6 +2863,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 */
@@ -2899,14 +2904,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);
 
@@ -3019,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 */
@@ -3059,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) {
                                /*
@@ -3132,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= RE_GetCamera(re);
        int winx, winy;
 
        winx= (sce->r.size*sce->r.xsch)/100;
@@ -3143,7 +3149,7 @@ void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
        re->scene = sce;
        re->lay = sce->lay;
 
-       RE_SetCamera(re, sce->camera);
+       RE_SetCamera(re, camera);
 
        do_render_3d(re);
 }
index e8763c4..ab94131 100644 (file)
@@ -781,7 +781,7 @@ static int render_frame(int argc, const char **argv, void *data)
 
                        frame = MIN2(MAXFRAME, MAX2(MINAFRAME, frame));
 
-                       RE_BlenderAnim(re, bmain, scene, scene->lay, frame, frame, scene->r.frame_step, &reports);
+                       RE_BlenderAnim(re, bmain, scene, NULL, scene->lay, frame, frame, scene->r.frame_step, &reports);
                        return 1;
                } else {
                        printf("\nError: frame number must follow '-f / --render-frame'.\n");
@@ -802,7 +802,7 @@ static int render_animation(int UNUSED(argc), const char **UNUSED(argv), void *d
                Render *re= RE_NewRender(scene->id.name);
                ReportList reports;
                BKE_reports_init(&reports, RPT_PRINT);
-               RE_BlenderAnim(re, bmain, scene, scene->lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, &reports);
+               RE_BlenderAnim(re, bmain, scene, NULL, scene->lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, &reports);
        } else {
                printf("\nError: no blend loaded. cannot use '-a'.\n");
        }