Module: synfig
Branch: genete_width_points
Commit: 4fb07ad8b17b2c101a48cdee4aaa7ec684789c7a
URL:
http://synfig.git.sourceforge.net/git/gitweb.cgi?p=synfig;a=commit;h=4fb07ad8b17b2c101a48cdee4aaa7ec684789c7a
Author: Carlos Lopez <car...@pcnuevo.(none)>
Date: Mon Jul 27 00:44:19 2009 +0200
Fix constructor, create_list_entry and create in valuenode_wline.cpp.
Make dynamic list beware on VaLueNode_WLine existence
---
.../trunk/src/synfig/valuenode_dynamiclist.h | 2 +
synfig-core/trunk/src/synfig/valuenode_wline.cpp | 118 +++++---------------
synfig-core/trunk/src/synfig/valuenode_wline.h | 2 +-
synfig-core/trunk/src/synfig/wlinepoint.cpp | 14 ++-
synfig-core/trunk/src/synfig/wlinepoint.h | 12 ++
5 files changed, 54 insertions(+), 94 deletions(-)
diff --git a/synfig-core/trunk/src/synfig/valuenode_dynamiclist.h
b/synfig-core/trunk/src/synfig/valuenode_dynamiclist.h
index e73afd9..7bd1a92 100644
--- a/synfig-core/trunk/src/synfig/valuenode_dynamiclist.h
+++ b/synfig-core/trunk/src/synfig/valuenode_dynamiclist.h
@@ -41,6 +41,7 @@
namespace synfig {
class ValueNode_BLine;
+class ValueNode_WLine;
class Canvas;
/*! \class ValueNode_DynamicList
@@ -89,6 +90,7 @@ public:
{
friend class ValueNode_DynamicList;
friend class ValueNode_BLine;
+ friend class ValueNode_WLine;
public:
typedef synfig::Activepoint Activepoint;
diff --git a/synfig-core/trunk/src/synfig/valuenode_wline.cpp
b/synfig-core/trunk/src/synfig/valuenode_wline.cpp
index f2aa154..0d02685 100644
--- a/synfig-core/trunk/src/synfig/valuenode_wline.cpp
+++ b/synfig-core/trunk/src/synfig/valuenode_wline.cpp
@@ -185,7 +185,7 @@ synfig::interpolate_width(const float &orig_, const
ValueBase &wline, const bool
ValueNode_WLine::ValueNode_WLine():
- ValueNode_DynamicList(ValueBase::TYPE_WLinePOINT)
+ ValueNode_DynamicList(ValueBase::TYPE_WLINEPOINT)
{
}
@@ -205,92 +205,18 @@ ValueNode_WLine::create(const ValueBase &value)
{
switch(value.get_contained_type())
{
- case ValueBase::TYPE_WLinePOINT:
+ case ValueBase::TYPE_WLINEPOINT:
{
-// std::vector<WLinePoint> WLine_points(value.operator
std::vector<WLinePoint>());
- //std::vector<WLinePoint> WLine_points(value);
- std::vector<WLinePoint>
WLine_points(value.get_list().begin(),value.get_list().end());
+ std::vector<WLinePoint>
wline_points(value.get_list().begin(),value.get_list().end());
std::vector<WLinePoint>::const_iterator iter;
-
for(iter=WLine_points.begin();iter!=WLine_points.end();iter++)
+
for(iter=wline_points.begin();iter!=wline_points.end();iter++)
{
value_node->add(ValueNode::Handle(ValueNode_Composite::create(*iter)));
}
value_node->set_loop(value.get_loop());
}
break;
- case ValueBase::TYPE_SEGMENT:
- {
- // Here, we want to convert a list of segments
- // into a list of WLinePoints. We make an assumption
- // that the segment list is continuous(sp), but not
necessarily
- // smooth.
-
- value_node->set_loop(false);
-// std::vector<Segment> segments(value.operator
std::vector<Segment>());
-// std::vector<Segment> segments(value);
- std::vector<Segment>
segments(value.get_list().begin(),value.get_list().end());
- std::vector<Segment>::const_iterator
iter,last(segments.end());
- --last;
- ValueNode_Const::Handle prev,first;
-
- for(iter=segments.begin();iter!=segments.end();iter++)
- {
-#define PREV_POINT prev->get_value().get(WLinePoint())
-#define FIRST_POINT first->get_value().get(WLinePoint())
-#define CURR_POINT curr->get_value().get(WLinePoint())
- if(iter==segments.begin())
- {
-
prev=ValueNode_Const::create(ValueBase::TYPE_WLinePOINT);
- {
- WLinePoint
prev_point(PREV_POINT);
- prev_point.set_vertex(iter->p1);
-
prev_point.set_tangent1(iter->t1);
- prev_point.set_width(0.01);
- prev_point.set_origin(0.5);
-
prev_point.set_split_tangent_flag(false);
- prev->set_value(prev_point);
- }
- first=prev;
-
value_node->add(ValueNode::Handle(prev));
-
- }
- if(iter==last &&
iter->p2.is_equal_to(FIRST_POINT.get_vertex()))
- {
- value_node->set_loop(true);
-
if(!iter->t2.is_equal_to(FIRST_POINT.get_tangent1()))
- {
- WLinePoint
first_point(FIRST_POINT);
-
first_point.set_tangent1(iter->t2);
- first->set_value(first_point);
- }
- continue;
- }
-
- ValueNode_Const::Handle curr;
-
curr=ValueNode_Const::create(ValueBase::TYPE_WLinePOINT);
- {
- WLinePoint curr_point(CURR_POINT);
- curr_point.set_vertex(iter->p2);
- curr_point.set_tangent1(iter->t2);
- curr_point.set_width(0.01);
- curr_point.set_origin(0.5);
-
curr_point.set_split_tangent_flag(false);
- curr->set_value(curr_point);
- }
-
if(!PREV_POINT.get_tangent1().is_equal_to(iter->t1))
- {
- WLinePoint prev_point(PREV_POINT);
- prev_point.set_split_tangent_flag(true);
- prev_point.set_tangent2(iter->t1);
- prev->set_value(prev_point);
- }
- value_node->add(ValueNode::Handle(curr));
- prev=curr;
- }
-
- }
- break;
default:
// We got a list of who-knows-what. We don't have any
idea
// what to do with it.
@@ -298,53 +224,61 @@ ValueNode_WLine::create(const ValueBase &value)
break;
}
}
-
return value_node;
}
ValueNode_WLine::ListEntry
ValueNode_WLine::create_list_entry(int index, Time time, Real origin)
{
+ // The return value
ValueNode_WLine::ListEntry ret;
+ //The previous and next WLinePoints
synfig::WLinePoint prev,next;
+ //The previous and next indexes od the list (vector)
int prev_i,next_i;
+ //Clamp the index to a valid value
index=index%link_count();
+ //Be sure that index is valid for vectors
assert(index>=0);
+ //Set the List Entry index
ret.index=index;
+ //Set the parent Value Node to be this class
ret.set_parent_value_node(this);
+ //If the current index WLinePoint is not "on"
+ // Find a valid entry. The call for the DynamicList member is not
+ // valid since the List is not ordered.
+ //Options:
+ // 1) Sort the list and call the method
+ // 2) Do not sort the list and perform the search manually.
+/****************FIX THIS!!!!***************************************
if(!list[index].status_at_time(time))
next_i=find_next_valid_entry(index,time);
else
next_i=index;
prev_i=find_prev_valid_entry(index,time);
-
+********************************************************************/
//synfig::info("index=%d, next_i=%d, prev_i=%d",index,next_i,prev_i);
+ // Get the previous and next WLinePoints
next=(*list[next_i].value_node)(time);
prev=(*list[prev_i].value_node)(time);
- etl::hermite<Vector>
curve(prev.get_vertex(),next.get_vertex(),prev.get_tangent2(),next.get_tangent1());
- etl::derivative< etl::hermite<Vector> > deriv(curve);
-
- synfig::WLinePoint WLine_point;
- WLine_point.set_vertex(curve(origin));
-
WLine_point.set_width((next.get_width()-prev.get_width())*origin+prev.get_width());
- WLine_point.set_tangent1(deriv(origin)*min(1.0-origin,origin));
- WLine_point.set_tangent2(WLine_point.get_tangent1());
- WLine_point.set_split_tangent_flag(false);
- WLine_point.set_origin(origin);
+ //Linear interpolation
+ synfig::WLinePoint wline_point;
+
wline_point.set_pos((next.get_pos()-prev.get_pos())*origin+prev.get_pos());
+
wline_point.set_width((next.get_width()-prev.get_width())*origin+prev.get_width());
+ wline_point.set_origin(origin);
- ret.value_node=ValueNode_Composite::create(WLine_point);
+ ret.value_node=ValueNode_Composite::create(wline_point);
return ret;
}
-static int instance_count;
ValueBase
ValueNode_WLine::operator()(Time t)const
diff --git a/synfig-core/trunk/src/synfig/valuenode_wline.h
b/synfig-core/trunk/src/synfig/valuenode_wline.h
index a166323..9173de1 100644
--- a/synfig-core/trunk/src/synfig/valuenode_wline.h
+++ b/synfig-core/trunk/src/synfig/valuenode_wline.h
@@ -84,7 +84,7 @@ public:
//! index parameter and the previous valid one.
//! @param index: The index where the Insert item action was performed
//! @param time: The time to insert the item
- virtual ListEntry create_list_entry(int index, Time time=0);
+ virtual ListEntry create_list_entry(int index, Time time=0, Real
origin=0.5);
protected:
diff --git a/synfig-core/trunk/src/synfig/wlinepoint.cpp
b/synfig-core/trunk/src/synfig/wlinepoint.cpp
index 9f213be..9ae8c96 100644
--- a/synfig-core/trunk/src/synfig/wlinepoint.cpp
+++ b/synfig-core/trunk/src/synfig/wlinepoint.cpp
@@ -48,10 +48,22 @@ using namespace synfig;
/* === M E T H O D S ======================================================= */
WLinePoint::WLinePoint():
+ pos(0.0),
width_(0.01),
- origin_(0.0)
+ origin_(0.5),
{ };
+const float&
+WLinePoint::get_pos()const
+{
+ return pos_;
+}
+
+void
+WLinePoint::set_pos(float x)
+{
+ pos_=x;
+}
const float&
WLinePoint::get_width()const
diff --git a/synfig-core/trunk/src/synfig/wlinepoint.h
b/synfig-core/trunk/src/synfig/wlinepoint.h
index 730eddf..c9c52ef 100644
--- a/synfig-core/trunk/src/synfig/wlinepoint.h
+++ b/synfig-core/trunk/src/synfig/wlinepoint.h
@@ -43,12 +43,24 @@ namespace synfig {
class WLinePoint : public UniqueID
{
private:
+ //!The position of the WLinePoint in the [0,1] space
+ float pos_;
+ //!The width of the WLinePoint
float width_;
+ //!The origin of the WLinePoint [0,1]
+ //! When set to 0 means that when the WLinePoint is "off"
+ //! and is rising to "on" it is interpolated from the previus
+ //! WLinePoint (closest small position). When it is set to 1
+ //! measn that when the WLinePoint is "off" and it is rising to
+ //! "on" it is interpolated from the next WLinePoint (closest
+ //! big position. 0.5 means averaged.
float origin_;
public:
WLinePoint();
+ const float& get_pos()const;
+ void set_pos(float x);
const float& get_width()const;
void set_width(float x);
------------------------------------------------------------------------------
_______________________________________________
Synfig-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl