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 /intern/cycles/blender/blender_texture.cpp | |
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 'intern/cycles/blender/blender_texture.cpp')
-rw-r--r-- | intern/cycles/blender/blender_texture.cpp | 89 |
1 files changed, 15 insertions, 74 deletions
diff --git a/intern/cycles/blender/blender_texture.cpp b/intern/cycles/blender/blender_texture.cpp index 18f66560b10..55fc5352e3f 100644 --- a/intern/cycles/blender/blender_texture.cpp +++ b/intern/cycles/blender/blender_texture.cpp @@ -22,8 +22,8 @@ namespace { /* Point density helpers. */ -static void density_texture_space_invert(float3& loc, - float3& size) +void density_texture_space_invert(float3& loc, + float3& size) { if(size.x != 0.0f) size.x = 0.5f/size.x; if(size.y != 0.0f) size.y = 0.5f/size.y; @@ -32,87 +32,28 @@ static void density_texture_space_invert(float3& loc, loc = loc*size - make_float3(0.5f, 0.5f, 0.5f); } -static void density_object_texture_space(BL::Object b_ob, - float radius, - float3& loc, - float3& size) -{ - if(b_ob.type() == BL::Object::type_MESH) { - BL::Mesh b_mesh(b_ob.data()); - loc = get_float3(b_mesh.texspace_location()); - size = get_float3(b_mesh.texspace_size()); - } - else { - /* TODO(sergey): Not supported currently. */ - } - /* Adjust texture space to include density points on the boundaries. */ - size = size + make_float3(radius, radius, radius); - density_texture_space_invert(loc, size); -} - -static void density_particle_system_texture_space( - BL::Object b_ob, - BL::ParticleSystem b_particle_system, - float radius, - float3& loc, - float3& size) -{ - if(b_particle_system.settings().type() == BL::ParticleSettings::type_HAIR) { - /* TODO(sergey): Not supported currently. */ - return; - } - Transform tfm = get_transform(b_ob.matrix_world()); - Transform itfm = transform_inverse(tfm); - float3 min = make_float3(FLT_MAX, FLT_MAX, FLT_MAX), - max = make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX); - float3 particle_size = make_float3(radius, radius, radius); - for(int i = 0; i < b_particle_system.particles.length(); ++i) { - BL::Particle particle = b_particle_system.particles[i]; - if(particle.alive_state() == BL::Particle::alive_state_ALIVE) { - float3 location = get_float3(particle.location()); - location = transform_point(&itfm, location); - min = ccl::min(min, location - particle_size); - max = ccl::max(max, location + particle_size); - } - } - /* Calculate texture space from the particle bounds. */ - loc = (min + max) * 0.5f; - size = (max - min) * 0.5f; - density_texture_space_invert(loc, size); -} - } /* namespace */ -void point_density_texture_space(BL::ShaderNodeTexPointDensity b_point_density_node, +void point_density_texture_space(BL::Scene b_scene, + BL::ShaderNodeTexPointDensity b_point_density_node, + int settings, float3& loc, float3& size) { - /* Fallback values. */ - loc = make_float3(0.0f, 0.0f, 0.0f); - size = make_float3(0.0f, 0.0f, 0.0f); BL::Object b_ob(b_point_density_node.object()); if(!b_ob) { + loc = make_float3(0.0f, 0.0f, 0.0f); + size = make_float3(0.0f, 0.0f, 0.0f); return; } - if(b_point_density_node.point_source() == - BL::ShaderNodeTexPointDensity::point_source_PARTICLE_SYSTEM) - { - BL::ParticleSystem b_particle_system( - b_point_density_node.particle_system()); - if(b_particle_system) { - density_particle_system_texture_space(b_ob, - b_particle_system, - b_point_density_node.radius(), - loc, - size); - } - } - else { - density_object_texture_space(b_ob, - b_point_density_node.radius(), - loc, - size); - } + float3 min, max; + b_point_density_node.calc_point_density_minmax(b_scene, + settings, + &min[0], + &max[0]); + loc = (min + max) * 0.5f; + size = (max - min) * 0.5f; + density_texture_space_invert(loc, size); } CCL_NAMESPACE_END |