1062
1107
/* redraw in progress parts */
1063
1108
elapsed = PIL_check_seconds_timer() - lastdraw;
1064
1109
if (elapsed > redrawtime) {
1065
if (render_display_draw_enabled(re))
1110
if (render_display_update_enabled(re))
1066
1111
for (pa = re->parts.first; pa; pa = pa->next)
1067
1112
if ((pa->status == PART_STATUS_IN_PROGRESS) && pa->nr && pa->result)
1068
re->display_draw(re->ddh, pa->result, &pa->result->renrect);
1113
re->display_update(re->duh, pa->result, &pa->result->renrect);
1070
1115
lastdraw = PIL_check_seconds_timer();
1310
1355
re->i.curblur = 0; /* stats */
1312
1357
/* make sure motion blur changes get reset to current frame */
1313
if ((re->r.scemode & (R_NO_FRAME_UPDATE|R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))==0)
1314
BKE_scene_update_for_newframe(re->main, re->scene, re->lay);
1358
if ((re->r.scemode & (R_NO_FRAME_UPDATE|R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))==0) {
1359
BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene, re->lay);
1316
1362
/* weak... the display callback wants an active renderlayer pointer... */
1317
1363
re->result->renlay = render_get_active_layer(re, re->result);
1318
re->display_draw(re->ddh, re->result, NULL);
1364
re->display_update(re->duh, re->result, NULL);
1629
bool RE_allow_render_generic_object(Object *ob)
1631
/* override not showing object when duplis are used with particles */
1632
if (ob->transflag & OB_DUPLIPARTS) {
1633
/* pass */ /* let particle system(s) handle showing vs. not showing */
1635
else if ((ob->transflag & OB_DUPLI) && !(ob->transflag & OB_DUPLIFRAMES)) {
1641
/* Issue here is that it's possible that object which is used by boolean,
1642
* array or shrinkwrap modifiers weren't displayed in the viewport before
1643
* rendering. This leads to situations when apply() of this modifiers
1644
* could not get ob->derivedFinal and modifiers are not being applied.
1646
* This was worked around by direct call of get_derived_final() from those
1647
* modifiers, but such approach leads to write conflicts with threaded
1650
* Here we make sure derivedFinal will be calculated by update_for_newframe
1651
* function later in the pipeline and all the modifiers are applied
1652
* properly without hacks from their side.
1655
#define DEPSGRAPH_WORKAROUND_HACK
1657
#ifdef DEPSGRAPH_WORKAROUND_HACK
1658
static void tag_dependend_objects_for_render(Scene *scene, int renderlay)
1662
for (SETLOOPER(scene, sce_iter, base)) {
1663
Object *object = base->object;
1665
if ((base->lay & renderlay) == 0) {
1669
if (object->type == OB_MESH) {
1670
if (RE_allow_render_generic_object(object)) {
1672
VirtualModifierData virtualModifierData;
1674
for (md = modifiers_getVirtualModifierList(object, &virtualModifierData);
1678
if (!modifier_isEnabled(scene, md, eModifierMode_Render)) {
1682
if (md->type == eModifierType_Boolean) {
1683
BooleanModifierData *bmd = (BooleanModifierData *)md;
1684
if (bmd->object && bmd->object->type == OB_MESH) {
1685
DAG_id_tag_update(&bmd->object->id, OB_RECALC_DATA);
1688
else if (md->type == eModifierType_Array) {
1689
ArrayModifierData *amd = (ArrayModifierData *)md;
1690
if (amd->start_cap && amd->start_cap->type == OB_MESH) {
1691
DAG_id_tag_update(&amd->start_cap->id, OB_RECALC_DATA);
1693
if (amd->end_cap && amd->end_cap->type == OB_MESH) {
1694
DAG_id_tag_update(&amd->end_cap->id, OB_RECALC_DATA);
1697
else if (md->type == eModifierType_Shrinkwrap) {
1698
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md;
1699
if (smd->target && smd->target->type == OB_MESH) {
1700
DAG_id_tag_update(&smd->target->id, OB_RECALC_DATA);
1583
1710
static void tag_scenes_for_render(Render *re)
1714
#ifdef DEPSGRAPH_WORKAROUND_HACK
1715
int renderlay = re->lay;
1588
for (sce = re->main->scene.first; sce; sce = sce->id.next)
1718
for (sce = re->main->scene.first; sce; sce = sce->id.next) {
1589
1719
sce->id.flag &= ~LIB_DOIT;
1720
#ifdef DEPSGRAPH_WORKAROUND_HACK
1721
tag_dependend_objects_for_render(sce, renderlay);
1591
1725
#ifdef WITH_FREESTYLE
1592
for (sce = re->freestyle_bmain.scene.first; sce; sce = sce->id.next)
1726
for (sce = re->freestyle_bmain.scene.first; sce; sce = sce->id.next) {
1593
1727
sce->id.flag &= ~LIB_DOIT;
1728
#ifdef DEPSGRAPH_WORKAROUND_HACK
1729
tag_dependend_objects_for_render(sce, renderlay);
1596
if (RE_GetCamera(re) && composite_needs_render(re->scene, 1))
1734
if (RE_GetCamera(re) && composite_needs_render(re->scene, 1)) {
1597
1735
re->scene->id.flag |= LIB_DOIT;
1736
#ifdef DEPSGRAPH_WORKAROUND_HACK
1737
tag_dependend_objects_for_render(re->scene, renderlay);
1599
1741
if (re->scene->nodetree == NULL) return;
1601
1743
/* check for render-layers nodes using other scenes, we tag them LIB_DOIT */
1602
1744
for (node = re->scene->nodetree->nodes.first; node; node = node->next) {
1745
node->flag &= ~NODE_TEST;
1603
1746
if (node->type == CMP_NODE_R_LAYERS) {
1604
1747
if (node->id) {
1605
1748
if (!MAIN_VERSION_ATLEAST(re->main, 265, 5)) {
1640
1790
for (node = re->scene->nodetree->nodes.first; node; node = node->next) {
1641
1791
if (node->type == CMP_NODE_R_LAYERS) {
1642
1792
if (node->id && node->id != (ID *)re->scene) {
1643
if (node->id->flag & LIB_DOIT) {
1793
if (node->flag & NODE_TEST) {
1644
1794
Scene *scene = (Scene *)node->id;
1646
1796
render_scene(re, scene, cfra);
1647
1797
restore_scene = (scene != re->scene);
1648
node->id->flag &= ~LIB_DOIT;
1798
node->flag &= ~NODE_TEST;
1650
1800
nodeUpdate(re->scene->nodetree, node);
2005
2155
R.stats_draw = re->stats_draw;
2007
2157
if (update_newframe)
2008
BKE_scene_update_for_newframe(re->main, re->scene, re->lay);
2158
BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene, re->lay);
2010
2160
if (re->r.scemode & R_FULL_SAMPLE)
2011
2161
do_merge_fullsample(re, ntree);
2013
ntreeCompositExecTree(ntree, &re->r, TRUE, G.background == 0, &re->scene->view_settings, &re->scene->display_settings);
2163
ntreeCompositExecTree(re->scene, ntree, &re->r, TRUE, G.background == 0, &re->scene->view_settings, &re->scene->display_settings);
2016
2166
ntree->stats_draw = NULL;
2080
2230
if ((re->r.mode & R_BORDER) && (re->r.mode & R_CROP) == 0) {
2081
2231
/* if border rendering is used and cropping is disabled, final buffer should
2082
2232
* be as large as the whole frame */
2083
context = BKE_sequencer_new_render_data(re->main, re->scene,
2233
context = BKE_sequencer_new_render_data(re->eval_ctx, re->main, re->scene,
2234
re->winx, re->winy, 100);
2088
context = BKE_sequencer_new_render_data(re->main, re->scene,
2089
re->result->rectx, re->result->recty,
2237
context = BKE_sequencer_new_render_data(re->eval_ctx, re->main, re->scene,
2238
re->result->rectx, re->result->recty, 100);
2093
out = BKE_sequencer_give_ibuf(context, cfra, 0);
2241
out = BKE_sequencer_give_ibuf(&context, cfra, 0);
2096
2244
ibuf = IMB_dupImBuf(out);
2177
2325
/* stamp image info here */
2178
2326
if ((re->r.stamp & R_STAMP_ALL) && (re->r.stamp & R_STAMP_DRAW)) {
2179
2327
renderresult_stampinfo(re);
2180
re->display_draw(re->ddh, re->result, NULL);
2184
static int check_valid_camera(Scene *scene, Object *camera_override)
2328
re->display_update(re->duh, re->result, NULL);
2332
bool RE_force_single_renderlayer(Scene *scene)
2334
int scemode = check_mode_full_sample(&scene->r);
2335
if (scemode & R_SINGLE_LAYER) {
2336
SceneRenderLayer *srl = BLI_findlink(&scene->r.layers, scene->r.actlay);
2337
/* force layer to be enabled */
2338
if (srl->layflag & SCE_LAY_DISABLE) {
2339
srl->layflag &= ~SCE_LAY_DISABLE;
2346
static bool check_valid_compositing_camera(Scene *scene, Object *camera_override)
2348
if (scene->r.scemode & R_DOCOMP && scene->use_nodes) {
2349
bNode *node = scene->nodetree->nodes.first;
2352
if (node->type == CMP_NODE_R_LAYERS) {
2353
Scene *sce = node->id ? (Scene *)node->id : scene;
2355
if (!sce->camera && !BKE_scene_camera_find(sce)) {
2356
/* all render layers nodes need camera */
2367
return (camera_override != NULL || scene->camera != NULL);
2371
static int check_valid_camera(Scene *scene, Object *camera_override, ReportList *reports)
2188
2373
if (camera_override == NULL && scene->camera == NULL)
2189
2374
scene->camera = BKE_scene_camera_find(scene);
2191
if (scene->r.scemode & R_DOSEQ) {
2376
if (RE_seq_render_active(scene, &scene->r)) {
2192
2377
if (scene->ed) {
2193
2378
Sequence *seq = scene->ed->seqbase.first;
2198
2381
if (seq->type == SEQ_TYPE_SCENE && seq->scene) {
2199
2382
if (!seq->scene_camera) {
2200
2383
if (!seq->scene->camera && !BKE_scene_camera_find(seq->scene)) {
2201
if (seq->scene == scene) {
2202
/* for current scene camera could be unneeded due to compisite nodes */
2206
/* for other scenes camera is necessary */
2384
/* camera could be unneeded due to composite nodes */
2385
Object *override = (seq->scene == scene) ? camera_override : NULL;
2387
if (!check_valid_compositing_camera(seq->scene, override)) {
2388
BKE_reportf(reports, RPT_ERROR, "No camera found in scene \"%s\"", seq->scene->id.name+2);
2218
if (check_comp) { /* no sequencer or sequencer depends on compositor */
2219
if (scene->r.scemode & R_DOCOMP && scene->use_nodes) {
2220
bNode *node = scene->nodetree->nodes.first;
2223
if (node->type == CMP_NODE_R_LAYERS) {
2224
Scene *sce = node->id ? (Scene *)node->id : scene;
2226
if (!sce->camera && !BKE_scene_camera_find(sce)) {
2227
/* all render layers nodes need camera */
2236
return (camera_override != NULL || scene->camera != NULL);
2399
else if (!check_valid_compositing_camera(scene, camera_override)) {
2400
BKE_report(reports, RPT_ERROR, "No camera found in scene");
2243
2407
static int node_tree_has_composite_output(bNodeTree *ntree)
2646
2803
re->flag |= R_ANIMATION;
2648
if (BKE_imtype_is_movie(scene->r.im_format.imtype))
2649
if (!mh->start_movie(scene, &re->r, re->rectx, re->recty, re->reports))
2805
if (BKE_imtype_is_movie(scene->r.im_format.imtype)) {
2807
if (re->r.mode & R_BORDER) {
2808
if ((re->r.mode & R_CROP) == 0) {
2822
if (!mh->start_movie(scene, &re->r, width, height, re->reports))
2650
2823
G.is_break = TRUE;
2652
2826
if (mh->get_next_frame) {
2653
2827
while (!(G.is_break == 1)) {