[Bf-blender-cvs] [4887f7b] wiggly-widgets: Fixes to facemaps:

Antony Riakiotakis noreply at git.blender.org
Wed Dec 17 16:42:57 CET 2014


Commit: 4887f7b48cbd10faa01fa405748be93d8bee3896
Author: Antony Riakiotakis
Date:   Wed Dec 17 16:42:36 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB4887f7b48cbd10faa01fa405748be93d8bee3896

Fixes to facemaps:

* Test display code that displays the active facemap. Will not work on
subsurf modifier yet (crash)
* Fix loading of files with facemaps
* Facemap data now reside on polys instead of tessfaces.

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

M	source/blender/blenkernel/BKE_DerivedMesh.h
M	source/blender/blenkernel/intern/customdata.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/object/object_fmap.c
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/gpu/intern/gpu_buffers.c

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

diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 8b801d7..9fd083a 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -187,7 +187,8 @@ struct DerivedMesh {
 	DerivedMeshType type;
 	float auto_bump_scale;
 	DMDirtyFlag dirty;
-	int totmat; /* total materials. Will be valid only before object drawing. */
+	short totfmaps;
+	short totmat; /* total materials. Will be valid only before object drawing. */
 	struct Material **mat; /* material array. Will be valid only before object drawing */
 
 	/* use for converting to BMesh which doesn't store bevel weight and edge crease by default */
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 17fdd3b..06c5e60 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -1216,8 +1216,8 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
 	{sizeof(float[4]), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
 	/* 40: CD_TESSLOOPNORMAL */
 	{sizeof(short[4][3]), "", 0, NULL, NULL, NULL, NULL, layerSwap_flnor, NULL},
-	/* 41: CD_MASK_FACEMAP */
-	{sizeof(int), "", 1, NULL, NULL, NULL, NULL, NULL, layerDefault_fmap, NULL},
+	/* 41: CD_FACEMAP */
+	{sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, layerDefault_fmap, NULL},
 };
 
 /* note, numbers are from trunk and need updating for bmesh */
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 202cd40..b4fcbed 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1910,6 +1910,10 @@ static void write_customdata(WriteData *wd, ID *id, int count, CustomData *data,
 		else if (layer->type == CD_GRID_PAINT_MASK) {
 			write_grid_paint_mask(wd, count, layer->data);
 		}
+		else if (layer->type == CD_FACEMAP) {
+			const int *layer_data = layer->data;
+			writedata(wd, DATA, sizeof(*layer_data) * count, layer_data);
+		}
 		else {
 			CustomData_file_write_info(layer->type, &structname, &structnum);
 			if (structnum) {
diff --git a/source/blender/editors/object/object_fmap.c b/source/blender/editors/object/object_fmap.c
index 046be79..ce76b9e 100644
--- a/source/blender/editors/object/object_fmap.c
+++ b/source/blender/editors/object/object_fmap.c
@@ -130,8 +130,8 @@ void ED_fmap_face_add(Object *ob, bFaceMap *fmap, int facenum)
 		Mesh *me = ob->data;
 		
 		/* if there's is no facemap layer then create one */
-		if ((facemap = CustomData_get_layer(&me->fdata, CD_FACEMAP)) == NULL)
-			facemap = CustomData_add_layer(&me->fdata, CD_FACEMAP, CD_DEFAULT, NULL, me->totface);
+		if ((facemap = CustomData_get_layer(&me->pdata, CD_FACEMAP)) == NULL)
+			facemap = CustomData_add_layer(&me->pdata, CD_FACEMAP, CD_DEFAULT, NULL, me->totpoly);
 
 		facemap[facenum] = fmap_nr;
 	}
@@ -152,7 +152,7 @@ void ED_fmap_face_remove(Object *ob, bFaceMap *fmap, int facenum)
 		Mesh *me = ob->data;
 		
 		/* if there's is no facemap layer then create one */
-		if ((facemap = CustomData_get_layer(&me->fdata, CD_FACEMAP)) == NULL)
+		if ((facemap = CustomData_get_layer(&me->pdata, CD_FACEMAP)) == NULL)
 			return;
 		
 		facemap[facenum] = -1;
@@ -219,11 +219,11 @@ static void object_fmap_swap_object_mode(Object *ob, int num1, int num2)
 		Mesh *me = ob->data;
 		
 		if (me->mface) {
-			int *map = CustomData_get_layer(&me->fdata, CD_FACEMAP);
+			int *map = CustomData_get_layer(&me->pdata, CD_FACEMAP);
 			int i;
 			
 			if (map) {
-				for (i = 0; i < me->totface; i++) {
+				for (i = 0; i < me->totpoly; i++) {
 					if (map[i] == num1 && num1 != -1)
 						map[i] = num2;
 					if (map[i]== num2 && num2 != -1)
@@ -284,11 +284,11 @@ static void object_fmap_remove_object_mode(Object *ob, bFaceMap *fmap)
 		Mesh *me = ob->data;
 		
 		if (me->mface) {
-			int *map = CustomData_get_layer(&me->fdata, CD_FACEMAP);
+			int *map = CustomData_get_layer(&me->pdata, CD_FACEMAP);
 			int i;
 			
 			if (map) {
-				for (i = 0; i < me->totface; i++) {
+				for (i = 0; i < me->totpoly; i++) {
 					if (map[i] == fmap_nr)
 						map[i] = -1;
 				}
@@ -332,7 +332,7 @@ void BKE_object_fmap_remove_all(Object *ob)
 	/* remove all dverts */
 	if (ob->type == OB_MESH) {
 		Mesh *me = ob->data;
-		CustomData_free_layer(&me->fdata, CD_FACEMAP, me->totface, 0);
+		CustomData_free_layer(&me->pdata, CD_FACEMAP, me->totpoly, 0);
 	}
 	ob->actfmap = 0;
 }
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 22ca908..7cdeee8 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -8190,30 +8190,36 @@ void draw_object_facemap(Scene *scene, struct Object *ob, int facemap)
 	DerivedMesh *dm = NULL;
 	
 	dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
+	if (!dm || !CustomData_has_layer(&dm->polyData, CD_FACEMAP))
+		return;
+	
 	DM_update_materials(dm, ob);
 
-	if (dm) {
-		glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW);
-	}
+	glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW);
 	
 	/* add polygon offset so we draw above the original surface */
 	glPolygonOffset(1.0, 1.0);
 
-	glEnable(GL_BLEND);
-	glColor4f(0.0, 1.0, 1.0, 0.2);
+	dm->totfmaps = BLI_listbase_count(&ob->fmaps);
+	
 	GPU_facemap_setup(dm);
+
+	glPushAttrib(GL_ENABLE_BIT);
+	glEnable(GL_BLEND);
+	glDisable(GL_LIGHTING);
+	glColor4f(0.7, 1.0, 1.0, 0.5);
 	if (dm->drawObject->facemapindices->use_vbo)
-		glDrawElements(GL_TRIANGLES, dm->drawObject->facemap_count[facemap] * 3, GL_UNSIGNED_INT, 
-		               (GLubyte *)NULL + dm->drawObject->facemap_start[facemap] * 3 * sizeof(float));
+		glDrawElements(GL_TRIANGLES, dm->drawObject->facemap_count[facemap], GL_UNSIGNED_INT, 
+		               (int *)NULL + dm->drawObject->facemap_start[facemap]);
 	else
-		glDrawElements(GL_TRIANGLES, dm->drawObject->facemap_count[facemap] * 3, GL_UNSIGNED_INT,
-		               (GLubyte *)dm->drawObject->facemapindices->pointer + dm->drawObject->facemap_start[facemap] * 3 * sizeof(float));
-	glDisable(GL_BLEND);
+		glDrawElements(GL_TRIANGLES, dm->drawObject->facemap_count[facemap], GL_UNSIGNED_INT,
+		               (int *)dm->drawObject->facemapindices->pointer + dm->drawObject->facemap_start[facemap]);
+	glPopAttrib();
+
 	GPU_buffer_unbind();
 
 	glPolygonOffset(0.0, 0.0);
-	
-	if (dm) dm->release(dm);
+	dm->release(dm);
 }
 
 
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 0740472..2cacca8 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -600,6 +600,10 @@ void GPU_drawobject_free(DerivedMesh *dm)
 		MEM_freeN(gdo->triangle_to_mface);
 	if (gdo->vert_points)
 		MEM_freeN(gdo->vert_points);
+	if (gdo->facemap_count)
+		MEM_freeN(gdo->facemap_count);
+	if (gdo->facemap_start)
+		MEM_freeN(gdo->facemap_start);
 #ifdef USE_GPU_POINT_LINK
 	MEM_freeN(gdo->vert_points_mem);
 #endif
@@ -610,6 +614,7 @@ void GPU_drawobject_free(DerivedMesh *dm)
 	GPU_buffer_free(gdo->colors);
 	GPU_buffer_free(gdo->edges);
 	GPU_buffer_free(gdo->uvedges);
+	GPU_buffer_free(gdo->facemapindices);
 
 	MEM_freeN(gdo);
 	dm->drawObject = NULL;
@@ -1027,31 +1032,27 @@ static void GPU_buffer_copy_uvedge(DerivedMesh *dm, float *varray, int *UNUSED(i
 static void GPU_buffer_copy_facemap(DerivedMesh *dm, float *varray_, int *UNUSED(index), int *UNUSED(mat_orig_to_new), void *UNUSED(user))
 {
 	GPUDrawObject *gdo = dm->drawObject;
-	int *facemap_iter, *facemap = DM_get_tessface_data_layer(dm, CD_FACEMAP);
+	int facemap;
+	int *facemap_po = CustomData_get_layer(&dm->polyData, CD_FACEMAP);
 	unsigned int *varray = (unsigned int *)varray_;
 	int i, totface, offset = 0;
-	MFace *f = dm->getTessFaceArray(dm);
+	MFace *f, *f_base = dm->getTessFaceArray(dm);
 	int *facemap_offset;
+	int *orig_index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
 	
 	totface = dm->getNumTessFaces(dm);
 
-	gdo->totfacemaps = 0;
-	
-	facemap_iter = facemap;
-	
-	/* pretty crappy to iterate so many times but it's only being done on creation */
-	for (i = 0; i < totface; i++, facemap_iter++, f++) {
-		gdo->totfacemaps = max_ii(*facemap_iter, gdo->totfacemaps);
-	}
+	gdo->totfacemaps = dm->totfmaps;
 
-	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");
 	
-	facemap_iter = facemap;
-	for (i = 0; i < totface; i++, facemap_iter++, f++) {
-		gdo->facemap_count[*facemap_iter] += (f->v4) ? 6 : 3;
+	f = f_base;
+	for (i = 0; i < totface; i++, f++) {
+		facemap = facemap_po[orig_index[i]];
+		if (facemap != -1)
+			gdo->facemap_count[facemap] += (f->v4) ? 6 : 3;
 	}
 	
 	for (i = 0; i < gdo->totfacemaps; i++) {
@@ -1059,22 +1060,27 @@ static void GPU_buffer_copy_facemap(DerivedMesh *dm, float *varray_, int *UNUSED
 		offset += gdo->facemap_count[i];
 	}
 	
-	facemap_iter = facemap;
-	for (i = 0; i < totface; i++, facemap_iter++, f++) {
-		int fmap_offset = (gdo->facemap_start[*facemap_iter] + facemap_offset[*facemap_iter]) * 3;
+	f = f_base;
+	for (i = 0; i < totface; i++, f++) {
+		int fmap_offset;
+		facemap = facemap_po[orig_index[i]];
+
+		if (facemap == -1)
+			continue;
+		fmap_offset = gdo->facemap_start[facemap] + facemap_offset[facemap];
 		
 		varray[fmap_offset] = gdo->vert_points[f->v1].point_index;
 		varray[fmap_offset + 1] = gdo->vert_points[f->v2].point_index;
 		varray[fmap_offset + 2] = gdo->vert_points[f->v3].point_index;
 		
-		facemap_offset[*facemap_iter] += 3;
+		facemap_offset[facemap] += 3;
 		
 		if (f->v4) {
 			varray[fmap_offset + 3] = dm->drawObject->vert_points[f->v3].point_index;
 			varray[fmap_offset + 4] = dm->drawObject->vert_points[f->v4].point_index;
 			varray[fmap_offset + 5] = dm->drawObject->vert_points[f->v1].point_index;
 
-			facemap_offset[*facemap_iter] += 3;
+			facemap_offset[facemap] += 3;
 		}
 	}
 	
@@ -1352,

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list