Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/curve.c')
-rw-r--r--source/blender/blenkernel/intern/curve.c97
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;