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