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