Cleanup: Use LISTBASE_FOREACH macro in curve code
These changes should result in more readable and undestandable code, especially where while loops were use instead of for loops. They are not comprehensive, and I skipped wherever the change was not obvious.
This commit is contained in:
parent
6ebb2e5e2b
commit
a308607a53
Notes:
blender-bot
2024-05-02 21:33:31 +02:00
Referenced by commit 81a0fffb2d
, Fix T82205: Curve Hooks not working
Referenced by issue #82205, Curve Hooks not working
Referenced by issue #81967, Crash when using extrude on a text object
|
@ -569,10 +569,9 @@ void BKE_curve_texspace_get(Curve *cu, float r_loc[3], float r_size[3])
|
|||
|
||||
bool BKE_nurbList_index_get_co(ListBase *nurb, const int index, float r_co[3])
|
||||
{
|
||||
Nurb *nu;
|
||||
int tot = 0;
|
||||
|
||||
for (nu = nurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, nurb) {
|
||||
int tot_nu;
|
||||
if (nu->type == CU_BEZIER) {
|
||||
tot_nu = nu->pntsu;
|
||||
|
@ -596,39 +595,33 @@ bool BKE_nurbList_index_get_co(ListBase *nurb, const int index, float r_co[3])
|
|||
|
||||
int BKE_nurbList_verts_count(ListBase *nurb)
|
||||
{
|
||||
Nurb *nu;
|
||||
int tot = 0;
|
||||
|
||||
nu = nurb->first;
|
||||
while (nu) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, nurb) {
|
||||
if (nu->bezt) {
|
||||
tot += 3 * nu->pntsu;
|
||||
}
|
||||
else if (nu->bp) {
|
||||
tot += nu->pntsu * nu->pntsv;
|
||||
}
|
||||
|
||||
nu = nu->next;
|
||||
}
|
||||
|
||||
return tot;
|
||||
}
|
||||
|
||||
int BKE_nurbList_verts_count_without_handles(ListBase *nurb)
|
||||
{
|
||||
Nurb *nu;
|
||||
int tot = 0;
|
||||
|
||||
nu = nurb->first;
|
||||
while (nu) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, nurb) {
|
||||
if (nu->bezt) {
|
||||
tot += nu->pntsu;
|
||||
}
|
||||
else if (nu->bp) {
|
||||
tot += nu->pntsu * nu->pntsv;
|
||||
}
|
||||
|
||||
nu = nu->next;
|
||||
}
|
||||
|
||||
return tot;
|
||||
}
|
||||
|
||||
|
@ -636,7 +629,6 @@ int BKE_nurbList_verts_count_without_handles(ListBase *nurb)
|
|||
|
||||
void BKE_nurb_free(Nurb *nu)
|
||||
{
|
||||
|
||||
if (nu == NULL) {
|
||||
return;
|
||||
}
|
||||
|
@ -664,17 +656,12 @@ void BKE_nurb_free(Nurb *nu)
|
|||
|
||||
void BKE_nurbList_free(ListBase *lb)
|
||||
{
|
||||
Nurb *nu, *next;
|
||||
|
||||
if (lb == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
nu = lb->first;
|
||||
while (nu) {
|
||||
next = nu->next;
|
||||
LISTBASE_FOREACH_MUTABLE (Nurb *, nu, lb) {
|
||||
BKE_nurb_free(nu);
|
||||
nu = next;
|
||||
}
|
||||
BLI_listbase_clear(lb);
|
||||
}
|
||||
|
@ -747,16 +734,11 @@ Nurb *BKE_nurb_copy(Nurb *src, int pntsu, int pntsv)
|
|||
|
||||
void BKE_nurbList_duplicate(ListBase *lb1, const ListBase *lb2)
|
||||
{
|
||||
Nurb *nu, *nun;
|
||||
|
||||
BKE_nurbList_free(lb1);
|
||||
|
||||
nu = lb2->first;
|
||||
while (nu) {
|
||||
nun = BKE_nurb_duplicate(nu);
|
||||
BLI_addtail(lb1, nun);
|
||||
|
||||
nu = nu->next;
|
||||
LISTBASE_FOREACH (const Nurb *, nu, lb2) {
|
||||
Nurb *nurb_new = BKE_nurb_duplicate(nu);
|
||||
BLI_addtail(lb1, nurb_new);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2625,9 +2607,7 @@ static void bevlist_firstlast_direction_calc_from_bpoint(Nurb *nu, BevList *bl)
|
|||
|
||||
void BKE_curve_bevelList_free(ListBase *bev)
|
||||
{
|
||||
BevList *bl, *blnext;
|
||||
for (bl = bev->first; bl != NULL; bl = blnext) {
|
||||
blnext = bl->next;
|
||||
LISTBASE_FOREACH_MUTABLE (BevList *, bl, bev) {
|
||||
if (bl->seglen != NULL) {
|
||||
MEM_freeN(bl->seglen);
|
||||
}
|
||||
|
@ -2654,10 +2634,9 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
|
||||
/* this function needs an object, because of tflag and upflag */
|
||||
Curve *cu = ob->data;
|
||||
Nurb *nu;
|
||||
BezTriple *bezt, *prevbezt;
|
||||
BPoint *bp;
|
||||
BevList *bl, *blnew, *blnext;
|
||||
BevList *blnew;
|
||||
BevPoint *bevp2, *bevp1 = NULL, *bevp0;
|
||||
const float treshold = 0.00001f;
|
||||
float min, inp;
|
||||
|
@ -2685,12 +2664,11 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
/* STEP 1: MAKE POLYS */
|
||||
|
||||
BKE_curve_bevelList_free(&ob->runtime.curve_cache->bev);
|
||||
nu = nurbs->first;
|
||||
if (cu->editnurb && ob->type != OB_FONT) {
|
||||
is_editmode = 1;
|
||||
}
|
||||
|
||||
for (; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, nurbs) {
|
||||
if (nu->hide && is_editmode) {
|
||||
continue;
|
||||
}
|
||||
|
@ -2706,7 +2684,7 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
/* check we are a single point? also check we are not a surface and that the orderu is sane,
|
||||
* enforced in the UI but can go wrong possibly */
|
||||
if (!BKE_nurb_check_valid_u(nu)) {
|
||||
bl = MEM_callocN(sizeof(BevList), "makeBevelList1");
|
||||
BevList *bl = MEM_callocN(sizeof(BevList), "makeBevelList1");
|
||||
bl->bevpoints = MEM_calloc_arrayN(1, sizeof(BevPoint), "makeBevelPoints1");
|
||||
BLI_addtail(bev, bl);
|
||||
bl->nr = 0;
|
||||
|
@ -2726,7 +2704,7 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
|
||||
if (nu->type == CU_POLY) {
|
||||
len = nu->pntsu;
|
||||
bl = MEM_callocN(sizeof(BevList), "makeBevelList2");
|
||||
BevList *bl = MEM_callocN(sizeof(BevList), "makeBevelList2");
|
||||
bl->bevpoints = MEM_calloc_arrayN(len, sizeof(BevPoint), "makeBevelPoints2");
|
||||
if (need_seglen && (nu->flagu & CU_NURB_CYCLIC) == 0) {
|
||||
bl->seglen = MEM_malloc_arrayN(segcount, sizeof(float), "makeBevelList2_seglen");
|
||||
|
@ -2777,7 +2755,7 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
/* in case last point is not cyclic */
|
||||
len = segcount * resolu + 1;
|
||||
|
||||
bl = MEM_callocN(sizeof(BevList), "makeBevelBPoints");
|
||||
BevList *bl = MEM_callocN(sizeof(BevList), "makeBevelBPoints");
|
||||
bl->bevpoints = MEM_calloc_arrayN(len, sizeof(BevPoint), "makeBevelBPointsPoints");
|
||||
if (need_seglen && (nu->flagu & CU_NURB_CYCLIC) == 0) {
|
||||
bl->seglen = MEM_malloc_arrayN(segcount, sizeof(float), "makeBevelBPoints_seglen");
|
||||
|
@ -2930,7 +2908,7 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
if (nu->pntsv == 1) {
|
||||
len = (resolu * segcount);
|
||||
|
||||
bl = MEM_callocN(sizeof(BevList), "makeBevelList3");
|
||||
BevList *bl = MEM_callocN(sizeof(BevList), "makeBevelList3");
|
||||
bl->bevpoints = MEM_calloc_arrayN(len, sizeof(BevPoint), "makeBevelPoints3");
|
||||
if (need_seglen && (nu->flagu & CU_NURB_CYCLIC) == 0) {
|
||||
bl->seglen = MEM_malloc_arrayN(segcount, sizeof(float), "makeBevelList3_seglen");
|
||||
|
@ -2989,8 +2967,7 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
}
|
||||
|
||||
/* STEP 2: DOUBLE POINTS AND AUTOMATIC RESOLUTION, REDUCE DATABLOCKS */
|
||||
bl = bev->first;
|
||||
while (bl) {
|
||||
LISTBASE_FOREACH (BevList *, bl, bev) {
|
||||
if (bl->nr) { /* null bevel items come from single points */
|
||||
bool is_cyclic = bl->poly != -1;
|
||||
nr = bl->nr;
|
||||
|
@ -3025,11 +3002,9 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
bevp1++;
|
||||
}
|
||||
}
|
||||
bl = bl->next;
|
||||
}
|
||||
bl = bev->first;
|
||||
while (bl) {
|
||||
blnext = bl->next;
|
||||
|
||||
LISTBASE_FOREACH_MUTABLE (BevList *, bl, bev) {
|
||||
if (bl->nr && bl->dupe_nr) {
|
||||
nr = bl->nr - bl->dupe_nr + 1; /* +1 because vectorbezier sets flag too */
|
||||
blnew = MEM_mallocN(sizeof(BevList), "makeBevelList4");
|
||||
|
@ -3043,7 +3018,7 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
blnew->seglen = bl->seglen;
|
||||
blnew->nr = 0;
|
||||
BLI_remlink(bev, bl);
|
||||
BLI_insertlinkbefore(bev, blnext, blnew); /* to make sure bevlijst is tuned with nurblist */
|
||||
BLI_insertlinkbefore(bev, bl->next, blnew); /* to make sure bevlist is tuned with nurblist */
|
||||
bevp0 = bl->bevpoints;
|
||||
bevp1 = blnew->bevpoints;
|
||||
nr = bl->nr;
|
||||
|
@ -3061,26 +3036,22 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
MEM_freeN(bl);
|
||||
blnew->dupe_nr = 0;
|
||||
}
|
||||
bl = blnext;
|
||||
}
|
||||
|
||||
/* STEP 3: POLYS COUNT AND AUTOHOLE */
|
||||
bl = bev->first;
|
||||
poly = 0;
|
||||
while (bl) {
|
||||
LISTBASE_FOREACH (BevList *, bl, bev) {
|
||||
if (bl->nr && bl->poly >= 0) {
|
||||
poly++;
|
||||
bl->poly = poly;
|
||||
bl->hole = 0;
|
||||
}
|
||||
bl = bl->next;
|
||||
}
|
||||
|
||||
/* find extreme left points, also test (turning) direction */
|
||||
if (poly > 0) {
|
||||
sd = sortdata = MEM_malloc_arrayN(poly, sizeof(struct BevelSort), "makeBevelList5");
|
||||
bl = bev->first;
|
||||
while (bl) {
|
||||
LISTBASE_FOREACH (BevList *, bl, bev) {
|
||||
if (bl->poly > 0) {
|
||||
BevPoint *bevp;
|
||||
|
||||
|
@ -3125,14 +3096,12 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
|
||||
sd++;
|
||||
}
|
||||
|
||||
bl = bl->next;
|
||||
}
|
||||
qsort(sortdata, poly, sizeof(struct BevelSort), vergxcobev);
|
||||
|
||||
sd = sortdata + 1;
|
||||
for (a = 1; a < poly; a++, sd++) {
|
||||
bl = sd->bl; /* is bl a hole? */
|
||||
BevList *bl = sd->bl; /* is bl a hole? */
|
||||
sd1 = sortdata + (a - 1);
|
||||
for (b = a - 1; b >= 0; b--, sd1--) { /* all polys to the left */
|
||||
if (sd1->bl->charidx == bl->charidx) { /* for text, only check matching char */
|
||||
|
@ -3149,7 +3118,7 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
sd = sortdata;
|
||||
for (a = 0; a < poly; a++, sd++) {
|
||||
if (sd->bl->hole == sd->dir) {
|
||||
bl = sd->bl;
|
||||
BevList *bl = sd->bl;
|
||||
bevp1 = bl->bevpoints;
|
||||
bevp2 = bevp1 + (bl->nr - 1);
|
||||
nr = bl->nr / 2;
|
||||
|
@ -3167,7 +3136,7 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
/* STEP 4: 2D-COSINES or 3D ORIENTATION */
|
||||
if ((cu->flag & CU_3D) == 0) {
|
||||
/* 2D Curves */
|
||||
for (bl = bev->first; bl; bl = bl->next) {
|
||||
LISTBASE_FOREACH (BevList *, bl, bev) {
|
||||
if (bl->nr < 2) {
|
||||
BevPoint *bevp = bl->bevpoints;
|
||||
unit_qt(bevp->quat);
|
||||
|
@ -3182,7 +3151,7 @@ void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
|
|||
}
|
||||
else {
|
||||
/* 3D Curves */
|
||||
for (bl = bev->first; bl; bl = bl->next) {
|
||||
LISTBASE_FOREACH (BevList *, bl, bev) {
|
||||
if (bl->nr < 2) {
|
||||
BevPoint *bevp = bl->bevpoints;
|
||||
unit_qt(bevp->quat);
|
||||
|
@ -4316,12 +4285,8 @@ void BKE_nurb_handles_autocalc(Nurb *nu, uint8_t flag)
|
|||
|
||||
void BKE_nurbList_handles_autocalc(ListBase *editnurb, uint8_t flag)
|
||||
{
|
||||
Nurb *nu;
|
||||
|
||||
nu = editnurb->first;
|
||||
while (nu) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
BKE_nurb_handles_autocalc(nu, flag);
|
||||
nu = nu->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4333,13 +4298,11 @@ void BKE_nurbList_handles_set(ListBase *editnurb, const char code)
|
|||
/* code==4: sets icu flag to become IPO_AUTO_HORIZ, horizontal extremes on auto-handles */
|
||||
/* code==5: Set align, like 3 but no toggle */
|
||||
/* code==6: Clear align, like 3 but no toggle */
|
||||
Nurb *nu;
|
||||
BezTriple *bezt;
|
||||
int a;
|
||||
|
||||
if (ELEM(code, HD_AUTO, HD_VECT)) {
|
||||
nu = editnurb->first;
|
||||
while (nu) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
bezt = nu->bezt;
|
||||
a = nu->pntsu;
|
||||
|
@ -4366,7 +4329,6 @@ void BKE_nurbList_handles_set(ListBase *editnurb, const char code)
|
|||
/* like BKE_nurb_handles_calc but moves selected */
|
||||
nurb_handles_calc__align_selected(nu);
|
||||
}
|
||||
nu = nu->next;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -4381,7 +4343,7 @@ void BKE_nurbList_handles_set(ListBase *editnurb, const char code)
|
|||
}
|
||||
else {
|
||||
/* Toggle */
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
bezt = nu->bezt;
|
||||
a = nu->pntsu;
|
||||
|
@ -4397,7 +4359,7 @@ void BKE_nurbList_handles_set(ListBase *editnurb, const char code)
|
|||
}
|
||||
h_new = (h_new == HD_FREE) ? HD_ALIGN : HD_FREE;
|
||||
}
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
bezt = nu->bezt;
|
||||
a = nu->pntsu;
|
||||
|
@ -4423,11 +4385,10 @@ void BKE_nurbList_handles_recalculate(ListBase *editnurb,
|
|||
const bool calc_length,
|
||||
const uint8_t flag)
|
||||
{
|
||||
Nurb *nu;
|
||||
BezTriple *bezt;
|
||||
int a;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
bool changed = false;
|
||||
|
||||
|
@ -4477,12 +4438,11 @@ void BKE_nurbList_handles_recalculate(ListBase *editnurb,
|
|||
|
||||
void BKE_nurbList_flag_set(ListBase *editnurb, uint8_t flag, bool set)
|
||||
{
|
||||
Nurb *nu;
|
||||
BezTriple *bezt;
|
||||
BPoint *bp;
|
||||
int a;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
a = nu->pntsu;
|
||||
bezt = nu->bezt;
|
||||
|
@ -4518,7 +4478,7 @@ bool BKE_nurbList_flag_set_from_flag(ListBase *editnurb, uint8_t from_flag, uint
|
|||
{
|
||||
bool changed = false;
|
||||
|
||||
for (Nurb *nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
for (int i = 0; i < nu->pntsu; i++) {
|
||||
BezTriple *bezt = &nu->bezt[i];
|
||||
|
@ -5232,12 +5192,11 @@ bool BKE_curve_minmax(Curve *cu, bool use_radius, float min[3], float max[3])
|
|||
bool BKE_curve_center_median(Curve *cu, float cent[3])
|
||||
{
|
||||
ListBase *nurb_lb = BKE_curve_nurbs_get(cu);
|
||||
Nurb *nu;
|
||||
int total = 0;
|
||||
|
||||
zero_v3(cent);
|
||||
|
||||
for (nu = nurb_lb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, nurb_lb) {
|
||||
int i;
|
||||
|
||||
if (nu->type == CU_BEZIER) {
|
||||
|
@ -5285,12 +5244,11 @@ void BKE_curve_transform_ex(Curve *cu,
|
|||
const bool do_props,
|
||||
const float unit_scale)
|
||||
{
|
||||
Nurb *nu;
|
||||
BPoint *bp;
|
||||
BezTriple *bezt;
|
||||
int i;
|
||||
|
||||
for (nu = cu->nurb.first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, &cu->nurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
i = nu->pntsu;
|
||||
for (bezt = nu->bezt; i--; bezt++) {
|
||||
|
@ -5320,7 +5278,7 @@ void BKE_curve_transform_ex(Curve *cu,
|
|||
float *fp = kb->data;
|
||||
int n = kb->totelem;
|
||||
|
||||
for (nu = cu->nurb.first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, &cu->nurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
for (i = nu->pntsu; i && (n -= KEYELEM_ELEM_LEN_BEZTRIPLE) >= 0; i--) {
|
||||
mul_m4_v3(mat, &fp[0]);
|
||||
|
|
|
@ -92,17 +92,13 @@ void BKE_displist_free(ListBase *lb)
|
|||
|
||||
DispList *BKE_displist_find_or_create(ListBase *lb, int type)
|
||||
{
|
||||
DispList *dl;
|
||||
|
||||
dl = lb->first;
|
||||
while (dl) {
|
||||
LISTBASE_FOREACH (DispList *, dl, lb) {
|
||||
if (dl->type == type) {
|
||||
return dl;
|
||||
}
|
||||
dl = dl->next;
|
||||
}
|
||||
|
||||
dl = MEM_callocN(sizeof(DispList), "find_disp");
|
||||
DispList *dl = MEM_callocN(sizeof(DispList), "find_disp");
|
||||
dl->type = type;
|
||||
BLI_addtail(lb, dl);
|
||||
|
||||
|
@ -111,14 +107,10 @@ DispList *BKE_displist_find_or_create(ListBase *lb, int type)
|
|||
|
||||
DispList *BKE_displist_find(ListBase *lb, int type)
|
||||
{
|
||||
DispList *dl;
|
||||
|
||||
dl = lb->first;
|
||||
while (dl) {
|
||||
LISTBASE_FOREACH (DispList *, dl, lb) {
|
||||
if (dl->type == type) {
|
||||
return dl;
|
||||
}
|
||||
dl = dl->next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -126,9 +118,7 @@ DispList *BKE_displist_find(ListBase *lb, int type)
|
|||
|
||||
bool BKE_displist_has_faces(ListBase *lb)
|
||||
{
|
||||
DispList *dl;
|
||||
|
||||
for (dl = lb->first; dl; dl = dl->next) {
|
||||
LISTBASE_FOREACH (DispList *, dl, lb) {
|
||||
if (ELEM(dl->type, DL_INDEX3, DL_INDEX4, DL_SURF)) {
|
||||
return true;
|
||||
}
|
||||
|
@ -139,13 +129,10 @@ bool BKE_displist_has_faces(ListBase *lb)
|
|||
|
||||
void BKE_displist_copy(ListBase *lbn, ListBase *lb)
|
||||
{
|
||||
DispList *dln, *dl;
|
||||
|
||||
BKE_displist_free(lbn);
|
||||
|
||||
dl = lb->first;
|
||||
while (dl) {
|
||||
dln = MEM_dupallocN(dl);
|
||||
LISTBASE_FOREACH (const DispList *, dl, lb) {
|
||||
DispList *dln = MEM_dupallocN(dl);
|
||||
BLI_addtail(lbn, dln);
|
||||
dln->verts = MEM_dupallocN(dl->verts);
|
||||
dln->nors = MEM_dupallocN(dl->nors);
|
||||
|
@ -154,22 +141,18 @@ void BKE_displist_copy(ListBase *lbn, ListBase *lb)
|
|||
if (dl->bevel_split) {
|
||||
dln->bevel_split = MEM_dupallocN(dl->bevel_split);
|
||||
}
|
||||
|
||||
dl = dl->next;
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_displist_normals_add(ListBase *lb)
|
||||
{
|
||||
DispList *dl = NULL;
|
||||
float *vdata, *ndata, nor[3];
|
||||
float *v1, *v2, *v3, *v4;
|
||||
float *n1, *n2, *n3, *n4;
|
||||
int a, b, p1, p2, p3, p4;
|
||||
|
||||
dl = lb->first;
|
||||
LISTBASE_FOREACH (DispList *, dl, lb) {
|
||||
|
||||
while (dl) {
|
||||
if (dl->type == DL_INDEX3) {
|
||||
if (dl->nors == NULL) {
|
||||
dl->nors = MEM_callocN(sizeof(float[3]), "dlnors");
|
||||
|
@ -230,15 +213,12 @@ void BKE_displist_normals_add(ListBase *lb)
|
|||
}
|
||||
}
|
||||
}
|
||||
dl = dl->next;
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_displist_count(ListBase *lb, int *totvert, int *totface, int *tottri)
|
||||
{
|
||||
DispList *dl;
|
||||
|
||||
for (dl = lb->first; dl; dl = dl->next) {
|
||||
LISTBASE_FOREACH (DispList *, dl, lb) {
|
||||
int vert_tot = 0;
|
||||
int face_tot = 0;
|
||||
int tri_tot = 0;
|
||||
|
@ -318,7 +298,6 @@ static void curve_to_displist(Curve *cu,
|
|||
ListBase *dispbase,
|
||||
const bool for_render)
|
||||
{
|
||||
Nurb *nu;
|
||||
DispList *dl;
|
||||
BezTriple *bezt, *prevbezt;
|
||||
BPoint *bp;
|
||||
|
@ -326,8 +305,7 @@ static void curve_to_displist(Curve *cu,
|
|||
int a, len, resolu;
|
||||
const bool editmode = (!for_render && (cu->editnurb || cu->editfont));
|
||||
|
||||
nu = nubase->first;
|
||||
while (nu) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, nubase) {
|
||||
if (nu->hide == 0 || editmode == false) {
|
||||
if (for_render && cu->resolu_ren != 0) {
|
||||
resolu = cu->resolu_ren;
|
||||
|
@ -473,7 +451,6 @@ static void curve_to_displist(Curve *cu,
|
|||
}
|
||||
}
|
||||
}
|
||||
nu = nu->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -627,19 +604,14 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase)
|
|||
{
|
||||
const float z_up[3] = {0.0f, 0.0f, -1.0f};
|
||||
ListBase front, back;
|
||||
DispList *dl, *dlnew;
|
||||
float *fp, *fp1;
|
||||
int a, dpoly;
|
||||
|
||||
BLI_listbase_clear(&front);
|
||||
BLI_listbase_clear(&back);
|
||||
|
||||
dl = dispbase->first;
|
||||
while (dl) {
|
||||
LISTBASE_FOREACH (DispList *, dl, dispbase) {
|
||||
if (dl->type == DL_SURF) {
|
||||
if ((dl->flag & DL_CYCL_V) && (dl->flag & DL_CYCL_U) == 0) {
|
||||
if ((cu->flag & CU_BACK) && (dl->flag & DL_BACK_CURVE)) {
|
||||
dlnew = MEM_callocN(sizeof(DispList), "filldisp");
|
||||
DispList *dlnew = MEM_callocN(sizeof(DispList), "filldisp");
|
||||
BLI_addtail(&front, dlnew);
|
||||
dlnew->verts = fp1 = MEM_mallocN(sizeof(float[3]) * dl->parts, "filldisp1");
|
||||
dlnew->nr = dl->parts;
|
||||
|
@ -660,7 +632,7 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase)
|
|||
}
|
||||
}
|
||||
if ((cu->flag & CU_FRONT) && (dl->flag & DL_FRONT_CURVE)) {
|
||||
dlnew = MEM_callocN(sizeof(DispList), "filldisp");
|
||||
DispList *dlnew = MEM_callocN(sizeof(DispList), "filldisp");
|
||||
BLI_addtail(&back, dlnew);
|
||||
dlnew->verts = fp1 = MEM_mallocN(sizeof(float[3]) * dl->parts, "filldisp1");
|
||||
dlnew->nr = dl->parts;
|
||||
|
@ -682,7 +654,6 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase)
|
|||
}
|
||||
}
|
||||
}
|
||||
dl = dl->next;
|
||||
}
|
||||
|
||||
BKE_displist_fill(&front, dispbase, z_up, true);
|
||||
|
@ -939,18 +910,17 @@ static bool curve_calc_modifiers_pre(
|
|||
|
||||
static float (*displist_vert_coords_alloc(ListBase *dispbase, int *r_vert_len))[3]
|
||||
{
|
||||
DispList *dl;
|
||||
float(*allverts)[3], *fp;
|
||||
|
||||
*r_vert_len = 0;
|
||||
|
||||
for (dl = dispbase->first; dl; dl = dl->next) {
|
||||
LISTBASE_FOREACH (DispList *, dl, dispbase) {
|
||||
*r_vert_len += (dl->type == DL_INDEX3) ? dl->nr : dl->parts * dl->nr;
|
||||
}
|
||||
|
||||
allverts = MEM_mallocN(sizeof(float[3]) * (*r_vert_len), "displist_vert_coords_alloc allverts");
|
||||
fp = (float *)allverts;
|
||||
for (dl = dispbase->first; dl; dl = dl->next) {
|
||||
LISTBASE_FOREACH (DispList *, dl, dispbase) {
|
||||
int offs = 3 * ((dl->type == DL_INDEX3) ? dl->nr : dl->parts * dl->nr);
|
||||
memcpy(fp, dl->verts, sizeof(float) * offs);
|
||||
fp += offs;
|
||||
|
@ -961,11 +931,10 @@ static float (*displist_vert_coords_alloc(ListBase *dispbase, int *r_vert_len))[
|
|||
|
||||
static void displist_vert_coords_apply(ListBase *dispbase, float (*allverts)[3])
|
||||
{
|
||||
DispList *dl;
|
||||
const float *fp;
|
||||
|
||||
fp = (float *)allverts;
|
||||
for (dl = dispbase->first; dl; dl = dl->next) {
|
||||
LISTBASE_FOREACH (DispList *, dl, dispbase) {
|
||||
int offs = 3 * ((dl->type == DL_INDEX3) ? dl->nr : dl->parts * dl->nr);
|
||||
memcpy(dl->verts, fp, sizeof(float) * offs);
|
||||
fp += offs;
|
||||
|
@ -1218,7 +1187,6 @@ void BKE_displist_make_surf(Depsgraph *depsgraph,
|
|||
const bool for_orco)
|
||||
{
|
||||
ListBase nubase = {NULL, NULL};
|
||||
Nurb *nu;
|
||||
Curve *cu = ob->data;
|
||||
DispList *dl;
|
||||
float *data;
|
||||
|
@ -1236,7 +1204,7 @@ void BKE_displist_make_surf(Depsgraph *depsgraph,
|
|||
force_mesh_conversion = curve_calc_modifiers_pre(depsgraph, scene, ob, &nubase, for_render);
|
||||
}
|
||||
|
||||
for (nu = nubase.first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, &nubase) {
|
||||
if ((for_render || nu->hide == 0) && BKE_nurb_check_valid_uv(nu)) {
|
||||
int resolu = nu->resolu, resolv = nu->resolv;
|
||||
|
||||
|
@ -1851,12 +1819,11 @@ void BKE_displist_make_curveTypes_forRender(Depsgraph *depsgraph,
|
|||
|
||||
void BKE_displist_minmax(ListBase *dispbase, float min[3], float max[3])
|
||||
{
|
||||
DispList *dl;
|
||||
const float *vert;
|
||||
int a, tot = 0;
|
||||
int doit = 0;
|
||||
|
||||
for (dl = dispbase->first; dl; dl = dl->next) {
|
||||
LISTBASE_FOREACH (DispList *, dl, dispbase) {
|
||||
tot = (dl->type == DL_INDEX3) ? dl->nr : dl->nr * dl->parts;
|
||||
vert = dl->verts;
|
||||
for (a = 0; a < tot; a++, vert += 3) {
|
||||
|
|
|
@ -476,19 +476,15 @@ static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
|
|||
|
||||
static void switch_keys_direction(Curve *cu, Nurb *actnu)
|
||||
{
|
||||
KeyBlock *currkey;
|
||||
EditNurb *editnurb = cu->editnurb;
|
||||
ListBase *nubase = &editnurb->nurbs;
|
||||
Nurb *nu;
|
||||
float *fp;
|
||||
int a;
|
||||
|
||||
currkey = cu->key->block.first;
|
||||
while (currkey) {
|
||||
LISTBASE_FOREACH (KeyBlock *, currkey, &cu->key->block) {
|
||||
fp = currkey->data;
|
||||
|
||||
nu = nubase->first;
|
||||
while (nu) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, nubase) {
|
||||
if (nu->bezt) {
|
||||
BezTriple *bezt = nu->bezt;
|
||||
a = nu->pntsu;
|
||||
|
@ -522,11 +518,7 @@ static void switch_keys_direction(Curve *cu, Nurb *actnu)
|
|||
fp += a * KEYELEM_FLOAT_LEN_BPOINT;
|
||||
}
|
||||
}
|
||||
|
||||
nu = nu->next;
|
||||
}
|
||||
|
||||
currkey = currkey->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -583,13 +575,11 @@ static void bezt_to_key(BezTriple *bezt, float *key)
|
|||
|
||||
static void calc_keyHandles(ListBase *nurb, float *key)
|
||||
{
|
||||
Nurb *nu;
|
||||
int a;
|
||||
float *fp = key;
|
||||
BezTriple *bezt;
|
||||
|
||||
nu = nurb->first;
|
||||
while (nu) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, nurb) {
|
||||
if (nu->bezt) {
|
||||
BezTriple *prevp, *nextp;
|
||||
BezTriple cur, prev, next;
|
||||
|
@ -649,8 +639,6 @@ static void calc_keyHandles(ListBase *nurb, float *key)
|
|||
a = nu->pntsu * nu->pntsv;
|
||||
fp += a * KEYELEM_FLOAT_LEN_BPOINT;
|
||||
}
|
||||
|
||||
nu = nu->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -666,7 +654,7 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
|
|||
KeyBlock *actkey = BLI_findlink(&cu->key->block, editnurb->shapenr - 1);
|
||||
BezTriple *bezt, *oldbezt;
|
||||
BPoint *bp, *oldbp;
|
||||
Nurb *nu, *newnu;
|
||||
Nurb *newnu;
|
||||
int totvert = BKE_keyblock_curve_element_count(&editnurb->nurbs);
|
||||
|
||||
float(*ofs)[3] = NULL;
|
||||
|
@ -678,8 +666,8 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
|
|||
int totvec = 0;
|
||||
|
||||
/* Calculate needed memory to store offset */
|
||||
nu = editnurb->nurbs.first;
|
||||
while (nu) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, &editnurb->nurbs) {
|
||||
|
||||
if (nu->bezt) {
|
||||
/* Three vects to store handles and one for tilt. */
|
||||
totvec += nu->pntsu * 4;
|
||||
|
@ -687,14 +675,11 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
|
|||
else {
|
||||
totvec += 2 * nu->pntsu * nu->pntsv;
|
||||
}
|
||||
|
||||
nu = nu->next;
|
||||
}
|
||||
|
||||
ofs = MEM_callocN(sizeof(float[3]) * totvec, "currkey->data");
|
||||
nu = editnurb->nurbs.first;
|
||||
i = 0;
|
||||
while (nu) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, &editnurb->nurbs) {
|
||||
if (nu->bezt) {
|
||||
bezt = nu->bezt;
|
||||
a = nu->pntsu;
|
||||
|
@ -731,8 +716,6 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
|
|||
bp++;
|
||||
}
|
||||
}
|
||||
|
||||
nu = nu->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -745,7 +728,7 @@ static void calc_shapeKeys(Object *obedit, ListBase *newnurbs)
|
|||
float *fp = newkey = MEM_callocN(cu->key->elemsize * totvert, "currkey->data");
|
||||
ofp = oldkey = currkey->data;
|
||||
|
||||
nu = editnurb->nurbs.first;
|
||||
Nurb *nu = editnurb->nurbs.first;
|
||||
/* We need to restore to original curve into newnurb, *not* editcurve's nurbs.
|
||||
* Otherwise, in case we update obdata *without* leaving editmode (e.g. viewport render),
|
||||
* we would invalidate editcurve. */
|
||||
|
@ -929,11 +912,10 @@ static void fcurve_path_rename(AnimData *adt,
|
|||
ListBase *orig_curves,
|
||||
ListBase *curves)
|
||||
{
|
||||
FCurve *fcu, *nfcu, *nextfcu;
|
||||
FCurve *nfcu;
|
||||
int len = strlen(orig_rna_path);
|
||||
|
||||
for (fcu = orig_curves->first; fcu; fcu = nextfcu) {
|
||||
nextfcu = fcu->next;
|
||||
LISTBASE_FOREACH_MUTABLE (FCurve *, fcu, orig_curves) {
|
||||
if (STREQLEN(fcu->rna_path, orig_rna_path, len)) {
|
||||
char *spath, *suffix = fcu->rna_path + len;
|
||||
nfcu = BKE_fcurve_copy(fcu);
|
||||
|
@ -977,16 +959,15 @@ static void fcurve_remove(AnimData *adt, ListBase *orig_curves, FCurve *fcu)
|
|||
|
||||
static void curve_rename_fcurves(Curve *cu, ListBase *orig_curves)
|
||||
{
|
||||
int nu_index = 0, a, pt_index;
|
||||
int a, pt_index;
|
||||
EditNurb *editnurb = cu->editnurb;
|
||||
Nurb *nu;
|
||||
CVKeyIndex *keyIndex;
|
||||
char rna_path[64], orig_rna_path[64];
|
||||
AnimData *adt = BKE_animdata_from_id(&cu->id);
|
||||
ListBase curves = {NULL, NULL};
|
||||
FCurve *fcu, *next;
|
||||
|
||||
for (nu = editnurb->nurbs.first, nu_index = 0; nu != NULL; nu = nu->next, nu_index++) {
|
||||
int nu_index = 0;
|
||||
LISTBASE_FOREACH_INDEX (Nurb *, nu, &editnurb->nurbs, nu_index) {
|
||||
if (nu->bezt) {
|
||||
BezTriple *bezt = nu->bezt;
|
||||
a = nu->pntsu;
|
||||
|
@ -1054,9 +1035,7 @@ static void curve_rename_fcurves(Curve *cu, ListBase *orig_curves)
|
|||
/* remove paths for removed control points
|
||||
* need this to make further step with copying non-cv related curves copying
|
||||
* not touching cv's f-curves */
|
||||
for (fcu = orig_curves->first; fcu; fcu = next) {
|
||||
next = fcu->next;
|
||||
|
||||
LISTBASE_FOREACH_MUTABLE (FCurve *, fcu, orig_curves) {
|
||||
if (STREQLEN(fcu->rna_path, "splines", 7)) {
|
||||
const char *ch = strchr(fcu->rna_path, '.');
|
||||
|
||||
|
@ -1066,7 +1045,8 @@ static void curve_rename_fcurves(Curve *cu, ListBase *orig_curves)
|
|||
}
|
||||
}
|
||||
|
||||
for (nu = editnurb->nurbs.first, nu_index = 0; nu != NULL; nu = nu->next, nu_index++) {
|
||||
nu_index = 0;
|
||||
LISTBASE_FOREACH_INDEX (Nurb *, nu, &editnurb->nurbs, nu_index) {
|
||||
keyIndex = NULL;
|
||||
if (nu->pntsu) {
|
||||
if (nu->bezt) {
|
||||
|
@ -1086,9 +1066,7 @@ static void curve_rename_fcurves(Curve *cu, ListBase *orig_curves)
|
|||
|
||||
/* the remainders in orig_curves can be copied back (like follow path) */
|
||||
/* (if it's not path to spline) */
|
||||
for (fcu = orig_curves->first; fcu; fcu = next) {
|
||||
next = fcu->next;
|
||||
|
||||
LISTBASE_FOREACH_MUTABLE (FCurve *, fcu, orig_curves) {
|
||||
if (STREQLEN(fcu->rna_path, "splines", 7)) {
|
||||
fcurve_remove(adt, orig_curves, fcu);
|
||||
}
|
||||
|
@ -1141,13 +1119,11 @@ static int *init_index_map(Object *obedit, int *r_old_totvert)
|
|||
{
|
||||
Curve *curve = (Curve *)obedit->data;
|
||||
EditNurb *editnurb = curve->editnurb;
|
||||
Nurb *nu;
|
||||
CVKeyIndex *keyIndex;
|
||||
int *old_to_new_map;
|
||||
int old_totvert;
|
||||
int vertex_index;
|
||||
|
||||
for (nu = curve->nurb.first, old_totvert = 0; nu != NULL; nu = nu->next) {
|
||||
int old_totvert = 0;
|
||||
LISTBASE_FOREACH (Nurb *, nu, &curve->nurb) {
|
||||
if (nu->bezt) {
|
||||
old_totvert += nu->pntsu * 3;
|
||||
}
|
||||
|
@ -1161,7 +1137,8 @@ static int *init_index_map(Object *obedit, int *r_old_totvert)
|
|||
old_to_new_map[i] = -1;
|
||||
}
|
||||
|
||||
for (nu = editnurb->nurbs.first, vertex_index = 0; nu != NULL; nu = nu->next) {
|
||||
int vertex_index = 0;
|
||||
LISTBASE_FOREACH (Nurb *, nu, &curve->nurb) {
|
||||
if (nu->bezt) {
|
||||
BezTriple *bezt = nu->bezt;
|
||||
int a = nu->pntsu;
|
||||
|
@ -1205,7 +1182,6 @@ static int *init_index_map(Object *obedit, int *r_old_totvert)
|
|||
|
||||
static void remap_hooks_and_vertex_parents(Main *bmain, Object *obedit)
|
||||
{
|
||||
Object *object;
|
||||
Curve *curve = (Curve *)obedit->data;
|
||||
EditNurb *editnurb = curve->editnurb;
|
||||
int *old_to_new_map = NULL;
|
||||
|
@ -1219,8 +1195,7 @@ static void remap_hooks_and_vertex_parents(Main *bmain, Object *obedit)
|
|||
return;
|
||||
}
|
||||
|
||||
for (object = bmain->objects.first; object; object = object->id.next) {
|
||||
ModifierData *md;
|
||||
LISTBASE_FOREACH (Object *, object, &bmain->objects) {
|
||||
int index;
|
||||
if ((object->parent) && (object->parent->data == curve) &&
|
||||
ELEM(object->partype, PARVERT1, PARVERT3)) {
|
||||
|
@ -1248,7 +1223,7 @@ static void remap_hooks_and_vertex_parents(Main *bmain, Object *obedit)
|
|||
}
|
||||
}
|
||||
if (object->data == curve) {
|
||||
for (md = object->modifiers.first; md; md = md->next) {
|
||||
LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
|
||||
if (md->type == eModifierType_Hook) {
|
||||
HookModifierData *hmd = (HookModifierData *)md;
|
||||
int i, j;
|
||||
|
@ -1290,13 +1265,12 @@ void ED_curve_editnurb_load(Main *bmain, Object *obedit)
|
|||
|
||||
if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
|
||||
Curve *cu = obedit->data;
|
||||
Nurb *nu, *newnu;
|
||||
ListBase newnurb = {NULL, NULL}, oldnurb = cu->nurb;
|
||||
|
||||
remap_hooks_and_vertex_parents(bmain, obedit);
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
newnu = BKE_nurb_duplicate(nu);
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
Nurb *newnu = BKE_nurb_duplicate(nu);
|
||||
BLI_addtail(&newnurb, newnu);
|
||||
|
||||
if (nu->type == CU_NURBS) {
|
||||
|
@ -1323,7 +1297,6 @@ void ED_curve_editnurb_make(Object *obedit)
|
|||
{
|
||||
Curve *cu = (Curve *)obedit->data;
|
||||
EditNurb *editnurb = cu->editnurb;
|
||||
Nurb *nu, *newnu;
|
||||
KeyBlock *actkey;
|
||||
|
||||
if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
|
||||
|
@ -1346,12 +1319,10 @@ void ED_curve_editnurb_make(Object *obedit)
|
|||
cu->editnurb = editnurb;
|
||||
}
|
||||
|
||||
nu = cu->nurb.first;
|
||||
while (nu) {
|
||||
newnu = BKE_nurb_duplicate(nu);
|
||||
LISTBASE_FOREACH (Nurb *, nu, &cu->nurb) {
|
||||
Nurb *newnu = BKE_nurb_duplicate(nu);
|
||||
BKE_nurb_test_2d(newnu); /* after join, or any other creation of curve */
|
||||
BLI_addtail(&editnurb->nurbs, newnu);
|
||||
nu = nu->next;
|
||||
}
|
||||
|
||||
/* animation could be added in editmode even if there was no animdata in
|
||||
|
@ -1722,11 +1693,10 @@ static void rotateflagNurb(ListBase *editnurb,
|
|||
const float rotmat[3][3])
|
||||
{
|
||||
/* all verts with (flag & 'flag') rotate */
|
||||
Nurb *nu;
|
||||
BPoint *bp;
|
||||
int a;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->type == CU_NURBS) {
|
||||
bp = nu->bp;
|
||||
a = nu->pntsu * nu->pntsv;
|
||||
|
@ -1746,12 +1716,11 @@ static void rotateflagNurb(ListBase *editnurb,
|
|||
void ed_editnurb_translate_flag(ListBase *editnurb, uint8_t flag, const float vec[3])
|
||||
{
|
||||
/* all verts with ('flag' & flag) translate */
|
||||
Nurb *nu;
|
||||
BezTriple *bezt;
|
||||
BPoint *bp;
|
||||
int a;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
a = nu->pntsu;
|
||||
bezt = nu->bezt;
|
||||
|
@ -1785,11 +1754,10 @@ void ed_editnurb_translate_flag(ListBase *editnurb, uint8_t flag, const float ve
|
|||
|
||||
static void weightflagNurb(ListBase *editnurb, short flag, float w)
|
||||
{
|
||||
Nurb *nu;
|
||||
BPoint *bp;
|
||||
int a;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->type == CU_NURBS) {
|
||||
a = nu->pntsu * nu->pntsv;
|
||||
bp = nu->bp;
|
||||
|
@ -1808,16 +1776,12 @@ static void ed_surf_delete_selected(Object *obedit)
|
|||
{
|
||||
Curve *cu = obedit->data;
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu, *next;
|
||||
BPoint *bp, *bpn, *newbp;
|
||||
int a, b, newu, newv;
|
||||
|
||||
BLI_assert(obedit->type == OB_SURF);
|
||||
|
||||
nu = editnurb->first;
|
||||
while (nu) {
|
||||
next = nu->next;
|
||||
|
||||
LISTBASE_FOREACH_MUTABLE (Nurb *, nu, editnurb) {
|
||||
/* is entire nurb selected */
|
||||
bp = nu->bp;
|
||||
a = nu->pntsu * nu->pntsv;
|
||||
|
@ -1903,7 +1867,6 @@ static void ed_surf_delete_selected(Object *obedit)
|
|||
}
|
||||
}
|
||||
}
|
||||
nu = next;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1912,15 +1875,12 @@ static void ed_curve_delete_selected(Object *obedit, View3D *v3d)
|
|||
Curve *cu = obedit->data;
|
||||
EditNurb *editnurb = cu->editnurb;
|
||||
ListBase *nubase = &editnurb->nurbs;
|
||||
Nurb *nu, *next;
|
||||
BezTriple *bezt, *bezt1;
|
||||
BPoint *bp, *bp1;
|
||||
int a, type, nuindex = 0;
|
||||
|
||||
/* first loop, can we remove entire pieces? */
|
||||
nu = nubase->first;
|
||||
while (nu) {
|
||||
next = nu->next;
|
||||
LISTBASE_FOREACH_MUTABLE (Nurb *, nu, nubase) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
bezt = nu->bezt;
|
||||
a = nu->pntsu;
|
||||
|
@ -1981,13 +1941,10 @@ static void ed_curve_delete_selected(Object *obedit, View3D *v3d)
|
|||
clamp_nurb_order_u(nu);
|
||||
}
|
||||
#endif
|
||||
nu = next;
|
||||
nuindex++;
|
||||
}
|
||||
/* 2nd loop, delete small pieces: just for curves */
|
||||
nu = nubase->first;
|
||||
while (nu) {
|
||||
next = nu->next;
|
||||
LISTBASE_FOREACH_MUTABLE (Nurb *, nu, nubase) {
|
||||
type = 0;
|
||||
if (nu->type == CU_BEZIER) {
|
||||
bezt = nu->bezt;
|
||||
|
@ -2047,21 +2004,17 @@ static void ed_curve_delete_selected(Object *obedit, View3D *v3d)
|
|||
BKE_nurb_order_clamp_u(nu);
|
||||
BKE_nurb_knot_calc_u(nu);
|
||||
}
|
||||
nu = next;
|
||||
}
|
||||
}
|
||||
|
||||
/* only for OB_SURF */
|
||||
bool ed_editnurb_extrude_flag(EditNurb *editnurb, const uint8_t flag)
|
||||
{
|
||||
Nurb *nu;
|
||||
BPoint *bp, *bpn, *newbp;
|
||||
int a, u, v, len;
|
||||
bool ok = false;
|
||||
|
||||
nu = editnurb->nurbs.first;
|
||||
while (nu) {
|
||||
|
||||
LISTBASE_FOREACH (Nurb *, nu, &editnurb->nurbs) {
|
||||
if (nu->pntsv == 1) {
|
||||
bp = nu->bp;
|
||||
a = nu->pntsu;
|
||||
|
@ -2166,7 +2119,6 @@ bool ed_editnurb_extrude_flag(EditNurb *editnurb, const uint8_t flag)
|
|||
}
|
||||
}
|
||||
}
|
||||
nu = nu->next;
|
||||
}
|
||||
|
||||
return ok;
|
||||
|
@ -2197,14 +2149,15 @@ static void adduplicateflagNurb(
|
|||
Object *obedit, View3D *v3d, ListBase *newnurb, const uint8_t flag, const bool split)
|
||||
{
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu, *newnu;
|
||||
Nurb *newnu;
|
||||
BezTriple *bezt, *bezt1;
|
||||
BPoint *bp, *bp1, *bp2, *bp3;
|
||||
Curve *cu = (Curve *)obedit->data;
|
||||
int a, b, c, starta, enda, diffa, cyclicu, cyclicv, newu, newv, i;
|
||||
int a, b, c, starta, enda, diffa, cyclicu, cyclicv, newu, newv;
|
||||
char *usel;
|
||||
|
||||
for (i = 0, nu = editnurb->first; nu; i++, nu = nu->next) {
|
||||
int i = 0;
|
||||
LISTBASE_FOREACH_INDEX (Nurb *, nu, editnurb, i) {
|
||||
cyclicu = cyclicv = 0;
|
||||
if (nu->type == CU_BEZIER) {
|
||||
for (a = 0, bezt = nu->bezt; a < nu->pntsu; a++, bezt++) {
|
||||
|
@ -2569,7 +2522,7 @@ static void adduplicateflagNurb(
|
|||
}
|
||||
|
||||
if (BLI_listbase_is_empty(newnurb) == false) {
|
||||
for (nu = newnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, newnurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
if (split) {
|
||||
/* recalc first and last */
|
||||
|
@ -2619,10 +2572,9 @@ static int switch_direction_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
}
|
||||
|
||||
EditNurb *editnurb = cu->editnurb;
|
||||
Nurb *nu;
|
||||
int i;
|
||||
|
||||
for (nu = editnurb->nurbs.first, i = 0; nu; nu = nu->next, i++) {
|
||||
int i = 0;
|
||||
LISTBASE_FOREACH_INDEX (Nurb *, nu, &editnurb->nurbs, i) {
|
||||
if (ED_curve_nurb_select_check(v3d, nu)) {
|
||||
BKE_nurb_direction_switch(nu);
|
||||
keyData_switchDirectionNurb(cu, nu);
|
||||
|
@ -2674,13 +2626,12 @@ static int set_goal_weight_exec(bContext *C, wmOperator *op)
|
|||
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
|
||||
Object *obedit = objects[ob_index];
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu;
|
||||
BezTriple *bezt;
|
||||
BPoint *bp;
|
||||
float weight = RNA_float_get(op->ptr, "weight");
|
||||
int a;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->bezt) {
|
||||
for (bezt = nu->bezt, a = 0; a < nu->pntsu; a++, bezt++) {
|
||||
if (bezt->f2 & SELECT) {
|
||||
|
@ -2741,13 +2692,12 @@ static int set_radius_exec(bContext *C, wmOperator *op)
|
|||
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
|
||||
Object *obedit = objects[ob_index];
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu;
|
||||
BezTriple *bezt;
|
||||
BPoint *bp;
|
||||
float radius = RNA_float_get(op->ptr, "radius");
|
||||
int a;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->bezt) {
|
||||
for (bezt = nu->bezt, a = 0; a < nu->pntsu; a++, bezt++) {
|
||||
if (bezt->f2 & SELECT) {
|
||||
|
@ -2853,12 +2803,11 @@ static int smooth_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
|
||||
Object *obedit = objects[ob_index];
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu;
|
||||
|
||||
int a, a_end;
|
||||
bool changed = false;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->bezt) {
|
||||
/* duplicate the curve to use in weight calculation */
|
||||
const BezTriple *bezt_orig = MEM_dupallocN(nu->bezt);
|
||||
|
@ -2960,7 +2909,6 @@ void CURVE_OT_smooth(wmOperatorType *ot)
|
|||
|
||||
static void curve_smooth_value(ListBase *editnurb, const int bezt_offsetof, const int bp_offset)
|
||||
{
|
||||
Nurb *nu;
|
||||
BezTriple *bezt;
|
||||
BPoint *bp;
|
||||
int a;
|
||||
|
@ -2970,7 +2918,7 @@ static void curve_smooth_value(ListBase *editnurb, const int bezt_offsetof, cons
|
|||
int start_sel, end_sel; /* selection indices, inclusive */
|
||||
float start_rad, end_rad, fac, range;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->bezt) {
|
||||
#define BEZT_VALUE(bezt) (*((float *)((char *)(bezt) + bezt_offsetof)))
|
||||
|
||||
|
@ -3289,12 +3237,11 @@ static int hide_exec(bContext *C, wmOperator *op)
|
|||
}
|
||||
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu;
|
||||
BPoint *bp;
|
||||
BezTriple *bezt;
|
||||
int a, sel;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
bezt = nu->bezt;
|
||||
a = nu->pntsu;
|
||||
|
@ -3385,13 +3332,12 @@ static int reveal_exec(bContext *C, wmOperator *op)
|
|||
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
|
||||
Object *obedit = objects[ob_index];
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu;
|
||||
BPoint *bp;
|
||||
BezTriple *bezt;
|
||||
int a;
|
||||
bool changed = false;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
nu->hide = 0;
|
||||
if (nu->type == CU_BEZIER) {
|
||||
bezt = nu->bezt;
|
||||
|
@ -3462,7 +3408,6 @@ static void subdividenurb(Object *obedit, View3D *v3d, int number_cuts)
|
|||
{
|
||||
Curve *cu = obedit->data;
|
||||
EditNurb *editnurb = cu->editnurb;
|
||||
Nurb *nu;
|
||||
BezTriple *bezt, *beztnew, *beztn;
|
||||
BPoint *bp, *prevbp, *bpnew, *bpn;
|
||||
float vec[15];
|
||||
|
@ -3471,7 +3416,7 @@ static void subdividenurb(Object *obedit, View3D *v3d, int number_cuts)
|
|||
|
||||
// printf("*** subdivideNurb: entering subdivide\n");
|
||||
|
||||
for (nu = editnurb->nurbs.first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, &editnurb->nurbs) {
|
||||
amount = 0;
|
||||
if (nu->type == CU_BEZIER) {
|
||||
BezTriple *nextbezt;
|
||||
|
@ -3925,7 +3870,6 @@ static int set_spline_type_exec(bContext *C, wmOperator *op)
|
|||
Main *bmain = CTX_data_main(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu;
|
||||
bool changed = false;
|
||||
bool changed_size = false;
|
||||
const bool use_handles = RNA_boolean_get(op->ptr, "use_handles");
|
||||
|
@ -3936,7 +3880,7 @@ static int set_spline_type_exec(bContext *C, wmOperator *op)
|
|||
continue;
|
||||
}
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (ED_curve_nurb_select_check(v3d, nu)) {
|
||||
const int pntsu_prev = nu->pntsu;
|
||||
const char *err_msg = NULL;
|
||||
|
@ -4225,12 +4169,11 @@ static void make_selection_list_nurb(View3D *v3d, ListBase *editnurb, ListBase *
|
|||
{
|
||||
ListBase nbase = {NULL, NULL};
|
||||
NurbSort *nus, *nustest, *headdo, *taildo;
|
||||
Nurb *nu;
|
||||
BPoint *bp;
|
||||
float dist, headdist, taildist;
|
||||
int a;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (ED_curve_nurb_select_check(v3d, nu)) {
|
||||
|
||||
nus = (NurbSort *)MEM_callocN(sizeof(NurbSort), "sort");
|
||||
|
@ -4996,7 +4939,6 @@ bool ed_editnurb_spin(
|
|||
{
|
||||
Curve *cu = (Curve *)obedit->data;
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu;
|
||||
float cmat[3][3], tmat[3][3], imat[3][3];
|
||||
float bmat[3][3], rotmat[3][3], scalemat1[3][3], scalemat2[3][3];
|
||||
float persmat[3][3], persinv[3][3];
|
||||
|
@ -5056,7 +4998,7 @@ bool ed_editnurb_spin(
|
|||
}
|
||||
|
||||
if (ok) {
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (ED_curve_nurb_select_check(v3d, nu)) {
|
||||
nu->orderv = 4;
|
||||
nu->flagv |= CU_NURB_CYCLIC;
|
||||
|
@ -5427,8 +5369,6 @@ static int ed_editcurve_addvert(Curve *cu,
|
|||
View3D *v3d,
|
||||
const float location_init[3])
|
||||
{
|
||||
Nurb *nu;
|
||||
|
||||
float center[3];
|
||||
float temp[3];
|
||||
uint verts_len;
|
||||
|
@ -5437,7 +5377,7 @@ static int ed_editcurve_addvert(Curve *cu,
|
|||
zero_v3(center);
|
||||
verts_len = 0;
|
||||
|
||||
for (nu = editnurb->nurbs.first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, &editnurb->nurbs) {
|
||||
int i;
|
||||
if (nu->type == CU_BEZIER) {
|
||||
BezTriple *bezt;
|
||||
|
@ -5472,7 +5412,7 @@ static int ed_editcurve_addvert(Curve *cu,
|
|||
ofs[2] = 0.0f;
|
||||
}
|
||||
|
||||
for (nu = editnurb->nurbs.first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, &editnurb->nurbs) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
BezTriple *bezt;
|
||||
for (i = 0, bezt = nu->bezt; i < nu->pntsu; i++, bezt++) {
|
||||
|
@ -5511,7 +5451,7 @@ static int ed_editcurve_addvert(Curve *cu,
|
|||
}
|
||||
|
||||
/* nothing selected: create a new curve */
|
||||
nu = BKE_curve_nurb_active_get(cu);
|
||||
Nurb *nu = BKE_curve_nurb_active_get(cu);
|
||||
|
||||
if (!nu || nu->type == CU_BEZIER) {
|
||||
Nurb *nurb_new;
|
||||
|
@ -5764,8 +5704,7 @@ static int curve_extrude_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
|
||||
/* First test: curve? */
|
||||
if (obedit->type != OB_CURVE) {
|
||||
Nurb *nu;
|
||||
for (nu = editnurb->nurbs.first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, &editnurb->nurbs) {
|
||||
if ((nu->pntsv == 1) && (ED_curve_nurb_select_count(v3d, nu) == 1)) {
|
||||
as_curve = true;
|
||||
break;
|
||||
|
@ -5819,13 +5758,12 @@ void CURVE_OT_extrude(wmOperatorType *ot)
|
|||
|
||||
static bool curve_toggle_cyclic(View3D *v3d, ListBase *editnurb, int direction)
|
||||
{
|
||||
Nurb *nu;
|
||||
BezTriple *bezt;
|
||||
BPoint *bp;
|
||||
int a;
|
||||
bool changed = false;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->pntsu > 1 || nu->pntsv > 1) {
|
||||
if (nu->type == CU_POLY) {
|
||||
a = nu->pntsu;
|
||||
|
@ -5932,10 +5870,9 @@ static int toggle_cyclic_invoke(bContext *C, wmOperator *op, const wmEvent *UNUS
|
|||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
uiPopupMenu *pup;
|
||||
uiLayout *layout;
|
||||
Nurb *nu;
|
||||
|
||||
if (obedit->type == OB_SURF) {
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->pntsu > 1 || nu->pntsv > 1) {
|
||||
if (nu->type == CU_NURBS) {
|
||||
pup = UI_popup_menu_begin(C, IFACE_("Direction"), ICON_NONE);
|
||||
|
@ -6064,12 +6001,12 @@ static bool curve_delete_segments(Object *obedit, View3D *v3d, const bool split)
|
|||
Curve *cu = obedit->data;
|
||||
EditNurb *editnurb = cu->editnurb;
|
||||
ListBase *nubase = &editnurb->nurbs, newnurb = {NULL, NULL};
|
||||
Nurb *nu, *nu1;
|
||||
Nurb *nu1;
|
||||
BezTriple *bezt, *bezt1, *bezt2;
|
||||
BPoint *bp, *bp1, *bp2;
|
||||
int a, b, starta, enda, cut, cyclicut;
|
||||
|
||||
for (nu = nubase->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, nubase) {
|
||||
nu1 = NULL;
|
||||
starta = enda = cut = -1;
|
||||
cyclicut = 0;
|
||||
|
@ -6452,7 +6389,7 @@ static bool curve_delete_segments(Object *obedit, View3D *v3d, const bool split)
|
|||
}
|
||||
}
|
||||
|
||||
for (nu = newnurb.first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, &newnurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
if (split) {
|
||||
/* deselect for split operator */
|
||||
|
@ -6620,9 +6557,8 @@ static int curve_dissolve_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
}
|
||||
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if ((nu->type == CU_BEZIER) && (nu->pntsu > 2)) {
|
||||
uint span_step[2] = {nu->pntsu, nu->pntsu};
|
||||
uint span_len;
|
||||
|
@ -6766,9 +6702,8 @@ static int curve_decimate_exec(bContext *C, wmOperator *op)
|
|||
|
||||
{
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
if ((nu->pntsu > 2) && nurb_bezt_flag_any(nu, SELECT)) {
|
||||
const int error_target_len = max_ii(2, nu->pntsu * ratio);
|
||||
|
@ -6917,7 +6852,6 @@ int ED_curve_join_objects_exec(bContext *C, wmOperator *op)
|
|||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob_active = CTX_data_active_object(C);
|
||||
Curve *cu;
|
||||
Nurb *nu, *newnu;
|
||||
BezTriple *bezt;
|
||||
BPoint *bp;
|
||||
ListBase tempbase;
|
||||
|
@ -6955,9 +6889,8 @@ int ED_curve_join_objects_exec(bContext *C, wmOperator *op)
|
|||
/* watch it: switch order here really goes wrong */
|
||||
mul_m4_m4m4(cmat, imat, ob_iter->obmat);
|
||||
|
||||
nu = cu->nurb.first;
|
||||
while (nu) {
|
||||
newnu = BKE_nurb_duplicate(nu);
|
||||
LISTBASE_FOREACH (Nurb *, nu, &cu->nurb) {
|
||||
Nurb *newnu = BKE_nurb_duplicate(nu);
|
||||
if (ob_active->totcol) { /* TODO, merge material lists */
|
||||
CLAMP(newnu->mat_nr, 0, ob_active->totcol - 1);
|
||||
}
|
||||
|
@ -6983,7 +6916,6 @@ int ED_curve_join_objects_exec(bContext *C, wmOperator *op)
|
|||
bp++;
|
||||
}
|
||||
}
|
||||
nu = nu->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7035,12 +6967,11 @@ static int clear_tilt_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
}
|
||||
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
Nurb *nu;
|
||||
BezTriple *bezt;
|
||||
BPoint *bp;
|
||||
int a;
|
||||
|
||||
for (nu = editnurb->first; nu; nu = nu->next) {
|
||||
LISTBASE_FOREACH (Nurb *, nu, editnurb) {
|
||||
if (nu->bezt) {
|
||||
bezt = nu->bezt;
|
||||
a = nu->pntsu;
|
||||
|
|
Loading…
Reference in New Issue