Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/object/object_modifier.c
| Show First 20 Lines • Show All 405 Lines • ▼ Show 20 Lines | if (md->next) { | ||||
| BLI_remlink(&ob->modifiers, md); | BLI_remlink(&ob->modifiers, md); | ||||
| BLI_insertlinkafter(&ob->modifiers, md->next, md); | BLI_insertlinkafter(&ob->modifiers, md->next, md); | ||||
| } | } | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *scene, Object *ob, ModifierData *md) | int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *scene, SceneLayer *sl, Object *ob, ModifierData *md) | ||||
| { | { | ||||
| Object *obn; | Object *obn; | ||||
| ParticleSystem *psys; | ParticleSystem *psys; | ||||
| ParticleCacheKey *key, **cache; | ParticleCacheKey *key, **cache; | ||||
| ParticleSettings *part; | ParticleSettings *part; | ||||
| Mesh *me; | Mesh *me; | ||||
| MVert *mvert; | MVert *mvert; | ||||
| MEdge *medge; | MEdge *medge; | ||||
| Show All 35 Lines | if (key->segments > 0) { | ||||
| totvert += key->segments + 1; | totvert += key->segments + 1; | ||||
| totedge += key->segments; | totedge += key->segments; | ||||
| } | } | ||||
| } | } | ||||
| if (totvert == 0) return 0; | if (totvert == 0) return 0; | ||||
| /* add new mesh */ | /* add new mesh */ | ||||
| obn = BKE_object_add(bmain, scene, OB_MESH, NULL); | obn = BKE_object_add(bmain, scene, sl, OB_MESH, NULL); | ||||
| me = obn->data; | me = obn->data; | ||||
| me->totvert = totvert; | me->totvert = totvert; | ||||
| me->totedge = totedge; | me->totedge = totedge; | ||||
| me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, totvert); | me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, totvert); | ||||
| me->medge = CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, totedge); | me->medge = CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, totedge); | ||||
| me->mface = CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, 0); | me->mface = CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, 0); | ||||
| ▲ Show 20 Lines • Show All 568 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| /************************ convert modifier operator *********************/ | /************************ convert modifier operator *********************/ | ||||
| static int modifier_convert_exec(bContext *C, wmOperator *op) | static int modifier_convert_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Main *bmain = CTX_data_main(C); | Main *bmain = CTX_data_main(C); | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| SceneLayer *sl = CTX_data_scene_layer(C); | |||||
| Object *ob = ED_object_active_context(C); | Object *ob = ED_object_active_context(C); | ||||
| ModifierData *md = edit_modifier_property_get(op, ob, 0); | ModifierData *md = edit_modifier_property_get(op, ob, 0); | ||||
| if (!md || !ED_object_modifier_convert(op->reports, bmain, scene, ob, md)) | if (!md || !ED_object_modifier_convert(op->reports, bmain, scene, sl, ob, md)) | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| DAG_id_tag_update(&ob->id, OB_RECALC_DATA); | DAG_id_tag_update(&ob->id, OB_RECALC_DATA); | ||||
| WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); | WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); | ||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 615 Lines • ▼ Show 20 Lines | skin_armature_bone_create(skin_ob, | ||||
| arm, | arm, | ||||
| edges_visited, | edges_visited, | ||||
| emap, | emap, | ||||
| bone, | bone, | ||||
| v); | v); | ||||
| } | } | ||||
| } | } | ||||
| static Object *modifier_skin_armature_create(Main *bmain, Scene *scene, Object *skin_ob) | static Object *modifier_skin_armature_create(Main *bmain, Scene *scene, SceneLayer *sl, Object *skin_ob) | ||||
| { | { | ||||
| BLI_bitmap *edges_visited; | BLI_bitmap *edges_visited; | ||||
| DerivedMesh *deform_dm; | DerivedMesh *deform_dm; | ||||
| MVert *mvert; | MVert *mvert; | ||||
| Mesh *me = skin_ob->data; | Mesh *me = skin_ob->data; | ||||
| Object *arm_ob; | Object *arm_ob; | ||||
| bArmature *arm; | bArmature *arm; | ||||
| MVertSkin *mvert_skin; | MVertSkin *mvert_skin; | ||||
| MeshElemMap *emap; | MeshElemMap *emap; | ||||
| int *emap_mem; | int *emap_mem; | ||||
| int v; | int v; | ||||
| deform_dm = mesh_get_derived_deform(scene, skin_ob, CD_MASK_BAREMESH); | deform_dm = mesh_get_derived_deform(scene, skin_ob, CD_MASK_BAREMESH); | ||||
| mvert = deform_dm->getVertArray(deform_dm); | mvert = deform_dm->getVertArray(deform_dm); | ||||
| /* add vertex weights to original mesh */ | /* add vertex weights to original mesh */ | ||||
| CustomData_add_layer(&me->vdata, | CustomData_add_layer(&me->vdata, | ||||
| CD_MDEFORMVERT, | CD_MDEFORMVERT, | ||||
| CD_CALLOC, | CD_CALLOC, | ||||
| NULL, | NULL, | ||||
| me->totvert); | me->totvert); | ||||
| arm_ob = BKE_object_add(bmain, scene, OB_ARMATURE, NULL); | arm_ob = BKE_object_add(bmain, scene, sl, OB_ARMATURE, NULL); | ||||
| BKE_object_transform_copy(arm_ob, skin_ob); | BKE_object_transform_copy(arm_ob, skin_ob); | ||||
| arm = arm_ob->data; | arm = arm_ob->data; | ||||
| arm->layer = 1; | arm->layer = 1; | ||||
| arm_ob->dtx |= OB_DRAWXRAY; | arm_ob->dtx |= OB_DRAWXRAY; | ||||
| arm->drawtype = ARM_LINE; | arm->drawtype = ARM_LINE; | ||||
| arm->edbo = MEM_callocN(sizeof(ListBase), "edbo armature"); | arm->edbo = MEM_callocN(sizeof(ListBase), "edbo armature"); | ||||
| mvert_skin = CustomData_get_layer(&me->vdata, CD_MVERT_SKIN); | mvert_skin = CustomData_get_layer(&me->vdata, CD_MVERT_SKIN); | ||||
| ▲ Show 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | static Object *modifier_skin_armature_create(Main *bmain, Scene *scene, SceneLayer *sl, Object *skin_ob) | ||||
| return arm_ob; | return arm_ob; | ||||
| } | } | ||||
| static int skin_armature_create_exec(bContext *C, wmOperator *op) | static int skin_armature_create_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Main *bmain = CTX_data_main(C); | Main *bmain = CTX_data_main(C); | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| SceneLayer *sl = CTX_data_scene_layer(C); | |||||
| Object *ob = CTX_data_active_object(C), *arm_ob; | Object *ob = CTX_data_active_object(C), *arm_ob; | ||||
| Mesh *me = ob->data; | Mesh *me = ob->data; | ||||
| ModifierData *skin_md; | ModifierData *skin_md; | ||||
| ArmatureModifierData *arm_md; | ArmatureModifierData *arm_md; | ||||
| if (!CustomData_has_layer(&me->vdata, CD_MVERT_SKIN)) { | if (!CustomData_has_layer(&me->vdata, CD_MVERT_SKIN)) { | ||||
| BKE_reportf(op->reports, RPT_WARNING, "Mesh '%s' has no skin vertex data", me->id.name + 2); | BKE_reportf(op->reports, RPT_WARNING, "Mesh '%s' has no skin vertex data", me->id.name + 2); | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| } | } | ||||
| /* create new armature */ | /* create new armature */ | ||||
| arm_ob = modifier_skin_armature_create(bmain, scene, ob); | arm_ob = modifier_skin_armature_create(bmain, scene, sl, ob); | ||||
| /* add a modifier to connect the new armature to the mesh */ | /* add a modifier to connect the new armature to the mesh */ | ||||
| arm_md = (ArmatureModifierData *)modifier_new(eModifierType_Armature); | arm_md = (ArmatureModifierData *)modifier_new(eModifierType_Armature); | ||||
| if (arm_md) { | if (arm_md) { | ||||
| skin_md = edit_modifier_property_get(op, ob, eModifierType_Skin); | skin_md = edit_modifier_property_get(op, ob, eModifierType_Skin); | ||||
| BLI_insertlinkafter(&ob->modifiers, skin_md, arm_md); | BLI_insertlinkafter(&ob->modifiers, skin_md, arm_md); | ||||
| arm_md->object = arm_ob; | arm_md->object = arm_ob; | ||||
| ▲ Show 20 Lines • Show All 509 Lines • Show Last 20 Lines | |||||