Preferences: remove author field
[blender.git] / source / blender / makesdna / DNA_curve_types.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file DNA_curve_types.h
29  *  \ingroup DNA
30  */
31
32 #ifndef __DNA_CURVE_TYPES_H__
33 #define __DNA_CURVE_TYPES_H__
34
35 #include "DNA_defs.h"
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 EditFont;
50 struct GHash;
51
52 /* These two Lines with # tell makesdna this struct can be excluded. */
53 #
54 #
55 typedef struct PathPoint {
56         /** Grr, cant get rid of tilt yet. */
57         float vec[4];
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 BevPoint {
75         float vec[3], alfa, radius, weight, offset;
76         /** 2D Only. */
77         float sina, cosa;
78         /** 3D Only. */
79         float dir[3], tan[3], quat[4];
80         short split_tag, dupe_tag;
81 } BevPoint;
82
83 /* These two Lines with # tell makesdna this struct can be excluded. */
84 #
85 #
86 typedef struct BevList {
87         struct BevList *next, *prev;
88         int nr, dupe_nr;
89         int poly, hole;
90         int charidx;
91         int *segbevcount;
92         float *seglen;
93         BevPoint *bevpoints;
94 } BevList;
95
96 /**
97  * Keyframes on F-Curves (allows code reuse of Bezier eval code) and
98  * Points on Bezier Curves/Paths are generally BezTriples
99  *
100  * \note alfa location in struct is abused by Key system
101  *
102  * \note vec in BezTriple looks like this:
103  * - vec[0][0] = x location of handle 1
104  * - vec[0][1] = y location of handle 1
105  * - vec[0][2] = z location of handle 1 (not used for FCurve Points(2d))
106  * - vec[1][0] = x location of control point
107  * - vec[1][1] = y location of control point
108  * - vec[1][2] = z location of control point
109  * - vec[2][0] = x location of handle 2
110  * - vec[2][1] = y location of handle 2
111  * - vec[2][2] = z location of handle 2 (not used for FCurve Points(2d))
112  */
113 typedef struct BezTriple {
114         float vec[3][3];
115         /** Alfa: tilt in 3D View, weight: used for softbody goal weight, radius: for bevel tapering. */
116         float alfa, weight, radius;
117
118         /** Ipo: interpolation mode for segment from this BezTriple to the next. */
119         char ipo;
120
121         /** H1, h2: the handle type of the two handles. */
122         char h1, h2;
123         /** F1, f2, f3: used for selection status. */
124         char f1, f2, f3;
125
126         /** Hide: used to indicate whether BezTriple is hidden (3D), type of keyframe (eBezTriple_KeyframeType). */
127         char hide;
128
129         /** Easing: easing type for interpolation mode (eBezTriple_Easing). */
130         char easing;
131         /** BEZT_IPO_BACK. */
132         float back;
133         /** BEZT_IPO_ELASTIC. */
134         float amplitude, period;
135
136         /** F5: used for auto handle to distinguish between normal handle and exception (extrema). */
137         char f5;
138         char  pad[3];
139 } BezTriple;
140
141 /* note; alfa location in struct is abused by Key system */
142 typedef struct BPoint {
143         float vec[4];
144         /** Alfa: tilt in 3D View, weight: used for softbody goal weight. */
145         float alfa, weight;
146         /** F1: selection status,  hide: is point hidden or not. */
147         short f1, hide;
148         /** User-set radius per point for beveling etc. */
149         float radius, pad;
150 } BPoint;
151
152 /**
153  * \note Nurb name is misleading, since it can be used for polygons too,
154  * also, it should be NURBS (Nurb isn't the singular of Nurbs).
155  */
156 typedef struct Nurb {
157         /** Multiple nurbs per curve object are allowed. */
158         struct Nurb *next, *prev;
159         short type;
160         /** Index into material list. */
161         short mat_nr;
162         short hide, flag;
163         /** Number of points in the U or V directions. */
164         int pntsu, pntsv;
165         short pad[2];
166         /** Tessellation resolution in the U or V directions. */
167         short resolu, resolv;
168         short orderu, orderv;
169         short flagu, flagv;
170
171         float *knotsu, *knotsv;
172         BPoint *bp;
173         BezTriple *bezt;
174
175         /** KEY_LINEAR, KEY_CARDINAL, KEY_BSPLINE. */
176         short tilt_interp;
177         short radius_interp;
178
179         /* only used for dynamically generated Nurbs created from OB_FONT's */
180         int charidx;
181 } Nurb;
182
183 typedef struct CharInfo {
184         short kern;
185         /** Index start at 1, unlike mesh & nurbs. */
186         short mat_nr;
187         char flag;
188         char pad;
189         short pad2;
190 } CharInfo;
191
192 typedef struct TextBox {
193         float x, y, w, h;
194 } TextBox;
195
196 typedef struct EditNurb {
197         /* base of nurbs' list (old Curve->editnurb) */
198         ListBase nurbs;
199
200         /* index data for shape keys */
201         struct GHash *keyindex;
202
203         /* shape key being edited */
204         int shapenr;
205
206         char pad[4];
207 } EditNurb;
208
209 typedef struct Curve {
210         ID id;
211         /** Animation data (must be immediately after id for utilities to use it). */
212         struct AnimData *adt;
213
214         struct BoundBox *bb;
215
216         /** Actual data, called splines in rna. */
217         ListBase nurb;
218
219         /** Edited data, not in file, use pointer so we can check for it. */
220         EditNurb *editnurb;
221
222         struct Object *bevobj, *taperobj, *textoncurve;
223         /** Old animation system, deprecated for 2.5. */
224         struct Ipo *ipo    DNA_DEPRECATED;
225         struct Key *key;
226         struct Material **mat;
227
228         /* texture space, copied as one block in editobject.c */
229         float loc[3];
230         float size[3];
231         float rot[3];
232
233         /** Creation-time type of curve datablock. */
234         short type;
235
236         /** Keep a short because of BKE_object_obdata_texspace_get(). */
237         short texflag;
238         short drawflag, twist_mode;
239         float twist_smooth, smallcaps_scale;
240
241         int pathlen;
242         short bevresol, totcol;
243         int flag;
244         float width, ext1, ext2;
245
246         /* default */
247         short resolu, resolv;
248         short resolu_ren, resolv_ren;
249
250         /* edit, index in nurb list */
251         int actnu;
252         /* edit, index in active nurb (BPoint or BezTriple) */
253         int actvert;
254
255         char overflow;
256         char spacemode, align_y;
257         char pad[3];
258
259         /* font part */
260         short lines;
261         float spacing, linedist, shear, fsize, wordspace, ulpos, ulheight;
262         float xof, yof;
263         float linewidth;
264
265         /* copy of EditFont vars (wchar_t aligned),
266          * warning! don't use in editmode (storage only) */
267         int pos;
268         int selstart, selend;
269
270         /* text data */
271         /** Number of characters (strinfo). */
272         int len_wchar;
273         /** Number of bytes (str - utf8). */
274         int len;
275         char *str;
276         struct EditFont *editfont;
277
278         char family[64];
279         struct VFont *vfont;
280         struct VFont *vfontb;
281         struct VFont *vfonti;
282         struct VFont *vfontbi;
283
284         struct TextBox *tb;
285         int totbox, actbox;
286
287         struct CharInfo *strinfo;
288         struct CharInfo curinfo;
289         /* font part end */
290
291
292         /** Current evaltime - for use by Objects parented to curves. */
293         float ctime;
294         float bevfac1, bevfac2;
295         char bevfac1_mapping, bevfac2_mapping;
296
297         char pad2[2];
298         float fsize_realtime;
299         float pad3;
300
301         void *batch_cache;
302 } Curve;
303
304 #define CURVE_VFONT_ANY(cu) \
305         ((cu)->vfont), ((cu)->vfontb), ((cu)->vfonti), ((cu)->vfontbi)
306
307 /* **************** CURVE ********************* */
308
309 /* Curve.texflag */
310 enum {
311         CU_AUTOSPACE          = 1,
312 };
313
314 #if 0 /* Moved to overlay options in 2.8 */
315 /* Curve.drawflag */
316 enum {
317         CU_HIDE_HANDLES       = 1 << 0,
318         CU_HIDE_NORMALS       = 1 << 1,
319 };
320 #endif
321
322 /* Curve.flag */
323 enum {
324         CU_3D                 = 1 << 0,
325         CU_FRONT              = 1 << 1,
326         CU_BACK               = 1 << 2,
327         CU_PATH               = 1 << 3,
328         CU_FOLLOW             = 1 << 4,
329         CU_UV_ORCO            = 1 << 5,
330         CU_DEFORM_BOUNDS_OFF  = 1 << 6,
331         CU_STRETCH            = 1 << 7,
332         /* CU_OFFS_PATHDIST   = 1 << 8, */  /* DEPRECATED */
333         CU_FAST               = 1 << 9,  /* Font: no filling inside editmode */
334         /* CU_RETOPO          = 1 << 10, */  /* DEPRECATED */
335         CU_DS_EXPAND          = 1 << 11,
336         CU_PATH_RADIUS        = 1 << 12,  /* make use of the path radius if this is enabled (default for new curves) */
337         CU_DEFORM_FILL        = 1 << 13,  /* fill 2d curve after deformation */
338         CU_FILL_CAPS          = 1 << 14,  /* fill bevel caps */
339         CU_MAP_TAPER          = 1 << 15,  /* map taper object to beveled area */
340 };
341
342 /* Curve.twist_mode */
343 enum {
344         CU_TWIST_Z_UP         = 0,
345         /* CU_TWIST_Y_UP      = 1, */  /* not used yet */
346         /* CU_TWIST_X_UP      = 2, */
347         CU_TWIST_MINIMUM      = 3,
348         CU_TWIST_TANGENT      = 4,
349 };
350
351 /* Curve.bevfac1_mapping, Curve.bevfac2_mapping, bevel factor mapping */
352 enum {
353         CU_BEVFAC_MAP_RESOLU  = 0,
354         CU_BEVFAC_MAP_SEGMENT = 1,
355         CU_BEVFAC_MAP_SPLINE  = 2,
356 };
357
358 /* Curve.spacemode */
359 enum {
360         CU_ALIGN_X_LEFT               = 0,
361         CU_ALIGN_X_MIDDLE             = 1,
362         CU_ALIGN_X_RIGHT              = 2,
363         CU_ALIGN_X_JUSTIFY            = 3,
364         CU_ALIGN_X_FLUSH              = 4,
365 };
366
367 /* Curve.align_y */
368 enum {
369         CU_ALIGN_Y_TOP_BASELINE       = 0,
370         CU_ALIGN_Y_TOP                = 1,
371         CU_ALIGN_Y_CENTER             = 2,
372         CU_ALIGN_Y_BOTTOM_BASELINE    = 3,
373         CU_ALIGN_Y_BOTTOM             = 4,
374 };
375
376 /* Curve.overflow. */
377 enum {
378         CU_OVERFLOW_NONE              = 0,
379         CU_OVERFLOW_SCALE             = 1,
380         CU_OVERFLOW_TRUNCATE          = 2,
381 };
382
383 /* Nurb.flag */
384 enum {
385         CU_SMOOTH             = 1 << 0,
386         CU_2D                 = 1 << 3,  /* moved from type since 2.4x */
387 };
388
389 /* Nurb.type */
390 enum {
391         CU_POLY               = 0,
392         CU_BEZIER             = 1,
393         CU_BSPLINE            = 2,
394         CU_CARDINAL           = 3,
395         CU_NURBS              = 4,
396         CU_TYPE               = (CU_POLY | CU_BEZIER | CU_BSPLINE | CU_CARDINAL | CU_NURBS),
397
398         /* only for adding */
399         CU_PRIMITIVE          = 0xF00,
400
401         /* 2 or 4 points */
402         CU_PRIM_CURVE         = 0x100,
403         /* 8 points circle */
404         CU_PRIM_CIRCLE        = 0x200,
405         /* 4x4 patch Nurb */
406         CU_PRIM_PATCH         = 0x300,
407         CU_PRIM_TUBE          = 0x400,
408         CU_PRIM_SPHERE        = 0x500,
409         CU_PRIM_DONUT         = 0x600,
410         /* 5 points,  5th order straight line (for anim path) */
411         CU_PRIM_PATH          = 0x700,
412 };
413
414 /* Nurb.flagu, Nurb.flagv */
415 enum {
416         CU_NURB_CYCLIC        = 1 << 0,
417         CU_NURB_ENDPOINT      = 1 << 1,
418         CU_NURB_BEZIER        = 1 << 2,
419 };
420
421 #define CU_ACT_NONE  -1
422
423 /* *************** BEZTRIPLE **************** */
424
425 /* BezTriple.f1,2,3 */
426 typedef enum eBezTriple_Flag {
427         /* SELECT */
428         BEZT_FLAG_TEMP_TAG = (1 << 1),  /* always clear. */
429 } eBezTriple_Flag;
430
431 /* h1 h2 (beztriple) */
432 typedef enum eBezTriple_Handle {
433         HD_FREE = 0,
434         HD_AUTO = 1,
435         HD_VECT = 2,
436         HD_ALIGN = 3,
437         HD_AUTO_ANIM = 4,         /* auto-clamped handles for animation */
438         HD_ALIGN_DOUBLESIDE = 5,  /* align handles, displayed both of them. used for masks */
439 } eBezTriple_Handle;
440
441 /* f5 (beztriple) */
442 typedef enum eBezTriple_Auto_Type {
443         HD_AUTOTYPE_NORMAL = 0,
444         HD_AUTOTYPE_SPECIAL = 1
445 } eBezTriple_Auto_Type;
446
447 /* interpolation modes (used only for BezTriple->ipo) */
448 typedef enum eBezTriple_Interpolation {
449         /* traditional interpolation */
450         BEZT_IPO_CONST = 0, /* constant interpolation */
451         BEZT_IPO_LIN = 1,   /* linear interpolation */
452         BEZT_IPO_BEZ = 2,   /* bezier interpolation */
453
454         /* easing equations */
455         BEZT_IPO_BACK = 3,
456         BEZT_IPO_BOUNCE = 4,
457         BEZT_IPO_CIRC = 5,
458         BEZT_IPO_CUBIC = 6,
459         BEZT_IPO_ELASTIC = 7,
460         BEZT_IPO_EXPO = 8,
461         BEZT_IPO_QUAD = 9,
462         BEZT_IPO_QUART = 10,
463         BEZT_IPO_QUINT = 11,
464         BEZT_IPO_SINE = 12,
465 } eBezTriple_Interpolation;
466
467 /* easing modes (used only for Keyframes - BezTriple->easing) */
468 typedef enum eBezTriple_Easing {
469         BEZT_IPO_EASE_AUTO = 0,
470
471         BEZT_IPO_EASE_IN = 1,
472         BEZT_IPO_EASE_OUT = 2,
473         BEZT_IPO_EASE_IN_OUT = 3,
474 } eBezTriple_Easing;
475
476 /* types of keyframe (used only for BezTriple->hide when BezTriple is used in F-Curves) */
477 typedef enum eBezTriple_KeyframeType {
478         BEZT_KEYTYPE_KEYFRAME = 0,  /* default - 'proper' Keyframe */
479         BEZT_KEYTYPE_EXTREME = 1,   /* 'extreme' keyframe */
480         BEZT_KEYTYPE_BREAKDOWN = 2, /* 'breakdown' keyframe */
481         BEZT_KEYTYPE_JITTER = 3,    /* 'jitter' keyframe (for adding 'filler' secondary motion) */
482         BEZT_KEYTYPE_MOVEHOLD = 4,  /* one end of a 'moving hold' */
483 } eBezTriple_KeyframeType;
484
485 /* checks if the given BezTriple is selected */
486 #define BEZT_ISSEL_ANY(bezt) \
487         (((bezt)->f2 & SELECT) || ((bezt)->f1 & SELECT) || ((bezt)->f3 & SELECT))
488 #define BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt) \
489         ((((v3d) != NULL) && ((v3d)->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) ? (bezt)->f2 & SELECT : BEZT_ISSEL_ANY(bezt))
490
491 #define BEZT_SEL_ALL(bezt)    { (bezt)->f1 |=  SELECT; (bezt)->f2 |=  SELECT; (bezt)->f3 |=  SELECT; } ((void)0)
492 #define BEZT_DESEL_ALL(bezt)  { (bezt)->f1 &= ~SELECT; (bezt)->f2 &= ~SELECT; (bezt)->f3 &= ~SELECT; } ((void)0)
493
494 #define BEZT_IS_AUTOH(bezt)   (ELEM((bezt)->h1, HD_AUTO, HD_AUTO_ANIM) && ELEM((bezt)->h2, HD_AUTO, HD_AUTO_ANIM))
495
496 /* *************** CHARINFO **************** */
497
498 /* CharInfo.flag */
499 enum {
500         /* note: CU_CHINFO_WRAP, CU_CHINFO_SMALLCAPS_TEST and CU_CHINFO_TRUNCATE are set dynamically */
501         CU_CHINFO_BOLD            = 1 << 0,
502         CU_CHINFO_ITALIC          = 1 << 1,
503         CU_CHINFO_UNDERLINE       = 1 << 2,
504         CU_CHINFO_WRAP            = 1 << 3,  /* wordwrap occurred here */
505         CU_CHINFO_SMALLCAPS       = 1 << 4,
506         CU_CHINFO_SMALLCAPS_CHECK = 1 << 5,  /* set at runtime, checks if case switching is needed */
507         CU_CHINFO_OVERFLOW        = 1 << 6,  /* Set at runtime, indicates char that doesn't fit in text boxes. */
508 };
509
510 /* mixed with KEY_LINEAR but define here since only curve supports */
511 #define KEY_CU_EASE                     3
512
513 /* indicates point has been seen during surface duplication */
514 #define SURF_SEEN                       4
515
516 #endif