diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-01-26 14:50:55 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-01-26 14:50:55 +0300 |
commit | 8126b0222d11e68b62f1d3d975ec6396b7e87af2 (patch) | |
tree | 125442ce2af8d610665f7412b34d57879e97b94c /source/blender/render | |
parent | 0095c2dad2e66a2906fd60c417c845b35a645cf7 (diff) |
Fix T47214: Keyed Particles don't render correctly when used for point density input
The issue was caused by different AABB used by Cycles and texture sampler.
Instead of trying to keep this two functions in sync we now do have an
utility call in the point density node to query the AABB.
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 | 69 |
2 files changed, 50 insertions, 25 deletions
diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h index 81d1a00702d..d5af16d9b6e 100644 --- a/source/blender/render/extern/include/RE_render_ext.h +++ b/source/blender/render/extern/include/RE_render_ext.h @@ -67,6 +67,12 @@ void RE_cache_point_density(struct Scene *scene, struct PointDensity *pd, const bool use_render_params); +void RE_minmac_point_density(struct Scene *scene, + struct PointDensity *pd, + const bool use_render_params, + float r_min[3], + float r_max[3]); + void RE_sample_point_density(struct Scene *scene, struct PointDensity *pd, const int resolution, diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c index b4dfbc4a59f..d98c47249ad 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -727,38 +727,28 @@ void RE_cache_point_density(Scene *scene, BLI_mutex_unlock(&sample_mutex); } -/* NOTE 1: Requires RE_cache_point_density() to be called first. - * NOTE 2: Frees point density structure after sampling. - */ -void RE_sample_point_density(Scene *scene, - PointDensity *pd, - const int resolution, +void RE_minmac_point_density(struct Scene *scene, + struct PointDensity *pd, const bool use_render_params, - float *values) + float r_min[3], + float r_max[3]) { - const size_t resolution2 = resolution * resolution; Object *object = pd->object; - size_t x, y, z; - float min[3], max[3], dim[3]; - - /* TODO(sergey): Implement some sort of assert() that point density - * was cached already. - */ - if (object == NULL) { - sample_dummy_point_density(resolution, values); - return; + zero_v3(r_min); + zero_v3(r_max); } - if (pd->source == TEX_PD_PSYS) { ParticleSystem *psys; if (pd->psys == 0) { - sample_dummy_point_density(resolution, values); + zero_v3(r_min); + zero_v3(r_max); return; } psys = BLI_findlink(&object->particlesystem, pd->psys - 1); if (psys == NULL) { - sample_dummy_point_density(resolution, values); + zero_v3(r_min); + zero_v3(r_max); return; } particle_system_minmax(scene, @@ -766,19 +756,48 @@ void RE_sample_point_density(Scene *scene, psys, pd->radius, use_render_params, - min, max); + r_min, r_max); } else { float radius[3] = {pd->radius, pd->radius, pd->radius}; float *loc, *size; BKE_object_obdata_texspace_get(pd->object, NULL, &loc, &size, NULL); - sub_v3_v3v3(min, loc, size); - add_v3_v3v3(max, loc, size); + sub_v3_v3v3(r_min, loc, size); + add_v3_v3v3(r_max, loc, size); /* Adjust texture space to include density points on the boundaries. */ - sub_v3_v3(min, radius); - add_v3_v3(max, radius); + sub_v3_v3(r_min, radius); + add_v3_v3(r_max, radius); + } +} + +/* NOTE 1: Requires RE_cache_point_density() to be called first. + * NOTE 2: Frees point density structure after sampling. + */ +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; + size_t x, y, z; + float min[3], max[3], dim[3]; + + /* TODO(sergey): Implement some sort of assert() that point density + * was cached already. + */ + + if (object == NULL) { + sample_dummy_point_density(resolution, values); + return; } + RE_minmac_point_density(scene, + pd, + use_render_params, + min, + max); sub_v3_v3v3(dim, max, min); if (dim[0] <= 0.0f || dim[1] <= 0.0f || dim[2] <= 0.0f) { sample_dummy_point_density(resolution, values); |