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