void Action::TimepointsMove::prepare() { clear(); //synfig::info("Preparing TimepointsMove by %f secs",(float)timemove); if(sel_times.empty()) return; //all our lists should be set correctly... /*{ std::set<synfig::Time>::iterator i = sel_times.begin(), end = sel_times.end(); for(; i != end; ++i) { synfig::info("Time %f", (float)*i); } }*/ //build our sub-action list // and yes we do need to store it temporarily so we don't duplicate // an operation on a specific valuenode, etc.... timepoints_ref match; Time fps = get_canvas()->rend_desc().get_frame_rate(); //std::vector<synfig::Layer::Handle> //synfig::info("Layers %d", sel_layers.size()); { std::vector<synfig::Layer::Handle>::iterator i = sel_layers.begin(), end = sel_layers.end(); for(; i != end; ++i) { //synfig::info("Recurse through a layer"); recurse_layer(*i,sel_times,match); } } //std::vector<synfig::Canvas::Handle> sel_canvases; //synfig::info("Canvases %d", sel_canvases.size()); { std::vector<synfig::Canvas::Handle>::iterator i = sel_canvases.begin(), end = sel_canvases.end(); for(; i != end; ++i) { //synfig::info("Recurse through a canvas"); recurse_canvas(*i,sel_times,match); } } //std::vector<synfigapp::ValueDesc> //synfig::info("ValueBasedescs %d", sel_values.size()); { std::vector<synfigapp::ValueDesc>::iterator i = sel_values.begin(), end = sel_values.end(); for(; i != end; ++i) { //synfig::info("Recurse through a valuedesc"); recurse_valuedesc(*i,sel_times,match); } } //synfig::info("built list of waypoints/activepoints to modify"); //synfig::info("\t There are %d waypoint sets and %d activepointsets", // match.waypointbiglist.size(), match.actpointbiglist.size()); //process them... { //must build from both lists timepoints_ref::waytracker::const_iterator i = match.waypointbiglist.begin(), end = match.waypointbiglist.end(); for(; i != end; ++i) { Action::Handle action(WaypointSet::create()); action->set_param("canvas",get_canvas()); action->set_param("canvas_interface",get_canvas_interface()); action->set_param("value_node",ValueNode::Handle(i->val)); synfig::Time dilated_timemove(timemove * i->time_dilation); //iterate through each waypoint for this specific valuenode std::set<synfig::Waypoint>::const_iterator j = i->waypoints.begin(), end = i->waypoints.end(); for(; j != end; ++j) { //synfig::info("add waypoint mod..."); //NOTE: We may want to store the old time for undoing the action... Waypoint w = *j; w.set_time((w.get_time() + dilated_timemove).round(fps)); action->set_param("waypoint",w); } //run the action now that we've added everything assert(action->is_ready()); if(!action->is_ready()) throw Error(Error::TYPE_NOTREADY); add_action_front(action); } } { //must build from both lists timepoints_ref::acttracker::const_iterator i = match.actpointbiglist.begin(), end = match.actpointbiglist.end(); for(; i != end; ++i) { Action::Handle action(ActivepointSet::create()); action->set_param("canvas",get_canvas()); action->set_param("canvas_interface",get_canvas_interface()); action->set_param("value_desc",i->val); synfig::Time dilated_timemove(timemove * i->time_dilation); //iterate through each activepoint for this specific valuenode std::set<synfig::Activepoint>::const_iterator j = i->activepoints.begin(), jend = i->activepoints.end(); for(; j != jend; ++j) { //synfig::info("add activepoint mod..."); //NOTE: We may want to store the old time for undoing the action... Activepoint a = *j; a.set_time((a.get_time() + dilated_timemove).round(fps)); action->set_param("activepoint",a); } assert(action->is_ready()); if(!action->is_ready()) { throw Error(Error::TYPE_NOTREADY); } add_action_front(action); } } }
void Action::KeyframeSet::process_value_desc(const synfigapp::ValueDesc& value_desc) { if(value_desc.is_value_node()) { ValueNode::Handle value_node(value_desc.get_value_node()); //if(guid_set.count(value_node->get_guid())) // return; //guid_set.insert(value_node->get_guid()); // If we are a dynamic list, then we need to update the ActivePoints if(ValueNode_DynamicList::Handle::cast_dynamic(value_node)) { ValueNode_DynamicList::Handle value_node_dynamic(ValueNode_DynamicList::Handle::cast_dynamic(value_node)); int i; for(i=0;i<value_node_dynamic->link_count();i++) { synfigapp::ValueDesc value_desc(value_node_dynamic,i); if(new_time>keyframe_prev && new_time<keyframe_next) { // In this circumstance, we need to adjust any // activepoints between the previous and next // keyframes scale_activepoints(value_desc,keyframe_prev,old_time,keyframe_prev,new_time); scale_activepoints(value_desc,old_time,keyframe_next,new_time,keyframe_next); } //else { Action::Handle action(ActivepointSetSmart::create()); action->set_param("canvas",get_canvas()); action->set_param("canvas_interface",get_canvas_interface()); action->set_param("value_desc",value_desc); Activepoint activepoint; try { activepoint=*value_node_dynamic->list[i].find(old_time); activepoint.set_time(new_time); } catch(...) { activepoint.set_time(new_time); activepoint.set_state(value_node_dynamic->list[i].status_at_time(old_time)); activepoint.set_priority(0); } action->set_param("activepoint",activepoint); assert(action->is_ready()); if(!action->is_ready()) throw Error(Error::TYPE_NOTREADY); add_action_front(action); } } } else if(ValueNode_Animated::Handle::cast_dynamic(value_node)) { if(new_time>keyframe_prev && new_time<keyframe_next) { // In this circumstance, we need to adjust any // waypoints between the previous and next // keyframes scale_waypoints(value_desc,keyframe_prev,old_time,keyframe_prev,new_time); scale_waypoints(value_desc,old_time,keyframe_next,new_time,keyframe_next); } //else { ValueNode_Animated::Handle value_node_animated(ValueNode_Animated::Handle::cast_dynamic(value_node)); Action::Handle action(WaypointSetSmart::create()); action->set_param("canvas",get_canvas()); action->set_param("canvas_interface",get_canvas_interface()); action->set_param("value_node",ValueNode::Handle(value_node_animated)); Waypoint waypoint; try { waypoint=*value_node_animated->find(old_time); waypoint.set_time(new_time); } catch(...) { waypoint.set_time(new_time); waypoint.set_value((*value_node_animated)(old_time)); waypoint.set_before(synfigapp::Main::get_interpolation()); waypoint.set_after(synfigapp::Main::get_interpolation()); } action->set_param("waypoint",waypoint); assert(action->is_ready()); if(!action->is_ready()) throw Error(Error::TYPE_NOTREADY); add_action_front(action); } } } }