when cyclic is enabled the knots would always be generated with uniform nurbs but after, cyclic nurbs would be incorrect if the bezier or endpoint u/v was set.

also replaced some numbers with constants.
This commit is contained in:
Campbell Barton 2008-05-26 12:50:00 +00:00
parent 0a90a52442
commit 3b4873250e
7 changed files with 95 additions and 81 deletions

@ -39,8 +39,8 @@ struct ListBase;
struct BezTriple;
struct BevList;
#define KNOTSU(nu) ( (nu)->orderu+ (nu)->pntsu+ (nu->orderu-1)*((nu)->flagu & 1) )
#define KNOTSV(nu) ( (nu)->orderv+ (nu)->pntsv+ (nu->orderv-1)*((nu)->flagv & 1) )
#define KNOTSU(nu) ( (nu)->orderu+ (nu)->pntsu+ (nu->orderu-1)*((nu)->flagu & CU_CYCLIC) )
#define KNOTSV(nu) ( (nu)->orderv+ (nu)->pntsv+ (nu->orderv-1)*((nu)->flagv & CU_CYCLIC) )
void unlink_curve( struct Curve *cu);

@ -533,6 +533,7 @@ static void makecyclicknots(float *knots, short pnts, short order)
int a, b, order2, c;
if(knots==0) return;
order2=order-1;
/* do first long rows (order -1), remove identical knots at endpoints */
@ -553,26 +554,35 @@ static void makecyclicknots(float *knots, short pnts, short order)
}
void makeknots(Nurb *nu, short uv, short type) /* 0: uniform, 1: endpoints, 2: bezier */
/* type - 0: uniform, 1: endpoints, 2: bezier, note, cyclic nurbs are always uniform */
void makeknots(Nurb *nu, short uv, short type)
{
if( (nu->type & 7)==CU_NURBS ) {
if(uv & 1) {
if(uv == 1) {
if(nu->knotsu) MEM_freeN(nu->knotsu);
if(check_valid_nurb_u(nu)) {
nu->knotsu= MEM_callocN(4+sizeof(float)*KNOTSU(nu), "makeknots");
if(nu->flagu & CU_CYCLIC) {
calcknots(nu->knotsu, nu->pntsu, nu->orderu, 0); /* cyclic should be uniform */
makecyclicknots(nu->knotsu, nu->pntsu, nu->orderu);
} else {
calcknots(nu->knotsu, nu->pntsu, nu->orderu, type);
if(nu->flagu & 1) makecyclicknots(nu->knotsu, nu->pntsu, nu->orderu);
}
else nu->knotsu= 0;
}
if(uv & 2) {
else nu->knotsu= NULL;
} else if(uv == 2) {
if(nu->knotsv) MEM_freeN(nu->knotsv);
if(check_valid_nurb_v(nu)) {
nu->knotsv= MEM_callocN(4+sizeof(float)*KNOTSV(nu), "makeknots");
if(nu->flagv & CU_CYCLIC) {
calcknots(nu->knotsv, nu->pntsv, nu->orderv, 0); /* cyclic should be uniform */
makecyclicknots(nu->knotsv, nu->pntsv, nu->orderv);
} else {
calcknots(nu->knotsv, nu->pntsv, nu->orderv, type);
if(nu->flagv & 1) makecyclicknots(nu->knotsv, nu->pntsv, nu->orderv);
}
else nu->knotsv= 0;
}
else nu->knotsv= NULL;
}
}
}
@ -683,24 +693,24 @@ void makeNurbfaces(Nurb *nu, float *data, int rowstride)
fp= nu->knotsu;
ustart= fp[nu->orderu-1];
if(nu->flagu & 1) uend= fp[nu->pntsu+nu->orderu-1];
if(nu->flagu & CU_CYCLIC) uend= fp[nu->pntsu+nu->orderu-1];
else uend= fp[nu->pntsu];
ustep= (uend-ustart)/(resolu-1+(nu->flagu & 1));
ustep= (uend-ustart)/(resolu-1+(nu->flagu & CU_CYCLIC));
basisu= (float *)MEM_mallocN(sizeof(float)*KNOTSU(nu), "makeNurbfaces3");
fp= nu->knotsv;
vstart= fp[nu->orderv-1];
if(nu->flagv & 1) vend= fp[nu->pntsv+nu->orderv-1];
if(nu->flagv & CU_CYCLIC) vend= fp[nu->pntsv+nu->orderv-1];
else vend= fp[nu->pntsv];
vstep= (vend-vstart)/(resolv-1+(nu->flagv & 1));
vstep= (vend-vstart)/(resolv-1+(nu->flagv & CU_CYCLIC));
len= KNOTSV(nu);
basisv= (float *)MEM_mallocN(sizeof(float)*len*resolv, "makeNurbfaces3");
jstart= (int *)MEM_mallocN(sizeof(float)*resolv, "makeNurbfaces4");
jend= (int *)MEM_mallocN(sizeof(float)*resolv, "makeNurbfaces5");
/* precalculation of basisv and jstart,jend */
if(nu->flagv & 1) cycl= nu->orderv-1;
if(nu->flagv & CU_CYCLIC) cycl= nu->orderv-1;
else cycl= 0;
v= vstart;
basis= basisv;
@ -710,7 +720,7 @@ void makeNurbfaces(Nurb *nu, float *data, int rowstride)
v+= vstep;
}
if(nu->flagu & 1) cycl= nu->orderu-1;
if(nu->flagu & CU_CYCLIC) cycl= nu->orderu-1;
else cycl= 0;
in= data;
u= ustart;
@ -824,12 +834,12 @@ void makeNurbcurve(Nurb *nu, float *data, int resolu, int dim)
fp= nu->knotsu;
ustart= fp[nu->orderu-1];
if(nu->flagu & 1) uend= fp[nu->pntsu+nu->orderu-1];
if(nu->flagu & CU_CYCLIC) uend= fp[nu->pntsu+nu->orderu-1];
else uend= fp[nu->pntsu];
ustep= (uend-ustart)/(resolu-1+(nu->flagu & 1));
ustep= (uend-ustart)/(resolu-1+(nu->flagu & CU_CYCLIC));
basisu= (float *)MEM_mallocN(sizeof(float)*KNOTSU(nu), "makeNurbcurve3");
if(nu->flagu & 1) cycl= nu->orderu-1;
if(nu->flagu & CU_CYCLIC) cycl= nu->orderu-1;
else cycl= 0;
in= data;
@ -1429,14 +1439,14 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *
/* returns a point */
if(prevbezt==nu->bezt) {
if(nu->flagu & 1) pprev= last;
if(nu->flagu & CU_CYCLIC) pprev= last;
else pprev= prevbezt;
}
else pprev= prevbezt-1;
/* next point */
if(bezt==last) {
if(nu->flagu & 1) next= nu->bezt;
if(nu->flagu & CU_CYCLIC) next= nu->bezt;
else next= bezt;
}
else next= bezt+1;
@ -1497,7 +1507,7 @@ void makeBevelList(Object *ob)
bl= MEM_callocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelList");
BLI_addtail(&(cu->bev), bl);
if(nu->flagu & 1) bl->poly= 0;
if(nu->flagu & CU_CYCLIC) bl->poly= 0;
else bl->poly= -1;
bl->nr= len;
bl->flag= 0;
@ -1516,17 +1526,17 @@ void makeBevelList(Object *ob)
}
else if((nu->type & 7)==CU_BEZIER) {
len= resolu*(nu->pntsu+ (nu->flagu & 1) -1)+1; /* in case last point is not cyclic */
len= resolu*(nu->pntsu+ (nu->flagu & CU_CYCLIC) -1)+1; /* in case last point is not cyclic */
bl= MEM_callocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelList");
BLI_addtail(&(cu->bev), bl);
if(nu->flagu & 1) bl->poly= 0;
if(nu->flagu & CU_CYCLIC) bl->poly= 0;
else bl->poly= -1;
bevp= (BevPoint *)(bl+1);
a= nu->pntsu-1;
bezt= nu->bezt;
if(nu->flagu & 1) {
if(nu->flagu & CU_CYCLIC) {
a++;
prevbezt= nu->bezt+(nu->pntsu-1);
}
@ -1599,7 +1609,7 @@ void makeBevelList(Object *ob)
MEM_freeN(data);
MEM_freeN(data_a);
if((nu->flagu & 1)==0) { /* not cyclic: endpoint */
if((nu->flagu & CU_CYCLIC)==0) { /* not cyclic: endpoint */
bevp->x= prevbezt->vec[1][0];
bevp->y= prevbezt->vec[1][1];
bevp->z= prevbezt->vec[1][2];
@ -1615,7 +1625,7 @@ void makeBevelList(Object *ob)
BLI_addtail(&(cu->bev), bl);
bl->nr= len;
bl->flag= 0;
if(nu->flagu & 1) bl->poly= 0;
if(nu->flagu & CU_CYCLIC) bl->poly= 0;
else bl->poly= -1;
bevp= (BevPoint *)(bl+1);
@ -2213,7 +2223,7 @@ void calchandlesNurb(Nurb *nu) /* first, if needed, set handle flags */
a= nu->pntsu;
bezt= nu->bezt;
if(nu->flagu & 1) prev= bezt+(a-1);
if(nu->flagu & CU_CYCLIC) prev= bezt+(a-1);
else prev= 0;
next= bezt+1;
@ -2221,7 +2231,7 @@ void calchandlesNurb(Nurb *nu) /* first, if needed, set handle flags */
calchandleNurb(bezt, prev, next, 0);
prev= bezt;
if(a==1) {
if(nu->flagu & 1) next= nu->bezt;
if(nu->flagu & CU_CYCLIC) next= nu->bezt;
else next= 0;
}
else next++;
@ -2620,7 +2630,7 @@ int check_valid_nurb_u( struct Nurb *nu )
if ((nu->type & 7)!=CU_NURBS) return 1; /* not a nurb, lets assume its valid */
if (nu->pntsu < nu->orderu) return 0;
if ((nu->flagu>>1) & 2) { /* Bezier U Endpoints */
if (((nu->flag & CU_CYCLIC)==0) && ((nu->flagu>>1) & 2)) { /* Bezier U Endpoints */
if (nu->orderu==4) {
if (nu->pntsu < 5) return 0; /* bezier with 4 orderu needs 5 points */
} else if (nu->orderu != 3) return 0; /* order must be 3 or 4 */
@ -2634,7 +2644,7 @@ int check_valid_nurb_v( struct Nurb *nu)
if ((nu->type & 7)!=CU_NURBS) return 1; /* not a nurb, lets assume its valid */
if (nu->pntsv < nu->orderv) return 0;
if ((nu->flagv>>1) & 2) { /* Bezier V Endpoints */
if (((nu->flag & CU_CYCLIC)==0) && ((nu->flagv>>1) & 2)) { /* Bezier V Endpoints */
if (nu->orderv==4) {
if (nu->pntsv < 5) return 0; /* bezier with 4 orderu needs 5 points */
} else if (nu->orderv != 3) return 0; /* order must be 3 or 4 */
@ -2649,7 +2659,7 @@ int clamp_nurb_order_u( struct Nurb *nu )
nu->orderu= nu->pntsu;
change= 1;
}
if((nu->flagu>>1)&2) {
if(((nu->flag & CU_CYCLIC)==0) && (nu->flagu>>1)&2) {
CLAMP(nu->orderu, 3,4);
change= 1;
}
@ -2663,7 +2673,7 @@ int clamp_nurb_order_v( struct Nurb *nu)
nu->orderv= nu->pntsv;
change= 1;
}
if((nu->flagv>>1)&2) {
if(((nu->flag & CU_CYCLIC)==0) && (nu->flagv>>1)&2) {
CLAMP(nu->orderv, 3,4);
change= 1;
}

@ -816,7 +816,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
data= dl->verts;
if(nu->flagu & 1) {
if(nu->flagu & CU_CYCLIC) {
dl->type= DL_POLY;
a= nu->pntsu;
}
@ -863,7 +863,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
dl->charidx = nu->charidx;
data= dl->verts;
if(nu->flagu & 1) dl->type= DL_POLY;
if(nu->flagu & CU_CYCLIC) dl->type= DL_POLY;
else dl->type= DL_SEGM;
makeNurbcurve(nu, data, resolu, 3);
}
@ -878,7 +878,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
dl->charidx = nu->charidx;
data= dl->verts;
if(nu->flagu & 1) dl->type= DL_POLY;
if(nu->flagu & CU_CYCLIC) dl->type= DL_POLY;
else dl->type= DL_SEGM;
a= len;
@ -1330,7 +1330,7 @@ void makeDispListSurf(Object *ob, ListBase *dispbase, int forRender)
dl->rt= nu->flag;
data= dl->verts;
if(nu->flagu & 1) dl->type= DL_POLY;
if(nu->flagu & CU_CYCLIC) dl->type= DL_POLY;
else dl->type= DL_SEGM;
makeNurbcurve(nu, data, nu->resolu, 3);

@ -150,7 +150,7 @@ void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vfd)
nu->type= CU_BEZIER+CU_2D;
nu->pntsu = onpoints[j];
nu->resolu= 8;
nu->flagu= 1;
nu->flagu= CU_CYCLIC;
nu->bezt = bezt;
//individual curve loop, start-end

@ -2017,7 +2017,7 @@ static VFontData *objfnt_to_vfontdata(objfnt *fnt)
nu->type= CU_BEZIER+CU_2D;
nu->pntsu = count;
nu->resolu= 8;
nu->flagu= 1;
nu->flagu= CU_CYCLIC;
nu->bezt = bezt;
stop = 0;

@ -3104,14 +3104,14 @@ void do_curvebuts(unsigned short event)
if(isNurbsel(nu)) {
if((nu->type & 7)==CU_NURBS) {
if(event<B_UNIFV) {
nu->flagu &= 1;
nu->flagu += ((event-B_UNIFU)<<1);
nu->flagu &= CU_CYCLIC; /* disable all flags except for CU_CYCLIC */
nu->flagu |= ((event-B_UNIFU)<<1);
clamp_nurb_order_u(nu);
makeknots(nu, 1, nu->flagu>>1);
}
else if(nu->pntsv>1) {
nu->flagv &= 1;
nu->flagv += ((event-B_UNIFV)<<1);
nu->flagv &= CU_CYCLIC; /* disable all flags except for CU_CYCLIC */
nu->flagv |= ((event-B_UNIFV)<<1);
clamp_nurb_order_v(nu);
makeknots(nu, 2, nu->flagv>>1);
}

@ -906,8 +906,10 @@ void adduplicateflagNurb(short flag)
bezt1++;
}
if(nu->flagu & 1) {
if(starta!=0 || enda!=nu->pntsu-1) newnu->flagu--;
if(nu->flagu & CU_CYCLIC) {
if(starta!=0 || enda!=nu->pntsu-1) {
newnu->flagu &= ~CU_CYCLIC;
}
}
}
bezt++;
@ -941,8 +943,10 @@ void adduplicateflagNurb(short flag)
bp1++;
}
if(nu->flagu & 1) {
if(starta!=0 || enda!=nu->pntsu-1) newnu->flagu--;
if(nu->flagu & CU_CYCLIC) {
if(starta!=0 || enda!=nu->pntsu-1) {
newnu->flagu &= ~CU_CYCLIC;
}
}
/* knots */
@ -1583,7 +1587,7 @@ void subdivideNurb()
newly created. Old points are discarded.
*/
/* count */
if(nu->flagu & 1) {
if(nu->flagu & CU_CYCLIC) {
a= nu->pntsu;
bezt= nu->bezt;
prevbezt= bezt+(a-1);
@ -1604,7 +1608,7 @@ void subdivideNurb()
beztnew =
(BezTriple*)MEM_mallocN((amount + nu->pntsu) * sizeof(BezTriple), "subdivNurb");
beztn= beztnew;
if(nu->flagu & 1) {
if(nu->flagu & CU_CYCLIC) {
a= nu->pntsu;
bezt= nu->bezt;
prevbezt= bezt+(a-1);
@ -1636,7 +1640,7 @@ void subdivideNurb()
VecMidf(beztn->vec[1], vec+9, vec+12);
VECCOPY(beztn->vec[2], vec+12);
/* handle of next bezt */
if(a==0 && (nu->flagu & 1)) {VECCOPY(beztnew->vec[0], vec+6);}
if(a==0 && (nu->flagu & CU_CYCLIC)) {VECCOPY(beztnew->vec[0], vec+6);}
else {VECCOPY(bezt->vec[0], vec+6);}
beztn->radius = (prevbezt->radius + bezt->radius)/2.0f;
@ -1649,7 +1653,7 @@ void subdivideNurb()
bezt++;
}
/* last point */
if((nu->flagu & 1)==0) memcpy(beztn, prevbezt, sizeof(BezTriple));
if((nu->flagu & CU_CYCLIC)==0) memcpy(beztn, prevbezt, sizeof(BezTriple));
MEM_freeN(nu->bezt);
nu->bezt= beztnew;
@ -1666,7 +1670,7 @@ void subdivideNurb()
stable... nzc 30-5-'00
*/
/* count */
if(nu->flagu & 1) {
if(nu->flagu & CU_CYCLIC) {
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
prevbp= bp+(a-1);
@ -1688,7 +1692,7 @@ void subdivideNurb()
(BPoint*)MEM_mallocN((amount + nu->pntsu) * sizeof(BPoint), "subdivNurb2");
bpn= bpnew;
if(nu->flagu & 1) {
if(nu->flagu & CU_CYCLIC) {
a= nu->pntsu;
bp= nu->bp;
prevbp= bp+(a-1);
@ -1715,7 +1719,7 @@ void subdivideNurb()
prevbp= bp;
bp++;
}
if((nu->flagu & 1)==0) memcpy(bpn, prevbp, sizeof(BPoint)); /* last point */
if((nu->flagu & CU_CYCLIC)==0) memcpy(bpn, prevbp, sizeof(BPoint)); /* last point */
MEM_freeN(nu->bp);
nu->bp= bpnew;
@ -2089,7 +2093,7 @@ int convertspline(short type, Nurb *nu)
nu->type &= ~7;
nu->type+= 4;
nu->orderu= 4;
nu->flagu &= 1;
nu->flagu &= CU_CYCLIC; /* disable all flags except for cyclic */
nu->flagu += 4;
makeknots(nu, 1, nu->flagu>>1);
a= nu->pntsu*nu->pntsv;
@ -2140,10 +2144,10 @@ int convertspline(short type, Nurb *nu)
nu->orderv= 1;
nu->type &= ~7;
nu->type+= type;
if(nu->flagu & 1) c= nu->orderu-1;
if(nu->flagu & CU_CYCLIC) c= nu->orderu-1;
else c= 0;
if(type== 4) {
nu->flagu &= 1;
nu->flagu &= CU_CYCLIC; /* disable all flags except for cyclic */
nu->flagu += 4;
makeknots(nu, 1, nu->flagu>>1);
}
@ -2541,7 +2545,7 @@ void addsegment_nurb()
/* find both nurbs and points, nu1 will be put behind nu2 */
for(nu= editNurb.first; nu; nu= nu->next) {
if((nu->flagu & 1)==0) { /* not cyclic */
if((nu->flagu & CU_CYCLIC)==0) { /* not cyclic */
if( (nu->type & 7)==CU_BEZIER ) {
bezt= nu->bezt;
if(nu1==0) {
@ -2822,7 +2826,7 @@ static void spin_nurb(float *dvec, short mode)
for(nu= editNurb.first; nu; nu= nu->next) {
if(isNurbsel(nu)) {
nu->orderv= 4;
nu->flagv |= 1;
nu->flagv |= CU_CYCLIC;
makeknots(nu, 2, nu->flagv>>1);
}
}
@ -3020,8 +3024,8 @@ void makecyclicNurb()
bp= nu->bp;
while(a--) {
if( bp->f1 & SELECT ) {
if(nu->flagu & CU_CYCLIC) nu->flagu--;
else nu->flagu++;
if(nu->flagu & CU_CYCLIC) nu->flagu &= ~CU_CYCLIC;
else nu->flagu |= CU_CYCLIC;
break;
}
bp++;
@ -3032,8 +3036,8 @@ void makecyclicNurb()
bezt= nu->bezt;
while(a--) {
if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
if(nu->flagu & CU_CYCLIC) nu->flagu--;
else nu->flagu++;
if(nu->flagu & CU_CYCLIC) nu->flagu &= ~CU_CYCLIC;
else nu->flagu |= CU_CYCLIC;
break;
}
bezt++;
@ -3046,9 +3050,9 @@ void makecyclicNurb()
bp= nu->bp;
while(a--) {
if( bp->f1 & SELECT ) {
if(nu->flagu & CU_CYCLIC) nu->flagu--;
if(nu->flagu & CU_CYCLIC) nu->flagu &= ~CU_CYCLIC;
else {
nu->flagu++;
nu->flagu |= CU_CYCLIC;
nu->flagu &= ~2; /* endpoint flag, fixme */
fp= MEM_mallocN(sizeof(float)*KNOTSU(nu), "makecyclicN");
b= (nu->orderu+nu->pntsu);
@ -3076,9 +3080,9 @@ void makecyclicNurb()
if( bp->f1 & SELECT) {
if(cyclmode==1 && nu->pntsu>1) {
if(nu->flagu & CU_CYCLIC) nu->flagu--;
if(nu->flagu & CU_CYCLIC) nu->flagu &= ~CU_CYCLIC;
else {
nu->flagu++;
nu->flagu |= CU_CYCLIC;
if (check_valid_nurb_u(nu)) {
fp= MEM_mallocN(sizeof(float)*KNOTSU(nu), "makecyclicN");
b= (nu->orderu+nu->pntsu);
@ -3765,10 +3769,10 @@ void delNurb()
bezt2= bezt+1;
if( (bezt2->f1 & SELECT) || (bezt2->f2 & SELECT) || (bezt2->f3 & SELECT) ) ;
else { /* maybe do not make cyclic */
if(a==0 && (nu->flagu & 1) ) {
if(a==0 && (nu->flagu & CU_CYCLIC) ) {
bezt2= bezt+(nu->pntsu-1);
if( (bezt2->f1 & SELECT) || (bezt2->f2 & SELECT) || (bezt2->f3 & SELECT) ) {
nu->flagu--;
nu->flagu &= ~CU_CYCLIC;
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSEDIT, 0);
@ -3792,10 +3796,10 @@ void delNurb()
bp2= bp+1;
if( bp2->f1 & 1 ) ;
else { /* maybe do not make cyclic */
if(a==0 && (nu->flagu & 1) ) {
if(a==0 && (nu->flagu & CU_CYCLIC) ) {
bp2= bp+(nu->pntsu-1);
if( bp2->f1 & 1 ) {
nu->flagu--;
if( bp2->f1 & SELECT ) {
nu->flagu &= ~CU_CYCLIC;
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSEDIT, 0);
@ -3821,14 +3825,14 @@ void delNurb()
BLI_remlink(&editNurb, nu);
freeNurb(nu); nu = NULL;
}
else if(nu1->flagu & 1) { /* cyclic */
else if(nu1->flagu & CU_CYCLIC) { /* cyclic */
bezt =
(BezTriple*)MEM_mallocN((cut+1) * sizeof(BezTriple), "delNurb1");
memcpy(bezt, nu1->bezt,(cut+1)*sizeof(BezTriple));
a= nu1->pntsu-cut-1;
memcpy(nu1->bezt, bezt2, a*sizeof(BezTriple));
memcpy(nu1->bezt+a, bezt, (cut+1)*sizeof(BezTriple));
nu1->flagu--;
nu1->flagu &= ~CU_CYCLIC;
MEM_freeN(bezt);
calchandlesNurb(nu);
}
@ -3863,14 +3867,14 @@ void delNurb()
BLI_remlink(&editNurb, nu);
freeNurb(nu); nu= NULL;
}
else if(nu1->flagu & 1) { /* cyclic */
else if(nu1->flagu & CU_CYCLIC) { /* cyclic */
bp =
(BPoint*)MEM_mallocN((cut+1) * sizeof(BPoint), "delNurb5");
memcpy(bp, nu1->bp,(cut+1)*sizeof(BPoint));
a= nu1->pntsu-cut-1;
memcpy(nu1->bp, bp2, a*sizeof(BPoint));
memcpy(nu1->bp+a, bp, (cut+1)*sizeof(BPoint));
nu1->flagu--;
nu1->flagu &= ~CU_CYCLIC;
MEM_freeN(bp);
}
else { /* add new curve */
@ -4180,7 +4184,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
if((type & 7)==CU_BEZIER) {
nu->pntsu= 4;
nu->bezt= callocstructN(BezTriple, 4, "addNurbprim1");
nu->flagu= 1;
nu->flagu= CU_CYCLIC;
bezt= nu->bezt;
for(a=0;a<3;a++) {
@ -4229,7 +4233,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
nu->pntsv= 1;
nu->orderu= 4;
nu->bp= callocstructN(BPoint, 8, "addNurbprim6");
nu->flagu= 1;
nu->flagu= CU_CYCLIC;
bp= nu->bp;
for(a=0; a<8; a++) {