break;
case 'f':
unlock_window();
- if(mwindow->session->cwindow_fullscreen)
+ if( canvas->get_fullscreen() )
canvas->stop_fullscreen();
else
canvas->start_fullscreen();
break;
case ESC:
unlock_window();
- if(mwindow->session->cwindow_fullscreen)
+ if( canvas->get_fullscreen() )
canvas->stop_fullscreen();
lock_window("CWindowGUI::keypress_event 4");
result = 1;
mwindow->sync_parameters(change_type);
}
if( overlay ) {
- mwindow->gui->lock_window("CWindow::camera_keyframe");
+ mwindow->gui->lock_window("CWindowGUI::sync_parameters");
mwindow->gui->draw_overlays(1);
mwindow->gui->unlock_window();
}
gui->draw_status(1);
}
-int CWindowCanvas::get_fullscreen()
-{
- return mwindow->session->cwindow_fullscreen;
-}
-
-void CWindowCanvas::set_fullscreen(int value)
-{
- mwindow->session->cwindow_fullscreen = value;
-}
-
-
void CWindowCanvas::update_zoom(int x, int y, float zoom)
{
use_scrollbars = mwindow->edl->session->cwindow_scrollbars;
void CWindowCanvas::draw_refresh(int flush)
{
- if(get_canvas() && !get_canvas()->get_video_on())
- {
-
- if(refresh_frame && refresh_frame->get_w()>0 && refresh_frame->get_h()>0)
- {
+ if( get_canvas() && !get_canvas()->get_video_on() ) {
+ clear(0);
+ if( mwindow->uses_opengl() ) {
+ get_canvas()->unlock_window();
+ get_canvas()->flush();
+ get_canvas()->sync_display();
+ mwindow->playback_3d->finish_output();
+ get_canvas()->lock_window("CWindowCanvas::draw_refresh");
+ }
+ if( refresh_frame && refresh_frame->get_w()>0 && refresh_frame->get_h()>0 ) {
float in_x1, in_y1, in_x2, in_y2;
float out_x1, out_y1, out_x2, out_y2;
get_transfers(mwindow->edl,
- in_x1,
- in_y1,
- in_x2,
- in_y2,
- out_x1,
- out_y1,
- out_x2,
- out_y2);
-
- if(!EQUIV(out_x1, 0) ||
- !EQUIV(out_y1, 0) ||
- !EQUIV(out_x2, get_canvas()->get_w()) ||
- !EQUIV(out_y2, get_canvas()->get_h()))
- {
- get_canvas()->clear_box(0,
- 0,
- get_canvas()->get_w(),
- get_canvas()->get_h());
- }
+ in_x1, in_y1, in_x2, in_y2,
+ out_x1, out_y1, out_x2, out_y2);
+
//printf("CWindowCanvas::draw_refresh %.2f %.2f %.2f %.2f -> %.2f %.2f %.2f %.2f\n",
//in_x1, in_y1, in_x2, in_y2, out_x1, out_y1, out_x2, out_y2);
- if(out_x2 > out_x1 &&
- out_y2 > out_y1 &&
- in_x2 > in_x1 &&
- in_y2 > in_y1)
- {
+ if( out_x2 > out_x1 && out_y2 > out_y1 &&
+ in_x2 > in_x1 && in_y2 > in_y1 ) {
// input scaled from session to refresh frame coordinates
int ow = get_output_w(mwindow->edl);
int oh = get_output_h(mwindow->edl);
// Can't use OpenGL here because it is called asynchronously of the
// playback operation.
get_canvas()->draw_vframe(refresh_frame,
- (int)out_x1,
- (int)out_y1,
+ (int)out_x1, (int)out_y1,
(int)(out_x2 - out_x1),
(int)(out_y2 - out_y1),
- (int)in_x1,
- (int)in_y1,
+ (int)in_x1, (int)in_y1,
(int)(in_x2 - in_x1),
(int)(in_y2 - in_y1),
0);
}
}
- else
- {
- get_canvas()->clear_box(0,
- 0,
- get_canvas()->get_w(),
- get_canvas()->get_h());
- }
-
+//usleep(10000);
draw_overlays();
-// allow last opengl write to complete before redraw
-// tried sync_display, glFlush, glxMake*Current(0..)
-usleep(20000);
get_canvas()->flash(flush);
}
//printf("CWindowCanvas::draw_refresh 10\n");
switch(mwindow->edl->session->cwindow_operation)
{
case CWINDOW_CAMERA:
- draw_bezier(1);
+ draw_outlines(1);
break;
case CWINDOW_PROJECTOR:
- draw_bezier(0);
+ draw_outlines(0);
break;
case CWINDOW_CROP:
}
-
-
-
-
-
-
-void CWindowCanvas::draw_bezier(int do_camera)
+void CWindowCanvas::draw_outlines(int do_camera)
{
Track *track = gui->cwindow->calculate_affected_track();
if(!track) return;
- float center_x;
- float center_y;
- float center_z;
+ float proj_x, proj_y, proj_z;
int64_t position = track->to_units(
mwindow->edl->local_session->get_selectionstart(1),
0);
- if( do_camera ) {
- track->automation->get_camera(¢er_x,
- ¢er_y, ¢er_z, position, PLAY_FORWARD);
-// follow image, not camera
- center_x = -center_x; center_y = -center_y;
- }
- else
- track->automation->get_projector(¢er_x,
- ¢er_y, ¢er_z, position, PLAY_FORWARD);
-
-// center_x += track->track_w / 2;
-// center_y += track->track_h / 2;
- center_x += mwindow->edl->session->output_w / 2;
- center_y += mwindow->edl->session->output_h / 2;
- float track_x1 = center_x - track->track_w / 2 * center_z;
- float track_y1 = center_y - track->track_h / 2 * center_z;
- float track_x2 = track_x1 + track->track_w * center_z;
- float track_y2 = track_y1 + track->track_h * center_z;
-
- output_to_canvas(mwindow->edl, 0, track_x1, track_y1);
- output_to_canvas(mwindow->edl, 0, track_x2, track_y2);
+ track->automation->get_projector(&proj_x, &proj_y, &proj_z,
+ position, PLAY_FORWARD);
+
+ proj_x += mwindow->edl->session->output_w/2.;
+ proj_y += mwindow->edl->session->output_h/2.;
+ float proj_x1 = proj_x - track->track_w/2. * proj_z;
+ float proj_y1 = proj_y - track->track_h/2. * proj_z;
+ float proj_x2 = proj_x + track->track_w/2. * proj_z;
+ float proj_y2 = proj_y + track->track_h/2. * proj_z;
+ float x1 = proj_x1, x2 = proj_x2;
+ float y1 = proj_y1, y2 = proj_y2;
+ output_to_canvas(mwindow->edl, 0, x1, y1);
+ output_to_canvas(mwindow->edl, 0, x2, y2);
#define DRAW_PROJECTION(offset) \
- get_canvas()->draw_rectangle((int)track_x1 + offset, \
- (int)track_y1 + offset, \
- (int)(track_x2 - track_x1), \
- (int)(track_y2 - track_y1)); \
- get_canvas()->draw_line((int)track_x1 + offset, \
- (int)track_y1 + offset, \
- (int)track_x2 + offset, \
- (int)track_y2 + offset); \
- get_canvas()->draw_line((int)track_x2 + offset, \
- (int)track_y1 + offset, \
- (int)track_x1 + offset, \
- (int)track_y2 + offset); \
-
+ get_canvas()->draw_rectangle(x1+offset, y1+offset, (x2-x1), (y2-y1)); \
+ get_canvas()->draw_line(x1+offset, y1+offset, x2+offset, y2+offset); \
+ get_canvas()->draw_line(x2+offset, y1+offset, x1+offset, y2+offset); \
// Drop shadow
get_canvas()->set_color(BLACK);
DRAW_PROJECTION(1);
-
-// canvas->set_inverse();
- if(do_camera)
- get_canvas()->set_color(GREEN);
- else
- get_canvas()->set_color(RED);
-
+ get_canvas()->set_color(do_camera ? GREEN : RED);
DRAW_PROJECTION(0);
-// canvas->set_opaque();
+ if( do_camera ) {
+ float cam_x, cam_y, cam_z;
+ track->automation->get_camera(&cam_x, &cam_y, &cam_z,
+ position, PLAY_FORWARD);
+ cam_x += track->track_w / 2.;
+ cam_y += track->track_h / 2.;
+// follow image, not camera
+ cam_x = -cam_x; cam_y = -cam_y; cam_z *= proj_z;
+ float cam_x1 = cam_x * cam_z + proj_x;
+ float cam_y1 = cam_y * cam_z + proj_y;
+ float cam_x2 = (cam_x + track->track_w) * cam_z + proj_x;
+ float cam_y2 = (cam_y + track->track_h) * cam_z + proj_y;
+ output_to_canvas(mwindow->edl, 0, cam_x1, cam_y1);
+ output_to_canvas(mwindow->edl, 0, cam_x2, cam_y2);
+ get_canvas()->set_color(YELLOW);
+ get_canvas()->draw_rectangle(cam_x1, cam_y1, cam_x2-cam_x1, cam_y2-cam_y1);
+ }
}
int CWindowCanvas::test_bezier(int button_press,
// Processing drag operation.
// Create keyframe during first cursor motion.
- if(!button_press)
- {
+ if( !button_press ) {
float cursor_x = get_cursor_x();
float cursor_y = get_cursor_y();
canvas_to_output(mwindow->edl, 0, cursor_x, cursor_y);
- if(gui->current_operation == CWINDOW_CAMERA ||
- gui->current_operation == CWINDOW_PROJECTOR)
- {
- if(!gui->ctrl_down() && gui->shift_down() && !gui->translating_zoom)
- {
+ if( gui->current_operation == CWINDOW_CAMERA ||
+ gui->current_operation == CWINDOW_PROJECTOR ) {
+ if( !gui->ctrl_down() && gui->shift_down() && !gui->translating_zoom ) {
gui->translating_zoom = 1;
gui->reset_affected();
}
- else
- if(!gui->ctrl_down() && !gui->shift_down() && gui->translating_zoom)
- {
+ else if( !gui->ctrl_down() && !gui->shift_down() && gui->translating_zoom ) {
gui->translating_zoom = 0;
gui->reset_affected();
}
// Get target keyframe
- float last_center_x;
- float last_center_y;
- float last_center_z;
- int created;
-
- if(!gui->affected_x && !gui->affected_y && !gui->affected_z)
- {
- FloatAutos *affected_x_autos;
- FloatAutos *affected_y_autos;
- FloatAutos *affected_z_autos;
+ if( !gui->affected_x && !gui->affected_y && !gui->affected_z ) {
if(!gui->affected_track) return 0;
+ FloatAutos *affected_x_autos, *affected_y_autos, *affected_z_autos;
+ FloatAutos** autos = (FloatAutos**) gui->affected_track->automation->autos;
+ if( mwindow->edl->session->cwindow_operation == CWINDOW_CAMERA ) {
+ affected_x_autos = autos[AUTOMATION_CAMERA_X];
+ affected_y_autos = autos[AUTOMATION_CAMERA_Y];
+ affected_z_autos = autos[AUTOMATION_CAMERA_Z];
+ }
+ else {
+ affected_x_autos = autos[AUTOMATION_PROJECTOR_X];
+ affected_y_autos = autos[AUTOMATION_PROJECTOR_Y];
+ affected_z_autos = autos[AUTOMATION_PROJECTOR_Z];
+ }
double position = mwindow->edl->local_session->get_selectionstart(1);
int64_t track_position = gui->affected_track->to_units(position, 0);
-
- if(mwindow->edl->session->cwindow_operation == CWINDOW_CAMERA)
- {
- affected_x_autos = (FloatAutos*)gui->affected_track->automation->autos[AUTOMATION_CAMERA_X];
- affected_y_autos = (FloatAutos*)gui->affected_track->automation->autos[AUTOMATION_CAMERA_Y];
- affected_z_autos = (FloatAutos*)gui->affected_track->automation->autos[AUTOMATION_CAMERA_Z];
- }
- else
- {
- affected_x_autos = (FloatAutos*)gui->affected_track->automation->autos[AUTOMATION_PROJECTOR_X];
- affected_y_autos = (FloatAutos*)gui->affected_track->automation->autos[AUTOMATION_PROJECTOR_Y];
- affected_z_autos = (FloatAutos*)gui->affected_track->automation->autos[AUTOMATION_PROJECTOR_Z];
+ FloatAuto *prev_x = 0, *next_x = 0;
+ float new_x = affected_x_autos->get_value(track_position, PLAY_FORWARD, prev_x, next_x);
+ FloatAuto *prev_y = 0, *next_y = 0;
+ float new_y = affected_y_autos->get_value(track_position, PLAY_FORWARD, prev_y, next_y);
+ FloatAuto *prev_z = 0, *next_z = 0;
+ float new_z = affected_z_autos->get_value(track_position, PLAY_FORWARD, prev_z, next_z);
+ int zooming = gui->translating_zoom, created;
+ gui->affected_x = (FloatAuto*)gui->cwindow->calculate_affected_auto(
+ affected_x_autos, !zooming, &created, 0);
+ if( created ) {
+ gui->affected_x->set_value(new_x);
+ redraw_canvas = 1;
}
-
-
- if(gui->translating_zoom)
- {
- FloatAuto *previous = 0;
- FloatAuto *next = 0;
- float new_z = affected_z_autos->get_value(
- track_position,
- PLAY_FORWARD,
- previous,
- next);
- gui->affected_z =
- (FloatAuto*)gui->cwindow->calculate_affected_auto(
- affected_z_autos, 1, &created, 0);
- if(created) {
- gui->affected_z->set_value(new_z);
- redraw_canvas = 1;
- }
+ gui->affected_y = (FloatAuto*)gui->cwindow->calculate_affected_auto(
+ affected_y_autos, !zooming, &created, 0);
+ if( created ) {
+ gui->affected_y->set_value(new_y);
+ redraw_canvas = 1;
}
- else
- {
- FloatAuto *previous = 0;
- FloatAuto *next = 0;
- float new_x = affected_x_autos->get_value(
- track_position,
- PLAY_FORWARD,
- previous,
- next);
- previous = 0;
- next = 0;
- float new_y = affected_y_autos->get_value(
- track_position,
- PLAY_FORWARD,
- previous,
- next);
- gui->affected_x =
- (FloatAuto*)gui->cwindow->calculate_affected_auto(
- affected_x_autos, 1, &created, 0);
- if(created) {
- gui->affected_x->set_value(new_x);
- redraw_canvas = 1;
- }
- gui->affected_y =
- (FloatAuto*)gui->cwindow->calculate_affected_auto(
- affected_y_autos, 1, &created, 0);
- if(created) {
- gui->affected_y->set_value(new_y);
- redraw_canvas = 1;
- }
+ gui->affected_z = (FloatAuto*)gui->cwindow->calculate_affected_auto(
+ affected_z_autos, zooming, &created, 0);
+ if( created ) {
+ gui->affected_z->set_value(new_z);
+ redraw_canvas = 1;
}
-
calculate_origin();
- if(gui->translating_zoom)
- {
+ if( gui->translating_zoom ) {
gui->center_z = gui->affected_z->get_value();
}
- else
- {
+ else {
gui->center_x = gui->affected_x->get_value();
gui->center_y = gui->affected_y->get_value();
}
redraw = 1;
}
- if(gui->translating_zoom)
- {
- last_center_z = gui->affected_z->get_value();
+ float x_val = gui->affected_x->get_value();
+ float y_val = gui->affected_y->get_value();
+ float z_val = gui->affected_z->get_value();
+
+ if( gui->translating_zoom ) {
float z = gui->center_z + (cursor_y - gui->y_origin) / 128;
if( z < 0 ) z = 0;
- if(!EQUIV(last_center_z, z))
- {
+ if( !EQUIV(z_val, z) ) {
rerender = 1;
redraw = 1;
redraw_canvas = 1;
}
gui->affected_z->set_value(z);
}
- else
- {
- last_center_x = gui->affected_x->get_value();
- last_center_y = gui->affected_y->get_value();
+ else {
float dx = cursor_x - gui->x_origin;
float dy = cursor_y - gui->y_origin;
// follow image, not camera
- if(gui->current_operation == CWINDOW_CAMERA ) {
- dx = -dx; dy = -dy;
+ if( gui->current_operation == CWINDOW_CAMERA ) {
+ dx = -dx / z_val; dy = -dy / z_val;
}
float x = gui->center_x + dx;
float y = gui->center_y + dy;
gui->affected_x->set_value(x);
gui->affected_y->set_value(y);
- if( !EQUIV(last_center_x, x) || !EQUIV(last_center_y, y) )
- {
+ if( !EQUIV(x_val, x) || !EQUIV(y_val, y) ) {
rerender = 1;
redraw = 1;
redraw_canvas = 1;
}
- gui->affected_x->set_value(x);
- gui->affected_y->set_value(y);
}
}