39
39
#include "BKE_cdderivedmesh.h"
40
40
#include "BKE_modifier.h"
41
#include "BKE_tessmesh.h"
42
41
#include "BKE_mesh.h"
44
42
#include "BKE_bmesh.h" /* only for defines */
46
46
#include "DNA_object_types.h"
48
48
#include "MEM_guardedalloc.h"
65
65
static void copyData(ModifierData *md, ModifierData *target)
67
BevelModifierData *bmd = (BevelModifierData*) md;
68
BevelModifierData *tbmd = (BevelModifierData*) target;
67
BevelModifierData *bmd = (BevelModifierData *) md;
68
BevelModifierData *tbmd = (BevelModifierData *) target;
70
70
tbmd->value = bmd->value;
71
71
tbmd->res = bmd->res;
91
// #define USE_BM_BEVEL_OP_AS_MOD
93
93
#ifdef USE_BM_BEVEL_OP_AS_MOD
97
* this bevel calls the operator which is missing many of the options
98
* which the bevel modifier in trunk has.
97
* this bevel calls the new bevel code (added since 2.64)
98
* which is missing many of the options which the bevel modifier from 2.4x has.
99
99
* - no vertex bevel
100
100
* - no weight bevel
102
102
* These will need to be added to the bmesh operator.
105
* note: this code is very close to MOD_edgesplit.c.
106
* note: if 0'd code from trunk included below.
108
105
static DerivedMesh *applyModifier(ModifierData *md, struct Object *UNUSED(ob),
110
int UNUSED(useRenderParams),
111
int UNUSED(isFinalCalc))
107
ModifierApplyFlag UNUSED(flag))
113
109
DerivedMesh *result;
118
BevelModifierData *bmd = (BevelModifierData*) md;
119
float threshold = cos((bmd->bevel_angle + 0.00001) * M_PI / 180.0);
121
em = DM_to_editbmesh(dm, NULL, FALSE);
124
BM_mesh_normals_update(bm, FALSE);
113
BevelModifierData *bmd = (BevelModifierData *) md;
114
const float threshold = cosf((bmd->bevel_angle + 0.00001f) * (float)M_PI / 180.0f);
115
const int segments = 16; /* XXX */
117
bm = DM_to_bmesh(dm);
127
119
if (bmd->lim_flags & BME_BEVEL_ANGLE) {
128
120
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
129
121
/* check for 1 edge having 2 face users */
132
(l2= e->l->radial_next) != l1)
134
if (dot_v3v3(l1->f->no, l2->f->no) < threshold) {
135
BMO_elem_flag_enable(bm, e, EDGE_MARK);
123
if (BM_edge_loop_pair(e, &l_a, &l_b)) {
124
if (dot_v3v3(l_a->f->no, l_b->f->no) < threshold) {
125
BM_elem_flag_enable(e, BM_ELEM_TAG);
126
BM_elem_flag_enable(e->v1, BM_ELEM_TAG);
127
BM_elem_flag_enable(e->v2, BM_ELEM_TAG);
141
133
/* crummy, is there a way just to operator on all? - campbell */
142
134
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
143
BMO_elem_flag_enable(bm, e, EDGE_MARK);
135
if (BM_edge_is_manifold(e)) {
136
BM_elem_flag_enable(e, BM_ELEM_TAG);
137
BM_elem_flag_enable(e->v1, BM_ELEM_TAG);
138
BM_elem_flag_enable(e->v2, BM_ELEM_TAG);
147
BMO_op_callf(bm, "bevel geom=%fe percent=%f use_even=%b use_dist=%b",
148
EDGE_MARK, bmd->value, (bmd->flags & BME_BEVEL_EVEN) != 0, (bmd->flags & BME_BEVEL_DIST) != 0);
151
BLI_assert(em->looptris == NULL);
152
result = CDDM_from_BMEditMesh(em, NULL, TRUE, FALSE);
143
BM_mesh_bevel(bm, bmd->value, segments, bmd->flags & BME_BEVEL_VERT);
145
result = CDDM_from_bmesh(bm, TRUE);
147
BLI_assert(bm->toolflagpool == NULL); /* make sure we never alloc'd this */
150
CDDM_calc_normals(result);
160
156
#else /* from trunk, see note above */
162
158
static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
163
DerivedMesh *derivedData,
164
int UNUSED(useRenderParams),
165
int UNUSED(isFinalCalc))
159
DerivedMesh *derivedData,
160
ModifierApplyFlag UNUSED(flag))
167
162
DerivedMesh *result;
170
165
/*bDeformGroup *def;*/
171
166
int /*i,*/ options, defgrp_index = -1;
172
BevelModifierData *bmd = (BevelModifierData*) md;
167
BevelModifierData *bmd = (BevelModifierData *) md;
174
169
options = bmd->flags | bmd->val_flags | bmd->lim_flags | bmd->e_flags;
177
172
if ((options & BME_BEVEL_VWEIGHT) && bmd->defgrp_name[0]) {
178
173
defgrp_index = defgroup_name_index(ob, bmd->defgrp_name);
179
if (defgrp_index < 0) {
174
if (defgrp_index == -1) {
180
175
options &= ~BME_BEVEL_VWEIGHT;
185
em = DM_to_editbmesh(derivedData, NULL, FALSE);
186
BME_bevel(em, bmd->value, bmd->res, options, defgrp_index, DEG2RADF(bmd->bevel_angle), NULL, FALSE);
187
BLI_assert(em->looptris == NULL);
188
result = CDDM_from_BMEditMesh(em, NULL, TRUE, FALSE);
180
bm = DM_to_bmesh(derivedData);
181
BME_bevel(bm, bmd->value, bmd->res, options, defgrp_index, DEG2RADF(bmd->bevel_angle), NULL);
182
result = CDDM_from_bmesh(bm, TRUE);
192
185
/* until we allow for dirty normal flag, always calc,
193
186
* note: calculating on the CDDM is faster then the BMesh equivalent */
201
194
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
202
struct BMEditMesh *UNUSED(editData),
203
DerivedMesh *derivedData)
195
struct BMEditMesh *UNUSED(editData),
196
DerivedMesh *derivedData)
205
return applyModifier(md, ob, derivedData, 0, 1);
198
return applyModifier(md, ob, derivedData, MOD_APPLY_USECACHE);
211
204
/* structName */ "BevelModifierData",
212
205
/* structSize */ sizeof(BevelModifierData),
213
206
/* type */ eModifierTypeType_Constructive,
214
/* flags */ eModifierTypeFlag_AcceptsMesh
215
| eModifierTypeFlag_SupportsEditmode
216
| eModifierTypeFlag_EnableInEditmode,
207
/* flags */ eModifierTypeFlag_AcceptsMesh |
208
eModifierTypeFlag_SupportsEditmode |
209
eModifierTypeFlag_EnableInEditmode,
218
211
/* copyData */ copyData,
219
212
/* deformVerts */ NULL,
228
221
/* isDisabled */ NULL,
229
222
/* updateDepgraph */ NULL,
230
223
/* dependsOnTime */ NULL,
231
/* dependsOnNormals */ NULL,
224
/* dependsOnNormals */ NULL,
232
225
/* foreachObjectLink */ NULL,
233
226
/* foreachIDLink */ NULL,
234
227
/* foreachTexLink */ NULL,