[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30560] branches/soc-2010-nicolasbishop/ source/blender: == VPaint ==

Nicholas Bishop nicholasbishop at gmail.com
Wed Jul 21 02:47:19 CEST 2010


Revision: 30560
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30560
Author:   nicholasbishop
Date:     2010-07-21 02:47:19 +0200 (Wed, 21 Jul 2010)

Log Message:
-----------
== VPaint ==

Work-in-progress, vpaint + multires. This commit just adds gpu drawing and vpaint editing of the multires colors through the PBVH. The colors aren't stored or subdivided yet though, so as soon as you switch levels or otherwise rebuild the PBVH the painted colors will disappear.

Modified Paths:
--------------
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_dmgrid.h
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/multires.c
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/soc-2010-nicolasbishop/source/blender/blenlib/intern/pbvh.c
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c
    branches/soc-2010-nicolasbishop/source/blender/gpu/GPU_buffers.h
    branches/soc-2010-nicolasbishop/source/blender/gpu/intern/gpu_buffers.c

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_dmgrid.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_dmgrid.h	2010-07-20 23:53:52 UTC (rev 30559)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_dmgrid.h	2010-07-21 00:47:19 UTC (rev 30560)
@@ -9,26 +9,31 @@
 */
 typedef struct GridKey {
 	int co;
+	int color;
 	int mask;
 	int no;
 } GridKey;
 
-#define GRIDELEM_KEY_INIT(_gridkey, _totco, _totmask, _totno)	\
-	((_gridkey)->co = _totco, (_gridkey)->mask = _totmask, (_gridkey)->no = _totno)
+#define GRIDELEM_KEY_INIT(_gridkey, _totco, _totcolor, _totmask, _totno) \
+	((_gridkey)->co = _totco, (_gridkey)->color = _totcolor, (_gridkey)->mask = _totmask, (_gridkey)->no = _totno)
 
-#define GRIDELEM_SIZE(_key) ((3*(_key)->co + (_key)->mask + 3*(_key)->no) * sizeof(float))
-#define GRIDELEM_MASK_OFFSET(_key) ((_key)->mask ? 3*(_key)->co*sizeof(float) : -1)
-#define GRIDELEM_NO_OFFSET(_key) ((_key)->no ? (3*(_key)->co + (_key)->mask) * sizeof(float) : -1)
-#define GRIDELEM_INTERP_COUNT(_key) (3*(_key)->co + (_key)->mask)
+#define GRIDELEM_SIZE(_key) ((3*(_key)->co + 3*(_key)->color + (_key)->mask + 3*(_key)->no) * sizeof(float))
+#define GRIDELEM_INTERP_COUNT(_key) (3*(_key)->co + 3*(_key)->color + (_key)->mask)
 
+#define GRIDELEM_COLOR_OFFSET(_key) (3*(_key)->co*sizeof(float))
+#define GRIDELEM_MASK_OFFSET(_key) (GRIDELEM_COLOR_OFFSET(_key) + 3*(_key)->color*sizeof(float))
+#define GRIDELEM_NO_OFFSET(_key) (GRIDELEM_MASK_OFFSET(_key) + (_key)->mask*sizeof(float))
+
 #define GRIDELEM_AT(_grid, _elem, _key) ((struct DMGridData*)(((char*)(_grid)) + (_elem) * GRIDELEM_SIZE(_key)))
 #define GRIDELEM_INC(_grid, _inc, _key) ((_grid) = GRIDELEM_AT(_grid, _inc, _key))
 
 #define GRIDELEM_CO(_grid, _key) ((float*)(_grid))
+#define GRIDELEM_COLOR(_grid, _key) ((float*)((char*)(_grid) + GRIDELEM_COLOR_OFFSET(_key)))
 #define GRIDELEM_NO(_grid, _key) ((float*)((char*)(_grid) + GRIDELEM_NO_OFFSET(_key)))
 #define GRIDELEM_MASK(_grid, _key) ((float*)((char*)(_grid) + GRIDELEM_MASK_OFFSET(_key)))
 
 #define GRIDELEM_CO_AT(_grid, _elem, _key) GRIDELEM_CO(GRIDELEM_AT(_grid, _elem, _key), _key)
+#define GRIDELEM_COLOR_AT(_grid, _elem, _key) GRIDELEM_COLOR(GRIDELEM_AT(_grid, _elem, _key), _key)
 #define GRIDELEM_NO_AT(_grid, _elem, _key) GRIDELEM_NO(GRIDELEM_AT(_grid, _elem, _key), _key)
 #define GRIDELEM_MASK_AT(_grid, _elem, _key) GRIDELEM_MASK(GRIDELEM_AT(_grid, _elem, _key), _key)
 

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/DerivedMesh.c	2010-07-20 23:53:52 UTC (rev 30559)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/DerivedMesh.c	2010-07-21 00:47:19 UTC (rev 30560)
@@ -2198,8 +2198,11 @@
 	Object *obact = scene->basact?scene->basact->object:NULL;
 	int editing = paint_facesel_test(ob);
 	/* weight paint and face select need original indicies because of selection buffer drawing */
-	int needMapping = (ob==obact) && (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT|OB_MODE_VERTEX_PAINT)) || editing);
+	int needMapping = (ob==obact) && (editing || (ob->mode & OB_MODE_WEIGHT_PAINT));
 
+	if((ob->mode & OB_MODE_VERTEX_PAINT) && (scene->toolsettings->vpaint->flag & VP_BACKBUF))
+		needMapping |= 1;
+
 	clear_mesh_caches(ob);
 
 	mesh_calc_modifiers(scene, ob, NULL, &ob->derivedDeform,

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/multires.c	2010-07-20 23:53:52 UTC (rev 30559)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/multires.c	2010-07-21 00:47:19 UTC (rev 30560)
@@ -465,6 +465,7 @@
 {
 	SubsurfModifierData smd;
 	GridKey gridkey;
+	int color_totlayer;
 	int pmask_totlayer;
 
 	memset(&smd, 0, sizeof(SubsurfModifierData));
@@ -475,9 +476,12 @@
 	if(optimal)
 		smd.flags |= eSubsurfModifierFlag_ControlEdges;
 
+	/* TODO: enable/disable element types */
+	color_totlayer = CustomData_number_of_layers(&get_mesh(ob)->fdata,
+						     CD_MCOL);
 	pmask_totlayer = CustomData_number_of_layers(&get_mesh(ob)->vdata,
 						     CD_PAINTMASK);
-	GRIDELEM_KEY_INIT(&gridkey, 1, pmask_totlayer, 1);
+	GRIDELEM_KEY_INIT(&gridkey, 1, color_totlayer, pmask_totlayer, 1);
 			  
 	return subsurf_make_derived_from_derived(dm, &smd, &gridkey, 0, NULL, 0, 0);
 }

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c	2010-07-20 23:53:52 UTC (rev 30559)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c	2010-07-21 00:47:19 UTC (rev 30560)
@@ -323,7 +323,7 @@
 	if(!dmtface || !tface)
 		return;
 
-	GRIDELEM_KEY_INIT(&gridkey, 1, 0, 0); /* TODO */
+	GRIDELEM_KEY_INIT(&gridkey, 1, 0, 0, 0); /* TODO */
 
 	/* create a CCGSubSurf from uv's */
 	uvss = _getSubSurf(NULL, &gridkey, ccgSubSurf_getSubdivisionLevels(ss), 0, 1, 0);
@@ -433,7 +433,7 @@
 	int totvert = dm->getNumVerts(dm);
 	int totedge = dm->getNumEdges(dm);
 	int totface = dm->getNumFaces(dm);
-	int i;
+	int i, j;
 	int *index;
 	MVert *mvert = dm->getVertArray(dm);
 	MEdge *medge = dm->getEdgeArray(dm);
@@ -443,27 +443,79 @@
 	MFace *mf;
 	float *vertData;
 	GridKey *gridkey = ccgSubSurf_getGridKey(ss);
+	float (*colors)[3] = NULL;
 	int pmask_layer_count, pmask_first_layer;
 
 	ccgSubSurf_initFullSync(ss);
 
 	mv = mvert;
 	index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
+
 	pmask_layer_count = CustomData_number_of_layers(&dm->vertData, CD_PAINTMASK);
 	pmask_first_layer = CustomData_get_layer_index(&dm->vertData, CD_PAINTMASK);
-	vertData = MEM_callocN(GRIDELEM_SIZE(gridkey), "vertData");
 
 	assert(gridkey->mask == 0 || gridkey->mask == pmask_layer_count);
 
+	vertData = MEM_callocN(GRIDELEM_SIZE(gridkey), "vertData");
+
+	/* for editable subdivided colors, find the average mcol for each vert */
+	if(gridkey->color) {
+		int mcol_totlayer, mcol_first_layer;
+		int *users;
+		int k;
+
+		mcol_totlayer = CustomData_number_of_layers(&dm->faceData, CD_MCOL);
+		mcol_first_layer = CustomData_get_layer_index(&dm->faceData, CD_MCOL);
+
+		colors = MEM_callocN(sizeof(float)*3*mcol_totlayer*totvert,
+				     "ss_sync_from_derivedmesh.colors");
+		users = MEM_callocN(sizeof(int)*totvert,
+				    "ss_sync_from_derivedmesh.users");
+
+		for(i = 0; i < totface; ++i) {
+			MFace *f = mface + i;
+			int S = f->v4 ? 4 : 3;
+
+			for(j = 0; j < S; ++j) {
+				int vndx = (&f->v1)[j];
+
+				++users[vndx];
+
+				for(k = 0; k < mcol_totlayer; ++k) {
+					MCol *mcol = dm->faceData.layers[mcol_first_layer+k].data;
+
+					colors[vndx*mcol_totlayer + k][0] = mcol[i*4+j].r;
+					colors[vndx*mcol_totlayer + k][1] = mcol[i*4+j].g;
+					colors[vndx*mcol_totlayer + k][2] = mcol[i*4+j].b;
+
+				}
+			}
+		}
+
+		for(i = 0; i < totvert; ++i) {
+			float inv = 1.0f / users[i];
+			for(j = 0; j < mcol_totlayer; ++j) {
+				colors[i*mcol_totlayer + j][0] *= inv;
+				colors[i*mcol_totlayer + j][1] *= inv;
+				colors[i*mcol_totlayer + j][2] *= inv;
+			}
+		}
+
+		MEM_freeN(users);
+	}
+
 	for(i = 0; i < totvert; i++, mv++) {
 		CCGVert *v;
-		int j;
 
 		copy_v3_v3(vertData, vertexCos ? vertexCos[i] : mv->co);
 
+		/* copy color data */
+		for(j = 0; j < gridkey->color; ++j)
+			memcpy(&vertData[3 + 3*j], colors[i*gridkey->color + j], sizeof(float)*3);
+
 		/* copy paint mask data */
 		for(j = 0; j < gridkey->mask; ++j)
-			vertData[3 + j] = ((float*)dm->vertData.layers[pmask_first_layer+j].data)[i];
+			vertData[3 + gridkey->color * 3 + j] = ((float*)dm->vertData.layers[pmask_first_layer+j].data)[i];
 
 		ccgSubSurf_syncVert(ss, SET_INT_IN_POINTER(i), vertData, 0, &v);
 
@@ -471,6 +523,7 @@
 	}
 
 	MEM_freeN(vertData);
+	if(colors) MEM_freeN(colors);
 
 	me = medge;
 	index = (int *)dm->getEdgeDataArray(dm, CD_ORIGINDEX);
@@ -1290,34 +1343,48 @@
 	}
 }
 
-	/* Only used by non-editmesh types */
-static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)[4], int fast, int (*setMaterial)(int, void *attribs)) {
-	CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
-	CCGSubSurf *ss = ccgdm->ss;
-	CCGFaceIterator *fi;
-	int gridSize = ccgSubSurf_getGridSize(ss);
-	GridKey *gridkey = ccgSubSurf_getGridKey(ss);
+static int ccgdm_draw_pbvh(DerivedMesh *dm, float (*partial_redraw_planes)[4],
+			   int (*setMaterial)(int, void *attribs),
+			   int fast_navigate, GPUDrawFlags drawflags)
+{
+	CCGDerivedMesh *ccgdm = (CCGDerivedMesh*)dm;
 	char *faceFlags = ccgdm->faceFlags;
-	int step = (fast)? gridSize-1: 1;
 
 	ccgdm_pbvh_update(ccgdm);
 
-	if(ccgdm->pbvh && ccgdm->multires.mmd && !fast) {
+	if(ccgdm->pbvh && ccgdm->multires.mmd && !fast_navigate) {
 		if(dm->numFaceData) {
-			GPUDrawFlags drawflags = 0;
-
 			/* should be per face */
-			if(!setMaterial(faceFlags[1]+1, NULL))
-				return;
+			if(setMaterial && !setMaterial(faceFlags[1]+1, NULL))
+				return 1;
 			if(faceFlags[0] & ME_SMOOTH)
 				drawflags |= GPU_DRAW_SMOOTH;
 
 			BLI_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL, drawflags);
 		}
 
-		return;
+		return 1;
 	}
 
+	return 0;
+}
+
+/* Only used by non-editmesh types */
+static void ccgDM_drawFacesSolid(DerivedMesh *dm,
+				 float (*partial_redraw_planes)[4],
+				 int fast_navigate,
+				 int (*setMaterial)(int, void *attribs)) {
+	CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
+	CCGSubSurf *ss = ccgdm->ss;
+	CCGFaceIterator *fi;
+	int gridSize = ccgSubSurf_getGridSize(ss);
+	GridKey *gridkey = ccgSubSurf_getGridKey(ss);
+	char *faceFlags = ccgdm->faceFlags;
+	int step = (fast_navigate)? gridSize-1: 1;
+
+	if(ccgdm_draw_pbvh(dm, partial_redraw_planes, setMaterial, fast_navigate, 0))
+		return;
+
 	fi = ccgSubSurf_getFaceIterator(ss);
 	for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
 		CCGFace *f = ccgFaceIterator_getCurrent(fi);
@@ -1802,6 +1869,10 @@
 	char *faceFlags = ccgdm->faceFlags;
 	int gridFaces = gridSize - 1, totface;
 
+	if(ccgdm_draw_pbvh(dm, NULL, NULL, 0, /* TODO, fast nav. */
+			   useColors ? GPU_DRAW_ACTIVE_MCOL : 0))
+		return;
+
 	if(useColors) {
 		mcol = dm->getFaceDataArray(dm, CD_WEIGHT_MCOL);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list