Comments
[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 StripElem {
57         char name[256];
58         int orig_width, orig_height;
59 } StripElem;
60
61 typedef struct StripCrop {
62         int top;
63         int bottom;
64         int left;
65         int right;
66 } StripCrop;
67
68 typedef struct StripTransform {
69         int xofs;
70         int yofs;
71 } StripTransform;
72
73 typedef struct StripColorBalance {
74         float lift[3];
75         float gamma[3];
76         float gain[3];
77         int flag;
78         int pad;
79         // float exposure;
80         // float saturation;
81 } StripColorBalance;
82
83 typedef struct StripProxy {
84         char dir[768];         // custom directory for index and proxy files
85                                // (defaults to BL_proxy)
86
87         char file[256];        // custom file
88         struct anim *anim;     // custom proxy anim file
89
90         short tc;              // time code in use
91
92         short quality;         // proxy build quality
93         short build_size_flags; // size flags (see below) of all proxies
94                                // to build
95         short build_tc_flags;  // time code flags (see below) of all tc indices
96                                // to build
97 } StripProxy;
98
99 typedef struct Strip {
100         struct Strip *next, *prev;
101         int us, done;
102         int startstill, endstill;
103         StripElem *stripdata;  /* 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         char dir[768];
107         StripProxy *proxy;
108         StripCrop *crop;
109         StripTransform *transform;
110         StripColorBalance *color_balance DNA_DEPRECATED;
111
112         /* color management */
113         ColorManagedColorspaceSettings colorspace_settings;
114 } Strip;
115
116 /**
117  * The sequence structure is the basic struct used by any strip.
118  * each of the strips uses a different sequence structure.
119  *
120  * \warning The first part identical to ID (for use in ipo's)
121  * the commend above is historic, probably we can drop the ID compatibility,
122  * but take care making this change.
123  *
124  * \warning This is really a 'Strip' in the UI!, name is highly confusing.
125  */
126 typedef struct Sequence {
127         struct Sequence *next, *prev;
128         void *tmp; /* tmp var for copying, and tagging for linked selection */
129         void *lib; /* needed (to be like ipo), else it will raise libdata warnings, this should never be used */
130         char name[64]; /* SEQ_NAME_MAXSTR - name, set by default and needs to be unique, for RNA paths */
131
132         int flag, type; /*flags bitmap (see below) and the type of sequence*/
133         int len; /* the length of the contents of this strip - before handles are applied */
134         int start, startofs, endofs;
135         int startstill, endstill;
136         int machine, depth; /*machine - the strip channel, depth - the depth in the sequence when dealing with metastrips */
137         int startdisp, enddisp; /*starting and ending points in the sequence*/
138         float sat;
139         float mul, handsize;
140
141         short anim_preseek;
142         short streamindex;    /* streamindex for movie or sound files with several streams */
143         int multicam_source;  /* for multicam source selection */
144         int clip_flag;        /* MOVIECLIP render flags */
145
146         Strip *strip;
147
148         struct Ipo *ipo DNA_DEPRECATED;   /* old animation system, deprecated for 2.5 */
149
150         /* these ID vars should never be NULL but can be when linked libs fail to load, so check on access */
151         struct Scene     *scene;
152         struct Object    *scene_camera;  /* override scene camera */
153         struct MovieClip *clip;          /* for MOVIECLIP strips */
154         struct Mask      *mask;          /* for MASK strips */
155
156         struct anim *anim;      /* for MOVIE strips */
157
158         float effect_fader;
159         float speed_fader;
160
161         /* pointers for effects: */
162         struct Sequence *seq1, *seq2, *seq3;
163
164         ListBase seqbase;       /* list of strips for metastrips */
165
166         struct bSound *sound;   /* the linked "bSound" object */
167         void *scene_sound;
168         float volume;
169
170         float pitch, pan;     /* pitch (-0.1..10), pan -2..2 */
171         float strobe;
172
173         void *effectdata;     /* Struct pointer for effect settings */
174
175         int anim_startofs;    /* only use part of animation file */
176         int anim_endofs;      /* is subtle different to startofs / endofs */
177
178
179         int blend_mode;
180         float blend_opacity;
181
182         /* is sfra needed anymore? - it looks like its only used in one place */
183         int sfra;  /* starting frame according to the timeline of the scene. */
184
185         char alpha_mode;
186         char pad[3];
187
188         /* modifiers */
189         ListBase modifiers;
190 } Sequence;
191
192 typedef struct MetaStack {
193         struct MetaStack *next, *prev;
194         ListBase *oldbasep;
195         Sequence *parseq;
196 } MetaStack;
197
198 typedef struct Editing {
199         ListBase *seqbasep; /* pointer to the current list of seq's being edited (can be within a meta strip) */
200         ListBase seqbase;   /* pointer to the top-most seq's */
201         ListBase metastack;
202         
203         /* Context vars, used to be static */
204         Sequence *act_seq;
205         char act_imagedir[1024]; /* 1024 = FILE_MAX */
206         char act_sounddir[1024]; /* 1024 = FILE_MAX */
207
208         int over_ofs, over_cfra;
209         int over_flag, pad;
210         rctf over_border;
211 } Editing;
212
213 /* ************* Effect Variable Structs ********* */
214 typedef struct WipeVars {
215         float edgeWidth, angle;
216         short forward, wipetype;
217 } WipeVars;
218
219 typedef struct GlowVars {       
220         float fMini;    /*      Minimum intensity to trigger a glow */
221         float fClamp;
222         float fBoost;   /*      Amount to multiply glow intensity */
223         float dDist;    /*      Radius of glow blurring */
224         int dQuality;
225         int bNoComp;    /*      SHOW/HIDE glow buffer */
226 } GlowVars;
227
228 typedef struct TransformVars {
229         float ScalexIni;
230         float ScaleyIni;
231         float xIni;
232         float yIni;
233         float rotIni;
234         int percent;
235         int interpolation;
236         int uniform_scale; /* preserve aspect/ratio when scaling */
237 } TransformVars;
238
239 typedef struct SolidColorVars {
240         float col[3];
241         float pad;
242 } SolidColorVars;
243
244 typedef struct SpeedControlVars {
245         float *frameMap;
246         float globalSpeed;
247         int flags;
248         int length;
249         int lastValidFrame;
250 } SpeedControlVars;
251
252 typedef struct GaussianBlurVars {
253         float size_x;
254         float size_y;
255 } GaussianBlurVars;
256
257 /* ***************** Sequence modifiers ****************** */
258
259 typedef struct SequenceModifierData {
260         struct SequenceModifierData *next, *prev;
261         int type, flag;
262         char name[64]; /* MAX_NAME */
263
264         /* mask input, either sequence or maks ID */
265         int mask_input_type, pad;
266
267         struct Sequence *mask_sequence;
268         struct Mask     *mask_id;
269 } SequenceModifierData;
270
271 typedef struct ColorBalanceModifierData {
272         SequenceModifierData modifier;
273
274         StripColorBalance color_balance;
275         float color_multiply;
276 } ColorBalanceModifierData;
277
278 typedef struct CurvesModifierData {
279         SequenceModifierData modifier;
280
281         struct CurveMapping curve_mapping;
282 } CurvesModifierData;
283
284 typedef struct HueCorrectModifierData {
285         SequenceModifierData modifier;
286
287         struct CurveMapping curve_mapping;
288 } HueCorrectModifierData;
289
290 typedef struct BrightContrastModifierData {
291         SequenceModifierData modifier;
292
293         float bright;
294         float contrast;
295 } BrightContrastModifierData;
296
297 typedef struct SequencerMaskModifierData {
298         SequenceModifierData modifier;
299 } SequencerMaskModifierData;
300
301 /* ***************** Scopes ****************** */
302
303 typedef struct SequencerScopes {
304         struct ImBuf *reference_ibuf;
305
306         struct ImBuf *zebra_ibuf;
307         struct ImBuf *waveform_ibuf;
308         struct ImBuf *sep_waveform_ibuf;
309         struct ImBuf *vector_ibuf;
310         struct ImBuf *histogram_ibuf;
311 } SequencerScopes;
312
313 #define MAXSEQ          32
314
315 #define SELECT 1
316
317 /* Editor->over_flag */
318 #define SEQ_EDIT_OVERLAY_SHOW           1
319 #define SEQ_EDIT_OVERLAY_ABS            2
320
321 #define SEQ_STRIP_OFSBOTTOM     0.2f
322 #define SEQ_STRIP_OFSTOP        0.8f
323
324 /* SpeedControlVars->flags */
325 #define SEQ_SPEED_INTEGRATE      1
326 /* #define SEQ_SPEED_BLEND          2 */ /* DEPRECATED */
327 #define SEQ_SPEED_COMPRESS_IPO_Y 4
328
329 /* ***************** SEQUENCE ****************** */
330 #define SEQ_NAME_MAXSTR         64
331
332 /* seq->flag */
333 enum {
334         SEQ_LEFTSEL                 = (1 << 1),
335         SEQ_RIGHTSEL                = (1 << 2),
336         SEQ_OVERLAP                 = (1 << 3),
337         SEQ_FILTERY                 = (1 << 4),
338         SEQ_MUTE                    = (1 << 5),
339         SEQ_MAKE_PREMUL             = (1 << 6), /* deprecated, used for compatibility code only */
340         SEQ_REVERSE_FRAMES          = (1 << 7),
341         SEQ_IPO_FRAME_LOCKED        = (1 << 8),
342         SEQ_EFFECT_NOT_LOADED       = (1 << 9),
343         SEQ_FLAG_DELETE             = (1 << 10),
344         SEQ_FLIPX                   = (1 << 11),
345         SEQ_FLIPY                   = (1 << 12),
346         SEQ_MAKE_FLOAT              = (1 << 13),
347         SEQ_LOCK                    = (1 << 14),
348         SEQ_USE_PROXY               = (1 << 15),
349         SEQ_USE_TRANSFORM           = (1 << 16),
350         SEQ_USE_CROP                = (1 << 17),
351         /* SEQ_USE_COLOR_BALANCE       = (1 << 18), */ /* DEPRECATED */
352         SEQ_USE_PROXY_CUSTOM_DIR    = (1 << 19),
353
354         SEQ_USE_PROXY_CUSTOM_FILE   = (1 << 21),
355         SEQ_USE_EFFECT_DEFAULT_FADE = (1 << 22),
356         SEQ_USE_LINEAR_MODIFIERS    = (1 << 23),
357
358         /* flags for whether those properties are animated or not */
359         SEQ_AUDIO_VOLUME_ANIMATED   = (1 << 24),
360         SEQ_AUDIO_PITCH_ANIMATED    = (1 << 25),
361         SEQ_AUDIO_PAN_ANIMATED      = (1 << 26),
362         SEQ_AUDIO_DRAW_WAVEFORM     = (1 << 27),
363
364         SEQ_INVALID_EFFECT          = (1 << 31),
365 };
366
367 #if (DNA_DEPRECATED_GCC_POISON == 1)
368 #pragma GCC poison SEQ_MAKE_PREMUL
369 #endif
370
371 /* convenience define for all selection flags */
372 #define SEQ_ALLSEL  (SELECT + SEQ_LEFTSEL + SEQ_RIGHTSEL)
373
374 /* deprecated, don't use a flag anymore*/
375 /*#define SEQ_ACTIVE                            1048576*/
376
377 #define SEQ_COLOR_BALANCE_INVERSE_GAIN 1
378 #define SEQ_COLOR_BALANCE_INVERSE_GAMMA 2
379 #define SEQ_COLOR_BALANCE_INVERSE_LIFT 4
380
381 /* !!! has to be same as IMB_imbuf.h IMB_PROXY_... and IMB_TC_... */
382
383 #define SEQ_PROXY_IMAGE_SIZE_25                 1
384 #define SEQ_PROXY_IMAGE_SIZE_50                 2
385 #define SEQ_PROXY_IMAGE_SIZE_75                 4
386 #define SEQ_PROXY_IMAGE_SIZE_100                8
387
388 #define SEQ_PROXY_TC_NONE                       0
389 #define SEQ_PROXY_TC_RECORD_RUN                 1
390 #define SEQ_PROXY_TC_FREE_RUN                   2
391 #define SEQ_PROXY_TC_INTERP_REC_DATE_FREE_RUN   4
392 #define SEQ_PROXY_TC_RECORD_RUN_NO_GAPS         8
393 #define SEQ_PROXY_TC_ALL                        15
394
395 /* seq->alpha_mode */
396 enum {
397         SEQ_ALPHA_STRAIGHT = 0,
398         SEQ_ALPHA_PREMUL   = 1
399 };
400
401 /* seq->type WATCH IT: SEQ_TYPE_EFFECT BIT is used to determine if this is an effect strip!!! */
402 enum {
403         SEQ_TYPE_IMAGE       = 0,
404         SEQ_TYPE_META        = 1,
405         SEQ_TYPE_SCENE       = 2,
406         SEQ_TYPE_MOVIE       = 3,
407         SEQ_TYPE_SOUND_RAM   = 4,
408         SEQ_TYPE_SOUND_HD    = 5,
409         SEQ_TYPE_MOVIECLIP   = 6,
410         SEQ_TYPE_MASK        = 7,
411
412         SEQ_TYPE_EFFECT      = 8,
413         SEQ_TYPE_CROSS       = 8,
414         SEQ_TYPE_ADD         = 9,
415         SEQ_TYPE_SUB         = 10,
416         SEQ_TYPE_ALPHAOVER   = 11,
417         SEQ_TYPE_ALPHAUNDER  = 12,
418         SEQ_TYPE_GAMCROSS    = 13,
419         SEQ_TYPE_MUL         = 14,
420         SEQ_TYPE_OVERDROP    = 15,
421         /* SEQ_TYPE_PLUGIN      = 24, */ /* Deprecated */
422         SEQ_TYPE_WIPE        = 25,
423         SEQ_TYPE_GLOW        = 26,
424         SEQ_TYPE_TRANSFORM   = 27,
425         SEQ_TYPE_COLOR       = 28,
426         SEQ_TYPE_SPEED       = 29,
427         SEQ_TYPE_MULTICAM    = 30,
428         SEQ_TYPE_ADJUSTMENT  = 31,
429         SEQ_TYPE_GAUSSIAN_BLUR = 40,
430         SEQ_TYPE_EFFECT_MAX  = 40
431 };
432
433 #define SEQ_MOVIECLIP_RENDER_UNDISTORTED (1 << 0)
434 #define SEQ_MOVIECLIP_RENDER_STABILIZED  (1 << 1)
435
436 #define SEQ_BLEND_REPLACE      0
437 /* all other BLEND_MODEs are simple SEQ_TYPE_EFFECT ids and therefore identical
438  * to the table above. (Only those effects that handle _exactly_ two inputs,
439  * otherwise, you can't really blend, right :) !)
440  */
441
442
443 #define SEQ_HAS_PATH(_seq) (ELEM((_seq)->type, SEQ_TYPE_MOVIE, SEQ_TYPE_IMAGE, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD))
444
445 /* modifiers */
446
447 /* SequenceModifierData->type */
448 enum {
449         seqModifierType_ColorBalance   = 1,
450         seqModifierType_Curves         = 2,
451         seqModifierType_HueCorrect     = 3,
452         seqModifierType_BrightContrast = 4,
453         seqModifierType_Mask           = 5,
454
455         NUM_SEQUENCE_MODIFIER_TYPES
456 };
457
458 /* SequenceModifierData->flag */
459 enum {
460         SEQUENCE_MODIFIER_MUTE      = (1 << 0),
461         SEQUENCE_MODIFIER_EXPANDED  = (1 << 1),
462 };
463
464 enum {
465         SEQUENCE_MASK_INPUT_STRIP   = 0,
466         SEQUENCE_MASK_INPUT_ID      = 1
467 };
468
469 #endif  /* __DNA_SEQUENCE_TYPES_H__ */