source: synfigstudio/trunk/fuentes/src/synfigapp/actions/valuedescbonelink.cpp @ 481

Last change on this file since 481 was 481, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 8.1 KB
Line 
1/* === S Y N F I G ========================================================= */
2/*!     \file valuedescbonelink.cpp
3**      \brief Template File
4**
5**      $Id$
6**
7**      \legal
8**      ......... ... 2013 Ivan Mahonin
9**      ......... ... 2014 Jerome Blanchi
10**
11**      This package is free software; you can redistribute it and/or
12**      modify it under the terms of the GNU General Public License as
13**      published by the Free Software Foundation; either version 2 of
14**      the License, or (at your option) any later version.
15**
16**      This package is distributed in the hope that it will be useful,
17**      but WITHOUT ANY WARRANTY; without even the implied warranty of
18**      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19**      General Public License for more details.
20**      \endlegal
21*/
22/* ========================================================================= */
23
24/* === H E A D E R S ======================================================= */
25
26#ifdef USING_PCH
27#       include "pch.h"
28#else
29#ifdef HAVE_CONFIG_H
30#       include <config.h>
31#endif
32
33#include "layerparamconnect.h"
34#include "valuenodelinkconnect.h"
35#include "valuenodereplace.h"
36#include "valuedescbonelink.h"
37
38#include <synfigapp/canvasinterface.h>
39#include <synfig/valuenodes/valuenode_const.h>
40#include <synfig/valuenodes/valuenode_composite.h>
41#include <synfig/valuenodes/valuenode_bone.h>
42#include <synfig/valuenodes/valuenode_bonelink.h>
43#include <synfig/valuetransformation.h>
44
45#include <synfigapp/general.h>
46
47#endif
48
49using namespace std;
50using namespace etl;
51using namespace synfig;
52using namespace synfigapp;
53using namespace Action;
54
55/* === M A C R O S ========================================================= */
56
57ACTION_INIT(Action::ValueDescBoneLink);
58ACTION_SET_NAME(Action::ValueDescBoneLink,"ValueDescBoneLink");
59ACTION_SET_LOCAL_NAME(Action::ValueDescBoneLink,N_("Link to Bone"));
60ACTION_SET_TASK(Action::ValueDescBoneLink,"bone_link");
61ACTION_SET_CATEGORY(Action::ValueDescBoneLink,Action::CATEGORY_VALUEDESC);
62ACTION_SET_PRIORITY(Action::ValueDescBoneLink,0);
63ACTION_SET_VERSION(Action::ValueDescBoneLink,"0.0");
64ACTION_SET_CVS_ID(Action::ValueDescBoneLink,"$Id$");
65
66/* === G L O B A L S ======================================================= */
67
68/* === P R O C E D U R E S ================================================= */
69
70/* === M E T H O D S ======================================================= */
71
72Action::ValueDescBoneLink::ValueDescBoneLink():
73        time(0)
74{
75}
76
77Action::ParamVocab
78Action::ValueDescBoneLink::get_param_vocab()
79{
80        ParamVocab ret(Action::CanvasSpecific::get_param_vocab());
81
82        ret.push_back(ParamDesc("selected_value_desc",Param::TYPE_VALUEDESC)
83                .set_local_name(_("ValueDesc to link"))
84                .set_supports_multiple()
85        );
86        ret.push_back(ParamDesc("value_desc",Param::TYPE_VALUEDESC)
87                .set_local_name(_("ValueDesc on Bone to link to"))
88        );
89        ret.push_back(ParamDesc("time",Param::TYPE_TIME)
90                .set_local_name(_("Time"))
91                .set_optional()
92        );
93
94        return ret;
95}
96
97bool
98Action::ValueDescBoneLink::is_candidate(const ParamList &x)
99{
100        ParamList::const_iterator iter;
101
102        ValueDesc value_desc(x.find("value_desc")->second.get_value_desc());
103
104        bool selected_value_desc_is_bone = false;
105        pair<ParamList::const_iterator, ParamList::const_iterator> selected_vd_range = x.equal_range("selected_value_desc");
106        //get the range of selected value desc to check if at least one is a bone
107        for (iter = selected_vd_range.first; iter != selected_vd_range.second ; ++iter)
108        {
109                ValueDesc selected_value_desc(iter->second.get_value_desc());
110                //Simple test of bone type
111                //TODO : if bone, reject only if same skeleton
112                if ((selected_value_desc.parent_is_value_node()) &&
113                        (ValueNode_Bone::Handle::cast_dynamic(selected_value_desc.get_parent_value_node()))
114                        )
115                {
116                        selected_value_desc_is_bone = true;
117                        break;
118                }
119        }
120
121        if (!candidate_check(get_param_vocab(),x))
122                return false;
123
124        return value_desc.parent_is_value_node()
125                && ValueNode_Bone::Handle::cast_dynamic(value_desc.get_parent_value_node())
126                && !selected_value_desc_is_bone;
127}
128
129bool
130Action::ValueDescBoneLink::set_param(const synfig::String& name, const Action::Param &param)
131{
132        if (name == "value_desc" && param.get_type() == Param::TYPE_VALUEDESC
133         && param.get_value_desc().parent_is_value_node()
134         && ValueNode_Bone::Handle::cast_dynamic(param.get_value_desc().get_parent_value_node()) )
135        {
136                value_desc = param.get_value_desc();
137                return true;
138        }
139
140        if (name == "selected_value_desc" && param.get_type() == Param::TYPE_VALUEDESC)
141        {
142                value_desc_list.push_back(param.get_value_desc());
143                return true;
144        }
145
146        if(name=="time" && param.get_type()==Param::TYPE_TIME)
147        {
148                time=param.get_time();
149                return true;
150        }
151
152        return Action::CanvasSpecific::set_param(name,param);
153}
154
155bool
156Action::ValueDescBoneLink::is_ready()const
157{
158        if (value_desc_list.empty())
159                return false;
160        if (!value_desc)
161                return false;
162        return Action::CanvasSpecific::is_ready();
163}
164
165void
166Action::ValueDescBoneLink::prepare()
167{
168        if (value_desc_list.empty())
169                throw Error(Error::TYPE_NOTREADY);
170
171        clear();
172        ValueNode_Bone::Handle bone_value_node;
173        if (value_desc.parent_is_value_node())
174                bone_value_node = ValueNode_Bone::Handle::cast_dynamic(value_desc.get_parent_value_node());
175
176        if (!bone_value_node)
177                throw Error(Error::TYPE_NOTREADY);
178
179        for (std::list<ValueDesc>::iterator iter = value_desc_list.begin(); iter != value_desc_list.end(); ++iter)
180        {
181                ValueDesc& value_desc(*iter);
182
183                if (!ValueNode_BoneLink::check_type(value_desc.get_value_type()))
184                        continue;
185                if (value_desc.parent_is_value_node() && bone_value_node == value_desc.get_parent_value_node())
186                        continue;
187
188                /*
189                if (value_desc.is_value_node())
190                {
191                        ValueNode_BoneLink::Handle bone_link_node = ValueNode_BoneLink::Handle::cast_dynamic(value_desc.get_value_node());
192                        if (bone_link_node) {
193                                // add bone into existant BoneLink
194                                Action::Handle action = ValueNodeStaticListInsert::create();
195                                action->set_param("canvas", get_canvas());
196                                action->set_param("canvas_interface", get_canvas_interface());
197                                action->set_param("value_desc", ValueDesc(ValueNode::Handle(bone_link_node->get_link("bone_weight_list")), 0));
198                                action->set_param("item", ValueNode::Handle(bone_weight_pair_node));
199
200                                assert(action->is_ready());
201                                if (!action->is_ready()) throw Error(Error::TYPE_NOTREADY);
202                                add_action_front(action);
203
204                                continue;
205                        }
206                }
207                */
208
209                // create new BoneLink
210                ValueNode_BoneLink::Handle bone_link_node = ValueNode_BoneLink::create(value_desc.get_value_type());
211                bone_link_node->set_link("bone", ValueNode_Const::create(ValueBase(bone_value_node)));
212                bone_link_node->set_link("base_value",
213                        ValueNode_Composite::create(
214                                ValueTransformation::back_transform(
215                                        bone_link_node->get_bone_transformation(time),
216                                        value_desc.get_value(time) )));
217
218                // exported ValueNode
219                if (value_desc.parent_is_canvas())
220                {
221                        Action::Handle action = ValueNodeReplace::create();
222                        action->set_param("canvas", get_canvas());
223                        action->set_param("canvas_interface", get_canvas_interface());
224                        action->set_param("src", ValueNode::Handle(bone_link_node));
225                        action->set_param("dest", value_desc.get_value_node());
226
227                        assert(action->is_ready());
228                        if (!action->is_ready()) throw Error(Error::TYPE_NOTREADY);
229                        add_action_front(action);
230                }
231                else if (value_desc.parent_is_layer())
232                {
233                        Action::Handle action = LayerParamConnect::create();
234                        action->set_param("layer", value_desc.get_layer());
235                        action->set_param("param", value_desc.get_param_name());
236                        action->set_param("canvas", get_canvas());
237                        action->set_param("canvas_interface", get_canvas_interface());
238                        action->set_param("value_node", ValueNode::Handle(bone_link_node));
239
240                        assert(action->is_ready());
241                        if (!action->is_ready()) throw Error(Error::TYPE_NOTREADY);
242                        add_action_front(action);
243                }
244                else if (value_desc.parent_is_value_node())
245                {
246                        Action::Handle action = ValueNodeLinkConnect::create();
247                        action->set_param("canvas", get_canvas());
248                        action->set_param("canvas_interface", get_canvas_interface());
249                        action->set_param("parent_value_node", value_desc.get_parent_value_node());
250                        action->set_param("index", value_desc.get_index());
251                        action->set_param("value_node", ValueNode::Handle(bone_link_node));
252
253                        assert(action->is_ready());
254                        if (!action->is_ready()) throw Error(Error::TYPE_NOTREADY);
255                        add_action_front(action);
256                }
257        }
258}
Note: See TracBrowser for help on using the repository browser.