diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-10-08 10:09:28 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-10-08 10:41:05 +0300 |
commit | ac098007fb25b056f81336dfeef289d14a41dd43 (patch) | |
tree | ffc10b4bd0665e0578d2c717d8a5be8cce94c468 /source/blender/render | |
parent | 1d9de55949a4b1a79370c23e11ad59bffc5ae440 (diff) |
Cycles: Fix for point density always using render settings for modifiers
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/extern/include/RE_render_ext.h | 6 | ||||
-rw-r--r-- | source/blender/render/intern/source/pointdensity.c | 83 |
2 files changed, 72 insertions, 17 deletions
diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h index 6e1f128b7a5..85a9dc9fccd 100644 --- a/source/blender/render/extern/include/RE_render_ext.h +++ b/source/blender/render/extern/include/RE_render_ext.h @@ -63,7 +63,11 @@ void RE_sample_material_color( struct PointDensity; -void RE_sample_point_density(struct Scene *scene, struct PointDensity *pd, int resolution, float *values); +void RE_sample_point_density(struct Scene *scene, + struct PointDensity *pd, + const int resolution, + const bool use_render_params, + float *values); void RE_init_texture_rng(void); void RE_exit_texture_rng(void); diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c index 081904e4a65..9b58bde730a 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -121,7 +121,8 @@ static void pointdensity_cache_psys(Scene *scene, ParticleSystem *psys, float viewmat[4][4], float winmat[4][4], - int winx, int winy) + int winx, int winy, + const bool use_render_params) { DerivedMesh *dm; ParticleKey state; @@ -140,9 +141,20 @@ static void pointdensity_cache_psys(Scene *scene, } /* Just to create a valid rendering context for particles */ - psys_render_set(ob, psys, viewmat, winmat, winx, winy, 0); + if (use_render_params) { + psys_render_set(ob, psys, viewmat, winmat, winx, winy, 0); + } - dm = mesh_create_derived_render(scene, ob, CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + if (use_render_params) { + dm = mesh_create_derived_render(scene, + ob, + CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + } + else { + dm = mesh_get_derived_final(scene, + ob, + CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + } if ( !psys_check_enabled(ob, psys)) { psys_render_restore(ob, psys); @@ -240,17 +252,32 @@ static void pointdensity_cache_psys(Scene *scene, psys->lattice_deform_data = NULL; } - psys_render_restore(ob, psys); + if (use_render_params) { + psys_render_restore(ob, psys); + } } -static void pointdensity_cache_object(Scene *scene, PointDensity *pd, Object *ob) +static void pointdensity_cache_object(Scene *scene, + PointDensity *pd, + Object *ob, + const bool use_render_params) { int i; DerivedMesh *dm; MVert *mvert = NULL; - dm = mesh_create_derived_render(scene, ob, CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + if (use_render_params) { + dm = mesh_create_derived_render(scene, + ob, + CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + } + else { + dm = mesh_get_derived_final(scene, + ob, + CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL); + + } mvert = dm->getVertArray(dm); /* local object space */ pd->totpoints = dm->getNumVerts(dm); @@ -290,7 +317,8 @@ static void cache_pointdensity_ex(Scene *scene, PointDensity *pd, float viewmat[4][4], float winmat[4][4], - int winx, int winy) + int winx, int winy, + const bool use_render_params) { if (pd == NULL) { return; @@ -314,18 +342,28 @@ static void cache_pointdensity_ex(Scene *scene, return; } - pointdensity_cache_psys(scene, pd, ob, psys, viewmat, winmat, winx, winy); + pointdensity_cache_psys(scene, + pd, + ob, + psys, + viewmat, winmat, + winx, winy, + use_render_params); } else if (pd->source == TEX_PD_OBJECT) { Object *ob = pd->object; if (ob && ob->type == OB_MESH) - pointdensity_cache_object(scene, pd, ob); + pointdensity_cache_object(scene, pd, ob, use_render_params); } } void cache_pointdensity(Render *re, PointDensity *pd) { - cache_pointdensity_ex(re->scene, pd, re->viewmat, re->winmat, re->winx, re->winy); + cache_pointdensity_ex(re->scene, + pd, + re->viewmat, re->winmat, + re->winx, re->winy, + true); } void free_pointdensity(PointDensity *pd) @@ -621,6 +659,7 @@ static void particle_system_minmax(Scene *scene, Object *object, ParticleSystem *psys, float radius, + const bool use_render_params, float min[3], float max[3]) { const float size[3] = {radius, radius, radius}; @@ -639,7 +678,9 @@ static void particle_system_minmax(Scene *scene, } unit_m4(mat); - psys_render_set(object, psys, mat, mat, 1, 1, 0); + if (use_render_params) { + psys_render_set(object, psys, mat, mat, 1, 1, 0); + } sim.scene = scene; sim.ob = object; @@ -669,11 +710,16 @@ static void particle_system_minmax(Scene *scene, psys->lattice_deform_data = NULL; } - psys_render_restore(object, psys); + if (use_render_params) { + psys_render_restore(object, psys); + } } -void RE_sample_point_density(Scene *scene, PointDensity *pd, - int resolution, float *values) +void RE_sample_point_density(Scene *scene, + PointDensity *pd, + const int resolution, + const bool use_render_params, + float *values) { const size_t resolution2 = resolution * resolution; Object *object = pd->object; @@ -696,7 +742,12 @@ void RE_sample_point_density(Scene *scene, PointDensity *pd, sample_dummy_point_density(resolution, values); return; } - particle_system_minmax(scene, object, psys, pd->radius, min, max); + particle_system_minmax(scene, + object, + psys, + pd->radius, + use_render_params, + min, max); } else { float radius[3] = {pd->radius, pd->radius, pd->radius}; @@ -719,7 +770,7 @@ void RE_sample_point_density(Scene *scene, PointDensity *pd, unit_m4(mat); BLI_mutex_lock(&sample_mutex); - cache_pointdensity_ex(scene, pd, mat, mat, 1, 1); + cache_pointdensity_ex(scene, pd, mat, mat, 1, 1, use_render_params); for (z = 0; z < resolution; ++z) { for (y = 0; y < resolution; ++y) { for (x = 0; x < resolution; ++x) { |