[Bf-blender-cvs] [20620afc33c] master: Object: edit-mode data support for object vertex coordinate access
Campbell Barton
noreply at git.blender.org
Thu Nov 21 12:52:29 CET 2019
Commit: 20620afc33cacd11429045f94ce27a8bc297c456
Author: Campbell Barton
Date: Thu Nov 21 21:03:03 2019 +1100
Branches: master
https://developer.blender.org/rB20620afc33cacd11429045f94ce27a8bc297c456
Object: edit-mode data support for object vertex coordinate access
Allows to access/transform/restore edit-mode
coordinates in a generic way.
===================================================================
M source/blender/blenkernel/intern/editmesh.c
M source/blender/bmesh/intern/bmesh_mesh.c
M source/blender/bmesh/intern/bmesh_mesh.h
M source/blender/editors/include/ED_object.h
M source/blender/editors/object/object_data_transform.c
===================================================================
diff --git a/source/blender/blenkernel/intern/editmesh.c b/source/blender/blenkernel/intern/editmesh.c
index d929c953b89..b135574a650 100644
--- a/source/blender/blenkernel/intern/editmesh.c
+++ b/source/blender/blenkernel/intern/editmesh.c
@@ -216,20 +216,7 @@ void BKE_editmesh_color_ensure(BMEditMesh *em, const char htype)
float (*BKE_editmesh_vert_coords_alloc_orco(BMEditMesh *em, int *r_vert_len))[3]
{
- BMIter iter;
- BMVert *eve;
- float(*orco)[3];
- int i;
-
- orco = MEM_mallocN(em->bm->totvert * sizeof(*orco), __func__);
-
- BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
- copy_v3_v3(orco[i], eve->co);
- }
-
- *r_vert_len = em->bm->totvert;
-
- return orco;
+ return BM_mesh_vert_coords_alloc(em->bm, r_vert_len);
}
void BKE_editmesh_lnorspace_update(BMEditMesh *em)
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index f44b758ef6b..4790c811e56 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -2708,3 +2708,49 @@ void BM_mesh_toolflags_set(BMesh *bm, bool use_toolflags)
bm->use_toolflags = use_toolflags;
}
+
+/* -------------------------------------------------------------------- */
+/** \name BMesh Coordinate Access
+ * \{ */
+
+void BM_mesh_vert_coords_get(BMesh *bm, float (*vert_coords)[3])
+{
+ BMIter iter;
+ BMVert *v;
+ int i;
+ BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) {
+ copy_v3_v3(vert_coords[i], v->co);
+ }
+}
+
+float (*BM_mesh_vert_coords_alloc(BMesh *bm, int *r_vert_len))[3]
+{
+ float(*vert_coords)[3] = MEM_mallocN(bm->totvert * sizeof(*vert_coords), __func__);
+ BM_mesh_vert_coords_get(bm, vert_coords);
+ *r_vert_len = bm->totvert;
+ return vert_coords;
+}
+
+void BM_mesh_vert_coords_apply(BMesh *bm, const float (*vert_coords)[3])
+{
+ BMIter iter;
+ BMVert *v;
+ int i;
+ BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) {
+ copy_v3_v3(v->co, vert_coords[i]);
+ }
+}
+
+void BM_mesh_vert_coords_apply_with_mat4(BMesh *bm,
+ const float (*vert_coords)[3],
+ const float mat[4][4])
+{
+ BMIter iter;
+ BMVert *v;
+ int i;
+ BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) {
+ mul_v3_m4v3(v->co, mat, vert_coords[i]);
+ }
+}
+
+/** \} */
diff --git a/source/blender/bmesh/intern/bmesh_mesh.h b/source/blender/bmesh/intern/bmesh_mesh.h
index 83575552acc..604142445ae 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.h
+++ b/source/blender/bmesh/intern/bmesh_mesh.h
@@ -159,4 +159,12 @@ extern const BMAllocTemplate bm_mesh_chunksize_default;
#define BMALLOC_TEMPLATE_FROM_ME(...) \
VA_NARGS_CALL_OVERLOAD(_VA_BMALLOC_TEMPLATE_FROM_ME_, __VA_ARGS__)
+/* Vertex coords access. */
+void BM_mesh_vert_coords_get(BMesh *bm, float (*orco)[3]);
+float (*BM_mesh_vert_coords_alloc(BMesh *bm, int *r_vert_len))[3];
+void BM_mesh_vert_coords_apply(BMesh *bm, const float (*orco)[3]);
+void BM_mesh_vert_coords_apply_with_mat4(BMesh *bm,
+ const float (*vert_coords)[3],
+ const float mat[4][4]);
+
#endif /* __BMESH_MESH_H__ */
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 38d75aa57e9..a5f56689c95 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -410,11 +410,17 @@ void ED_object_facemap_face_add(struct Object *ob, struct bFaceMap *fmap, int fa
void ED_object_facemap_face_remove(struct Object *ob, struct bFaceMap *fmap, int facenum);
/* object_data_transform.c */
+struct XFormObjectData *ED_object_data_xform_create_ex(struct ID *id, bool is_edit_mode);
struct XFormObjectData *ED_object_data_xform_create(struct ID *id);
+struct XFormObjectData *ED_object_data_xform_create_from_edit_mode(ID *id);
+
void ED_object_data_xform_destroy(struct XFormObjectData *xod);
void ED_object_data_xform_by_mat4(struct XFormObjectData *xod, const float mat[4][4]);
+void ED_object_data_xform_restore(struct XFormObjectData *xod);
+void ED_object_data_xform_tag_update(struct XFormObjectData *xod);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/editors/object/object_data_transform.c b/source/blender/editors/object/object_data_transform.c
index ee86c79ead5..51d8fb8fd72 100644
--- a/source/blender/editors/object/object_data_transform.c
+++ b/source/blender/editors/object/object_data_transform.c
@@ -44,16 +44,21 @@
#include "BLI_utildefines.h"
#include "BKE_curve.h"
+#include "BKE_editmesh.h"
#include "BKE_mball.h"
#include "BKE_mesh.h"
#include "BKE_armature.h"
#include "BKE_lattice.h"
+#include "bmesh.h"
+
#include "DEG_depsgraph.h"
#include "WM_types.h"
#include "ED_object.h"
+#include "ED_mesh.h"
+#include "ED_armature.h"
#include "MEM_guardedalloc.h"
@@ -149,6 +154,70 @@ static void armature_coords_and_quats_apply_with_mat4(bArmature *arm,
BKE_armature_transform(arm, mat, true);
}
+static void armature_coords_and_quats_apply(bArmature *arm,
+ const struct ElemData_Armature *elem_array)
+{
+ /* Avoid code duplication by using a unit matrix. */
+ float mat[4][4];
+ unit_m4(mat);
+ armature_coords_and_quats_apply_with_mat4(arm, elem_array, mat);
+}
+
+/* Edit Armature */
+static void edit_armature_coords_and_quats_get(const bArmature *arm,
+ struct ElemData_Armature *elem_array)
+{
+ struct ElemData_Armature *elem = elem_array;
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next, elem++) {
+
+#define COPY_PTR(member) memcpy(elem->member, ebone->member, sizeof(ebone->member))
+#define COPY_VAL(member) memcpy(&elem->member, &ebone->member, sizeof(ebone->member))
+ /* Unused for edit bones: arm_head, arm_tail, arm_roll */
+ COPY_PTR(head);
+ COPY_PTR(tail);
+ COPY_VAL(roll);
+ COPY_VAL(rad_tail);
+ COPY_VAL(rad_head);
+ COPY_VAL(dist);
+ COPY_VAL(xwidth);
+ COPY_VAL(zwidth);
+#undef COPY_PTR
+#undef COPY_VAL
+ }
+}
+
+static void edit_armature_coords_and_quats_apply_with_mat4(
+ bArmature *arm, const struct ElemData_Armature *elem_array, const float mat[4][4])
+{
+ const struct ElemData_Armature *elem = elem_array;
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next, elem++) {
+
+#define COPY_PTR(member) memcpy(ebone->member, elem->member, sizeof(ebone->member))
+#define COPY_VAL(member) memcpy(&ebone->member, &elem->member, sizeof(ebone->member))
+ /* Unused for edit bones: arm_head, arm_tail, arm_roll */
+ COPY_PTR(head);
+ COPY_PTR(tail);
+ COPY_VAL(roll);
+ COPY_VAL(rad_tail);
+ COPY_VAL(rad_head);
+ COPY_VAL(dist);
+ COPY_VAL(xwidth);
+ COPY_VAL(zwidth);
+#undef COPY_PTR
+#undef COPY_VAL
+ }
+ ED_armature_edit_transform(arm, mat, true);
+}
+
+static void edit_armature_coords_and_quats_apply(bArmature *arm,
+ const struct ElemData_Armature *elem_array)
+{
+ /* Avoid code duplication by using a unit matrix. */
+ float mat[4][4];
+ unit_m4(mat);
+ edit_armature_coords_and_quats_apply_with_mat4(arm, elem_array, mat);
+}
+
/* MetaBall */
struct ElemData_MetaBall {
@@ -183,6 +252,15 @@ static void metaball_coords_and_quats_apply_with_mat4(MetaBall *mb,
BKE_mball_transform(mb, mat, true);
}
+static void metaball_coords_and_quats_apply(MetaBall *mb,
+ const struct ElemData_MetaBall *elem_array)
+{
+ /* Avoid code duplication by using a unit matrix. */
+ float mat[4][4];
+ unit_m4(mat);
+ metaball_coords_and_quats_apply_with_mat4(mb, elem_array, mat);
+}
+
/** \} */
/* -------------------------------------------------------------------- */
@@ -195,6 +273,7 @@ static void metaball_coords_and_quats_apply_with_mat4(MetaBall *mb,
struct XFormObjectData {
ID *id;
+ bool is_edit_mode;
};
struct XFormObjectData_Mesh {
@@ -222,21 +301,32 @@ struct XFormObjectData_MetaBall {
struct ElemData_MetaBall elem_array[0];
};
-struct XFormObjectData *ED_object_data_xform_create(ID *id)
+struct XFormObjectData *ED_object_data_xform_create_ex(ID *id, bool is_edit_mode)
{
struct XFormObjectData *xod_base = NULL;
switch (GS(id->name)) {
case ID_ME: {
Mesh *me = (Mesh *)id;
- const int elem_array_len = me->totvert;
- struct XFormObjectData_Mesh *xod = MEM_mallocN(
- sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__);
- BKE_mesh_vert_coords_get(me, xod->elem_array);
- xod_base = &xod->base;
+ if (is_edit_mode) {
+ BMesh *bm = me->edit_mesh->bm;
+ const int elem_array_len = bm->totvert;
+ struct XFormObjectData_Mesh *xod = MEM_mallocN(
+ sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__);
+ BM_mesh_vert_coords_get(bm, xod->elem_array);
+ xod_base = &xod->base;
+ }
+ else {
+ const int elem_array_len = me->totvert;
+ struct XFormObjectData_Mesh *xod = MEM_mallocN(
+ sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__);
+ BKE_mesh_vert_coords_get(me, xod->elem_array);
+ xod_base = &xod->base;
+ }
break;
}
case ID_LT: {
- Lattice *lt = (Lattice *)id;
+ Lattice *lt_orig = (Lattice *)id;
+ Lattice *lt = is_edit_mode ? lt_orig->editlatt->latt : lt_orig;
const int elem_array_len = lt->pntsu * lt->pntsv * lt->pntsw;
struct XFormObjectData_Lattice *xod = MEM_mallocN(
sizeof(*xod) + (sizeof(*xod->elem_array) * elem_array_len), __func__);
@@ -251,23 +341,43 @@ struct XFormObjectData *ED_object_data_xform_create(ID *id)
/* We could support translation. */
break;
}
- const int elem_array_len = BKE_nurbList_verts_count(&cu->nurb);
+
+ ListBase *nurbs;
+ if (is_edit_mode) {
+ EditNurb *editnurb = cu->editnurb;
+ nurbs = &editnurb->nurbs;
+ }
+ else {
+ nurbs = &cu->nurb;
+ }
+
+ const int elem_array_len = BKE_nurbList_verts_count(nurbs);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list