- update storage.c to use standard time codes (should fix issue
authorDaniel Dunbar <daniel@zuster.org>
Wed, 27 Jul 2005 20:16:41 +0000 (20:16 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 27 Jul 2005 20:16:41 +0000 (20:16 +0000)
   with MSVS 8)
 - broke mesh_create_shadedColors out of shadeDispList, used to
   build vertex colors for mesh in vpaint as well (also fixed
   bug where they were not initialized correctly for subsurfs)
 - added modifier_copyData and modifier_findByType functions
 - change editmode modifiers to only calculate if Realtime and
   Editmode bits are both set, makes more sense for copying
   modifiers
 - update object_copy to correctly copy modifiers
 - removed duplicate redefinition of ME_ attributes in python,
   this is a horrible idea, why was it done in the first place?
 - update armature auto vertex group code to check for subsurf
   in modifier stack
 - fixed flip_subdivision to work with move to modifier stack
 - added copymenu_modifiers, can copy all modifiers or just
   data from first modifier of a certain type (not sure how
   to deal with multiple modifiers of same type... not
   a big issue though I think)

16 files changed:
source/blender/blenkernel/BKE_displist.h
source/blender/blenkernel/BKE_modifier.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/displist.c
source/blender/blenkernel/intern/mesh.c
source/blender/blenkernel/intern/modifier.c
source/blender/blenkernel/intern/object.c
source/blender/blenlib/intern/storage.c
source/blender/blenloader/intern/readfile.c
source/blender/include/BDR_editobject.h
source/blender/python/api2_2x/NMesh.c
source/blender/src/editarmature.c
source/blender/src/editobject.c
source/blender/src/header_view3d.c
source/blender/src/toolbox.c
source/blender/src/vpaint.c

index eb66397fb3783b2b62e03d0ba531e2d7abbda9ab..463b7b22e1d1ffddac0577c79a87e5a09bdd731d 100644 (file)
@@ -147,5 +147,7 @@ void imagestodisplist(void);
 void reshadeall_displist(void);
 void filldisplist(struct ListBase *dispbase, struct ListBase *to);
 
+void mesh_create_shadedColors(struct Object *ob, int onlyForMesh, unsigned int **col1_r, unsigned int **col2_r);
+
 #endif
 
index e407c04159c825bd4b53a83f31fd4d8f0f94deba..94e174f0e0ea6c6c9f4d9db3185e73504038be42 100644 (file)
@@ -38,6 +38,7 @@ struct ModifierData;
 struct DagForest;
 struct DagNode;
 struct Object;
+struct ListBase;
 
 typedef enum {
                /* Should not be used, only for None modifier type */
@@ -91,6 +92,11 @@ typedef struct ModifierTypeInfo {
                 */
        void (*initData)(struct ModifierData *md);
 
+               /* Copy instance data for this modifier type. Should copy all user
+                * level settings to the target modifier.
+                */
+       void (*copyData)(struct ModifierData *md, struct ModifierData *target);
+
                /* Free internal modifier data variables, this function should
                 * not free the _md_ variable itself.
                 *
@@ -171,7 +177,10 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type);
 struct ModifierData*   modifier_new                    (int type);
 void                                   modifier_free                   (struct ModifierData *md);
 
+void                                   modifier_copyData               (struct ModifierData *md, struct ModifierData *target);
 int                                            modifier_dependsOnTime  (struct ModifierData *md);
 
+struct ModifierData*   modifiers_findByType    (struct ListBase *lb, ModifierType type);
+
 #endif
 
index 3b00fb034a07fca1414b264c91460a83dade3397..615429bee9f48f48711baae7b5d56fb7ec46bc67 100644 (file)
@@ -1393,6 +1393,7 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
        for (; md; md=md->next) {
                ModifierTypeInfo *mti = modifierType_get_info(md->type);
 
+               if (!(md->mode&eModifierMode_Realtime)) continue;
                if (!(md->mode&eModifierMode_Editmode)) continue;
                if (mti->isDisabled && mti->isDisabled(md)) continue;
                if (!(mti->flags&eModifierTypeFlag_SupportsEditmode)) continue;
index 15c16db31422fe2c12c68e72d83617a54979e20c..bebd7bf4d936a3b0334dc56434d6bdcc15eab2d0 100644 (file)
@@ -603,7 +603,7 @@ void addnormalsDispList(Object *ob, ListBase *lb)
        float *n1, *n2, *n3, *n4;
        int a, b, p1, p2, p3, p4;
 
-       
+
        dl= lb->first;
        
        while(dl) {
@@ -661,18 +661,11 @@ void addnormalsDispList(Object *ob, ListBase *lb)
        }
 }
 
-
-void shadeDispList(Object *ob)
+static void init_fastshade_for_ob(Object *ob, int *need_orco_r, float mat[4][4], float imat[3][3])
 {
-       DispList *dl, *dlob;
-       Material *ma = NULL;
-       Curve *cu;
-       float *orco=NULL, imat[3][3], tmat[4][4], mat[4][4], vec[3], xn, yn, zn;
-       float *fp, *nor, n1[3];
-       unsigned int *col1;
-       int a, need_orco = 0;
+       float tmat[4][4];
+       int a;
 
-       if(ob->flag & OB_FROMDUPLI) return;
        initfastshade();
 
        Mat4MulMat4(mat, ob->obmat, fviewmat);
@@ -680,129 +673,176 @@ void shadeDispList(Object *ob)
        Mat4Invert(tmat, mat);
        Mat3CpyMat4(imat, tmat);
        if(ob->transflag & OB_NEG_SCALE) Mat3MulFloat((float *)imat, -1.0);
-       
-       dl = find_displist(&ob->disp, DL_VERTCOL);
-       if (dl) {
-               BLI_remlink(&ob->disp, dl);
-               free_disp_elem(dl);
-       }
 
-       need_orco= 0;
+       if (need_orco_r) *need_orco_r= 0;
        for(a=0; a<ob->totcol; a++) {
-               ma= give_current_material(ob, a+1);
+               Material *ma= give_current_material(ob, a+1);
                if(ma) {
                        init_render_material(ma);
-                       if(ma->texco & TEXCO_ORCO) need_orco= 1;
+                       if(ma->texco & TEXCO_ORCO) {
+                               if (need_orco_r) *need_orco_r= 1;
+                       }
                }
        }
+}
+static void end_fastshade_for_ob(Object *ob)
+{
+       int a;
 
-       if(ob->type==OB_MESH) {
-               Mesh *me= ob->data;
-               int dmNeedsFree;
-               DerivedMesh *dm= mesh_get_derived_final(ob, &dmNeedsFree);
-               DispListMesh *dlm;
-               MVert *mvert;
-               float *vnors, *vn;
-               int i;
-                       
-               if (need_orco) {
-                       orco = mesh_create_orco(ob);
-               }
+       for(a=0; a<ob->totcol; a++) {
+               Material *ma= give_current_material(ob, a+1);
+               if(ma) end_render_material(ma);
+       }
+}
 
-               dlm= dm->convertToDispListMesh(dm);
+void mesh_create_shadedColors(Object *ob, int onlyForMesh, unsigned int **col1_r, unsigned int **col2_r)
+{
+       Mesh *me= ob->data;
+       int dmNeedsFree;
+       DerivedMesh *dm;
+       DispListMesh *dlm;
+       unsigned int *col1, *col2;
+       float *orco, *vnors, imat[3][3], mat[4][4], vec[3];
+       int a, i, need_orco;
+
+       init_fastshade_for_ob(ob, &need_orco, mat, imat);
+
+       if (need_orco) {
+               orco = mesh_create_orco(ob);
+       } else {
+               orco = NULL;
+       }
+
+       if (onlyForMesh) {
+               dm = mesh_get_derived_deform(ob, &dmNeedsFree);
+       } else {
+               dm = mesh_get_derived_final(ob, &dmNeedsFree);
+       }
+       dlm= dm->convertToDispListMesh(dm);
 
-               dlob= MEM_callocN(sizeof(DispList), "displistshade");
-               BLI_addtail(&ob->disp, dlob);
-               dlob->type= DL_VERTCOL;
+       col1 = MEM_mallocN(sizeof(*col1)*dlm->totface*4, "col1");
+       if (col2_r && (me->flag & ME_TWOSIDED)) {
+               col2 = MEM_mallocN(sizeof(*col2)*dlm->totface*4, "col1");
+       } else {
+               col2 = NULL;
+       }
        
-               dlob->col1= MEM_mallocN(sizeof(*dlob->col1)*dlm->totface*4, "col1");
-               if (me->flag & ME_TWOSIDED)
-                       dlob->col2= MEM_mallocN(sizeof(*dlob->col2)*dlm->totface*4, "col1");
-               
+       *col1_r = col1;
+       if (col2_r) *col2_r = col2;
+
                /* vertexnormals */
-               vn=vnors= MEM_mallocN(dlm->totvert*3*sizeof(float), "vnors disp");
-               mvert= dlm->mvert;
-               a= dlm->totvert;
-               while(a--) {
-                       
-                       xn= mvert->no[0]; 
-                       yn= mvert->no[1]; 
-                       zn= mvert->no[2];
-                       
+       vnors= MEM_mallocN(dlm->totvert*3*sizeof(float), "vnors disp");
+       for (a=0; a<dlm->totvert; a++) {
+               MVert *mv = &dlm->mvert[a];
+               float *vn= &vnors[a*3];
+               float xn= mv->no[0]; 
+               float yn= mv->no[1]; 
+               float zn= mv->no[2];
+               
                        /* transpose ! */
-                       vn[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
-                       vn[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
-                       vn[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
-                       Normalise(vn);
+               vn[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
+               vn[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
+               vn[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
+               Normalise(vn);
+       }               
+
+       for (i=0; i<dlm->totface; i++) {
+               MFace *mf= &dlm->mface[i];
+
+               if (mf->v3) {
+                       int j, vidx[4], nverts= mf->v4?4:3;
+                       unsigned char *col1base= (unsigned char*) &col1[i*4];
+                       unsigned char *col2base= (unsigned char*) (col2?&col2[i*4]:NULL);
+                       unsigned char *mcolbase;
+                       Material *ma= give_current_material(ob, mf->mat_nr+1);
+                       float nor[3], n1[3];
                        
-                       mvert++; vn+=3;
-               }               
-
-               for (i=0; i<dlm->totface; i++) {
-                       MFace *mf= &dlm->mface[i];
-
-                       if (mf->v3) {
-                               int j, vidx[4], nverts= mf->v4?4:3;
-                               unsigned char *col1base= (unsigned char*) &dlob->col1[i*4];
-                               unsigned char *col2base= (unsigned char*) (dlob->col2?&dlob->col2[i*4]:NULL);
-                               unsigned char *mcolbase;
-                               float nor[3];
-                               
-                               if (dlm->tface) {
-                                       mcolbase = (unsigned char*) dlm->tface[i].col;
-                               } else if (dlm->mcol) {
-                                       mcolbase = (unsigned char*) &dlm->mcol[i*4];
-                               } else {
-                                       mcolbase = NULL;
-                               }
+                       if(ma==0) ma= &defmaterial;
+                       
+                       if (dlm->tface) {
+                               mcolbase = (unsigned char*) dlm->tface[i].col;
+                       } else if (dlm->mcol) {
+                               mcolbase = (unsigned char*) &dlm->mcol[i*4];
+                       } else {
+                               mcolbase = NULL;
+                       }
 
-                               ma= give_current_material(ob, mf->mat_nr+1);
-                               if(ma==0) ma= &defmaterial;
-                               
-                               vidx[0]= mf->v1;
-                               vidx[1]= mf->v2;
-                               vidx[2]= mf->v3;
-                               vidx[3]= mf->v4;
-
-                                       // XXX, should all DLM's have normals?
-                               if (dlm->nors) {
-                                       VECCOPY(nor, &dlm->nors[i*3]);
-                               } else {
-                                       if (mf->v4)
-                                               CalcNormFloat4(dlm->mvert[mf->v1].co, dlm->mvert[mf->v2].co, dlm->mvert[mf->v3].co, dlm->mvert[mf->v4].co, nor);
-                                       else
-                                               CalcNormFloat(dlm->mvert[mf->v1].co, dlm->mvert[mf->v2].co, dlm->mvert[mf->v3].co, nor);
-                               }
+                       vidx[0]= mf->v1;
+                       vidx[1]= mf->v2;
+                       vidx[2]= mf->v3;
+                       vidx[3]= mf->v4;
+
+                               // XXX, should all DLM's have normals?
+                       if (dlm->nors) {
+                               VECCOPY(nor, &dlm->nors[i*3]);
+                       } else {
+                               if (mf->v4)
+                                       CalcNormFloat4(dlm->mvert[mf->v1].co, dlm->mvert[mf->v2].co, dlm->mvert[mf->v3].co, dlm->mvert[mf->v4].co, nor);
+                               else
+                                       CalcNormFloat(dlm->mvert[mf->v1].co, dlm->mvert[mf->v2].co, dlm->mvert[mf->v3].co, nor);
+                       }
 
-                               n1[0]= imat[0][0]*nor[0]+imat[0][1]*nor[1]+imat[0][2]*nor[2];
-                               n1[1]= imat[1][0]*nor[0]+imat[1][1]*nor[1]+imat[1][2]*nor[2];
-                               n1[2]= imat[2][0]*nor[0]+imat[2][1]*nor[1]+imat[2][2]*nor[2];
-                               Normalise(n1);
-
-                               vn = n1;
-                               for (j=0; j<nverts; j++) {
-                                       MVert *mv= &dlm->mvert[vidx[j]];
-                                       unsigned char *col1= &col1base[j*4];
-                                       unsigned char *col2= col2base?&col2base[j*4]:NULL;
-                                       unsigned char *mcol= mcolbase?&mcolbase[j*4]:NULL;
-                                       
-                                       VECCOPY(vec, mv->co);
-                                       Mat4MulVecfl(mat, vec);
-                                       if(mf->flag & ME_SMOOTH) vn= vnors+3*vidx[j];
-                                       fastshade(vec, vn, orco?&orco[vidx[j]*3]:mv->co, ma, col1, col2, mcol);
-                               }
+                       n1[0]= imat[0][0]*nor[0]+imat[0][1]*nor[1]+imat[0][2]*nor[2];
+                       n1[1]= imat[1][0]*nor[0]+imat[1][1]*nor[1]+imat[1][2]*nor[2];
+                       n1[2]= imat[2][0]*nor[0]+imat[2][1]*nor[1]+imat[2][2]*nor[2];
+                       Normalise(n1);
+
+                       for (j=0; j<nverts; j++) {
+                               MVert *mv= &dlm->mvert[vidx[j]];
+                               unsigned char *col1= &col1base[j*4];
+                               unsigned char *col2= col2base?&col2base[j*4]:NULL;
+                               unsigned char *mcol= mcolbase?&mcolbase[j*4]:NULL;
+                               float *vn = (mf->flag & ME_SMOOTH)?&vnors[3*vidx[j]]:n1;
+
+                               VECCOPY(vec, mv->co);
+                               Mat4MulVecfl(mat, vec);
+                               fastshade(vec, vn, orco?&orco[vidx[j]*3]:mv->co, ma, col1, col2, mcol);
                        }
                }
-               MEM_freeN(vnors);
-               displistmesh_free(dlm);
+       }
+       MEM_freeN(vnors);
+       displistmesh_free(dlm);
 
-               if (orco) {
-                       MEM_freeN(orco);
-               }
+       if (orco) {
+               MEM_freeN(orco);
+       }
+
+       if (dmNeedsFree) dm->release(dm);
+
+       end_fastshade_for_ob(ob);
+}
 
-               if (dmNeedsFree) dm->release(dm);
+void shadeDispList(Object *ob)
+{
+       DispList *dl, *dlob;
+       Material *ma = NULL;
+       Curve *cu;
+       float imat[3][3], mat[4][4], vec[3];
+       float *fp, *nor, n1[3];
+       unsigned int *col1;
+       int a;
+
+       if(ob->flag & OB_FROMDUPLI) return;
+
+       dl = find_displist(&ob->disp, DL_VERTCOL);
+       if (dl) {
+               BLI_remlink(&ob->disp, dl);
+               free_disp_elem(dl);
+       }
+
+       if(ob->type==OB_MESH) {
+               dl= MEM_callocN(sizeof(DispList), "displistshade");
+               BLI_addtail(&ob->disp, dl);
+               dl->type= DL_VERTCOL;
+
+               mesh_create_shadedColors(ob, 0, &dl->col1, &dl->col2);
+
+               return;
        }
-       else if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) {
+
+       init_fastshade_for_ob(ob, NULL, mat, imat);
+       
+       if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) {
        
                /* now we need the normals */
                cu= ob->data;
@@ -910,10 +950,7 @@ void shadeDispList(Object *ob)
                }
        }
        
-       for(a=0; a<ob->totcol; a++) {
-               ma= give_current_material(ob, a+1);
-               if(ma) end_render_material(ma);
-       }
+       end_fastshade_for_ob(ob);
 }
 
 void reshadeall_displist(void)
index 41e9d0b4c7061ed338b90a7da20a07631112decb..c61797f2396dad5a1a47b18f37ef9d68c094509a 100644 (file)
@@ -197,8 +197,6 @@ Mesh *add_mesh()
        me->smoothresh= 30;
        me->texflag= AUTOSPACE;
        me->flag= ME_TWOSIDED;
-       me->subdiv= 1;
-       me->subdivr = 1;
        me->bb= unit_boundbox();
        
        return me;
index 7f60fdda1875ce99b5d4c107ab2b50db5da13d41..0c43b128141d72040cce86af88d5755e0e671f0e 100644 (file)
@@ -39,6 +39,14 @@ static int noneModifier_isDisabled(ModifierData *md)
 
 /* Curve */
 
+static void curveModifier_copyData(ModifierData *md, ModifierData *target)
+{
+       CurveModifierData *cmd = (CurveModifierData*) md;
+       CurveModifierData *tcmd = (CurveModifierData*) target;
+
+       tcmd->object = cmd->object;
+}
+
 static int curveModifier_isDisabled(ModifierData *md)
 {
        CurveModifierData *cmd = (CurveModifierData*) md;
@@ -73,6 +81,14 @@ static void curveModifier_deformVertsEM(ModifierData *md, Object *ob, void *edit
 
 /* Lattice */
 
+static void latticeModifier_copyData(ModifierData *md, ModifierData *target)
+{
+       LatticeModifierData *lmd = (LatticeModifierData*) md;
+       LatticeModifierData *tlmd = (LatticeModifierData*) target;
+
+       tlmd->object = lmd->object;
+}
+
 static int latticeModifier_isDisabled(ModifierData *md)
 {
        LatticeModifierData *lmd = (LatticeModifierData*) md;
@@ -115,6 +131,17 @@ static void subsurfModifier_initData(ModifierData *md)
        smd->renderLevels = 2;
 }
 
+static void subsurfModifier_copyData(ModifierData *md, ModifierData *target)
+{
+       SubsurfModifierData *smd = (SubsurfModifierData*) md;
+       SubsurfModifierData *tsmd = (SubsurfModifierData*) target;
+
+       tsmd->flags = smd->flags;
+       tsmd->levels = smd->levels;
+       tsmd->renderLevels = smd->renderLevels;
+       tsmd->subdivType = smd->subdivType;
+}
+
 static void subsurfModifier_freeData(ModifierData *md)
 {
        SubsurfModifierData *smd = (SubsurfModifierData*) md;
@@ -192,6 +219,17 @@ static void buildModifier_initData(ModifierData *md)
        bmd->length = 100.0;
 }
 
+static void buildModifier_copyData(ModifierData *md, ModifierData *target)
+{
+       BuildModifierData *bmd = (BuildModifierData*) md;
+       BuildModifierData *tbmd = (BuildModifierData*) target;
+
+       tbmd->start = bmd->start;
+       tbmd->length = bmd->length;
+       tbmd->randomize = bmd->randomize;
+       tbmd->seed = bmd->seed;
+}
+
 static int buildModifier_dependsOnTime(ModifierData *md)
 {
        return 1;
@@ -421,6 +459,15 @@ static void mirrorModifier_initData(ModifierData *md)
        mmd->tolerance = 0.001;
 }
 
+static void mirrorModifier_copyData(ModifierData *md, ModifierData *target)
+{
+       MirrorModifierData *mmd = (MirrorModifierData*) md;
+       MirrorModifierData *tmmd = (MirrorModifierData*) target;
+
+       tmmd->axis = mmd->axis;
+       tmmd->tolerance = mmd->tolerance;
+}
+
 static void mirrorModifier__doMirror(MirrorModifierData *mmd, DispListMesh *ndlm, float (*vertexCos)[3])
 {
        int totvert=ndlm->totvert, totedge=ndlm->totedge, totface=ndlm->totface;
@@ -874,6 +921,23 @@ static void waveModifier_initData(ModifierData *md)
        wmd->damp= 10.0f;
 }
 
+static void waveModifier_copyData(ModifierData *md, ModifierData *target)
+{
+       WaveModifierData *wmd = (WaveModifierData*) md;
+       WaveModifierData *twmd = (WaveModifierData*) target;
+
+       twmd->damp = wmd->damp;
+       twmd->flag = wmd->flag;
+       twmd->height = wmd->height;
+       twmd->lifetime = wmd->lifetime;
+       twmd->narrow = wmd->narrow;
+       twmd->speed = wmd->speed;
+       twmd->startx = wmd->startx;
+       twmd->starty = wmd->starty;
+       twmd->timeoffs = wmd->timeoffs;
+       twmd->width = wmd->width;
+}
+
 static int waveModifier_dependsOnTime(ModifierData *md)
 {
        return 1;
@@ -972,6 +1036,7 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type)
                mti = INIT_TYPE(Curve);
                mti->type = eModifierTypeType_OnlyDeform;
                mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
+               mti->copyData = curveModifier_copyData;
                mti->isDisabled = curveModifier_isDisabled;
                mti->updateDepgraph = curveModifier_updateDepgraph;
                mti->deformVerts = curveModifier_deformVerts;
@@ -980,6 +1045,7 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type)
                mti = INIT_TYPE(Lattice);
                mti->type = eModifierTypeType_OnlyDeform;
                mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
+               mti->copyData = latticeModifier_copyData;
                mti->isDisabled = latticeModifier_isDisabled;
                mti->updateDepgraph = latticeModifier_updateDepgraph;
                mti->deformVerts = latticeModifier_deformVerts;
@@ -989,6 +1055,7 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type)
                mti->type = eModifierTypeType_Constructive;
                mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsMapping | eModifierTypeFlag_SupportsEditmode | eModifierTypeFlag_EnableInEditmode;
                mti->initData = subsurfModifier_initData;
+               mti->copyData = subsurfModifier_copyData;
                mti->freeData = subsurfModifier_freeData;
                mti->applyModifier = subsurfModifier_applyModifier;
                mti->applyModifierEM = subsurfModifier_applyModifierEM;
@@ -997,6 +1064,7 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type)
                mti->type = eModifierTypeType_Nonconstructive;
                mti->flags = eModifierTypeFlag_AcceptsMesh;
                mti->initData = buildModifier_initData;
+               mti->copyData = buildModifier_copyData;
                mti->dependsOnTime = buildModifier_dependsOnTime;
                mti->applyModifier = buildModifier_applyModifier;
 
@@ -1004,6 +1072,7 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type)
                mti->type = eModifierTypeType_Constructive;
                mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode | eModifierTypeFlag_EnableInEditmode;
                mti->initData = mirrorModifier_initData;
+               mti->copyData = mirrorModifier_copyData;
                mti->applyModifier = mirrorModifier_applyModifier;
                mti->applyModifierEM = mirrorModifier_applyModifierEM;
 
@@ -1017,6 +1086,7 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type)
                mti->type = eModifierTypeType_OnlyDeform;
                mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
                mti->initData = waveModifier_initData;
+               mti->copyData = waveModifier_copyData;
                mti->dependsOnTime = waveModifier_dependsOnTime;
                mti->deformVerts = waveModifier_deformVerts;
                mti->deformVertsEM = waveModifier_deformVertsEM;
@@ -1063,3 +1133,24 @@ int modifier_dependsOnTime(ModifierData *md)
 
        return mti->dependsOnTime && mti->dependsOnTime(md);
 }
+
+ModifierData *modifiers_findByType(struct ListBase *lb, ModifierType type)
+{
+       ModifierData *md = lb->first;
+
+       for (; md; md=md->next)
+               if (md->type==type)
+                       break;
+
+       return md;
+}
+
+void modifier_copyData(ModifierData *md, ModifierData *target)
+{
+       ModifierTypeInfo *mti = modifierType_get_info(md->type);
+
+       target->mode = md->mode;
+
+       if (mti->copyData)
+               mti->copyData(md, target);
+}
index 7b601bfbe4332d8dc77fb9e3dcb522f6009806bd..2b8b14429ef2563aea03a9d8a3a6cfff21f188bd 100644 (file)
@@ -823,6 +823,7 @@ SoftBody *copy_softbody(SoftBody *sb)
 Object *copy_object(Object *ob)
 {
        Object *obn;
+       ModifierData *md;
        int a;
        bConstraintChannel *actcon;
 
@@ -837,7 +838,13 @@ Object *copy_object(Object *ob)
        obn->flag &= ~OB_FROMGROUP;
        
        copy_effects(&obn->effect, &ob->effect);
-       obn->modifiers.first = obn->modifiers.last= NULL; // XXX fixme
+       obn->modifiers.first = obn->modifiers.last= NULL;
+       
+       for (md=ob->modifiers.first; md; md=md->next) {
+               ModifierData *nmd = modifier_new(md->type);
+               modifier_copyData(md, nmd);
+               BLI_addtail(&obn->modifiers, nmd);
+       }
        
        obn->network.first= obn->network.last= 0;
        
index 5123098e52241f53fc098116acbb4b722040d9cf..8b45bfe0420c27fb0e0b13f8800a8f4464d36fc1 100644 (file)
@@ -393,12 +393,7 @@ void BLI_adddirstrings()
                else if(num1) sprintf(files[num].size, "%15d", num1);
                else sprintf(files[num].size, "0");
 
-#if 1400 >= _MSC_VER
-               //visual studio 8 crashes on 'R', todo: check for replacement
-               strftime(datum, 32, "%d-%b-%y ", tm);
-#else
-               strftime(datum, 32, "%d-%b-%y %R", tm);
-#endif
+               strftime(datum, 32, "%d-%b-%y %H:%M", tm);
 
                if (st_size < 1000) {
                        sprintf(size, "%10d", (int) st_size);
index b916914fd50d5ad1bd494005ae505ac2cbd1dd7c..43c6a284f9f39f74d164c96b70d514a32851ee1a 100644 (file)
@@ -3606,7 +3606,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
        if(main->versionfile <= 169) {
                Mesh *me= main->mesh.first;
                while(me) {
-                       if(me->subdiv==0) me->subdiv= 3;
+                       if(me->subdiv==0) me->subdiv= 1;
                        me= me->id.next;
                }
        }
index f67fc40ec4d64d87107154dc12b504f95a26a200..f6abd6707f11a51c1ffbf4e0d07edc06158cc3b6 100644 (file)
@@ -63,7 +63,6 @@ void docentre_cursor(void);
 void movetolayer(void);
 void special_editmenu(void);
 void convertmenu(void);
-void copymenu_properties(struct Object *ob);
 void copy_attr_menu(void);
 void copy_attr(short event);
 void link_to_scene(unsigned short nr);
@@ -72,9 +71,6 @@ void make_links(short event);
 void make_duplilist_real(void);
 void apply_object(void);
 
-void copymenu_logicbricks(struct Object *ob);
-
-
 /* old transform */
 void apply_keyb_grid(float *val, float fac1, float fac2, float fac3, int invert);
 void compatible_eul(float *eul, float *oldrot);
index c80702dc641525fb8bd9e1e8973e371538625717..531a06fdc5d163698965d1093d2696a53710d456 100644 (file)
@@ -73,12 +73,6 @@ extern void countall(void);
 
 /* EXPP Mesh defines */
 
-#define EXPP_NMESH_MODE_NOPUNOFLIP             ME_NOPUNOFLIP
-#define EXPP_NMESH_MODE_TWOSIDED               ME_TWOSIDED
-#define EXPP_NMESH_MODE_AUTOSMOOTH             ME_AUTOSMOOTH
-#define EXPP_NMESH_MODE_SUBSURF                        ME_SUBSURF
-#define EXPP_NMESH_MODE_OPTIMAL                        ME_OPT_EDGES
-
 #define NMESH_FRAME_MAX                                30000
 #define NMESH_SMOOTHRESH                       30
 #define NMESH_SMOOTHRESH_MIN                   1
@@ -1544,15 +1538,15 @@ static PyObject *NMesh_setMode( PyObject * self, PyObject * args )
                        for( i = 0; i < 5; i++ ) {
                                if( !m[i] ) break;
                                else if( strcmp( m[i], "NoVNormalsFlip" ) == 0 )
-                                       mode |= EXPP_NMESH_MODE_NOPUNOFLIP;
+                                       mode |= ME_NOPUNOFLIP;
                                else if( strcmp( m[i], "TwoSided" ) == 0 )
-                                       mode |= EXPP_NMESH_MODE_TWOSIDED;
+                                       mode |= ME_TWOSIDED;
                                else if( strcmp( m[i], "AutoSmooth" ) == 0 )
-                                       mode |= EXPP_NMESH_MODE_AUTOSMOOTH;
+                                       mode |= ME_AUTOSMOOTH;
                                else if( strcmp( m[i], "SubSurf" ) == 0 )
-                                       mode |= EXPP_NMESH_MODE_SUBSURF;
+                                       mode |= ME_SUBSURF;
                                else if( strcmp( m[i], "Optimal" ) == 0 )
-                                       mode |= EXPP_NMESH_MODE_OPTIMAL;
+                                       mode |= ME_OPT_EDGES;
                                else if( m[i][0] == '\0' )
                                        mode = 0;
                                else
@@ -1994,7 +1988,7 @@ static PyObject *new_NMesh_internal( Mesh * oldmesh,
 {
        BPy_NMesh *me = PyObject_NEW( BPy_NMesh, &NMesh_Type );
        me->flags = 0;
-       me->mode = EXPP_NMESH_MODE_TWOSIDED;    /* default for new meshes */
+       me->mode = ME_TWOSIDED; /* default for new meshes */
        me->subdiv[0] = NMESH_SUBDIV;
        me->subdiv[1] = NMESH_SUBDIV;
        me->smoothresh = NMESH_SMOOTHRESH;
@@ -2948,16 +2942,16 @@ static PyObject *M_NMesh_Modes( void )
 
                constant_insert( d, "NOVNORMALSFLIP",
                                 PyInt_FromLong
-                                ( EXPP_NMESH_MODE_NOPUNOFLIP ) );
+                                ( ME_NOPUNOFLIP ) );
                constant_insert( d, "TWOSIDED",
-                                PyInt_FromLong( EXPP_NMESH_MODE_TWOSIDED ) );
+                                PyInt_FromLong( ME_TWOSIDED ) );
                constant_insert( d, "AUTOSMOOTH",
                                 PyInt_FromLong
-                                ( EXPP_NMESH_MODE_AUTOSMOOTH ) );
+                                ( ME_AUTOSMOOTH ) );
                constant_insert( d, "SUBSURF",
-                                PyInt_FromLong( EXPP_NMESH_MODE_SUBSURF ) );
+                                PyInt_FromLong( ME_SUBSURF ) );
                constant_insert( d, "OPTIMAL",
-                                PyInt_FromLong( EXPP_NMESH_MODE_OPTIMAL ) );
+                                PyInt_FromLong( ME_OPT_EDGES ) );
        }
 
        return Modes;
index 06827b2bdf1c9639c674428eb2e5355a58b707a3..5f4e9ff72fac8b8f6ee2be575bb334c153887afe 100644 (file)
@@ -54,6 +54,7 @@
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
 #include "DNA_view3d_types.h"
+#include "DNA_modifier_types.h"
 
 #include "BLI_blenlib.h"
 #include "BLI_arithb.h"
@@ -69,6 +70,7 @@
 #include "BKE_object.h"
 #include "BKE_subsurf.h"
 #include "BKE_utildefines.h"
+#include "BKE_modifier.h"
 
 #include "BIF_editaction.h"
 #include "BIF_editmode_undo.h"
@@ -1993,7 +1995,7 @@ static void add_verts_to_closest_dgroup(Object *ob, Object *par)
     mesh = (Mesh*)ob->data;
 
        /* Is subsurf on? Lets use the verts on the limit surface then */
-       if (mesh->flag&ME_SUBSURF) {
+       if (modifiers_findByType(&ob->modifiers, eModifierType_Subsurf)) {
                subverts = MEM_mallocN(3*mesh->totvert*sizeof(float), "subverts");
                subsurf_calculate_limit_positions(mesh, (void *)subverts);      /* (ton) made void*, dunno how to cast */
        }
index 17976a61a4aa1567449b8fa3ec42dc6bb4df82da..9590be53b1ecf3136268972f1f319254210ff59f 100644 (file)
@@ -81,6 +81,7 @@
 #include "DNA_view3d_types.h"
 #include "DNA_vfont_types.h"
 #include "DNA_world_types.h"
+#include "DNA_modifier_types.h"
 
 #include "BLI_blenlib.h"
 #include "BLI_arithb.h"
 #include "BKE_subsurf.h"
 #include "BKE_texture.h"
 #include "BKE_utildefines.h"
+#include "BKE_modifier.h"
 
 #include "BIF_gl.h"
 #include "BIF_graphics.h"
@@ -2315,23 +2317,40 @@ void convertmenu(void)
         */
 void flip_subdivison(Object *ob, int level)
 {
-       Mesh *me = ob->data;
+       ModifierData *md = modifiers_findByType(&ob->modifiers, eModifierType_Subsurf);
 
-       if (level == -1) {
-               me->flag ^= ME_SUBSURF;
+       if (md) {
+               SubsurfModifierData *smd = (SubsurfModifierData*) md;
+
+               if (level == -1) {
+                       if (smd->modifier.mode&(eModifierMode_Render|eModifierMode_Realtime)) {
+                               smd->modifier.mode &= ~(eModifierMode_Render|eModifierMode_Realtime);
+                       } else {
+                               smd->modifier.mode |= (eModifierMode_Render|eModifierMode_Realtime);
+                       }
+               } else {
+                       smd->levels = level;
+               }
        } else {
-               me->subdiv = level;
+               SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf);
+
+               BLI_addtail(&ob->modifiers, smd);
+
+               if (level!=-1) {
+                       smd->levels = level;
+               }
        }
 
        allqueue(REDRAWVIEW3D, 0);
        allqueue(REDRAWOOPS, 0);
        allqueue(REDRAWBUTSEDIT, 0);
+       allqueue(REDRAWBUTSOBJECT, 0);
        DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
        
        BIF_undo_push("Switch subsurf on/off");
 }
  
-void copymenu_properties(Object *ob)
+static void copymenu_properties(Object *ob)
 {      
        bProperty *prop, *propn, *propc;
        Base *base;
@@ -2397,7 +2416,7 @@ void copymenu_properties(Object *ob)
        BIF_undo_push("Copy properties");
 }
 
-void copymenu_logicbricks(Object *ob)
+static void copymenu_logicbricks(Object *ob)
 {
        Base *base;
        
@@ -2431,11 +2450,79 @@ void copymenu_logicbricks(Object *ob)
        BIF_undo_push("Copy logic");
 }
 
+static void copymenu_modifiers(Object *ob)
+{
+       char str[512];
+       int i, event;
+       Base *base;
+
+       strcpy(str, "Copy Modifiers %t");
+
+       sprintf(str+strlen(str), "|All%%x%d|%%l", NUM_MODIFIER_TYPES);
+
+       for (i=eModifierType_None+1; i<NUM_MODIFIER_TYPES; i++) {
+               ModifierTypeInfo *mti = modifierType_get_info(i);
+
+               if (    (mti->flags&eModifierTypeFlag_AcceptsCVs) || 
+                               (ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
+                       sprintf(str+strlen(str), "|%s%%x%d", mti->name, i);
+               }
+       }
+
+       event = pupmenu(str);
+       if(event<=0) return;
+
+       for (base= FIRSTBASE; base; base= base->next) {
+               if(base->object != ob) {
+                       if(TESTBASELIB(base)) {
+                               ModifierData *md;
+
+                               base->object->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
+
+                               if (base->object->type==OB_MESH) {
+                                       if (event==NUM_MODIFIER_TYPES) {
+                                               while (base->object->modifiers.first) {
+                                                       md = base->object->modifiers.first;
+                                                       BLI_remlink(&base->object->modifiers, md);
+                                                       modifier_free(md);
+                                               }
+
+                                               for (md=ob->modifiers.first; md; md=md->next) {
+                                                       ModifierData *nmd = modifier_new(md->type);
+                                                       modifier_copyData(md, nmd);
+                                                       BLI_addtail(&base->object->modifiers, nmd);
+                                               }
+                                       } else {
+                                               ModifierData *md = modifiers_findByType(&ob->modifiers, event);
+
+                                               if (md) {
+                                                       ModifierData *tmd = modifiers_findByType(&base->object->modifiers, event);
+
+                                                       if (!tmd) {
+                                                               tmd = modifier_new(event);
+                                                               BLI_addtail(&base->object->modifiers, tmd);
+                                                       }
+
+                                                       modifier_copyData(md, tmd);
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+                               
+       allqueue(REDRAWVIEW3D, 0);
+       allqueue(REDRAWBUTSOBJECT, 0);
+       DAG_scene_sort(G.scene);
+       
+       BIF_undo_push("Copy modifiers");
+}
+
 void copy_attr_menu()
 {
        Object *ob;
        short event;
-       char str[256];
+       char str[512];
 
        /* If you change this menu, don't forget to update the menu in header_view3d.c
         * view3d_edit_object_copyattrmenu() and in toolbox.c
@@ -2461,6 +2548,10 @@ void copy_attr_menu()
 
        if(ob->soft) strcat(str, "|Soft Body Settings%x23");
        
+       if(ob->type==OB_MESH){
+               strcat(str, "|Modifiers ...%x24");
+       }
+
        event= pupmenu(str);
        if(event<= 0) return;
        
@@ -2497,6 +2588,10 @@ void copy_attr(short event)
                copymenu_logicbricks(ob);
                return;
        }
+       else if(event==24) {
+               copymenu_modifiers(ob);
+               return;
+       }
 
        base= FIRSTBASE;
        while(base) {
@@ -2635,14 +2730,19 @@ void copy_attr(short event)
                                }
                                else if(event==21){
                                        if (base->object->type==OB_MESH) {
-                                               Mesh *targetme= base->object->data;
-                                               Mesh *sourceme= ob->data;
+                                               ModifierData *md = modifiers_findByType(&ob->modifiers, eModifierType_Subsurf);
 
-                                               targetme->flag= (targetme->flag&~ME_SUBSURF) | (sourceme->flag&ME_SUBSURF);
-                                               targetme->subsurftype = sourceme->subsurftype;
-                                               targetme->subdiv= sourceme->subdiv;
-                                               targetme->subdivr= sourceme->subdivr;
-                                               base->object->recalc |= OB_RECALC_DATA;
+                                               if (md) {
+                                                       ModifierData *tmd = modifiers_findByType(&base->object->modifiers, eModifierType_Subsurf);
+
+                                                       if (!tmd) {
+                                                               tmd = modifier_new(eModifierType_Subsurf);
+                                                               BLI_addtail(&base->object->modifiers, tmd);
+                                                       }
+
+                                                       modifier_copyData(md, tmd);
+                                                       base->object->recalc |= OB_RECALC_DATA;
+                                               }
                                        }
                                }
                                else if(event==22) {
index 0fd155fa855b5dda413c85843a9fcc022c6574bf..1b4bf46003ee750460e253f2cf565b84ce12fd66 100644 (file)
@@ -1710,6 +1710,8 @@ static void do_view3d_edit_object_copyattrmenu(void *arg, int event)
        case 20:
        case 21:
        case 22:
+       case 23:
+       case 24:
                copy_attr((short)event);
                break;
                }
@@ -1733,7 +1735,7 @@ static uiBlock *view3d_edit_object_copyattrmenu(void *arg_unused)
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Size|Ctrl C, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Drawtype|Ctrl C, 4",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Time Offset|Ctrl C, 5",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dupli|Ctrl C, 6",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dupli|Ctrl C, 6",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
        
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
        
@@ -1744,29 +1746,30 @@ static uiBlock *view3d_edit_object_copyattrmenu(void *arg_unused)
        
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
        
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Constraints|Ctrl C, 11",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Constraints|Ctrl C, 22",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
        
        if (ob) {
        
                if ((ob->type == OB_MESH) || (ob->type == OB_CURVE) || (ob->type == OB_SURF) ||
                                (ob->type == OB_FONT) || (ob->type == OB_MBALL)) {
-                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Space|Ctrl C, 12",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
+                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Space|Ctrl C, 17",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
                }       
                
                if(ob->type == OB_FONT) {
-                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Font Settings|Ctrl C, 13",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
-                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C, 14",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
+                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Font Settings|Ctrl C, 18",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
+                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C, 19",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
                }
                if(ob->type == OB_CURVE) {
-                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C, 13",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
+                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C, 19",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
                }
        
                if(ob->type==OB_MESH) {
-                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdiv|Ctrl C, 13",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
+                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdiv|Ctrl C, 21",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
+                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Modifiers ...|Ctrl C, 24",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
                }
        
                if( give_parteff(ob) ) {
-                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Particle Settings|Ctrl C, 14",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
+                       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Particle Settings|Ctrl C, 20",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
                }
        }
        
@@ -2161,10 +2164,9 @@ static uiBlock *view3d_edit_mesh_edgesmenu(void *arg_unused)
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Seam|Ctrl E",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
 
-       if (me->flag & ME_SUBSURF) {
-               uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-               uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Crease SubSurf|Shift E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
-       }
+       uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Crease SubSurf|Shift E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
+
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CW|Ctrl E",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
index e104b404f395eb662a2ac5600d4dd1327e5eeea1..9bf5468bf1e483c99ae6a345b42b6b8cddd08109 100644 (file)
@@ -1807,7 +1807,7 @@ static void tb_do_mesh(void *arg, int event){
        case 2: G.f ^= G_DRAWEDGES; break;
        case 3: G.f ^= G_DRAWFACES; break;
        case 4: G.f ^= G_DRAWNORMALS; break;
-       case 5: me->flag ^= ME_SUBSURF; DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA); break;
+       case 5: flip_subdivison(OBACT, -1); break;
        case 6: me->flag ^= ME_OPT_EDGES; DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA); break;
        }
        addqueue(curarea->win, REDRAW, 1);
index 49395b17a98f068be3f24c83379d4bd6292e3471..c993564cd3d66844ed25c8c6e8cf3e0813c9d463 100644 (file)
@@ -225,8 +225,8 @@ void make_vertexcol()       /* single ob */
 {
        Object *ob;
        Mesh *me;
-       DispList *dl;
-       
+       int i;
+
        /*
         * Always copies from shadedisplist to mcol.
         * When there are tfaces, it copies the colors and frees mcol
@@ -241,38 +241,14 @@ void make_vertexcol()     /* single ob */
        me= get_mesh(ob);
        if(me==0) return;
 
-       /* to be able to copy lighting info, we only use it from single side (ton) */
-       if(me->flag & ME_TWOSIDED) {
-               me->flag &= ~ME_TWOSIDED;
-       }
-       
-       /* but subsurf vertex colors are wrong */
-       if (me->flag & ME_SUBSURF) {
-               if(me->mcol) MEM_freeN(me->mcol);
-               me->mcol= MEM_callocN(4*me->totface*sizeof(MCol), "mcol");
-       }
-       else {
-               dl= ob->disp.first;
-               
-               if(dl==NULL || dl->col1==NULL) {
-                       shadeDispList(ob);
-                       dl= find_displist(&ob->disp, DL_VERTCOL);
-               }
-               if(dl && dl->col1) {
-                       if(me->mcol) MEM_freeN(me->mcol);
-                       me->mcol= MEM_dupallocN(dl->col1);
-               }
+       if(me->mcol) MEM_freeN(me->mcol);
+       mesh_create_shadedColors(ob, 1, (unsigned int**) &me->mcol, NULL);
+
+       for (i=0; i<me->totface*4; i++) {
+               me->mcol[i].a = 255;
        }
-       
-       if(me->mcol) {
-               int i;
-               for (i=0; i<me->totface*4; i++) {
-                       MCol *mcol= &me->mcol[i];
-                       mcol->a= 255;
-               }
                
-               if(me->tface) mcol_to_tface(me, 1);
-       }
+       if(me->tface) mcol_to_tface(me, 1);
        
        DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);