53
53
static void initData(ModifierData *md)
55
CastModifierData *cmd = (CastModifierData*) md;
55
CastModifierData *cmd = (CastModifierData *) md;
58
58
cmd->radius = 0.0f;
60
cmd->flag = MOD_CAST_X | MOD_CAST_Y | MOD_CAST_Z
61
| MOD_CAST_SIZE_FROM_RADIUS;
60
cmd->flag = MOD_CAST_X | MOD_CAST_Y | MOD_CAST_Z | MOD_CAST_SIZE_FROM_RADIUS;
62
61
cmd->type = MOD_CAST_TYPE_SPHERE;
63
62
cmd->defgrp_name[0] = '\0';
64
63
cmd->object = NULL;
68
67
static void copyData(ModifierData *md, ModifierData *target)
70
CastModifierData *cmd = (CastModifierData*) md;
71
CastModifierData *tcmd = (CastModifierData*) target;
69
CastModifierData *cmd = (CastModifierData *) md;
70
CastModifierData *tcmd = (CastModifierData *) target;
73
72
tcmd->fac = cmd->fac;
74
73
tcmd->radius = cmd->radius;
82
81
static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
84
CastModifierData *cmd = (CastModifierData*) md;
83
CastModifierData *cmd = (CastModifierData *) md;
87
flag = cmd->flag & (MOD_CAST_X|MOD_CAST_Y|MOD_CAST_Z);
86
flag = cmd->flag & (MOD_CAST_X | MOD_CAST_Y | MOD_CAST_Z);
89
88
if ((cmd->fac == 0.0f) || flag == 0) return 1;
105
104
static void foreachObjectLink(
106
ModifierData *md, Object *ob,
107
void (*walk)(void *userData, Object *ob, Object **obpoin),
105
ModifierData *md, Object *ob,
106
void (*walk)(void *userData, Object *ob, Object **obpoin),
110
CastModifierData *cmd = (CastModifierData*) md;
109
CastModifierData *cmd = (CastModifierData *) md;
112
walk (userData, ob, &cmd->object);
111
walk(userData, ob, &cmd->object);
115
114
static void updateDepgraph(ModifierData *md, DagForest *forest,
116
struct Scene *UNUSED(scene),
115
struct Scene *UNUSED(scene),
120
CastModifierData *cmd = (CastModifierData*) md;
119
CastModifierData *cmd = (CastModifierData *) md;
122
121
if (cmd->object) {
123
122
DagNode *curNode = dag_get_node(forest, cmd->object);
125
124
dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA,
130
129
static void sphere_do(
131
CastModifierData *cmd, Object *ob, DerivedMesh *dm,
132
float (*vertexCos)[3], int numVerts)
130
CastModifierData *cmd, Object *ob, DerivedMesh *dm,
131
float (*vertexCos)[3], int numVerts)
134
133
MDeformVert *dvert = NULL;
200
199
* with or w/o a vgroup. With lots of if's in the code below,
201
200
* further optimization's are possible, if needed */
202
201
if (dvert) { /* with a vgroup */
203
MDeformVert *dv= dvert;
202
MDeformVert *dv = dvert;
204
203
float fac_orig = fac;
205
204
for (i = 0; i < numVerts; i++, dv++) {
225
224
if (len_v3(vec) > cmd->radius) continue;
228
weight= defvert_find_weight(dv, defgrp_index);
227
weight = defvert_find_weight(dv, defgrp_index);
229
228
if (weight <= 0.0f) continue;
231
230
fac = fac_orig * weight;
234
233
normalize_v3(vec);
236
235
if (flag & MOD_CAST_X)
237
tmp_co[0] = fac*vec[0]*len + facm*tmp_co[0];
236
tmp_co[0] = fac * vec[0] * len + facm * tmp_co[0];
238
237
if (flag & MOD_CAST_Y)
239
tmp_co[1] = fac*vec[1]*len + facm*tmp_co[1];
238
tmp_co[1] = fac * vec[1] * len + facm * tmp_co[1];
240
239
if (flag & MOD_CAST_Z)
241
tmp_co[2] = fac*vec[2]*len + facm*tmp_co[2];
240
tmp_co[2] = fac * vec[2] * len + facm * tmp_co[2];
244
243
if (flag & MOD_CAST_USE_OB_TRANSFORM) {
280
279
normalize_v3(vec);
282
281
if (flag & MOD_CAST_X)
283
tmp_co[0] = fac*vec[0]*len + facm*tmp_co[0];
282
tmp_co[0] = fac * vec[0] * len + facm * tmp_co[0];
284
283
if (flag & MOD_CAST_Y)
285
tmp_co[1] = fac*vec[1]*len + facm*tmp_co[1];
284
tmp_co[1] = fac * vec[1] * len + facm * tmp_co[1];
286
285
if (flag & MOD_CAST_Z)
287
tmp_co[2] = fac*vec[2]*len + facm*tmp_co[2];
286
tmp_co[2] = fac * vec[2] * len + facm * tmp_co[2];
290
289
if (flag & MOD_CAST_USE_OB_TRANSFORM) {
302
301
static void cuboid_do(
303
CastModifierData *cmd, Object *ob, DerivedMesh *dm,
304
float (*vertexCos)[3], int numVerts)
302
CastModifierData *cmd, Object *ob, DerivedMesh *dm,
303
float (*vertexCos)[3], int numVerts)
306
305
MDeformVert *dvert = NULL;
307
306
Object *ctrl_ob = NULL;
370
369
/* let the center of the ctrl_ob be part of the bound box: */
371
DO_MINMAX(center, min, max);
370
minmax_v3v3_v3(min, max, center);
373
372
for (i = 0; i < numVerts; i++) {
374
373
sub_v3_v3v3(vec, vertexCos[i], center);
375
DO_MINMAX(vec, min, max);
374
minmax_v3v3_v3(min, max, vec);
379
378
for (i = 0; i < numVerts; i++) {
380
DO_MINMAX(vertexCos[i], min, max);
379
minmax_v3v3_v3(min, max, vertexCos[i]);
384
383
/* we want a symmetric bound box around the origin */
385
if (fabs(min[0]) > fabs(max[0])) max[0] = fabs(min[0]);
386
if (fabs(min[1]) > fabs(max[1])) max[1] = fabs(min[1]);
387
if (fabs(min[2]) > fabs(max[2])) max[2] = fabs(min[2]);
384
if (fabsf(min[0]) > fabsf(max[0])) max[0] = fabsf(min[0]);
385
if (fabsf(min[1]) > fabsf(max[1])) max[1] = fabsf(min[1]);
386
if (fabsf(min[2]) > fabsf(max[2])) max[2] = fabsf(min[2]);
388
387
min[0] = -max[0];
389
388
min[1] = -max[1];
390
389
min[2] = -max[2];
424
423
if (has_radius) {
425
424
if (fabsf(tmp_co[0]) > cmd->radius ||
426
fabsf(tmp_co[1]) > cmd->radius ||
427
fabsf(tmp_co[2]) > cmd->radius) continue;
425
fabsf(tmp_co[1]) > cmd->radius ||
426
fabsf(tmp_co[2]) > cmd->radius)
430
432
for (j = 0; j < dvert[i].totweight; ++j) {
522
524
if (has_radius) {
523
525
if (fabsf(tmp_co[0]) > cmd->radius ||
524
fabsf(tmp_co[1]) > cmd->radius ||
525
fabsf(tmp_co[2]) > cmd->radius) continue;
526
fabsf(tmp_co[1]) > cmd->radius ||
527
fabsf(tmp_co[2]) > cmd->radius)
575
580
static void deformVerts(ModifierData *md, Object *ob,
576
DerivedMesh *derivedData,
577
float (*vertexCos)[3],
579
int UNUSED(useRenderParams),
580
int UNUSED(isFinalCalc))
581
DerivedMesh *derivedData,
582
float (*vertexCos)[3],
584
ModifierApplyFlag UNUSED(flag))
582
586
DerivedMesh *dm = NULL;
583
587
CastModifierData *cmd = (CastModifierData *)md;
598
602
static void deformVertsEM(
599
ModifierData *md, Object *ob, struct BMEditMesh *editData,
600
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
603
ModifierData *md, Object *ob, struct BMEditMesh *editData,
604
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
602
606
DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, 0);
603
607
CastModifierData *cmd = (CastModifierData *)md;
619
623
/* structName */ "CastModifierData",
620
624
/* structSize */ sizeof(CastModifierData),
621
625
/* type */ eModifierTypeType_OnlyDeform,
622
/* flags */ eModifierTypeFlag_AcceptsCVs
623
| eModifierTypeFlag_SupportsEditmode,
626
/* flags */ eModifierTypeFlag_AcceptsCVs |
627
eModifierTypeFlag_SupportsEditmode,
625
629
/* copyData */ copyData,
626
630
/* deformVerts */ deformVerts,