diff options
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_engine.h | 25 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_multires_bake.h | 6 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 4 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_render_ext.h | 5 | ||||
-rw-r--r-- | source/blender/render/intern/include/render_types.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/bake.c | 7 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 65 | ||||
-rw-r--r-- | source/blender/render/intern/source/envmap.c | 16 | ||||
-rw-r--r-- | source/blender/render/intern/source/external_engine.c | 135 | ||||
-rw-r--r-- | source/blender/render/intern/source/initrender.c | 7 | ||||
-rw-r--r-- | source/blender/render/intern/source/multires_bake.c | 57 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 49 | ||||
-rw-r--r-- | source/blender/render/intern/source/pointdensity.c | 54 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeinput.c | 45 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeoutput.c | 17 |
16 files changed, 265 insertions, 230 deletions
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index 27ec6bf8ba6..5cbc907d9c6 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -36,6 +36,7 @@ set(INC ../makesrna ../nodes ../physics + ../draw ../../../intern/atomic ../../../intern/guardedalloc ../../../intern/mikktspace diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index 52491673612..a4de7104071 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -39,6 +39,9 @@ struct bNode; struct bNodeTree; +struct Depsgraph; +struct IDProperty; +struct Main; struct Object; struct Render; struct RenderData; @@ -63,6 +66,7 @@ struct BakePixel; #define RE_USE_TEXTURE_PREVIEW 128 #define RE_USE_SHADING_NODES_CUSTOM 256 #define RE_USE_SPHERICAL_STEREO 512 +#define RE_USE_LEGACY_PIPELINE 1024 /* XXX Temporary flag, to be removed once draw manager is finished. */ /* RenderEngine.flag */ #define RE_ENGINE_ANIMATION 1 @@ -88,16 +92,23 @@ typedef struct RenderEngineType { char name[64]; int flag; - void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Scene *scene); - void (*render)(struct RenderEngine *engine, struct Scene *scene); - 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, const int depth, void *result); + void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Depsgraph *depsgraph, 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, + const int depth, void *result); void (*view_update)(struct RenderEngine *engine, const struct bContext *context); - void (*view_draw)(struct RenderEngine *engine, const struct bContext *context); + void (*render_to_view)(struct RenderEngine *engine, const struct bContext *context); void (*update_script_node)(struct RenderEngine *engine, struct bNodeTree *ntree, struct bNode *node); void (*update_render_passes)(struct RenderEngine *engine, struct Scene *scene, struct SceneRenderLayer *srl); + void (*collection_settings_create)(struct RenderEngine *engine, struct IDProperty *props); + void (*render_settings_create)(struct RenderEngine *engine, struct IDProperty *props); + + struct DrawEngineType *draw_engine; + /* RNA integration */ ExtensionRNA ext; } RenderEngineType; @@ -169,12 +180,16 @@ void RE_engine_register_pass(struct RenderEngine *engine, struct Scene *scene, s void RE_engines_init(void); void RE_engines_exit(void); +void RE_engines_register(struct Main *bmain, RenderEngineType *render_type); 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 Scene *scene); +void RE_bake_engine_set_engine_parameters( + struct Render *re, struct Main *bmain, struct Depsgraph *graph, struct Scene *scene); + +struct SceneLayer *RE_engine_get_scene_layer(struct Render *re); #endif /* __RE_ENGINE_H__ */ diff --git a/source/blender/render/extern/include/RE_multires_bake.h b/source/blender/render/extern/include/RE_multires_bake.h index c1c5fc4a04d..901c1c1d05d 100644 --- a/source/blender/render/extern/include/RE_multires_bake.h +++ b/source/blender/render/extern/include/RE_multires_bake.h @@ -43,6 +43,12 @@ typedef struct MultiresBakeRender { short mode; bool use_lores_mesh; /* Use low-resolution mesh when baking displacement maps */ + /* material aligned image array (for per-face bake image) */ + struct { + Image **array; + int len; + } ob_image; + int number_of_rays; /* Number of rays to be cast when doing AO baking */ float bias; /* Bias between object and start ray point when doing AO baking */ diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index cf9298bdb9e..09f308da10a 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -37,6 +37,8 @@ struct bMovieHandle; struct bNodeTree; +struct Depsgraph; +struct EvaluationContext; struct Image; struct ImageFormatData; struct Main; @@ -250,6 +252,7 @@ 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); @@ -371,6 +374,7 @@ 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 2b5d0ca4e14..f296c117495 100644 --- a/source/blender/render/extern/include/RE_render_ext.h +++ b/source/blender/render/extern/include/RE_render_ext.h @@ -41,6 +41,8 @@ struct DerivedMesh; struct ImagePool; struct MTex; struct Scene; +struct SceneLayer; +struct Render; /* render_texture.c */ /* used by particle.c, effect.c, editmesh_modes.c and brush.c, returns 1 if rgb, 0 otherwise */ @@ -70,17 +72,20 @@ struct PointDensity; void RE_point_density_cache( struct Scene *scene, + struct SceneLayer *sl, struct PointDensity *pd, const bool use_render_params); void RE_point_density_minmax( struct Scene *scene, + struct SceneLayer *sl, struct PointDensity *pd, const bool use_render_params, float r_min[3], float r_max[3]); void RE_point_density_sample( struct Scene *scene, + struct SceneLayer *sl, struct PointDensity *pd, const int resolution, const bool use_render_params, diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index f9942bef61f..1de1f23f351 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -185,6 +185,8 @@ 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; Scene *scene; diff --git a/source/blender/render/intern/source/bake.c b/source/blender/render/intern/source/bake.c index 31e461b4536..71a595d6a8b 100644 --- a/source/blender/render/intern/source/bake.c +++ b/source/blender/render/intern/source/bake.c @@ -669,11 +669,12 @@ static int get_next_bake_face(BakeShade *bs) const float disp_solid[4] = {0.5f, 0.5f, 0.5f, 1.0f}; tface = RE_vlakren_get_tface(obr, vlr, obr->bakemtface, NULL, 0); + /* should use 'BKE_object_material_edit_image_get' but in this case simpler not to */ + ima = vlr->mat ? vlr->mat->edit_image : NULL; - if (!tface || !tface->tpage) + if (!tface || !ima) continue; - ima = tface->tpage; ibuf = BKE_image_acquire_ibuf(ima, NULL, NULL); if (ibuf == NULL) @@ -814,7 +815,7 @@ static void shade_tface(BakeShade *bs) ObjectInstanceRen *obi = bs->obi; ObjectRen *obr = obi->obr; MTFace *tface = RE_vlakren_get_tface(obr, vlr, obr->bakemtface, NULL, 0); - Image *ima = tface->tpage; + Image *ima = vlr->mat->edit_image; float vec[4][2]; int a, i1, i2, i3; diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 9633d95855e..9d2ac76f7e6 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -66,7 +66,6 @@ #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_key.h" @@ -82,6 +81,8 @@ #include "BKE_particle.h" #include "BKE_scene.h" +#include "DEG_depsgraph.h" + #include "PIL_time.h" #include "envmap.h" @@ -1349,10 +1350,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 = re->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); @@ -2599,13 +2601,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(re->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(re->eval_ctx, re->scene, ob, dm, true, true); if (orco) { set_object_orco(re, ob, orco); } @@ -2657,7 +2659,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(re->eval_ctx, re->scene, ob, &disp, &dm, false, true); dl= disp.first; if (dl==NULL) return; @@ -2684,7 +2686,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(re->eval_ctx, re->scene, ob, dm, true, true); if (orco) { set_object_orco(re, ob, orco); } @@ -2698,7 +2700,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(re->eval_ctx, re->scene, ob, NULL); set_object_orco(re, ob, orco); } } @@ -3153,11 +3155,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 +3172,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 +3200,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(re->eval_ctx, re->scene, ob, mask); else - dm= mesh_create_derived_render(re->scene, ob, mask); + dm= mesh_create_derived_render(re->eval_ctx, re->scene, ob, mask); if (dm==NULL) return; /* in case duplicated object fails? */ mvert= dm->getVertArray(dm); @@ -4618,9 +4620,9 @@ 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(re->eval_ctx, re->scene, ob, mask); else - dm = mesh_create_derived_render(re->scene, ob, mask); + dm = mesh_create_derived_render(re->eval_ctx, re->scene, ob, mask); dm->release(dm); } @@ -4929,7 +4931,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(re->eval_ctx, re->scene, ob, CD_MASK_RENDER_INTERNAL); dm->release(dm); for (psys=ob->particlesystem.first; psys; psys=psys->next) @@ -4983,14 +4985,13 @@ static void add_group_render_dupli_obs(Render *re, Group *group, int nolamps, in } } -static void database_init_objects(Render *re, unsigned int renderlay, int nolamps, int onlyselected, Object *actob, int timeoffset) +static void database_init_objects(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 @@ -5018,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; +#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) { @@ -5038,7 +5043,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp } } } - 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; @@ -5049,7 +5054,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp * 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); + duplilist_apply_data = duplilist_apply(re->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. */ @@ -5211,7 +5216,7 @@ 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); + BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene); render_update_anim_renderdata(re, &re->scene->r); } @@ -5226,7 +5231,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 */ @@ -5381,13 +5386,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_update_for_newframe(re->eval_ctx, re->main, re->scene); /* if no camera, viewmat should have been set! */ if (camera) { diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index 156b4215992..7bd8c6decf0 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -51,6 +51,7 @@ #include "BKE_main.h" #include "BKE_image.h" /* BKE_imbuf_write */ +#include "BKE_layer.h" #include "BKE_texture.h" #include "BKE_scene.h" @@ -248,17 +249,14 @@ static void envmap_transmatrix(float mat[4][4], int part) static void env_set_imats(Render *re) { - Base *base; float mat[4][4]; - - base = re->scene->base.first; - while (base) { - mul_m4_m4m4(mat, re->viewmat, base->object->obmat); - invert_m4_m4(base->object->imat, mat); - - base = base->next; + + FOREACH_SCENE_OBJECT(re->scene, ob) + { + mul_m4_m4m4(mat, re->viewmat, ob->obmat); + invert_m4_m4(ob->imat, mat); } - + FOREACH_SCENE_OBJECT_END } /* ------------------------------------------------------------------------- */ diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index a581f7bd198..c2e6d540ad8 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -45,9 +45,12 @@ #include "BKE_camera.h" #include "BKE_global.h" #include "BKE_colortools.h" +#include "BKE_layer.h" #include "BKE_report.h" #include "BKE_scene.h" +#include "DEG_depsgraph.h" + #include "RNA_access.h" #ifdef WITH_PYTHON @@ -58,6 +61,8 @@ #include "RE_pipeline.h" #include "RE_bake.h" +#include "DRW_engine.h" + #include "initrender.h" #include "renderpipeline.h" #include "render_types.h" @@ -68,8 +73,8 @@ static RenderEngineType internal_render_type = { NULL, NULL, - "BLENDER_RENDER", N_("Blender Render"), RE_INTERNAL, - NULL, NULL, NULL, NULL, NULL, NULL, render_internal_update_passes, + "BLENDER_RENDER", N_("Blender Render"), RE_INTERNAL | RE_USE_LEGACY_PIPELINE, + NULL, NULL, NULL, NULL, NULL, NULL, render_internal_update_passes, NULL, NULL, NULL, {NULL, NULL, NULL} }; @@ -77,8 +82,8 @@ static RenderEngineType internal_render_type = { static RenderEngineType internal_game_type = { NULL, NULL, - "BLENDER_GAME", N_("Blender Game"), RE_INTERNAL | RE_GAME, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "BLENDER_GAME", N_("Blender Game"), RE_INTERNAL | RE_GAME | RE_USE_LEGACY_PIPELINE, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, {NULL, NULL, NULL} }; @@ -88,16 +93,22 @@ ListBase R_engines = {NULL, NULL}; void RE_engines_init(void) { - BLI_addtail(&R_engines, &internal_render_type); + RE_engines_register(NULL, &internal_render_type); #ifdef WITH_GAMEENGINE - BLI_addtail(&R_engines, &internal_game_type); + RE_engines_register(NULL, &internal_game_type); #endif + DRW_engines_register(); } void RE_engines_exit(void) { RenderEngineType *type, *next; + DRW_engines_free(); + + BKE_layer_collection_engine_settings_callback_free(); + BKE_scene_layer_engine_settings_callback_free(); + for (type = R_engines.first; type; type = next) { next = type->next; @@ -112,6 +123,22 @@ void RE_engines_exit(void) } } +void RE_engines_register(Main *bmain, RenderEngineType *render_type) +{ + if (render_type->draw_engine) { + DRW_engine_register(render_type->draw_engine); + } + if (render_type->collection_settings_create) { + BKE_layer_collection_engine_settings_callback_register( + bmain, render_type->idname, render_type->collection_settings_create); + } + if (render_type->render_settings_create) { + BKE_scene_layer_engine_settings_callback_register( + bmain, render_type->idname, render_type->render_settings_create); + } + BLI_addtail(&R_engines, render_type); +} + RenderEngineType *RE_engines_find(const char *idname) { RenderEngineType *type; @@ -126,7 +153,7 @@ RenderEngineType *RE_engines_find(const char *idname) bool RE_engine_is_external(Render *re) { RenderEngineType *type = RE_engines_find(re->r.engine); - return (type && type->render); + return (type && type->render_to_image); } /* Create, Free */ @@ -184,7 +211,8 @@ static RenderPart *get_part_from_result(Render *re, RenderResult *result) return NULL; } -RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname) +RenderResult *RE_engine_begin_result( + RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname) { Render *re = engine->re; RenderResult *result; @@ -409,7 +437,8 @@ float RE_engine_get_camera_shift_x(RenderEngine *engine, Object *camera, int use return BKE_camera_multiview_shift_x(re ? &re->r : NULL, camera, re->viewname); } -void RE_engine_get_camera_model_matrix(RenderEngine *engine, Object *camera, int use_spherical_stereo, float *r_modelmat) +void RE_engine_get_camera_model_matrix( + RenderEngine *engine, Object *camera, int use_spherical_stereo, float *r_modelmat) { Render *re = engine->re; @@ -486,8 +515,9 @@ RenderData *RE_engine_get_render_data(Render *re) } /* Bake */ -void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Scene *scene) +void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Depsgraph *graph, Scene *scene) { + re->depsgraph = graph; re->scene = scene; re->main = bmain; render_copy_renderdata(&re->r, &scene->r); @@ -537,10 +567,21 @@ bool RE_bake_engine( /* update is only called so we create the engine.session */ if (type->update) - type->update(engine, re->main, re->scene); - - if (type->bake) - type->bake(engine, re->scene, object, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result); + type->update(engine, re->main, re->depsgraph, re->scene); + + if (type->bake) { + type->bake( + engine, + re->scene, + object, + pass_type, + pass_filter, + object_id, + pixel_array, + num_pixels, + depth, + result); + } engine->tile_x = 0; engine->tile_y = 0; @@ -576,8 +617,7 @@ void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe) BPy_BEGIN_ALLOW_THREADS; #endif - /* It's possible that here we're including layers which were never visible before. */ - BKE_scene_update_for_newframe_ex(re->eval_ctx, re->main, scene, (1 << 20) - 1, true); + BKE_scene_update_for_newframe(re->eval_ctx, re->main, scene); #ifdef WITH_PYTHON BPy_END_ALLOW_THREADS; @@ -588,17 +628,6 @@ void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe) /* Render */ -static bool render_layer_exclude_animated(Scene *scene, SceneRenderLayer *srl) -{ - PointerRNA ptr; - PropertyRNA *prop; - - RNA_pointer_create(&scene->id, &RNA_SceneRenderLayer, srl, &ptr); - prop = RNA_struct_find_property(&ptr, "layers_exclude"); - - return RNA_property_animated(&ptr, prop); -} - int RE_engine_render(Render *re, int do_all) { RenderEngineType *type = RE_engines_find(re->r.engine); @@ -606,7 +635,7 @@ int RE_engine_render(Render *re, int do_all) bool persistent_data = (re->r.mode & R_PERSISTENT_DATA) != 0; /* verify if we can render */ - if (!type->render) + if (!type->render_to_image) return 0; if ((re->r.scemode & R_BUTS_PREVIEW) && !(type->flag & RE_USE_PREVIEW)) return 0; @@ -623,40 +652,7 @@ 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) { - unsigned int lay = re->lay; - - /* don't update layers excluded on all render layers */ - if (type->flag & RE_USE_EXCLUDE_LAYERS) { - SceneRenderLayer *srl; - unsigned int non_excluded_lay = 0; - - if (re->r.scemode & R_SINGLE_LAYER) { - srl = BLI_findlink(&re->r.layers, re->r.actlay); - if (srl) { - non_excluded_lay |= ~(srl->lay_exclude & ~srl->lay_zmask); - - /* in this case we must update all because animation for - * the scene has not been updated yet, and so may not be - * up to date until after BKE_scene_update_for_newframe */ - if (render_layer_exclude_animated(re->scene, srl)) - non_excluded_lay |= ~0; - } - } - else { - for (srl = re->r.layers.first; srl; srl = srl->next) { - if (!(srl->layflag & SCE_LAY_DISABLE)) { - non_excluded_lay |= ~(srl->lay_exclude & ~srl->lay_zmask); - - if (render_layer_exclude_animated(re->scene, srl)) - non_excluded_lay |= ~0; - } - } - } - - lay &= non_excluded_lay; - } - - BKE_scene_update_for_newframe_ex(re->eval_ctx, re->main, re->scene, lay, true); + BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene); render_update_anim_renderdata(re, &re->scene->r); } @@ -722,16 +718,18 @@ int RE_engine_render(Render *re, int do_all) if (re->result->do_exr_tile) render_result_exr_file_begin(re); - if (type->update) - type->update(engine, re->main, re->scene); + if (type->update) { + type->update(engine, re->main, re->depsgraph, re->scene); + } /* Clear UI drawing locks. */ if (re->draw_lock) { re->draw_lock(re->dlh, 0); } - if (type->render) - type->render(engine, re->scene); + if (type->render_to_image) { + type->render_to_image(engine, re->depsgraph); + } engine->tile_x = 0; engine->tile_y = 0; @@ -793,3 +791,8 @@ void RE_engine_register_pass(struct RenderEngine *engine, struct Scene *scene, s } } } + +SceneLayer *RE_engine_get_scene_layer(Render *re) +{ + return re->eval_ctx->scene_layer; +} diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index fbf18405093..731a5ec4e22 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -48,6 +48,8 @@ #include "BKE_camera.h" +#include "DEG_depsgraph.h" + /* this module */ #include "renderpipeline.h" #include "render_types.h" @@ -499,6 +501,11 @@ 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/multires_bake.c b/source/blender/render/intern/source/multires_bake.c index fba5836ac32..4c0355ef604 100644 --- a/source/blender/render/intern/source/multires_bake.c +++ b/source/blender/render/intern/source/multires_bake.c @@ -42,14 +42,16 @@ #include "BLI_threads.h" #include "BKE_ccg.h" -#include "BKE_depsgraph.h" #include "BKE_global.h" #include "BKE_image.h" +#include "BKE_material.h" #include "BKE_mesh.h" #include "BKE_multires.h" #include "BKE_modifier.h" #include "BKE_subsurf.h" +#include "DEG_depsgraph.h" + #include "RE_multires_bake.h" #include "RE_pipeline.h" #include "RE_shader_ext.h" @@ -78,7 +80,6 @@ typedef struct { MLoop *mloop; MLoopUV *mloopuv; const MLoopTri *mlooptri; - MTexPoly *mtpoly; float *pvtangent; const float *precomputed_normals; int w, h; @@ -89,6 +90,8 @@ typedef struct { void *bake_data; ImBuf *ibuf; MPassKnownData pass_data; + /* material aligned UV array */ + Image **image_array; } MResolvePixelData; typedef void (*MFlushPixel)(const MResolvePixelData *data, const int x, const int y); @@ -373,13 +376,15 @@ static void *do_multires_bake_thread(void *data_v) while ((tri_index = multires_bake_queue_next_tri(handle->queue)) >= 0) { const MLoopTri *lt = &data->mlooptri[tri_index]; - MTexPoly *mtpoly = &data->mtpoly[lt->poly]; - MLoopUV *mloopuv = data->mloopuv; + const MPoly *mp = &data->mpoly[lt->poly]; + const short mat_nr = mp->mat_nr; + const MLoopUV *mloopuv = data->mloopuv; if (multiresbake_test_break(bkr)) break; - if (mtpoly->tpage != handle->image) + Image *tri_image = mat_nr < bkr->ob_image.len ? bkr->ob_image.array[mat_nr] : NULL; + if (tri_image != handle->image) continue; data->tri_index = tri_index; @@ -445,7 +450,6 @@ static void do_multires_bake(MultiresBakeRender *bkr, Image *ima, bool require_t MPoly *mpoly = dm->getPolyArray(dm); MLoop *mloop = dm->getLoopArray(dm); MLoopUV *mloopuv = dm->getLoopDataArray(dm, CD_MLOOPUV); - MTexPoly *mtpoly = dm->getPolyDataArray(dm, CD_MTEXPOLY); const float *precomputed_normals = dm->getPolyDataArray(dm, CD_NORMAL); float *pvtangent = NULL; @@ -489,7 +493,6 @@ static void do_multires_bake(MultiresBakeRender *bkr, Image *ima, bool require_t handle->data.mvert = mvert; handle->data.mloopuv = mloopuv; handle->data.mlooptri = mlooptri; - handle->data.mtpoly = mtpoly; handle->data.mloop = mloop; handle->data.pvtangent = pvtangent; handle->data.precomputed_normals = precomputed_normals; /* don't strictly need this */ @@ -1178,30 +1181,34 @@ static void apply_ao_callback(DerivedMesh *lores_dm, DerivedMesh *hires_dm, void static void count_images(MultiresBakeRender *bkr) { - int a, totpoly; - DerivedMesh *dm = bkr->lores_dm; - MTexPoly *mtexpoly = CustomData_get_layer(&dm->polyData, CD_MTEXPOLY); - BLI_listbase_clear(&bkr->image); bkr->tot_image = 0; - totpoly = dm->getNumPolys(dm); - - for (a = 0; a < totpoly; a++) - mtexpoly[a].tpage->id.tag &= ~LIB_TAG_DOIT; + for (int i = 0; i < bkr->ob_image.len; i++) { + Image *ima = bkr->ob_image.array[i]; + if (ima) { + ima->id.tag &= ~LIB_TAG_DOIT; + } + } - for (a = 0; a < totpoly; a++) { - Image *ima = mtexpoly[a].tpage; - if ((ima->id.tag & LIB_TAG_DOIT) == 0) { - LinkData *data = BLI_genericNodeN(ima); - BLI_addtail(&bkr->image, data); - bkr->tot_image++; - ima->id.tag |= LIB_TAG_DOIT; + for (int i = 0; i < bkr->ob_image.len; i++) { + Image *ima = bkr->ob_image.array[i]; + if (ima) { + if ((ima->id.tag & LIB_TAG_DOIT) == 0) { + LinkData *data = BLI_genericNodeN(ima); + BLI_addtail(&bkr->image, data); + bkr->tot_image++; + ima->id.tag |= LIB_TAG_DOIT; + } } } - for (a = 0; a < totpoly; a++) - mtexpoly[a].tpage->id.tag &= ~LIB_TAG_DOIT; + for (int i = 0; i < bkr->ob_image.len; i++) { + Image *ima = bkr->ob_image.array[i]; + if (ima) { + ima->id.tag &= ~LIB_TAG_DOIT; + } + } } static void bake_images(MultiresBakeRender *bkr, MultiresBakeResult *result) @@ -1283,7 +1290,7 @@ static void finish_images(MultiresBakeRender *bkr, MultiresBakeResult *result) } BKE_image_release_ibuf(ima, ibuf, NULL); - DAG_id_tag_update(&ima->id, 0); + DEG_id_tag_update(&ima->id, 0); } } diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index a0ebe241569..2a390c5fb97 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -62,9 +62,9 @@ #include "BKE_animsys.h" /* <------ should this be here?, needed for sequencer update */ #include "BKE_camera.h" #include "BKE_colortools.h" -#include "BKE_depsgraph.h" #include "BKE_global.h" #include "BKE_image.h" +#include "BKE_layer.h" #include "BKE_library.h" #include "BKE_library_remap.h" #include "BKE_main.h" @@ -78,6 +78,8 @@ #include "BKE_writeavi.h" /* <------ should be replaced once with generic movie module */ #include "BKE_object.h" +#include "DEG_depsgraph.h" + #include "PIL_time.h" #include "IMB_colormanagement.h" #include "IMB_imbuf.h" @@ -351,6 +353,15 @@ 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 @@ -579,6 +590,7 @@ 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); @@ -1727,7 +1739,7 @@ static void do_render_blur_3d(Render *re) /* 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_update_for_newframe(re->eval_ctx, re->main, re->scene, re->lay); + BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene); } /* weak... the display callback wants an active renderlayer pointer... */ @@ -1963,6 +1975,7 @@ 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); @@ -2043,14 +2056,14 @@ bool RE_allow_render_generic_object(Object *ob) #define DEPSGRAPH_WORKAROUND_HACK #ifdef DEPSGRAPH_WORKAROUND_HACK -static void tag_dependend_objects_for_render(Scene *scene, int renderlay) +static void tag_dependend_objects_for_render(Scene *scene, int UNUSED(renderlay)) { Scene *sce_iter; Base *base; for (SETLOOPER(scene, sce_iter, base)) { Object *object = base->object; - if ((base->lay & renderlay) == 0) { + if ((base->flag & BASE_VISIBLED) == 0) { continue; } @@ -2070,22 +2083,22 @@ static void tag_dependend_objects_for_render(Scene *scene, int renderlay) if (md->type == eModifierType_Boolean) { BooleanModifierData *bmd = (BooleanModifierData *)md; if (bmd->object && bmd->object->type == OB_MESH) { - DAG_id_tag_update(&bmd->object->id, OB_RECALC_DATA); + DEG_id_tag_update(&bmd->object->id, OB_RECALC_DATA); } } else if (md->type == eModifierType_Array) { ArrayModifierData *amd = (ArrayModifierData *)md; if (amd->start_cap && amd->start_cap->type == OB_MESH) { - DAG_id_tag_update(&amd->start_cap->id, OB_RECALC_DATA); + DEG_id_tag_update(&amd->start_cap->id, OB_RECALC_DATA); } if (amd->end_cap && amd->end_cap->type == OB_MESH) { - DAG_id_tag_update(&amd->end_cap->id, OB_RECALC_DATA); + DEG_id_tag_update(&amd->end_cap->id, OB_RECALC_DATA); } } else if (md->type == eModifierType_Shrinkwrap) { ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md; if (smd->target && smd->target->type == OB_MESH) { - DAG_id_tag_update(&smd->target->id, OB_RECALC_DATA); + DEG_id_tag_update(&smd->target->id, OB_RECALC_DATA); } } } @@ -2619,7 +2632,7 @@ static void do_render_composite_fields_blur_3d(Render *re) R.i.cfra = re->i.cfra; if (update_newframe) - BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene, re->lay); + BKE_scene_update_for_newframe(re->eval_ctx, re->main, re->scene); if (re->r.scemode & R_FULL_SAMPLE) do_merge_fullsample(re, ntree); @@ -3671,19 +3684,8 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri render_initialize_from_main(re, &rd, bmain, scene, NULL, camera_override, lay_override, 1, 0); if (nfra != scene->r.cfra) { - /* - * Skip this frame, but update for physics and particles system. - * From convertblender.c: - * in localview, lamps are using normal layers, objects only local bits. - */ - unsigned int updatelay; - - if (re->lay & 0xFF000000) - updatelay = re->lay & 0xFF000000; - else - updatelay = re->lay; - - BKE_scene_update_for_newframe(re->eval_ctx, bmain, scene, updatelay); + /* Skip this frame, but update for physics and particles system. */ + BKE_scene_update_for_newframe(re->eval_ctx, bmain, scene); continue; } else @@ -3832,6 +3834,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri void RE_PreviewRender(Render *re, Main *bmain, Scene *sce) { Object *camera; + SceneLayer *scene_layer = BKE_scene_layer_from_scene_get(sce); int winx, winy; winx = (sce->r.size * sce->r.xsch) / 100; @@ -3845,6 +3848,8 @@ void RE_PreviewRender(Render *re, Main *bmain, Scene *sce) 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, scene_layer); + re->eval_ctx->scene_layer = scene_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 fb047aad897..63fe7e4471a 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -58,6 +58,8 @@ #include "BKE_texture.h" #include "BKE_colortools.h" +#include "DEG_depsgraph.h" + #include "render_types.h" #include "texture.h" #include "pointdensity.h" @@ -167,7 +169,7 @@ static void alloc_point_data(PointDensity *pd) } } -static void pointdensity_cache_psys(Scene *scene, +static void pointdensity_cache_psys(EvaluationContext *eval_ctx, Scene *scene, PointDensity *pd, Object *ob, ParticleSystem *psys, @@ -201,12 +203,12 @@ static void pointdensity_cache_psys(Scene *scene, } if (use_render_params) { - dm = mesh_create_derived_render(scene, + dm = mesh_create_derived_render(eval_ctx, scene, ob, CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); } else { - dm = mesh_get_derived_final(scene, + dm = mesh_get_derived_final(eval_ctx, scene, ob, CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); } @@ -216,6 +218,7 @@ static void pointdensity_cache_psys(Scene *scene, return; } + sim.eval_ctx = eval_ctx; sim.scene = scene; sim.ob = ob; sim.psys = psys; @@ -400,7 +403,7 @@ static void pointdensity_cache_vertex_normal(PointDensity *pd, Object *UNUSED(ob } } -static void pointdensity_cache_object(Scene *scene, +static void pointdensity_cache_object(EvaluationContext *eval_ctx, Scene *scene, PointDensity *pd, Object *ob, const bool use_render_params) @@ -421,10 +424,10 @@ static void pointdensity_cache_object(Scene *scene, } if (use_render_params) { - dm = mesh_create_derived_render(scene, ob, mask); + dm = mesh_create_derived_render(eval_ctx, scene, ob, mask); } else { - dm = mesh_get_derived_final(scene, ob, mask); + dm = mesh_get_derived_final(eval_ctx, scene, ob, mask); } mvert = dm->getVertArray(dm); /* local object space */ @@ -475,7 +478,7 @@ static void pointdensity_cache_object(Scene *scene, } -static void cache_pointdensity_ex(Scene *scene, +static void cache_pointdensity_ex(EvaluationContext *eval_ctx, Scene *scene, PointDensity *pd, float viewmat[4][4], float winmat[4][4], @@ -504,7 +507,8 @@ static void cache_pointdensity_ex(Scene *scene, return; } - pointdensity_cache_psys(scene, + pointdensity_cache_psys(eval_ctx, + scene, pd, ob, psys, @@ -515,13 +519,14 @@ static void cache_pointdensity_ex(Scene *scene, else if (pd->source == TEX_PD_OBJECT) { Object *ob = pd->object; if (ob && ob->type == OB_MESH) - pointdensity_cache_object(scene, pd, ob, use_render_params); + pointdensity_cache_object(eval_ctx, scene, pd, ob, use_render_params); } } void cache_pointdensity(Render *re, PointDensity *pd) { - cache_pointdensity_ex(re->scene, + cache_pointdensity_ex(re->eval_ctx, + re->scene, pd, re->viewmat, re->winmat, re->winx, re->winy, @@ -876,7 +881,8 @@ static void sample_dummy_point_density(int resolution, float *values) memset(values, 0, sizeof(float) * 4 * resolution * resolution * resolution); } -static void particle_system_minmax(Scene *scene, +static void particle_system_minmax(EvaluationContext *eval_ctx, + Scene *scene, Object *object, ParticleSystem *psys, float radius, @@ -903,6 +909,7 @@ static void particle_system_minmax(Scene *scene, psys_render_set(object, psys, mat, mat, 1, 1, 0); } + sim.eval_ctx = eval_ctx; sim.scene = scene; sim.ob = object; sim.psys = psys; @@ -938,19 +945,28 @@ static void particle_system_minmax(Scene *scene, void RE_point_density_cache( Scene *scene, + SceneLayer *sl, PointDensity *pd, const bool use_render_params) { + EvaluationContext eval_ctx = {0}; float mat[4][4]; + + DEG_evaluation_context_init(&eval_ctx, use_render_params ? DAG_EVAL_RENDER + : DAG_EVAL_VIEWPORT); + + eval_ctx.scene_layer = sl; + /* Same matricies/resolution as dupli_render_particle_set(). */ unit_m4(mat); BLI_mutex_lock(&sample_mutex); - cache_pointdensity_ex(scene, pd, mat, mat, 1, 1, use_render_params); + cache_pointdensity_ex(&eval_ctx, scene, pd, mat, mat, 1, 1, use_render_params); BLI_mutex_unlock(&sample_mutex); } void RE_point_density_minmax( struct Scene *scene, + SceneLayer *sl, struct PointDensity *pd, const bool use_render_params, float r_min[3], float r_max[3]) @@ -963,6 +979,8 @@ void RE_point_density_minmax( } if (pd->source == TEX_PD_PSYS) { ParticleSystem *psys; + EvaluationContext eval_ctx = {0}; + if (pd->psys == 0) { zero_v3(r_min); zero_v3(r_max); @@ -974,7 +992,15 @@ void RE_point_density_minmax( zero_v3(r_max); return; } - particle_system_minmax(scene, + + DEG_evaluation_context_init(&eval_ctx, use_render_params ? DAG_EVAL_RENDER : + DAG_EVAL_VIEWPORT); + + eval_ctx.ctime = (float)scene->r.cfra + scene->r.subframe; + eval_ctx.scene_layer = sl; + + particle_system_minmax(&eval_ctx, + scene, object, psys, pd->radius, @@ -1044,6 +1070,7 @@ static void point_density_sample_func(void *data_v, const int iter) */ void RE_point_density_sample( Scene *scene, + SceneLayer *sl, PointDensity *pd, const int resolution, const bool use_render_params, @@ -1063,6 +1090,7 @@ void RE_point_density_sample( BLI_mutex_lock(&sample_mutex); RE_point_density_minmax(scene, + sl, pd, use_render_params, min, diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index b4ff5f52fcf..660b82b884d 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -438,7 +438,7 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert } } - if ((texco & TEXCO_UV) || (mode & (MA_VERTEXCOL | MA_VERTEXCOLP | MA_FACETEXTURE))) { + if ((texco & TEXCO_UV) || (mode & (MA_VERTEXCOL | MA_VERTEXCOLP))) { MCol *mcol; const float *uv; char *name; @@ -500,15 +500,6 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert suv->dyuv[0] = 0.0f; suv->dyuv[1] = 0.0f; } - - if ((mode & MA_FACETEXTURE) && i == obr->actmtface) { - if ((mode & (MA_VERTEXCOL | MA_VERTEXCOLP)) == 0) { - shi->vcol[0] = 1.0f; - shi->vcol[1] = 1.0f; - shi->vcol[2] = 1.0f; - shi->vcol[3] = 1.0f; - } - } } if (shi->totuv == 0) { @@ -517,14 +508,6 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert suv->uv[0] = 0.0f; suv->uv[1] = spoint->strandco; suv->uv[2] = 0.0f; /* texture.c assumes there are 3 coords */ - - if (mode & MA_FACETEXTURE) { - /* no tface? set at 1.0f */ - shi->vcol[0] = 1.0f; - shi->vcol[1] = 1.0f; - shi->vcol[2] = 1.0f; - shi->vcol[3] = 1.0f; - } } } @@ -566,7 +549,7 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert } if (shi->do_manage) { - if (mode & (MA_VERTEXCOL | MA_VERTEXCOLP | MA_FACETEXTURE)) { + if (mode & (MA_VERTEXCOL | MA_VERTEXCOLP)) { srgb_to_linearrgb_v3_v3(shi->vcol, shi->vcol); } } @@ -1072,7 +1055,7 @@ void shade_input_set_shade_texco(ShadeInput *shi) } } - if ((texco & TEXCO_UV) || (mode & (MA_VERTEXCOL | MA_VERTEXCOLP | MA_FACETEXTURE)) || (R.flag & R_NEED_VCOL)) { + if ((texco & TEXCO_UV) || (mode & (MA_VERTEXCOL | MA_VERTEXCOLP)) || (R.flag & R_NEED_VCOL)) { VlakRen *vlr = shi->vlr; MTFace *tface; MCol *mcol; @@ -1227,18 +1210,6 @@ void shade_input_set_shade_texco(ShadeInput *shi) suv->dyuv[0] = 2.0f * (dl * uv3[0] - duv[0] * uv1[0] - duv[1] * uv2[0]); suv->dyuv[1] = 2.0f * (dl * uv3[1] - duv[0] * uv1[1] - duv[1] * uv2[1]); } - - if ((mode & MA_FACETEXTURE) && i == obr->actmtface) { - if (((mode & (MA_VERTEXCOL | MA_VERTEXCOLP)) == 0) && ((R.flag & R_NEED_VCOL) == 0)) { - shi->vcol[0] = 1.0f; - shi->vcol[1] = 1.0f; - shi->vcol[2] = 1.0f; - shi->vcol[3] = 1.0f; - } - if (tface->tpage) { - render_realtime_texture(shi, tface->tpage); - } - } } } @@ -1252,14 +1223,6 @@ void shade_input_set_shade_texco(ShadeInput *shi) suv->uv[0] = 2.0f * (u + .5f); suv->uv[1] = 2.0f * (v + .5f); suv->uv[2] = 0.0f; /* texture.c assumes there are 3 coords */ - - if (mode & MA_FACETEXTURE) { - /* no tface? set at 1.0f */ - shi->vcol[0] = 1.0f; - shi->vcol[1] = 1.0f; - shi->vcol[2] = 1.0f; - shi->vcol[3] = 1.0f; - } } } @@ -1315,7 +1278,7 @@ void shade_input_set_shade_texco(ShadeInput *shi) * else un-initialized values are used */ if (shi->do_manage) { - if ((mode & (MA_VERTEXCOL | MA_VERTEXCOLP | MA_FACETEXTURE)) || (R.flag & R_NEED_VCOL)) { + if ((mode & (MA_VERTEXCOL | MA_VERTEXCOLP)) || (R.flag & R_NEED_VCOL)) { srgb_to_linearrgb_v3_v3(shi->vcol, shi->vcol); } } diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 8dea0930b9e..c5a666d52c9 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -899,14 +899,7 @@ void shade_color(ShadeInput *shi, ShadeResult *shr) { Material *ma= shi->mat; - if (ma->mode & (MA_FACETEXTURE)) { - shi->r= shi->vcol[0]; - shi->g= shi->vcol[1]; - shi->b= shi->vcol[2]; - if (ma->mode & (MA_FACETEXTURE_ALPHA)) - shi->alpha= shi->vcol[3]; - } - else if (ma->mode & (MA_VERTEXCOLP)) { + if (ma->mode & (MA_VERTEXCOLP)) { float neg_alpha = 1.0f - shi->vcol[3]; shi->r= shi->r*neg_alpha + shi->vcol[0]*shi->vcol[3]; shi->g= shi->g*neg_alpha + shi->vcol[1]*shi->vcol[3]; @@ -1764,12 +1757,8 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) /* material color itself */ if (passflag & color_passes) { - if (ma->mode & (MA_FACETEXTURE)) { - shi->r= shi->vcol[0]; - shi->g= shi->vcol[1]; - shi->b= shi->vcol[2]; - if (ma->mode & (MA_FACETEXTURE_ALPHA)) - shi->alpha= shi->vcol[3]; + if (false) { + /* pass */ } #ifdef WITH_FREESTYLE else if (ma->vcol_alpha) { |