Blender V5.0
transform_convert_mesh_edge.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "MEM_guardedalloc.h"
10
11#include "BLI_math_matrix.h"
12#include "BLI_math_vector.h"
13
14#include "BKE_context.hh"
15#include "BKE_customdata.hh"
16#include "BKE_editmesh.hh"
17
18#include "transform.hh"
19#include "transform_convert.hh"
20
21namespace blender::ed::transform {
22
23/* -------------------------------------------------------------------- */
26
27static void createTransEdge(bContext * /*C*/, TransInfo *t)
28{
30
31 BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
32 TransData *td = nullptr;
33 BMEdge *eed;
34 BMIter iter;
35 float mtx[3][3], smtx[3][3];
36 int count = 0, countsel = 0;
37 const bool is_prop_edit = (t->flag & T_PROP_EDIT) != 0;
38 const bool is_prop_connected = (t->flag & T_PROP_CONNECTED) != 0;
39 int cd_edge_float_offset;
40
41 BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
44 countsel++;
45 }
46 if (is_prop_edit) {
47 count++;
48 }
49 }
50 }
51
52 if (((is_prop_edit && !is_prop_connected) ? count : countsel) == 0) {
53 tc->data_len = 0;
54 continue;
55 }
56
57 if (is_prop_edit) {
58 tc->data_len = count;
59 }
60 else {
61 tc->data_len = countsel;
62 }
63
64 td = tc->data = MEM_calloc_arrayN<TransData>(tc->data_len, "TransCrease");
65
66 copy_m3_m4(mtx, tc->obedit->object_to_world().ptr());
68
69 /* Create data we need. */
70 if (t->mode == TFM_BWEIGHT) {
71 if (!CustomData_has_layer_named(&em->bm->edata, CD_PROP_FLOAT, "bevel_weight_edge")) {
72 BM_data_layer_add_named(em->bm, &em->bm->edata, CD_PROP_FLOAT, "bevel_weight_edge");
73 }
74 cd_edge_float_offset = CustomData_get_offset_named(
75 &em->bm->edata, CD_PROP_FLOAT, "bevel_weight_edge");
76 }
77 else { /* `if (t->mode == TFM_EDGE_CREASE) {`. */
79 if (!CustomData_has_layer_named(&em->bm->edata, CD_PROP_FLOAT, "crease_edge")) {
80 BM_data_layer_add_named(em->bm, &em->bm->edata, CD_PROP_FLOAT, "crease_edge");
81 }
82 cd_edge_float_offset = CustomData_get_offset_named(
83 &em->bm->edata, CD_PROP_FLOAT, "crease_edge");
84 }
85
86 BLI_assert(cd_edge_float_offset != -1);
87
88 BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
90 (BM_elem_flag_test(eed, BM_ELEM_SELECT) || is_prop_edit))
91 {
92 float *fl_ptr;
93 /* Need to set center for center calculations. */
94 mid_v3_v3v3(td->center, eed->v1->co, eed->v2->co);
95
96 td->loc = nullptr;
98 td->flag = TD_SELECTED;
99 }
100 else {
101 td->flag = 0;
102 }
103
104 copy_m3_m3(td->smtx, smtx);
105 copy_m3_m3(td->mtx, mtx);
106
107 fl_ptr = static_cast<float *>(BM_ELEM_CD_GET_VOID_P(eed, cd_edge_float_offset));
108 td->val = fl_ptr;
109 td->ival = *fl_ptr;
110
111 td++;
112 }
113 }
114 }
115}
116
118{
120 DEG_id_tag_update(static_cast<ID *>(tc->obedit->data), ID_RECALC_GEOMETRY);
121 }
122}
123
125
127 /*flags*/ T_EDIT,
128 /*create_trans_data*/ createTransEdge,
129 /*recalc_data*/ recalcData_mesh_edge,
130 /*special_aftertrans_update*/ nullptr,
131};
132
133} // namespace blender::ed::transform
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_has_layer_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
int CustomData_get_offset_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
Definition editmesh.cc:61
#define BLI_assert(a)
Definition BLI_assert.h:46
void pseudoinverse_m3_m3(float inverse[3][3], const float mat[3][3], float epsilon)
void copy_m3_m3(float m1[3][3], const float m2[3][3])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
#define PSEUDOINVERSE_EPSILON
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
void DEG_id_tag_update(ID *id, unsigned int flags)
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1074
@ CD_PROP_FLOAT
Read Guarded memory(de)allocation.
@ BM_ELEM_HIDDEN
@ BM_ELEM_SELECT
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_elem_flag_test(ele, hflag)
void BM_data_layer_add_named(BMesh *bm, CustomData *data, int type, const StringRef name)
#define BM_ITER_MESH(ele, iter, bm, itype)
@ BM_EDGES_OF_MESH
int count
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:123
static void createTransEdge(bContext *, TransInfo *t)
TransConvertTypeInfo TransConvertType_MeshEdge
static void recalcData_mesh_edge(TransInfo *t)
BMVert * v1
BMVert * v2
float co[3]
CustomData edata
Definition DNA_ID.h:414
#define FOREACH_TRANS_DATA_CONTAINER(t, th)
Definition transform.hh:42
conversion and adaptation of different datablocks to a common struct.