Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Tönne <lukas.toenne@gmail.com>2015-01-15 14:35:19 +0300
committerLukas Tönne <lukas.toenne@gmail.com>2015-01-20 11:30:11 +0300
commit2a3279bb874a1d30df602a3269aea35fa610cdfb (patch)
tree593996be1e28ffe704ce606eebcf15c9d531c2da /source/blender/editors/physics
parent91b70d3c56cb863b9c6184a726b35d32e5f4480c (diff)
Changed the workflow for the particle system copy operator to the common
active-to-selected pattern.
Diffstat (limited to 'source/blender/editors/physics')
-rw-r--r--source/blender/editors/physics/particle_object.c99
1 files changed, 48 insertions, 51 deletions
diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c
index 37ee7088db9..33bf2b815f9 100644
--- a/source/blender/editors/physics/particle_object.c
+++ b/source/blender/editors/physics/particle_object.c
@@ -876,45 +876,6 @@ void PARTICLE_OT_connect_hair(wmOperatorType *ot)
/************************ particle system copy operator *********************/
-static bool find_object_pair(bContext *C, ReportList *reports, Object **r_ob_to, Object **r_ob_from)
-{
- ListBase selected;
- CollectionPointerLink *link;
- Object *ob_from, *ob_to;
-
- ob_to = CTX_data_active_object(C);
- if (!ob_to) {
- BKE_report(reports, RPT_ERROR, "No active object");
- return false;
- }
-
- ob_from = NULL;
- CTX_data_selected_objects(C, &selected);
- for (link = selected.first; link; link = link->next) {
- Object *ob = link->ptr.data;
- if (ob != ob_to) {
- if (ob_from)
- break; /* indicates multiple selected objects */
- else
- ob_from = ob;
- }
- }
- BLI_freelistN(&selected);
-
- if (!ob_from) {
- BKE_report(reports, RPT_ERROR, "No non-active selected object");
- return false;
- }
- else if (link) {
- BKE_report(reports, RPT_ERROR, "Multiple non-active selected objects");
- return false;
- }
-
- *r_ob_to = ob_to;
- *r_ob_from = ob_from;
- return true;
-}
-
static void copy_particle_edit(Scene *scene, Object *ob, ParticleSystem *psys, ParticleSystem *psys_from)
{
PTCacheEdit *edit_from = psys_from->edit, *edit;
@@ -971,22 +932,17 @@ static void copy_particle_edit(Scene *scene, Object *ob, ParticleSystem *psys, P
PE_undo_push(scene, "Original");
}
-static int copy_particle_systems_exec(bContext *C, wmOperator *op)
+static bool copy_particle_systems_to_object(Scene *scene, Object *ob_from, Object *ob_to)
{
- Scene *scene = CTX_data_scene(C);
- Object *ob_from, *ob_to;
- ParticleSystem *psys, *psys_from;
ModifierData *md, *md_next;
+ ParticleSystem *psys, *psys_from;
DerivedMesh *final_dm;
int i;
- if (!find_object_pair(C, op->reports, &ob_to, &ob_from))
- return OPERATOR_CANCELLED;
-
- if (BLI_listbase_is_empty(&ob_from->particlesystem)) {
- BKE_reportf(op->reports, RPT_ERROR, "Object %200s has no particle systems", ob_from->id.name+2);
- return OPERATOR_CANCELLED;
- }
+ if (ob_to->type != OB_MESH)
+ return false;
+ if (!ob_to->data || ((ID *)ob_to->data)->lib)
+ return false;
/* XXX in theory it could be nice to not delete existing particle systems,
* but the current code for copying assumes that the target object list is empty ...
@@ -1044,6 +1000,46 @@ static int copy_particle_systems_exec(bContext *C, wmOperator *op)
DAG_id_tag_update(&ob_to->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT | ND_PARTICLE | NA_EDITED, ob_to);
+ return true;
+}
+
+static int copy_particle_systems_poll(bContext *C)
+{
+ Object *ob;
+ if (!ED_operator_object_active_editable(C))
+ return false;
+
+ ob = ED_object_active_context(C);
+ if (BLI_listbase_is_empty(&ob->particlesystem))
+ return false;
+
+ return true;
+}
+
+static int copy_particle_systems_exec(bContext *C, wmOperator *op)
+{
+ Object *ob_from = ED_object_active_context(C);
+ Scene *scene = CTX_data_scene(C);
+
+ int changed_tot = 0;
+ int fail = 0;
+
+ CTX_DATA_BEGIN (C, Object *, ob_to, selected_editable_objects)
+ {
+ if (ob_from != ob_to) {
+ if (copy_particle_systems_to_object(scene, ob_from, ob_to))
+ changed_tot++;
+ else
+ fail++;
+ }
+ }
+ CTX_DATA_END;
+
+ if ((changed_tot == 0 && fail == 0) || fail) {
+ BKE_reportf(op->reports, RPT_ERROR,
+ "Copy particle systems to selected: %d done, %d failed",
+ changed_tot, fail);
+ }
return OPERATOR_FINISHED;
}
@@ -1051,9 +1047,10 @@ static int copy_particle_systems_exec(bContext *C, wmOperator *op)
void PARTICLE_OT_copy_particle_systems(wmOperatorType *ot)
{
ot->name = "Copy Particle Systems";
- ot->description = "Copy particle systems to the active object";
+ ot->description = "Copy particle systems from the active object to selected objects";
ot->idname = "PARTICLE_OT_copy_particle_systems";
+ ot->poll = copy_particle_systems_poll;
ot->exec = copy_particle_systems_exec;
/* flags */