diff options
Diffstat (limited to 'source/blender/editors/object/object_select.c')
-rw-r--r-- | source/blender/editors/object/object_select.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 7db32957b42..f1b7186f8a1 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -37,7 +37,6 @@ #include "DNA_group_types.h" #include "DNA_material_types.h" #include "DNA_modifier_types.h" -#include "DNA_object_types.h" #include "DNA_property_types.h" #include "DNA_scene_types.h" #include "DNA_armature_types.h" @@ -54,6 +53,7 @@ #include "BKE_group.h" #include "BKE_main.h" #include "BKE_material.h" +#include "BKE_particle.h" #include "BKE_property.h" #include "BKE_report.h" #include "BKE_scene.h" @@ -192,6 +192,7 @@ enum { OBJECT_SELECT_LINKED_MATERIAL, OBJECT_SELECT_LINKED_TEXTURE, OBJECT_SELECT_LINKED_DUPGROUP, + OBJECT_SELECT_LINKED_PARTICLE, OBJECT_SELECT_LINKED_LIBRARY, OBJECT_SELECT_LINKED_LIBRARY_OBDATA }; @@ -202,6 +203,7 @@ static EnumPropertyItem prop_select_linked_types[] = { {OBJECT_SELECT_LINKED_MATERIAL, "MATERIAL", 0, "Material", ""}, {OBJECT_SELECT_LINKED_TEXTURE, "TEXTURE", 0, "Texture", ""}, {OBJECT_SELECT_LINKED_DUPGROUP, "DUPGROUP", 0, "Dupligroup", ""}, + {OBJECT_SELECT_LINKED_PARTICLE, "PARTICLE", 0, "Particle System", ""}, {OBJECT_SELECT_LINKED_LIBRARY, "LIBRARY", 0, "Library", ""}, {OBJECT_SELECT_LINKED_LIBRARY_OBDATA, "LIBRARY_OBDATA", 0, "Library (Object Data)", ""}, {0, NULL, 0, NULL, NULL} @@ -311,6 +313,37 @@ static bool object_select_all_by_dup_group(bContext *C, Object *ob) return changed; } +static bool object_select_all_by_particle(bContext *C, Object *ob) +{ + ParticleSystem *psys_act = psys_get_current(ob); + bool changed = false; + + CTX_DATA_BEGIN (C, Base *, base, visible_bases) + { + if ((base->flag & SELECT) == 0) { + /* loop through other particles*/ + ParticleSystem *psys; + + for (psys = base->object->particlesystem.first; psys; psys = psys->next) { + if (psys->part == psys_act->part) { + base->flag |= SELECT; + changed = true; + break; + } + + if (base->flag & SELECT) { + break; + } + } + + base->object->flag = base->flag; + } + } + CTX_DATA_END; + + return changed; +} + static bool object_select_all_by_library(bContext *C, Library *lib) { bool changed = false; @@ -428,6 +461,12 @@ static int object_select_linked_exec(bContext *C, wmOperator *op) changed = object_select_all_by_dup_group(C, ob); } + else if (nr == OBJECT_SELECT_LINKED_PARTICLE) { + if (BLI_listbase_is_empty(&ob->particlesystem)) + return OPERATOR_CANCELLED; + + changed = object_select_all_by_particle(C, ob); + } else if (nr == OBJECT_SELECT_LINKED_LIBRARY) { /* do nothing */ changed = object_select_all_by_library(C, ob->id.lib); |