bugfix, curve radius would display incorrectly when there were single point's before a curve. now allow the bevel list to have zero point BevList's to keep in sync with curve->nurb as was expected in a few places.

This commit is contained in:
2007-12-03 22:42:48 +00:00
parent ccc82beb64
commit a2d6623689
5 changed files with 110 additions and 99 deletions

View File

@@ -105,7 +105,7 @@ void calc_curvepath(Object *ob)
cu->path= NULL;
bl= cu->bev.first;
if(bl==NULL) return;
if(bl==NULL || !bl->nr) return;
cu->path=path= MEM_callocN(sizeof(Path), "path");
@@ -227,6 +227,7 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK
/* test for cyclic */
bl= cu->bev.first;
if (!bl->nr) return 0;
if(bl && bl->poly> -1) cycl= 1;
ctime *= (path->len-1);

View File

@@ -1479,7 +1479,11 @@ void makeBevelList(Object *ob)
else nu= cu->nurb.first;
while(nu) {
if(nu->pntsu>1) {
if(nu->pntsu<=1) {
bl= MEM_callocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelList");
BLI_addtail(&(cu->bev), bl);
bl->nr= 0;
} else {
if(G.rendering && cu->resolu_ren!=0)
resolu= cu->resolu_ren;
else
@@ -1637,28 +1641,30 @@ void makeBevelList(Object *ob)
/* STEP 2: DOUBLE POINTS AND AUTOMATIC RESOLUTION, REDUCE DATABLOCKS */
bl= cu->bev.first;
while(bl) {
nr= bl->nr;
bevp1= (BevPoint *)(bl+1);
bevp0= bevp1+(nr-1);
nr--;
while(nr--) {
if( fabs(bevp0->x-bevp1->x)<0.00001 ) {
if( fabs(bevp0->y-bevp1->y)<0.00001 ) {
if( fabs(bevp0->z-bevp1->z)<0.00001 ) {
bevp0->f2= SELECT;
bl->flag++;
if (bl->nr) { /* null bevel items come from single points */
nr= bl->nr;
bevp1= (BevPoint *)(bl+1);
bevp0= bevp1+(nr-1);
nr--;
while(nr--) {
if( fabs(bevp0->x-bevp1->x)<0.00001 ) {
if( fabs(bevp0->y-bevp1->y)<0.00001 ) {
if( fabs(bevp0->z-bevp1->z)<0.00001 ) {
bevp0->f2= SELECT;
bl->flag++;
}
}
}
bevp0= bevp1;
bevp1++;
}
bevp0= bevp1;
bevp1++;
}
bl= bl->next;
}
bl= cu->bev.first;
while(bl) {
blnext= bl->next;
if(bl->flag) {
if(bl->nr && bl->flag) {
nr= bl->nr- bl->flag+1; /* +1 because vectorbezier sets flag too */
blnew= MEM_mallocN(sizeof(BevList)+nr*sizeof(BevPoint), "makeBevelList");
memcpy(blnew, bl, sizeof(BevList));
@@ -1686,7 +1692,7 @@ void makeBevelList(Object *ob)
bl= cu->bev.first;
poly= 0;
while(bl) {
if(bl->poly>=0) {
if(bl->nr && bl->poly>=0) {
poly++;
bl->poly= poly;
bl->gat= 0; /* 'gat' is dutch for hole */

View File

@@ -1426,99 +1426,102 @@ void makeDispListCurveTypes(Object *ob, int forOrco)
BevPoint *bevp;
int a,b;
/* exception handling; curve without bevel or extrude, with width correction */
if(dlbev.first==NULL) {
dl= MEM_callocN(sizeof(DispList), "makeDispListbev");
dl->verts= MEM_callocN(3*sizeof(float)*bl->nr, "dlverts");
BLI_addtail(dispbase, dl);
if (bl->nr) { /* blank bevel lists can happen */
if(bl->poly!= -1) dl->type= DL_POLY;
else dl->type= DL_SEGM;
if(dl->type==DL_SEGM) dl->flag = (DL_FRONT_CURVE|DL_BACK_CURVE);
dl->parts= 1;
dl->nr= bl->nr;
dl->col= nu->mat_nr;
dl->charidx= nu->charidx;
dl->rt= nu->flag;
a= dl->nr;
bevp= (BevPoint *)(bl+1);
data= dl->verts;
while(a--) {
data[0]= bevp->x+widfac*bevp->sina;
data[1]= bevp->y+widfac*bevp->cosa;
data[2]= bevp->z;
bevp++;
data+=3;
}
}
else {
DispList *dlb;
for (dlb=dlbev.first; dlb; dlb=dlb->next) {
/* for each part of the bevel use a separate displblock */
dl= MEM_callocN(sizeof(DispList), "makeDispListbev1");
dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr*bl->nr, "dlverts");
/* exception handling; curve without bevel or extrude, with width correction */
if(dlbev.first==NULL) {
dl= MEM_callocN(sizeof(DispList), "makeDispListbev");
dl->verts= MEM_callocN(3*sizeof(float)*bl->nr, "dlverts");
BLI_addtail(dispbase, dl);
dl->type= DL_SURF;
dl->flag= dlb->flag & (DL_FRONT_CURVE|DL_BACK_CURVE);
if(dlb->type==DL_POLY) dl->flag |= DL_CYCL_U;
if(bl->poly>=0) dl->flag |= DL_CYCL_V;
if(bl->poly!= -1) dl->type= DL_POLY;
else dl->type= DL_SEGM;
dl->parts= bl->nr;
dl->nr= dlb->nr;
if(dl->type==DL_SEGM) dl->flag = (DL_FRONT_CURVE|DL_BACK_CURVE);
dl->parts= 1;
dl->nr= bl->nr;
dl->col= nu->mat_nr;
dl->charidx= nu->charidx;
dl->rt= nu->flag;
dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "col2");
a= dl->nr;
bevp= (BevPoint *)(bl+1);
/* for each point of poly make a bevel piece */
bevp= (BevPoint *)(bl+1);
for(a=0; a<bl->nr; a++,bevp++) {
float fac=1.0;
if (cu->taperobj==NULL) {
if ( (cu->bevobj!=NULL) || !((cu->flag & CU_FRONT) || (cu->flag & CU_BACK)) )
fac = calc_curve_subdiv_radius(cu, nu, a);
} else {
fac = calc_taper(cu->taperobj, a, bl->nr);
data= dl->verts;
while(a--) {
data[0]= bevp->x+widfac*bevp->sina;
data[1]= bevp->y+widfac*bevp->cosa;
data[2]= bevp->z;
bevp++;
data+=3;
}
}
else {
DispList *dlb;
for (dlb=dlbev.first; dlb; dlb=dlb->next) {
/* for each part of the bevel use a separate displblock */
dl= MEM_callocN(sizeof(DispList), "makeDispListbev1");
dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr*bl->nr, "dlverts");
BLI_addtail(dispbase, dl);
dl->type= DL_SURF;
dl->flag= dlb->flag & (DL_FRONT_CURVE|DL_BACK_CURVE);
if(dlb->type==DL_POLY) dl->flag |= DL_CYCL_U;
if(bl->poly>=0) dl->flag |= DL_CYCL_V;
dl->parts= bl->nr;
dl->nr= dlb->nr;
dl->col= nu->mat_nr;
dl->charidx= nu->charidx;
dl->rt= nu->flag;
dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "col2");
bevp= (BevPoint *)(bl+1);
/* for each point of poly make a bevel piece */
bevp= (BevPoint *)(bl+1);
for(a=0; a<bl->nr; a++,bevp++) {
float fac=1.0;
if (cu->taperobj==NULL) {
if ( (cu->bevobj!=NULL) || !((cu->flag & CU_FRONT) || (cu->flag & CU_BACK)) )
fac = calc_curve_subdiv_radius(cu, nu, a);
} else {
fac = calc_taper(cu->taperobj, a, bl->nr);
}
if (bevp->f1) {
dl->bevelSplitFlag[a>>5] |= 1<<(a&0x1F);
}
/* rotate bevel piece and write in data */
fp1= dlb->verts;
for (b=0; b<dlb->nr; b++,fp1+=3,data+=3) {
if(cu->flag & CU_3D) {
float vec[3];
vec[0]= fp1[1]+widfac;
vec[1]= fp1[2];
vec[2]= 0.0;
Mat3MulVecfl(bevp->mat, vec);
data[0]= bevp->x+ fac*vec[0];
data[1]= bevp->y+ fac*vec[1];
data[2]= bevp->z+ fac*vec[2];
}
else {
data[0]= bevp->x+ fac*(widfac+fp1[1])*bevp->sina;
data[1]= bevp->y+ fac*(widfac+fp1[1])*bevp->cosa;
data[2]= bevp->z+ fac*fp1[2];
}
}
}
if (bevp->f1) {
dl->bevelSplitFlag[a>>5] |= 1<<(a&0x1F);
}
/* rotate bevel piece and write in data */
fp1= dlb->verts;
for (b=0; b<dlb->nr; b++,fp1+=3,data+=3) {
if(cu->flag & CU_3D) {
float vec[3];
vec[0]= fp1[1]+widfac;
vec[1]= fp1[2];
vec[2]= 0.0;
Mat3MulVecfl(bevp->mat, vec);
data[0]= bevp->x+ fac*vec[0];
data[1]= bevp->y+ fac*vec[1];
data[2]= bevp->z+ fac*vec[2];
}
else {
data[0]= bevp->x+ fac*(widfac+fp1[1])*bevp->sina;
data[1]= bevp->y+ fac*(widfac+fp1[1])*bevp->cosa;
data[2]= bevp->z+ fac*fp1[2];
}
}
/* gl array drawing: using indices */
displist_surf_indices(dl);
}
/* gl array drawing: using indices */
displist_surf_indices(dl);
}
}

View File

@@ -483,6 +483,7 @@ static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir)
/* test for cyclic */
bl= cu->bev.first;
if (!bl->nr) return 0;
if(bl && bl->poly> -1) cycl= 1;
if(cycl==0) {