Revision: 27774
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27774
Author:   nazgul
Date:     2010-03-26 16:06:30 +0100 (Fri, 26 Mar 2010)

Log Message:
-----------
Fixed incorrect rendering result when bevel object has got modifiers
enabled only for realtime display or only for rendering

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_curve.h
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/displist.c

Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_curve.h 2010-03-26 15:06:15 UTC 
(rev 27773)
+++ trunk/blender/source/blender/blenkernel/BKE_curve.h 2010-03-26 15:06:30 UTC 
(rev 27774)
@@ -76,7 +76,7 @@
 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_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);
 

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c      2010-03-26 
15:06:15 UTC (rev 27773)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c      2010-03-26 
15:06:30 UTC (rev 27774)
@@ -1214,7 +1214,7 @@
 
 /* ***************** BEVEL ****************** */
 
-void makebevelcurve(Scene *scene, Object *ob, ListBase *disp)
+void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
 {
        DispList *dl, *dlnew;
        Curve *bevcu, *cu;
@@ -1231,14 +1231,21 @@
                if(cu->bevobj->type==OB_CURVE) {
                        bevcu= cu->bevobj->data;
                        if(bevcu->ext1==0.0 && bevcu->ext2==0.0) {
+                               ListBase bevdisp= {NULL, NULL};
                                facx= cu->bevobj->size[0];
                                facy= cu->bevobj->size[1];
 
-                               dl= bevcu->disp.first;
-                               if(dl==0) {
-                                       makeDispListCurveTypes(scene, 
cu->bevobj, 0);
+                               if (forRender) {
+                                       makeDispListCurveTypes_forRender(scene, 
cu->bevobj, &bevdisp, NULL, 0);
+                                       dl= bevdisp.first;
+                               } else {
                                        dl= bevcu->disp.first;
+                                       if(dl==0) {
+                                               makeDispListCurveTypes(scene, 
cu->bevobj, 0);
+                                               dl= bevcu->disp.first;
+                                       }
                                }
+
                                while(dl) {
                                        if ELEM(dl->type, DL_POLY, DL_SEGM) {
                                                dlnew= 
MEM_mallocN(sizeof(DispList), "makebevelcurve1");                               
         
@@ -1260,6 +1267,8 @@
                                        }
                                        dl= dl->next;
                                }
+
+                               freedisplist(&bevdisp);
                        }
                }
        }

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c   2010-03-26 
15:06:15 UTC (rev 27773)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c   2010-03-26 
15:06:30 UTC (rev 27774)
@@ -1299,7 +1299,7 @@
                md = preTesselatePoint->next;
        }
 
-       if (*derivedFinal) {
+       if (derivedFinal && *derivedFinal) {
                (*derivedFinal)->release (*derivedFinal);
        }
 
@@ -1354,6 +1354,13 @@
                                }
                        }
                } 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 (dmDeformedVerts) {
                                        DerivedMesh *tdm = CDDM_copy(dm);
@@ -1405,7 +1412,9 @@
                MEM_freeN(dmDeformedVerts);
        }
 
-       (*derivedFinal) = dm;
+       if (derivedFinal) {
+               (*derivedFinal) = dm;
+       }
 
        if (deformedVerts) {
                curve_applyVertexCos(ob->data, nurb, originalVerts);
@@ -1659,7 +1668,7 @@
                makeBevelList(ob);
 
                /* 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? */
                if (!dlbev.first && cu->width==1.0f) {


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to