594
static void maskModifier_copyData(ModifierData *md, ModifierData *target)
596
MaskModifierData *mmd = (MaskModifierData*) md;
597
MaskModifierData *tmmd = (MaskModifierData*) target;
599
strcpy(tmmd->vgroup, mmd->vgroup);
602
static CustomDataMask maskModifier_requiredDataMask(ModifierData *md)
604
return (1 << CD_MDEFORMVERT);
607
static void maskModifier_foreachObjectLink(
608
ModifierData *md, Object *ob,
609
void (*walk)(void *userData, Object *ob, Object **obpoin),
612
MaskModifierData *mmd = (MaskModifierData *)md;
613
walk(userData, ob, &mmd->ob_arm);
616
static void maskModifier_updateDepgraph(ModifierData *md, DagForest *forest,
617
Object *ob, DagNode *obNode)
619
MaskModifierData *mmd = (MaskModifierData *)md;
623
DagNode *armNode = dag_get_node(forest, mmd->ob_arm);
625
dag_add_relation(forest, armNode, obNode,
626
DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Mask Modifier");
630
static DerivedMesh *maskModifier_applyModifier(ModifierData *md, Object *ob,
631
DerivedMesh *derivedData,
632
int useRenderParams, int isFinalCalc)
634
MaskModifierData *mmd= (MaskModifierData *)md;
635
DerivedMesh *dm= derivedData, *result= NULL;
636
GHash *vertHash=NULL, *edgeHash, *faceHash;
637
GHashIterator *hashIter;
638
MDeformVert *dvert= NULL;
639
int numFaces=0, numEdges=0, numVerts=0;
640
int maxVerts, maxEdges, maxFaces;
643
/* Overview of Method:
644
* 1. Get the vertices that are in the vertexgroup of interest
645
* 2. Filter out unwanted geometry (i.e. not in vertexgroup), by populating mappings with new vs old indices
646
* 3. Make a new mesh containing only the mapping data
649
/* get original number of verts, edges, and faces */
650
maxVerts= dm->getNumVerts(dm);
651
maxEdges= dm->getNumEdges(dm);
652
maxFaces= dm->getNumFaces(dm);
654
/* check if we can just return the original mesh
655
* - must have verts and therefore verts assigned to vgroups to do anything useful
657
if ( !(ELEM(mmd->mode, MOD_MASK_MODE_ARM, MOD_MASK_MODE_VGROUP)) ||
658
(maxVerts == 0) || (ob->defbase.first == NULL) )
663
/* if mode is to use selected armature bones, aggregate the bone groups */
664
if (mmd->mode == MOD_MASK_MODE_ARM) /* --- using selected bones --- */
666
GHash *vgroupHash, *boneHash;
667
Object *oba= mmd->ob_arm;
671
/* check that there is armature object with bones to use, otherwise return original mesh */
672
if (ELEM(NULL, mmd->ob_arm, mmd->ob_arm->pose))
675
/* hashes for finding mapping of:
676
* - vgroups to indicies -> vgroupHash (string, int)
677
* - bones to vgroup indices -> boneHash (index of vgroup, dummy)
679
vgroupHash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
680
boneHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp);
682
/* build mapping of names of vertex groups to indices */
683
for (i = 0, def = ob->defbase.first; def; def = def->next, i++)
684
BLI_ghash_insert(vgroupHash, def->name, SET_INT_IN_POINTER(i));
686
/* get selected-posechannel <-> vertexgroup index mapping */
687
for (pchan= oba->pose->chanbase.first; pchan; pchan= pchan->next)
689
/* check if bone is selected */
690
// TODO: include checks for visibility too?
691
// FIXME: the depsgraph needs extensions to make this work in realtime...
692
if ( (pchan->bone) && (pchan->bone->flag & BONE_SELECTED) )
694
/* check if hash has group for this bone */
695
if (BLI_ghash_haskey(vgroupHash, pchan->name))
697
int defgrp_index= GET_INT_FROM_POINTER(BLI_ghash_lookup(vgroupHash, pchan->name));
699
/* add index to hash (store under key only) */
700
BLI_ghash_insert(boneHash, SET_INT_IN_POINTER(defgrp_index), pchan);
705
/* if no bones selected, free hashes and return original mesh */
706
if (BLI_ghash_size(boneHash) == 0)
708
BLI_ghash_free(vgroupHash, NULL, NULL);
709
BLI_ghash_free(boneHash, NULL, NULL);
714
/* repeat the previous check, but for dverts */
715
dvert= dm->getVertDataArray(dm, CD_MDEFORMVERT);
718
BLI_ghash_free(vgroupHash, NULL, NULL);
719
BLI_ghash_free(boneHash, NULL, NULL);
724
/* hashes for quickly providing a mapping from old to new - use key=oldindex, value=newindex */
725
vertHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp);
727
/* add vertices which exist in vertexgroups into vertHash for filtering */
728
for (i = 0; i < maxVerts; i++)
730
MDeformWeight *def_weight = NULL;
733
for (j= 0; j < dvert[i].totweight; j++)
735
if (BLI_ghash_haskey(boneHash, SET_INT_IN_POINTER(dvert[i].dw[j].def_nr)))
737
def_weight = &dvert[i].dw[j];
742
/* check if include vert in vertHash */
743
if (mmd->flag & MOD_MASK_INV) {
744
/* if this vert is in the vgroup, don't include it in vertHash */
745
if (def_weight) continue;
748
/* if this vert isn't in the vgroup, don't include it in vertHash */
749
if (!def_weight) continue;
752
/* add to ghash for verts (numVerts acts as counter for mapping) */
753
BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numVerts));
757
/* free temp hashes */
758
BLI_ghash_free(vgroupHash, NULL, NULL);
759
BLI_ghash_free(boneHash, NULL, NULL);
761
else /* --- Using Nominated VertexGroup only --- */
763
int defgrp_index = -1;
765
/* get index of vertex group */
770
/* find index by comparing names - SLOW... */
771
for (i = 0, def = ob->defbase.first; def; def = def->next, i++)
773
if (!strcmp(def->name, mmd->vgroup))
782
if (defgrp_index >= 0)
783
dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
785
/* if no vgroup (i.e. dverts) found, return the initial mesh */
786
if ((defgrp_index < 0) || (dvert == NULL))
789
/* hashes for quickly providing a mapping from old to new - use key=oldindex, value=newindex */
790
vertHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp);
792
/* add vertices which exist in vertexgroup into ghash for filtering */
793
for (i = 0; i < maxVerts; i++)
795
MDeformWeight *def_weight = NULL;
798
for (j= 0; j < dvert[i].totweight; j++)
800
if (dvert[i].dw[j].def_nr == defgrp_index)
802
def_weight = &dvert[i].dw[j];
807
/* check if include vert in vertHash */
808
if (mmd->flag & MOD_MASK_INV) {
809
/* if this vert is in the vgroup, don't include it in vertHash */
810
if (def_weight) continue;
813
/* if this vert isn't in the vgroup, don't include it in vertHash */
814
if (!def_weight) continue;
817
/* add to ghash for verts (numVerts acts as counter for mapping) */
818
BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numVerts));
823
/* hashes for quickly providing a mapping from old to new - use key=oldindex, value=newindex */
824
edgeHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp);
825
faceHash= BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp);
827
/* loop over edges and faces, and do the same thing to
828
* ensure that they only reference existing verts
830
for (i = 0; i < maxEdges; i++)
833
dm->getEdge(dm, i, &me);
835
/* only add if both verts will be in new mesh */
836
if ( BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v1)) &&
837
BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v2)) )
839
BLI_ghash_insert(edgeHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numEdges));
843
for (i = 0; i < maxFaces; i++)
846
dm->getFace(dm, i, &mf);
848
/* all verts must be available */
849
if ( BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v1)) &&
850
BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v2)) &&
851
BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v3)) &&
852
(mf.v4==0 || BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v4))) )
854
BLI_ghash_insert(faceHash, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(numFaces));
860
/* now we know the number of verts, edges and faces,
861
* we can create the new (reduced) mesh
863
result = CDDM_from_template(dm, numVerts, numEdges, numFaces);
866
/* using ghash-iterators, map data into new mesh */
868
for ( hashIter = BLI_ghashIterator_new(vertHash);
869
!BLI_ghashIterator_isDone(hashIter);
870
BLI_ghashIterator_step(hashIter) )
874
int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter));
875
int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter));
877
dm->getVert(dm, oldIndex, &source);
878
dest = CDDM_get_vert(result, newIndex);
880
DM_copy_vert_data(dm, result, oldIndex, newIndex, 1);
883
BLI_ghashIterator_free(hashIter);
886
for ( hashIter = BLI_ghashIterator_new(edgeHash);
887
!BLI_ghashIterator_isDone(hashIter);
888
BLI_ghashIterator_step(hashIter) )
892
int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter));
893
int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter));
895
dm->getEdge(dm, oldIndex, &source);
896
dest = CDDM_get_edge(result, newIndex);
898
source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1)));
899
source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2)));
901
DM_copy_edge_data(dm, result, oldIndex, newIndex, 1);
904
BLI_ghashIterator_free(hashIter);
907
for ( hashIter = BLI_ghashIterator_new(faceHash);
908
!BLI_ghashIterator_isDone(hashIter);
909
BLI_ghashIterator_step(hashIter) )
913
int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter));
914
int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter));
917
dm->getFace(dm, oldIndex, &source);
918
dest = CDDM_get_face(result, newIndex);
922
source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1)));
923
source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2)));
924
source.v3 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v3)));
926
source.v4 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v4)));
928
DM_copy_face_data(dm, result, oldIndex, newIndex, 1);
931
test_index_face(dest, &result->faceData, newIndex, (orig_v4 ? 4 : 3));
933
BLI_ghashIterator_free(hashIter);
935
/* recalculate normals */
936
CDDM_calc_normals(result);
939
BLI_ghash_free(vertHash, NULL, NULL);
940
BLI_ghash_free(edgeHash, NULL, NULL);
941
BLI_ghash_free(faceHash, NULL, NULL);
943
/* return the new mesh */
584
948
/* Array modifier: duplicates the object multiple times along an axis
6506
7142
cfra=bsystem_time(ob,(float)G.scene->r.cfra,0.0);
6508
/* table for vertice <-> particle relations (row totpart+1 is for yet unexploded verts) */
6509
vertpa = MEM_callocN(sizeof(int)*(totpart+1)*totvert, "explode_vertpatab");
6510
for(i=0; i<(totpart+1)*totvert; i++)
7144
/* hash table for vertice <-> particle relations */
7145
vertpahash= BLI_edgehash_new();
6513
7147
for (i=0; i<totface; i++) {
7148
/* do mindex + totvert to ensure the vertex index to be the first
7149
* with BLI_edgehashIterator_getKey */
6514
7150
if(facepa[i]==totpart || cfra <= (pars+facepa[i])->time)
6515
mindex = totpart*totvert;
7151
mindex = totvert+totpart;
6517
mindex = facepa[i]*totvert;
7153
mindex = totvert+facepa[i];
6519
7155
mf=CDDM_get_face(dm,i);
6521
/*set face vertices to exist in particle group*/
6522
vertpa[mindex+mf->v1] = 1;
6523
vertpa[mindex+mf->v2] = 1;
6524
vertpa[mindex+mf->v3] = 1;
7157
/* set face vertices to exist in particle group */
7158
BLI_edgehash_insert(vertpahash, mf->v1, mindex, NULL);
7159
BLI_edgehash_insert(vertpahash, mf->v2, mindex, NULL);
7160
BLI_edgehash_insert(vertpahash, mf->v3, mindex, NULL);
6526
vertpa[mindex+mf->v4] = 1;
6529
/*make new vertice indexes & count total vertices after duplication*/
6530
for(i=0; i<(totpart+1)*totvert; i++){
6532
vertpa[i] = totdup++;
6535
/*the final duplicated vertices*/
7162
BLI_edgehash_insert(vertpahash, mf->v4, mindex, NULL);
7165
/* make new vertice indexes & count total vertices after duplication */
7166
ehi= BLI_edgehashIterator_new(vertpahash);
7167
for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
7168
BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(totdup));
7171
BLI_edgehashIterator_free(ehi);
7173
/* the final duplicated vertices */
6536
7174
explode= CDDM_from_template(dm, totdup, 0,totface);
6537
dupvert= CDDM_get_verts(explode);
7175
/*dupvert= CDDM_get_verts(explode);*/
6539
7177
/* getting back to object space */
6540
7178
Mat4Invert(imat,ob->obmat);
6542
7180
psmd->psys->lattice = psys_get_lattice(ob, psmd->psys);
6544
/*duplicate & displace vertices*/
6545
for(i=0, pa=pars; i<=totpart; i++, pa++){
6547
psys_particle_on_emitter(ob, psmd,part->from,pa->num,-1,pa->fuv,pa->foffset,loc0,nor,0,0,0,0);
7182
/* duplicate & displace vertices */
7183
ehi= BLI_edgehashIterator_new(vertpahash);
7184
for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
7188
/* get particle + vertex from hash */
7189
BLI_edgehashIterator_getKey(ehi, &j, &i);
7191
v= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
7193
dm->getVert(dm, j, &source);
7194
dest = CDDM_get_vert(explode,v);
7196
DM_copy_vert_data(dm,explode,j,v,1);
7203
/* get particle state */
7204
psys_particle_on_emitter(psmd,part->from,pa->num,-1,pa->fuv,pa->foffset,loc0,nor,0,0,0,0);
6548
7205
Mat4MulVecfl(ob->obmat,loc0);
6550
7207
state.time=cfra;
6551
7208
psys_get_particle_state(ob,psmd->psys,i,&state,1);
6554
for(j=0; j<totvert; j++){
6555
v=vertpa[i*totvert+j];
6560
dm->getVert(dm, j, &source);
6561
dest = CDDM_get_vert(explode,v);
6563
DM_copy_vert_data(dm,explode,j,v,1);
6567
vertco=CDDM_get_vert(explode,v)->co;
6569
Mat4MulVecfl(ob->obmat,vertco);
6571
VECSUB(vertco,vertco,loc0);
6573
/* apply rotation, size & location */
6574
QuatMulVecf(state.rot,vertco);
6575
VecMulf(vertco,pa->size);
6576
VECADD(vertco,vertco,state.co);
6578
Mat4MulVecfl(imat,vertco);
7210
vertco=CDDM_get_vert(explode,v)->co;
7212
Mat4MulVecfl(ob->obmat,vertco);
7214
VECSUB(vertco,vertco,loc0);
7216
/* apply rotation, size & location */
7217
QuatMulVecf(state.rot,vertco);
7218
VecMulf(vertco,pa->size);
7219
VECADD(vertco,vertco,state.co);
7221
Mat4MulVecfl(imat,vertco);
7224
BLI_edgehashIterator_free(ehi);
6584
7226
/*map new vertices to faces*/
6585
7227
for (i=0; i<totface; i++) {
6994
7732
dm->release(dm);
7738
static void shrinkwrapModifier_initData(ModifierData *md)
7740
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
7741
smd->shrinkType = MOD_SHRINKWRAP_NEAREST_SURFACE;
7742
smd->shrinkOpts = MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR;
7743
smd->keepDist = 0.0f;
7746
smd->auxTarget = NULL;
7749
static void shrinkwrapModifier_copyData(ModifierData *md, ModifierData *target)
7751
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*)md;
7752
ShrinkwrapModifierData *tsmd = (ShrinkwrapModifierData*)target;
7754
tsmd->target = smd->target;
7755
tsmd->auxTarget = smd->auxTarget;
7757
strcpy(tsmd->vgroup_name, smd->vgroup_name);
7759
tsmd->keepDist = smd->keepDist;
7760
tsmd->shrinkType= smd->shrinkType;
7761
tsmd->shrinkOpts= smd->shrinkOpts;
7762
tsmd->projAxis = smd->projAxis;
7763
tsmd->subsurfLevels = smd->subsurfLevels;
7766
CustomDataMask shrinkwrapModifier_requiredDataMask(ModifierData *md)
7768
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md;
7769
CustomDataMask dataMask = 0;
7771
/* ask for vertexgroups if we need them */
7772
if(smd->vgroup_name[0])
7773
dataMask |= (1 << CD_MDEFORMVERT);
7775
if(smd->shrinkType == MOD_SHRINKWRAP_PROJECT
7776
&& smd->projAxis == MOD_SHRINKWRAP_PROJECT_OVER_NORMAL)
7777
dataMask |= (1 << CD_MVERT);
7782
static int shrinkwrapModifier_isDisabled(ModifierData *md)
7784
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
7785
return !smd->target;
7789
static void shrinkwrapModifier_foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, void *userData)
7791
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
7793
walk(userData, ob, &smd->target);
7794
walk(userData, ob, &smd->auxTarget);
7797
static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
7799
DerivedMesh *dm = NULL;
7800
CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(md);
7802
/* We implement requiredDataMask but thats not really usefull since mesh_calc_modifiers pass a NULL derivedData or without the modified vertexs applied */
7805
if(derivedData) dm = CDDM_copy(derivedData);
7806
else if(ob->type==OB_MESH) dm = CDDM_from_mesh(ob->data, ob);
7809
if(dataMask & CD_MVERT)
7811
CDDM_apply_vert_coords(dm, vertexCos);
7812
CDDM_calc_normals(dm);
7816
shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
7822
static void shrinkwrapModifier_deformVertsEM(ModifierData *md, Object *ob, EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
7824
DerivedMesh *dm = NULL;
7825
CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(md);
7829
if(derivedData) dm = CDDM_copy(derivedData);
7830
else if(ob->type==OB_MESH) dm = CDDM_from_editmesh(editData, ob->data);
7833
if(dataMask & CD_MVERT)
7835
CDDM_apply_vert_coords(dm, vertexCos);
7836
CDDM_calc_normals(dm);
7840
shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
7846
static void shrinkwrapModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
7848
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
7851
dag_add_relation(forest, dag_get_node(forest, smd->target), obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Shrinkwrap Modifier");
7854
dag_add_relation(forest, dag_get_node(forest, smd->auxTarget), obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Shrinkwrap Modifier");
7858
static void simpledeformModifier_initData(ModifierData *md)
7860
SimpleDeformModifierData *smd = (SimpleDeformModifierData*) md;
7862
smd->mode = MOD_SIMPLEDEFORM_MODE_TWIST;
7866
smd->factor = 0.35f;
7867
smd->limit[0] = 0.0f;
7868
smd->limit[1] = 1.0f;
7871
static void simpledeformModifier_copyData(ModifierData *md, ModifierData *target)
7873
SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md;
7874
SimpleDeformModifierData *tsmd = (SimpleDeformModifierData*)target;
7876
tsmd->mode = smd->mode;
7877
tsmd->axis = smd->axis;
7878
tsmd->origin= smd->origin;
7879
tsmd->factor= smd->factor;
7880
memcpy(tsmd->limit, smd->limit, sizeof(tsmd->limit));
7883
static CustomDataMask simpledeformModifier_requiredDataMask(ModifierData *md)
7885
SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md;
7886
CustomDataMask dataMask = 0;
7888
/* ask for vertexgroups if we need them */
7889
if(smd->vgroup_name[0])
7890
dataMask |= (1 << CD_MDEFORMVERT);
7895
static void simpledeformModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
7897
SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md;
7898
walk(userData, ob, &smd->origin);
7901
static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
7903
SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md;
7906
dag_add_relation(forest, dag_get_node(forest, smd->origin), obNode, DAG_RL_OB_DATA, "SimpleDeform Modifier");
7909
static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
7911
DerivedMesh *dm = NULL;
7912
CustomDataMask dataMask = simpledeformModifier_requiredDataMask(md);
7914
/* We implement requiredDataMask but thats not really usefull since mesh_calc_modifiers pass a NULL derivedData or without the modified vertexs applied */
7917
if(derivedData) dm = CDDM_copy(derivedData);
7918
else if(ob->type==OB_MESH) dm = CDDM_from_mesh(ob->data, ob);
7921
if(dataMask & CD_MVERT)
7923
CDDM_apply_vert_coords(dm, vertexCos);
7924
CDDM_calc_normals(dm);
7928
SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, dm, vertexCos, numVerts);
7935
static void simpledeformModifier_deformVertsEM(ModifierData *md, Object *ob, EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
7937
DerivedMesh *dm = NULL;
7938
CustomDataMask dataMask = simpledeformModifier_requiredDataMask(md);
7940
/* We implement requiredDataMask but thats not really usefull since mesh_calc_modifiers pass a NULL derivedData or without the modified vertexs applied */
7943
if(derivedData) dm = CDDM_copy(derivedData);
7944
else if(ob->type==OB_MESH) dm = CDDM_from_editmesh(editData, ob->data);
7947
if(dataMask & CD_MVERT)
7949
CDDM_apply_vert_coords(dm, vertexCos);
7950
CDDM_calc_normals(dm);
7954
SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, dm, vertexCos, numVerts);
6999
7962
static ModifierTypeInfo typeArr[NUM_MODIFIER_TYPES];