Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/object/object_data_transform.c
| Context not available. | |||||
| #include "DNA_armature_types.h" | #include "DNA_armature_types.h" | ||||
| #include "DNA_collection_types.h" | #include "DNA_collection_types.h" | ||||
| #include "DNA_gpencil_types.h" | #include "DNA_gpencil_types.h" | ||||
| #include "DNA_key_types.h" | |||||
| #include "DNA_lattice_types.h" | #include "DNA_lattice_types.h" | ||||
| #include "DNA_mesh_types.h" | #include "DNA_mesh_types.h" | ||||
| #include "DNA_meta_types.h" | #include "DNA_meta_types.h" | ||||
| Context not available. | |||||
| #include "BKE_mball.h" | #include "BKE_mball.h" | ||||
| #include "BKE_mesh.h" | #include "BKE_mesh.h" | ||||
| #include "BKE_scene.h" | #include "BKE_scene.h" | ||||
| #include "BKE_key.h" | |||||
| #include "bmesh.h" | #include "bmesh.h" | ||||
| Context not available. | |||||
| struct XFormObjectData_Mesh { | struct XFormObjectData_Mesh { | ||||
| struct XFormObjectData base; | struct XFormObjectData base; | ||||
| int elem_array_len; | |||||
| float elem_array[0][3]; | float elem_array[0][3]; | ||||
| }; | }; | ||||
| struct XFormObjectData_Lattice { | typedef struct XFormObjectData_Mesh XFormObjectData_Mesh; | ||||
| struct XFormObjectData base; | typedef struct XFormObjectData_Mesh XFormObjectData_Lattice; | ||||
| float elem_array[0][3]; | typedef struct XFormObjectData_Mesh XFormObjectData_Curve; | ||||
campbellbarton: Avoid unrelated/opinionated changes. | |||||
| }; | |||||
| struct XFormObjectData_Curve { | |||||
| struct XFormObjectData base; | |||||
| float elem_array[0][3]; | |||||
| }; | |||||
| struct XFormObjectData_Armature { | struct XFormObjectData_Armature { | ||||
| struct XFormObjectData base; | struct XFormObjectData base; | ||||
| Context not available. | |||||
| if (id == NULL) { | if (id == NULL) { | ||||
| return xod_base; | return xod_base; | ||||
| } | } | ||||
| Key *key = NULL; | |||||
| int key_len = 0; | |||||
| int key_shapenr = -1; | |||||
| XFormObjectData_Lattice *key_data_dst = 0; | |||||
| switch (GS(id->name)) { | switch (GS(id->name)) { | ||||
| case ID_ME: { | case ID_ME: { | ||||
| Mesh *me = (Mesh *)id; | Mesh *me = (Mesh *)id; | ||||
| key = me->key; | |||||
| if (is_edit_mode) { | if (is_edit_mode) { | ||||
| BMesh *bm = me->edit_mesh->bm; | BMesh *bm = me->edit_mesh->bm; | ||||
| key_shapenr = bm->shapenr; | |||||
| key_len = key ? BKE_key_count_keyblocks_elements_shapenr(key, key_shapenr) : 0; | |||||
| const int elem_array_len = bm->totvert; | const int elem_array_len = bm->totvert; | ||||
| struct XFormObjectData_Mesh *xod = MEM_mallocN( | XFormObjectData_Mesh *xod = key_data_dst = MEM_mallocN( | ||||
campbellbartonUnsubmitted Done Inline ActionsThis assigns a XFormObjectData_Mesh to a XFormObjectData_Lattice pointer. campbellbarton: This assigns a `XFormObjectData_Mesh` to a `XFormObjectData_Lattice` pointer. | |||||
| sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__); | sizeof(*xod) + (sizeof(*xod->elem_array) * (elem_array_len + key_len)), __func__); | ||||
| BM_mesh_vert_coords_get(bm, xod->elem_array); | BM_mesh_vert_coords_get(bm, xod->elem_array); | ||||
| xod->elem_array_len = elem_array_len; | |||||
| xod_base = &xod->base; | xod_base = &xod->base; | ||||
| } | } | ||||
| else { | else { | ||||
| key_len = key ? BKE_key_count_keyblocks_elements_shapenr(key, key_shapenr) : 0; | |||||
| const int elem_array_len = me->totvert; | const int elem_array_len = me->totvert; | ||||
| struct XFormObjectData_Mesh *xod = MEM_mallocN( | struct XFormObjectData_Mesh *xod = key_data_dst = MEM_mallocN( | ||||
| sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__); | sizeof(*xod) + (sizeof(*xod->elem_array) * (elem_array_len + key_len)), __func__); | ||||
| BKE_mesh_vert_coords_get(me, xod->elem_array); | BKE_mesh_vert_coords_get(me, xod->elem_array); | ||||
| xod->elem_array_len = elem_array_len; | |||||
| xod_base = &xod->base; | xod_base = &xod->base; | ||||
| } | } | ||||
| break; | break; | ||||
| Context not available. | |||||
| case ID_LT: { | case ID_LT: { | ||||
| Lattice *lt_orig = (Lattice *)id; | Lattice *lt_orig = (Lattice *)id; | ||||
| Lattice *lt = is_edit_mode ? lt_orig->editlatt->latt : lt_orig; | Lattice *lt = is_edit_mode ? lt_orig->editlatt->latt : lt_orig; | ||||
| key = lt->key; | |||||
| if (is_edit_mode) | |||||
| key_shapenr = lt_orig->editlatt->shapenr; | |||||
| key_len = key ? BKE_key_count_keyblocks_elements_shapenr(key, key_shapenr) : 0; | |||||
| const int elem_array_len = lt->pntsu * lt->pntsv * lt->pntsw; | const int elem_array_len = lt->pntsu * lt->pntsv * lt->pntsw; | ||||
| struct XFormObjectData_Lattice *xod = MEM_mallocN( | XFormObjectData_Lattice *xod = key_data_dst = MEM_mallocN( | ||||
| sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__); | sizeof(*xod) + (sizeof(*xod->elem_array) * (elem_array_len + key_len)), __func__); | ||||
| BKE_lattice_vert_coords_get(lt, xod->elem_array); | BKE_lattice_vert_coords_get(lt, xod->elem_array); | ||||
| xod->elem_array_len = elem_array_len; | |||||
| xod_base = &xod->base; | xod_base = &xod->base; | ||||
| break; | break; | ||||
| } | } | ||||
| Context not available. | |||||
| if (is_edit_mode) { | if (is_edit_mode) { | ||||
| EditNurb *editnurb = cu->editnurb; | EditNurb *editnurb = cu->editnurb; | ||||
| nurbs = &editnurb->nurbs; | nurbs = &editnurb->nurbs; | ||||
| key_shapenr = editnurb->shapenr; | |||||
| } | } | ||||
| else { | else { | ||||
| nurbs = &cu->nurb; | nurbs = &cu->nurb; | ||||
| } | } | ||||
| key = cu->key; | |||||
| key_len = key ? BKE_key_count_keyblocks_elements_shapenr(key, key_shapenr) : 0; | |||||
| const int elem_array_len = BKE_nurbList_verts_count(nurbs); | const int elem_array_len = BKE_nurbList_verts_count(nurbs); | ||||
| struct XFormObjectData_Curve *xod = MEM_mallocN( | XFormObjectData_Curve *xod = key_data_dst = MEM_mallocN( | ||||
| sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__); | sizeof(*xod) + (sizeof(*xod->elem_array) * (elem_array_len + key_len)), __func__); | ||||
| xod->elem_array_len = elem_array_len; | |||||
| BKE_curve_nurbs_vert_coords_get(nurbs, xod->elem_array, elem_array_len); | BKE_curve_nurbs_vert_coords_get(nurbs, xod->elem_array, elem_array_len); | ||||
| xod_base = &xod->base; | xod_base = &xod->base; | ||||
| break; | break; | ||||
| Context not available. | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| if (key && key_data_dst && key_len) { | |||||
| float(*key_data_elements)[3] = key_data_dst->elem_array + key_data_dst->elem_array_len; | |||||
| BKE_key_copy_keyblocks_data_shapenr(key, key_data_elements, key_shapenr); | |||||
| } | |||||
| if (xod_base) { | if (xod_base) { | ||||
| xod_base->id = id; | xod_base->id = id; | ||||
| xod_base->is_edit_mode = is_edit_mode; | xod_base->is_edit_mode = is_edit_mode; | ||||
| Context not available. | |||||
| void ED_object_data_xform_by_mat4(struct XFormObjectData *xod_base, const float mat[4][4]) | void ED_object_data_xform_by_mat4(struct XFormObjectData *xod_base, const float mat[4][4]) | ||||
| { | { | ||||
| Key *key = 0; | |||||
campbellbartonUnsubmitted Done Inline ActionsUse NULL instead of zero for pointers. campbellbarton: Use `NULL` instead of zero for pointers. | |||||
| XFormObjectData_Mesh *key_data_src = 0; | |||||
| int key_shapenr = -1; | |||||
| switch (GS(xod_base->id->name)) { | switch (GS(xod_base->id->name)) { | ||||
| case ID_ME: { | case ID_ME: { | ||||
| Mesh *me = (Mesh *)xod_base->id; | Mesh *me = (Mesh *)xod_base->id; | ||||
| struct XFormObjectData_Mesh *xod = (struct XFormObjectData_Mesh *)xod_base; | key = me->key; | ||||
| XFormObjectData_Mesh *xod = key_data_src = (XFormObjectData_Mesh *)xod_base; | |||||
| if (xod_base->is_edit_mode) { | if (xod_base->is_edit_mode) { | ||||
| BMesh *bm = me->edit_mesh->bm; | BMesh *bm = me->edit_mesh->bm; | ||||
| BM_mesh_vert_coords_apply_with_mat4(bm, xod->elem_array, mat); | BM_mesh_vert_coords_apply_with_mat4(bm, xod->elem_array, mat); | ||||
| key_shapenr = bm->shapenr; | |||||
| } | } | ||||
| else { | else { | ||||
| BKE_mesh_vert_coords_apply_with_mat4(me, xod->elem_array, mat); | BKE_mesh_vert_coords_apply_with_mat4(me, xod->elem_array, mat); | ||||
| Context not available. | |||||
| case ID_LT: { | case ID_LT: { | ||||
| Lattice *lt_orig = (Lattice *)xod_base->id; | Lattice *lt_orig = (Lattice *)xod_base->id; | ||||
| Lattice *lt = xod_base->is_edit_mode ? lt_orig->editlatt->latt : lt_orig; | Lattice *lt = xod_base->is_edit_mode ? lt_orig->editlatt->latt : lt_orig; | ||||
| struct XFormObjectData_Lattice *xod = (struct XFormObjectData_Lattice *)xod_base; | key = lt->key; | ||||
| XFormObjectData_Lattice *xod = key_data_src = (XFormObjectData_Lattice *)xod_base; | |||||
| BKE_lattice_vert_coords_apply_with_mat4(lt, xod->elem_array, mat); | BKE_lattice_vert_coords_apply_with_mat4(lt, xod->elem_array, mat); | ||||
| if (xod_base->is_edit_mode) { | |||||
| key_shapenr = lt_orig->editlatt->shapenr; | |||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| case ID_CU: { | case ID_CU: { | ||||
| BLI_assert(xod_base->is_edit_mode == false); /* Not used currently. */ | BLI_assert(xod_base->is_edit_mode == false); /* Not used currently. */ | ||||
| Curve *cu = (Curve *)xod_base->id; | Curve *cu = (Curve *)xod_base->id; | ||||
| struct XFormObjectData_Curve *xod = (struct XFormObjectData_Curve *)xod_base; | key = cu->key; | ||||
| XFormObjectData_Curve *xod = key_data_src = (XFormObjectData_Curve *)xod_base; | |||||
| if (xod_base->is_edit_mode) { | if (xod_base->is_edit_mode) { | ||||
| EditNurb *editnurb = cu->editnurb; | EditNurb *editnurb = cu->editnurb; | ||||
| BKE_curve_nurbs_vert_coords_apply_with_mat4(&editnurb->nurbs, xod->elem_array, mat, true); | BKE_curve_nurbs_vert_coords_apply_with_mat4(&editnurb->nurbs, xod->elem_array, mat, true); | ||||
| key_shapenr = editnurb->shapenr; | |||||
| } | } | ||||
| else { | else { | ||||
| BKE_curve_nurbs_vert_coords_apply_with_mat4(&cu->nurb, xod->elem_array, mat, true); | BKE_curve_nurbs_vert_coords_apply_with_mat4(&cu->nurb, xod->elem_array, mat, true); | ||||
| Context not available. | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| if (key && key_data_src) { | |||||
| float(*key_data_elements)[3] = key_data_src->elem_array + key_data_src->elem_array_len; | |||||
| BKE_key_set_keyblocks_data_with_mat(key, key_shapenr, key_data_elements, mat); | |||||
| } | |||||
| } | } | ||||
| void ED_object_data_xform_restore(struct XFormObjectData *xod_base) | void ED_object_data_xform_restore(struct XFormObjectData *xod_base) | ||||
| { | { | ||||
| Key *key = 0; | |||||
| XFormObjectData_Mesh *key_data_src = 0; | |||||
| int key_shapenr = -1; | |||||
| switch (GS(xod_base->id->name)) { | switch (GS(xod_base->id->name)) { | ||||
| case ID_ME: { | case ID_ME: { | ||||
| Mesh *me = (Mesh *)xod_base->id; | Mesh *me = (Mesh *)xod_base->id; | ||||
| struct XFormObjectData_Mesh *xod = (struct XFormObjectData_Mesh *)xod_base; | key = me->key; | ||||
| XFormObjectData_Mesh *xod = key_data_src = (XFormObjectData_Mesh *)xod_base; | |||||
| if (xod_base->is_edit_mode) { | if (xod_base->is_edit_mode) { | ||||
| BMesh *bm = me->edit_mesh->bm; | BMesh *bm = me->edit_mesh->bm; | ||||
| BM_mesh_vert_coords_apply(bm, xod->elem_array); | BM_mesh_vert_coords_apply(bm, xod->elem_array); | ||||
| key_shapenr = bm->shapenr; | |||||
| } | } | ||||
| else { | else { | ||||
| BKE_mesh_vert_coords_apply(me, xod->elem_array); | BKE_mesh_vert_coords_apply(me, xod->elem_array); | ||||
| Context not available. | |||||
| case ID_LT: { | case ID_LT: { | ||||
| Lattice *lt_orig = (Lattice *)xod_base->id; | Lattice *lt_orig = (Lattice *)xod_base->id; | ||||
| Lattice *lt = xod_base->is_edit_mode ? lt_orig->editlatt->latt : lt_orig; | Lattice *lt = xod_base->is_edit_mode ? lt_orig->editlatt->latt : lt_orig; | ||||
| struct XFormObjectData_Lattice *xod = (struct XFormObjectData_Lattice *)xod_base; | key = lt->key; | ||||
| XFormObjectData_Lattice *xod = key_data_src = (XFormObjectData_Lattice *)xod_base; | |||||
| BKE_lattice_vert_coords_apply(lt, xod->elem_array); | BKE_lattice_vert_coords_apply(lt, xod->elem_array); | ||||
| if (xod_base->is_edit_mode) { | |||||
| key_shapenr = lt_orig->editlatt->shapenr; | |||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| case ID_CU: { | case ID_CU: { | ||||
| Curve *cu = (Curve *)xod_base->id; | Curve *cu = (Curve *)xod_base->id; | ||||
| struct XFormObjectData_Curve *xod = (struct XFormObjectData_Curve *)xod_base; | key = cu->key; | ||||
| XFormObjectData_Curve *xod = key_data_src = (XFormObjectData_Curve *)xod_base; | |||||
| if (xod_base->is_edit_mode) { | if (xod_base->is_edit_mode) { | ||||
| EditNurb *editnurb = cu->editnurb; | EditNurb *editnurb = cu->editnurb; | ||||
| BKE_curve_nurbs_vert_coords_apply(&editnurb->nurbs, xod->elem_array, true); | BKE_curve_nurbs_vert_coords_apply(&editnurb->nurbs, xod->elem_array, true); | ||||
| key_shapenr = editnurb->shapenr; | |||||
| } | } | ||||
| else { | else { | ||||
| BKE_curve_nurbs_vert_coords_apply(&cu->nurb, xod->elem_array, true); | BKE_curve_nurbs_vert_coords_apply(&cu->nurb, xod->elem_array, true); | ||||
| Context not available. | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| if (key && key_data_src) { | |||||
| void* key_data_elements = key_data_src->elem_array + key_data_src->elem_array_len; | |||||
| BKE_key_set_keyblocks_data(key, key_shapenr, key_data_elements); | |||||
| } | |||||
| } | } | ||||
| void ED_object_data_xform_tag_update(struct XFormObjectData *xod_base) | void ED_object_data_xform_tag_update(struct XFormObjectData *xod_base) | ||||
| Context not available. | |||||
Avoid unrelated/opinionated changes.