[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27870] trunk/blender/source/blender: Fixed segmentation fault when non-curve object is setting as a taper

Sergey Sharybin g.ulairi at gmail.com
Tue Mar 30 16:33:05 CEST 2010


Revision: 27870
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27870
Author:   nazgul
Date:     2010-03-30 16:33:05 +0200 (Tue, 30 Mar 2010)

Log Message:
-----------
Fixed segmentation fault when non-curve object is setting as a taper

Deny user to select non-curve objects for taper and bevel lists, also
added some checking into displist and curve modules - object could be
converted from curve to mesh (would be better to unset bevel/taper
object in this case -- will try to implement a bit later).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/makesrna/intern/rna_curve.c

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2010-03-30 12:43:39 UTC (rev 27869)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2010-03-30 14:33:05 UTC (rev 27870)
@@ -1227,49 +1227,47 @@
 	/* if a font object is being edited, then do nothing */
 // XXX	if( ob == obedit && ob->type == OB_FONT ) return;
 
-	if(cu->bevobj && cu->bevobj!=ob) {
-		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];
+	if(cu->bevobj && cu->bevobj!=ob && 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];
 
-				if (forRender) {
-					makeDispListCurveTypes_forRender(scene, cu->bevobj, &bevdisp, NULL, 0);
-					dl= bevdisp.first;
-				} else {
+			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;
-					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");					
-						*dlnew= *dl;
-						dlnew->verts= MEM_mallocN(3*sizeof(float)*dl->parts*dl->nr, "makebevelcurve1");
-						memcpy(dlnew->verts, dl->verts, 3*sizeof(float)*dl->parts*dl->nr);
-						
-						if(dlnew->type==DL_SEGM) dlnew->flag |= (DL_FRONT_CURVE|DL_BACK_CURVE);
-						
-						BLI_addtail(disp, dlnew);
-						fp= dlnew->verts;
-						nr= dlnew->parts*dlnew->nr;
-						while(nr--) {
-							fp[2]= fp[1]*facy;
-							fp[1]= -fp[0]*facx;
-							fp[0]= 0.0;
-							fp+= 3;
-						}
+			while(dl) {
+				if ELEM(dl->type, DL_POLY, DL_SEGM) {
+					dlnew= MEM_mallocN(sizeof(DispList), "makebevelcurve1");
+					*dlnew= *dl;
+					dlnew->verts= MEM_mallocN(3*sizeof(float)*dl->parts*dl->nr, "makebevelcurve1");
+					memcpy(dlnew->verts, dl->verts, 3*sizeof(float)*dl->parts*dl->nr);
+
+					if(dlnew->type==DL_SEGM) dlnew->flag |= (DL_FRONT_CURVE|DL_BACK_CURVE);
+
+					BLI_addtail(disp, dlnew);
+					fp= dlnew->verts;
+					nr= dlnew->parts*dlnew->nr;
+					while(nr--) {
+						fp[2]= fp[1]*facy;
+						fp[1]= -fp[0]*facx;
+						fp[0]= 0.0;
+						fp+= 3;
 					}
-					dl= dl->next;
 				}
-
-				freedisplist(&bevdisp);
+				dl= dl->next;
 			}
+
+			freedisplist(&bevdisp);
 		}
 	}
 	else if(cu->ext1==0.0 && cu->ext2==0.0) {

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2010-03-30 12:43:39 UTC (rev 27869)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2010-03-30 14:33:05 UTC (rev 27870)
@@ -1755,8 +1755,10 @@
 							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)) )
+								if (cu->taperobj==NULL ||
+									cu->taperobj->type != OB_CURVE || cu->taperobj == ob) {
+									if ( (cu->bevobj!=NULL && cu->bevobj->type == OB_CURVE) ||
+										!((cu->flag & CU_FRONT) || (cu->flag & CU_BACK)) )
 										fac = bevp->radius;
 								} else {
 									fac = calc_taper(scene, cu->taperobj, a, bl->nr);

Modified: trunk/blender/source/blender/makesrna/intern/rna_curve.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_curve.c	2010-03-30 12:43:39 UTC (rev 27869)
+++ trunk/blender/source/blender/makesrna/intern/rna_curve.c	2010-03-30 14:33:05 UTC (rev 27870)
@@ -216,6 +216,30 @@
 	rna_Curve_update_data(bmain, scene, ptr);
 }
 
+static void rna_Curve_update_taper(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+	Curve *cu= (Curve*)ptr->id.data;
+	Object *obj= cu->taperobj;
+
+	if (obj && obj->type != OB_CURVE) {
+		cu->taperobj = NULL;
+	}
+
+	rna_Curve_update_deps(bmain, scene, ptr);
+}
+
+static void rna_Curve_update_bevel(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+	Curve *cu= (Curve*)ptr->id.data;
+	Object *obj= cu->bevobj;
+
+	if (obj && obj->type != OB_CURVE) {
+		cu->bevobj = NULL;
+	}
+
+	rna_Curve_update_deps(bmain, scene, ptr);
+}
+
 static void rna_Curve_resolution_u_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
 	Curve *cu= (Curve*)ptr->id.data;
@@ -1036,13 +1060,13 @@
 	RNA_def_property_pointer_sdna(prop, NULL, "bevobj");
 	RNA_def_property_flag(prop, PROP_EDITABLE);
 	RNA_def_property_ui_text(prop, "Bevel Object", "Curve object name that defines the bevel shape");
-	RNA_def_property_update(prop, 0, "rna_Curve_update_deps");
+	RNA_def_property_update(prop, 0, "rna_Curve_update_bevel");
 	
 	prop= RNA_def_property(srna, "taper_object", PROP_POINTER, PROP_NONE);
 	RNA_def_property_pointer_sdna(prop, NULL, "taperobj");
 	RNA_def_property_flag(prop, PROP_EDITABLE);
 	RNA_def_property_ui_text(prop, "Taper Object", "Curve object name that defines the taper (width)");
-	RNA_def_property_update(prop, 0, "rna_Curve_update_deps");
+	RNA_def_property_update(prop, 0, "rna_Curve_update_taper");
 	
 	/* Flags */
 





More information about the Bf-blender-cvs mailing list