4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
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.
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.
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
25 #include "edlsession.h"
26 #include "floatauto.h"
27 #include "floatautos.h"
30 #include "maskautos.h"
31 #include "overlayframe.inc"
32 #include "transportque.inc"
33 #include "vautomation.h"
36 VAutomation::VAutomation(EDL *edl, Track *track)
37 : Automation(edl, track)
43 VAutomation::~VAutomation()
48 void VAutomation::create_objects()
50 Automation::create_objects();
52 autos[AUTOMATION_FADE] = new FloatAutos(edl, track, 100);
53 autos[AUTOMATION_FADE]->create_objects();
55 autos[AUTOMATION_MODE] = new IntAutos(edl, track, TRANSFER_NORMAL);
56 autos[AUTOMATION_MODE]->create_objects();
58 autos[AUTOMATION_MASK] = new MaskAutos(edl, track);
59 autos[AUTOMATION_MASK]->create_objects();
61 autos[AUTOMATION_CAMERA_X] = new FloatAutos(edl, track, 0.0);
62 autos[AUTOMATION_CAMERA_X]->create_objects();
64 autos[AUTOMATION_CAMERA_Y] = new FloatAutos(edl, track, 0.0);
65 autos[AUTOMATION_CAMERA_Y]->create_objects();
67 autos[AUTOMATION_PROJECTOR_X] = new FloatAutos(edl, track, 0.0);
68 autos[AUTOMATION_PROJECTOR_X]->create_objects();
70 autos[AUTOMATION_PROJECTOR_Y] = new FloatAutos(edl, track, 0.0);
71 autos[AUTOMATION_PROJECTOR_Y]->create_objects();
73 autos[AUTOMATION_CAMERA_Z] = new FloatAutos(edl, track, 1.0);
74 autos[AUTOMATION_CAMERA_Z]->create_objects();
76 autos[AUTOMATION_PROJECTOR_Z] = new FloatAutos(edl, track, 1.0);
77 autos[AUTOMATION_PROJECTOR_Z]->create_objects();
80 int VAutomation::direct_copy_possible(int64_t start, int direction)
82 int64_t end = (direction == PLAY_FORWARD) ? (start + 1) : (start - 1);
84 if(!Automation::direct_copy_possible(start, direction))
87 // Automation is constant
89 if(((FloatAutos*)autos[AUTOMATION_FADE])->automation_is_constant(
90 start, end, direction, constant))
92 if(!EQUIV(constant, 100))
99 // Track must not be muted
100 if(autos[AUTOMATION_MUTE]->automation_is_constant(start, end))
102 if(autos[AUTOMATION_MUTE]->get_automation_constant(start, end) > 0)
108 // Projector must be centered.
109 FloatAuto *previous = 0, *next = 0;
110 float z = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_Z])->get_value(
111 start, direction, previous, next);
112 if(!EQUIV(z, 1)) return 0;
116 float x = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_X])->get_value(start,
120 if(!EQUIV(x, 0)) return 0;
123 float y = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_Y])->get_value(start,
127 if(!EQUIV(y, 0)) return 0;
132 // Camera must be centered
135 z = ((FloatAutos*)autos[AUTOMATION_CAMERA_Z])->get_value(
140 if(!EQUIV(z, 1)) return 0;
146 x = ((FloatAutos*)autos[AUTOMATION_CAMERA_X])->get_value(start,
150 if(!EQUIV(x, 0)) return 0;
154 y = ((FloatAutos*)autos[AUTOMATION_CAMERA_Y])->get_value(start,
159 if(!EQUIV(y, 0)) return 0;
161 // No mask must exist
162 if(((MaskAutos*)autos[AUTOMATION_MASK])->mask_exists(start, direction))
168 void VAutomation::get_projector(float *x,
174 FloatAuto *before, *after;
177 *x = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_X])->get_value(position,
183 *y = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_Y])->get_value(position,
189 *z = ((FloatAutos*)autos[AUTOMATION_PROJECTOR_Z])->get_value(position,
196 void VAutomation::get_camera(float *x,
202 FloatAuto *before, *after;
205 *x = ((FloatAutos*)autos[AUTOMATION_CAMERA_X])->get_value(position,
211 *y = ((FloatAutos*)autos[AUTOMATION_CAMERA_Y])->get_value(position,
217 *z = ((FloatAutos*)autos[AUTOMATION_CAMERA_Z])->get_value(position,