diff options
Diffstat (limited to 'source/blender/render/intern/source/convertblender.c')
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 284 |
1 files changed, 151 insertions, 133 deletions
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 52cd5c3449e..0480ffe42d9 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -66,12 +66,13 @@ #include "BKE_customdata.h" #include "BKE_colortools.h" #include "BKE_displist.h" -#include "BKE_depsgraph.h" #include "BKE_DerivedMesh.h" #include "BKE_global.h" +#include "BKE_group.h" #include "BKE_key.h" #include "BKE_image.h" #include "BKE_lattice.h" +#include "BKE_layer.h" #include "BKE_material.h" #include "BKE_main.h" #include "BKE_mball.h" @@ -82,6 +83,9 @@ #include "BKE_particle.h" #include "BKE_scene.h" +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_build.h" + #include "PIL_time.h" #include "envmap.h" @@ -1288,7 +1292,8 @@ static void get_particle_uvco_mcol(short from, DerivedMesh *dm, float *fuv, int } } } -static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem *psys, int timeoffset) +static int render_new_particle_system(const EvaluationContext *eval_ctx, Render *re, + ObjectRen *obr, ParticleSystem *psys, int timeoffset) { Object *ob= obr->ob; // Object *tob=0; @@ -1336,7 +1341,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if (part->ren_as==PART_DRAW_OB || part->ren_as==PART_DRAW_GR || part->ren_as==PART_DRAW_NOT) return 1; - if ((re->r.scemode & R_VIEWPORT_PREVIEW) && (ob->mode & OB_MODE_PARTICLE_EDIT)) + if ((re->r.scemode & R_VIEWPORT_PREVIEW) && (eval_ctx->object_mode & OB_MODE_PARTICLE_EDIT)) return 0; if (part->ren_as == PART_DRAW_BB && part->bb_ob == NULL && RE_GetCamera(re) == NULL) @@ -1349,10 +1354,11 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if (!(psmd->modifier.mode & eModifierMode_Render)) return 0; - sim.scene= re->scene; - sim.ob= ob; - sim.psys= psys; - sim.psmd= psmd; + sim.eval_ctx = eval_ctx; + sim.scene = re->scene; + sim.ob = ob; + sim.psys = psys; + sim.psmd = psmd; if (part->phystype==PART_PHYS_KEYED) psys_count_keyed_targets(&sim); @@ -2173,7 +2179,7 @@ static void displace(Render *re, ObjectRen *obr) /* Metaball */ /* ------------------------------------------------------------------------- */ -static void init_render_mball(Render *re, ObjectRen *obr) +static void init_render_mball(const EvaluationContext *eval_ctx, Render *re, ObjectRen *obr) { Object *ob= obr->ob; DispList *dl; @@ -2199,7 +2205,7 @@ static void init_render_mball(Render *re, ObjectRen *obr) need_orco= 1; } - BKE_displist_make_mball_forRender(re->eval_ctx, re->scene, ob, &dispbase); + BKE_displist_make_mball_forRender(eval_ctx, re->scene, ob, &dispbase); dl= dispbase.first; if (dl == NULL) return; @@ -2566,7 +2572,7 @@ static void init_render_dm(DerivedMesh *dm, Render *re, ObjectRen *obr, } -static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset) +static void init_render_surf(const EvaluationContext *eval_ctx, Render *re, ObjectRen *obr, int timeoffset) { Object *ob= obr->ob; Nurb *nu = NULL; @@ -2599,13 +2605,13 @@ static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset) if (ob->parent && (ob->parent->type==OB_LATTICE)) need_orco= 1; - BKE_displist_make_surf(re->scene, ob, &displist, &dm, 1, 0, 1); + BKE_displist_make_surf(eval_ctx, re->scene, ob, &displist, &dm, 1, 0, 1); if (dm) { if (need_orco) { orco = get_object_orco(re, ob); if (!orco) { - orco= BKE_displist_make_orco(re->scene, ob, dm, true, true); + orco= BKE_displist_make_orco(eval_ctx, re->scene, ob, dm, true, true); if (orco) { set_object_orco(re, ob, orco); } @@ -2637,7 +2643,7 @@ static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset) MEM_freeN(matar); } -static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) +static void init_render_curve(const EvaluationContext *eval_ctx, Render *re, ObjectRen *obr, int timeoffset) { Object *ob= obr->ob; Curve *cu; @@ -2657,7 +2663,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) if (ob->type==OB_FONT && cu->str==NULL) return; else if (ob->type==OB_CURVE && cu->nurb.first==NULL) return; - BKE_displist_make_curveTypes_forRender(re->scene, ob, &disp, &dm, false, true); + BKE_displist_make_curveTypes_forRender(eval_ctx, re->scene, ob, &disp, &dm, false, true); dl= disp.first; if (dl==NULL) return; @@ -2684,7 +2690,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) if (need_orco) { orco = get_object_orco(re, ob); if (!orco) { - orco = BKE_displist_make_orco(re->scene, ob, dm, true, true); + orco = BKE_displist_make_orco(eval_ctx, re->scene, ob, dm, true, true); if (orco) { set_object_orco(re, ob, orco); } @@ -2698,7 +2704,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) if (need_orco) { orco = get_object_orco(re, ob); if (!orco) { - orco = BKE_curve_make_orco(re->scene, ob, NULL); + orco = BKE_curve_make_orco(eval_ctx, re->scene, ob, NULL); set_object_orco(re, ob, orco); } } @@ -3109,7 +3115,7 @@ static bool has_freestyle_edge_mark(EdgeHash *edge_hash, int v1, int v2) } #endif -static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) +static void init_render_mesh(const EvaluationContext *eval_ctx, Render *re, ObjectRen *obr, int timeoffset) { Object *ob= obr->ob; Mesh *me; @@ -3153,11 +3159,11 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) /* normalmaps, test if tangents needed, separated from shading */ if (ma->mode_l & MA_TANGENT_V) { need_tangent= 1; - if (me->mtpoly==NULL) + if (me->mloopuv==NULL) need_orco= 1; } if (ma->mode_l & MA_NORMAP_TANG) { - if (me->mtpoly==NULL) { + if (me->mloopuv==NULL) { need_orco= 1; } need_tangent= 1; @@ -3170,7 +3176,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) if (re->flag & R_NEED_TANGENT) { /* exception for tangent space baking */ - if (me->mtpoly==NULL) { + if (me->mloopuv==NULL) { need_orco= 1; } need_tangent= 1; @@ -3198,9 +3204,9 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) #endif if (re->r.scemode & R_VIEWPORT_PREVIEW) - dm= mesh_create_derived_view(re->scene, ob, mask); + dm= mesh_create_derived_view(eval_ctx, re->scene, ob, mask); else - dm= mesh_create_derived_render(re->scene, ob, mask); + dm= mesh_create_derived_render(eval_ctx, re->scene, ob, mask); if (dm==NULL) return; /* in case duplicated object fails? */ mvert= dm->getVertArray(dm); @@ -3977,28 +3983,32 @@ static bool is_object_hidden(Render *re, Object *ob) /* layflag: allows material group to ignore layerflag */ static void add_lightgroup(Render *re, Group *group, int exclusive) { - GroupObject *go, *gol; - group->id.tag &= ~LIB_TAG_DOIT; +#if 0 /* it's a bit too many loops in loops... but will survive */ /* note that 'exclusive' will remove it from the global list */ - for (go= group->gobject.first; go; go= go->next) { - go->lampren= NULL; + FOREACH_GROUP_BASE_BEGIN(group, base) + { + Object *object = base->object; - if (is_object_hidden(re, go->ob)) + if (is_object_hidden(re, object)) { continue; - - if (go->ob->lay & re->lay) { - if (go->ob && go->ob->type==OB_LAMP) { - for (gol= re->lights.first; gol; gol= gol->next) { - if (gol->ob==go->ob) { - go->lampren= gol->lampren; + } + + if (base->flag & BASE_VISIBLED) { + if (object && object->type == OB_LAMP) { + for (GroupObject *gol = re->lights.first; gol; gol = gol->next) { + if (gol->ob == object) { + go->lampren = gol->lampren; break; } } - if (go->lampren==NULL) - gol= add_render_lamp(re, go->ob); + + if (go->lampren == NULL) { + gol= add_render_lamp(re, object); + } + if (gol && exclusive) { BLI_remlink(&re->lights, gol); MEM_freeN(gol); @@ -4006,6 +4016,10 @@ static void add_lightgroup(Render *re, Group *group, int exclusive) } } } + FOREACH_GROUP_BASE_END; +#else + UNUSED_VARS(re, exclusive); +#endif } static void set_material_lightgroups(Render *re) @@ -4028,16 +4042,6 @@ static void set_material_lightgroups(Render *re) } } -static void set_renderlayer_lightgroups(Render *re, Scene *sce) -{ - SceneRenderLayer *srl; - - for (srl= sce->r.layers.first; srl; srl= srl->next) { - if (srl->light_override) - add_lightgroup(re, srl->light_override, 0); - } -} - /* ------------------------------------------------------------------------- */ /* World */ /* ------------------------------------------------------------------------- */ @@ -4605,7 +4609,7 @@ static void set_dupli_tex_mat(Render *re, ObjectInstanceRen *obi, DupliObject *d copy_v2_v2(obi->dupliuv, dob->uv); } -static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset) +static void init_render_object_data(const EvaluationContext *eval_ctx, Render *re, ObjectRen *obr, int timeoffset) { Object *ob= obr->ob; ParticleSystem *psys; @@ -4619,26 +4623,26 @@ static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset) const CustomDataMask mask = CD_MASK_RENDER_INTERNAL; if (re->r.scemode & R_VIEWPORT_PREVIEW) - dm = mesh_create_derived_view(re->scene, ob, mask); + dm = mesh_create_derived_view(eval_ctx, re->scene, ob, mask); else - dm = mesh_create_derived_render(re->scene, ob, mask); + dm = mesh_create_derived_render(eval_ctx, re->scene, ob, mask); dm->release(dm); } for (psys=ob->particlesystem.first, i=0; i<obr->psysindex-1; i++) psys= psys->next; - render_new_particle_system(re, obr, psys, timeoffset); + render_new_particle_system(eval_ctx, re, obr, psys, timeoffset); } else { if (ELEM(ob->type, OB_FONT, OB_CURVE)) - init_render_curve(re, obr, timeoffset); + init_render_curve(eval_ctx, re, obr, timeoffset); else if (ob->type==OB_SURF) - init_render_surf(re, obr, timeoffset); + init_render_surf(eval_ctx, re, obr, timeoffset); else if (ob->type==OB_MESH) - init_render_mesh(re, obr, timeoffset); + init_render_mesh(eval_ctx, re, obr, timeoffset); else if (ob->type==OB_MBALL) - init_render_mball(re, obr); + init_render_mball(eval_ctx, re, obr); } finalize_render_object(re, obr, timeoffset); @@ -4649,7 +4653,8 @@ static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset) re->totstrand += obr->totstrand; } -static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *dob, float omat[4][4], int timeoffset) +static void add_render_object(const EvaluationContext *eval_ctx, Render *re, Object *ob, Object *par, DupliObject *dob, + float omat[4][4], int timeoffset) { ObjectRen *obr; ObjectInstanceRen *obi; @@ -4667,9 +4672,8 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject * /* the emitter has to be processed first (render levels of modifiers) */ /* so here we only check if the emitter should be rendered */ if (ob->particlesystem.first) { - show_emitter= 0; + show_emitter = (ob->duplicator_visibility_flag & OB_DUPLI_FLAG_RENDER) != 0; for (psys=ob->particlesystem.first; psys; psys=psys->next) { - show_emitter += psys->part->draw & PART_DRAW_EMITTER; if (!(re->r.scemode & R_VIEWPORT_PREVIEW)) { psys_has_renderdata |= (psys->renderdata != NULL); psys_render_set(ob, psys, re->viewmat, re->winmat, re->winx, re->winy, timeoffset); @@ -4688,7 +4692,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject * obr->flag |= R_INSTANCEABLE; copy_m4_m4(obr->obmat, ob->obmat); } - init_render_object_data(re, obr, timeoffset); + init_render_object_data(eval_ctx, re, obr, timeoffset); /* only add instance for objects that have not been used for dupli */ if (!(ob->transflag & OB_RENDER_DUPLI)) { @@ -4719,7 +4723,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject * } if (dob) psys->flag |= PSYS_USE_IMAT; - init_render_object_data(re, obr, timeoffset); + init_render_object_data(eval_ctx, re, obr, timeoffset); if (!(re->r.scemode & R_VIEWPORT_PREVIEW) && !psys_has_renderdata) { psys_render_restore(ob, psys); } @@ -4738,7 +4742,8 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject * /* par = pointer to duplicator parent, needed for object lookup table */ /* index = when duplicater copies same object (particle), the counter */ -static void init_render_object(Render *re, Object *ob, Object *par, DupliObject *dob, float omat[4][4], int timeoffset) +static void init_render_object(const EvaluationContext *eval_ctx, Render *re, Object *ob, Object *par, DupliObject *dob, + float omat[4][4], int timeoffset) { static double lasttime= 0.0; double time; @@ -4747,7 +4752,7 @@ static void init_render_object(Render *re, Object *ob, Object *par, DupliObject if (ob->type==OB_LAMP) add_render_lamp(re, ob); else if (render_object_type(ob->type)) - add_render_object(re, ob, par, dob, omat, timeoffset); + add_render_object(eval_ctx, re, ob, par, dob, omat, timeoffset); else { mul_m4_m4m4(mat, re->viewmat, ob->obmat); invert_m4_m4(ob->imat, mat); @@ -4847,6 +4852,8 @@ void RE_Database_Free(Render *re) BLI_memarena_free(re->memArena); re->memArena = NULL; } + + BKE_viewrender_free(&re->view_render); } static int allow_render_object(Render *re, Object *ob, int nolamps, int onlyselected, Object *actob) @@ -4901,12 +4908,11 @@ static int allow_render_dupli_instance(Render *UNUSED(re), DupliObject *dob, Obj (!(dob->type == OB_DUPLIGROUP) || !dob->animated)); } -static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, int level, int enable) +static void dupli_render_particle_set(const EvaluationContext *eval_ctx, Render *re, Object *ob, + int timeoffset, int level, int enable) { /* ugly function, but we need to set particle systems to their render * settings before calling object_duplilist, to get render level duplis */ - Group *group; - GroupObject *go; ParticleSystem *psys; DerivedMesh *dm; @@ -4930,7 +4936,7 @@ static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, in /* this is to make sure we get render level duplis in groups: * the derivedmesh must be created before init_render_mesh, * since object_duplilist does dupliparticles before that */ - dm = mesh_create_derived_render(re->scene, ob, CD_MASK_RENDER_INTERNAL); + dm = mesh_create_derived_render(eval_ctx, re->scene, ob, CD_MASK_RENDER_INTERNAL); dm->release(dm); for (psys=ob->particlesystem.first; psys; psys=psys->next) @@ -4938,60 +4944,54 @@ static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, in } } - if (ob->dup_group==NULL) return; - group= ob->dup_group; + if (ob->dup_group == NULL) return; - for (go= group->gobject.first; go; go= go->next) - dupli_render_particle_set(re, go->ob, timeoffset, level+1, enable); + FOREACH_GROUP_OBJECT_BEGIN(ob->dup_group, object) + { + dupli_render_particle_set(eval_ctx, re, object, timeoffset, level+1, enable); + } + FOREACH_GROUP_OBJECT_END; } -static int get_vector_renderlayers(Scene *sce) +static int get_vector_viewlayers(Scene *UNUSED(sce)) { - SceneRenderLayer *srl; - unsigned int lay= 0; - - for (srl= sce->r.layers.first; srl; srl= srl->next) - if (srl->passflag & SCE_PASS_VECTOR) - lay |= srl->lay; - - return lay; + return 0; } -static void add_group_render_dupli_obs(Render *re, Group *group, int nolamps, int onlyselected, Object *actob, int timeoffset, int level) +static void add_group_render_dupli_obs(const EvaluationContext *eval_ctx, Render *re, Group *group, int nolamps, + int onlyselected, Object *actob, int timeoffset, int level) { - GroupObject *go; - Object *ob; - - /* simple preventing of too deep nested groups */ - if (level>MAX_DUPLI_RECUR) return; - - /* recursively go into dupligroups to find objects with OB_RENDER_DUPLI - * that were not created yet */ - for (go= group->gobject.first; go; go= go->next) { - ob= go->ob; + /* Simple preventing of too deep nested groups. */ + if (level > MAX_DUPLI_RECUR) return; + /* Recursively go into dupligroups to find objects with OB_RENDER_DUPLI + * that were not created yet. */ + FOREACH_GROUP_OBJECT_BEGIN(group, ob) + { if (ob->flag & OB_DONE) { if (ob->transflag & OB_RENDER_DUPLI) { if (allow_render_object(re, ob, nolamps, onlyselected, actob)) { - init_render_object(re, ob, NULL, NULL, NULL, timeoffset); + init_render_object(eval_ctx, re, ob, NULL, NULL, NULL, timeoffset); ob->transflag &= ~OB_RENDER_DUPLI; - if (ob->dup_group) - add_group_render_dupli_obs(re, ob->dup_group, nolamps, onlyselected, actob, timeoffset, level+1); + if (ob->dup_group) { + add_group_render_dupli_obs(eval_ctx, re, ob->dup_group, nolamps, onlyselected, actob, timeoffset, level+1); + } } } } } + FOREACH_GROUP_OBJECT_END; } -static void database_init_objects(Render *re, unsigned int renderlay, int nolamps, int onlyselected, Object *actob, int timeoffset) +static void database_init_objects(const EvaluationContext *eval_ctx, Render *re, unsigned int UNUSED(renderlay), + int nolamps, int onlyselected, Object *actob, int timeoffset) { Base *base; Object *ob; Group *group; ObjectInstanceRen *obi; Scene *sce_iter; - int lay, vectorlay; /* for duplis we need the Object texture mapping to work as if * untransformed, set_dupli_tex_mat sets the matrix to allow that @@ -5019,14 +5019,18 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp for (SETLOOPER(re->scene, sce_iter, base)) { ob= base->object; +#if 0 + TODO_LAYER; /* investigate if this is an issue*/ /* in the prev/next pass for making speed vectors, avoid creating * objects that are not on a renderlayer with a vector pass, can * save a lot of time in complex scenes */ - vectorlay= get_vector_renderlayers(re->scene); - lay= (timeoffset)? renderlay & vectorlay: renderlay; + vectorlay= get_vector_viewlayers(re->scene); +#endif - /* if the object has been restricted from rendering in the outliner, ignore it */ - if (is_object_restricted(re, ob)) continue; + /* if the object is not visible, ignore it */ + if ((base->flag & BASE_VISIBLED) == 0) { + continue; + } /* OB_DONE means the object itself got duplicated, so was already converted */ if (ob->flag & OB_DONE) { @@ -5034,12 +5038,12 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp * it still needs to create the ObjectRen containing the data */ if (ob->transflag & OB_RENDER_DUPLI) { if (allow_render_object(re, ob, nolamps, onlyselected, actob)) { - init_render_object(re, ob, NULL, NULL, NULL, timeoffset); + init_render_object(eval_ctx, re, ob, NULL, NULL, NULL, timeoffset); ob->transflag &= ~OB_RENDER_DUPLI; } } } - else if ((base->lay & lay) || (ob->type==OB_LAMP && (base->lay & re->lay)) ) { + else if (((base->flag & BASE_VISIBLED) != 0) || (ob->type==OB_LAMP)) { if ((ob->transflag & OB_DUPLI) && (ob->type!=OB_MBALL)) { DupliObject *dob; ListBase *duplilist; @@ -5048,9 +5052,9 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp /* create list of duplis generated by this object, particle * system need to have render settings set for dupli particles */ - dupli_render_particle_set(re, ob, timeoffset, 0, 1); - duplilist = object_duplilist(re->eval_ctx, re->scene, ob); - duplilist_apply_data = duplilist_apply(ob, NULL, duplilist); + dupli_render_particle_set(eval_ctx, re, ob, timeoffset, 0, 1); + duplilist = object_duplilist(eval_ctx, re->scene, ob); + duplilist_apply_data = duplilist_apply(eval_ctx, ob, NULL, duplilist); /* postpone 'dupli_render_particle_set', since RE_addRenderInstance reads * index values from 'dob->persistent_id[0]', referencing 'psys->child' which * may be smaller once the particle system is restored, see: T45563. */ @@ -5133,7 +5137,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp if (obi==NULL) /* can't instance, just create the object */ - init_render_object(re, obd, ob, dob, dob_extra->obmat, timeoffset); + init_render_object(eval_ctx, re, obd, ob, dob, dob_extra->obmat, timeoffset); if (dob->type != OB_DUPLIGROUP) { obd->flag |= OB_DONE; @@ -5141,13 +5145,13 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp } } else - init_render_object(re, obd, ob, dob, dob_extra->obmat, timeoffset); + init_render_object(eval_ctx, re, obd, ob, dob, dob_extra->obmat, timeoffset); if (re->test_break(re->tbh)) break; } /* restore particle system */ - dupli_render_particle_set(re, ob, timeoffset, 0, false); + dupli_render_particle_set(eval_ctx, re, ob, timeoffset, 0, false); if (duplilist_apply_data) { duplilist_restore(duplilist, duplilist_apply_data); @@ -5156,10 +5160,10 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp free_object_duplilist(duplilist); if (allow_render_object(re, ob, nolamps, onlyselected, actob)) - init_render_object(re, ob, NULL, NULL, NULL, timeoffset); + init_render_object(eval_ctx, re, ob, NULL, NULL, NULL, timeoffset); } else if (allow_render_object(re, ob, nolamps, onlyselected, actob)) - init_render_object(re, ob, NULL, NULL, NULL, timeoffset); + init_render_object(eval_ctx, re, ob, NULL, NULL, NULL, timeoffset); } if (re->test_break(re->tbh)) break; @@ -5168,7 +5172,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp /* objects in groups with OB_RENDER_DUPLI set still need to be created, * since they may not be part of the scene */ for (group= re->main->group.first; group; group=group->id.next) - add_group_render_dupli_obs(re, group, nolamps, onlyselected, actob, timeoffset, 0); + add_group_render_dupli_obs(eval_ctx, re, group, nolamps, onlyselected, actob, timeoffset, 0); if (!re->test_break(re->tbh)) RE_makeRenderInstances(re); @@ -5177,7 +5181,6 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp /* used to be 'rotate scene' */ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int lay, int use_camera_view) { - Scene *sce; Object *camera; float mat[4][4]; float amb[3]; @@ -5196,6 +5199,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l re->i.infostr= "Preparing Scene data"; re->i.cfra= scene->r.cfra; BLI_strncpy(re->i.scene_name, scene->id.name + 2, sizeof(re->i.scene_name)); + re->view_render = scene->view_render; /* XXX add test if dbase was filled already? */ @@ -5212,14 +5216,13 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l /* applies changes fully */ if ((re->r.scemode & (R_NO_FRAME_UPDATE|R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))==0) { - BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene, lay); - render_update_anim_renderdata(re, &re->scene->r); + render_update_anim_renderdata(re, &re->scene->r, &re->scene->view_layers); } /* if no camera, viewmat should have been set! */ if (use_camera_view && camera) { /* called before but need to call again in case of lens animation from the - * above call to BKE_scene_update_for_newframe, fixes bug. [#22702]. + * above call to BKE_scene_graph_update_for_newframe, fixes bug. [#22702]. * following calls don't depend on 'RE_SetCamera' */ RE_SetCamera(re, camera); RE_GetCameraModelMatrix(re, camera, mat); @@ -5227,7 +5230,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l RE_SetView(re, mat); /* force correct matrix for scaled cameras */ - DAG_id_tag_update_ex(re->main, &camera->id, OB_RECALC_OB); + DEG_id_tag_update_ex(re->main, &camera->id, OB_RECALC_OB); } /* store for incremental render, viewmat rotates dbase */ @@ -5249,12 +5252,15 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l set_node_shader_lamp_loop(shade_material_loop); /* MAKE RENDER DATA */ - database_init_objects(re, lay, 0, 0, NULL, 0); + EvaluationContext *eval_ctx = NULL; + BLI_assert(eval_ctx); + /* This will break things, and it should because honestly this function is deprecated and no one uses it. + * maybe freestyle? But even so, this need to change. Even freestyle need to get data from depsgraph + * so we can't create the database only once. */ + database_init_objects(eval_ctx, re, lay, 0, 0, NULL, 0); if (!re->test_break(re->tbh)) { set_material_lightgroups(re); - for (sce= re->scene; sce; sce= sce->set) - set_renderlayer_lightgroups(re, sce); /* for now some clumsy copying still */ re->i.totvert= re->totvert; @@ -5266,7 +5272,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l } } -void RE_Database_Preprocess(Render *re) +void RE_Database_Preprocess(EvaluationContext *eval_ctx, Render *re) { if (!re->test_break(re->tbh)) { int tothalo; @@ -5296,7 +5302,7 @@ void RE_Database_Preprocess(Render *re) /* point density texture */ if (!re->test_break(re->tbh)) - make_pointdensities(re); + make_pointdensities(eval_ctx, re); /* voxel data texture */ if (!re->test_break(re->tbh)) make_voxeldata(re); @@ -5367,7 +5373,11 @@ void RE_DataBase_GetView(Render *re, float mat[4][4]) /* Speed Vectors */ /* ------------------------------------------------------------------------- */ -static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int lay, int timeoffset) +static void database_fromscene_vectors(EvaluationContext *eval_ctx, + Render *re, + Scene *scene, + unsigned int lay, + int timeoffset) { Object *camera= RE_GetCamera(re); float mat[4][4]; @@ -5382,13 +5392,9 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la re->i.totface=re->i.totvert=re->i.totstrand=re->i.totlamp=re->i.tothalo= 0; re->lights.first= re->lights.last= NULL; - /* in localview, lamps are using normal layers, objects only local bits */ - if (re->lay & 0xFF000000) - lay &= 0xFF000000; - /* applies changes fully */ scene->r.cfra += timeoffset; - BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene, lay); + BKE_scene_graph_update_for_newframe(eval_ctx, eval_ctx->depsgraph, re->main, re->scene, NULL); /* if no camera, viewmat should have been set! */ if (camera) { @@ -5399,7 +5405,7 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la } /* MAKE RENDER DATA */ - database_init_objects(re, lay, 0, 0, NULL, timeoffset); + database_init_objects(eval_ctx, re, lay, 0, 0, NULL, timeoffset); if (!re->test_break(re->tbh)) project_renderdata(re, projectverto, (re->r.mode & R_PANORAMA) != 0, 0, 1); @@ -5756,7 +5762,7 @@ static void free_dbase_object_vectors(ListBase *lb) BLI_freelistN(lb); } -void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned int lay) +void RE_Database_FromScene_Vectors(EvaluationContext *eval_ctx, Render *re, Main *bmain, Scene *sce, unsigned int lay) { ObjectInstanceRen *obi, *oldobi; StrandSurface *mesh; @@ -5771,7 +5777,7 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned speedvector_project(re, NULL, NULL, NULL); /* initializes projection code */ /* creates entire dbase */ - database_fromscene_vectors(re, sce, lay, -1); + database_fromscene_vectors(eval_ctx, re, sce, lay, -1); /* copy away vertex info */ copy_dbase_object_vectors(re, &oldtable); @@ -5787,7 +5793,7 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned /* creates entire dbase */ re->i.infostr = IFACE_("Calculating next frame vectors"); - database_fromscene_vectors(re, sce, lay, +1); + database_fromscene_vectors(eval_ctx, re, sce, lay, +1); } /* copy away vertex info */ copy_dbase_object_vectors(re, &newtable); @@ -5801,11 +5807,11 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned if (!re->test_break(re->tbh)) { RE_Database_FromScene(re, bmain, sce, lay, 1); - RE_Database_Preprocess(re); + RE_Database_Preprocess(eval_ctx, re); } if (!re->test_break(re->tbh)) { - int vectorlay= get_vector_renderlayers(re->scene); + int vectorlay= get_vector_viewlayers(re->scene); for (step= 0; step<2; step++) { @@ -5895,7 +5901,8 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned * RE_BAKE_DERIVATIVE:for baking, no lamps, only selected objects * RE_BAKE_SHADOW: for baking, only shadows, but all objects */ -void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, const int type, Object *actob) +void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, ViewLayer *view_layer, + unsigned int lay, const int type, Object *actob) { Object *camera; float mat[4][4]; @@ -5909,8 +5916,19 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, /* renderdata setup and exceptions */ render_copy_renderdata(&re->r, &scene->r); + render_copy_viewrender(&re->view_render, &scene->view_render); RE_init_threadcount(re); + + EvaluationContext *eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER); + Depsgraph *depsgraph = DEG_graph_new(); + DEG_evaluation_context_init_from_view_layer_for_render(eval_ctx, depsgraph, scene, view_layer); + DEG_graph_build_from_view_layer(depsgraph, bmain, scene, view_layer); + BKE_scene_graph_update_tagged(eval_ctx, + depsgraph, + bmain, + scene, + view_layer); re->flag |= R_BAKING; re->excludeob= actob; @@ -5982,7 +6000,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, set_node_shader_lamp_loop(shade_material_loop); /* MAKE RENDER DATA */ - database_init_objects(re, lay, nolamps, onlyselected, actob, 0); + database_init_objects(eval_ctx, re, lay, nolamps, onlyselected, actob, 0); set_material_lightgroups(re); @@ -5998,7 +6016,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, /* point density texture */ if (!re->test_break(re->tbh)) - make_pointdensities(re); + make_pointdensities(eval_ctx, re); /* voxel data texture */ if (!re->test_break(re->tbh)) |