[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27774] trunk/blender/source/blender/ blenkernel: Fixed incorrect rendering result when bevel object has got modifiers

Sergey Sharybin g.ulairi at gmail.com
Fri Mar 26 16:06:31 CET 2010


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) {





More information about the Bf-blender-cvs mailing list