From 4f0f0d1bcede8f307c4601a7e94b36c179d4d5a8 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 8 Oct 2015 14:59:24 +0200 Subject: Add rigidbodyworld to id looper. --- source/blender/blenkernel/BKE_rigidbody.h | 5 +++++ source/blender/blenkernel/intern/library_query.c | 12 ++++++++++++ source/blender/blenkernel/intern/rigidbody.c | 15 +++++++++++++++ 3 files changed, 32 insertions(+) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h index a30ce6cda79..272abc42899 100644 --- a/source/blender/blenkernel/BKE_rigidbody.h +++ b/source/blender/blenkernel/BKE_rigidbody.h @@ -53,6 +53,11 @@ struct RigidBodyOb *BKE_rigidbody_copy_object(struct Object *ob); struct RigidBodyCon *BKE_rigidbody_copy_constraint(struct Object *ob); void BKE_rigidbody_relink_constraint(struct RigidBodyCon *rbc); +/* Callback format for performing operations on ID-pointers for rigidbody world. */ +typedef void (*RigidbodyWorldIDFunc)(struct RigidBodyWorld *rbw, struct ID **idpoin, void *userdata, int cd_flag); + +void BKE_rigidbody_world_id_loop(struct RigidBodyWorld *rbw, RigidbodyWorldIDFunc func, void *userdata); + /* -------------- */ /* Setup */ diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c index 0d30fd70fa6..a1b84324496 100644 --- a/source/blender/blenkernel/intern/library_query.c +++ b/source/blender/blenkernel/intern/library_query.c @@ -66,6 +66,7 @@ #include "BKE_library_query.h" #include "BKE_modifier.h" #include "BKE_particle.h" +#include "BKE_rigidbody.h" #include "BKE_sequencer.h" #include "BKE_tracking.h" @@ -103,6 +104,13 @@ typedef struct LibraryForeachIDData { void *user_data; } LibraryForeachIDData; +static void library_foreach_rigidbodyworldSceneLooper( + struct RigidBodyWorld *UNUSED(rbw), 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_modifiersForeachIDLink( void *user_data, Object *UNUSED(object), ID **id_pointer, int cd_flag) { @@ -266,6 +274,10 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u } } + if (scene->rigidbody_world) { + BKE_rigidbody_world_id_loop(scene->rigidbody_world, library_foreach_rigidbodyworldSceneLooper, &data); + } + break; } diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 476b9a22238..43634c5045c 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -58,6 +58,7 @@ #include "BKE_effect.h" #include "BKE_global.h" #include "BKE_library.h" +#include "BKE_library_query.h" #include "BKE_mesh.h" #include "BKE_object.h" #include "BKE_pointcache.h" @@ -957,6 +958,20 @@ void BKE_rigidbody_world_groups_relink(RigidBodyWorld *rbw) rbw->effector_weights->group = (Group *)rbw->effector_weights->group->id.newid; } +void BKE_rigidbody_world_id_loop(RigidBodyWorld *rbw, RigidbodyWorldIDFunc func, void *userdata) +{ + func(rbw, (ID **)&rbw->group, userdata, IDWALK_NOP); + func(rbw, (ID **)&rbw->constraints, userdata, IDWALK_NOP); + func(rbw, (ID **)&rbw->effector_weights->group, userdata, IDWALK_NOP); + + if (rbw->objects) { + int i; + for (i = 0; i < rbw->numbodies; i++) { + func(rbw, (ID **)&rbw->objects[i], userdata, IDWALK_NOP); + } + } +} + /* Add rigid body settings to the specified object */ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type) { -- cgit v1.2.3