[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