[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