[Bf-blender-cvs] [95b1a59] wiggly-widgets: Facemap support for subsurf modifier

Antony Riakiotakis noreply at git.blender.org
Sat Nov 14 01:20:18 CET 2015


Commit: 95b1a590cd4429980ad78f31fd4dd962154ce40b
Author: Antony Riakiotakis
Date:   Sat Nov 14 01:20:08 2015 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB95b1a590cd4429980ad78f31fd4dd962154ce40b

Facemap support for subsurf modifier

===================================================================

M	source/blender/blenkernel/intern/subsurf_ccg.c

===================================================================

diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index a2c625a..e0312d3 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2102,6 +2102,73 @@ static void ccgDM_buffer_copy_triangles(
 	MEM_freeN(fc);
 }
 
+static void ccgDM_buffer_copy_facemaps(DerivedMesh *dm, unsigned int *varray)
+{
+	GPUDrawObject *gdo = dm->drawObject;
+	CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
+	CCGSubSurf *ss = ccgdm->ss;
+	CCGKey key;
+	int *facemap = DM_get_poly_data_layer(dm, CD_FACEMAP);
+	int gridSize = ccgSubSurf_getGridSize(ss);
+	int gridFaces = gridSize - 1;
+	int i, totface = ccgSubSurf_getNumFaces(ss);
+	int offset = 0;
+	int totloops = 0;
+	int *facemap_offset;
+
+	CCG_key_top_level(&key, ss);
+
+	gdo->totfacemaps = 0;
+
+	/* pretty crappy to iterate so many times but it's only being done on creation */
+	for (i = 0; i < totface; i++) {
+		gdo->totfacemaps = max_ii(facemap[ccgdm->faceMap[i].startFace], gdo->totfacemaps);
+	}
+	/* account for 0 - n -1 range */
+	gdo->totfacemaps++;
+
+	gdo->facemap_start = MEM_callocN(gdo->totfacemaps * sizeof(*gdo->facemap_start), "GDO_facemap_start");
+	gdo->facemap_count = MEM_callocN(gdo->totfacemaps * sizeof(*gdo->facemap_count), "GDO_facemap_count");
+	facemap_offset = MEM_callocN(gdo->totfacemaps * sizeof(*facemap_offset), "facemap_offset");
+
+	for (i = 0; i < totface; i++) {
+		CCGFace *f = ccgdm->faceMap[i].face;
+		int numVerts = ccgSubSurf_getFaceNumVerts(f);
+		gdo->facemap_count[facemap[ccgdm->faceMap[i].startFace]] += gridFaces * gridFaces * numVerts * 2;
+	}
+
+	for (i = 0; i < gdo->totfacemaps; i++) {
+		gdo->facemap_start[i] = offset;
+		offset += gdo->facemap_count[i];
+	}
+
+	for (i = 0; i < totface; i++) {
+		CCGFace *f = ccgdm->faceMap[i].face;
+		int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
+		int facemap_index = facemap[ccgdm->faceMap[i].startFace];
+		int fmap_offset = (gdo->facemap_start[facemap_index] + facemap_offset[facemap_index]) * 3;
+
+		facemap_offset[facemap_index] += gridFaces * gridFaces * numVerts * 2;
+
+		for (S = 0; S < numVerts; S++) {
+			for (y = 0; y < gridFaces; y++) {
+				for (x = 0; x < gridFaces; x++) {
+					varray[fmap_offset++] = totloops + 3;
+					varray[fmap_offset++] = totloops + 2;
+					varray[fmap_offset++] = totloops + 1;
+
+					varray[fmap_offset++] = totloops + 3;
+					varray[fmap_offset++] = totloops + 1;
+					varray[fmap_offset++] = totloops;
+
+					totloops += 4;
+				}
+			}
+		}
+	}
+
+	MEM_freeN(facemap_offset);
+}
 
 /* Only used by non-editmesh types */
 static void ccgDM_buffer_copy_vertex(
@@ -2529,6 +2596,9 @@ static void ccgDM_copy_gpu_data(
 		case GPU_BUFFER_TRIANGLES:
 			ccgDM_buffer_copy_triangles(dm, (unsigned int *)varray_p, mat_orig_to_new);
 			break;
+		case GPU_BUFFER_FACEMAP:
+			ccgDM_buffer_copy_facemaps(dm, (unsigned int *)varray_p);
+			break;
 		default:
 			break;
 	}




More information about the Bf-blender-cvs mailing list