svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r23023:HEAD
[blender-staging.git] / source / blender / blenkernel / intern / curve.c
index 709507a9b26c75f66ca59fed09d0e44a323feca6..ca0d4a5fdc3e1a42a831c56e6904b187188dfedd 100644 (file)
 
 /* for dereferencing pointers */
 #include "DNA_ID.h"  
-#include "DNA_vfont_types.h"  
 #include "DNA_key_types.h"  
-#include "DNA_ipo_types.h"  
+#include "DNA_scene_types.h"  
+#include "DNA_vfont_types.h"  
 
-#include "BKE_global.h" 
-#include "BKE_main.h"  
-#include "BKE_utildefines.h"  // VECCOPY
-#include "BKE_object.h"  
-#include "BKE_mesh.h" 
+#include "BKE_animsys.h"
+#include "BKE_anim.h"  
 #include "BKE_curve.h"  
 #include "BKE_displist.h"  
-#include "BKE_ipo.h"  
-#include "BKE_anim.h"  
-#include "BKE_library.h"  
+#include "BKE_font.h" 
+#include "BKE_global.h" 
 #include "BKE_key.h"  
+#include "BKE_library.h"  
+#include "BKE_main.h"  
+#include "BKE_mesh.h" 
+#include "BKE_object.h"  
+#include "BKE_utildefines.h"  // VECCOPY
 
 
 /* globals */
 
-extern ListBase editNurb;  /* editcurve.c */
-
 /* local */
 int cu_isectLL(float *v1, float *v2, float *v3, float *v4, 
                           short cox, short coy, 
@@ -86,20 +85,42 @@ void unlink_curve(Curve *cu)
        cu->vfont= 0;
        if(cu->key) cu->key->id.us--;
        cu->key= 0;
-       if(cu->ipo) cu->ipo->id.us--;
-       cu->ipo= 0;
 }
 
+/* frees editcurve entirely */
+void BKE_free_editfont(Curve *cu)
+{
+       if(cu->editfont) {
+               EditFont *ef= cu->editfont;
+               
+               if(ef->oldstr) MEM_freeN(ef->oldstr);
+               if(ef->oldstrinfo) MEM_freeN(ef->oldstrinfo);
+               if(ef->textbuf) MEM_freeN(ef->textbuf);
+               if(ef->textbufinfo) MEM_freeN(ef->textbufinfo);
+               if(ef->copybuf) MEM_freeN(ef->copybuf);
+               if(ef->copybufinfo) MEM_freeN(ef->copybufinfo);
+               
+               MEM_freeN(ef);
+               cu->editfont= NULL;
+       }
+}
 
-/* niet curve zelf vrijgeven */
+/* don't free curve itself */
 void free_curve(Curve *cu)
 {
-
        freeNurblist(&cu->nurb);
        BLI_freelistN(&cu->bev);
        freedisplist(&cu->disp);
+       BKE_free_editfont(cu);
        
+       if(cu->editnurb) {
+               freeNurblist(cu->editnurb);
+               MEM_freeN(cu->editnurb);
+               cu->editnurb= NULL;
+       }
+
        unlink_curve(cu);
+       BKE_free_animdata((ID *)cu);
        
        if(cu->mat) MEM_freeN(cu->mat);
        if(cu->str) MEM_freeN(cu->str);
@@ -128,6 +149,18 @@ Curve *add_curve(char *name, int type)
        
        cu->bb= unit_boundbox();
        
+       if(type==OB_FONT) {
+               cu->vfont= cu->vfontb= cu->vfonti= cu->vfontbi= get_builtin_font();
+               cu->vfont->id.us+=4;
+               cu->str= MEM_mallocN(12, "str");
+               strcpy(cu->str, "Text");
+               cu->pos= 4;
+               cu->strinfo= MEM_callocN(12*sizeof(CharInfo), "strinfo new");
+               cu->totbox= cu->actbox= 1;
+               cu->tb= MEM_callocN(MAXTEXTBOX*sizeof(TextBox), "textbox");
+               cu->tb[0].w = cu->tb[0].h = 0.0;
+       }
+       
        return cu;
 }
 
@@ -157,8 +190,12 @@ Curve *copy_curve(Curve *cu)
        cun->bev.first= cun->bev.last= 0;
        cun->path= 0;
 
+       cun->editnurb= NULL;
+
+#if 0  // XXX old animation system
        /* single user ipo too */
        if(cun->ipo) cun->ipo= copy_ipo(cun->ipo);
+#endif // XXX old animation system
 
        id_us_plus((ID *)cun->vfont);
        id_us_plus((ID *)cun->vfontb);  
@@ -1033,7 +1070,7 @@ float *make_orco_surf(Object *ob)
        /* NOTE: This routine is tied to the order of vertex
         * built by displist and as passed to the renderer.
         */
-float *make_orco_curve(Object *ob)
+float *make_orco_curve(Scene *scene, Object *ob)
 {
        Curve *cu = ob->data;
        DispList *dl;
@@ -1043,7 +1080,7 @@ float *make_orco_curve(Object *ob)
 
        if (!(cu->flag&CU_UV_ORCO) && cu->key && cu->key->refkey) {
                cp_cu_key(cu, cu->key->refkey, 0, count_curveverts(&cu->nurb));
-               makeDispListCurveTypes(ob, 1);
+               makeDispListCurveTypes(scene, ob, 1);
                remakeDisp = 1;
        }
 
@@ -1116,7 +1153,7 @@ float *make_orco_curve(Object *ob)
        }
 
        if (remakeDisp) {
-               makeDispListCurveTypes(ob, 0);
+               makeDispListCurveTypes(scene, ob, 0);
        }
 
        return coord_array;
@@ -1125,7 +1162,7 @@ float *make_orco_curve(Object *ob)
 
 /* ***************** BEVEL ****************** */
 
-void makebevelcurve(Object *ob, ListBase *disp)
+void makebevelcurve(Scene *scene, Object *ob, ListBase *disp)
 {
        DispList *dl, *dlnew;
        Curve *bevcu, *cu;
@@ -1136,7 +1173,7 @@ void makebevelcurve(Object *ob, ListBase *disp)
        disp->first = disp->last = NULL;
 
        /* if a font object is being edited, then do nothing */
-       if( ob == G.obedit && ob->type == OB_FONT ) return;
+// XXX if( ob == obedit && ob->type == OB_FONT ) return;
 
        if(cu->bevobj && cu->bevobj!=ob) {
                if(cu->bevobj->type==OB_CURVE) {
@@ -1147,7 +1184,7 @@ void makebevelcurve(Object *ob, ListBase *disp)
 
                                dl= bevcu->disp.first;
                                if(dl==0) {
-                                       makeDispListCurveTypes(cu->bevobj, 0);
+                                       makeDispListCurveTypes(scene, cu->bevobj, 0);
                                        dl= bevcu->disp.first;
                                }
                                while(dl) {
@@ -1529,7 +1566,7 @@ void makeBevelList(Object *ob)
        /* STEP 1: MAKE POLYS  */
 
        BLI_freelistN(&(cu->bev));
-       if(ob==G.obedit && ob->type!=OB_FONT) nu= editNurb.first;
+       if(cu->editnurb && ob->type!=OB_FONT) nu= cu->editnurb->first;
        else nu= cu->nurb.first;
        
        while(nu) {
@@ -1783,14 +1820,14 @@ void makeBevelList(Object *ob)
                bl= blnext;
        }
 
-       /* STEP 3: COUNT POLYS TELLEN AND AUTOHOLE */
+       /* STEP 3: POLYS COUNT AND AUTOHOLE */
        bl= cu->bev.first;
        poly= 0;
        while(bl) {
                if(bl->nr && bl->poly>=0) {
                        poly++;
                        bl->poly= poly;
-                       bl->gat= 0;     /* 'gat' is dutch for hole */
+                       bl->hole= 0;
                }
                bl= bl->next;
        }
@@ -1842,7 +1879,7 @@ void makeBevelList(Object *ob)
                        sd1= sortdata+ (a-1);
                        for(b=a-1; b>=0; b--, sd1--) {  /* all polys to the left */
                                if(bevelinside(sd1->bl, bl)) {
-                                       bl->gat= 1- sd1->bl->gat;
+                                       bl->hole= 1- sd1->bl->hole;
                                        break;
                                }
                        }
@@ -1852,7 +1889,7 @@ void makeBevelList(Object *ob)
                if((cu->flag & CU_3D)==0) {
                        sd= sortdata;
                        for(a=0; a<poly; a++, sd++) {
-                               if(sd->bl->gat==sd->dir) {
+                               if(sd->bl->hole==sd->dir) {
                                        bl= sd->bl;
                                        bevp1= (BevPoint *)(bl+1);
                                        bevp2= bevp1+ (bl->nr-1);
@@ -1903,7 +1940,7 @@ void makeBevelList(Object *ob)
                }       /* this has to be >2 points */
                else if(cu->flag & CU_NO_TWIST && cu->flag & CU_3D && bl->poly != -1) {
 
-                       /* Special case, cyclic curve with no twisy. tricky... */
+                       /* Special case, cyclic curve with no twist. tricky... */
 
                        float quat[4], q[4], cross[3];
 
@@ -1924,7 +1961,7 @@ void makeBevelList(Object *ob)
                                while(nr--) {
        
                                        /* Normalizes */
-                                       Vec3ToTangent(vec, &bevp0->x, &bevp1->x, &bevp2->x);
+                                       VecBisect3(vec, &bevp0->x, &bevp1->x, &bevp2->x);
 
                                        if(bl->nr==nr+1) { /* first time */
                                                vectoquat(vec, 5, 1, quat);
@@ -1976,7 +2013,7 @@ void makeBevelList(Object *ob)
                        nr= bl->nr;
                        while(nr--) {
 
-                               Vec3ToTangent(vec, &bevp0->x, &bevp1->x, &bevp2->x);
+                               VecBisect3(vec, &bevp0->x, &bevp1->x, &bevp2->x);
 
                                quat_tmp1= (float *)bevp1->mat;
                                quat_tmp2= quat_tmp1+4;
@@ -2014,7 +2051,7 @@ void makeBevelList(Object *ob)
                                if(cu->flag & CU_3D) {  /* 3D */
 
                                        /* Normalizes */
-                                       Vec3ToTangent(vec, &bevp0->x, &bevp1->x, &bevp2->x);
+                                       VecBisect3(vec, &bevp0->x, &bevp1->x, &bevp2->x);
 
                                        if(bl->nr==nr+1 || !(cu->flag & CU_NO_TWIST)) { /* first time */
                                                vectoquat(vec, 5, 1, quat);
@@ -2033,7 +2070,7 @@ void makeBevelList(Object *ob)
                                        }
                                        QUATCOPY(quat_prev, quat); /* quat_prev can't have the tilt applied */
                                        VECCOPY(vec_prev, vec);
-
+                                       
                                        AxisAngleToQuat(q, vec, bevp1->alfa);
                                        QuatMul(quat, q, quat);
                                        QuatToMat3(quat, bevp1->mat);
@@ -2080,7 +2117,7 @@ void makeBevelList(Object *ob)
  *             1: nothing,  1:auto,  2:vector,  3:aligned
  */
 
-/* mode: is not zero when IpoCurve, is 2 when forced horizontal for autohandles */
+/* mode: is not zero when FCurve, is 2 when forced horizontal for autohandles */
 void calchandleNurb(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode)
 {
        float *p1,*p2,*p3, pt[3];
@@ -2411,18 +2448,18 @@ void autocalchandlesNurb(Nurb *nu, int flag)
        calchandlesNurb(nu);
 }
 
-void autocalchandlesNurb_all(int flag)
+void autocalchandlesNurb_all(ListBase *editnurb, int flag)
 {
        Nurb *nu;
        
-       nu= editNurb.first;
+       nu= editnurb->first;
        while(nu) {
                autocalchandlesNurb(nu, flag);
                nu= nu->next;
        }
 }
 
-void sethandlesNurb(short code)
+void sethandlesNurb(ListBase *editnurb, short code)
 {
        /* code==1: set autohandle */
        /* code==2: set vectorhandle */
@@ -2435,7 +2472,7 @@ void sethandlesNurb(short code)
        short a, ok=0;
 
        if(code==1 || code==2) {
-               nu= editNurb.first;
+               nu= editnurb->first;
                while(nu) {
                        if( (nu->type & 7)==CU_BEZIER) {
                                bezt= nu->bezt;
@@ -2459,7 +2496,7 @@ void sethandlesNurb(short code)
        else {
                /* there is 1 handle not FREE: FREE it all, else make ALIGNED  */
                
-               nu= editNurb.first;
+               nu= editnurb->first;
                if (code == 5) {
                        ok = HD_ALIGN;
                } else if (code == 6) {
@@ -2482,7 +2519,7 @@ void sethandlesNurb(short code)
                        if(ok) ok= HD_FREE;
                        else ok= HD_ALIGN;
                }
-               nu= editNurb.first;
+               nu= editnurb->first;
                while(nu) {
                        if( (nu->type & 7)==CU_BEZIER) {
                                bezt= nu->bezt;