Revision: 19503
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19503
Author:   blendix
Date:     2009-04-02 16:38:40 +0200 (Thu, 02 Apr 2009)

Log Message:
-----------
2.5: weight paint mode fix for corrupted layer data, and added
a customdata layer specifically to store weightpaint colors
instead of abusing the vertex colors layers.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/intern/DerivedMesh.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/customdata.c
    
branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_draw.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_customdata_types.h

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/DerivedMesh.c  
2009-04-02 11:30:27 UTC (rev 19502)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/DerivedMesh.c  
2009-04-02 14:38:40 UTC (rev 19503)
@@ -1433,6 +1433,8 @@
        return orco;
 }
 
+/* orco custom data layer */
+
 static DerivedMesh *create_orco_dm(Object *ob, Mesh *me, EditMesh *em)
 {
        DerivedMesh *dm;
@@ -1484,6 +1486,96 @@
                DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, orco);
 }
 
+/* weight paint colors */
+
+/* Something of a hack, at the moment deal with weightpaint
+ * by tucking into colors during modifier eval, only in
+ * wpaint mode. Works ok but need to make sure recalc
+ * happens on enter/exit wpaint.
+ */
+
+void weight_to_rgb(float input, float *fr, float *fg, float *fb)
+{
+       float blend;
+       
+       blend= ((input/2.0f)+0.5f);
+       
+       if (input<=0.25f){      // blue->cyan
+               *fr= 0.0f;
+               *fg= blend*input*4.0f;
+               *fb= blend;
+       }
+       else if (input<=0.50f){ // cyan->green
+               *fr= 0.0f;
+               *fg= blend;
+               *fb= blend*(1.0f-((input-0.25f)*4.0f)); 
+       }
+       else if (input<=0.75){  // green->yellow
+               *fr= blend * ((input-0.50f)*4.0f);
+               *fg= blend;
+               *fb= 0.0f;
+       }
+       else if (input<=1.0){ // yellow->red
+               *fr= blend;
+               *fg= blend * (1.0f-((input-0.75f)*4.0f)); 
+               *fb= 0.0f;
+       }
+}
+
+static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, 
unsigned char *col)
+{
+       Mesh *me = ob->data;
+       float colf[4], input = 0.0f;
+       int i;
+
+       if (me->dvert) {
+               for (i=0; i<me->dvert[vert].totweight; i++)
+                       if (me->dvert[vert].dw[i].def_nr==ob->actdef-1)
+                               input+=me->dvert[vert].dw[i].weight;            
+       }
+
+       CLAMP(input, 0.0f, 1.0f);
+       
+       if(coba)
+               do_colorband(coba, input, colf);
+       else
+               weight_to_rgb(input, colf, colf+1, colf+2);
+       
+       col[3] = (unsigned char)(colf[0] * 255.0f);
+       col[2] = (unsigned char)(colf[1] * 255.0f);
+       col[1] = (unsigned char)(colf[2] * 255.0f);
+       col[0] = 255;
+}
+
+static ColorBand *stored_cb= NULL;
+
+void vDM_ColorBand_store(ColorBand *coba)
+{
+       stored_cb= coba;
+}
+
+static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm)
+{
+       Mesh *me = ob->data;
+       MFace *mf = me->mface;
+       ColorBand *coba= stored_cb;     /* warning, not a local var */
+       unsigned char *wtcol;
+       int i;
+       
+       wtcol = MEM_callocN (sizeof (unsigned char) * me->totface*4*4, 
"weightmap");
+       
+       memset(wtcol, 0x55, sizeof (unsigned char) * me->totface*4*4);
+       for (i=0; i<me->totface; i++, mf++) {
+               calc_weightpaint_vert_color(ob, coba, mf->v1, &wtcol[(i*4 + 
0)*4]); 
+               calc_weightpaint_vert_color(ob, coba, mf->v2, &wtcol[(i*4 + 
1)*4]); 
+               calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 
2)*4]); 
+               if (mf->v4)
+                       calc_weightpaint_vert_color(ob, coba, mf->v4, 
&wtcol[(i*4 + 3)*4]); 
+       }
+       
+       CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol, 
dm->numFaceData);
+}
+
 static void mesh_calc_modifiers(Scene *scene, Object *ob, float 
(*inputVertexCos)[3],
                                 DerivedMesh **deform_r, DerivedMesh **final_r,
                                 int useRenderParams, int useDeform,
@@ -1547,6 +1639,7 @@
                 */
                if (deform_r) {
                        *deform_r = CDDM_from_mesh(me, ob);
+
                        if(deformedVerts) {
                                CDDM_apply_vert_coords(*deform_r, 
deformedVerts);
                                CDDM_calc_normals(*deform_r);
@@ -1632,6 +1725,9 @@
                                        CDDM_apply_vert_coords(dm, 
deformedVerts);
                                        CDDM_calc_normals(dm);
                                }
+
+                               if(dataMask & CD_MASK_WEIGHT_MCOL)
+                                       add_weight_mcol_dm(ob, dm);
                        }
 
                        /* create an orco derivedmesh in parallel */
@@ -1695,14 +1791,21 @@
 
                CDDM_apply_vert_coords(finaldm, deformedVerts);
                CDDM_calc_normals(finaldm);
+
+               if(dataMask & CD_MASK_WEIGHT_MCOL)
+                       add_weight_mcol_dm(ob, finaldm);
        } else if(dm) {
                finaldm = dm;
        } else {
                finaldm = CDDM_from_mesh(me, ob);
+
                if(deformedVerts) {
                        CDDM_apply_vert_coords(finaldm, deformedVerts);
                        CDDM_calc_normals(finaldm);
                }
+
+               if(dataMask & CD_MASK_WEIGHT_MCOL)
+                       add_weight_mcol_dm(ob, finaldm);
        }
 
        /* add an orco layer if needed */
@@ -1932,96 +2035,6 @@
                MEM_freeN(deformedVerts);
 }
 
-/***/
-
-
-       /* Something of a hack, at the moment deal with weightpaint
-        * by tucking into colors during modifier eval, only in
-        * wpaint mode. Works ok but need to make sure recalc
-        * happens on enter/exit wpaint.
-        */
-
-void weight_to_rgb(float input, float *fr, float *fg, float *fb)
-{
-       float blend;
-       
-       blend= ((input/2.0f)+0.5f);
-       
-       if (input<=0.25f){      // blue->cyan
-               *fr= 0.0f;
-               *fg= blend*input*4.0f;
-               *fb= blend;
-       }
-       else if (input<=0.50f){ // cyan->green
-               *fr= 0.0f;
-               *fg= blend;
-               *fb= blend*(1.0f-((input-0.25f)*4.0f)); 
-       }
-       else if (input<=0.75){  // green->yellow
-               *fr= blend * ((input-0.50f)*4.0f);
-               *fg= blend;
-               *fb= 0.0f;
-       }
-       else if (input<=1.0){ // yellow->red
-               *fr= blend;
-               *fg= blend * (1.0f-((input-0.75f)*4.0f)); 
-               *fb= 0.0f;
-       }
-}
-static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, 
unsigned char *col)
-{
-       Mesh *me = ob->data;
-       float colf[4], input = 0.0f;
-       int i;
-
-       if (me->dvert) {
-               for (i=0; i<me->dvert[vert].totweight; i++)
-                       if (me->dvert[vert].dw[i].def_nr==ob->actdef-1)
-                               input+=me->dvert[vert].dw[i].weight;            
-       }
-
-       CLAMP(input, 0.0f, 1.0f);
-       
-       if(coba)
-               do_colorband(coba, input, colf);
-       else
-               weight_to_rgb(input, colf, colf+1, colf+2);
-       
-       col[3] = (unsigned char)(colf[0] * 255.0f);
-       col[2] = (unsigned char)(colf[1] * 255.0f);
-       col[1] = (unsigned char)(colf[2] * 255.0f);
-       col[0] = 255;
-}
-
-static ColorBand *stored_cb= NULL;
-
-void vDM_ColorBand_store(ColorBand *coba)
-{
-       stored_cb= coba;
-}
-
-static unsigned char *calc_weightpaint_colors(Object *ob) 
-{
-       Mesh *me = ob->data;
-       MFace *mf = me->mface;
-       ColorBand *coba= stored_cb;     /* warning, not a local var */
-       unsigned char *wtcol;
-       int i;
-       
-       wtcol = MEM_callocN (sizeof (unsigned char) * me->totface*4*4, 
"weightmap");
-       
-       memset(wtcol, 0x55, sizeof (unsigned char) * me->totface*4*4);
-       for (i=0; i<me->totface; i++, mf++) {
-               calc_weightpaint_vert_color(ob, coba, mf->v1, &wtcol[(i*4 + 
0)*4]); 
-               calc_weightpaint_vert_color(ob, coba, mf->v2, &wtcol[(i*4 + 
1)*4]); 
-               calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 
2)*4]); 
-               if (mf->v4)
-                       calc_weightpaint_vert_color(ob, coba, mf->v4, 
&wtcol[(i*4 + 3)*4]); 
-       }
-       
-       return wtcol;
-}
-
 static void clear_mesh_caches(Object *ob)
 {
        Mesh *me= ob->data;
@@ -2052,43 +2065,17 @@
 
 static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask)
 {
-       Mesh *me = ob->data;
-       float min[3], max[3];
-       //int needMapping= 0; 
-       
        Object *obact = scene->basact?scene->basact->object:NULL;
        int editing = (FACESEL_PAINT_TEST)|(G.f & G_PARTICLEEDIT);
        int needMapping = editing && (ob==obact);
+       float min[3], max[3];
        
        clear_mesh_caches(ob);
 
-       if( (G.f & G_WEIGHTPAINT) && ob==obact ) {
-//     if(dataMask & CD_MASK_WEIGHTPAINT) {
-               MCol *wpcol = (MCol*)calc_weightpaint_colors(ob);
-               int layernum = CustomData_number_of_layers(&me->fdata, CD_MCOL);
-               int prevactive = CustomData_get_active_layer(&me->fdata, 
CD_MCOL);
-               int prevrender = CustomData_get_render_layer(&me->fdata, 
CD_MCOL);
+       mesh_calc_modifiers(scene, ob, NULL, &ob->derivedDeform,
+                                               &ob->derivedFinal, 0, 1,
+                                               needMapping, dataMask, -1);
 
-               /* ugly hack here, we temporarily add a new active mcol layer 
with
-                  weightpaint colors in it, that is then duplicated in 
CDDM_from_mesh */
-               CustomData_add_layer(&me->fdata, CD_MCOL, CD_ASSIGN, wpcol, 
me->totface);
-               CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum);
-               CustomData_set_layer_render(&me->fdata, CD_MCOL, layernum);
-
-               mesh_calc_modifiers(scene, ob, NULL, &ob->derivedDeform,
-                                                       &ob->derivedFinal, 0, 1,
-                                                       needMapping, dataMask, 
-1);
-
-               CustomData_free_layer_active(&me->fdata, CD_MCOL, me->totface);
-               CustomData_set_layer_active(&me->fdata, CD_MCOL, prevactive);
-               CustomData_set_layer_render(&me->fdata, CD_MCOL, prevrender);
-       } 
-       else {
-               mesh_calc_modifiers(scene, ob, NULL, &ob->derivedDeform,
-                                                       &ob->derivedFinal, 
G.rendering, 1,
-                                                       needMapping, dataMask, 
-1);
-       }
-
        INIT_MINMAX(min, max);
 
        ob->derivedFinal->getMinMax(ob->derivedFinal, min, max);

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/blenkernel/intern/cdderivedmesh.c    
    2009-04-02 11:30:27 UTC (rev 19502)
+++ 
branches/blender2.5/blender/source/blender/blenkernel/intern/cdderivedmesh.c    
    2009-04-02 14:38:40 UTC (rev 19503)
@@ -482,10 +482,14 @@
        CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
        MVert *mv = cddm->mvert;
        MFace *mf = cddm->mface;
-       MCol *mc = DM_get_face_data_layer(dm, CD_MCOL);
+       MCol *mc;
        float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
        int i, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
 
+       mc = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
+       if(!mc)
+               mc = DM_get_face_data_layer(dm, CD_MCOL);
+
        for(i = 0; i < dm->numFaceData; i++, mf++) {
                int drawSmooth = (mf->flag & ME_SMOOTH);
 
@@ -926,13 +930,6 @@
        index = CustomData_get_layer(&dm->faceData, CD_ORIGINDEX);
        for(i = 0; i < mesh->totface; ++i, ++index)
                *index = i;
-       
-       /* works in conjunction with hack during modifier calc, where active 
mcol
-          layer with weight paint colors is temporarily added */
-       /* XXX make this real but temporary layer */
-//     if ((G.f & G_WEIGHTPAINT) &&
-//             (ob && ob==(scene->basact?scene->basact->object:NULL)))
-//             CustomData_duplicate_referenced_layer(&dm->faceData, CD_MCOL);
 
        return dm;
 }

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/customdata.c   
2009-04-02 11:30:27 UTC (rev 19502)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/customdata.c   
2009-04-02 14:38:40 UTC (rev 19503)
@@ -707,14 +707,16 @@
        {sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, 
layerInterp_mloopcol, NULL, layerDefault_mloopcol},
        {sizeof(float)*3*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
        {sizeof(MDisps), "MDisps", 1, NULL, layerCopy_mdisps,
-        layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL}
+        layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL},

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to