Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/DerivedMesh.cc
| Show First 20 Lines • Show All 2,305 Lines • ▼ Show 20 Lines | else { | ||||
| add_v2_v2v2(lof->uv, vcos_2d[j], translate); | add_v2_v2v2(lof->uv, vcos_2d[j], translate); | ||||
| mul_v2_v2(lof->uv, scale); | mul_v2_v2(lof->uv, scale); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| BKE_mesh_tessface_clear(mesh); | BKE_mesh_tessface_clear(mesh); | ||||
| } | } | ||||
| /* 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, | |||||
| CustomData *cd, | |||||
| void *(*getElemDataArray)(DerivedMesh *, int)) | |||||
| { | |||||
| int type; | |||||
| for (type = 0; type < CD_NUMTYPES; type++) { | |||||
| if (CustomData_has_layer(cd, type)) { | |||||
| /* NOTE: doesn't account for multiple layers. */ | |||||
| const char *name = CustomData_layertype_name(type); | |||||
| const int size = CustomData_sizeof(type); | |||||
| const void *pt = getElemDataArray(dm, type); | |||||
| const int pt_size = pt ? (int)(MEM_allocN_len(pt) / size) : 0; | |||||
| 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, | |||||
| (const void *)pt, | |||||
| size, | |||||
| pt_size); | |||||
| } | |||||
| } | |||||
| } | |||||
| char *DM_debug_info(DerivedMesh *dm) | |||||
| { | |||||
| DynStr *dynstr = BLI_dynstr_new(); | |||||
| char *ret; | |||||
| const char *tstr; | |||||
| BLI_dynstr_append(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_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, " 'numTessFaceData': %d,\n", dm->numTessFaceData); | |||||
| BLI_dynstr_appendf(dynstr, " 'numPolyData': %d,\n", dm->numPolyData); | |||||
| BLI_dynstr_appendf(dynstr, " 'deformedOnly': %d,\n", dm->deformedOnly); | |||||
| BLI_dynstr_append(dynstr, " 'vertexLayers': (\n"); | |||||
| dm_debug_info_layers(dynstr, dm, &dm->vertData, dm->getVertDataArray); | |||||
| BLI_dynstr_append(dynstr, " ),\n"); | |||||
| BLI_dynstr_append(dynstr, " 'edgeLayers': (\n"); | |||||
| dm_debug_info_layers(dynstr, dm, &dm->edgeData, dm->getEdgeDataArray); | |||||
| BLI_dynstr_append(dynstr, " ),\n"); | |||||
| BLI_dynstr_append(dynstr, " 'loopLayers': (\n"); | |||||
| dm_debug_info_layers(dynstr, dm, &dm->loopData, dm->getLoopDataArray); | |||||
| BLI_dynstr_append(dynstr, " ),\n"); | |||||
| BLI_dynstr_append(dynstr, " 'polyLayers': (\n"); | |||||
| dm_debug_info_layers(dynstr, dm, &dm->polyData, dm->getPolyDataArray); | |||||
| BLI_dynstr_append(dynstr, " ),\n"); | |||||
| BLI_dynstr_append(dynstr, " 'tessFaceLayers': (\n"); | |||||
| dm_debug_info_layers(dynstr, dm, &dm->faceData, dm->getTessFaceDataArray); | |||||
| BLI_dynstr_append(dynstr, " ),\n"); | |||||
| BLI_dynstr_append(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); | |||||
| puts(str); | |||||
| fflush(stdout); | |||||
| MEM_freeN(str); | |||||
| } | |||||
| bool DM_is_valid(DerivedMesh *dm) | |||||
| { | |||||
| const bool do_verbose = true; | |||||
| const bool do_fixes = false; | |||||
| bool is_valid = true; | |||||
| bool changed = true; | |||||
| is_valid &= BKE_mesh_validate_all_customdata( | |||||
| dm->getVertDataLayout(dm), | |||||
| dm->getNumVerts(dm), | |||||
| dm->getEdgeDataLayout(dm), | |||||
| dm->getNumEdges(dm), | |||||
| dm->getLoopDataLayout(dm), | |||||
| dm->getNumLoops(dm), | |||||
| dm->getPolyDataLayout(dm), | |||||
| dm->getNumPolys(dm), | |||||
| false, /* setting mask here isn't useful, gives false positives */ | |||||
| do_verbose, | |||||
| do_fixes, | |||||
| &changed); | |||||
| is_valid &= BKE_mesh_validate_arrays(nullptr, | |||||
| dm->getVertArray(dm), | |||||
| dm->getNumVerts(dm), | |||||
| dm->getEdgeArray(dm), | |||||
| dm->getNumEdges(dm), | |||||
| dm->getTessFaceArray(dm), | |||||
| dm->getNumTessFaces(dm), | |||||
| dm->getLoopArray(dm), | |||||
| dm->getNumLoops(dm), | |||||
| dm->getPolyArray(dm), | |||||
| dm->getNumPolys(dm), | |||||
| (MDeformVert *)dm->getVertDataArray(dm, CD_MDEFORMVERT), | |||||
| do_verbose, | |||||
| do_fixes, | |||||
| &changed); | |||||
| BLI_assert(changed == false); | |||||
| return is_valid; | |||||
| } | |||||
| #endif /* NDEBUG */ | |||||