Blender V4.3
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
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
21/* -------------------------------------------------------------------- */
25static void createTransEdge(bContext * /*C*/, TransInfo *t)
26{
28
29 BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
30 TransData *td = nullptr;
31 BMEdge *eed;
32 BMIter iter;
33 float mtx[3][3], smtx[3][3];
34 int count = 0, countsel = 0;
35 const bool is_prop_edit = (t->flag & T_PROP_EDIT) != 0;
36 const bool is_prop_connected = (t->flag & T_PROP_CONNECTED) != 0;
37 int cd_edge_float_offset;
38
39 BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
42 countsel++;
43 }
44 if (is_prop_edit) {
45 count++;
46 }
47 }
48 }
49
50 if (((is_prop_edit && !is_prop_connected) ? count : countsel) == 0) {
51 tc->data_len = 0;
52 continue;
53 }
54
55 if (is_prop_edit) {
56 tc->data_len = count;
57 }
58 else {
59 tc->data_len = countsel;
60 }
61
62 td = tc->data = static_cast<TransData *>(
63 MEM_callocN(tc->data_len * sizeof(TransData), "TransCrease"));
64
65 copy_m3_m4(mtx, tc->obedit->object_to_world().ptr());
67
68 /* Create data we need. */
69 if (t->mode == TFM_BWEIGHT) {
70 if (!CustomData_has_layer_named(&em->bm->edata, CD_PROP_FLOAT, "bevel_weight_edge")) {
71 BM_data_layer_add_named(em->bm, &em->bm->edata, CD_PROP_FLOAT, "bevel_weight_edge");
72 }
73 cd_edge_float_offset = CustomData_get_offset_named(
74 &em->bm->edata, CD_PROP_FLOAT, "bevel_weight_edge");
75 }
76 else { /* `if (t->mode == TFM_EDGE_CREASE) {`. */
78 if (!CustomData_has_layer_named(&em->bm->edata, CD_PROP_FLOAT, "crease_edge")) {
79 BM_data_layer_add_named(em->bm, &em->bm->edata, CD_PROP_FLOAT, "crease_edge");
80 }
81 cd_edge_float_offset = CustomData_get_offset_named(
82 &em->bm->edata, CD_PROP_FLOAT, "crease_edge");
83 }
84
85 BLI_assert(cd_edge_float_offset != -1);
86
87 BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
89 (BM_elem_flag_test(eed, BM_ELEM_SELECT) || is_prop_edit))
90 {
91 float *fl_ptr;
92 /* Need to set center for center calculations. */
93 mid_v3_v3v3(td->center, eed->v1->co, eed->v2->co);
94
95 td->loc = nullptr;
97 td->flag = TD_SELECTED;
98 }
99 else {
100 td->flag = 0;
101 }
102
103 copy_m3_m3(td->smtx, smtx);
104 copy_m3_m3(td->mtx, mtx);
105
106 td->ext = nullptr;
107
108 fl_ptr = static_cast<float *>(BM_ELEM_CD_GET_VOID_P(eed, cd_edge_float_offset));
109 td->val = fl_ptr;
110 td->ival = *fl_ptr;
111
112 td++;
113 }
114 }
115 }
116}
117
119{
121 DEG_id_tag_update(static_cast<ID *>(tc->obedit->data), ID_RECALC_GEOMETRY);
122 }
123}
124
128 /*flags*/ T_EDIT,
129 /*create_trans_data*/ createTransEdge,
130 /*recalc_data*/ recalcData_mesh_edge,
131 /*special_aftertrans_update*/ nullptr,
132};
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:63
#define BLI_assert(a)
Definition BLI_assert.h:50
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:1041
@ CD_PROP_FLOAT
@ TFM_BWEIGHT
@ TFM_EDGE_CREASE
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 char *name)
#define BM_ITER_MESH(ele, iter, bm, itype)
@ BM_EDGES_OF_MESH
int count
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
BMVert * v1
BMVert * v2
float co[3]
CustomData edata
Definition DNA_ID.h:413
float smtx[3][3]
float mtx[3][3]
TransDataExtension * ext
eTfmMode mode
Definition transform.hh:517
eTFlag flag
Definition transform.hh:523
@ T_PROP_CONNECTED
Definition transform.hh:99
@ T_PROP_EDIT
Definition transform.hh:98
@ T_EDIT
Definition transform.hh:91
#define FOREACH_TRANS_DATA_CONTAINER(t, th)
Definition transform.hh:854
conversion and adaptation of different datablocks to a common struct.
static void recalcData_mesh_edge(TransInfo *t)
TransConvertTypeInfo TransConvertType_MeshEdge
static void createTransEdge(bContext *, TransInfo *t)
@ TD_SELECTED