diff options
-rw-r--r-- | source/blender/blenkernel/intern/sequencer.c | 2 | ||||
-rw-r--r-- | source/blender/editors/render/render_internal.c | 14 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 7 | ||||
-rw-r--r-- | source/blender/render/intern/include/render_types.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 52 | ||||
-rw-r--r-- | source/blender/render/intern/source/initrender.c | 5 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 40 | ||||
-rw-r--r-- | source/creator/creator.c | 4 |
8 files changed, 75 insertions, 50 deletions
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index b2e6f5290c3..a4d11c90019 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -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; diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index ce434413a5f..3890eedeb57 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -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; diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 4cc3207a05e..145d86575d0 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -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 */ diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index 672b5080fbf..fd5ea7c789b 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -182,6 +182,7 @@ struct Render Scene *scene; RenderData r; World wrld; + struct Object *camera_override; unsigned int lay; ListBase parts; diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 523dd12290c..b7b97d81a60 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -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) { diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index f87cde27f02..2f09742f130 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -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) diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 3e5b0b5a37b..e57ccdcd688 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -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); } diff --git a/source/creator/creator.c b/source/creator/creator.c index e8763c42efe..ab94131966f 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -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"); } |