/*! \file valuedescset.cpp
** \brief Template File
**
-** $Id: valuedescset.cpp,v 1.1.1.1 2005/01/07 03:34:37 darco Exp $
+** $Id$
**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2007 Chris Moore
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
#include <synfig/valuenode_reference.h>
#include <synfigapp/main.h>
+#include <synfigapp/general.h>
+
#endif
using namespace std;
using namespace Action;
/* === M A C R O S ========================================================= */
-#define ACTION_INIT2(class) \
- Action::Base* class::create() { return new class(); } \
- synfig::String class::get_name()const { return name__; }
-ACTION_INIT2(Action::ValueDescSet);
+ACTION_INIT_NO_GET_LOCAL_NAME(Action::ValueDescSet);
ACTION_SET_NAME(Action::ValueDescSet,"value_desc_set");
-ACTION_SET_LOCAL_NAME(Action::ValueDescSet,"Set ValueDesc");
+ACTION_SET_LOCAL_NAME(Action::ValueDescSet,N_("Set ValueDesc"));
ACTION_SET_TASK(Action::ValueDescSet,"set");
ACTION_SET_CATEGORY(Action::ValueDescSet,Action::CATEGORY_VALUEDESC);
ACTION_SET_PRIORITY(Action::ValueDescSet,0);
ACTION_SET_VERSION(Action::ValueDescSet,"0.0");
-ACTION_SET_CVS_ID(Action::ValueDescSet,"$Id: valuedescset.cpp,v 1.1.1.1 2005/01/07 03:34:37 darco Exp $");
+ACTION_SET_CVS_ID(Action::ValueDescSet,"$Id$");
/* === G L O B A L S ======================================================= */
Action::ValueDescSet::get_local_name()const
{
String name("ValueDesc");
-
+
if(!value_desc)
{
}
{
synfig::LinkableValueNode::Handle value_node(synfig::LinkableValueNode::Handle::cast_reinterpret(value_desc.get_parent_value_node()));
name=value_node->link_local_name(value_desc.get_index());
-
+
synfig::Node* node;
for(node=value_node.get();!node->parent_set.empty() && !dynamic_cast<Layer*>(node);node=*node->parent_set.begin());
Layer::Handle parent_layer(dynamic_cast<Layer*>(node));
Action::ValueDescSet::get_param_vocab()
{
ParamVocab ret(Action::CanvasSpecific::get_param_vocab());
-
+
ret.push_back(ParamDesc("value_desc",Param::TYPE_VALUEDESC)
.set_local_name(_("ValueDesc"))
);
.set_local_name(_("Time"))
.set_optional()
);
-
+
return ret;
}
if(name=="value_desc" && param.get_type()==Param::TYPE_VALUEDESC)
{
value_desc=param.get_value_desc();
-
+
return true;
}
if(name=="new_value" && param.get_type()==Param::TYPE_VALUE)
{
value=param.get_value();
-
+
return true;
}
if(name=="time" && param.get_type()==Param::TYPE_TIME)
{
time=param.get_time();
-
+
return true;
}
// our first tangent is being manipulated,
// then we also need to adjust the other
// tangent.
- if( value_desc.parent_is_value_node()
- && value_desc.get_parent_value_node()->get_type()==ValueBase::TYPE_BLINEPOINT
- && value_desc.get_index()==4
- && (*value_desc.get_parent_value_node())(time).get(BLinePoint()).get_split_tangent_flag()==false
- )
+ if( value_desc.parent_is_value_node() &&
+ value_desc.get_parent_value_node()->get_type()==ValueBase::TYPE_BLINEPOINT &&
+ (value_desc.get_index()==4 || value_desc.get_index()==5) &&
+ (*value_desc.get_parent_value_node())(time).get(BLinePoint()).get_split_tangent_flag()==false)
{
- DEBUGPOINT();
- ValueNode_Composite::Handle parent_value_node;
- parent_value_node=parent_value_node.cast_dynamic(value_desc.get_parent_value_node());
-
- assert(parent_value_node);
-
- Action::Handle action(Action::create("value_desc_set"));
-
- if(!action)
- throw Error(_("Unable to find action value_desc_set (bug)"));
-
- action->set_param("canvas",get_canvas());
- action->set_param("canvas_interface",get_canvas_interface());
- action->set_param("time",time);
- action->set_param("new_value",value);
- action->set_param("value_desc",ValueDesc(parent_value_node,5));
-
- if(!action->is_ready())
- throw Error(Error::TYPE_NOTREADY);
-
- add_action(action);
+ printf("a tangent got changed - #%d\n", value_desc.get_index()-3);
+
+ {
+ ValueNode_Composite::Handle parent_value_node;
+ parent_value_node=parent_value_node.cast_dynamic(value_desc.get_parent_value_node());
+ assert(parent_value_node);
+
+ Vector t1((*parent_value_node->get_link("t1"))(time));
+ Vector t2((*parent_value_node->get_link("t2"))(time));
+ printf("current values are: t1(%.2f, %2.f) t2(%.2f, %.2f)\n", t1[0], t1[1], t2[0], t2[1]);
+ }
+
+ if (value_desc.get_index()==4) {
+ printf("copying change to tangent 2\n");
+ DEBUGPOINT();
+ ValueNode_Composite::Handle parent_value_node;
+ parent_value_node=parent_value_node.cast_dynamic(value_desc.get_parent_value_node());
+
+ assert(parent_value_node);
+
+ Action::Handle action(Action::create("value_desc_set"));
+
+ if(!action)
+ throw Error(_("Unable to find action value_desc_set (bug)"));
+
+ action->set_param("canvas",get_canvas());
+ action->set_param("canvas_interface",get_canvas_interface());
+ action->set_param("time",time);
+ action->set_param("new_value",value);
+ action->set_param("value_desc",ValueDesc(parent_value_node,5));
+
+ if(!action->is_ready())
+ throw Error(Error::TYPE_NOTREADY);
+
+ add_action(action);
+ }
}
// If we are a reference value node, then
if(!action)
throw Error(_("Unable to find action value_desc_set (bug)"));
-
+
action->set_param("canvas",get_canvas());
action->set_param("canvas_interface",get_canvas_interface());
action->set_param("time",time);
action->set_param("new_value",value);
action->set_param("value_desc",reference_value_desc);
-
+
if(!action->is_ready())
throw Error(Error::TYPE_NOTREADY);
- add_action(action);
-
+ add_action(action);
+
return;
}
-
+
// If we are a composite value node, then
// we need to distribute the changes to the
// individual parts
break;
}
default:
- throw Error("Bad type for composite (%s)",ValueBase::type_name(value.get_type()).c_str());
+ throw Error(_("Bad type for composite (%s)"),ValueBase::type_local_name(value.get_type()).c_str());
break;
}
-
+
for(int i=0;i<n_components;i++)
{
ValueDesc component_value_desc(ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node()),i);
Action::Handle action(Action::create("value_desc_set"));
-
+
if(!action)
throw Error(_("Unable to find action value_desc_set (bug)"));
-
+
action->set_param("canvas",get_canvas());
action->set_param("canvas_interface",get_canvas_interface());
action->set_param("time",time);
action->set_param("new_value",components[i]);
action->set_param("value_desc",component_value_desc);
-
+
if(!action->is_ready())
throw Error(Error::TYPE_NOTREADY);
-
- add_action(action);
+
+ add_action(action);
}
-
+
return;
}
-
+
// If we are a RADIAL composite value node, then
// we need to distribute the changes to the
// individual parts
{
case ValueBase::TYPE_VECTOR:
{
+ Angle old_angle = (*(ValueNode_RadialComposite::Handle::cast_dynamic(
+ value_desc.get_value_node())->get_link_vfunc(1)))(time).get(Angle());
Vector vect(value.get(Vector()));
components[0]=vect.mag();
- components[1]=Angle(Angle::tan(vect[1],vect[0]));
+ Angle change = Angle(Angle::tan(vect[1],vect[0])) - old_angle;
+ while (change < Angle::deg(-180)) change += Angle::deg(360);
+ while (change > Angle::deg(180)) change -= Angle::deg(360);
+ components[1]=old_angle + change;
n_components=2;
}
break;
n_components=4;
break;
default:
- throw Error("Bad type for radial composite (%s)",ValueBase::type_name(value.get_type()).c_str());
+ throw Error(_("Bad type for radial composite (%s)"),ValueBase::type_local_name(value.get_type()).c_str());
break;
}
for(int i=0;i<n_components;i++)
ValueDesc component_value_desc(ValueNode_RadialComposite::Handle::cast_dynamic(value_desc.get_value_node()),i);
Action::Handle action(Action::create("value_desc_set"));
-
+
if(!action)
throw Error(_("Unable to find action value_desc_set (bug)"));
-
+
action->set_param("canvas",get_canvas());
action->set_param("canvas_interface",get_canvas_interface());
action->set_param("time",time);
action->set_param("new_value",components[i]);
action->set_param("value_desc",component_value_desc);
-
+
if(!action->is_ready())
throw Error(Error::TYPE_NOTREADY);
-
- add_action(action);
+
+ add_action(action);
}
-
+
return;
}
// If we are merging the tangents of a BLinePoint,
// we must also set the second tangent for things
// to interpolate properly
- if( value_desc.parent_is_value_node()
- && value_desc.get_parent_value_node()->get_type()==ValueBase::TYPE_BLINEPOINT
- && value_desc.get_index()==3
-// && value.get(bool())==false // Actually, we want to do this any time the split flag is tweaked with
- )
+ if (value_desc.parent_is_value_node() &&
+ value_desc.get_parent_value_node()->get_type()==ValueBase::TYPE_BLINEPOINT &&
+ value_desc.get_index()==3)
{
ValueNode_Composite::Handle parent_value_node;
parent_value_node=parent_value_node.cast_dynamic(value_desc.get_parent_value_node());
-
+
assert(parent_value_node);
-
- Action::Handle action(Action::create("value_desc_set"));
-
- if(!action)
- throw Error(_("Unable to find action value_desc_set (bug)"));
-
- action->set_param("canvas",get_canvas());
- action->set_param("canvas_interface",get_canvas_interface());
- action->set_param("time",time);
- action->set_param("new_value",(*parent_value_node->get_link(4))(time));
- action->set_param("value_desc",ValueDesc(parent_value_node,5));
-
- if(!action->is_ready())
- throw Error(Error::TYPE_NOTREADY);
-
- add_action(action);
+
+ // are we splitting or merging the tangents?
+ if (value.get(bool()))
+ {
+ // we are splitting tangents
+
+ Action::Handle action(Action::create("value_desc_set"));
+
+ if(!action)
+ throw Error(_("Unable to find action value_desc_set (bug)"));
+
+ action->set_param("canvas",get_canvas());
+ action->set_param("canvas_interface",get_canvas_interface());
+ action->set_param("time",time);
+ action->set_param("new_value",(*parent_value_node->get_link(4))(time));
+ action->set_param("value_desc",ValueDesc(parent_value_node,5));
+
+ if(!action->is_ready())
+ throw Error(Error::TYPE_NOTREADY);
+
+ add_action(action);
+ }
+ else
+ {
+ // we are merging tangents
+
+ // the merged tangent should be the average of the 2 tangents we're merging
+ ValueBase average(((Vector)((*parent_value_node->get_link("t1"))(time)) +
+ (Vector)((*parent_value_node->get_link("t2"))(time))) / 2);
+
+ {
+ Action::Handle action(Action::create("value_desc_set"));
+
+ if(!action)
+ throw Error(_("Unable to find action value_desc_set (bug)"));
+
+ action->set_param("canvas",get_canvas());
+ action->set_param("canvas_interface",get_canvas_interface());
+ action->set_param("time",time);
+ action->set_param("new_value",average);
+ action->set_param("value_desc",ValueDesc(parent_value_node,4));
+
+ if(!action->is_ready())
+ throw Error(Error::TYPE_NOTREADY);
+
+ add_action(action);
+ }
+
+ {
+ Action::Handle action(Action::create("value_desc_set"));
+
+ if(!action)
+ throw Error(_("Unable to find action value_desc_set (bug)"));
+
+ action->set_param("canvas",get_canvas());
+ action->set_param("canvas_interface",get_canvas_interface());
+ action->set_param("time",time);
+ action->set_param("new_value",average);
+ action->set_param("value_desc",ValueDesc(parent_value_node,5));
+
+ if(!action->is_ready())
+ throw Error(Error::TYPE_NOTREADY);
+
+ add_action(action);
+ }
+ }
+
}
/* DEBUGPOINT();
}
}
}
-*/
+*/
+
-
// If we are in animate editing mode
if(get_edit_mode()&MODE_ANIMATE)
{
value=ValueNode_Const::Handle::cast_dynamic(value_desc.get_value_node())->get_value();
else
value=value_desc.get_value();
-
+
if(!value_node)value_node=ValueNode_Animated::create(value,time);
//if(!value_node)value_node=ValueNode_Animated::create(value.get_type());
-
+
Action::Handle action;
-
+
if(!value_desc.is_value_node())
{
action=(ValueDescConnect::create());
action->set_param("dest",value_desc.get_value_node());
action->set_param("src",ValueNode::Handle(value_node));
}
-
+
action->set_param("canvas",get_canvas());
action->set_param("canvas_interface",get_canvas_interface());
-
+
if(!action->is_ready())
throw Error(Error::TYPE_NOTREADY);
-
+
DEBUGPOINT();
add_action_front(action);
}
{
value_node=value_node.cast_dynamic(value_desc.get_value_node());
}
-
+
DEBUGPOINT();
if(!value_node)
- throw Error(_("Direct manipulation of this ValueNode type is not yet supported"));
-
+ throw Error(_("Direct manipulation of this ValueNode type is not yet supported"));
+
Action::Handle action(WaypointSetSmart::create());
-
+
//Waypoint waypoint(value,time);
-
+
Waypoint waypoint(value_node->new_waypoint_at_time(time));
waypoint.set_value(value);
-
+
waypoint.set_before(synfigapp::Main::get_interpolation());
waypoint.set_after(synfigapp::Main::get_interpolation());
-
+
action->set_param("canvas",get_canvas());
action->set_param("canvas_interface",get_canvas_interface());
action->set_param("value_node",ValueNode::Handle(value_node));
action->set_param("waypoint",waypoint);
-
+
if(!action->is_ready())
throw Error(Error::TYPE_NOTREADY);
DEBUGPOINT();
add_action(action);
-
+
return;
}
else
if(ValueNode_Const::Handle::cast_dynamic(value_desc.get_value_node()))
{
Action::Handle action(ValueNodeConstSet::create());
-
+
action->set_param("canvas",get_canvas());
action->set_param("canvas_interface",get_canvas_interface());
action->set_param("value_node",value_desc.get_value_node());
action->set_param("new_value",value);
-
+
if(!action->is_ready())
throw Error(Error::TYPE_NOTREADY);
-
+
add_action_front(action);
return;
}
else
if(ValueNode_Animated::Handle::cast_dynamic(value_desc.get_value_node()))
- throw Error(_("You must be in Animate-Editing-Mode to directly manipulate this value"));
+ throw Error(_("You must be in Animate-Editing-Mode to directly manipulate this value"));
else
- throw Error(_("Direct manipulation of this ValueNode type is not yet supported"));
+ throw Error(_("Direct manipulation of this ValueNode type is not yet supported"));
}
else
if(value_desc.parent_is_layer_param() && !value_desc.is_value_node())
{
Action::Handle layer_param_set(LayerParamSet::create());
-
+
layer_param_set->set_param("canvas",get_canvas());
layer_param_set->set_param("canvas_interface",get_canvas_interface());
layer_param_set->set_param("layer",value_desc.get_layer());
layer_param_set->set_param("param",value_desc.get_param_name());
layer_param_set->set_param("new_value",value);
-
+
if(!layer_param_set->is_ready())
throw Error(Error::TYPE_NOTREADY);
-
+
add_action_front(layer_param_set);
return;
}