diff --git a/release/scripts/ui/buttons_particle.py b/release/scripts/ui/buttons_particle.py index b0be974727a..dcc93bd9c75 100644 --- a/release/scripts/ui/buttons_particle.py +++ b/release/scripts/ui/buttons_particle.py @@ -650,6 +650,8 @@ class PARTICLE_PT_render(ParticleButtonsPanel): col = row.column() subrow = col.row() subcol = subrow.column(align=True) + subcol.itemO("particle.dupliob_copy", icon='ICON_ZOOMIN', text="") + subcol.itemO("particle.dupliob_remove", icon='ICON_ZOOMOUT', text="") subcol.itemO("particle.dupliob_move_up", icon='VICON_MOVE_UP', text="") subcol.itemO("particle.dupliob_move_down", icon='VICON_MOVE_DOWN', text="") diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c index 1dc08a162b7..34e2b062e98 100644 --- a/source/blender/editors/physics/particle_object.c +++ b/source/blender/editors/physics/particle_object.c @@ -386,6 +386,90 @@ void PARTICLE_OT_dupliob_move_up(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } +/********************** particle dupliweight operators *********************/ + +static int copy_particle_dupliob_exec(bContext *C, wmOperator *op) +{ + PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem); + ParticleSystem *psys= ptr.data; + ParticleSettings *part; + ParticleDupliWeight *dw; + + if(!psys) + return OPERATOR_CANCELLED; + part = psys->part; + for(dw=part->dupliweights.first; dw; dw=dw->next) { + if(dw->flag & PART_DUPLIW_CURRENT) { + dw->flag &= ~PART_DUPLIW_CURRENT; + dw = MEM_dupallocN(dw); + dw->flag |= PART_DUPLIW_CURRENT; + BLI_addhead(&part->dupliweights, dw); + + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, NULL); + break; + } + } + + return OPERATOR_FINISHED; +} + +void PARTICLE_OT_dupliob_copy(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Copy Particle Dupliob"; + ot->idname= "PARTICLE_OT_dupliob_copy"; + ot->description="Duplicate the current dupliobject."; + + /* api callbacks */ + ot->exec= copy_particle_dupliob_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int remove_particle_dupliob_exec(bContext *C, wmOperator *op) +{ + PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem); + ParticleSystem *psys= ptr.data; + ParticleSettings *part; + ParticleDupliWeight *dw; + + if(!psys) + return OPERATOR_CANCELLED; + + part = psys->part; + for(dw=part->dupliweights.first; dw; dw=dw->next) { + if(dw->flag & PART_DUPLIW_CURRENT) { + BLI_remlink(&part->dupliweights, dw); + MEM_freeN(dw); + break; + } + + } + dw = part->dupliweights.last; + + if(dw) + dw->flag |= PART_DUPLIW_CURRENT; + + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, NULL); + + return OPERATOR_FINISHED; +} + +void PARTICLE_OT_dupliob_remove(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Remove Particle Dupliobject"; + ot->idname= "PARTICLE_OT_dupliob_remove"; + ot->description="Remove the selected dupliobject."; + + /* api callbacks */ + ot->exec= remove_particle_dupliob_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + /************************ move down particle dupliweight operator *********************/ static int dupliob_move_down_exec(bContext *C, wmOperator *op) diff --git a/source/blender/editors/physics/physics_intern.h b/source/blender/editors/physics/physics_intern.h index 3847ec8032a..a930d8663dd 100644 --- a/source/blender/editors/physics/physics_intern.h +++ b/source/blender/editors/physics/physics_intern.h @@ -77,6 +77,8 @@ void PARTICLE_OT_target_move_down(struct wmOperatorType *ot); void PARTICLE_OT_connect_hair(struct wmOperatorType *ot); void PARTICLE_OT_disconnect_hair(struct wmOperatorType *ot); +void PARTICLE_OT_dupliob_copy(struct wmOperatorType *ot); +void PARTICLE_OT_dupliob_remove(struct wmOperatorType *ot); void PARTICLE_OT_dupliob_move_up(struct wmOperatorType *ot); void PARTICLE_OT_dupliob_move_down(struct wmOperatorType *ot); diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c index 0ebbfa6b701..ee46279d567 100644 --- a/source/blender/editors/physics/physics_ops.c +++ b/source/blender/editors/physics/physics_ops.c @@ -79,6 +79,8 @@ static void operatortypes_particle(void) WM_operatortype_append(PARTICLE_OT_connect_hair); WM_operatortype_append(PARTICLE_OT_disconnect_hair); + WM_operatortype_append(PARTICLE_OT_dupliob_copy); + WM_operatortype_append(PARTICLE_OT_dupliob_remove); WM_operatortype_append(PARTICLE_OT_dupliob_move_up); WM_operatortype_append(PARTICLE_OT_dupliob_move_down); }