Fix for particle object rendering in Cycles. On object sync the object first has...
authorLukas Toenne <lukas.toenne@googlemail.com>
Fri, 10 Aug 2012 10:15:45 +0000 (10:15 +0000)
committerLukas Toenne <lukas.toenne@googlemail.com>
Fri, 10 Aug 2012 10:15:45 +0000 (10:15 +0000)
intern/cycles/blender/blender_object.cpp
intern/cycles/blender/blender_particles.cpp
intern/cycles/blender/blender_sync.h

index 242f7c8ecefb3ecd0838d28a4fb830a0b62551aa..eb9cc7bc4de34caaee44acd92ec4cfd220063879 100644 (file)
@@ -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);
index d669aa34a68621dce99304bf2582c589fcd8c4b1..e32c80a51b5e17b867aa3d47ebae4fcfc2117a36 100644 (file)
@@ -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)
index 1a6c04db10c184f9c09c8658ce006cca1a67d012..6065235a278ba31e65b0dd98fe65e74b0e89a744 100644 (file)
@@ -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 */