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 key_elem_offset; | |||||
| float elem_array[0][3]; | float elem_array[0][3]; | ||||
| }; | }; | ||||
| struct XFormObjectData_Lattice { | struct XFormObjectData_Lattice { | ||||
| struct XFormObjectData base; | struct XFormObjectData base; | ||||
| int key_elem_offset; | |||||
campbellbarton: Avoid unrelated/opinionated changes. | |||||
| float elem_array[0][3]; | float elem_array[0][3]; | ||||
| }; | }; | ||||
| struct XFormObjectData_Curve { | struct XFormObjectData_Curve { | ||||
| struct XFormObjectData base; | struct XFormObjectData base; | ||||
| int key_elem_offset; | |||||
| float elem_array[0][3]; | float elem_array[0][3]; | ||||
| }; | }; | ||||
| Context not available. | |||||
| if (id == NULL) { | if (id == NULL) { | ||||
| return xod_base; | return xod_base; | ||||
| } | } | ||||
| switch (GS(id->name)) { | switch (GS(id->name)) { | ||||
| case ID_ME: { | case ID_ME: { | ||||
| Mesh *me = (Mesh *)id; | Mesh *me = (Mesh *)id; | ||||
| Key *key = me->key; | |||||
| int key_shapenr = -1; | |||||
Done Inline ActionsThis assigns a XFormObjectData_Mesh to a XFormObjectData_Lattice pointer. campbellbarton: This assigns a `XFormObjectData_Mesh` to a `XFormObjectData_Lattice` pointer. | |||||
| if (is_edit_mode) { | if (is_edit_mode) { | ||||
| BMesh *bm = me->edit_mesh->bm; | BMesh *bm = me->edit_mesh->bm; | ||||
| key_shapenr = bm->shapenr; | |||||
| int key_size = key ? BKE_key_count_keyblocks_sizes_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( | struct XFormObjectData_Mesh *xod = MEM_mallocN( | ||||
| sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__); | sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len) + key_size, __func__); | ||||
| xod->key_elem_offset = elem_array_len; | |||||
| BM_mesh_vert_coords_get(bm, xod->elem_array); | BM_mesh_vert_coords_get(bm, xod->elem_array); | ||||
| xod_base = &xod->base; | xod_base = &xod->base; | ||||
| if (key && key_size) { | |||||
| BKE_key_get_keyblocks_data_shapenr( | |||||
| key, xod->elem_array + xod->key_elem_offset, key_shapenr); | |||||
| } | |||||
| } | } | ||||
| else { | else { | ||||
| int key_size = key ? BKE_key_count_keyblocks_sizes_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 = MEM_mallocN( | ||||
| sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__); | sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len) + key_size, __func__); | ||||
| xod->key_elem_offset = elem_array_len; | |||||
| BKE_mesh_vert_coords_get(me, xod->elem_array); | BKE_mesh_vert_coords_get(me, xod->elem_array); | ||||
| xod_base = &xod->base; | xod_base = &xod->base; | ||||
| if (key && key_size) { | |||||
| BKE_key_get_keyblocks_data_shapenr( | |||||
| key, xod->elem_array + xod->key_elem_offset, key_shapenr); | |||||
| } | |||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| 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 *key = lt->key; | |||||
| int key_shapenr = -1; | |||||
| if (is_edit_mode) | |||||
| key_shapenr = lt_orig->editlatt->shapenr; | |||||
| int key_size = key ? BKE_key_count_keyblocks_sizes_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( | struct XFormObjectData_Lattice *xod = MEM_mallocN( | ||||
| sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__); | sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len) + key_size, __func__); | ||||
| xod->key_elem_offset = elem_array_len; | |||||
| BKE_lattice_vert_coords_get(lt, xod->elem_array); | BKE_lattice_vert_coords_get(lt, xod->elem_array); | ||||
| xod_base = &xod->base; | xod_base = &xod->base; | ||||
| if (key && key_size) { | |||||
| BKE_key_get_keyblocks_data_shapenr( | |||||
| key, xod->elem_array + xod->key_elem_offset, key_shapenr); | |||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| case ID_CU: { | case ID_CU: { | ||||
| Context not available. | |||||
| break; | break; | ||||
| } | } | ||||
| int key_shapenr = -1; | |||||
| ListBase *nurbs; | ListBase *nurbs; | ||||
| 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 *key = cu->key; | |||||
| int key_size = key ? BKE_key_count_keyblocks_sizes_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( | struct XFormObjectData_Curve *xod = MEM_mallocN( | ||||
| sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__); | sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len) + key_size, __func__); | ||||
| xod->key_elem_offset = 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; | ||||
| if (key && key_size) { | |||||
| BKE_key_get_keyblocks_data_shapenr( | |||||
| key, xod->elem_array + xod->key_elem_offset, key_shapenr); | |||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| case ID_AR: { | case ID_AR: { | ||||
Done Inline ActionsUse NULL instead of zero for pointers. campbellbarton: Use `NULL` instead of zero for pointers. | |||||
| Context not available. | |||||
| 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; | ||||
| Key *key = me->key; | |||||
| int key_shapenr = -1; | |||||
| struct XFormObjectData_Mesh *xod = (struct XFormObjectData_Mesh *)xod_base; | struct XFormObjectData_Mesh *xod = (struct 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); | ||||
| } | } | ||||
| if (key) { | |||||
| BKE_key_set_keyblocks_data_with_mat4( | |||||
| key, key_shapenr, xod->elem_array + xod->key_elem_offset, mat); | |||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| 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; | ||||
| Key *key = lt->key; | |||||
| int key_shapenr = -1; | |||||
| struct XFormObjectData_Lattice *xod = (struct XFormObjectData_Lattice *)xod_base; | struct XFormObjectData_Lattice *xod = (struct 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; | |||||
| } | |||||
| if (key) { | |||||
| BKE_key_set_keyblocks_data_with_mat4( | |||||
| key, key_shapenr, xod->elem_array + xod->key_elem_offset, mat); | |||||
| } | |||||
| 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; | ||||
| Key *key = cu->key; | |||||
| int key_shapenr = -1; | |||||
| ListBase *nurb = NULL; | |||||
| struct XFormObjectData_Curve *xod = (struct XFormObjectData_Curve *)xod_base; | struct XFormObjectData_Curve *xod = (struct XFormObjectData_Curve *)xod_base; | ||||
| if (xod_base->is_edit_mode) { | if (xod_base->is_edit_mode) { | ||||
| EditNurb *editnurb = cu->editnurb; | EditNurb *editnurb = cu->editnurb; | ||||
| nurb = &editnurb->nurbs; | |||||
| 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 { | ||||
| nurb = &cu->nurb; | |||||
| 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); | ||||
| } | } | ||||
| if (key) { | |||||
| BKE_key_set_curve_keyblocks_data_with_mat4( | |||||
| key, nurb, key_shapenr, xod->elem_array + xod->key_elem_offset, mat); | |||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| case ID_AR: { | case ID_AR: { | ||||
| Context not available. | |||||
| 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; | ||||
| Key *key = me->key; | |||||
| int key_shapenr = -1; | |||||
| struct XFormObjectData_Mesh *xod = (struct XFormObjectData_Mesh *)xod_base; | struct XFormObjectData_Mesh *xod = (struct 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); | ||||
| } | } | ||||
| if (key) { | |||||
| BKE_key_set_keyblocks_data(key, key_shapenr, xod->elem_array + xod->key_elem_offset); | |||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| 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; | ||||
| Key *key = lt->key; | |||||
| int key_shapenr = -1; | |||||
| struct XFormObjectData_Lattice *xod = (struct XFormObjectData_Lattice *)xod_base; | struct XFormObjectData_Lattice *xod = (struct 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; | |||||
| } | |||||
| if (key) { | |||||
| BKE_key_set_keyblocks_data(key, key_shapenr, xod->elem_array + xod->key_elem_offset); | |||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| case ID_CU: { | case ID_CU: { | ||||
| Curve *cu = (Curve *)xod_base->id; | Curve *cu = (Curve *)xod_base->id; | ||||
| Key *key = cu->key; | |||||
| int key_shapenr = -1; | |||||
| struct XFormObjectData_Curve *xod = (struct XFormObjectData_Curve *)xod_base; | struct XFormObjectData_Curve *xod = (struct 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); | ||||
| } | } | ||||
| if (key) { | |||||
| BKE_key_set_keyblocks_data(key, key_shapenr, xod->elem_array + xod->key_elem_offset); | |||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| case ID_AR: { | case ID_AR: { | ||||
| Context not available. | |||||
Avoid unrelated/opinionated changes.