diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-04-08 10:28:52 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-04-13 15:38:59 +0300 |
commit | 7b9fb3259157cea2df5e7b461d04f55cfa380031 (patch) | |
tree | a54e7d066283aeae384beb2ae99cc9a0e158bec5 /source/blender/render | |
parent | a1e2415ed51e2da97e3b182f18f462345a02ce14 (diff) |
Python API: remove preview/render resolution settings from API functions.
For correct results these must have been set already when the depsgraph was
created and evaluated, so all dependencies have appropriate resolutions too.
For particle we no longer backup and restore the viewport particles to avoid
overwriting them during render, as copy-on-write solves this for us. Even
without COW particles seem to work ok.
This also removes the particle simplification options based on camera. This
was never used much and only available in Blender Internal.
Differential Revision: https://developer.blender.org/D3148
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 79 | ||||
-rw-r--r-- | source/blender/render/intern/source/pointdensity.c | 34 |
2 files changed, 3 insertions, 110 deletions
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index cb3397d9a2e..c358f0388a4 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -1317,10 +1317,10 @@ static int render_new_particle_system(const EvaluationContext *eval_ctx, Render float strandlen=0.0f, curlen=0.0f; float hasize, pa_size, r_tilt, r_length; float pa_time, pa_birthtime, pa_dietime; - float random, simplify[2], pa_co[3]; + float random, pa_co[3]; const float cfra= BKE_scene_frame_get(re->scene); int i, a, k, max_k=0, totpart; - bool do_simplify = false, do_surfacecache = false, use_duplimat = false; + bool do_surfacecache = false, use_duplimat = false; int totchild=0, step_nbr; int seed, path_nbr=0, orco1=0, num; int totface; @@ -1635,8 +1635,6 @@ static int render_new_particle_system(const EvaluationContext *eval_ctx, Render get_particle_uvco_mcol(part->from, psmd->dm_final, parent->fuv, num, &sd); } - do_simplify = psys_render_simplify_params(psys, cpa, simplify); - if (strandbuf) { int orignum = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, cpa->num) : cpa->num; @@ -1669,12 +1667,6 @@ static int render_new_particle_system(const EvaluationContext *eval_ctx, Render strand->vert= svert; copy_v3_v3(strand->orco, sd.orco); - if (do_simplify) { - float *ssimplify= RE_strandren_get_simplify(obr, strand, 1); - ssimplify[0]= simplify[0]; - ssimplify[1]= simplify[1]; - } - if (sd.surfnor) { float *snor= RE_strandren_get_surfnor(obr, strand, 1); copy_v3_v3(snor, sd.surfnor); @@ -4663,22 +4655,10 @@ static void add_render_object(const EvaluationContext *eval_ctx, Render *re, Obj index= (dob)? dob->persistent_id[0]: 0; - /* It seems that we may generate psys->renderdata recursively in some nasty intricated cases of - * several levels of bupliobject (see T51524). - * For now, basic rule is, do not restore psys if it was already in 'render state'. - * Another, more robust solution could be to add some reference counting to that renderdata... */ - bool psys_has_renderdata = false; - /* the emitter has to be processed first (render levels of modifiers) */ /* so here we only check if the emitter should be rendered */ if (ob->particlesystem.first) { show_emitter = (ob->duplicator_visibility_flag & OB_DUPLI_FLAG_RENDER) != 0; - for (psys=ob->particlesystem.first; psys; psys=psys->next) { - if (!(re->r.scemode & R_VIEWPORT_PREVIEW)) { - psys_has_renderdata |= (psys->renderdata != NULL); - psys_render_set(ob, psys, re->viewmat, re->winmat, re->winx, re->winy, timeoffset); - } - } /* if no psys has "show emitter" selected don't render emitter */ if (show_emitter == 0) @@ -4724,9 +4704,6 @@ static void add_render_object(const EvaluationContext *eval_ctx, Render *re, Obj if (dob) psys->flag |= PSYS_USE_IMAT; init_render_object_data(eval_ctx, re, obr, timeoffset); - if (!(re->r.scemode & R_VIEWPORT_PREVIEW) && !psys_has_renderdata) { - psys_render_restore(ob, psys); - } psys->flag &= ~PSYS_USE_IMAT; /* only add instance for objects that have not been used for dupli */ @@ -4908,51 +4885,6 @@ static int allow_render_dupli_instance(Render *UNUSED(re), DupliObject *dob, Obj (!(dob->type == OB_DUPLIGROUP) || !dob->animated)); } -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 */ - ParticleSystem *psys; - DerivedMesh *dm; - - if (re->r.scemode & R_VIEWPORT_PREVIEW) - return; - - if (level >= MAX_DUPLI_RECUR) - return; - - if (ob->transflag & OB_DUPLIPARTS) { - for (psys=ob->particlesystem.first; psys; psys=psys->next) { - if (ELEM(psys->part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) { - if (enable) - psys_render_set(ob, psys, re->viewmat, re->winmat, re->winx, re->winy, timeoffset); - else - psys_render_restore(ob, psys); - } - } - - if (enable) { - /* 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(eval_ctx, re->scene, ob, CD_MASK_RENDER_INTERNAL); - dm->release(dm); - - for (psys=ob->particlesystem.first; psys; psys=psys->next) - psys_get_modifier(ob, psys)->flag &= ~eParticleSystemFlag_psys_updated; - } - } - - if (ob->dup_group == NULL) return; - - FOREACH_GROUP_OBJECT_BEGIN(ob->dup_group, object) - { - dupli_render_particle_set(eval_ctx, re, object, timeoffset, level+1, enable); - } - FOREACH_GROUP_OBJECT_END; -} - static int get_vector_viewlayers(Scene *UNUSED(sce)) { return 0; @@ -5052,12 +4984,8 @@ static void database_init_objects(const EvaluationContext *eval_ctx, Render *re, /* create list of duplis generated by this object, particle * system need to have render settings set for dupli particles */ - 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. */ for (dob= duplilist->first, i = 0; dob; dob= dob->next, ++i) { DupliExtraData *dob_extra = &duplilist_apply_data->extra[i]; @@ -5150,9 +5078,6 @@ static void database_init_objects(const EvaluationContext *eval_ctx, Render *re, if (re->test_break(re->tbh)) break; } - /* restore particle system */ - dupli_render_particle_set(eval_ctx, re, ob, timeoffset, 0, false); - if (duplilist_apply_data) { duplilist_restore(duplilist, duplilist_apply_data); duplilist_free_apply_data(duplilist_apply_data); diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c index 49738aa5f96..bba422345e0 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -174,9 +174,6 @@ static void pointdensity_cache_psys(const EvaluationContext *eval_ctx, Scene *sc PointDensity *pd, Object *ob, ParticleSystem *psys, - float viewmat[4][4], - float winmat[4][4], - int winx, int winy, const bool use_render_params) { DerivedMesh *dm; @@ -198,11 +195,6 @@ static void pointdensity_cache_psys(const EvaluationContext *eval_ctx, Scene *sc data_used = point_data_used(pd); - /* Just to create a valid rendering context for particles */ - if (use_render_params) { - psys_render_set(ob, psys, viewmat, winmat, winx, winy, 0); - } - if (use_render_params) { dm = mesh_create_derived_render(eval_ctx, scene, ob, @@ -215,7 +207,6 @@ static void pointdensity_cache_psys(const EvaluationContext *eval_ctx, Scene *sc } if (!psys_check_enabled(ob, psys, use_render_params)) { - psys_render_restore(ob, psys); return; } @@ -308,10 +299,6 @@ static void pointdensity_cache_psys(const EvaluationContext *eval_ctx, Scene *sc end_latt_deform(psys->lattice_deform_data); psys->lattice_deform_data = NULL; } - - if (use_render_params) { - psys_render_restore(ob, psys); - } } @@ -482,9 +469,6 @@ static void pointdensity_cache_object(const EvaluationContext *eval_ctx, Scene * static void cache_pointdensity_ex(const EvaluationContext *eval_ctx, Scene *scene, PointDensity *pd, - float viewmat[4][4], - float winmat[4][4], - int winx, int winy, const bool use_render_params) { if (pd == NULL) { @@ -514,8 +498,6 @@ static void cache_pointdensity_ex(const EvaluationContext *eval_ctx, pd, ob, psys, - viewmat, winmat, - winx, winy, use_render_params); } else if (pd->source == TEX_PD_OBJECT) { @@ -530,8 +512,6 @@ void cache_pointdensity(const EvaluationContext *eval_ctx, Render *re, PointDens cache_pointdensity_ex(eval_ctx, re->scene, pd, - re->viewmat, re->winmat, - re->winx, re->winy, true); } @@ -888,7 +868,6 @@ static void particle_system_minmax(const EvaluationContext *eval_ctx, Object *object, ParticleSystem *psys, float radius, - const bool use_render_params, float min[3], float max[3]) { const float size[3] = {radius, radius, radius}; @@ -907,9 +886,6 @@ static void particle_system_minmax(const EvaluationContext *eval_ctx, } unit_m4(mat); - if (use_render_params) { - psys_render_set(object, psys, mat, mat, 1, 1, 0); - } sim.eval_ctx = eval_ctx; sim.scene = scene; @@ -939,26 +915,20 @@ static void particle_system_minmax(const EvaluationContext *eval_ctx, end_latt_deform(psys->lattice_deform_data); psys->lattice_deform_data = NULL; } - - if (use_render_params) { - psys_render_restore(object, psys); - } } void RE_point_density_cache( const struct EvaluationContext *eval_ctx, PointDensity *pd) { - float mat[4][4]; const bool use_render_params = (eval_ctx->mode == DAG_EVAL_RENDER); Depsgraph *depsgraph = eval_ctx->depsgraph; Scene *scene = DEG_get_evaluated_scene(depsgraph); /* Same matricies/resolution as dupli_render_particle_set(). */ - unit_m4(mat); BLI_mutex_lock(&sample_mutex); - cache_pointdensity_ex(eval_ctx, scene, pd, mat, mat, 1, 1, use_render_params); + cache_pointdensity_ex(eval_ctx, scene, pd, use_render_params); BLI_mutex_unlock(&sample_mutex); } @@ -967,7 +937,6 @@ void RE_point_density_minmax( struct PointDensity *pd, float r_min[3], float r_max[3]) { - const bool use_render_params = (eval_ctx->mode == DAG_EVAL_RENDER); Depsgraph *depsgraph = eval_ctx->depsgraph; Scene *scene = DEG_get_evaluated_scene(depsgraph); Object *object = pd->object; @@ -996,7 +965,6 @@ void RE_point_density_minmax( object, psys, pd->radius, - use_render_params, r_min, r_max); } else { |