Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/object/object_data_transform.c
| Show All 27 Lines | |||||
| */ | */ | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| #include "DNA_anim_types.h" | #include "DNA_anim_types.h" | ||||
| #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_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" | ||||
| #include "DNA_object_types.h" | #include "DNA_object_types.h" | ||||
| #include "DNA_scene_types.h" | #include "DNA_scene_types.h" | ||||
| #include "BLI_listbase.h" | #include "BLI_listbase.h" | ||||
| #include "BLI_math.h" | #include "BLI_math.h" | ||||
| #include "BLI_utildefines.h" | #include "BLI_utildefines.h" | ||||
| #include "BKE_armature.h" | #include "BKE_armature.h" | ||||
| #include "BKE_curve.h" | #include "BKE_curve.h" | ||||
| #include "BKE_editmesh.h" | #include "BKE_editmesh.h" | ||||
| #include "BKE_gpencil_geom.h" | |||||
| #include "BKE_lattice.h" | #include "BKE_lattice.h" | ||||
| #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 "bmesh.h" | #include "bmesh.h" | ||||
| #include "DEG_depsgraph.h" | #include "DEG_depsgraph.h" | ||||
| ▲ Show 20 Lines • Show All 241 Lines • ▼ Show 20 Lines | struct XFormObjectData_Armature { | ||||
| struct ElemData_Armature elem_array[0]; | struct ElemData_Armature elem_array[0]; | ||||
| }; | }; | ||||
| struct XFormObjectData_MetaBall { | struct XFormObjectData_MetaBall { | ||||
| struct XFormObjectData base; | struct XFormObjectData base; | ||||
| struct ElemData_MetaBall elem_array[0]; | struct ElemData_MetaBall elem_array[0]; | ||||
| }; | }; | ||||
| struct XFormObjectData_GPencil { | |||||
| struct XFormObjectData base; | |||||
| struct GPencilPointCoordinates elem_array[0]; | |||||
| }; | |||||
| struct XFormObjectData *ED_object_data_xform_create_ex(ID *id, bool is_edit_mode) | struct XFormObjectData *ED_object_data_xform_create_ex(ID *id, bool is_edit_mode) | ||||
| { | { | ||||
| struct XFormObjectData *xod_base = NULL; | struct XFormObjectData *xod_base = NULL; | ||||
| 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: { | ||||
| ▲ Show 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | case ID_MB: { | ||||
| MetaBall *mb = (MetaBall *)id; | MetaBall *mb = (MetaBall *)id; | ||||
| const int elem_array_len = BLI_listbase_count(&mb->elems); | const int elem_array_len = BLI_listbase_count(&mb->elems); | ||||
| struct XFormObjectData_MetaBall *xod = MEM_mallocN( | struct XFormObjectData_MetaBall *xod = MEM_mallocN( | ||||
| sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__); | sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__); | ||||
| metaball_coords_and_quats_get(mb, xod->elem_array); | metaball_coords_and_quats_get(mb, xod->elem_array); | ||||
| xod_base = &xod->base; | xod_base = &xod->base; | ||||
| break; | break; | ||||
| } | } | ||||
| case ID_GD: { | |||||
| bGPdata *gpd = (bGPdata *)id; | |||||
| const int elem_array_len = BKE_gpencil_stroke_point_count(gpd); | |||||
| struct XFormObjectData_GPencil *xod = MEM_mallocN( | |||||
| sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__); | |||||
| BKE_gpencil_point_coords_get(gpd, xod->elem_array); | |||||
| xod_base = &xod->base; | |||||
| break; | |||||
| } | |||||
| default: { | default: { | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| 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; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | switch (GS(xod_base->id->name)) { | ||||
| } | } | ||||
| case ID_MB: { | case ID_MB: { | ||||
| /* Metaballs are a special case, edit-mode and object mode data is shared. */ | /* Metaballs are a special case, edit-mode and object mode data is shared. */ | ||||
| MetaBall *mb = (MetaBall *)xod_base->id; | MetaBall *mb = (MetaBall *)xod_base->id; | ||||
| struct XFormObjectData_MetaBall *xod = (struct XFormObjectData_MetaBall *)xod_base; | struct XFormObjectData_MetaBall *xod = (struct XFormObjectData_MetaBall *)xod_base; | ||||
| metaball_coords_and_quats_apply_with_mat4(mb, xod->elem_array, mat); | metaball_coords_and_quats_apply_with_mat4(mb, xod->elem_array, mat); | ||||
| break; | break; | ||||
| } | } | ||||
| case ID_GD: { | |||||
| bGPdata *gpd = (bGPdata *)xod_base->id; | |||||
| struct XFormObjectData_GPencil *xod = (struct XFormObjectData_GPencil *)xod_base; | |||||
| BKE_gpencil_point_coords_apply_with_mat4(gpd, xod->elem_array, mat); | |||||
| break; | |||||
| } | |||||
| default: { | default: { | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void ED_object_data_xform_restore(struct XFormObjectData *xod_base) | void ED_object_data_xform_restore(struct XFormObjectData *xod_base) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | switch (GS(xod_base->id->name)) { | ||||
| } | } | ||||
| case ID_MB: { | case ID_MB: { | ||||
| /* Metaballs are a special case, edit-mode and object mode data is shared. */ | /* Metaballs are a special case, edit-mode and object mode data is shared. */ | ||||
| MetaBall *mb = (MetaBall *)xod_base->id; | MetaBall *mb = (MetaBall *)xod_base->id; | ||||
| struct XFormObjectData_MetaBall *xod = (struct XFormObjectData_MetaBall *)xod_base; | struct XFormObjectData_MetaBall *xod = (struct XFormObjectData_MetaBall *)xod_base; | ||||
| metaball_coords_and_quats_apply(mb, xod->elem_array); | metaball_coords_and_quats_apply(mb, xod->elem_array); | ||||
| break; | break; | ||||
| } | } | ||||
| case ID_GD: { | |||||
| bGPdata *gpd = (bGPdata *)xod_base->id; | |||||
| struct XFormObjectData_GPencil *xod = (struct XFormObjectData_GPencil *)xod_base; | |||||
| BKE_gpencil_point_coords_apply(gpd, xod->elem_array); | |||||
| break; | |||||
| } | |||||
| default: { | default: { | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void ED_object_data_xform_tag_update(struct XFormObjectData *xod_base) | void ED_object_data_xform_tag_update(struct XFormObjectData *xod_base) | ||||
| { | { | ||||
| Show All 27 Lines | case ID_AR: { | ||||
| break; | break; | ||||
| } | } | ||||
| case ID_MB: { | case ID_MB: { | ||||
| /* Generic update. */ | /* Generic update. */ | ||||
| MetaBall *mb = (MetaBall *)xod_base->id; | MetaBall *mb = (MetaBall *)xod_base->id; | ||||
| DEG_id_tag_update(&mb->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); | DEG_id_tag_update(&mb->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); | ||||
| break; | break; | ||||
| } | } | ||||
| case ID_GD: { | |||||
| /* Generic update. */ | |||||
| bGPdata *gpd = (bGPdata *)xod_base->id; | |||||
| DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); | |||||
| break; | |||||
| } | |||||
| default: { | default: { | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||