Fix T86566: Do Not Close if File Cannot Be Saved
[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 #pragma once
25
26 #include "DNA_ID.h"
27 #include "DNA_defs.h"
28 #include "DNA_listBase.h"
29 #include "DNA_vec_types.h"
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 #define MAXTEXTBOX 256 /* used in readfile.c and editfont.c */
36
37 struct AnimData;
38 struct CurveProfile;
39 struct EditFont;
40 struct GHash;
41 struct Ipo;
42 struct Key;
43 struct Material;
44 struct Object;
45 struct VFont;
46
47 /* These two Lines with # tell makesdna this struct can be excluded. */
48 #
49 #
50 typedef struct BevPoint {
51   float vec[3], tilt, radius, weight, offset;
52   /** 2D Only. */
53   float sina, cosa;
54   /** 3D Only. */
55   float dir[3], tan[3], quat[4];
56   short dupe_tag;
57 } BevPoint;
58
59 /* These two Lines with # tell makesdna this struct can be excluded. */
60 #
61 #
62 typedef struct BevList {
63   struct BevList *next, *prev;
64   int nr, dupe_nr;
65   int poly, hole;
66   int charidx;
67   int *segbevcount;
68   float *seglen;
69   BevPoint *bevpoints;
70 } BevList;
71
72 /**
73  * Keyframes on F-Curves (allows code reuse of Bezier eval code) and
74  * Points on Bezier Curves/Paths are generally BezTriples.
75  *
76  * \note #BezTriple.tilt location in struct is abused by Key system.
77  *
78  * \note vec in BezTriple looks like this:
79  * - vec[0][0] = x location of handle 1
80  * - vec[0][1] = y location of handle 1
81  * - vec[0][2] = z location of handle 1 (not used for FCurve Points(2d))
82  * - vec[1][0] = x location of control point
83  * - vec[1][1] = y location of control point
84  * - vec[1][2] = z location of control point
85  * - vec[2][0] = x location of handle 2
86  * - vec[2][1] = y location of handle 2
87  * - vec[2][2] = z location of handle 2 (not used for FCurve Points(2d))
88  */
89 typedef struct BezTriple {
90   float vec[3][3];
91   /** Tilt in 3D View. */
92   float tilt;
93   /** Used for softbody goal weight. */
94   float weight;
95   /** For bevel tapering & modifiers. */
96   float radius;
97
98   /** Ipo: interpolation mode for segment from this BezTriple to the next. */
99   char ipo;
100
101   /** H1, h2: the handle type of the two handles. */
102   uint8_t h1, h2;
103   /** F1, f2, f3: used for selection status. */
104   uint8_t f1, f2, f3;
105
106   /** Hide: used to indicate whether BezTriple is hidden (3D),
107    * type of keyframe (eBezTriple_KeyframeType). */
108   char hide;
109
110   /** Easing: easing type for interpolation mode (eBezTriple_Easing). */
111   char easing;
112   /** BEZT_IPO_BACK. */
113   float back;
114   /** BEZT_IPO_ELASTIC. */
115   float amplitude, period;
116
117   /** Used during auto handle calculation to mark special cases (local extremes). */
118   char auto_handle_type;
119   char _pad[3];
120 } BezTriple;
121
122 /**
123  * \note #BPoint.tilt location in struct is abused by Key system.
124  */
125 typedef struct BPoint {
126   float vec[4];
127   /** Tilt in 3D View. */
128   float tilt;
129   /** Used for softbody goal weight. */
130   float weight;
131   /** F1: selection status,  hide: is point hidden or not. */
132   uint8_t f1;
133   char _pad1[1];
134   short hide;
135   /** User-set radius per point for beveling etc. */
136   float radius;
137   char _pad[4];
138 } BPoint;
139
140 /**
141  * \note Nurb name is misleading, since it can be used for polygons too,
142  * also, it should be NURBS (Nurb isn't the singular of Nurbs).
143  */
144 typedef struct Nurb {
145   /** Multiple nurbs per curve object are allowed. */
146   struct Nurb *next, *prev;
147   short type;
148   /** Index into material list. */
149   short mat_nr;
150   short hide, flag;
151   /** Number of points in the U or V directions. */
152   int pntsu, pntsv;
153   char _pad[4];
154   /** Tessellation resolution in the U or V directions. */
155   short resolu, resolv;
156   short orderu, orderv;
157   short flagu, flagv;
158
159   float *knotsu, *knotsv;
160   BPoint *bp;
161   BezTriple *bezt;
162
163   /** KEY_LINEAR, KEY_CARDINAL, KEY_BSPLINE. */
164   short tilt_interp;
165   short radius_interp;
166
167   /* only used for dynamically generated Nurbs created from OB_FONT's */
168   int charidx;
169 } Nurb;
170
171 typedef struct CharInfo {
172   short kern;
173   /** Index start at 1, unlike mesh & nurbs. */
174   short mat_nr;
175   char flag;
176   char _pad[3];
177 } CharInfo;
178
179 typedef struct TextBox {
180   float x, y, w, h;
181 } TextBox;
182
183 /* These two Lines with # tell makesdna this struct can be excluded. */
184 #
185 #
186 typedef struct EditNurb {
187   /* base of nurbs' list (old Curve->editnurb) */
188   ListBase nurbs;
189
190   /* index data for shape keys */
191   struct GHash *keyindex;
192
193   /* shape key being edited */
194   int shapenr;
195
196   /**
197    * ID data is older than edit-mode data.
198    * Set #Main.is_memfile_undo_flush_needed when enabling.
199    */
200   char needs_flush_to_id;
201
202 } EditNurb;
203
204 typedef struct Curve {
205   ID id;
206   /** Animation data (must be immediately after id for utilities to use it). */
207   struct AnimData *adt;
208
209   /** Actual data, called splines in rna. */
210   ListBase nurb;
211
212   /** Edited data, not in file, use pointer so we can check for it. */
213   EditNurb *editnurb;
214
215   struct Object *bevobj, *taperobj, *textoncurve;
216   /** Old animation system, deprecated for 2.5. */
217   struct Ipo *ipo DNA_DEPRECATED;
218   struct Key *key;
219   struct Material **mat;
220
221   struct CurveProfile *bevel_profile;
222
223   /* texture space, copied as one block in editobject.c */
224   float loc[3];
225   float size[3];
226
227   /** Creation-time type of curve datablock. */
228   short type;
229
230   /** Keep a short because of BKE_object_obdata_texspace_get(). */
231   short texflag;
232   char _pad0[6];
233   short twist_mode;
234   float twist_smooth, smallcaps_scale;
235
236   int pathlen;
237   short bevresol, totcol;
238   int flag;
239   float width, ext1, ext2;
240
241   /* default */
242   short resolu, resolv;
243   short resolu_ren, resolv_ren;
244
245   /* edit, index in nurb list */
246   int actnu;
247   /* edit, index in active nurb (BPoint or BezTriple) */
248   int actvert;
249
250   char overflow;
251   char spacemode, align_y;
252   char bevel_mode;
253   /**
254    * Determine how the effective radius of the bevel point is computed when a taper object is
255    * specified. The effective radius is a function of the bevel point radius and the taper radius.
256    */
257   char taper_radius_mode;
258   char _pad;
259
260   /* font part */
261   short lines;
262   float spacing, linedist, shear, fsize, wordspace, ulpos, ulheight;
263   float xof, yof;
264   float linewidth;
265
266   /* copy of EditFont vars (wchar_t aligned),
267    * warning! don't use in editmode (storage only) */
268   int pos;
269   int selstart, selend;
270
271   /* text data */
272   /**
273    * Number of characters (unicode code-points)
274    * This is the length of #Curve.strinfo and the result of `BLI_strlen_utf8(cu->str)`.
275    */
276   int len_char32;
277   /** Number of bytes: `strlen(Curve.str)`. */
278   int len;
279   char *str;
280   struct EditFont *editfont;
281
282   char family[64];
283   struct VFont *vfont;
284   struct VFont *vfontb;
285   struct VFont *vfonti;
286   struct VFont *vfontbi;
287
288   struct TextBox *tb;
289   int totbox, actbox;
290
291   struct CharInfo *strinfo;
292   struct CharInfo curinfo;
293   /* font part end */
294
295   /** Current evaltime - for use by Objects parented to curves. */
296   float ctime;
297   float bevfac1, bevfac2;
298   char bevfac1_mapping, bevfac2_mapping;
299
300   char _pad2[6];
301   float fsize_realtime;
302
303   void *batch_cache;
304 } Curve;
305
306 #define CURVE_VFONT_ANY(cu) ((cu)->vfont), ((cu)->vfontb), ((cu)->vfonti), ((cu)->vfontbi)
307
308 /* **************** CURVE ********************* */
309
310 /* Curve.texflag */
311 enum {
312   CU_AUTOSPACE = 1,
313   CU_AUTOSPACE_EVALUATED = 2,
314 };
315
316 #if 0 /* Moved to overlay options in 2.8 */
317 /* Curve.drawflag */
318 enum {
319   CU_HIDE_HANDLES = 1 << 0,
320   CU_HIDE_NORMALS = 1 << 1,
321 };
322 #endif
323
324 /* Curve.flag */
325 enum {
326   CU_3D = 1 << 0,
327   CU_FRONT = 1 << 1,
328   CU_BACK = 1 << 2,
329   CU_PATH = 1 << 3,
330   CU_FOLLOW = 1 << 4,
331   /* CU_UV_ORCO = 1 << 5, */ /* DEPRECATED */
332   CU_DEFORM_BOUNDS_OFF = 1 << 6,
333   CU_STRETCH = 1 << 7,
334   /* CU_OFFS_PATHDIST   = 1 << 8, */  /* DEPRECATED */
335   CU_FAST = 1 << 9,                   /* Font: no filling inside editmode */
336   /* CU_RETOPO          = 1 << 10, */ /* DEPRECATED */
337   CU_DS_EXPAND = 1 << 11,
338   /** make use of the path radius if this is enabled (default for new curves) */
339   CU_PATH_RADIUS = 1 << 12,
340   /** fill 2d curve after deformation */
341   CU_DEFORM_FILL = 1 << 13,
342   /** fill bevel caps */
343   CU_FILL_CAPS = 1 << 14,
344   /** map taper object to beveled area */
345   CU_MAP_TAPER = 1 << 15,
346 };
347
348 /* Curve.twist_mode */
349 enum {
350   CU_TWIST_Z_UP = 0,
351   /* CU_TWIST_Y_UP      = 1, */ /* not used yet */
352   /* CU_TWIST_X_UP      = 2, */
353   CU_TWIST_MINIMUM = 3,
354   CU_TWIST_TANGENT = 4,
355 };
356
357 /* Curve.bevfac1_mapping, Curve.bevfac2_mapping, bevel factor mapping */
358 enum {
359   CU_BEVFAC_MAP_RESOLU = 0,
360   CU_BEVFAC_MAP_SEGMENT = 1,
361   CU_BEVFAC_MAP_SPLINE = 2,
362 };
363
364 /* Curve.spacemode */
365 enum {
366   CU_ALIGN_X_LEFT = 0,
367   CU_ALIGN_X_MIDDLE = 1,
368   CU_ALIGN_X_RIGHT = 2,
369   CU_ALIGN_X_JUSTIFY = 3,
370   CU_ALIGN_X_FLUSH = 4,
371 };
372
373 /* Curve.align_y */
374 enum {
375   CU_ALIGN_Y_TOP_BASELINE = 0,
376   CU_ALIGN_Y_TOP = 1,
377   CU_ALIGN_Y_CENTER = 2,
378   CU_ALIGN_Y_BOTTOM_BASELINE = 3,
379   CU_ALIGN_Y_BOTTOM = 4,
380 };
381
382 /* Curve.bevel_mode */
383 enum {
384   CU_BEV_MODE_ROUND = 0,
385   CU_BEV_MODE_OBJECT = 1,
386   CU_BEV_MODE_CURVE_PROFILE = 2,
387 };
388
389 /** #Curve.taper_radius_mode */
390 enum {
391   /** Override the radius of the bevel point with the taper radius. */
392   CU_TAPER_RADIUS_OVERRIDE = 0,
393   /** Multiply the radius of the bevel point by the taper radius. */
394   CU_TAPER_RADIUS_MULTIPLY = 1,
395   /** Add the radius of the bevel point to the taper radius. */
396   CU_TAPER_RADIUS_ADD = 2,
397 };
398
399 /* Curve.overflow. */
400 enum {
401   CU_OVERFLOW_NONE = 0,
402   CU_OVERFLOW_SCALE = 1,
403   CU_OVERFLOW_TRUNCATE = 2,
404 };
405
406 /* Nurb.flag */
407 enum {
408   CU_SMOOTH = 1 << 0,
409 };
410
411 /* Nurb.type */
412 enum {
413   CU_POLY = 0,
414   CU_BEZIER = 1,
415   CU_BSPLINE = 2,
416   CU_CARDINAL = 3,
417   CU_NURBS = 4,
418   CU_TYPE = (CU_POLY | CU_BEZIER | CU_BSPLINE | CU_CARDINAL | CU_NURBS),
419
420   /* only for adding */
421   CU_PRIMITIVE = 0xF00,
422
423   /* 2 or 4 points */
424   CU_PRIM_CURVE = 0x100,
425   /* 8 points circle */
426   CU_PRIM_CIRCLE = 0x200,
427   /* 4x4 patch Nurb */
428   CU_PRIM_PATCH = 0x300,
429   CU_PRIM_TUBE = 0x400,
430   CU_PRIM_SPHERE = 0x500,
431   CU_PRIM_DONUT = 0x600,
432   /* 5 points,  5th order straight line (for anim path) */
433   CU_PRIM_PATH = 0x700,
434 };
435
436 /* Nurb.flagu, Nurb.flagv */
437 enum {
438   CU_NURB_CYCLIC = 1 << 0,
439   CU_NURB_ENDPOINT = 1 << 1,
440   CU_NURB_BEZIER = 1 << 2,
441 };
442
443 #define CU_ACT_NONE -1
444
445 /* *************** BEZTRIPLE **************** */
446
447 /* BezTriple.f1,2,3 */
448 typedef enum eBezTriple_Flag {
449   /* SELECT */
450   BEZT_FLAG_TEMP_TAG = (1 << 1), /* always clear. */
451 } eBezTriple_Flag;
452
453 /* h1 h2 (beztriple) */
454 typedef enum eBezTriple_Handle {
455   HD_FREE = 0,
456   HD_AUTO = 1,
457   HD_VECT = 2,
458   HD_ALIGN = 3,
459   HD_AUTO_ANIM = 4,        /* auto-clamped handles for animation */
460   HD_ALIGN_DOUBLESIDE = 5, /* align handles, displayed both of them. used for masks */
461 } eBezTriple_Handle;
462
463 /* auto_handle_type (beztriple) */
464 typedef enum eBezTriple_Auto_Type {
465   /* Normal automatic handle that can be refined further. */
466   HD_AUTOTYPE_NORMAL = 0,
467   /* Handle locked horizontal due to being an Auto Clamped local
468    * extreme or a curve endpoint with Constant extrapolation.
469    * Further smoothing is disabled. */
470   HD_AUTOTYPE_LOCKED_FINAL = 1,
471 } eBezTriple_Auto_Type;
472
473 /* interpolation modes (used only for BezTriple->ipo) */
474 typedef enum eBezTriple_Interpolation {
475   /* traditional interpolation */
476   BEZT_IPO_CONST = 0, /* constant interpolation */
477   BEZT_IPO_LIN = 1,   /* linear interpolation */
478   BEZT_IPO_BEZ = 2,   /* bezier interpolation */
479
480   /* easing equations */
481   BEZT_IPO_BACK = 3,
482   BEZT_IPO_BOUNCE = 4,
483   BEZT_IPO_CIRC = 5,
484   BEZT_IPO_CUBIC = 6,
485   BEZT_IPO_ELASTIC = 7,
486   BEZT_IPO_EXPO = 8,
487   BEZT_IPO_QUAD = 9,
488   BEZT_IPO_QUART = 10,
489   BEZT_IPO_QUINT = 11,
490   BEZT_IPO_SINE = 12,
491 } eBezTriple_Interpolation;
492
493 /* easing modes (used only for Keyframes - BezTriple->easing) */
494 typedef enum eBezTriple_Easing {
495   BEZT_IPO_EASE_AUTO = 0,
496
497   BEZT_IPO_EASE_IN = 1,
498   BEZT_IPO_EASE_OUT = 2,
499   BEZT_IPO_EASE_IN_OUT = 3,
500 } eBezTriple_Easing;
501
502 /* types of keyframe (used only for BezTriple->hide when BezTriple is used in F-Curves) */
503 typedef enum eBezTriple_KeyframeType {
504   BEZT_KEYTYPE_KEYFRAME = 0,  /* default - 'proper' Keyframe */
505   BEZT_KEYTYPE_EXTREME = 1,   /* 'extreme' keyframe */
506   BEZT_KEYTYPE_BREAKDOWN = 2, /* 'breakdown' keyframe */
507   BEZT_KEYTYPE_JITTER = 3,    /* 'jitter' keyframe (for adding 'filler' secondary motion) */
508   BEZT_KEYTYPE_MOVEHOLD = 4,  /* one end of a 'moving hold' */
509 } eBezTriple_KeyframeType;
510
511 /* checks if the given BezTriple is selected */
512 #define BEZT_ISSEL_ANY(bezt) \
513   (((bezt)->f2 & SELECT) || ((bezt)->f1 & SELECT) || ((bezt)->f3 & SELECT))
514 #define BEZT_ISSEL_ALL(bezt) \
515   (((bezt)->f2 & SELECT) && ((bezt)->f1 & SELECT) && ((bezt)->f3 & SELECT))
516 #define BEZT_ISSEL_ALL_HIDDENHANDLES(v3d, bezt) \
517   ((((v3d) != NULL) && ((v3d)->overlay.handle_display == CURVE_HANDLE_NONE)) ? \
518        (bezt)->f2 & SELECT : \
519        BEZT_ISSEL_ALL(bezt))
520 #define BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt) \
521   ((((v3d) != NULL) && ((v3d)->overlay.handle_display == CURVE_HANDLE_NONE)) ? \
522        (bezt)->f2 & SELECT : \
523        BEZT_ISSEL_ANY(bezt))
524
525 #define BEZT_ISSEL_IDX(bezt, i) \
526   ((i == 0 && (bezt)->f1 & SELECT) || (i == 1 && (bezt)->f2 & SELECT) || \
527    (i == 2 && (bezt)->f3 & SELECT))
528
529 #define BEZT_SEL_ALL(bezt) \
530   { \
531     (bezt)->f1 |= SELECT; \
532     (bezt)->f2 |= SELECT; \
533     (bezt)->f3 |= SELECT; \
534   } \
535   ((void)0)
536 #define BEZT_DESEL_ALL(bezt) \
537   { \
538     (bezt)->f1 &= ~SELECT; \
539     (bezt)->f2 &= ~SELECT; \
540     (bezt)->f3 &= ~SELECT; \
541   } \
542   ((void)0)
543 #define BEZT_SEL_INVERT(bezt) \
544   { \
545     (bezt)->f1 ^= SELECT; \
546     (bezt)->f2 ^= SELECT; \
547     (bezt)->f3 ^= SELECT; \
548   } \
549   ((void)0)
550
551 #define BEZT_SEL_IDX(bezt, i) \
552   { \
553     switch (i) { \
554       case 0: \
555         (bezt)->f1 |= SELECT; \
556         break; \
557       case 1: \
558         (bezt)->f2 |= SELECT; \
559         break; \
560       case 2: \
561         (bezt)->f3 |= SELECT; \
562         break; \
563       default: \
564         break; \
565     } \
566   } \
567   ((void)0)
568
569 #define BEZT_DESEL_IDX(bezt, i) \
570   { \
571     switch (i) { \
572       case 0: \
573         (bezt)->f1 &= ~SELECT; \
574         break; \
575       case 1: \
576         (bezt)->f2 &= ~SELECT; \
577         break; \
578       case 2: \
579         (bezt)->f3 &= ~SELECT; \
580         break; \
581       default: \
582         break; \
583     } \
584   } \
585   ((void)0)
586
587 #define BEZT_IS_AUTOH(bezt) \
588   (ELEM((bezt)->h1, HD_AUTO, HD_AUTO_ANIM) && ELEM((bezt)->h2, HD_AUTO, HD_AUTO_ANIM))
589
590 /* *************** CHARINFO **************** */
591
592 /* CharInfo.flag */
593 enum {
594   /* note: CU_CHINFO_WRAP, CU_CHINFO_SMALLCAPS_TEST and CU_CHINFO_TRUNCATE are set dynamically */
595   CU_CHINFO_BOLD = 1 << 0,
596   CU_CHINFO_ITALIC = 1 << 1,
597   CU_CHINFO_UNDERLINE = 1 << 2,
598   /** Word-wrap occurred here. */
599   CU_CHINFO_WRAP = 1 << 3,
600   CU_CHINFO_SMALLCAPS = 1 << 4,
601   /** Set at runtime, checks if case switching is needed. */
602   CU_CHINFO_SMALLCAPS_CHECK = 1 << 5,
603   /** Set at runtime, indicates char that doesn't fit in text boxes. */
604   CU_CHINFO_OVERFLOW = 1 << 6,
605 };
606
607 /* mixed with KEY_LINEAR but define here since only curve supports */
608 #define KEY_CU_EASE 3
609
610 /* indicates point has been seen during surface duplication */
611 #define SURF_SEEN 4
612
613 #ifdef __cplusplus
614 }
615 #endif