ClangFormat: apply to source, most of intern
[blender.git] / source / blender / makesdna / DNA_sequence_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 /** \file
20  * \ingroup DNA
21  *
22  * Structs for use by the 'Sequencer' (Video Editor)
23  *
24  * Note on terminology
25  * - #Sequence: video/effect/audio data you can select and manipulate in the sequencer.
26  * - #Sequence.machine: Strange name for the channel.
27  * - #Strip: The data referenced by the #Sequence
28  * - Meta Strip (SEQ_TYPE_META): Support for nesting Sequences.
29  */
30
31 #ifndef __DNA_SEQUENCE_TYPES_H__
32 #define __DNA_SEQUENCE_TYPES_H__
33
34 #include "DNA_defs.h"
35 #include "DNA_color_types.h"
36 #include "DNA_listBase.h"
37 #include "DNA_vec_types.h"
38 #include "DNA_vfont_types.h"
39
40 struct Ipo;
41 struct MovieClip;
42 struct Scene;
43 struct bSound;
44
45 /* strlens; 256= FILE_MAXFILE, 768= FILE_MAXDIR */
46
47 typedef struct StripAnim {
48   struct StripAnim *next, *prev;
49   struct anim *anim;
50 } StripAnim;
51
52 typedef struct StripElem {
53   char name[256];
54   int orig_width, orig_height;
55 } StripElem;
56
57 typedef struct StripCrop {
58   int top;
59   int bottom;
60   int left;
61   int right;
62 } StripCrop;
63
64 typedef struct StripTransform {
65   int xofs;
66   int yofs;
67 } StripTransform;
68
69 typedef struct StripColorBalance {
70   float lift[3];
71   float gamma[3];
72   float gain[3];
73   int flag;
74   char _pad[4];
75   // float exposure;
76   // float saturation;
77 } StripColorBalance;
78
79 typedef struct StripProxy {
80   char dir[768];  // custom directory for index and proxy files
81                   // (defaults to BL_proxy)
82
83   char file[256];     // custom file
84   struct anim *anim;  // custom proxy anim file
85
86   short tc;  // time code in use
87
88   short quality;           // proxy build quality
89   short build_size_flags;  // size flags (see below) of all proxies
90                            // to build
91   short build_tc_flags;    // time code flags (see below) of all tc indices
92                            // to build
93   short build_flags;
94   char storage;
95   char _pad[5];
96 } StripProxy;
97
98 typedef struct Strip {
99   struct Strip *next, *prev;
100   int us, done;
101   int startstill, endstill;
102   /**
103    * Only used as an array in IMAGE sequences(!),
104    * and as a 1-element array in MOVIE sequences,
105    * NULL for all other strip-types.
106    */
107   StripElem *stripdata;
108   char dir[768];
109   StripProxy *proxy;
110   StripCrop *crop;
111   StripTransform *transform;
112   StripColorBalance *color_balance DNA_DEPRECATED;
113
114   /* color management */
115   ColorManagedColorspaceSettings colorspace_settings;
116 } Strip;
117
118 /**
119  * The sequence structure is the basic struct used by any strip.
120  * each of the strips uses a different sequence structure.
121  *
122  * \warning The first part identical to ID (for use in ipo's)
123  * the comment above is historic, probably we can drop the ID compatibility,
124  * but take care making this change.
125  *
126  * \warning This is really a 'Strip' in the UI!, name is highly confusing.
127  */
128 typedef struct Sequence {
129   struct Sequence *next, *prev;
130   /** Tmp var for copying, and tagging for linked selection. */
131   void *tmp;
132   /** Needed (to be like ipo), else it will raise libdata warnings, this should never be used. */
133   void *lib;
134   /** SEQ_NAME_MAXSTR - name, set by default and needs to be unique, for RNA paths. */
135   char name[64];
136
137   /**fLags bitmap (see below) and the type of sequenc.e*/
138   int flag, type;
139   /** The length of the contents of this strip - before handles are applied. */
140   int len;
141   /**
142    * Start frame of contents of strip in absolute frame coordinates.
143    * For metastrips start of first strip startdisp.
144    */
145   int start;
146   /**
147    * Frames after the first frame where display starts,
148    * frames before the last frame where display ends.
149    */
150   int startofs, endofs;
151   /**
152    * Frames that use the first frame before data begins,
153    * frames that use the last frame after data ends.
154    */
155   int startstill, endstill;
156   /** Machine: the strip channel, depth the depth in the sequence when dealing with metastrips. */
157   int machine, depth;
158   /** Starting and ending points of the strip in the sequenc.e*/
159   int startdisp, enddisp;
160   float sat;
161   float mul, handsize;
162
163   short anim_preseek;
164   /** Streamindex for movie or sound files with several streams. */
165   short streamindex;
166   /** For multicam source selection. */
167   int multicam_source;
168   /** MOVIECLIP render flags. */
169   int clip_flag;
170
171   Strip *strip;
172
173   /** Old animation system, deprecated for 2.5. */
174   struct Ipo *ipo DNA_DEPRECATED;
175
176   /** these ID vars should never be NULL but can be when linked libs fail to load,
177    * so check on access */
178   struct Scene *scene;
179   /** Override scene camera. */
180   struct Object *scene_camera;
181   /** For MOVIECLIP strips. */
182   struct MovieClip *clip;
183   /** For MASK strips. */
184   struct Mask *mask;
185   /** For MOVIE strips. */
186   ListBase anims;
187
188   float effect_fader;
189   float speed_fader;
190
191   /* pointers for effects: */
192   struct Sequence *seq1, *seq2, *seq3;
193
194   /** List of strips for metastrips. */
195   ListBase seqbase;
196
197   /** The linked "bSound" object. */
198   struct bSound *sound;
199   void *scene_sound;
200   float volume;
201
202   /** Pitch (-0.1..10), pan -2..2. */
203   float pitch, pan;
204   float strobe;
205
206   /** Struct pointer for effect settings. */
207   void *effectdata;
208
209   /** Only use part of animation file. */
210   int anim_startofs;
211   /** Is subtle different to startofs / endofs. */
212   int anim_endofs;
213
214   int blend_mode;
215   float blend_opacity;
216
217   /* is sfra needed anymore? - it looks like its only used in one place */
218   /** Starting frame according to the timeline of the scene. */
219   int sfra;
220
221   char alpha_mode;
222   char _pad[2];
223
224   /* Multiview */
225   char views_format;
226   struct Stereo3dFormat *stereo3d_format;
227
228   struct IDProperty *prop;
229
230   /* modifiers */
231   ListBase modifiers;
232 } Sequence;
233
234 typedef struct MetaStack {
235   struct MetaStack *next, *prev;
236   ListBase *oldbasep;
237   Sequence *parseq;
238   /* the startdisp/enddisp when entering the meta */
239   int disp_range[2];
240 } MetaStack;
241
242 typedef struct Editing {
243   /** Pointer to the current list of seq's being edited (can be within a meta strip). */
244   ListBase *seqbasep;
245   /** Pointer to the top-most seq's. */
246   ListBase seqbase;
247   ListBase metastack;
248
249   /* Context vars, used to be static */
250   Sequence *act_seq;
251   /** 1024 = FILE_MAX. */
252   char act_imagedir[1024];
253   /** 1024 = FILE_MAX. */
254   char act_sounddir[1024];
255   /** 1024 = FILE_MAX. */
256   char proxy_dir[1024];
257
258   int over_ofs, over_cfra;
259   int over_flag, proxy_storage;
260   rctf over_border;
261 } Editing;
262
263 /* ************* Effect Variable Structs ********* */
264 typedef struct WipeVars {
265   float edgeWidth, angle;
266   short forward, wipetype;
267 } WipeVars;
268
269 typedef struct GlowVars {
270   /** Minimum intensity to trigger a glow. */
271   float fMini;
272   float fClamp;
273   /** Amount to multiply glow intensity. */
274   float fBoost;
275   /** Radius of glow blurring. */
276   float dDist;
277   int dQuality;
278   /** SHOW/HIDE glow buffer. */
279   int bNoComp;
280 } GlowVars;
281
282 typedef struct TransformVars {
283   float ScalexIni;
284   float ScaleyIni;
285   float xIni;
286   float yIni;
287   float rotIni;
288   int percent;
289   int interpolation;
290   /** Preserve aspect/ratio when scaling. */
291   int uniform_scale;
292 } TransformVars;
293
294 typedef struct SolidColorVars {
295   float col[3];
296   char _pad[4];
297 } SolidColorVars;
298
299 typedef struct SpeedControlVars {
300   float *frameMap;
301   float globalSpeed;
302   int flags;
303   int length;
304   int lastValidFrame;
305 } SpeedControlVars;
306
307 typedef struct GaussianBlurVars {
308   float size_x;
309   float size_y;
310 } GaussianBlurVars;
311
312 typedef struct TextVars {
313   char text[512];
314   VFont *text_font;
315   int text_blf_id;
316   int text_size;
317   float color[4], shadow_color[4];
318   float loc[2];
319   float wrap_width;
320   char flag;
321   char align, align_y;
322   char _pad[1];
323 } TextVars;
324
325 /* TextVars.flag */
326 enum {
327   SEQ_TEXT_SHADOW = (1 << 0),
328 };
329
330 /* TextVars.align */
331 enum {
332   SEQ_TEXT_ALIGN_X_LEFT = 0,
333   SEQ_TEXT_ALIGN_X_CENTER = 1,
334   SEQ_TEXT_ALIGN_X_RIGHT = 2,
335 };
336
337 /* TextVars.align_y */
338 enum {
339   SEQ_TEXT_ALIGN_Y_TOP = 0,
340   SEQ_TEXT_ALIGN_Y_CENTER = 1,
341   SEQ_TEXT_ALIGN_Y_BOTTOM = 2,
342 };
343
344 #define SEQ_FONT_NOT_LOADED -2
345
346 typedef struct ColorMixVars {
347   /** Value from SEQ_TYPE_XXX enumeration. */
348   int blend_effect;
349   /** Blend factor [0.0f, 1.0f]. */
350   float factor;
351 } ColorMixVars;
352
353 /* ***************** Sequence modifiers ****************** */
354
355 typedef struct SequenceModifierData {
356   struct SequenceModifierData *next, *prev;
357   int type, flag;
358   /** MAX_NAME. */
359   char name[64];
360
361   /* mask input, either sequence or mask ID */
362   int mask_input_type;
363   int mask_time;
364
365   struct Sequence *mask_sequence;
366   struct Mask *mask_id;
367 } SequenceModifierData;
368
369 typedef struct ColorBalanceModifierData {
370   SequenceModifierData modifier;
371
372   StripColorBalance color_balance;
373   float color_multiply;
374 } ColorBalanceModifierData;
375
376 typedef struct CurvesModifierData {
377   SequenceModifierData modifier;
378
379   struct CurveMapping curve_mapping;
380 } CurvesModifierData;
381
382 typedef struct HueCorrectModifierData {
383   SequenceModifierData modifier;
384
385   struct CurveMapping curve_mapping;
386 } HueCorrectModifierData;
387
388 typedef struct BrightContrastModifierData {
389   SequenceModifierData modifier;
390
391   float bright;
392   float contrast;
393 } BrightContrastModifierData;
394
395 typedef struct SequencerMaskModifierData {
396   SequenceModifierData modifier;
397 } SequencerMaskModifierData;
398
399 typedef struct WhiteBalanceModifierData {
400   SequenceModifierData modifier;
401
402   float white_value[3];
403   char _pad[4];
404 } WhiteBalanceModifierData;
405
406 typedef struct SequencerTonemapModifierData {
407   SequenceModifierData modifier;
408
409   float key, offset, gamma;
410   float intensity, contrast, adaptation, correction;
411   int type;
412 } SequencerTonemapModifierData;
413
414 enum {
415   SEQ_TONEMAP_RH_SIMPLE = 0,
416   SEQ_TONEMAP_RD_PHOTORECEPTOR = 1,
417 };
418
419 /* ***************** Scopes ****************** */
420
421 typedef struct SequencerScopes {
422   struct ImBuf *reference_ibuf;
423
424   struct ImBuf *zebra_ibuf;
425   struct ImBuf *waveform_ibuf;
426   struct ImBuf *sep_waveform_ibuf;
427   struct ImBuf *vector_ibuf;
428   struct ImBuf *histogram_ibuf;
429 } SequencerScopes;
430
431 #define MAXSEQ 32
432
433 #define SELECT 1
434
435 /* Editor->over_flag */
436 #define SEQ_EDIT_OVERLAY_SHOW 1
437 #define SEQ_EDIT_OVERLAY_ABS 2
438
439 #define SEQ_STRIP_OFSBOTTOM 0.05f
440 #define SEQ_STRIP_OFSTOP 0.95f
441
442 /* Editor->proxy_storage */
443 /* store proxies in project directory */
444 #define SEQ_EDIT_PROXY_DIR_STORAGE 1
445
446 /* SpeedControlVars->flags */
447 #define SEQ_SPEED_INTEGRATE (1 << 0)
448 #define SEQ_SPEED_UNUSED_1 (1 << 1) /* cleared */
449 #define SEQ_SPEED_COMPRESS_IPO_Y (1 << 2)
450
451 /* ***************** SEQUENCE ****************** */
452 #define SEQ_NAME_MAXSTR 64
453
454 /* seq->flag */
455 enum {
456   /* SELECT */
457   SEQ_LEFTSEL = (1 << 1),
458   SEQ_RIGHTSEL = (1 << 2),
459   SEQ_OVERLAP = (1 << 3),
460   SEQ_FILTERY = (1 << 4),
461   SEQ_MUTE = (1 << 5),
462   SEQ_FLAG_UNUSED_6 = (1 << 6), /* cleared */
463   SEQ_REVERSE_FRAMES = (1 << 7),
464   SEQ_IPO_FRAME_LOCKED = (1 << 8),
465   SEQ_EFFECT_NOT_LOADED = (1 << 9),
466   SEQ_FLAG_DELETE = (1 << 10),
467   SEQ_FLIPX = (1 << 11),
468   SEQ_FLIPY = (1 << 12),
469   SEQ_MAKE_FLOAT = (1 << 13),
470   SEQ_LOCK = (1 << 14),
471   SEQ_USE_PROXY = (1 << 15),
472   SEQ_USE_TRANSFORM = (1 << 16),
473   SEQ_USE_CROP = (1 << 17),
474   SEQ_FLAG_UNUSED_18 = (1 << 18), /* cleared */
475   SEQ_FLAG_UNUSED_19 = (1 << 19), /* cleared */
476   SEQ_FLAG_UNUSED_21 = (1 << 21), /* cleared */
477
478   SEQ_USE_EFFECT_DEFAULT_FADE = (1 << 22),
479   SEQ_USE_LINEAR_MODIFIERS = (1 << 23),
480
481   /* flags for whether those properties are animated or not */
482   SEQ_AUDIO_VOLUME_ANIMATED = (1 << 24),
483   SEQ_AUDIO_PITCH_ANIMATED = (1 << 25),
484   SEQ_AUDIO_PAN_ANIMATED = (1 << 26),
485   SEQ_AUDIO_DRAW_WAVEFORM = (1 << 27),
486
487   /* don't include Grease Pencil in OpenGL previews of Scene strips */
488   SEQ_SCENE_NO_GPENCIL = (1 << 28),
489   SEQ_USE_VIEWS = (1 << 29),
490
491   /* access scene strips directly (like a metastrip) */
492   SEQ_SCENE_STRIPS = (1 << 30),
493
494   SEQ_INVALID_EFFECT = (1u << 31),
495 };
496
497 /* StripProxy->storage */
498 enum {
499   SEQ_STORAGE_PROXY_CUSTOM_FILE = (1 << 1), /* store proxy in custom directory */
500   SEQ_STORAGE_PROXY_CUSTOM_DIR = (1 << 2),  /* store proxy in custom file */
501 };
502
503 /* convenience define for all selection flags */
504 #define SEQ_ALLSEL (SELECT + SEQ_LEFTSEL + SEQ_RIGHTSEL)
505
506 /* deprecated, don't use a flag anymore*/
507 /*#define SEQ_ACTIVE                            1048576*/
508
509 #define SEQ_COLOR_BALANCE_INVERSE_GAIN 1
510 #define SEQ_COLOR_BALANCE_INVERSE_GAMMA 2
511 #define SEQ_COLOR_BALANCE_INVERSE_LIFT 4
512
513 /* !!! has to be same as IMB_imbuf.h IMB_PROXY_... and IMB_TC_... */
514
515 #define SEQ_PROXY_IMAGE_SIZE_25 1
516 #define SEQ_PROXY_IMAGE_SIZE_50 2
517 #define SEQ_PROXY_IMAGE_SIZE_75 4
518 #define SEQ_PROXY_IMAGE_SIZE_100 8
519
520 #define SEQ_PROXY_TC_NONE 0
521 #define SEQ_PROXY_TC_RECORD_RUN 1
522 #define SEQ_PROXY_TC_FREE_RUN 2
523 #define SEQ_PROXY_TC_INTERP_REC_DATE_FREE_RUN 4
524 #define SEQ_PROXY_TC_RECORD_RUN_NO_GAPS 8
525 #define SEQ_PROXY_TC_ALL 15
526
527 /* SeqProxy->build_flags */
528 enum {
529   SEQ_PROXY_SKIP_EXISTING = 1,
530 };
531
532 /* seq->alpha_mode */
533 enum {
534   SEQ_ALPHA_STRAIGHT = 0,
535   SEQ_ALPHA_PREMUL = 1,
536 };
537
538 /* seq->type WATCH IT: SEQ_TYPE_EFFECT BIT is used to determine if this is an effect strip!!! */
539 enum {
540   SEQ_TYPE_IMAGE = 0,
541   SEQ_TYPE_META = 1,
542   SEQ_TYPE_SCENE = 2,
543   SEQ_TYPE_MOVIE = 3,
544   SEQ_TYPE_SOUND_RAM = 4,
545   SEQ_TYPE_SOUND_HD = 5,
546   SEQ_TYPE_MOVIECLIP = 6,
547   SEQ_TYPE_MASK = 7,
548
549   SEQ_TYPE_EFFECT = 8,
550   SEQ_TYPE_CROSS = 8,
551   SEQ_TYPE_ADD = 9,
552   SEQ_TYPE_SUB = 10,
553   SEQ_TYPE_ALPHAOVER = 11,
554   SEQ_TYPE_ALPHAUNDER = 12,
555   SEQ_TYPE_GAMCROSS = 13,
556   SEQ_TYPE_MUL = 14,
557   SEQ_TYPE_OVERDROP = 15,
558   /* SEQ_TYPE_PLUGIN      = 24, */ /* Deprecated */
559   SEQ_TYPE_WIPE = 25,
560   SEQ_TYPE_GLOW = 26,
561   SEQ_TYPE_TRANSFORM = 27,
562   SEQ_TYPE_COLOR = 28,
563   SEQ_TYPE_SPEED = 29,
564   SEQ_TYPE_MULTICAM = 30,
565   SEQ_TYPE_ADJUSTMENT = 31,
566   SEQ_TYPE_GAUSSIAN_BLUR = 40,
567   SEQ_TYPE_TEXT = 41,
568   SEQ_TYPE_COLORMIX = 42,
569
570   /* Blend modes */
571   SEQ_TYPE_SCREEN = 43,
572   SEQ_TYPE_LIGHTEN = 44,
573   SEQ_TYPE_DODGE = 45,
574   SEQ_TYPE_DARKEN = 46,
575   SEQ_TYPE_BURN = 47,
576   SEQ_TYPE_LINEAR_BURN = 48,
577   SEQ_TYPE_OVERLAY = 49,
578   SEQ_TYPE_HARD_LIGHT = 50,
579   SEQ_TYPE_SOFT_LIGHT = 51,
580   SEQ_TYPE_PIN_LIGHT = 52,
581   SEQ_TYPE_LIN_LIGHT = 53,
582   SEQ_TYPE_VIVID_LIGHT = 54,
583   SEQ_TYPE_HUE = 55,
584   SEQ_TYPE_SATURATION = 56,
585   SEQ_TYPE_VALUE = 57,
586   SEQ_TYPE_BLEND_COLOR = 58,
587   SEQ_TYPE_DIFFERENCE = 59,
588   SEQ_TYPE_EXCLUSION = 60,
589
590   SEQ_TYPE_MAX = 60,
591 };
592
593 #define SEQ_MOVIECLIP_RENDER_UNDISTORTED (1 << 0)
594 #define SEQ_MOVIECLIP_RENDER_STABILIZED (1 << 1)
595
596 #define SEQ_BLEND_REPLACE 0
597 /* all other BLEND_MODEs are simple SEQ_TYPE_EFFECT ids and therefore identical
598  * to the table above. (Only those effects that handle _exactly_ two inputs,
599  * otherwise, you can't really blend, right :) !)
600  */
601
602 #define SEQ_HAS_PATH(_seq) \
603   (ELEM((_seq)->type, SEQ_TYPE_MOVIE, SEQ_TYPE_IMAGE, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD))
604
605 /* modifiers */
606
607 /* SequenceModifierData->type */
608 enum {
609   seqModifierType_ColorBalance = 1,
610   seqModifierType_Curves = 2,
611   seqModifierType_HueCorrect = 3,
612   seqModifierType_BrightContrast = 4,
613   seqModifierType_Mask = 5,
614   seqModifierType_WhiteBalance = 6,
615   seqModifierType_Tonemap = 7,
616
617   NUM_SEQUENCE_MODIFIER_TYPES,
618 };
619
620 /* SequenceModifierData->flag */
621 enum {
622   SEQUENCE_MODIFIER_MUTE = (1 << 0),
623   SEQUENCE_MODIFIER_EXPANDED = (1 << 1),
624 };
625
626 enum {
627   SEQUENCE_MASK_INPUT_STRIP = 0,
628   SEQUENCE_MASK_INPUT_ID = 1,
629 };
630
631 enum {
632   /* Mask animation will be remapped relative to the strip start frame. */
633   SEQUENCE_MASK_TIME_RELATIVE = 0,
634   /* Global (scene) frame number will be used to access the mask. */
635   SEQUENCE_MASK_TIME_ABSOLUTE = 1,
636 };
637
638 #endif /* __DNA_SEQUENCE_TYPES_H__ */