Revision: 42301
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42301
Author:   miikah
Date:     2011-11-30 20:41:13 +0000 (Wed, 30 Nov 2011)
Log Message:
-----------
Dynamic paint vertex color output now works with bmesh.

3D view preview still doesn't work because the used CD_WEIGHT_MCOL data layer 
isn't yet generated properly during poly tessellation.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/dynamicpaint.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/dynamicpaint.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/dynamicpaint.c      
2011-11-30 20:37:05 UTC (rev 42300)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/dynamicpaint.c      
2011-11-30 20:41:13 UTC (rev 42301)
@@ -1544,11 +1544,11 @@
                                        /* vertex color paint */
                                        if (surface->type == 
MOD_DPAINT_SURFACE_T_PAINT) {
 
-                                               MFace *mface = 
result->getTessFaceArray(result);
-                                               int numOfFaces = 
result->getNumTessFaces(result);
                                                int i;
                                                PaintPoint* pPoint = 
(PaintPoint*)sData->type_data;
-                                               MCol *col;
+                                               MLoopCol *col = NULL;
+                                               MLoop *mloop = 
CDDM_get_loops(result);
+                                               int totloop = 
result->numLoopData;
 
                                                /* paint is stored on dry and 
wet layers, so mix final color first */
                                                float *fcolor = 
MEM_callocN(sizeof(float)*sData->total_points*4, "Temp paint color");
@@ -1560,27 +1560,31 @@
                                                }
 
                                                /* viewport preview */
-                                               if (surface->flags & 
MOD_DPAINT_PREVIEW) {
-                                                       /* Save preview results 
to weight layer, to be
+                                               if (0 && surface->flags & 
MOD_DPAINT_PREVIEW) {
+                                                       MPoly *mp = 
CDDM_get_polys(result);
+                                                       int totpoly = 
result->numPolyData;
+
+                                                       /* Save preview results 
to weight layer to be
                                                        *   able to share same 
drawing methods */
-                                                       col = 
result->getTessFaceDataArray(result, CD_WEIGHT_MCOL);
-                                                       if (!col) col = 
CustomData_add_layer(&result->faceData, CD_WEIGHT_MCOL, CD_CALLOC, NULL, 
numOfFaces);
+                                                       col = 
CustomData_get_layer(&dm->loopData, CD_WEIGHT_MLOOPCOL);
+                                                       if (!col) col = 
CustomData_add_layer(&dm->loopData, CD_WEIGHT_MLOOPCOL, CD_CALLOC, NULL, 
totloop);
 
                                                        if (col) {
                                                                #pragma omp 
parallel for schedule(static)
-                                                               for (i=0; 
i<numOfFaces; i++) {
+                                                               for (i=0; 
i<totpoly; i++) {
                                                                        int j=0;
-                                                                       
Material *material = give_current_material(ob, mface[i].mat_nr+1);
+                                                                       
Material *material = give_current_material(ob, mp[i].mat_nr+1);
 
-                                                                       for (; 
j<((mface[i].v4)?4:3); j++) {
-                                                                               
int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: 
mface[i].v4;
+                                                                       for (; 
j<mp[i].totloop; j++) {
+                                                                               
int l_index = mp[i].loopstart + j;
+                                                                               
int v_index = mloop[l_index].v;
 
                                                                                
if (surface->preview_id == MOD_DPAINT_SURFACE_PREV_PAINT) {
                                                                                
        float c[3];
-                                                                               
        index *= 4;
+                                                                               
        v_index *= 4;
 
                                                                                
        /* Apply material color as base vertex color for preview */
-                                                                               
        col[i*4+j].a = 255;
+                                                                               
        col[l_index].a = 255;
                                                                                
        if (material) {
                                                                                
                c[0] = material->r;
                                                                                
                c[1] = material->g;
@@ -1592,17 +1596,17 @@
                                                                                
                c[2] = 0.65f;
                                                                                
        }
                                                                                
        /* mix surface color */
-                                                                               
        interp_v3_v3v3(c, c, &fcolor[index], fcolor[index+3]);
+                                                                               
        interp_v3_v3v3(c, c, &fcolor[v_index], fcolor[v_index+3]);
 
-                                                                               
        col[i*4+j].r = FTOCHAR(c[2]);
-                                                                               
        col[i*4+j].g = FTOCHAR(c[1]);
-                                                                               
        col[i*4+j].b = FTOCHAR(c[0]);
+                                                                               
        col[l_index].r = FTOCHAR(c[2]);
+                                                                               
        col[l_index].g = FTOCHAR(c[1]);
+                                                                               
        col[l_index].b = FTOCHAR(c[0]);
                                                                                
}
                                                                                
else {
-                                                                               
        col[i*4+j].a = 255;
-                                                                               
        col[i*4+j].r = FTOCHAR(pPoint[index].wetness);
-                                                                               
        col[i*4+j].g = FTOCHAR(pPoint[index].wetness);
-                                                                               
        col[i*4+j].b = FTOCHAR(pPoint[index].wetness);
+                                                                               
        col[l_index].a = 255;
+                                                                               
        col[l_index].r = FTOCHAR(pPoint[v_index].wetness);
+                                                                               
        col[l_index].g = FTOCHAR(pPoint[v_index].wetness);
+                                                                               
        col[l_index].b = FTOCHAR(pPoint[v_index].wetness);
                                                                                
}
                                                                        }
                                                                }
@@ -1614,79 +1618,69 @@
                                                /* save layer data to output 
layer */
 
                                                /* paint layer */
-                                               col = 
CustomData_get_layer_named(&result->faceData, CD_MCOL, surface->output_name);
+                                               col = 
CustomData_get_layer_named(&result->loopData, CD_MLOOPCOL, 
surface->output_name);
                                                /* if output layer is lost from 
a constructive modifier, re-add it */
                                                if (!col && 
dynamicPaint_outputLayerExists(surface, ob, 0))
-                                                       col = 
CustomData_add_layer_named(&result->faceData, CD_MCOL, CD_CALLOC, NULL, 
numOfFaces, surface->output_name);
+                                                       col = 
CustomData_add_layer_named(&result->loopData, CD_MLOOPCOL, CD_CALLOC, NULL, 
totloop, surface->output_name);
                                                /* apply color */
                                                if (col) {
                                                        #pragma omp parallel 
for schedule(static)
-                                                       for (i=0; i<numOfFaces; 
i++) {
-                                                               int j=0;
-                                                               for (; 
j<((mface[i].v4)?4:3); j++) {
-                                                                       int 
index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
-                                                                       index 
*= 4;
-
-                                                                       
col[i*4+j].a = FTOCHAR(fcolor[index+3]);
-                                                                       
col[i*4+j].r = FTOCHAR(fcolor[index+2]);
-                                                                       
col[i*4+j].g = FTOCHAR(fcolor[index+1]);
-                                                                       
col[i*4+j].b = FTOCHAR(fcolor[index]);
-                                                               }
+                                                       for (i=0; i<totloop; 
i++) {
+                                                               int index = 
mloop[i].v*4;
+                                                               col[i].a = 
FTOCHAR(fcolor[index+3]);
+                                                               col[i].r = 
FTOCHAR(fcolor[index+2]);
+                                                               col[i].g = 
FTOCHAR(fcolor[index+1]);
+                                                               col[i].b = 
FTOCHAR(fcolor[index]);
                                                        }
                                                }
                                                
                                                MEM_freeN(fcolor);
 
                                                /* wet layer */
-                                               col = 
CustomData_get_layer_named(&result->faceData, CD_MCOL, surface->output_name2);
+                                               col = 
CustomData_get_layer_named(&result->loopData, CD_MLOOPCOL, 
surface->output_name2);
                                                /* if output layer is lost from 
a constructive modifier, re-add it */
                                                if (!col && 
dynamicPaint_outputLayerExists(surface, ob, 1))
-                                                       col = 
CustomData_add_layer_named(&result->faceData, CD_MCOL, CD_CALLOC, NULL, 
numOfFaces, surface->output_name2);
+                                                       col = 
CustomData_add_layer_named(&result->loopData, CD_MLOOPCOL, CD_CALLOC, NULL, 
totloop, surface->output_name2);
                                                /* apply color */
                                                if (col) {
                                                        #pragma omp parallel 
for schedule(static)
-                                                       for (i=0; i<numOfFaces; 
i++) {
-                                                               int j=0;
-
-                                                               for (; 
j<((mface[i].v4)?4:3); j++) {
-                                                                       int 
index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
-                                                                       
col[i*4+j].a = 255;
-                                                                       
col[i*4+j].r = FTOCHAR(pPoint[index].wetness);
-                                                                       
col[i*4+j].g = FTOCHAR(pPoint[index].wetness);
-                                                                       
col[i*4+j].b = FTOCHAR(pPoint[index].wetness);
-                                                               }
+                                                       for (i=0; i<totloop; 
i++) {
+                                                               int index = 
mloop[i].v;
+                                                               col[i].a = 255;
+                                                               col[i].r = 
FTOCHAR(pPoint[index].wetness);
+                                                               col[i].g = 
FTOCHAR(pPoint[index].wetness);
+                                                               col[i].b = 
FTOCHAR(pPoint[index].wetness);
                                                        }
                                                }
                                        }
                                        /* vertex group paint */
                                        else if (surface->type == 
MOD_DPAINT_SURFACE_T_WEIGHT) {
+                                               MLoop *mloop = 
CDDM_get_loops(result);
+                                               int totloop = 
result->numLoopData;
+
                                                int defgrp_index = 
defgroup_name_index(ob, surface->output_name);
                                                MDeformVert *dvert = 
result->getVertDataArray(result, CD_MDEFORMVERT);
                                                float *weight = 
(float*)sData->type_data;
+
                                                /* viewport preview */
-                                               if (surface->flags & 
MOD_DPAINT_PREVIEW) {
-                                                       /* Save preview results 
to weight layer, to be
+                                               if (0 && surface->flags & 
MOD_DPAINT_PREVIEW) {
+                                                       /* Save preview results 
to weight layer to be
                                                        *   able to share same 
drawing methods */
-                                                       MFace *mface = 
result->getTessFaceArray(result);
-                                                       int numOfFaces = 
result->getNumPolys(result);
                                                        int i;
-                                                       MCol *col = 
result->getTessFaceDataArray(result, CD_WEIGHT_MCOL);
-                                                       if (!col) col = 
CustomData_add_layer(&result->faceData, CD_WEIGHT_MCOL, CD_CALLOC, NULL, 
numOfFaces);
+                                                       MLoopCol *col = 
CustomData_get_layer(&dm->loopData, CD_WEIGHT_MLOOPCOL);
+                                                       if (!col) col = 
CustomData_add_layer(&dm->loopData, CD_WEIGHT_MLOOPCOL, CD_CALLOC, NULL, 
totloop);
 
                                                        if (col) {
+                                                               printf("doint 
weight preview\n");
                                                                #pragma omp 
parallel for schedule(static)
-                                                               for (i=0; 
i<numOfFaces; i++) {
+                                                               for (i=0; 
i<totloop; i++) {
                                                                        float 
temp_color[3];
-                                                                       int j=0;
-                                                                       for (; 
j<((mface[i].v4)?4:3); j++) {
-                                                                               
int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: 
mface[i].v4;
+                                                                       
weight_to_rgb(temp_color, weight[mloop[i].v]);
 
-                                                                               
weight_to_rgb(temp_color, weight[index]);
-                                                                               
col[i*4+j].r = FTOCHAR(temp_color[2]);
-                                                                               
col[i*4+j].g = FTOCHAR(temp_color[1]);
-                                                                               
col[i*4+j].b = FTOCHAR(temp_color[0]);
-                                                                               
col[i*4+j].a = 255;
-                                                                       }
+                                                                       
col[i].a = 255;
+                                                                       
col[i].r = FTOCHAR(temp_color[2]);
+                                                                       
col[i].g = FTOCHAR(temp_color[1]);
+                                                                       
col[i].b = FTOCHAR(temp_color[0]);
                                                                }
                                                                
pmd->canvas->flags |= MOD_DPAINT_PREVIEW_READY;
                                                        }

Modified: branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c      
2011-11-30 20:37:05 UTC (rev 42300)
+++ branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c      
2011-11-30 20:41:13 UTC (rev 42301)
@@ -473,12 +473,11 @@
 
 int ED_mesh_color_remove_named(bContext *C, Object *ob, Mesh *me, const char 
*name)
 {
-       CustomData *data= (me->edit_btmesh)? &me->edit_btmesh->bm->ldata: 
&me->ldata;
        CustomDataLayer *cdl;
        int index;
 
-       index= CustomData_get_named_layer_index(data, CD_MCOL, name);
-       cdl= (index == -1)? NULL: &data->layers[index];
+       index= CustomData_get_named_layer_index(&me->ldata, CD_MLOOPCOL, name);
+       cdl= (index == -1)? NULL: &me->ldata.layers[index];
 
        if(!cdl)
                return 0;

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

Reply via email to