static dErr doGlobalID(iMesh_Instance mesh,iBase_EntitySetHandle root) { MeshListEH ents=MLZ; MeshListInt type=MLZ; int count[4] = {0,0,0,0}; int owned,*number; dMeshTag idTag; dErr err; dFunctionBegin; iMesh_getEntities(mesh,root,iBase_ALL_TYPES,iMesh_ALL_TOPOLOGIES,MLREF(ents),&err);dICHK(mesh,err); iMesh_getEntArrType(mesh,ents.v,ents.s,MLREF(type),&err);dICHK(mesh,err); err = dMalloc(ents.s*sizeof(number[0]),&number);dCHK(err); owned = ents.s; for (int i=0; i<owned; i++) { number[i] = count[type.v[i]]++; } iMesh_getTagHandle(mesh,"GLOBAL_ID",&idTag,&err,sizeof("GLOBAL_ID"));dICHK(mesh,err); iMesh_setIntArrData(mesh,ents.v,owned,idTag,number,owned,&err);dICHK(mesh,err); err = dFree(number);dCHK(err); MeshListFree(ents); MeshListFree(type); dFunctionReturn(0); }
inline iMesh::Error iMesh::getEntArrType( const EntityHandle* entity_handles, int entity_handles_size, EntityType* types_out ) const { int err, alloc = entity_handles_size, junk, *ptr; std::vector<int> storage; if (sizeof(EntityType) == sizeof(int)) ptr = reinterpret_cast<int*>(types_out); else { storage.resize( entity_handles_size ); ptr = &storage[0]; } iMesh_getEntArrType( mInstance, entity_handles, entity_handles_size, &ptr, &alloc, &junk, &err ); if (sizeof(EntityType) != sizeof(int)) for (int i = 0; i < entity_handles_size; ++i) types_out[i] = (EntityType)storage[i]; return (Error)err; }