[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37259] branches/soc-2011-onion/source/ blender: Revision: 30560

Jason Wilkins Jason.A.Wilkins at gmail.com
Mon Jun 6 19:48:29 CEST 2011


Revision: 37259
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37259
Author:   jwilkins
Date:     2011-06-06 17:48:29 +0000 (Mon, 06 Jun 2011)
Log Message:
-----------
Revision: 30560
Author: nicholasbishop
Date: 7:47:19 PM, Tuesday, July 20, 2010
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-2011-onion/source/blender/blenkernel/BKE_dmgrid.h
    branches/soc-2011-onion/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c
    branches/soc-2011-onion/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_vertex.c
    branches/soc-2011-onion/source/blender/gpu/intern/gpu_buffers.c

Modified: branches/soc-2011-onion/source/blender/blenkernel/BKE_dmgrid.h
===================================================================
--- branches/soc-2011-onion/source/blender/blenkernel/BKE_dmgrid.h	2011-06-06 17:23:24 UTC (rev 37258)
+++ branches/soc-2011-onion/source/blender/blenkernel/BKE_dmgrid.h	2011-06-06 17:48:29 UTC (rev 37259)
@@ -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-2011-onion/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2011-onion/source/blender/blenkernel/intern/DerivedMesh.c	2011-06-06 17:23:24 UTC (rev 37258)
+++ branches/soc-2011-onion/source/blender/blenkernel/intern/DerivedMesh.c	2011-06-06 17:48:29 UTC (rev 37259)
@@ -2254,9 +2254,12 @@
 {
 	Object *obact = scene->basact?scene->basact->object:NULL;
 	int editing = paint_facesel_test(ob);
-	/* weight paint and face select need original indices because of selection buffer drawing */
-	int needMapping = (ob==obact) && (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT|OB_MODE_VERTEX_PAINT)));
+	/* weight paint and face select need original indicies because of selection buffer drawing */
+	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-2011-onion/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c	2011-06-06 17:23:24 UTC (rev 37258)
+++ branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c	2011-06-06 17:48:29 UTC (rev 37259)
@@ -508,6 +508,7 @@
 {
 	SubsurfModifierData smd= {{NULL}};
 	GridKey gridkey;
+	int color_totlayer;
 	int pmask_totlayer;
 
 	smd.levels = smd.renderLevels = lvl;
@@ -517,9 +518,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, (ob->mode & OB_MODE_EDIT));
 }

Modified: branches/soc-2011-onion/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/soc-2011-onion/source/blender/blenkernel/intern/subsurf_ccg.c	2011-06-06 17:23:24 UTC (rev 37258)
+++ branches/soc-2011-onion/source/blender/blenkernel/intern/subsurf_ccg.c	2011-06-06 17:48:29 UTC (rev 37259)
@@ -330,7 +330,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);
@@ -440,7 +440,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);
@@ -450,27 +450,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);
 
@@ -478,6 +530,7 @@
 	}
 
 	MEM_freeN(vertData);
+	if(colors) MEM_freeN(colors);
 
 	me = medge;
 	index = (int *)dm->getEdgeDataArray(dm, CD_ORIGINDEX);
@@ -1304,34 +1357,48 @@
 	glNormal3fv(no);
 }
 
-	/* 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);
@@ -1818,6 +1885,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) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list