diff options
Diffstat (limited to 'source/blender/blenkernel/intern/curve.c')
-rw-r--r-- | source/blender/blenkernel/intern/curve.c | 97 |
1 files changed, 67 insertions, 30 deletions
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 0d6382a8d37..fab9669d55f 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -48,27 +48,26 @@ /* 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"); + 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) { @@ -1976,7 +2013,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]; @@ -2307,18 +2344,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 */ @@ -2331,7 +2368,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; @@ -2355,7 +2392,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) { @@ -2378,7 +2415,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; |