Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/intern/sequencer.c2
-rw-r--r--source/blender/editors/render/render_internal.c14
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h7
-rw-r--r--source/blender/render/intern/include/render_types.h1
-rw-r--r--source/blender/render/intern/source/convertblender.c52
-rw-r--r--source/blender/render/intern/source/initrender.c5
-rw-r--r--source/blender/render/intern/source/pipeline.c40
-rw-r--r--source/creator/creator.c4
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");
}