[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51782] trunk/blender/source/blender: make use customdata typeoffset more, add an assert to ensure its to date.

Campbell Barton ideasman42 at gmail.com
Wed Oct 31 10:50:28 CET 2012


Revision: 51782
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51782
Author:   campbellbarton
Date:     2012-10-31 09:50:24 +0000 (Wed, 31 Oct 2012)
Log Message:
-----------
make use customdata typeoffset more, add an assert to ensure its to date.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_customdata.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c
    trunk/blender/source/blender/editors/mesh/mesh_data.c

Modified: trunk/blender/source/blender/blenkernel/BKE_customdata.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_customdata.h	2012-10-31 05:39:10 UTC (rev 51781)
+++ trunk/blender/source/blender/blenkernel/BKE_customdata.h	2012-10-31 09:50:24 UTC (rev 51782)
@@ -122,7 +122,10 @@
 void CustomData_bmesh_merge(struct CustomData *source, struct CustomData *dest, 
                             CustomDataMask mask, int alloctype, struct BMesh *bm, const char htype);
 
-/* frees data associated with a CustomData object (doesn't free the object
+/** NULL's all members and resets the typemap. */
+void CustomData_reset(struct CustomData *data);
+
+/** frees data associated with a CustomData object (doesn't free the object
  * itself, though)
  */
 void CustomData_free(struct CustomData *data, int totelem);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2012-10-31 05:39:10 UTC (rev 51781)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2012-10-31 09:50:24 UTC (rev 51782)
@@ -289,6 +289,13 @@
 	dm->needsFree = 1;
 	dm->auto_bump_scale = -1.0f;
 	dm->dirty = 0;
+
+	/* don't use CustomData_reset(...); because we dont want to touch customdata */
+	fill_vn_i(dm->vertData.typemap, CD_NUMTYPES, -1);
+	fill_vn_i(dm->edgeData.typemap, CD_NUMTYPES, -1);
+	fill_vn_i(dm->faceData.typemap, CD_NUMTYPES, -1);
+	fill_vn_i(dm->loopData.typemap, CD_NUMTYPES, -1);
+	fill_vn_i(dm->polyData.typemap, CD_NUMTYPES, -1);
 }
 
 void DM_from_template(DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type,

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2012-10-31 05:39:10 UTC (rev 51781)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2012-10-31 09:50:24 UTC (rev 51782)
@@ -1245,6 +1245,13 @@
 	}
 }
 
+static int customdata_typemap_is_valid(const CustomData *data)
+{
+	CustomData data_copy = *data;
+	CustomData_update_typemap(&data_copy);
+	return (memcmp(data->typemap, data_copy.typemap, sizeof(data->typemap)) == 0);
+}
+
 void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
                       CustomDataMask mask, int alloctype, int totelem)
 {
@@ -1310,7 +1317,7 @@
 void CustomData_copy(const struct CustomData *source, struct CustomData *dest,
                      CustomDataMask mask, int alloctype, int totelem)
 {
-	memset(dest, 0, sizeof(*dest));
+	CustomData_reset(dest);
 
 	if (source->external)
 		dest->external = MEM_dupallocN(source->external);
@@ -1341,6 +1348,12 @@
 	}
 }
 
+void CustomData_reset(CustomData *data)
+{
+	memset(data, 0, sizeof(*data));
+	fill_vn_i(data->typemap, CD_NUMTYPES, -1);
+}
+
 void CustomData_free(CustomData *data, int totelem)
 {
 	int i;
@@ -1352,8 +1365,7 @@
 		MEM_freeN(data->layers);
 	
 	CustomData_external_free(data);
-	
-	memset(data, 0, sizeof(*data));
+	CustomData_reset(data);
 }
 
 static void customData_update_offsets(CustomData *data)
@@ -1372,9 +1384,10 @@
 	CustomData_update_typemap(data);
 }
 
-int CustomData_get_layer_index(const CustomData *data, int type)
+/* to use when we're in the middle of modifying layers */
+static int CustomData_get_layer_index__notypemap(const CustomData *data, int type)
 {
-	int i; 
+	int i;
 
 	for (i = 0; i < data->totlayer; ++i)
 		if (data->layers[i].type == type)
@@ -1383,11 +1396,21 @@
 	return -1;
 }
 
+/* -------------------------------------------------------------------- */
+/* index values to access the layers (offset from the layer start) */
+
+int CustomData_get_layer_index(const CustomData *data, int type)
+{
+	BLI_assert(customdata_typemap_is_valid(data));
+	return data->typemap[type];
+}
+
 int CustomData_get_layer_index_n(const struct CustomData *data, int type, int n)
 {
 	int i = CustomData_get_layer_index(data, type);
 
 	if (i != -1) {
+		BLI_assert(i + n < data->totlayer);
 		i = (data->layers[i + n].type == type) ? (i + n) : (-1);
 	}
 
@@ -1407,91 +1430,62 @@
 
 int CustomData_get_active_layer_index(const CustomData *data, int type)
 {
-	if (!data->totlayer)
-		return -1;
-
-	if (data->typemap[type] != -1) {
-		return data->typemap[type] + data->layers[data->typemap[type]].active;
-	}
-
-	return -1;
+	const int layer_index = data->typemap[type];
+	BLI_assert(customdata_typemap_is_valid(data));
+	return (layer_index != -1) ? layer_index + data->layers[layer_index].active: -1;
 }
 
 int CustomData_get_render_layer_index(const CustomData *data, int type)
 {
-	int i;
-
-	for (i = 0; i < data->totlayer; ++i)
-		if (data->layers[i].type == type)
-			return i + data->layers[i].active_rnd;
-
-	return -1;
+	const int layer_index = data->typemap[type];
+	BLI_assert(customdata_typemap_is_valid(data));
+	return (layer_index != -1) ? layer_index + data->layers[layer_index].active_rnd : -1;
 }
 
 int CustomData_get_clone_layer_index(const CustomData *data, int type)
 {
-	int i;
-
-	for (i = 0; i < data->totlayer; ++i)
-		if (data->layers[i].type == type)
-			return i + data->layers[i].active_clone;
-
-	return -1;
+	const int layer_index = data->typemap[type];
+	BLI_assert(customdata_typemap_is_valid(data));
+	return (layer_index != -1) ? layer_index + data->layers[layer_index].active_clone : -1;
 }
 
 int CustomData_get_stencil_layer_index(const CustomData *data, int type)
 {
-	int i;
+	const int layer_index = data->typemap[type];
+	BLI_assert(customdata_typemap_is_valid(data));
+	return (layer_index != -1) ? layer_index + data->layers[layer_index].active_mask : -1;
+}
 
-	for (i = 0; i < data->totlayer; ++i)
-		if (data->layers[i].type == type)
-			return i + data->layers[i].active_mask;
 
-	return -1;
-}
+/* -------------------------------------------------------------------- */
+/* index values per layer type */
 
 int CustomData_get_active_layer(const CustomData *data, int type)
 {
-	int i;
-
-	for (i = 0; i < data->totlayer; ++i)
-		if (data->layers[i].type == type)
-			return data->layers[i].active;
-
-	return -1;
+	const int layer_index = data->typemap[type];
+	BLI_assert(customdata_typemap_is_valid(data));
+	return (layer_index != -1) ? data->layers[layer_index].active : -1;
 }
 
 int CustomData_get_render_layer(const CustomData *data, int type)
 {
-	int i;
-
-	for (i = 0; i < data->totlayer; ++i)
-		if (data->layers[i].type == type)
-			return data->layers[i].active_rnd;
-
-	return -1;
+	const int layer_index = data->typemap[type];
+	BLI_assert(customdata_typemap_is_valid(data));
+	return (layer_index != -1) ? data->layers[layer_index].active_rnd : -1;
 }
 
 int CustomData_get_clone_layer(const CustomData *data, int type)
 {
-	int i;
-
-	for (i = 0; i < data->totlayer; ++i)
-		if (data->layers[i].type == type)
-			return data->layers[i].active_clone;
-
-	return -1;
+	const int layer_index = data->typemap[type];
+	BLI_assert(customdata_typemap_is_valid(data));
+	return (layer_index != -1) ? data->layers[layer_index].active_clone : -1;
 }
 
 int CustomData_get_stencil_layer(const CustomData *data, int type)
 {
-	int i;
-
-	for (i = 0; i < data->totlayer; ++i)
-		if (data->layers[i].type == type)
-			return data->layers[i].active_mask;
-
-	return -1;
+	const int layer_index = data->typemap[type];
+	BLI_assert(customdata_typemap_is_valid(data));
+	return (layer_index != -1) ? data->layers[layer_index].active_mask : -1;
 }
 
 void CustomData_set_layer_active(CustomData *data, int type, int n)
@@ -1722,7 +1716,7 @@
 
 	/* if layer was last of type in array, set new active layer */
 	if ((index >= data->totlayer) || (data->layers[index].type != type)) {
-		i = CustomData_get_layer_index(data, type);
+		i = CustomData_get_layer_index__notypemap(data, type);
 		
 		if (i >= 0)
 			for (; i < data->totlayer && data->layers[i].type == type; i++) {
@@ -1737,7 +1731,6 @@
 		customData_resize(data, -CUSTOMDATA_GROW);
 
 	customData_update_offsets(data);
-	CustomData_update_typemap(data);
 
 	return 1;
 }

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-10-31 05:39:10 UTC (rev 51781)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-10-31 09:50:24 UTC (rev 51782)
@@ -469,15 +469,17 @@
 
 static void mesh_tessface_clear_intern(Mesh *mesh, int free_customdata)
 {
-	if (free_customdata)
+	if (free_customdata) {
 		CustomData_free(&mesh->fdata, mesh->totface);
+	}
+	else {
+		CustomData_reset(&mesh->fdata);
+	}
 
 	mesh->mface = NULL;
 	mesh->mtface = NULL;
 	mesh->mcol = NULL;
 	mesh->totface = 0;
-
-	memset(&mesh->fdata, 0, sizeof(mesh->fdata));
 }
 
 Mesh *BKE_mesh_add(const char *name)
@@ -2125,8 +2127,6 @@
 	/* just in case some of these layers are filled in (can happen with python created meshes) */
 	CustomData_free(ldata, totloop_i);
 	CustomData_free(pdata, totpoly_i);
-	memset(ldata, 0, sizeof(*ldata));
-	memset(pdata, 0, sizeof(*pdata));
 
 	totpoly = totface_i;
 	mpoly = MEM_callocN(sizeof(MPoly) * totpoly, "mpoly converted");
@@ -2632,7 +2632,6 @@
 	}
 
 	CustomData_free(fdata, totface);
-	memset(fdata, 0, sizeof(CustomData));
 	totface = mface_index;
 
 
@@ -2777,7 +2776,6 @@
 	}
 
 	CustomData_free(fdata, totface);
-	memset(fdata, 0, sizeof(CustomData));
 
 	totface = k;
 

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-10-31 05:39:10 UTC (rev 51781)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-10-31 09:50:24 UTC (rev 51782)
@@ -3824,7 +3824,7 @@
 	/* annoying workaround for bug [#31079] loading legacy files with
 	 * no polygons _but_ have stale customdata */
 	if (UNLIKELY(count == 0 && data->layers == NULL && data->totlayer != 0)) {
-		memset(data, 0, sizeof(*data));
+		CustomData_reset(data);
 		return;
 	}
 	
@@ -8098,6 +8098,7 @@
 		{
 			Mesh *me;
 			for (me = main->mesh.first; me; me = me->id.next) {
+				CustomData_update_typemap(&me->vdata);
 				CustomData_free_layers(&me->vdata, CD_MSTICKY, me->totvert);
 			}
 		}

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list