diff options
Diffstat (limited to 'source/blender/editors/physics/particle_object.c')
-rw-r--r-- | source/blender/editors/physics/particle_object.c | 192 |
1 files changed, 96 insertions, 96 deletions
diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c index c4bcb6a8469..8a363276c28 100644 --- a/source/blender/editors/physics/particle_object.c +++ b/source/blender/editors/physics/particle_object.c @@ -84,10 +84,10 @@ static int particle_system_add_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_CANCELLED; object_add_particle_system(scene, ob, NULL); - + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, ob); - + return OPERATOR_FINISHED; } @@ -97,11 +97,11 @@ void OBJECT_OT_particle_system_add(wmOperatorType *ot) ot->name = "Add Particle System Slot"; ot->idname = "OBJECT_OT_particle_system_add"; ot->description = "Add a particle system"; - + /* api callbacks */ ot->poll = ED_operator_object_active_editable; ot->exec = particle_system_add_exec; - + /* flags */ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; } @@ -131,7 +131,7 @@ static int particle_system_remove_exec(bContext *C, wmOperator *UNUSED(op)) WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, ob); - + return OPERATOR_FINISHED; } @@ -141,7 +141,7 @@ void OBJECT_OT_particle_system_remove(wmOperatorType *ot) ot->name = "Remove Particle System Slot"; ot->idname = "OBJECT_OT_particle_system_remove"; ot->description = "Remove the selected particle system"; - + /* api callbacks */ ot->poll = ED_operator_object_active_editable; ot->exec = particle_system_remove_exec; @@ -189,7 +189,7 @@ static int new_particle_settings_exec(bContext *C, wmOperator *UNUSED(op)) DAG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); - + return OPERATOR_FINISHED; } @@ -199,7 +199,7 @@ void PARTICLE_OT_new(wmOperatorType *ot) ot->name = "New Particle Settings"; ot->idname = "PARTICLE_OT_new"; ot->description = "Add new particle settings"; - + /* api callbacks */ ot->exec = new_particle_settings_exec; ot->poll = psys_poll; @@ -237,7 +237,7 @@ static int new_particle_target_exec(bContext *C, wmOperator *UNUSED(op)) DAG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); - + return OPERATOR_FINISHED; } @@ -247,7 +247,7 @@ void PARTICLE_OT_new_target(wmOperatorType *ot) ot->name = "New Particle Target"; ot->idname = "PARTICLE_OT_new_target"; ot->description = "Add a new particle target"; - + /* api callbacks */ ot->exec = new_particle_target_exec; @@ -285,7 +285,7 @@ static int remove_particle_target_exec(bContext *C, wmOperator *UNUSED(op)) DAG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); - + return OPERATOR_FINISHED; } @@ -295,7 +295,7 @@ void PARTICLE_OT_target_remove(wmOperatorType *ot) ot->name = "Remove Particle Target"; ot->idname = "PARTICLE_OT_target_remove"; ot->description = "Remove the selected particle target"; - + /* api callbacks */ ot->exec = remove_particle_target_exec; @@ -314,7 +314,7 @@ static int target_move_up_exec(bContext *C, wmOperator *UNUSED(op)) if (!psys) return OPERATOR_CANCELLED; - + pt = psys->targets.first; for (; pt; pt=pt->next) { if (pt->flag & PTARGET_CURRENT && pt->prev) { @@ -326,7 +326,7 @@ static int target_move_up_exec(bContext *C, wmOperator *UNUSED(op)) break; } } - + return OPERATOR_FINISHED; } @@ -335,9 +335,9 @@ void PARTICLE_OT_target_move_up(wmOperatorType *ot) ot->name = "Move Up Target"; ot->idname = "PARTICLE_OT_target_move_up"; ot->description = "Move particle target up in the list"; - + ot->exec = target_move_up_exec; - + /* flags */ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; } @@ -364,7 +364,7 @@ static int target_move_down_exec(bContext *C, wmOperator *UNUSED(op)) break; } } - + return OPERATOR_FINISHED; } @@ -373,9 +373,9 @@ void PARTICLE_OT_target_move_down(wmOperatorType *ot) ot->name = "Move Down Target"; ot->idname = "PARTICLE_OT_target_move_down"; ot->description = "Move particle target down in the list"; - + ot->exec = target_move_down_exec; - + /* flags */ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; } @@ -402,7 +402,7 @@ static int dupliob_move_up_exec(bContext *C, wmOperator *UNUSED(op)) break; } } - + return OPERATOR_FINISHED; } @@ -411,9 +411,9 @@ void PARTICLE_OT_dupliob_move_up(wmOperatorType *ot) ot->name = "Move Up Dupli Object"; ot->idname = "PARTICLE_OT_dupliob_move_up"; ot->description = "Move dupli object up in the list"; - + ot->exec = dupliob_move_up_exec; - + /* flags */ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; } @@ -441,7 +441,7 @@ static int copy_particle_dupliob_exec(bContext *C, wmOperator *UNUSED(op)) break; } } - + return OPERATOR_FINISHED; } @@ -451,7 +451,7 @@ void PARTICLE_OT_dupliob_copy(wmOperatorType *ot) 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; @@ -484,7 +484,7 @@ static int remove_particle_dupliob_exec(bContext *C, wmOperator *UNUSED(op)) dw->flag |= PART_DUPLIW_CURRENT; WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, NULL); - + return OPERATOR_FINISHED; } @@ -494,7 +494,7 @@ void PARTICLE_OT_dupliob_remove(wmOperatorType *ot) 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; @@ -524,7 +524,7 @@ static int dupliob_move_down_exec(bContext *C, wmOperator *UNUSED(op)) break; } } - + return OPERATOR_FINISHED; } @@ -533,9 +533,9 @@ void PARTICLE_OT_dupliob_move_down(wmOperatorType *ot) ot->name = "Move Down Dupli Object"; ot->idname = "PARTICLE_OT_dupliob_move_down"; ot->description = "Move dupli object down in the list"; - + ot->exec = dupliob_move_down_exec; - + /* flags */ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; } @@ -559,7 +559,7 @@ static void disconnect_hair(Scene *scene, Object *ob, ParticleSystem *psys) if (!psys->part || psys->part->type != PART_HAIR) return; - + edit = psys->edit; point= edit ? edit->points : NULL; @@ -573,7 +573,7 @@ static void disconnect_hair(Scene *scene, Object *ob, ParticleSystem *psys) for (k=0, key=pa->hair; k<pa->totkey; k++, key++) { mul_m4_v3(hairmat, key->co); - + if (ekey) { ekey->flag &= ~PEK_USE_WCO; ekey++; @@ -622,9 +622,9 @@ void PARTICLE_OT_disconnect_hair(wmOperatorType *ot) ot->name = "Disconnect Hair"; ot->description = "Disconnect hair from the emitter mesh"; ot->idname = "PARTICLE_OT_disconnect_hair"; - + ot->exec = disconnect_hair_exec; - + /* flags */ ot->flag = OPTYPE_UNDO; /* No REGISTER, redo does not work due to missing update, see T47750. */ @@ -658,14 +658,14 @@ static bool remap_hair_emitter(Scene *scene, Object *ob, ParticleSystem *psys, return false; if (!target_psys->part || target_psys->part->type != PART_HAIR) return false; - + edit_point = target_edit ? target_edit->points : NULL; - + invert_m4_m4(from_ob_imat, ob->obmat); invert_m4_m4(to_ob_imat, target_ob->obmat); invert_m4_m4(from_imat, from_mat); invert_m4_m4(to_imat, to_mat); - + if (target_psmd->dm_final->deformedOnly) { /* we don't want to mess up target_psmd->dm when converting to global coordinates below */ dm = target_psmd->dm_final; @@ -729,7 +729,7 @@ static bool remap_hair_emitter(Scene *scene, Object *ob, ParticleSystem *psys, if (mface) { float v[4][3]; - + mf = &mface[nearest.index]; copy_v3_v3(v[0], mvert[mf->v1].co); @@ -765,7 +765,7 @@ static bool remap_hair_emitter(Scene *scene, Object *ob, ParticleSystem *psys, HairKey *key, *tkey; float hairmat[4][4], imat[4][4]; float offset[3]; - + if (to_global) copy_m4_m4(imat, target_ob->obmat); else { @@ -774,41 +774,41 @@ static bool remap_hair_emitter(Scene *scene, Object *ob, ParticleSystem *psys, invert_m4_m4(imat, hairmat); } mul_m4_m4m4(imat, imat, to_imat); - + /* offset in world space */ sub_v3_v3v3(offset, nearest.co, from_co); - + if (edit_point) { for (k=0, key=pa->hair, tkey=tpa->hair, ekey = edit_point->keys; k<tpa->totkey; k++, key++, tkey++, ekey++) { float co_orig[3]; - + if (from_global) mul_v3_m4v3(co_orig, from_ob_imat, key->co); else mul_v3_m4v3(co_orig, from_ob_imat, key->world_co); mul_m4_v3(from_mat, co_orig); - + add_v3_v3v3(tkey->co, co_orig, offset); - + mul_m4_v3(imat, tkey->co); - + ekey->flag |= PEK_USE_WCO; } - + edit_point++; } else { for (k=0, key=pa->hair, tkey=tpa->hair; k<tpa->totkey; k++, key++, tkey++) { float co_orig[3]; - + if (from_global) mul_v3_m4v3(co_orig, from_ob_imat, key->co); else mul_v3_m4v3(co_orig, from_ob_imat, key->world_co); mul_m4_v3(from_mat, co_orig); - + add_v3_v3v3(tkey->co, co_orig, offset); - + mul_m4_v3(imat, tkey->co); } } @@ -828,13 +828,13 @@ static bool remap_hair_emitter(Scene *scene, Object *ob, ParticleSystem *psys, static bool connect_hair(Scene *scene, Object *ob, ParticleSystem *psys) { bool ok; - + if (!psys) return false; - + ok = remap_hair_emitter(scene, ob, psys, ob, psys, psys->edit, ob->obmat, ob->obmat, psys->flag & PSYS_GLOBAL_HAIR, false); psys->flag &= ~PSYS_GLOBAL_HAIR; - + return ok; } @@ -876,9 +876,9 @@ void PARTICLE_OT_connect_hair(wmOperatorType *ot) ot->name = "Connect Hair"; ot->description = "Connect hair to the emitter mesh"; ot->idname = "PARTICLE_OT_connect_hair"; - + ot->exec = connect_hair_exec; - + /* flags */ ot->flag = OPTYPE_UNDO; /* No REGISTER, redo does not work due to missing update, see T47750. */ @@ -898,17 +898,17 @@ static void copy_particle_edit(Scene *scene, Object *ob, ParticleSystem *psys, P ParticleData *pa; KEY_K; POINT_P; - + if (!edit_from) return; - + edit = MEM_dupallocN(edit_from); edit->psys = psys; psys->edit = edit; - + edit->pathcache = NULL; BLI_listbase_clear(&edit->pathcachebufs); - + edit->emitter_field = NULL; edit->emitter_cosnos = NULL; @@ -916,7 +916,7 @@ static void copy_particle_edit(Scene *scene, Object *ob, ParticleSystem *psys, P pa = psys->particles; LOOP_POINTS { HairKey *hkey = pa->hair; - + point->keys= MEM_dupallocN(point->keys); LOOP_KEYS { key->co = hkey->co; @@ -926,17 +926,17 @@ static void copy_particle_edit(Scene *scene, Object *ob, ParticleSystem *psys, P key->flag |= PEK_USE_WCO; hkey->editflag |= PEK_USE_WCO; } - + hkey++; } - + pa++; } update_world_cos(ob, edit); - + UI_GetThemeColor3ubv(TH_EDGE_SELECT, edit->sel_col); UI_GetThemeColor3ubv(TH_WIRE, edit->nosel_col); - + recalc_lengths(edit); recalc_emitter_field(ob, psys); PE_update_object(scene, ob, true); @@ -945,15 +945,15 @@ static void copy_particle_edit(Scene *scene, Object *ob, ParticleSystem *psys, P static void remove_particle_systems_from_object(Object *ob_to) { ModifierData *md, *md_next; - + if (ob_to->type != OB_MESH) return; if (!ob_to->data || ID_IS_LINKED(ob_to->data)) return; - + for (md = ob_to->modifiers.first; md; md = md_next) { md_next = md->next; - + /* remove all particle system modifiers as well, * these need to sync to the particle system list */ @@ -962,7 +962,7 @@ static void remove_particle_systems_from_object(Object *ob_to) modifier_free(md); } } - + BKE_object_free_particlesystems(ob_to); } @@ -981,12 +981,12 @@ static bool copy_particle_systems_to_object(Main *bmain, DerivedMesh *final_dm; CustomDataMask cdmask; int i, totpsys; - + if (ob_to->type != OB_MESH) return false; if (!ob_to->data || ID_IS_LINKED(ob_to->data)) return false; - + /* For remapping we need a valid DM. * Because the modifiers are appended at the end it's safe to use * the final DM of the object without particles. @@ -998,9 +998,9 @@ static bool copy_particle_systems_to_object(Main *bmain, #define PSYS_FROM_FIRST (single_psys_from ? single_psys_from : ob_from->particlesystem.first) #define PSYS_FROM_NEXT(cur) (single_psys_from ? NULL : (cur)->next) totpsys = single_psys_from ? 1 : BLI_listbase_count(&ob_from->particlesystem); - + tmp_psys = MEM_mallocN(sizeof(ParticleSystem*) * totpsys, "temporary particle system array"); - + cdmask = 0; for (psys_from = PSYS_FROM_FIRST, i = 0; psys_from; @@ -1008,46 +1008,46 @@ static bool copy_particle_systems_to_object(Main *bmain, { psys = BKE_object_copy_particlesystem(psys_from, 0); tmp_psys[i] = psys; - + if (psys_start == NULL) psys_start = psys; - + cdmask |= psys_emitter_customdata_mask(psys); } /* to iterate source and target psys in sync, * we need to know where the newly added psys start */ psys_start = totpsys > 0 ? tmp_psys[0] : NULL; - + /* get the DM (psys and their modifiers have not been appended yet) */ final_dm = mesh_get_derived_final(scene, ob_to, cdmask); - + /* now append psys to the object and make modifiers */ for (i = 0, psys_from = PSYS_FROM_FIRST; i < totpsys; ++i, psys_from = PSYS_FROM_NEXT(psys_from)) { ParticleSystemModifierData *psmd; - + psys = tmp_psys[i]; - + /* append to the object */ BLI_addtail(&ob_to->particlesystem, psys); - + /* add a particle system modifier for each system */ md = modifier_new(eModifierType_ParticleSystem); psmd = (ParticleSystemModifierData *)md; /* push on top of the stack, no use trying to reproduce old stack order */ BLI_addtail(&ob_to->modifiers, md); - + BLI_snprintf(md->name, sizeof(md->name), "ParticleSystem %i", i); modifier_unique_name(&ob_to->modifiers, (ModifierData *)psmd); - + psmd->psys = psys; psmd->dm_final = CDDM_copy(final_dm); CDDM_calc_normals(psmd->dm_final); DM_ensure_tessface(psmd->dm_final); - + if (psys_from->edit) copy_particle_edit(scene, ob_to, psys, psys_from); @@ -1057,7 +1057,7 @@ static bool copy_particle_systems_to_object(Main *bmain, } } MEM_freeN(tmp_psys); - + /* note: do this after creating DM copies for all the particle system modifiers, * the remapping otherwise makes final_dm invalid! */ @@ -1066,7 +1066,7 @@ static bool copy_particle_systems_to_object(Main *bmain, psys = psys->next, psys_from = PSYS_FROM_NEXT(psys_from), ++i) { float (*from_mat)[4], (*to_mat)[4]; - + switch (space) { case PAR_COPY_SPACE_OBJECT: from_mat = I; @@ -1085,14 +1085,14 @@ static bool copy_particle_systems_to_object(Main *bmain, if (ob_from != ob_to) { remap_hair_emitter(scene, ob_from, psys_from, ob_to, psys, psys->edit, from_mat, to_mat, psys_from->flag & PSYS_GLOBAL_HAIR, psys->flag & PSYS_GLOBAL_HAIR); } - + /* tag for recalc */ // psys->recalc |= PSYS_RECALC_RESET; } - + #undef PSYS_FROM_FIRST #undef PSYS_FROM_NEXT - + DAG_id_tag_update(&ob_to->id, OB_RECALC_DATA); WM_main_add_notifier(NC_OBJECT | ND_PARTICLE | NA_EDITED, ob_to); return true; @@ -1103,11 +1103,11 @@ 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; } @@ -1120,10 +1120,10 @@ static int copy_particle_systems_exec(bContext *C, wmOperator *op) 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; - + int changed_tot = 0; int fail = 0; - + CTX_DATA_BEGIN (C, Object *, ob_to, selected_editable_objects) { if (ob_from != ob_to) { @@ -1136,19 +1136,19 @@ static int copy_particle_systems_exec(bContext *C, wmOperator *op) changed = true; else fail++; - + if (changed) changed_tot++; } } 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; } @@ -1159,17 +1159,17 @@ void PARTICLE_OT_copy_particle_systems(wmOperatorType *ot) {PAR_COPY_SPACE_WORLD, "WORLD", 0, "World", "Copy in world space"}, {0, NULL, 0, NULL, NULL} }; - + ot->name = "Copy Particle Systems"; 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 */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + RNA_def_enum(ot->srna, "space", space_items, PAR_COPY_SPACE_OBJECT, "Space", "Space transform for copying from one object to another"); RNA_def_boolean(ot->srna, "remove_target_particles", true, "Remove Target Particles", "Remove particle systems on the target objects"); RNA_def_boolean(ot->srna, "use_active", false, "Use Active", "Use the active particle system from the context"); |