forked from bartvdbraak/blender
Fix for particle object rendering in Cycles. On object sync the object first has to determine if a particle update is needed (which depends on dupli objects and their meshes), before deciding to skip the actual syncing.
This commit is contained in:
parent
a1dd6ea836
commit
d33a0effba
@ -247,8 +247,11 @@ void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob,
|
||||
scene->object_manager->tag_update(scene);
|
||||
}
|
||||
|
||||
/* updated dupli objects require particle sync */
|
||||
bool need_particle_update = object_need_particle_update(b_ob);
|
||||
|
||||
/* object sync */
|
||||
if(object_updated || (object->mesh && object->mesh->need_update)) {
|
||||
if(object_updated || (object->mesh && object->mesh->need_update) || need_particle_update) {
|
||||
object->name = b_ob.name().c_str();
|
||||
object->pass_id = b_ob.pass_index();
|
||||
object->tfm = tfm;
|
||||
@ -275,7 +278,7 @@ void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob,
|
||||
object->particle_id = particle_id;
|
||||
|
||||
/* particle sync */
|
||||
if (object_use_particles(b_ob))
|
||||
if (need_particle_update)
|
||||
sync_particles(object, b_ob);
|
||||
|
||||
object->tag_update(scene);
|
||||
|
@ -31,7 +31,7 @@ CCL_NAMESPACE_BEGIN
|
||||
|
||||
/* Particles Sync */
|
||||
|
||||
bool BlenderSync::object_use_particles(BL::Object b_ob)
|
||||
bool BlenderSync::object_need_particle_update(BL::Object b_ob)
|
||||
{
|
||||
/* Particle data is only needed for
|
||||
* a) Billboard render mode if object's own material uses particle info
|
||||
@ -39,7 +39,7 @@ bool BlenderSync::object_use_particles(BL::Object b_ob)
|
||||
*
|
||||
* Note: Meshes have to be synced at this point!
|
||||
*/
|
||||
bool use_particles = false;
|
||||
bool need_update = false;
|
||||
|
||||
BL::Object::particle_systems_iterator b_psys;
|
||||
for (b_ob.particle_systems.begin(b_psys); b_psys != b_ob.particle_systems.end(); ++b_psys) {
|
||||
@ -54,7 +54,7 @@ bool BlenderSync::object_use_particles(BL::Object b_ob)
|
||||
BL::ID key = (BKE_object_is_modified(b_ob))? b_ob: b_ob.data();
|
||||
Mesh *mesh = mesh_map.find(key);
|
||||
if (mesh) {
|
||||
use_particles |= mesh->need_attribute(scene, ATTR_STD_PARTICLE);
|
||||
need_update |= mesh->need_attribute(scene, ATTR_STD_PARTICLE) && mesh->need_update;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -66,7 +66,7 @@ bool BlenderSync::object_use_particles(BL::Object b_ob)
|
||||
BL::ID key = (BKE_object_is_modified(b_dupli_ob))? b_dupli_ob: b_dupli_ob.data();
|
||||
Mesh *mesh = mesh_map.find(key);
|
||||
if (mesh) {
|
||||
use_particles |= mesh->need_attribute(scene, ATTR_STD_PARTICLE);
|
||||
need_update |= mesh->need_attribute(scene, ATTR_STD_PARTICLE) && mesh->need_update;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -80,7 +80,7 @@ bool BlenderSync::object_use_particles(BL::Object b_ob)
|
||||
BL::ID key = (BKE_object_is_modified(*b_gob))? *b_gob: b_gob->data();
|
||||
Mesh *mesh = mesh_map.find(key);
|
||||
if (mesh) {
|
||||
use_particles |= mesh->need_attribute(scene, ATTR_STD_PARTICLE);
|
||||
need_update |= mesh->need_attribute(scene, ATTR_STD_PARTICLE) && mesh->need_update;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -93,7 +93,7 @@ bool BlenderSync::object_use_particles(BL::Object b_ob)
|
||||
}
|
||||
}
|
||||
|
||||
return use_particles;
|
||||
return need_update;
|
||||
}
|
||||
|
||||
static bool use_particle_system(BL::ParticleSystem b_psys)
|
||||
|
@ -92,7 +92,7 @@ private:
|
||||
bool BKE_object_is_modified(BL::Object b_ob);
|
||||
bool object_is_mesh(BL::Object b_ob);
|
||||
bool object_is_light(BL::Object b_ob);
|
||||
bool object_use_particles(BL::Object b_ob);
|
||||
bool object_need_particle_update(BL::Object b_ob);
|
||||
int object_count_particles(BL::Object b_ob);
|
||||
|
||||
/* variables */
|
||||
|
Loading…
Reference in New Issue
Block a user