Merge branch 'blender2.7'
[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 \ingroup DNA
20  *
21  * Structs for use by the 'Sequencer' (Video Editor)
22  *
23  * Note on terminology
24  * - #Sequence: video/effect/audio data you can select and manipulate in the sequencer.
25  * - #Sequence.machine: Strange name for the channel.
26  * - #Strip: The data referenced by the #Sequence
27  * - Meta Strip (SEQ_TYPE_META): Support for nesting Sequences.
28  */
29
30 #ifndef __DNA_SEQUENCE_TYPES_H__
31 #define __DNA_SEQUENCE_TYPES_H__
32
33 #include "DNA_defs.h"
34 #include "DNA_color_types.h"
35 #include "DNA_listBase.h"
36 #include "DNA_vec_types.h"
37 #include "DNA_vfont_types.h"
38
39 struct Ipo;
40 struct MovieClip;
41 struct Scene;
42 struct bSound;
43
44 /* strlens; 256= FILE_MAXFILE, 768= FILE_MAXDIR */
45
46 typedef struct StripAnim {
47         struct StripAnim *next, *prev;
48         struct anim *anim;
49 } StripAnim;
50
51 typedef struct StripElem {
52         char name[256];
53         int orig_width, orig_height;
54 } StripElem;
55
56 typedef struct StripCrop {
57         int top;
58         int bottom;
59         int left;
60         int right;
61 } StripCrop;
62
63 typedef struct StripTransform {
64         int xofs;
65         int yofs;
66 } StripTransform;
67
68 typedef struct StripColorBalance {
69         float lift[3];
70         float gamma[3];
71         float gain[3];
72         int flag;
73         int pad;
74         // float exposure;
75         // float saturation;
76 } StripColorBalance;
77
78 typedef struct StripProxy {
79         char dir[768];         // custom directory for index and proxy files
80                                // (defaults to BL_proxy)
81
82         char file[256];        // custom file
83         struct anim *anim;     // custom proxy anim file
84
85         short tc;              // time code in use
86
87         short quality;         // proxy build quality
88         short build_size_flags; // size flags (see below) of all proxies
89                                // to build
90         short build_tc_flags;  // time code flags (see below) of all tc indices
91                                // to build
92         short build_flags;
93         char storage;
94         char pad[5];
95 } StripProxy;
96
97 typedef struct Strip {
98         struct Strip *next, *prev;
99         int us, done;
100         int startstill, endstill;
101         /**
102          * Only used as an array in IMAGE sequences(!),
103          * and as a 1-element array in MOVIE sequences,
104          * NULL for all other strip-types.
105          */
106         StripElem *stripdata;
107         char dir[768];
108         StripProxy *proxy;
109         StripCrop *crop;
110         StripTransform *transform;
111         StripColorBalance *color_balance DNA_DEPRECATED;
112
113         /* color management */
114         ColorManagedColorspaceSettings colorspace_settings;
115 } Strip;
116
117 /**
118  * The sequence structure is the basic struct used by any strip.
119  * each of the strips uses a different sequence structure.
120  *
121  * \warning The first part identical to ID (for use in ipo's)
122  * the comment above is historic, probably we can drop the ID compatibility,
123  * but take care making this change.
124  *
125  * \warning This is really a 'Strip' in the UI!, name is highly confusing.
126  */
127 typedef struct Sequence {
128         struct Sequence *next, *prev;
129         /** Tmp var for copying, and tagging for linked selection. */
130         void *tmp;
131         /** Needed (to be like ipo), else it will raise libdata warnings, this should never be used. */
132         void *lib;
133         /** SEQ_NAME_MAXSTR - name, set by default and needs to be unique, for RNA paths. */
134         char name[64];
135
136         /**fLags bitmap (see below) and the type of sequenc.e*/
137         int flag, type;
138         /** The length of the contents of this strip - before handles are applied. */
139         int len;
140         /**
141          * Start frame of contents of strip in absolute frame coordinates.
142          * For metastrips start of first strip startdisp.
143          */
144         int start;
145         /**
146          * Frames after the first frame where display starts,
147          * frames before the last frame where display ends.
148          */
149         int startofs, endofs;
150         /**
151          * Frames that use the first frame before data begins,
152          * frames that use the last frame after data ends.
153          */
154         int startstill, endstill;
155         /** Machine: the strip channel, depth the depth in the sequence when dealing with metastrips. */
156         int machine, depth;
157         /** Starting and ending points of the strip in the sequenc.e*/
158         int startdisp, enddisp;
159         float sat;
160         float mul, handsize;
161
162         short anim_preseek;
163         /** Streamindex for movie or sound files with several streams. */
164         short streamindex;
165         /** For multicam source selection. */
166         int multicam_source;
167         /** MOVIECLIP render flags. */
168         int clip_flag;
169
170         Strip *strip;
171
172         /** Old animation system, deprecated for 2.5. */
173         struct Ipo *ipo DNA_DEPRECATED;
174
175         /** these ID vars should never be NULL but can be when linked libs fail to load,
176          * so check on access */
177         struct Scene     *scene;
178         /** Override scene camera. */
179         struct Object    *scene_camera;
180         /** For MOVIECLIP strips. */
181         struct MovieClip *clip;
182         /** For MASK strips. */
183         struct Mask      *mask;
184         /** For MOVIE strips. */
185         ListBase anims;
186
187         float effect_fader;
188         float speed_fader;
189
190         /* pointers for effects: */
191         struct Sequence *seq1, *seq2, *seq3;
192
193         /** List of strips for metastrips. */
194         ListBase seqbase;
195
196         /** The linked "bSound" object. */
197         struct bSound *sound;
198         void *scene_sound;
199         float volume;
200
201         /** Pitch (-0.1..10), pan -2..2. */
202         float pitch, pan;
203         float strobe;
204
205         /** Struct pointer for effect settings. */
206         void *effectdata;
207
208         /** Only use part of animation file. */
209         int anim_startofs;
210         /** Is subtle different to startofs / endofs. */
211         int anim_endofs;
212
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         float pad;
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         float pad;
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_DEPRECATED_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_DEPRECATED_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_DEPRECATED_18      = (1 << 18),  /* cleared */
475         SEQ_FLAG_DEPRECATED_19      = (1 << 19),  /* cleared */
476         SEQ_FLAG_DEPRECATED_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
603 #define SEQ_HAS_PATH(_seq) (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__ */