Fix for [#20249] duplicating a mesh in edit mode with a lattice modifier

Removed lattice and curve modifiers from being correctable for crazy space - it didn't work and was giving weird results.
This commit is contained in:
Matt Ebb 2009-12-09 01:53:04 +00:00
parent e9b417c1bf
commit 2ef0ee76a0
4 changed files with 10 additions and 14 deletions

@ -280,7 +280,7 @@ void modifier_copyData(struct ModifierData *md, struct ModifierData *ta
int modifier_dependsOnTime(struct ModifierData *md); int modifier_dependsOnTime(struct ModifierData *md);
int modifier_supportsMapping(struct ModifierData *md); int modifier_supportsMapping(struct ModifierData *md);
int modifier_couldBeCage(struct ModifierData *md); int modifier_couldBeCage(struct ModifierData *md);
int modifier_isDeformer(struct ModifierData *md); int modifier_isCorrectableDeformed(struct ModifierData *md);
int modifier_sameTopology(ModifierData *md); int modifier_sameTopology(ModifierData *md);
int modifier_isEnabled(struct ModifierData *md, int required_mode); int modifier_isEnabled(struct ModifierData *md, int required_mode);
void modifier_setError(struct ModifierData *md, char *format, ...); void modifier_setError(struct ModifierData *md, char *format, ...);
@ -303,7 +303,7 @@ int modifiers_isParticleEnabled(struct Object *ob);
struct Object *modifiers_isDeformedByArmature(struct Object *ob); struct Object *modifiers_isDeformedByArmature(struct Object *ob);
struct Object *modifiers_isDeformedByLattice(struct Object *ob); struct Object *modifiers_isDeformedByLattice(struct Object *ob);
int modifiers_usesArmature(struct Object *ob, struct bArmature *arm); int modifiers_usesArmature(struct Object *ob, struct bArmature *arm);
int modifiers_isDeformed(struct Scene *scene, struct Object *ob); int modifiers_isCorrectableDeformed(struct Scene *scene, struct Object *ob);
void modifier_freeTemporaryData(struct ModifierData *md); void modifier_freeTemporaryData(struct ModifierData *md);
int modifiers_indexInObject(struct Object *ob, struct ModifierData *md); int modifiers_indexInObject(struct Object *ob, struct ModifierData *md);

@ -2513,7 +2513,7 @@ int editmesh_get_first_deform_matrices(Object *ob, EditMesh *em, float (**deform
} }
for(; md && i <= cageIndex; md = md->next, i++) for(; md && i <= cageIndex; md = md->next, i++)
if(editmesh_modifier_is_enabled(md, dm) && modifier_isDeformer(md)) if(editmesh_modifier_is_enabled(md, dm) && modifier_isCorrectableDeformed(md))
numleft++; numleft++;
if(dm) if(dm)

@ -9151,15 +9151,15 @@ Object *modifiers_isDeformedByArmature(Object *ob)
} }
/* Takes an object and returns its first selected lattice, else just its /* Takes an object and returns its first selected lattice, else just its
* armature * lattice
* This should work for multiple armatures per object * This should work for multiple lattics per object
*/ */
Object *modifiers_isDeformedByLattice(Object *ob) Object *modifiers_isDeformedByLattice(Object *ob)
{ {
ModifierData *md = modifiers_getVirtualModifierList(ob); ModifierData *md = modifiers_getVirtualModifierList(ob);
LatticeModifierData *lmd= NULL; LatticeModifierData *lmd= NULL;
/* return the first selected armature, this lets us use multiple armatures /* return the first selected lattice, this lets us use multiple lattices
*/ */
for (; md; md=md->next) { for (; md; md=md->next) {
if (md->type==eModifierType_Lattice) { if (md->type==eModifierType_Lattice) {
@ -9192,28 +9192,24 @@ int modifiers_usesArmature(Object *ob, bArmature *arm)
return 0; return 0;
} }
int modifier_isDeformer(ModifierData *md) int modifier_isCorrectableDeformed(ModifierData *md)
{ {
if (md->type==eModifierType_Armature) if (md->type==eModifierType_Armature)
return 1; return 1;
if (md->type==eModifierType_Curve)
return 1;
if (md->type==eModifierType_Lattice)
return 1;
if (md->type==eModifierType_ShapeKey) if (md->type==eModifierType_ShapeKey)
return 1; return 1;
return 0; return 0;
} }
int modifiers_isDeformed(Scene *scene, Object *ob) int modifiers_isCorrectableDeformed(Scene *scene, Object *ob)
{ {
ModifierData *md = modifiers_getVirtualModifierList(ob); ModifierData *md = modifiers_getVirtualModifierList(ob);
for (; md; md=md->next) { for (; md; md=md->next) {
if(ob->mode==OB_MODE_EDIT && (md->mode & eModifierMode_Editmode)==0); if(ob->mode==OB_MODE_EDIT && (md->mode & eModifierMode_Editmode)==0);
else else
if(modifier_isDeformer(md)) if(modifier_isCorrectableDeformed(md))
return 1; return 1;
} }
return 0; return 0;

@ -2212,7 +2212,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
/* detect CrazySpace [tm] */ /* detect CrazySpace [tm] */
if(propmode==0) { if(propmode==0) {
if(modifiers_getCageIndex(t->obedit, NULL, 1)>=0) { if(modifiers_getCageIndex(t->obedit, NULL, 1)>=0) {
if(modifiers_isDeformed(t->scene, t->obedit)) { if(modifiers_isCorrectableDeformed(t->scene, t->obedit)) {
/* check if we can use deform matrices for modifier from the /* check if we can use deform matrices for modifier from the
start up to stack, they are more accurate than quats */ start up to stack, they are more accurate than quats */
totleft= editmesh_get_first_deform_matrices(t->obedit, em, &defmats, &defcos); totleft= editmesh_get_first_deform_matrices(t->obedit, em, &defmats, &defcos);