void BKE_editmesh_update_linked_customdata(BMEditMesh *em) { BMesh *bm = em->bm; int act; if (CustomData_has_layer(&bm->pdata, CD_MTEXPOLY)) { act = CustomData_get_active_layer(&bm->pdata, CD_MTEXPOLY); CustomData_set_layer_active(&bm->ldata, CD_MLOOPUV, act); act = CustomData_get_render_layer(&bm->pdata, CD_MTEXPOLY); CustomData_set_layer_render(&bm->ldata, CD_MLOOPUV, act); act = CustomData_get_clone_layer(&bm->pdata, CD_MTEXPOLY); CustomData_set_layer_clone(&bm->ldata, CD_MLOOPUV, act); act = CustomData_get_stencil_layer(&bm->pdata, CD_MTEXPOLY); CustomData_set_layer_stencil(&bm->ldata, CD_MLOOPUV, act); } }
static void make_duplis_faces(const DupliContext *ctx) { Scene *scene = ctx->scene; Object *parent = ctx->object; bool use_texcoords = ELEM(ctx->eval_ctx->mode, DAG_EVAL_RENDER, DAG_EVAL_PREVIEW); FaceDupliData fdd; fdd.use_scale = ((parent->transflag & OB_DUPLIFACES_SCALE) != 0); /* gather mesh info */ { BMEditMesh *em = BKE_editmesh_from_object(parent); CustomDataMask dm_mask = (use_texcoords ? CD_MASK_BAREMESH | CD_MASK_ORCO | CD_MASK_MLOOPUV : CD_MASK_BAREMESH); if (em) fdd.dm = editbmesh_get_derived_cage(scene, parent, em, dm_mask); else fdd.dm = mesh_get_derived_final(scene, parent, dm_mask); if (use_texcoords) { CustomData *ml_data = fdd.dm->getLoopDataLayout(fdd.dm); const int uv_idx = CustomData_get_render_layer(ml_data, CD_MLOOPUV); fdd.orco = fdd.dm->getVertDataArray(fdd.dm, CD_ORCO); fdd.mloopuv = CustomData_get_layer_n(ml_data, CD_MLOOPUV, uv_idx); } else { fdd.orco = NULL; fdd.mloopuv = NULL; } fdd.totface = fdd.dm->getNumPolys(fdd.dm); fdd.mpoly = fdd.dm->getPolyArray(fdd.dm); fdd.mloop = fdd.dm->getLoopArray(fdd.dm); fdd.mvert = fdd.dm->getVertArray(fdd.dm); } make_child_duplis(ctx, &fdd, make_child_duplis_faces); fdd.dm->release(fdd.dm); }