Fixed incorrect rendering result when bevel object has got modifiers

enabled only for realtime display or only for rendering
This commit is contained in:
Sergey Sharybin 2010-03-26 15:06:30 +00:00
parent 95c135f68c
commit 0912d84f2a
3 changed files with 26 additions and 8 deletions

@ -76,7 +76,7 @@ void makeNurbcurve(struct Nurb *nu, float *coord_array, float *tilt_array, float
void forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int it, int stride); void forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int it, int stride);
float *make_orco_curve(struct Scene *scene, struct Object *ob); float *make_orco_curve(struct Scene *scene, struct Object *ob);
float *make_orco_surf( struct Object *ob); float *make_orco_surf( struct Object *ob);
void makebevelcurve(struct Scene *scene, struct Object *ob, struct ListBase *disp); void makebevelcurve(struct Scene *scene, struct Object *ob, struct ListBase *disp, int forRender);
void makeBevelList( struct Object *ob); void makeBevelList( struct Object *ob);

@ -1214,7 +1214,7 @@ float *make_orco_curve(Scene *scene, Object *ob)
/* ***************** BEVEL ****************** */ /* ***************** BEVEL ****************** */
void makebevelcurve(Scene *scene, Object *ob, ListBase *disp) void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
{ {
DispList *dl, *dlnew; DispList *dl, *dlnew;
Curve *bevcu, *cu; Curve *bevcu, *cu;
@ -1231,14 +1231,21 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp)
if(cu->bevobj->type==OB_CURVE) { if(cu->bevobj->type==OB_CURVE) {
bevcu= cu->bevobj->data; bevcu= cu->bevobj->data;
if(bevcu->ext1==0.0 && bevcu->ext2==0.0) { if(bevcu->ext1==0.0 && bevcu->ext2==0.0) {
ListBase bevdisp= {NULL, NULL};
facx= cu->bevobj->size[0]; facx= cu->bevobj->size[0];
facy= cu->bevobj->size[1]; facy= cu->bevobj->size[1];
if (forRender) {
makeDispListCurveTypes_forRender(scene, cu->bevobj, &bevdisp, NULL, 0);
dl= bevdisp.first;
} else {
dl= bevcu->disp.first; dl= bevcu->disp.first;
if(dl==0) { if(dl==0) {
makeDispListCurveTypes(scene, cu->bevobj, 0); makeDispListCurveTypes(scene, cu->bevobj, 0);
dl= bevcu->disp.first; dl= bevcu->disp.first;
} }
}
while(dl) { while(dl) {
if ELEM(dl->type, DL_POLY, DL_SEGM) { if ELEM(dl->type, DL_POLY, DL_SEGM) {
dlnew= MEM_mallocN(sizeof(DispList), "makebevelcurve1"); dlnew= MEM_mallocN(sizeof(DispList), "makebevelcurve1");
@ -1260,6 +1267,8 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp)
} }
dl= dl->next; dl= dl->next;
} }
freedisplist(&bevdisp);
} }
} }
} }

@ -1299,7 +1299,7 @@ static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispba
md = preTesselatePoint->next; md = preTesselatePoint->next;
} }
if (*derivedFinal) { if (derivedFinal && *derivedFinal) {
(*derivedFinal)->release (*derivedFinal); (*derivedFinal)->release (*derivedFinal);
} }
@ -1354,6 +1354,13 @@ static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispba
} }
} }
} else { } else {
if (!derivedFinal) {
/* makeDisplistCurveTypes could be used for beveling, where derived mesh */
/* is totally unnecessary, so we could stop modifiers applying */
/* when we found constructive modifier but derived mesh is unwanted result */
break;
}
if (dm) { if (dm) {
if (dmDeformedVerts) { if (dmDeformedVerts) {
DerivedMesh *tdm = CDDM_copy(dm); DerivedMesh *tdm = CDDM_copy(dm);
@ -1405,7 +1412,9 @@ static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispba
MEM_freeN(dmDeformedVerts); MEM_freeN(dmDeformedVerts);
} }
if (derivedFinal) {
(*derivedFinal) = dm; (*derivedFinal) = dm;
}
if (deformedVerts) { if (deformedVerts) {
curve_applyVertexCos(ob->data, nurb, originalVerts); curve_applyVertexCos(ob->data, nurb, originalVerts);
@ -1659,7 +1668,7 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
makeBevelList(ob); makeBevelList(ob);
/* If curve has no bevel will return nothing */ /* If curve has no bevel will return nothing */
makebevelcurve(scene, ob, &dlbev); makebevelcurve(scene, ob, &dlbev, forRender);
/* no bevel or extrude, and no width correction? */ /* no bevel or extrude, and no width correction? */
if (!dlbev.first && cu->width==1.0f) { if (!dlbev.first && cu->width==1.0f) {