add back support for rendering local view camera.

This commit is contained in:
Campbell Barton 2011-04-30 04:29:36 +00:00
parent 9b1e70140d
commit abcdf9573a
8 changed files with 75 additions and 50 deletions

@ -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;

@ -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;

@ -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 */

@ -182,6 +182,7 @@ struct Render
Scene *scene;
RenderData r;
World wrld;
struct Object *camera_override;
unsigned int lay;
ListBase parts;

@ -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) {

@ -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)

@ -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);
}

@ -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");
}