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:
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user