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 */
 


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

Reply via email to