Particle: Add option to duplicate settings together with particle system itself
This way it's possible to copy combed hair, use it as a basis for another particle system to do some awesome artistic stuff.
This commit is contained in:
parent
c61cb0e076
commit
1925b9b2fa
@ -993,7 +993,13 @@ static void remove_particle_systems_from_object(Object *ob_to)
|
||||
}
|
||||
|
||||
/* single_psys_from is optional, if NULL all psys of ob_from are copied */
|
||||
static bool copy_particle_systems_to_object(Scene *scene, Object *ob_from, ParticleSystem *single_psys_from, Object *ob_to, int space)
|
||||
static bool copy_particle_systems_to_object(Main *bmain,
|
||||
Scene *scene,
|
||||
Object *ob_from,
|
||||
ParticleSystem *single_psys_from,
|
||||
Object *ob_to,
|
||||
int space,
|
||||
bool duplicate_settings)
|
||||
{
|
||||
ModifierData *md;
|
||||
ParticleSystem *psys_start = NULL, *psys, *psys_from;
|
||||
@ -1070,6 +1076,11 @@ static bool copy_particle_systems_to_object(Scene *scene, Object *ob_from, Parti
|
||||
|
||||
if (psys_from->edit)
|
||||
copy_particle_edit(scene, ob_to, psys, psys_from);
|
||||
|
||||
if (duplicate_settings) {
|
||||
id_us_min(psys->part);
|
||||
psys->part = BKE_particlesettings_copy(bmain, psys->part);
|
||||
}
|
||||
}
|
||||
MEM_freeN(tmp_psys);
|
||||
|
||||
@ -1131,6 +1142,7 @@ static int copy_particle_systems_exec(bContext *C, wmOperator *op)
|
||||
const int space = RNA_enum_get(op->ptr, "space");
|
||||
const bool remove_target_particles = RNA_boolean_get(op->ptr, "remove_target_particles");
|
||||
const bool use_active = RNA_boolean_get(op->ptr, "use_active");
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob_from = ED_object_active_context(C);
|
||||
ParticleSystem *psys_from = use_active ? CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem).data : NULL;
|
||||
@ -1146,7 +1158,7 @@ static int copy_particle_systems_exec(bContext *C, wmOperator *op)
|
||||
remove_particle_systems_from_object(ob_to);
|
||||
changed = true;
|
||||
}
|
||||
if (copy_particle_systems_to_object(scene, ob_from, psys_from, ob_to, space))
|
||||
if (copy_particle_systems_to_object(bmain, scene, ob_from, psys_from, ob_to, space, false))
|
||||
changed = true;
|
||||
else
|
||||
fail++;
|
||||
@ -1201,12 +1213,14 @@ static int duplicate_particle_systems_poll(bContext *C)
|
||||
return true;
|
||||
}
|
||||
|
||||
static int duplicate_particle_systems_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
static int duplicate_particle_systems_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
const bool duplicate_settings = RNA_boolean_get(op->ptr, "use_duplicate_settings");
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
ParticleSystem *psys = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem).data;
|
||||
copy_particle_systems_to_object(scene, ob, psys, ob, PAR_COPY_SPACE_OBJECT);
|
||||
copy_particle_systems_to_object(CTX_data_main(C), scene, ob, psys, ob,
|
||||
PAR_COPY_SPACE_OBJECT, duplicate_settings);
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
@ -1221,4 +1235,7 @@ void PARTICLE_OT_duplicate_particle_system(wmOperatorType *ot)
|
||||
|
||||
/* flags */
|
||||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||
|
||||
RNA_def_boolean(ot->srna, "use_duplicate_settings", false, "Duplicate Settings",
|
||||
"Duplicate settings as well, so new particle system uses own settings");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user