Nicer solution to T38846: Split off the render layer forcing from the

validity check for render operator.

This way scene DNA can stay read-only there, cleaner and we don't have
to pass an awkward bool pointer around.
This commit is contained in:
2014-02-26 14:56:27 +01:00
parent ecbae4ab46
commit 4cfca0adfe
3 changed files with 22 additions and 17 deletions

View File

@@ -799,17 +799,17 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even
struct Object *camera_override = v3d ? V3D_CAMERA_LOCAL(v3d) : NULL;
const char *name;
ScrArea *sa;
bool scene_rlayer_update;
/* only one render job at a time */
if (WM_jobs_test(CTX_wm_manager(C), scene, WM_JOB_TYPE_RENDER))
return OPERATOR_CANCELLED;
if (!RE_is_rendering_allowed(scene, camera_override, op->reports, &scene_rlayer_update)) {
if (RE_force_single_renderlayer(scene))
WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, NULL);
if (!RE_is_rendering_allowed(scene, camera_override, op->reports)) {
return OPERATOR_CANCELLED;
}
if (scene_rlayer_update)
WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, NULL);
if (!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.im_format.imtype)) {
BKE_report(op->reports, RPT_ERROR, "Cannot write a single file with an animation format selected");

View File

@@ -285,7 +285,8 @@ void RE_DataBase_GetView(struct Render *re, float mat[4][4]);
void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[4][4]);
struct Scene *RE_GetScene(struct Render *re);
bool RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, struct ReportList *reports, bool *r_scene_rlayer_update);
bool RE_force_single_renderlayer(struct Scene *scene);
bool RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, struct ReportList *reports);
bool RE_allow_render_generic_object(struct Object *ob);

View File

@@ -2314,6 +2314,20 @@ static void do_render_all_options(Render *re)
}
}
bool RE_force_single_renderlayer(Scene *scene)
{
int scemode = check_mode_full_sample(&scene->r);
if (scemode & R_SINGLE_LAYER) {
SceneRenderLayer *srl = BLI_findlink(&scene->r.layers, scene->r.actlay);
/* force layer to be enabled */
if (srl->layflag & SCE_LAY_DISABLE) {
srl->layflag &= ~SCE_LAY_DISABLE;
return true;
}
}
return false;
}
static bool check_valid_compositing_camera(Scene *scene, Object *camera_override)
{
if (scene->r.scemode & R_DOCOMP && scene->use_nodes) {
@@ -2400,12 +2414,10 @@ static int check_composite_output(Scene *scene)
return node_tree_has_composite_output(scene->nodetree);
}
bool RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *reports, bool *r_scene_rlayer_update)
bool RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *reports)
{
SceneRenderLayer *srl;
int scemode = check_mode_full_sample(&scene->r);
if (r_scene_rlayer_update)
*r_scene_rlayer_update = false; /* becomes true if render layer is forced enabled */
if (scene->r.mode & R_BORDER) {
if (scene->r.border.xmax <= scene->r.border.xmin ||
@@ -2477,16 +2489,8 @@ bool RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *
}
#endif
}
/* layer flag tests */
if (scemode & R_SINGLE_LAYER) {
srl = BLI_findlink(&scene->r.layers, scene->r.actlay);
/* force layer to be enabled */
srl->layflag &= ~SCE_LAY_DISABLE;
if (r_scene_rlayer_update)
*r_scene_rlayer_update = true;
}
/* layer flag tests */
for (srl = scene->r.layers.first; srl; srl = srl->next)
if (!(srl->layflag & SCE_LAY_DISABLE))
break;