diff options
Diffstat (limited to 'source/blender/render')
14 files changed, 184 insertions, 226 deletions
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index f789ab702fe..b1e5ff9890b 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -92,7 +92,7 @@ typedef struct RenderEngineType { char name[64]; int flag; - void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Depsgraph *depsgraph, struct Scene *scene); + void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Scene *scene); void (*render_to_image)(struct RenderEngine *engine, struct Depsgraph *depsgraph); void (*bake)(struct RenderEngine *engine, struct Scene *scene, struct Object *object, const int pass_type, const int pass_filter, const int object_id, const struct BakePixel *pixel_array, const int num_pixels, @@ -190,9 +190,7 @@ RenderEngineType *RE_engines_find(const char *idname); rcti* RE_engine_get_current_tiles(struct Render *re, int *r_total_tiles, bool *r_needs_free); struct RenderData *RE_engine_get_render_data(struct Render *re); void RE_bake_engine_set_engine_parameters( - struct Render *re, struct Main *bmain, struct Depsgraph *graph, struct Scene *scene); - -struct ViewLayer *RE_engine_get_view_layer(struct Render *re); + struct Render *re, struct Main *bmain, struct Scene *scene); #endif /* __RE_ENGINE_H__ */ diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 0557efccc2f..822993a2372 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -34,6 +34,7 @@ #include "DNA_listBase.h" #include "DNA_vec_types.h" +#include "DEG_depsgraph.h" struct bMovieHandle; struct bNodeTree; @@ -121,7 +122,9 @@ typedef struct RenderLayer { /* optional saved endresult on disk */ void *exrhandle; - + + struct EvaluationContext eval_ctx; + ListBase passes; } RenderLayer; @@ -250,7 +253,6 @@ void RE_ChangeModeFlag(struct Render *re, int flag, bool clear); struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */ void RE_SetOverrideCamera(struct Render *re, struct Object *camera); void RE_SetCamera(struct Render *re, struct Object *camera); -void RE_SetDepsgraph(struct Render *re, struct Depsgraph *graph); void RE_SetEnvmapCamera(struct Render *re, struct Object *cam_ob, float viewscale, float clipsta, float clipend); void RE_SetWindow(struct Render *re, const rctf *viewplane, float clipsta, float clipend); void RE_SetOrtho(struct Render *re, const rctf *viewplane, float clipsta, float clipend); @@ -267,7 +269,7 @@ void RE_GetViewPlane(struct Render *re, rctf *r_viewplane, rcti *r_disprect); void RE_Database_FromScene( struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int use_camera_view); -void RE_Database_Preprocess(struct Render *re); +void RE_Database_Preprocess(struct EvaluationContext *eavl_ctx, struct Render *re); void RE_Database_Free(struct Render *re); /* project dbase again, when viewplane/perspective changed */ @@ -368,14 +370,13 @@ struct RenderPass *RE_pass_find_by_type(volatile struct RenderLayer *rl, int pas #define RE_BAKE_VERTEX_COLORS 14 void RE_Database_Baking( - struct Render *re, struct Main *bmain, struct Scene *scene, + struct Render *re, struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, unsigned int lay, const int type, struct Object *actob); 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]); void RE_GetCameraModelMatrix(struct Render *re, struct Object *camera, float r_mat[4][4]); struct Scene *RE_GetScene(struct Render *re); -struct EvaluationContext *RE_GetEvalCtx(struct Render *re); bool RE_force_single_renderlayer(struct Scene *scene); bool RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, struct ReportList *reports); diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h index 17b321fd3b4..4e3430c2892 100644 --- a/source/blender/render/extern/include/RE_render_ext.h +++ b/source/blender/render/extern/include/RE_render_ext.h @@ -38,6 +38,7 @@ /* called by meshtools */ struct DerivedMesh; +struct EvaluationContext; struct ImagePool; struct MTex; struct Scene; @@ -55,7 +56,7 @@ float texture_value_blend(float tex, float out, float fact, float facg, int blen void RE_texture_rng_init(void); void RE_texture_rng_exit(void); -struct Material *RE_sample_material_init(struct Material *orig_mat, struct Scene *scene); +struct Material *RE_sample_material_init(const struct EvaluationContext *eval_ctx, struct Material *orig_mat, struct Scene *scene); void RE_sample_material_free(struct Material *mat); void RE_sample_material_color( struct Material *mat, float color[3], float *alpha, const float volume_co[3], const float surface_co[3], diff --git a/source/blender/render/intern/include/pointdensity.h b/source/blender/render/intern/include/pointdensity.h index 1d1e808e8d3..f122b3dc4c1 100644 --- a/source/blender/render/intern/include/pointdensity.h +++ b/source/blender/render/intern/include/pointdensity.h @@ -37,13 +37,14 @@ * Make point density kd-trees for all point density textures in the scene */ +struct EvaluationContext; struct PointDensity; struct Render; struct TexResult; void free_pointdensity(struct PointDensity *pd); -void cache_pointdensity(struct Render *re, struct PointDensity *pd); -void make_pointdensities(struct Render *re); +void cache_pointdensity(const struct EvaluationContext *eval_ctx, struct Render *re, struct PointDensity *pd); +void make_pointdensities(const struct EvaluationContext *eval_ctx, struct Render *re); void free_pointdensities(struct Render *re); int pointdensitytex(struct Tex *tex, const float texvec[3], struct TexResult *texres); diff --git a/source/blender/render/intern/include/render_result.h b/source/blender/render/intern/include/render_result.h index 8d293c938c7..b2c5758f506 100644 --- a/source/blender/render/intern/include/render_result.h +++ b/source/blender/render/intern/include/render_result.h @@ -117,5 +117,28 @@ void render_result_views_shallowcopy(struct RenderResult *dst, struct RenderResu void render_result_views_shallowdelete(struct RenderResult *rr); bool render_result_has_views(struct RenderResult *rr); +#define FOREACH_VIEW_LAYER_TO_RENDER(re_, iter_) \ +{ \ + int nr; \ + ViewLayer *iter_; \ + for (nr = 0, iter_ = (re_)->view_layers.first; \ + iter_ != NULL; \ + iter_ = iter_->next, nr++) \ + { \ + if ((re_)->r.scemode & R_SINGLE_LAYER) { \ + if (nr != re->active_view_layer) { \ + continue; \ + } \ + } \ + else { \ + if ((iter_->flag & VIEW_LAYER_RENDER) == 0) { \ + continue; \ + } \ + } + +#define FOREACH_VIEW_LAYER_TO_RENDER_END \ + } \ +} + #endif /* __RENDER_RESULT_H__ */ diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index d24aae6ac97..2c46138c7ea 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -185,8 +185,6 @@ struct Render { /* shadow counter, detect shadow-reuse for shaders */ int shadowsamplenr[BLENDER_MAX_THREADS]; - - struct Depsgraph *depsgraph; /* main, scene, and its full copy of renderdata and world */ struct Main *main; @@ -280,7 +278,6 @@ struct Render { struct ReportList *reports; struct ImagePool *pool; - struct EvaluationContext *eval_ctx; void **movie_ctx_arr; char viewname[MAX_NAME]; diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h index b576d69d806..1d1af7092c8 100644 --- a/source/blender/render/intern/include/renderdatabase.h +++ b/source/blender/render/intern/include/renderdatabase.h @@ -40,6 +40,7 @@ extern "C" { struct Object; struct VlakRen; struct VertRen; +struct EvaluationContext; struct HaloRen; struct Main; struct Material; @@ -164,7 +165,7 @@ void area_lamp_vectors(struct LampRen *lar); /* convertblender.c */ void init_render_world(Render *re); -void RE_Database_FromScene_Vectors(Render *re, struct Main *bmain, struct Scene *sce, unsigned int lay); +void RE_Database_FromScene_Vectors(struct EvaluationContext *eval_ctx, Render *re, struct Main *bmain, struct Scene *sce, unsigned int lay); #ifdef __cplusplus } diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 503748236f6..6727844d0a8 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -84,6 +84,7 @@ #include "BKE_scene.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_build.h" #include "PIL_time.h" @@ -1291,9 +1292,9 @@ 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) { - const EvaluationContext *eval_ctx = RE_GetEvalCtx(re); Object *ob= obr->ob; // Object *tob=0; Material *ma = NULL; @@ -1353,7 +1354,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if (!(psmd->modifier.mode & eModifierMode_Render)) return 0; - sim.eval_ctx = re->eval_ctx; + sim.eval_ctx = eval_ctx; sim.scene = re->scene; sim.ob = ob; sim.psys = psys; @@ -2178,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; @@ -2204,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; @@ -2571,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; @@ -2604,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->eval_ctx, 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->eval_ctx, 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); } @@ -2642,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; @@ -2662,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->eval_ctx, 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; @@ -2689,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->eval_ctx, 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); } @@ -2703,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->eval_ctx, re->scene, ob, NULL); + orco = BKE_curve_make_orco(eval_ctx, re->scene, ob, NULL); set_object_orco(re, ob, orco); } } @@ -3114,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; @@ -3203,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->eval_ctx, re->scene, ob, mask); + dm= mesh_create_derived_view(eval_ctx, re->scene, ob, mask); else - dm= mesh_create_derived_render(re->eval_ctx, 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); @@ -4608,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; @@ -4622,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->eval_ctx, re->scene, ob, mask); + dm = mesh_create_derived_view(eval_ctx, re->scene, ob, mask); else - dm = mesh_create_derived_render(re->eval_ctx, 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); @@ -4652,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; @@ -4690,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)) { @@ -4721,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); } @@ -4740,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; @@ -4749,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); @@ -4905,7 +4908,8 @@ 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 */ @@ -4932,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->eval_ctx, 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) @@ -4944,7 +4948,7 @@ static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, in FOREACH_GROUP_OBJECT(ob->dup_group, object) { - dupli_render_particle_set(re, object, timeoffset, level+1, enable); + dupli_render_particle_set(eval_ctx, re, object, timeoffset, level+1, enable); } FOREACH_GROUP_OBJECT_END } @@ -4954,7 +4958,8 @@ static int get_vector_viewlayers(Scene *UNUSED(sce)) 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) { /* Simple preventing of too deep nested groups. */ if (level > MAX_DUPLI_RECUR) return; @@ -4966,11 +4971,11 @@ static void add_group_render_dupli_obs(Render *re, Group *group, int nolamps, in 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); + add_group_render_dupli_obs(eval_ctx, re, ob->dup_group, nolamps, onlyselected, actob, timeoffset, level+1); } } } @@ -4979,7 +4984,8 @@ static void add_group_render_dupli_obs(Render *re, Group *group, int nolamps, in FOREACH_GROUP_OBJECT_END } -static void database_init_objects(Render *re, unsigned int UNUSED(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; @@ -5032,7 +5038,7 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in * 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; } } @@ -5046,9 +5052,9 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in /* 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(re->eval_ctx, 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. */ @@ -5131,7 +5137,7 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in 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; @@ -5139,13 +5145,13 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in } } 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); @@ -5154,10 +5160,10 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in 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; @@ -5166,7 +5172,7 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in /* 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); @@ -5210,7 +5216,6 @@ 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_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); render_update_anim_renderdata(re, &re->scene->r, &re->scene->view_layers); } @@ -5247,7 +5252,12 @@ 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); @@ -5262,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; @@ -5292,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); @@ -5363,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]; @@ -5380,7 +5394,7 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la /* applies changes fully */ scene->r.cfra += timeoffset; - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); + 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) { @@ -5391,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); @@ -5748,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; @@ -5763,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); @@ -5779,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); @@ -5793,7 +5807,7 @@ 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)) { @@ -5887,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]; @@ -5904,6 +5919,16 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, 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; @@ -5975,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); @@ -5991,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)) diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index ddf128c0fbc..61ed19a1c9a 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -42,6 +42,8 @@ #include "BLI_string.h" #include "BLI_utildefines.h" +#include "DNA_object_types.h" + #include "BKE_camera.h" #include "BKE_global.h" #include "BKE_colortools.h" @@ -50,6 +52,7 @@ #include "BKE_scene.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" #include "RNA_access.h" @@ -526,9 +529,8 @@ RenderData *RE_engine_get_render_data(Render *re) } /* Bake */ -void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Depsgraph *graph, Scene *scene) +void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Scene *scene) { - re->depsgraph = graph; re->scene = scene; re->main = bmain; render_copy_renderdata(&re->r, &scene->r); @@ -579,7 +581,7 @@ bool RE_bake_engine( /* update is only called so we create the engine.session */ if (type->update) - type->update(engine, re->main, re->depsgraph, re->scene); + type->update(engine, re->main, re->scene); if (type->bake) { type->bake( @@ -629,8 +631,6 @@ void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe) BPy_BEGIN_ALLOW_THREADS; #endif - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, scene, NULL); - #ifdef WITH_PYTHON BPy_END_ALLOW_THREADS; #endif @@ -664,7 +664,6 @@ int RE_engine_render(Render *re, int do_all) /* update animation here so any render layer animation is applied before * creating the render result */ if ((re->r.scemode & (R_NO_FRAME_UPDATE | R_BUTS_PREVIEW)) == 0) { - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); render_update_anim_renderdata(re, &re->scene->r, &re->scene->view_layers); } @@ -731,7 +730,7 @@ int RE_engine_render(Render *re, int do_all) render_result_exr_file_begin(re); if (type->update) { - type->update(engine, re->main, re->depsgraph, re->scene); + type->update(engine, re->main, re->scene); } /* Clear UI drawing locks. */ @@ -740,7 +739,25 @@ int RE_engine_render(Render *re, int do_all) } if (type->render_to_image) { - type->render_to_image(engine, re->depsgraph); + FOREACH_VIEW_LAYER_TO_RENDER(re, view_layer_iter) + { + EvaluationContext *eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER); + Depsgraph *depsgraph = DEG_graph_new(); + ViewLayer *view_layer = BLI_findstring(&re->scene->view_layers, view_layer_iter->name, offsetof(ViewLayer, name)); + + DEG_evaluation_context_init_from_view_layer_for_render( + eval_ctx, + depsgraph, + re->scene, + view_layer); + + BKE_scene_graph_update_tagged(eval_ctx, depsgraph, re->main, re->scene, view_layer); + type->render_to_image(engine, depsgraph); + + DEG_graph_free(depsgraph); + DEG_evaluation_context_free(eval_ctx); + } + FOREACH_VIEW_LAYER_TO_RENDER_END } engine->tile_x = 0; @@ -803,8 +820,3 @@ void RE_engine_register_pass(struct RenderEngine *engine, struct Scene *scene, s } } } - -ViewLayer *RE_engine_get_view_layer(Render *re) -{ - return re->eval_ctx->view_layer; -} diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index 9182d545089..13c95dac05d 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -501,11 +501,6 @@ void RE_SetCamera(Render *re, Object *cam_ob) re_camera_params_get(re, ¶ms, cam_ob); } -void RE_SetDepsgraph(Render *re, Depsgraph *graph) -{ - re->depsgraph = graph; -} - void RE_SetPixelSize(Render *re, float pixsize) { re->viewdx = pixsize; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index e5426384c6f..b2a03cc884f 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -81,6 +81,8 @@ #include "BKE_object.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" #include "PIL_time.h" #include "IMB_colormanagement.h" @@ -274,7 +276,7 @@ RenderLayer *render_get_active_layer(Render *re, RenderResult *rr) return rr->layers.first; } -static int render_scene_needs_vector(Render *re) +static int UNUSED_FUNCTION(render_scene_needs_vector)(Render *re) { ViewLayer *view_layer; for (view_layer = re->view_layers.first; view_layer; view_layer = view_layer->next) @@ -355,15 +357,6 @@ Scene *RE_GetScene(Render *re) return NULL; } -EvaluationContext *RE_GetEvalCtx(Render *re) -{ - if (re) { - return re->eval_ctx; - } - - return NULL; -} - /** * Same as #RE_AcquireResultImage but creating the necessary views to store the result * fill provided result struct with a copy of thew views of what is done so far the @@ -515,7 +508,6 @@ Render *RE_NewRender(const char *name) BLI_strncpy(re->name, name, RE_MAXNAME); BLI_rw_mutex_init(&re->resultmutex); BLI_rw_mutex_init(&re->partsmutex); - re->eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER); } RE_InitRenderCB(re); @@ -592,7 +584,6 @@ void RE_FreeRender(Render *re) /* main dbase can already be invalid now, some database-free code checks it */ re->main = NULL; re->scene = NULL; - re->depsgraph = NULL; RE_Database_Free(re); /* view render can still have full database */ free_sample_tables(re); @@ -601,7 +592,6 @@ void RE_FreeRender(Render *re) render_result_free(re->pushedresult); BLI_remlink(&RenderGlobal.renderlist, re); - MEM_freeN(re->eval_ctx); MEM_freeN(re); } @@ -862,12 +852,11 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, re->result->recty = re->recty; render_result_view_new(re->result, ""); } - - if (re->r.scemode & R_VIEWPORT_PREVIEW) - re->eval_ctx->mode = DAG_EVAL_PREVIEW; - else - re->eval_ctx->mode = DAG_EVAL_RENDER; - + + eEvaluationMode mode = (re->r.scemode & R_VIEWPORT_PREVIEW) ? DAG_EVAL_PREVIEW : DAG_EVAL_RENDER; + /* If we had a consistent EvaluationContext now would be the time to update it. */ + (void)mode; + /* ensure renderdatabase can use part settings correct */ RE_parts_clamp(re); @@ -1353,7 +1342,7 @@ static void *do_render_thread(void *thread_v) return NULL; } -static void main_render_result_end(Render *re) +static void UNUSED_FUNCTION(main_render_result_end)(Render *re) { if (re->result->do_exr_tile) { BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); @@ -1559,81 +1548,10 @@ void RE_TileProcessor(Render *re) static void do_render_3d(Render *re) { - RenderView *rv; - re->current_scene_update(re->suh, re->scene); - /* try external */ - if (RE_engine_render(re, 0)) - return; - - /* internal */ - RE_parts_clamp(re); - - /* add motion blur and fields offset to frames */ - const int cfra_backup = re->scene->r.cfra; - const float subframe_backup = re->scene->r.subframe; - - BKE_scene_frame_set( - re->scene, (double)re->scene->r.cfra + (double)re->scene->r.subframe + - (double)re->mblur_offs + (double)re->field_offs); - - /* init main render result */ - main_render_result_new(re); - if (re->result == NULL) { - BKE_report(re->reports, RPT_ERROR, "Failed allocate render result, out of memory"); - G.is_break = true; - return; - } - -#ifdef WITH_FREESTYLE - if (re->r.mode & R_EDGE_FRS) { - init_freestyle(re); - } -#endif - - /* we need a new database for each view */ - for (rv = re->result->views.first; rv; rv = rv->next) { - RE_SetActiveRenderView(re, rv->name); - - /* lock drawing in UI during data phase */ - if (re->draw_lock) - re->draw_lock(re->dlh, 1); - - /* make render verts/faces/halos/lamps */ - if (render_scene_needs_vector(re)) - RE_Database_FromScene_Vectors(re, re->main, re->scene, re->lay); - else { - RE_Database_FromScene(re, re->main, re->scene, re->lay, 1); - RE_Database_Preprocess(re); - } - - /* clear UI drawing locks */ - if (re->draw_lock) - re->draw_lock(re->dlh, 0); - - threaded_tile_processor(re); - -#ifdef WITH_FREESTYLE - /* Freestyle */ - if (re->r.mode & R_EDGE_FRS) - if (!re->test_break(re->tbh)) - add_freestyle(re, 1); -#endif - - /* do left-over 3d post effects (flares) */ - if (re->flag & R_HALO) - if (!re->test_break(re->tbh)) - add_halo_flare(re); - - /* free all render verts etc */ - RE_Database_Free(re); - } - - main_render_result_end(re); - - re->scene->r.cfra = cfra_backup; - re->scene->r.subframe = subframe_backup; + /* All the rendering pipeline goes through "external" render engines. */ + RE_engine_render(re, 0); } /* called by blur loop, accumulate RGBA key alpha */ @@ -1748,11 +1666,6 @@ static void do_render_blur_3d(Render *re) re->mblur_offs = 0.0f; re->i.curblur = 0; /* stats */ - /* make sure motion blur changes get reset to current frame */ - if ((re->r.scemode & (R_NO_FRAME_UPDATE|R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))==0) { - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); - } - /* weak... the display callback wants an active renderlayer pointer... */ re->result->renlay = render_get_active_layer(re, re->result); re->display_update(re->duh, re->result, NULL); @@ -1986,7 +1899,6 @@ static void render_scene(Render *re, Scene *sce, int cfra) /* still unsure entity this... */ resc->main = re->main; - resc->depsgraph = re->depsgraph; resc->scene = sce; resc->lay = sce->lay; resc->scene_color_manage = BKE_scene_check_color_management_enabled(sce); @@ -2696,8 +2608,9 @@ static void do_render_composite_fields_blur_3d(Render *re) R.i.starttime = re->i.starttime; R.i.cfra = re->i.cfra; - if (update_newframe) - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); + if (update_newframe) { + /* If we have consistent depsgraph now would be a time to update them. */ + } if (re->r.scemode & R_FULL_SAMPLE) do_merge_fullsample(re, ntree); @@ -2807,9 +2720,10 @@ static void do_render_seq(Render *re) tot_views = BKE_scene_multiview_num_views_get(&re->r); ibuf_arr = MEM_mallocN(sizeof(ImBuf *) * tot_views, "Sequencer Views ImBufs"); + EvaluationContext *eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER); BKE_sequencer_new_render_data( - re->eval_ctx, re->main, re->scene, + eval_ctx, re->main, re->scene, re_x, re_y, 100, &context); @@ -2831,6 +2745,8 @@ static void do_render_seq(Render *re) } } + DEG_evaluation_context_free(eval_ctx); + rr = re->result; BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); @@ -3399,7 +3315,7 @@ void RE_RenderFreestyleExternal(Render *re) for (rv = re->result->views.first; rv; rv = rv->next) { RE_SetActiveRenderView(re, rv->name); RE_Database_FromScene(re, re->main, re->scene, re->lay, 1); - RE_Database_Preprocess(re); + RE_Database_Preprocess(NULL, re); add_freestyle(re, 1); RE_Database_Free(re); } @@ -3772,8 +3688,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri NULL, camera_override, lay_override, 1, 0); if (nfra != scene->r.cfra) { - /* Skip this frame, but update for physics and particles system. */ - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, bmain, scene, NULL); + /* Skip this frame, but could update for physics and particles system. */ continue; } else @@ -3922,7 +3837,6 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri void RE_PreviewRender(Render *re, Main *bmain, Scene *sce, ViewRender *view_render) { Object *camera; - ViewLayer *view_layer = BKE_view_layer_from_scene_get(sce); int winx, winy; winx = (sce->r.size * sce->r.xsch) / 100; @@ -3936,8 +3850,6 @@ void RE_PreviewRender(Render *re, Main *bmain, Scene *sce, ViewRender *view_rend re->scene = sce; re->scene_color_manage = BKE_scene_check_color_management_enabled(sce); re->lay = sce->lay; - re->depsgraph = BKE_scene_get_depsgraph(sce, view_layer, false); - re->eval_ctx->view_layer = view_layer; camera = RE_GetCamera(re); RE_SetCamera(re, camera); diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c index 4f300b7286c..71145cfa4b7 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -169,7 +169,7 @@ static void alloc_point_data(PointDensity *pd) } } -static void pointdensity_cache_psys(EvaluationContext *eval_ctx, Scene *scene, +static void pointdensity_cache_psys(const EvaluationContext *eval_ctx, Scene *scene, PointDensity *pd, Object *ob, ParticleSystem *psys, @@ -403,7 +403,7 @@ static void pointdensity_cache_vertex_normal(PointDensity *pd, Object *UNUSED(ob } } -static void pointdensity_cache_object(EvaluationContext *eval_ctx, Scene *scene, +static void pointdensity_cache_object(const EvaluationContext *eval_ctx, Scene *scene, PointDensity *pd, Object *ob, const bool use_render_params) @@ -478,7 +478,8 @@ static void pointdensity_cache_object(EvaluationContext *eval_ctx, Scene *scene, } -static void cache_pointdensity_ex(EvaluationContext *eval_ctx, Scene *scene, +static void cache_pointdensity_ex(const EvaluationContext *eval_ctx, + Scene *scene, PointDensity *pd, float viewmat[4][4], float winmat[4][4], @@ -523,9 +524,9 @@ static void cache_pointdensity_ex(EvaluationContext *eval_ctx, Scene *scene, } } -void cache_pointdensity(Render *re, PointDensity *pd) +void cache_pointdensity(const EvaluationContext *eval_ctx, Render *re, PointDensity *pd) { - cache_pointdensity_ex(re->eval_ctx, + cache_pointdensity_ex(eval_ctx, re->scene, pd, re->viewmat, re->winmat, @@ -551,7 +552,7 @@ void free_pointdensity(PointDensity *pd) pd->totpoints = 0; } -void make_pointdensities(Render *re) +void make_pointdensities(const EvaluationContext *eval_ctx, Render *re) { Tex *tex; @@ -564,7 +565,7 @@ void make_pointdensities(Render *re) for (tex = re->main->tex.first; tex != NULL; tex = tex->id.next) { if (tex->id.us && tex->type == TEX_POINTDENSITY) { - cache_pointdensity(re, tex->pd); + cache_pointdensity(eval_ctx, re, tex->pd); } } diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c index f97c8fb0b06..126d675a491 100644 --- a/source/blender/render/intern/source/render_result.c +++ b/source/blender/render/intern/source/render_result.c @@ -266,9 +266,7 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf RenderResult *rr; RenderLayer *rl; RenderView *rv; - ViewLayer *view_layer; int rectx, recty; - int nr; rectx = BLI_rcti_size_x(partrct); recty = BLI_rcti_size_y(partrct); @@ -296,23 +294,14 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf render_result_views_new(rr, &re->r); /* check renderdata for amount of layers */ - for (nr = 0, view_layer = re->view_layers.first; view_layer; view_layer = view_layer->next, nr++) { - - if (layername && layername[0]) - if (!STREQ(view_layer->name, layername)) - continue; - - if (re->r.scemode & R_SINGLE_LAYER) { - if (nr != re->active_view_layer) { - continue; - } - } - else { - if ((view_layer->flag & VIEW_LAYER_RENDER) == 0) { + FOREACH_VIEW_LAYER_TO_RENDER(re, view_layer) + { + if (layername && layername[0]) { + if (!STREQ(view_layer->name, layername)) { continue; } } - + rl = MEM_callocN(sizeof(RenderLayer), "new render layer"); BLI_addtail(&rr->layers, rl); @@ -417,6 +406,8 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf #undef RENDER_LAYER_ADD_PASS_SAFE } } + FOREACH_VIEW_LAYER_TO_RENDER_END + /* sss, previewrender and envmap don't do layers, so we make a default one */ if (BLI_listbase_is_empty(&rr->layers) && !(layername && layername[0])) { rl = MEM_callocN(sizeof(RenderLayer), "new render layer"); diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index e66dd86a75a..cefa739a796 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -3745,7 +3745,7 @@ static void textured_face_generate_uv( } /* Generate an updated copy of material to use for color sampling. */ -Material *RE_sample_material_init(Material *orig_mat, Scene *scene) +Material *RE_sample_material_init(const EvaluationContext *eval_ctx, Material *orig_mat, Scene *scene) { Tex *tex = NULL; Material *mat; @@ -3821,7 +3821,7 @@ Material *RE_sample_material_init(Material *orig_mat, Scene *scene) unit_m4(dummy_re.viewmat); unit_m4(dummy_re.winmat); dummy_re.winx = dummy_re.winy = 128; - cache_pointdensity(&dummy_re, tex->pd); + cache_pointdensity(eval_ctx, &dummy_re, tex->pd); } /* update image sequences and movies */ |