Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / cinelerra / vautomation.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #include "clip.h"
23 #include "colors.h"
24 #include "edl.h"
25 #include "edlsession.h"
26 #include "floatauto.h"
27 #include "floatautos.h"
28 #include "intauto.h"
29 #include "intautos.h"
30 #include "maskautos.h"
31 #include "overlayframe.inc"
32 #include "transportque.inc"
33 #include "vautomation.h"
34
35
36 VAutomation::VAutomation(EDL *edl, Track *track)
37  : Automation(edl, track)
38 {
39 }
40
41
42
43 VAutomation::~VAutomation()
44 {
45 }
46
47
48 void VAutomation::create_objects()
49 {
50         Automation::create_objects();
51
52         autos[AUTOMATION_FADE] = new FloatAutos(edl, track, 100);
53         autos[AUTOMATION_FADE]->create_objects();
54
55         autos[AUTOMATION_MODE] = new IntAutos(edl, track, TRANSFER_NORMAL);
56         autos[AUTOMATION_MODE]->create_objects();
57
58         autos[AUTOMATION_MASK] = new MaskAutos(edl, track);
59         autos[AUTOMATION_MASK]->create_objects();
60
61         autos[AUTOMATION_CAMERA_X] = new FloatAutos(edl, track, 0.0);
62         autos[AUTOMATION_CAMERA_X]->create_objects();
63
64         autos[AUTOMATION_CAMERA_Y] = new FloatAutos(edl, track, 0.0);
65         autos[AUTOMATION_CAMERA_Y]->create_objects();
66
67         autos[AUTOMATION_PROJECTOR_X] = new FloatAutos(edl, track, 0.0);
68         autos[AUTOMATION_PROJECTOR_X]->create_objects();
69
70         autos[AUTOMATION_PROJECTOR_Y] = new FloatAutos(edl, track, 0.0);
71         autos[AUTOMATION_PROJECTOR_Y]->create_objects();
72
73         autos[AUTOMATION_CAMERA_Z] = new FloatAutos(edl, track, 1.0);
74         autos[AUTOMATION_CAMERA_Z]->create_objects();
75
76         autos[AUTOMATION_PROJECTOR_Z] = new FloatAutos(edl, track, 1.0);
77         autos[AUTOMATION_PROJECTOR_Z]->create_objects();
78         for(int i = 0; i < AUTOMATION_TOTAL; i++) {
79                 if (autos[i])
80                 {
81                         autos[i]->autoidx = i;
82                         autos[i]->autogrouptype = autogrouptype(i, autos[i]->track);
83                 }
84         }
85 }
86
87 int VAutomation::direct_copy_possible(int64_t start, int direction)
88 {
89         int64_t end = (direction == PLAY_FORWARD) ? (start + 1) : (start - 1);
90
91         if(!Automation::direct_copy_possible(start, direction))
92                 return 0;
93
94 // Automation is constant
95         double constant;
96         if(((FloatAutos*)autos[AUTOMATION_FADE])->automation_is_constant(
97                 start, end, direction, constant))
98         {
99                 if(!EQUIV(constant, 100))
100                         return 0;
101         }
102         else
103 // Automation varies
104                 return 0;
105
106 // Track must not be muted
107         if(autos[AUTOMATION_MUTE]->automation_is_constant(start, end))
108         {
109                 if(autos[AUTOMATION_MUTE]->get_automation_constant(start, end) > 0)
110                         return 0;
111         }
112         else
113                 return 0;
114
115 // Projector must be centered.
116         FloatAuto *previous = 0, *next = 0;
117         float z = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_Z])->
118                 get_value(start, direction, previous, next);
119         if(!EQUIV(z, 1)) return 0;
120
121         previous = 0;
122         next = 0;
123         float x = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_X])->
124                 get_value(start, direction, previous, next);
125         if(!EQUIV(x, 0)) return 0;
126         previous = 0;
127         next = 0;
128         float y = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_Y])->
129                 get_value(start, direction, previous, next);
130         if(!EQUIV(y, 0)) return 0;
131
132
133
134
135 // Camera must be centered
136         previous = 0;
137         next = 0;
138         z = ((FloatAutos*)autos[AUTOMATION_CAMERA_Z])->
139                 get_value(start, direction, previous, next);
140         if(!EQUIV(z, 1)) return 0;
141
142
143
144         previous = 0;
145         next = 0;
146         x = ((FloatAutos*)autos[AUTOMATION_CAMERA_X])->
147                 get_value(start, direction, previous, next);
148         if(!EQUIV(x, 0)) return 0;
149
150         previous = 0;
151         next = 0;
152         y = ((FloatAutos*)autos[AUTOMATION_CAMERA_Y])->
153                 get_value(start, direction, previous, next);
154
155         if(!EQUIV(y, 0)) return 0;
156
157 // No mask must exist
158         if(((MaskAutos*)autos[AUTOMATION_MASK])->mask_exists(start, direction))
159                 return 0;
160
161         return 1;
162 }
163
164 void VAutomation::get_projector(float *x,
165         float *y,
166         float *z,
167         int64_t position,
168         int direction)
169 {
170         FloatAuto *before, *after;
171         before = 0;
172         after = 0;
173         *x = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_X])->
174                 get_value(position, direction, before, after);
175         before = 0;
176         after = 0;
177         *y = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_Y])->
178                 get_value(position, direction, before, after);
179         before = 0;
180         after = 0;
181         *z = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_Z])->
182                 get_value(position, direction, before, after);
183 }
184
185
186 void VAutomation::get_camera(float *x,
187         float *y,
188         float *z,
189         int64_t position,
190         int direction)
191 {
192         FloatAuto *before, *after;
193         before = 0;
194         after = 0;
195         *x = ((FloatAutos*)autos[AUTOMATION_CAMERA_X])->
196                 get_value(position, direction, before, after);
197         before = 0;
198         after = 0;
199         *y = ((FloatAutos*)autos[AUTOMATION_CAMERA_Y])->
200                 get_value(position, direction, before, after);
201         before = 0;
202         after = 0;
203         *z = ((FloatAutos*)autos[AUTOMATION_CAMERA_Z])->
204                 get_value(position, direction, before, after);
205 }
206