add back support for rendering local view camera.
This commit is contained in:
parent
9b1e70140d
commit
abcdf9573a
@ -1948,7 +1948,7 @@ static ImBuf * seq_render_scene_strip_impl(
|
|||||||
if(re==NULL)
|
if(re==NULL)
|
||||||
re= RE_NewRender(sce->id.name);
|
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 */
|
/* restore previous state after it was toggled on & off by RE_BlenderFrame */
|
||||||
G.rendering = rendering;
|
G.rendering = rendering;
|
||||||
|
@ -421,6 +421,7 @@ static int screen_render_exec(bContext *C, wmOperator *op)
|
|||||||
unsigned int lay= (v3d)? v3d->lay: scene->lay;
|
unsigned int lay= (v3d)? v3d->lay: scene->lay;
|
||||||
const short is_animation= RNA_boolean_get(op->ptr, "animation");
|
const short is_animation= RNA_boolean_get(op->ptr, "animation");
|
||||||
const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
|
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)) {
|
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.");
|
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();
|
seq_stripelem_cache_cleanup();
|
||||||
|
|
||||||
if(is_animation)
|
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
|
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
|
// no redraw needed, we leave state as we entered it
|
||||||
ED_update_for_newframe(mainp, scene, CTX_wm_screen(C), 1);
|
ED_update_for_newframe(mainp, scene, CTX_wm_screen(C), 1);
|
||||||
@ -464,6 +465,7 @@ typedef struct RenderJob {
|
|||||||
Render *re;
|
Render *re;
|
||||||
wmWindow *win;
|
wmWindow *win;
|
||||||
SceneRenderLayer *srl;
|
SceneRenderLayer *srl;
|
||||||
|
struct Object *camera_override;
|
||||||
int lay;
|
int lay;
|
||||||
short anim, write_still;
|
short anim, write_still;
|
||||||
Image *image;
|
Image *image;
|
||||||
@ -590,9 +592,9 @@ static void render_startjob(void *rjv, short *stop, short *do_update, float *pro
|
|||||||
rj->progress= progress;
|
rj->progress= progress;
|
||||||
|
|
||||||
if(rj->anim)
|
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
|
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)
|
static void render_endjob(void *rjv)
|
||||||
@ -679,12 +681,13 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
int jobflag;
|
int jobflag;
|
||||||
const short is_animation= RNA_boolean_get(op->ptr, "animation");
|
const short is_animation= RNA_boolean_get(op->ptr, "animation");
|
||||||
const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
|
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 */
|
/* only one render job at a time */
|
||||||
if(WM_jobs_test(CTX_wm_manager(C), scene))
|
if(WM_jobs_test(CTX_wm_manager(C), scene))
|
||||||
return OPERATOR_CANCELLED;
|
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;
|
return OPERATOR_CANCELLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -761,6 +764,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
rj->scene= scene;
|
rj->scene= scene;
|
||||||
rj->win= CTX_wm_window(C);
|
rj->win= CTX_wm_window(C);
|
||||||
rj->srl = srl;
|
rj->srl = srl;
|
||||||
|
rj->camera_override = camera_override;
|
||||||
rj->lay = (v3d)? v3d->lay: scene->lay;
|
rj->lay = (v3d)? v3d->lay: scene->lay;
|
||||||
rj->anim= is_animation;
|
rj->anim= is_animation;
|
||||||
rj->write_still= is_write_still && !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);
|
void RE_SetDispRect (struct Render *re, rcti *disprect);
|
||||||
|
|
||||||
/* set up the viewplane/perspective matrix, three choices */
|
/* 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_SetCamera(struct Render *re, struct Object *camera);
|
||||||
void RE_SetWindow (struct Render *re, rctf *viewplane, float clipsta, float clipend);
|
void RE_SetWindow (struct Render *re, rctf *viewplane, float clipsta, float clipend);
|
||||||
void RE_SetOrtho (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);
|
void RE_TileProcessor(struct Render *re);
|
||||||
|
|
||||||
/* only RE_NewRender() needed, main Blender render calls */
|
/* 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_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, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports);
|
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 */
|
/* main preview render call */
|
||||||
void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
|
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_init(void);
|
||||||
void RE_engines_exit(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 */
|
#endif /* RE_PIPELINE_H */
|
||||||
|
|
||||||
|
@ -182,6 +182,7 @@ struct Render
|
|||||||
Scene *scene;
|
Scene *scene;
|
||||||
RenderData r;
|
RenderData r;
|
||||||
World wrld;
|
World wrld;
|
||||||
|
struct Object *camera_override;
|
||||||
unsigned int lay;
|
unsigned int lay;
|
||||||
|
|
||||||
ListBase parts;
|
ListBase parts;
|
||||||
|
@ -164,7 +164,8 @@ void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void),
|
|||||||
World *wrld= NULL;
|
World *wrld= NULL;
|
||||||
HaloRen *har;
|
HaloRen *har;
|
||||||
Scene *scene;
|
Scene *scene;
|
||||||
Camera *camera;
|
Object *camera= re ? RE_GetCamera(re) : scene->camera;
|
||||||
|
Camera *cam;
|
||||||
double dblrand, hlfrand;
|
double dblrand, hlfrand;
|
||||||
float vec[4], fx, fy, fz;
|
float vec[4], fx, fy, fz;
|
||||||
float fac, starmindist, clipend;
|
float fac, starmindist, clipend;
|
||||||
@ -205,11 +206,11 @@ void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void),
|
|||||||
* y = -z | +z
|
* y = -z | +z
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if(scene->camera==NULL || scene->camera->type != OB_CAMERA)
|
if(camera==NULL || camera->type != OB_CAMERA)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
camera = scene->camera->data;
|
cam = camera->data;
|
||||||
clipend = camera->clipend;
|
clipend = cam->clipend;
|
||||||
|
|
||||||
/* convert to grid coordinates */
|
/* 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.align = part->bb_align;
|
||||||
bb.anim = part->bb_anim;
|
bb.anim = part->bb_anim;
|
||||||
bb.lock = part->draw & PART_DRAW_BB_LOCK;
|
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[0] = part->bb_offset[0];
|
||||||
bb.offset[1] = part->bb_offset[1];
|
bb.offset[1] = part->bb_offset[1];
|
||||||
bb.split_offset = part->bb_split_offset;
|
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;
|
Scene *sce;
|
||||||
float mat[4][4];
|
float mat[4][4];
|
||||||
float amb[3];
|
float amb[3];
|
||||||
|
Object *camera= RE_GetCamera(re);
|
||||||
|
|
||||||
re->main= bmain;
|
re->main= bmain;
|
||||||
re->scene= scene;
|
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);
|
scene_update_for_newframe(re->main, re->scene, lay);
|
||||||
|
|
||||||
/* if no camera, viewmat should have been set! */
|
/* 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
|
/* called before but need to call again incase of lens animation from the
|
||||||
* above call to scene_update_for_newframe, fixes bug. [#22702].
|
* above call to scene_update_for_newframe, fixes bug. [#22702].
|
||||||
* following calls dont depend on 'RE_SetCamera' */
|
* following calls dont depend on 'RE_SetCamera' */
|
||||||
RE_SetCamera(re, scene->camera);
|
RE_SetCamera(re, camera);
|
||||||
|
|
||||||
normalize_m4(re->scene->camera->obmat);
|
normalize_m4(camera->obmat);
|
||||||
invert_m4_m4(mat, re->scene->camera->obmat);
|
invert_m4_m4(mat, camera->obmat);
|
||||||
RE_SetView(re, mat);
|
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 */
|
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)
|
static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int lay, int timeoffset)
|
||||||
{
|
{
|
||||||
|
Object *camera= RE_GetCamera(re);
|
||||||
float mat[4][4];
|
float mat[4][4];
|
||||||
|
|
||||||
re->scene= scene;
|
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);
|
scene_update_for_newframe(re->main, re->scene, lay);
|
||||||
|
|
||||||
/* if no camera, viewmat should have been set! */
|
/* if no camera, viewmat should have been set! */
|
||||||
if(re->scene->camera) {
|
if(camera) {
|
||||||
normalize_m4(re->scene->camera->obmat);
|
normalize_m4(camera->obmat);
|
||||||
invert_m4_m4(mat, re->scene->camera->obmat);
|
invert_m4_m4(mat, camera->obmat);
|
||||||
RE_SetView(re, mat);
|
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)
|
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 mat[4][4];
|
||||||
float amb[3];
|
float amb[3];
|
||||||
int onlyselected, nolamps;
|
int onlyselected, nolamps;
|
||||||
@ -5696,9 +5700,9 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
|
|||||||
lay &= 0xFF000000;
|
lay &= 0xFF000000;
|
||||||
|
|
||||||
/* if no camera, set unit */
|
/* if no camera, set unit */
|
||||||
if(re->scene->camera) {
|
if(camera) {
|
||||||
normalize_m4(re->scene->camera->obmat);
|
normalize_m4(camera->obmat);
|
||||||
invert_m4_m4(mat, re->scene->camera->obmat);
|
invert_m4_m4(mat, camera->obmat);
|
||||||
RE_SetView(re, mat);
|
RE_SetView(re, mat);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -5762,13 +5766,17 @@ void RE_make_sticky(Scene *scene, View3D *v3d)
|
|||||||
Render *re;
|
Render *re;
|
||||||
float ho[4], mat[4][4];
|
float ho[4], mat[4][4];
|
||||||
int a;
|
int a;
|
||||||
|
Object *camera= NULL;
|
||||||
|
|
||||||
if(v3d==NULL) {
|
if(v3d==NULL) {
|
||||||
printf("Need a 3d view to make sticky\n");
|
printf("Need a 3d view to make sticky\n");
|
||||||
return;
|
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");
|
printf("Need camera to make sticky\n");
|
||||||
return;
|
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);
|
RE_InitState(re, NULL, &scene->r, NULL, scene->r.xsch, scene->r.ysch, NULL);
|
||||||
|
|
||||||
/* use renderdata and camera to set viewplane */
|
/* use renderdata and camera to set viewplane */
|
||||||
RE_SetCamera(re, scene->camera);
|
RE_SetCamera(re, camera);
|
||||||
|
|
||||||
/* and set view matrix */
|
/* and set view matrix */
|
||||||
normalize_m4(scene->camera->obmat);
|
normalize_m4(camera->obmat);
|
||||||
invert_m4_m4(mat, scene->camera->obmat);
|
invert_m4_m4(mat, camera->obmat);
|
||||||
RE_SetView(re, mat);
|
RE_SetView(re, mat);
|
||||||
|
|
||||||
for(base= FIRSTBASE; base; base= base->next) {
|
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() */
|
/* call this after InitState() */
|
||||||
/* per render, there's one persistant viewplane. Parts will set their own viewplanes */
|
/* per render, there's one persistant viewplane. Parts will set their own viewplanes */
|
||||||
void RE_SetCamera(Render *re, Object *camera)
|
void RE_SetCamera(Render *re, Object *camera)
|
||||||
|
@ -1991,6 +1991,7 @@ static void merge_renderresult_fields(RenderResult *rr, RenderResult *rr1, Rende
|
|||||||
/* interleaves 2 frames */
|
/* interleaves 2 frames */
|
||||||
static void do_render_fields_3d(Render *re)
|
static void do_render_fields_3d(Render *re)
|
||||||
{
|
{
|
||||||
|
Object *camera= RE_GetCamera(re);
|
||||||
RenderResult *rr1, *rr2= NULL;
|
RenderResult *rr1, *rr2= NULL;
|
||||||
|
|
||||||
/* no render result was created, we can safely halve render y */
|
/* 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 */
|
re->i.curfield= 1; /* stats */
|
||||||
|
|
||||||
/* first field, we have to call camera routine for correct aspect and subpixel offset */
|
/* 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)
|
if(re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE)==0)
|
||||||
do_render_blur_3d(re);
|
do_render_blur_3d(re);
|
||||||
else
|
else
|
||||||
@ -2022,7 +2023,7 @@ static void do_render_fields_3d(Render *re)
|
|||||||
if((re->r.mode & R_FIELDSTILL)==0) {
|
if((re->r.mode & R_FIELDSTILL)==0) {
|
||||||
re->field_offs = 0.5f;
|
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)
|
if(re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE)==0)
|
||||||
do_render_blur_3d(re);
|
do_render_blur_3d(re);
|
||||||
else
|
else
|
||||||
@ -2097,8 +2098,9 @@ static void load_backbuffer(Render *re)
|
|||||||
/* main render routine, no compositing */
|
/* main render routine, no compositing */
|
||||||
static void do_render_fields_blur_3d(Render *re)
|
static void do_render_fields_blur_3d(Render *re)
|
||||||
{
|
{
|
||||||
|
Object *camera= RE_GetCamera(re);
|
||||||
/* also check for camera here */
|
/* also check for camera here */
|
||||||
if(re->scene->camera==NULL) {
|
if(camera == NULL) {
|
||||||
printf("ERROR: Cannot render, no camera\n");
|
printf("ERROR: Cannot render, no camera\n");
|
||||||
G.afbreek= 1;
|
G.afbreek= 1;
|
||||||
return;
|
return;
|
||||||
@ -2109,7 +2111,7 @@ static void do_render_fields_blur_3d(Render *re)
|
|||||||
load_backbuffer(re);
|
load_backbuffer(re);
|
||||||
|
|
||||||
/* now use renderdata and camera to set viewplane */
|
/* now use renderdata and camera to set viewplane */
|
||||||
RE_SetCamera(re, re->scene->camera);
|
RE_SetCamera(re, camera);
|
||||||
|
|
||||||
if(re->r.mode & R_FIELDS)
|
if(re->r.mode & R_FIELDS)
|
||||||
do_render_fields_3d(re);
|
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;
|
int check_comp= 1;
|
||||||
|
|
||||||
if (scene->camera == NULL)
|
if (camera_override == NULL && scene->camera == NULL)
|
||||||
scene->camera= scene_find_camera(scene);
|
scene->camera= scene_find_camera(scene);
|
||||||
|
|
||||||
if(scene->r.scemode&R_DOSEQ) {
|
if(scene->r.scemode&R_DOSEQ) {
|
||||||
@ -2697,13 +2699,15 @@ static int check_valid_camera(Scene *scene)
|
|||||||
|
|
||||||
node= node->next;
|
node= node->next;
|
||||||
}
|
}
|
||||||
} else return scene->camera != NULL;
|
} else {
|
||||||
|
return (camera_override != NULL || scene->camera != NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
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;
|
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) */
|
/* 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");
|
error(erh, "No camera");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get panorama & ortho, only after camera is set */
|
/* 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 */
|
/* forbidden combinations */
|
||||||
if(scene->r.mode & R_PANORAMA) {
|
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);
|
BKE_ptcache_bake(&baker);
|
||||||
}
|
}
|
||||||
/* evaluating scene options for general Blender render */
|
/* 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;
|
int winx, winy;
|
||||||
rcti disprect;
|
rcti disprect;
|
||||||
@ -2859,6 +2863,7 @@ static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, Sc
|
|||||||
|
|
||||||
re->main= bmain;
|
re->main= bmain;
|
||||||
re->scene= scene;
|
re->scene= scene;
|
||||||
|
re->camera_override= camera_override;
|
||||||
re->lay= lay;
|
re->lay= lay;
|
||||||
|
|
||||||
/* not too nice, but it survives anim-border render */
|
/* 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 */
|
/* 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 */
|
/* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */
|
||||||
G.rendering= 1;
|
G.rendering= 1;
|
||||||
|
|
||||||
scene->r.cfra= frame;
|
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();
|
MEM_reset_peak_memory();
|
||||||
do_render_all_options(re);
|
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 */
|
/* 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);
|
bMovieHandle *mh= BKE_get_movie_handle(scene->r.imtype);
|
||||||
int cfrao= scene->r.cfra;
|
int cfrao= scene->r.cfra;
|
||||||
int nfra;
|
int nfra;
|
||||||
|
|
||||||
/* do not fully call for each frame, it initializes & pops output window */
|
/* 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;
|
return;
|
||||||
|
|
||||||
/* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
|
/* 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];
|
char name[FILE_MAX];
|
||||||
|
|
||||||
/* only border now, todo: camera lens. (ton) */
|
/* 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) {
|
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)
|
void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
|
||||||
{
|
{
|
||||||
|
Object *camera= RE_GetCamera(re);
|
||||||
int winx, winy;
|
int winx, winy;
|
||||||
|
|
||||||
winx= (sce->r.size*sce->r.xsch)/100;
|
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->scene = sce;
|
||||||
re->lay = sce->lay;
|
re->lay = sce->lay;
|
||||||
|
|
||||||
RE_SetCamera(re, sce->camera);
|
RE_SetCamera(re, camera);
|
||||||
|
|
||||||
do_render_3d(re);
|
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));
|
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;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
printf("\nError: frame number must follow '-f / --render-frame'.\n");
|
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);
|
Render *re= RE_NewRender(scene->id.name);
|
||||||
ReportList reports;
|
ReportList reports;
|
||||||
BKE_reports_init(&reports, RPT_PRINT);
|
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 {
|
} else {
|
||||||
printf("\nError: no blend loaded. cannot use '-a'.\n");
|
printf("\nError: no blend loaded. cannot use '-a'.\n");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user