|
|
|
|
@@ -1020,30 +1020,32 @@ static void do_render_compositor_scene(Render *re, Scene *sce, int cfra)
|
|
|
|
|
do_render_engine(resc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* helper call to detect if this scene needs a render,
|
|
|
|
|
* or if there's a any render layer to render. */
|
|
|
|
|
static int compositor_needs_render(Scene *sce, int this_scene)
|
|
|
|
|
/**
|
|
|
|
|
* Helper call to detect if this scene needs a render,
|
|
|
|
|
* or if there's a any render layer to render.
|
|
|
|
|
*/
|
|
|
|
|
static bool compositor_needs_render(Scene *sce, const bool this_scene)
|
|
|
|
|
{
|
|
|
|
|
bNodeTree *ntree = sce->nodetree;
|
|
|
|
|
|
|
|
|
|
if (ntree == nullptr) {
|
|
|
|
|
return 1;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if (sce->use_nodes == false) {
|
|
|
|
|
return 1;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if ((sce->r.scemode & R_DOCOMP) == 0) {
|
|
|
|
|
return 1;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const bNode *node : ntree->all_nodes()) {
|
|
|
|
|
if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) {
|
|
|
|
|
if (this_scene == 0 || node->id == nullptr || node->id == &sce->id) {
|
|
|
|
|
return 1;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Render all scenes within a compositor node tree. */
|
|
|
|
|
@@ -1102,9 +1104,9 @@ static void render_compositor_stats(void *arg, const char *str)
|
|
|
|
|
static void do_render_compositor(Render *re)
|
|
|
|
|
{
|
|
|
|
|
bNodeTree *ntree = re->pipeline_scene_eval->nodetree;
|
|
|
|
|
int update_newframe = 0;
|
|
|
|
|
bool update_newframe = false;
|
|
|
|
|
|
|
|
|
|
if (compositor_needs_render(re->pipeline_scene_eval, 1)) {
|
|
|
|
|
if (compositor_needs_render(re->pipeline_scene_eval, true)) {
|
|
|
|
|
/* render the frames
|
|
|
|
|
* it could be optimized to render only the needed view
|
|
|
|
|
* but what if a scene has a different number of views
|
|
|
|
|
@@ -1125,8 +1127,8 @@ static void do_render_compositor(Render *re)
|
|
|
|
|
|
|
|
|
|
BLI_rw_mutex_unlock(&re->resultmutex);
|
|
|
|
|
|
|
|
|
|
/* scene render process already updates animsys */
|
|
|
|
|
update_newframe = 1;
|
|
|
|
|
/* Scene render process already updates animsys. */
|
|
|
|
|
update_newframe = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* swap render result */
|
|
|
|
|
@@ -1204,21 +1206,21 @@ static void renderresult_stampinfo(Render *re)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int RE_seq_render_active(Scene *scene, RenderData *rd)
|
|
|
|
|
bool RE_seq_render_active(Scene *scene, RenderData *rd)
|
|
|
|
|
{
|
|
|
|
|
Editing *ed = scene->ed;
|
|
|
|
|
|
|
|
|
|
if (!(rd->scemode & R_DOSEQ) || !ed || !ed->seqbase.first) {
|
|
|
|
|
return 0;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LISTBASE_FOREACH (Sequence *, seq, &ed->seqbase) {
|
|
|
|
|
if (seq->type != SEQ_TYPE_SOUND_RAM) {
|
|
|
|
|
return 1;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Render sequencer strips into render result. */
|
|
|
|
|
@@ -1574,7 +1576,7 @@ bool RE_is_rendering_allowed(Scene *scene,
|
|
|
|
|
static void update_physics_cache(Render *re,
|
|
|
|
|
Scene *scene,
|
|
|
|
|
ViewLayer *view_layer,
|
|
|
|
|
int /*anim_init*/)
|
|
|
|
|
const bool /*anim_init*/)
|
|
|
|
|
{
|
|
|
|
|
PTCacheBaker baker;
|
|
|
|
|
|
|
|
|
|
@@ -1583,9 +1585,9 @@ static void update_physics_cache(Render *re,
|
|
|
|
|
baker.scene = scene;
|
|
|
|
|
baker.view_layer = view_layer;
|
|
|
|
|
baker.depsgraph = BKE_scene_ensure_depsgraph(re->main, scene, view_layer);
|
|
|
|
|
baker.bake = 0;
|
|
|
|
|
baker.render = 1;
|
|
|
|
|
baker.anim_init = 1;
|
|
|
|
|
baker.bake = false;
|
|
|
|
|
baker.render = true;
|
|
|
|
|
baker.anim_init = true;
|
|
|
|
|
baker.quick_step = 1;
|
|
|
|
|
|
|
|
|
|
BKE_ptcache_bake(&baker);
|
|
|
|
|
@@ -1608,8 +1610,8 @@ static bool render_init_from_main(Render *re,
|
|
|
|
|
Scene *scene,
|
|
|
|
|
ViewLayer *single_layer,
|
|
|
|
|
Object *camera_override,
|
|
|
|
|
int anim,
|
|
|
|
|
int anim_init)
|
|
|
|
|
const bool anim,
|
|
|
|
|
const bool anim_init)
|
|
|
|
|
{
|
|
|
|
|
int winx, winy;
|
|
|
|
|
rcti disprect;
|
|
|
|
|
@@ -1755,7 +1757,8 @@ void RE_RenderFrame(Render *re,
|
|
|
|
|
scene->r.cfra = frame;
|
|
|
|
|
scene->r.subframe = subframe;
|
|
|
|
|
|
|
|
|
|
if (render_init_from_main(re, &scene->r, bmain, scene, single_layer, camera_override, 0, 0)) {
|
|
|
|
|
if (render_init_from_main(
|
|
|
|
|
re, &scene->r, bmain, scene, single_layer, camera_override, false, false)) {
|
|
|
|
|
RenderData rd;
|
|
|
|
|
memcpy(&rd, &scene->r, sizeof(rd));
|
|
|
|
|
MEM_reset_peak_memory();
|
|
|
|
|
@@ -1825,10 +1828,10 @@ static bool use_eevee_for_freestyle_render(Render *re)
|
|
|
|
|
return !(type->flag & RE_USE_CUSTOM_FREESTYLE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene, int render)
|
|
|
|
|
void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene, const bool render)
|
|
|
|
|
{
|
|
|
|
|
re->result_ok = false;
|
|
|
|
|
if (render_init_from_main(re, &scene->r, bmain, scene, nullptr, nullptr, 0, 0)) {
|
|
|
|
|
if (render_init_from_main(re, &scene->r, bmain, scene, nullptr, nullptr, false, false)) {
|
|
|
|
|
if (render) {
|
|
|
|
|
char scene_engine[32];
|
|
|
|
|
BLI_strncpy(scene_engine, re->r.engine, sizeof(scene_engine));
|
|
|
|
|
@@ -2095,7 +2098,7 @@ void RE_RenderAnim(Render *re,
|
|
|
|
|
(rd.im_format.views_format == R_IMF_VIEWS_INDIVIDUAL));
|
|
|
|
|
|
|
|
|
|
/* do not fully call for each frame, it initializes & pops output window */
|
|
|
|
|
if (!render_init_from_main(re, &rd, bmain, scene, single_layer, camera_override, 0, 1)) {
|
|
|
|
|
if (!render_init_from_main(re, &rd, bmain, scene, single_layer, camera_override, false, true)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2182,7 +2185,7 @@ void RE_RenderAnim(Render *re,
|
|
|
|
|
render_update_depsgraph(re);
|
|
|
|
|
|
|
|
|
|
/* Only border now, TODO(ton): camera lens. */
|
|
|
|
|
render_init_from_main(re, &rd, bmain, scene, single_layer, camera_override, 1, 0);
|
|
|
|
|
render_init_from_main(re, &rd, bmain, scene, single_layer, camera_override, true, false);
|
|
|
|
|
|
|
|
|
|
if (nfra != scene->r.cfra) {
|
|
|
|
|
/* Skip this frame, but could update for physics and particles system. */
|
|
|
|
|
|