cd002894c5d7ada141b010769652cb7b0eb701a9
[blender.git] / source / blender / makesdna / DNA_curve_types.h
1 /**
2  * blenlib/DNA_curve_types.h (mar-2001 nzc)
3  *
4  * Curve stuff.
5  *
6  * $Id$ 
7  *
8  * ***** BEGIN GPL LICENSE BLOCK *****
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23  *
24  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
25  * All rights reserved.
26  *
27  * The Original Code is: all of this file.
28  *
29  * Contributor(s): none yet.
30  *
31  * ***** END GPL LICENSE BLOCK *****
32  */
33 #ifndef DNA_CURVE_TYPES_H
34 #define DNA_CURVE_TYPES_H
35
36 #include "DNA_listBase.h"
37 #include "DNA_vec_types.h"
38 #include "DNA_ID.h"
39
40 #define MAXTEXTBOX 256  /* used in readfile.c and editfont.c */
41
42 struct BoundBox;
43 struct Object;
44 struct Ipo;
45 struct Key;
46 struct Material;
47 struct VFont;
48 struct AnimData;
49 struct SelBox;
50 struct EditFont;
51
52 /* These two Lines with # tell makesdna this struct can be excluded. */
53 #
54 #
55 typedef struct PathPoint {
56         float vec[4]; /* grr, cant get rid of tilt yet */
57         float quat[4];
58         float radius;
59 } PathPoint;
60
61 /* These two Lines with # tell makesdna this struct can be excluded. */
62 #
63 #
64 typedef struct Path {
65         int len;
66         struct PathPoint *data;
67         float totdist;
68 } Path;
69
70 /* These two Lines with # tell makesdna this struct can be excluded. */
71 #
72 #
73 typedef struct BevList {
74         struct BevList *next, *prev;
75         int nr, dupe_nr;
76         short poly, hole;
77 } BevList;
78
79 /* These two Lines with # tell makesdna this struct can be excluded. */
80 #
81 #
82 typedef struct BevPoint {
83         float vec[3], alfa, radius;
84         float sina, cosa;                               /* 2D Only */
85         float dir[3], tan[3], quat[4];  /* 3D Only */
86         short split_tag, dupe_tag;
87 } BevPoint;
88
89 /* Keyframes on F-Curves (allows code reuse of Bezier eval code) and 
90  * Points on Bezier Curves/Paths are generally BezTriples 
91  */
92 /* note: alfa location in struct is abused by Key system */
93 /* vec in BezTriple looks like this:
94         vec[0][0]=x location of handle 1
95         vec[0][1]=y location of handle 1
96         vec[0][2]=z location of handle 1 (not used for FCurve Points(2d))
97         vec[1][0]=x location of control point
98         vec[1][1]=y location of control point
99         vec[1][2]=z location of control point
100         vec[2][0]=x location of handle 2
101         vec[2][1]=y location of handle 2
102         vec[2][2]=z location of handle 2 (not used for FCurve Points(2d))
103 */
104 typedef struct BezTriple {
105         float vec[3][3];
106         float alfa, weight, radius;     /* alfa: tilt in 3D View, weight: used for softbody goal weight, radius: for bevel tapering */
107         short ipo;                                      /* ipo: interpolation mode for segment from this BezTriple to the next */
108         char h1, h2;                            /* h1, h2: the handle type of the two handles */
109         char f1, f2, f3;                        /* f1, f2, f3: used for selection status */
110         char hide;                                      /* hide: used to indicate whether BezTriple is hidden (3D), type of keyframe (eBezTriple_KeyframeTypes) */
111 } BezTriple;
112
113 /* note; alfa location in struct is abused by Key system */
114 typedef struct BPoint {
115         float vec[4];
116         float alfa, weight;             /* alfa: tilt in 3D View, weight: used for softbody goal weight */
117         short f1, hide;                 /* f1: selection status,  hide: is point hidden or not */
118         float radius, pad;              /* user-set radius per point for bevelling etc */
119 } BPoint;
120
121 typedef struct Nurb {
122         struct Nurb *next, *prev;       /* multiple nurbs per curve object are allowed */
123         short type;
124         short mat_nr;           /* index into material list */
125         short hide, flag;
126         short pntsu, pntsv;             /* number of points in the U or V directions */
127         short resolu, resolv;   /* tesselation resolution in the U or V directions */
128         short orderu, orderv;
129         short flagu, flagv;
130         
131         float *knotsu, *knotsv;
132         BPoint *bp;
133         BezTriple *bezt;
134
135         short tilt_interp;      /* KEY_LINEAR, KEY_CARDINAL, KEY_BSPLINE */
136         short radius_interp;
137         
138         int charidx;
139 } Nurb;
140
141 typedef struct CharInfo {
142         short kern;
143         short mat_nr;
144         char flag;
145         char pad;
146         short pad2;
147 } CharInfo;
148
149 typedef struct TextBox {
150         float x, y, w, h;
151 } TextBox;
152
153 typedef struct Curve {
154         ID id;
155         struct AnimData *adt;           /* animation data (must be immediately after id for utilities to use it) */ 
156         
157         struct BoundBox *bb;
158         
159         ListBase nurb;          /* actual data, called splines in rna */
160         ListBase disp;
161         
162         ListBase *editnurb;     /* edited data, not in file, use pointer so we can check for it */
163         
164         struct Object *bevobj, *taperobj, *textoncurve;
165         struct Ipo *ipo;        // XXX depreceated... old animation system
166         Path *path;
167         struct Key *key;
168         struct Material **mat;
169         
170         ListBase bev;
171         
172         /* texture space, copied as one block in editobject.c */
173         float loc[3];
174         float size[3];
175         float rot[3];
176
177         short texflag, pad1; /* keep a short because of give_obdata_texspace() */
178
179         short drawflag, twist_mode,  pad[2];
180         float twist_smooth, pad2;
181
182         short pathlen, totcol;
183         short flag, bevresol;
184         float width, ext1, ext2;
185         
186         /* default */
187         short resolu, resolv;
188         short resolu_ren, resolv_ren;
189
190         /* edit, index in nurb list */
191         int actnu;
192         /* edit, last selected bpoint */
193         BPoint *lastselbp;
194         
195         /* font part */
196         short len, lines, pos, spacemode;
197         float spacing, linedist, shear, fsize, wordspace, ulpos, ulheight;
198         float xof, yof;
199         float linewidth;
200
201         char *str;
202         struct SelBox *selboxes;
203         struct EditFont *editfont;
204         
205         char family[24];
206         struct VFont *vfont;
207         struct VFont *vfontb;
208         struct VFont *vfonti;
209         struct VFont *vfontbi;
210
211         int sepchar;
212         
213         float ctime;                    /* current evaltime - for use by Objects parented to curves */
214         int totbox, actbox;
215         struct TextBox *tb;     
216         
217         int selstart, selend;   
218         
219         struct CharInfo *strinfo;       
220         struct CharInfo curinfo;
221 } Curve;
222
223 /* **************** CURVE ********************* */
224
225 /* texflag */
226 #define CU_AUTOSPACE    1
227
228 /* drawflag */
229 #define CU_HIDE_HANDLES (1 << 0)
230 #define CU_HIDE_NORMALS (1 << 1)
231
232 /* flag */
233 #define CU_3D                   1
234 #define CU_FRONT                2
235 #define CU_BACK                 4
236 #define CU_PATH                 8
237 #define CU_FOLLOW               16
238 #define CU_UV_ORCO              32
239 #define CU_NOPUNOFLIP   64
240 #define CU_STRETCH              128
241 #define CU_OFFS_PATHDIST        256
242 #define CU_FAST                 512 /* Font: no filling inside editmode */
243 #define CU_RETOPO               1024
244 #define CU_DS_EXPAND    2048
245 #define CU_PATH_RADIUS  4096 /* make use of the path radius if this is enabled (default for new curves) */
246
247 /* twist mode */
248 #define CU_TWIST_Z_UP                   0
249 // #define CU_TWIST_Y_UP                        1 // not used yet
250 // #define CU_TWIST_X_UP                        2
251 #define CU_TWIST_MINIMUM                3
252 #define CU_TWIST_TANGENT                4
253
254 /* spacemode */
255 #define CU_LEFT                 0
256 #define CU_MIDDLE               1
257 #define CU_RIGHT                2
258 #define CU_JUSTIFY              3
259 #define CU_FLUSH                4
260
261 /* flag (nurb) */
262 #define CU_SMOOTH               1
263 #define CU_2D                   8 /* moved from type since 2.4x */
264
265 /* type (nurb) */
266 #define CU_POLY                 0
267 #define CU_BEZIER               1
268 #define CU_BSPLINE              2
269 #define CU_CARDINAL             3
270 #define CU_NURBS                4
271 #define CU_TYPE                 (CU_POLY|CU_BEZIER|CU_BSPLINE|CU_CARDINAL|CU_NURBS)
272
273                 /* only for adding */
274 #define CU_PRIMITIVE    0xF00
275
276                 /* 2 or 4 points */
277 #define CU_PRIM_CURVE   0x100
278                 /* 8 points circle */
279 #define CU_PRIM_CIRCLE  0x200
280                 /* 4x4 patch Nurb */
281 #define CU_PRIM_PATCH   0x300
282 #define CU_PRIM_TUBE    0x400
283 #define CU_PRIM_SPHERE  0x500
284 #define CU_PRIM_DONUT   0x600
285                 /* 5 points,  5th order straight line (for anim path) */
286 #define CU_PRIM_PATH    0x700
287
288
289 /* flagu flagv (nurb) */
290 #define CU_CYCLIC               1
291
292 /* *************** BEZTRIPLE **************** */
293
294 /* h1 h2 (beztriple) */
295 typedef enum eBezTriple_Handle {
296         HD_FREE = 0,
297         HD_AUTO,
298         HD_VECT,
299         HD_ALIGN,
300         HD_AUTO_ANIM,   /* not real handle type, but is just used as dummy item for anim code */
301 } eBezTriple_Handle;
302
303 /* interpolation modes (used only for BezTriple->ipo) */
304 typedef enum eBezTriple_Interpolation {
305         BEZT_IPO_CONST = 0,     /* constant interpolation */
306         BEZT_IPO_LIN,           /* linear interpolation */
307         BEZT_IPO_BEZ,           /* bezier interpolation */
308 } eBezTriple_Interpolation;
309
310 /* types of keyframe (used only for BezTriple->hide when BezTriple is used in F-Curves) */
311 typedef enum eBezTriple_KeyframeType {
312         BEZT_KEYTYPE_KEYFRAME = 0,      /* default - 'proper' Keyframe */
313         BEZT_KEYTYPE_EXTREME,           /* 'extreme' keyframe */
314         BEZT_KEYTYPE_BREAKDOWN,         /* 'breakdown' keyframe */
315 } eBezTriple_KeyframeType;
316
317 /* checks if the given BezTriple is selected */
318 #define BEZSELECTED(bezt) (((bezt)->f2 & SELECT) || ((bezt)->f1 & SELECT) || ((bezt)->f3 & SELECT))
319 #define BEZSELECTED_HIDDENHANDLES(cu, bezt)   (((cu)->drawflag & CU_HIDE_HANDLES) ? (bezt)->f2 & SELECT : BEZSELECTED(bezt))
320
321 /* *************** CHARINFO **************** */
322
323 /* flag */
324 #define CU_STYLE                (1+2)
325 #define CU_BOLD                 1
326 #define CU_ITALIC               2
327 #define CU_UNDERLINE    4
328 #define CU_WRAP                 8       /* wordwrap occured here */
329
330 #endif
331