static Object *editcurve_object_from_context(bContext *C) { Object *obedit = CTX_data_edit_object(C); if (obedit && ELEM(obedit->type, OB_CURVE, OB_SURF)) { Curve *cu = obedit->data; if (BKE_curve_editNurbs_get(cu) != NULL) { return obedit; } } return NULL; }
static void undocurve_from_editcurve(UndoCurve *ucu, Curve *cu, const short shapenr) { BLI_assert(BLI_array_is_zeroed(ucu, 1)); ListBase *nubase = BKE_curve_editNurbs_get(cu); EditNurb *editnurb = cu->editnurb, tmpEditnurb; Nurb *nu, *newnu; AnimData *ad = BKE_animdata_from_id(&cu->id); /* TODO: include size of fcurve & undoIndex */ // ucu->undo_size = 0; if (editnurb->keyindex) { ucu->undoIndex = ED_curve_keyindex_hash_duplicate(editnurb->keyindex); tmpEditnurb.keyindex = ucu->undoIndex; } if (ad) { if (ad->action) { copy_fcurves(&ucu->fcurves, &ad->action->curves); } copy_fcurves(&ucu->drivers, &ad->drivers); } /* copy */ for (nu = nubase->first; nu; nu = nu->next) { newnu = BKE_nurb_duplicate(nu); if (ucu->undoIndex) { ED_curve_keyindex_update_nurb(&tmpEditnurb, nu, newnu); } BLI_addtail(&ucu->nubase, newnu); ucu->undo_size += ((nu->bezt ? (sizeof(BezTriple) * nu->pntsu) : 0) + (nu->bp ? (sizeof(BPoint) * (nu->pntsu * nu->pntsv)) : 0) + (nu->knotsu ? (sizeof(float) * KNOTSU(nu)) : 0) + (nu->knotsv ? (sizeof(float) * KNOTSV(nu)) : 0) + sizeof(Nurb)); } ucu->actvert = cu->actvert; ucu->actnu = cu->actnu; ucu->flag = cu->flag; ucu->obedit.shapenr = shapenr; }
static void undocurve_to_editcurve(Main *bmain, UndoCurve *ucu, Curve *cu, short *r_shapenr) { ListBase *undobase = &ucu->nubase; ListBase *editbase = BKE_curve_editNurbs_get(cu); Nurb *nu, *newnu; EditNurb *editnurb = cu->editnurb; AnimData *ad = BKE_animdata_from_id(&cu->id); BKE_nurbList_free(editbase); if (ucu->undoIndex) { BKE_curve_editNurb_keyIndex_free(&editnurb->keyindex); editnurb->keyindex = ED_curve_keyindex_hash_duplicate(ucu->undoIndex); } if (ad) { if (ad->action) { free_fcurves(&ad->action->curves); copy_fcurves(&ad->action->curves, &ucu->fcurves); } free_fcurves(&ad->drivers); copy_fcurves(&ad->drivers, &ucu->drivers); } /* copy */ for (nu = undobase->first; nu; nu = nu->next) { newnu = BKE_nurb_duplicate(nu); if (editnurb->keyindex) { ED_curve_keyindex_update_nurb(editnurb, nu, newnu); } BLI_addtail(editbase, newnu); } cu->actvert = ucu->actvert; cu->actnu = ucu->actnu; cu->flag = ucu->flag; *r_shapenr = ucu->obedit.shapenr; ED_curve_updateAnimPaths(bmain, cu); }
void BKE_displist_make_surf(Scene *scene, Object *ob, ListBase *dispbase, DerivedMesh **r_dm_final, const bool for_render, const bool for_orco, const bool use_render_resolution) { ListBase nubase = {NULL, NULL}; Nurb *nu; Curve *cu = ob->data; DispList *dl; float *data; int len; if (!for_render && cu->editnurb) { BKE_nurbList_duplicate(&nubase, BKE_curve_editNurbs_get(cu)); } else { BKE_nurbList_duplicate(&nubase, &cu->nurb); } if (!for_orco) curve_calc_modifiers_pre(scene, ob, &nubase, for_render, use_render_resolution); for (nu = nubase.first; nu; nu = nu->next) { if ((for_render || nu->hide == 0) && BKE_nurb_check_valid_uv(nu)) { int resolu = nu->resolu, resolv = nu->resolv; if (use_render_resolution) { if (cu->resolu_ren) resolu = cu->resolu_ren; if (cu->resolv_ren) resolv = cu->resolv_ren; } if (nu->pntsv == 1) { len = SEGMENTSU(nu) * resolu; dl = MEM_callocN(sizeof(DispList), "makeDispListsurf"); dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts"); BLI_addtail(dispbase, dl); dl->parts = 1; dl->nr = len; dl->col = nu->mat_nr; dl->charidx = nu->charidx; /* dl->rt will be used as flag for render face and */ /* CU_2D conflicts with R_NOPUNOFLIP */ dl->rt = nu->flag & ~CU_2D; data = dl->verts; if (nu->flagu & CU_NURB_CYCLIC) dl->type = DL_POLY; else dl->type = DL_SEGM; BKE_nurb_makeCurve(nu, data, NULL, NULL, NULL, resolu, 3 * sizeof(float)); } else { len = (nu->pntsu * resolu) * (nu->pntsv * resolv); dl = MEM_callocN(sizeof(DispList), "makeDispListsurf"); dl->verts = MEM_mallocN(len * sizeof(float[3]), "dlverts"); BLI_addtail(dispbase, dl); dl->col = nu->mat_nr; dl->charidx = nu->charidx; /* dl->rt will be used as flag for render face and */ /* CU_2D conflicts with R_NOPUNOFLIP */ dl->rt = nu->flag & ~CU_2D; data = dl->verts; dl->type = DL_SURF; dl->parts = (nu->pntsu * resolu); /* in reverse, because makeNurbfaces works that way */ dl->nr = (nu->pntsv * resolv); if (nu->flagv & CU_NURB_CYCLIC) dl->flag |= DL_CYCL_U; /* reverse too! */ if (nu->flagu & CU_NURB_CYCLIC) dl->flag |= DL_CYCL_V; BKE_nurb_makeFaces(nu, data, 0, resolu, resolv); /* gl array drawing: using indices */ displist_surf_indices(dl); } } } if (!for_orco) { BKE_nurbList_duplicate(&ob->curve_cache->deformed_nurbs, &nubase); curve_calc_modifiers_post(scene, ob, &nubase, dispbase, r_dm_final, for_render, use_render_resolution); } BKE_nurbList_free(&nubase); }
void nurbs_foreachScreenVert( ViewContext *vc, void (*func)(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, const float screen_co_b[2]), void *userData, const eV3DProjTest clip_flag) { Curve *cu = vc->obedit->data; Nurb *nu; int i; ListBase *nurbs = BKE_curve_editNurbs_get(cu); ED_view3d_check_mats_rv3d(vc->rv3d); if (clip_flag & V3D_PROJ_TEST_CLIP_BB) { ED_view3d_clipping_local(vc->rv3d, vc->obedit->obmat); /* for local clipping lookups */ } for (nu = nurbs->first; nu; nu = nu->next) { if (nu->type == CU_BEZIER) { for (i = 0; i < nu->pntsu; i++) { BezTriple *bezt = &nu->bezt[i]; if (bezt->hide == 0) { float screen_co[2]; if (cu->drawflag & CU_HIDE_HANDLES) { if (ED_view3d_project_float_object(vc->ar, bezt->vec[1], screen_co, V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) == V3D_PROJ_RET_OK) { func(userData, nu, NULL, bezt, 1, screen_co); } } else { if (ED_view3d_project_float_object(vc->ar, bezt->vec[0], screen_co, V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) == V3D_PROJ_RET_OK) { func(userData, nu, NULL, bezt, 0, screen_co); } if (ED_view3d_project_float_object(vc->ar, bezt->vec[1], screen_co, V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) == V3D_PROJ_RET_OK) { func(userData, nu, NULL, bezt, 1, screen_co); } if (ED_view3d_project_float_object(vc->ar, bezt->vec[2], screen_co, V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) == V3D_PROJ_RET_OK) { func(userData, nu, NULL, bezt, 2, screen_co); } } } } } else { for (i = 0; i < nu->pntsu * nu->pntsv; i++) { BPoint *bp = &nu->bp[i]; if (bp->hide == 0) { float screen_co[2]; if (ED_view3d_project_float_object(vc->ar, bp->vec, screen_co, V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) == V3D_PROJ_RET_OK) { func(userData, nu, bp, NULL, -1, screen_co); } } } } } }