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