Commit: 74f557982df88c0318c8809e22ffce83696be58c
Author: Bastien Montagne
Date:   Thu Oct 8 14:56:20 2015 +0200
Branches: master
https://developer.blender.org/rB74f557982df88c0318c8809e22ffce83696be58c

Add id looper for particlesystem.

===================================================================

M       source/blender/blenkernel/BKE_particle.h
M       source/blender/blenkernel/intern/library_query.c
M       source/blender/blenkernel/intern/particle_system.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_particle.h 
b/source/blender/blenkernel/BKE_particle.h
index 89cfb3a..00cc48c 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -378,6 +378,11 @@ void psys_get_birth_coords(struct ParticleSimulationData 
*sim, struct ParticleDa
 
 void particle_system_update(struct Scene *scene, struct Object *ob, struct 
ParticleSystem *psys);
 
+/* Callback format for performing operations on ID-pointers for particle 
systems */
+typedef void (*ParticleSystemIDFunc)(struct ParticleSystem *psys, struct ID 
**idpoin, void *userdata, int cd_flag);
+
+void BKE_particlesystem_id_loop(struct ParticleSystem *psys, 
ParticleSystemIDFunc func, void *userdata);
+
 /* ----------- functions needed only inside particlesystem ------------ */
 /* particle.c */
 void psys_disable_all(struct Object *ob);
diff --git a/source/blender/blenkernel/intern/library_query.c 
b/source/blender/blenkernel/intern/library_query.c
index e7d96ba..0d30fd7 100644
--- a/source/blender/blenkernel/intern/library_query.c
+++ b/source/blender/blenkernel/intern/library_query.c
@@ -117,6 +117,13 @@ static void 
library_foreach_constraintObjectLooper(bConstraint *UNUSED(con), ID
        FOREACH_CALLBACK_INVOKE_ID_PP(data->self_id, id_pointer, data->flag, 
data->callback, data->user_data, IDWALK_NOP);
 }
 
+static void library_foreach_particlesystemsObjectLooper(
+        ParticleSystem *UNUSED(psys), ID **id_pointer, void *user_data, int 
cd_flag)
+{
+       LibraryForeachIDData *data = (LibraryForeachIDData *) user_data;
+       FOREACH_CALLBACK_INVOKE_ID_PP(data->self_id, id_pointer, data->flag, 
data->callback, data->user_data, cd_flag);
+}
+
 static void library_foreach_animationData(LibraryForeachIDData *data, AnimData 
*adt)
 {
        FCurve *fcu;
@@ -265,6 +272,7 @@ void BKE_library_foreach_ID_link(ID *id, 
LibraryIDLinkCallback callback, void *u
                case ID_OB:
                {
                        Object *object = (Object *) id;
+                       ParticleSystem *psys;
 
                        /* object data special case */
                        if (object->type == OB_EMPTY) {
@@ -326,6 +334,10 @@ void BKE_library_foreach_ID_link(ID *id, 
LibraryIDLinkCallback callback, void *u
 
                        modifiers_foreachIDLink(object, 
library_foreach_modifiersForeachIDLink, &data);
                        BKE_constraints_id_loop(&object->constraints, 
library_foreach_constraintObjectLooper, &data);
+
+                       for (psys = object->particlesystem.first; psys; psys = 
psys->next) {
+                               BKE_particlesystem_id_loop(psys, 
library_foreach_particlesystemsObjectLooper, &data);
+                       }
                        break;
                }
 
diff --git a/source/blender/blenkernel/intern/particle_system.c 
b/source/blender/blenkernel/intern/particle_system.c
index 9c72012..a59a0b7 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -77,6 +77,7 @@
 #include "BKE_cdderivedmesh.h"
 #include "BKE_collision.h"
 #include "BKE_effect.h"
+#include "BKE_library_query.h"
 #include "BKE_particle.h"
 #include "BKE_global.h"
 
@@ -4209,6 +4210,30 @@ void particle_system_update(Scene *scene, Object *ob, 
ParticleSystem *psys)
                invert_m4_m4(psys->imat, ob->obmat);
 }
 
+/* ID looper */
+
+void BKE_particlesystem_id_loop(ParticleSystem *psys, ParticleSystemIDFunc 
func, void *userdata)
+{
+       ParticleTarget *pt;
+
+       func(psys, (ID **)&psys->part, userdata, IDWALK_NOP);
+       func(psys, (ID **)&psys->target_ob, userdata, IDWALK_NOP);
+       func(psys, (ID **)&psys->parent, userdata, IDWALK_NOP);
+
+       for (pt = psys->targets.first; pt; pt = pt->next) {
+               func(psys, (ID **)&pt->ob, userdata, IDWALK_NOP);
+       }
+
+       if (psys->part->phystype == PART_PHYS_BOIDS) {
+               ParticleData *pa;
+               int p;
+
+               for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++) 
{
+                       func(psys, (ID **)&pa->boid->ground, userdata, 
IDWALK_NOP);
+               }
+       }
+}
+
 /* **** Depsgraph evaluation **** */
 
 void BKE_particle_system_eval(EvaluationContext *UNUSED(eval_ctx),

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to