[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43511] trunk/blender/source/blender: debug function DM_debug_info / DM_debug_print, with access from python

Campbell Barton ideasman42 at gmail.com
Thu Jan 19 01:18:31 CET 2012


Revision: 43511
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43511
Author:   campbellbarton
Date:     2012-01-19 00:18:25 +0000 (Thu, 19 Jan 2012)
Log Message:
-----------
debug function DM_debug_info / DM_debug_print, with access from python
through Object.dm_info('SOURCE/DEFORM/FINAL')

this is to help tracking down issues with modifiers where loosing data
layers between modifiers can cause bugs, also to helo with comparing
bmesh/trunk's modifier stack.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/makesrna/intern/rna_object_api.c

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2012-01-18 22:42:57 UTC (rev 43510)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2012-01-19 00:18:25 UTC (rev 43511)
@@ -584,5 +584,10 @@
 /* Set object's bounding box based on DerivedMesh min/max data */
 void DM_set_object_boundbox(struct Object *ob, DerivedMesh *dm);
 
+/* debug only */
+#ifndef NDEBUG
+char *DM_debug_info(DerivedMesh *dm);
+void DM_debug_print(DerivedMesh *dm);
 #endif
 
+#endif

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2012-01-18 22:42:57 UTC (rev 43510)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2012-01-19 00:18:25 UTC (rev 43511)
@@ -2313,3 +2313,78 @@
 #endif /* WITH_GAMEENGINE */
 
 /* --- NAVMESH (end) --- */
+
+
+/* derivedmesh info printing function,
+ * to help track down differences DM output */
+
+#ifndef NDEBUG
+#include "BLI_dynstr.h"
+
+static void dm_debug_info_layers(DynStr *dynstr, DerivedMesh *dm, void *(*getElemDataArray)(DerivedMesh *, int))
+{
+	int type;
+
+	for (type = 0; type < CD_NUMTYPES; type++) {
+		/* note: doesnt account for multiple layers */
+		void *pt = getElemDataArray(dm, type);
+		if (pt) {
+			const char *name = CustomData_layertype_name(type);
+			const int size = CustomData_sizeof(type);
+			const char *structname;
+			int structnum;
+			CustomData_file_write_info(type, &structname, &structnum);
+			BLI_dynstr_appendf(dynstr,
+			                   "        dict(name='%s', struct='%s', type=%d, ptr='%p', elem=%d, length=%d),\n",
+							   name, structname, type, (void *)pt, size, (int)(MEM_allocN_len(pt) / size));
+		}
+	}
+}
+
+char *DM_debug_info(DerivedMesh *dm)
+{
+	DynStr *dynstr= BLI_dynstr_new();
+	char *ret;
+	const char *tstr;
+
+	BLI_dynstr_appendf(dynstr, "{\n");
+	BLI_dynstr_appendf(dynstr, "    'ptr': '%p',\n", (void *)dm);
+	switch (dm->type) {
+		case DM_TYPE_CDDM:     tstr = "DM_TYPE_CDDM";     break;
+		case DM_TYPE_EDITMESH: tstr = "DM_TYPE_EDITMESH";  break;
+		case DM_TYPE_CCGDM:    tstr = "DM_TYPE_CCGDM";     break;
+		default:               tstr = "UNKNOWN";           break;
+	}
+	BLI_dynstr_appendf(dynstr, "    'type': '%s',\n", tstr);
+	BLI_dynstr_appendf(dynstr, "    'numVertData': %d,\n", dm->numVertData);
+	BLI_dynstr_appendf(dynstr, "    'numEdgeData': %d,\n", dm->numEdgeData);
+	BLI_dynstr_appendf(dynstr, "    'numFaceData': %d,\n", dm->numFaceData);
+	BLI_dynstr_appendf(dynstr, "    'deformedOnly': %d,\n", dm->deformedOnly);
+
+	BLI_dynstr_appendf(dynstr, "    'vertexLayers': (\n");
+	dm_debug_info_layers(dynstr, dm, dm->getVertDataArray);
+	BLI_dynstr_appendf(dynstr, "    ),\n");
+
+	BLI_dynstr_appendf(dynstr, "    'edgeLayers': (\n");
+	dm_debug_info_layers(dynstr, dm, dm->getEdgeDataArray);
+	BLI_dynstr_appendf(dynstr, "    ),\n");
+
+	BLI_dynstr_appendf(dynstr, "    'faceLayers': (\n");
+	dm_debug_info_layers(dynstr, dm, dm->getFaceDataArray);
+	BLI_dynstr_appendf(dynstr, "    ),\n");
+
+	BLI_dynstr_appendf(dynstr, "}\n");
+
+	ret = BLI_dynstr_get_cstring(dynstr);
+	BLI_dynstr_free(dynstr);
+	return ret;
+}
+
+void DM_debug_print(DerivedMesh *dm)
+{
+	char *str = DM_debug_info(dm);
+	printf(str);
+	fflush(stdout);
+}
+
+#endif /* NDEBUG */

Modified: trunk/blender/source/blender/makesrna/intern/rna_object_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object_api.c	2012-01-18 22:42:57 UTC (rev 43510)
+++ trunk/blender/source/blender/makesrna/intern/rna_object_api.c	2012-01-19 00:18:25 UTC (rev 43511)
@@ -63,6 +63,7 @@
 #include "BKE_font.h"
 #include "BKE_mball.h"
 #include "BKE_modifier.h"
+#include "BKE_cdderivedmesh.h"
 
 #include "DNA_mesh_types.h"
 #include "DNA_scene_types.h"
@@ -470,6 +471,44 @@
 	return object_is_modified(scene, ob) & settings;
 }
 
+#ifndef NDEBUG
+void rna_Object_dm_info(struct Object *ob, int type, char *result)
+{
+	DerivedMesh *dm = NULL;
+	int dm_release = FALSE;
+	char *ret = NULL;
+
+	result[0] = '\0';
+
+	switch(type) {
+		case 0:
+			if (ob->type == OB_MESH) {
+				dm = CDDM_from_mesh(ob->data, ob);
+				ret = DM_debug_info(dm);
+				dm_release = TRUE;
+			}
+			break;
+		case 1:
+			dm = ob->derivedDeform;
+			break;
+		case 2:
+			dm = ob->derivedFinal;
+			break;
+	}
+
+	if (dm) {
+		ret = DM_debug_info(dm);
+		if (dm_release) {
+			dm->release(dm);
+		}
+		if (ret) {
+			strcpy(result, ret);
+			MEM_freeN(ret);
+		}
+	}
+}
+#endif /* NDEBUG */
+
 #else
 
 void RNA_api_object(StructRNA *srna)
@@ -483,6 +522,15 @@
 		{0, NULL, 0, NULL, NULL}
 	};
 
+#ifndef NDEBUG
+	static EnumPropertyItem mesh_dm_info_items[] = {
+		{0, "SOURCE", 0, "Source", "Source mesh"},
+		{1, "DEFORM", 0, "Deform", "Objects deform mesh"},
+	    {2, "FINAL", 0, "Final", "Objects final mesh"},
+		{0, NULL, 0, NULL, NULL}
+	};
+#endif
+
 	/* mesh */
 	func= RNA_def_function(srna, "to_mesh", "rna_Object_to_mesh");
 	RNA_def_function_ui_description(func, "Create a Mesh datablock with modifiers applied");
@@ -585,6 +633,20 @@
 	RNA_def_property_flag(parm, PROP_REQUIRED);
 	parm= RNA_def_boolean(func, "result", 0, "", "Object visibility");
 	RNA_def_function_return(func, parm);
+
+
+#ifndef NDEBUG
+	/* mesh */
+	func= RNA_def_function(srna, "dm_info", "rna_Object_dm_info");
+	RNA_def_function_ui_description(func, "Returns a string for derived mesh data");
+
+	parm= RNA_def_enum(func, "type", mesh_dm_info_items, 0, "", "Modifier settings to apply");
+	RNA_def_property_flag(parm, PROP_REQUIRED);
+	/* weak!, no way to return dynamic string type */
+	parm= RNA_def_string(func, "result", "result", 1024, "result", "");
+	RNA_def_property_flag(parm, PROP_THICK_WRAP); /* needed for string return value */
+	RNA_def_function_output(func, parm);
+#endif /* NDEBUG */
 }
 
 



More information about the Bf-blender-cvs mailing list