Code

powerstroke: redefine meaning of offset point parameter values. now knots move with...
[inkscape.git] / src / live_effects / parameter / powerstrokepointarray.cpp
index 99c32720729876935d9b32a38665720188287b57..c209801933242dc540c545fb3cf016fae3421293 100644 (file)
 #include "live_effects/effect.h"
 #include "svg/svg.h"
 #include "svg/stringstream.h"
-#include <gtkmm.h>
-#include "ui/widget/point.h"
-#include "widgets/icon.h"
-#include "ui/widget/registered-widget.h"
-#include "inkscape.h"
-#include "verbs.h"
 #include "knotholder.h"
+#include "sp-lpe-item.h"
+
+#include <2geom/piecewise.h>
+#include <2geom/sbasis-geometric.h>
 
 // needed for on-canvas editting:
 #include "desktop.h"
@@ -110,16 +108,28 @@ PowerStrokePointArrayParamKnotHolderEntity::PowerStrokePointArrayParamKnotHolder
 void
 PowerStrokePointArrayParamKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
 {
+/// @todo how about item transforms???
+    using namespace Geom;
+    Piecewise<D2<SBasis> > const & pwd2 = _pparam->get_pwd2();
+    Piecewise<D2<SBasis> > const & n = _pparam->get_pwd2_normal();
+
     Geom::Point const s = snap_knot_position(p);
-    _pparam->_vector.at(_index) = s;
-//    _pparam->param_set_and_write_new_value(_pparam->_vector);
+    double t = nearest_point(s, pwd2);
+    double offset = dot(s - pwd2.valueAt(t), n.valueAt(t));
+    _pparam->_vector.at(_index) = Geom::Point(t, offset);
     sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false);
 }
 
 Geom::Point
 PowerStrokePointArrayParamKnotHolderEntity::knot_get()
 {
-    Geom::Point canvas_point = _pparam->_vector.at(_index);
+    using namespace Geom;
+    Piecewise<D2<SBasis> > const & pwd2 = _pparam->get_pwd2();
+    Piecewise<D2<SBasis> > const & n = _pparam->get_pwd2_normal();
+
+    Point offset_point = _pparam->_vector.at(_index);
+
+    Point canvas_point = pwd2.valueAt(offset_point[X]) + offset_point[Y] * n.valueAt(offset_point[X]);
     return canvas_point;
 }