[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42301] branches/bmesh/blender/source/ blender: Dynamic paint vertex color output now works with bmesh.

Miika Hamalainen miika.hamalainen at kolumbus.fi
Wed Nov 30 21:41:13 CET 2011


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;




More information about the Bf-blender-cvs mailing list