From 8640e3a8755e772cc7982a9d6f8a47c6ee0dae00 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Wed, 22 Jun 2011 03:07:58 -0700 Subject: Warning cleanup. (bzr r10339) --- src/live_effects/parameter/powerstrokepointarray.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/live_effects/parameter/powerstrokepointarray.cpp') diff --git a/src/live_effects/parameter/powerstrokepointarray.cpp b/src/live_effects/parameter/powerstrokepointarray.cpp index 9d43e8447..66337fd8f 100644 --- a/src/live_effects/parameter/powerstrokepointarray.cpp +++ b/src/live_effects/parameter/powerstrokepointarray.cpp @@ -70,8 +70,7 @@ PowerStrokePointArrayParam::param_newWidget(Gtk::Tooltips * /*tooltips*/) } -void -PowerStrokePointArrayParam::param_transform_multiply(Geom::Affine const& postmul, bool /*set*/) +void PowerStrokePointArrayParam::param_transform_multiply(Geom::Affine const& /*postmul*/, bool /*set*/) { // param_set_and_write_new_value( (*this) * postmul ); } -- cgit v1.2.3 From faf187547d7028652e2940ed4fbd14ffe930b40c Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Fri, 4 Nov 2011 22:07:55 +0100 Subject: Powerstroke: add erasing of knots with ctrl+alt (LPE parameter editing on-canvas code is seriously flawed) (bzr r10719) --- .../parameter/powerstrokepointarray.cpp | 38 +++++++++++++++++----- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'src/live_effects/parameter/powerstrokepointarray.cpp') diff --git a/src/live_effects/parameter/powerstrokepointarray.cpp b/src/live_effects/parameter/powerstrokepointarray.cpp index 66337fd8f..5139f0e41 100644 --- a/src/live_effects/parameter/powerstrokepointarray.cpp +++ b/src/live_effects/parameter/powerstrokepointarray.cpp @@ -93,6 +93,11 @@ public: virtual Geom::Point knot_get(); virtual void knot_click(guint state); + /** Checks whether the index falls within the size of the parameter's vector */ + bool valid_index(unsigned int index) { + return (_pparam->_vector.size() > index); + }; + private: PowerStrokePointArrayParam *_pparam; unsigned int _index; @@ -107,8 +112,13 @@ PowerStrokePointArrayParamKnotHolderEntity::PowerStrokePointArrayParamKnotHolder void PowerStrokePointArrayParamKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/) { -/// @todo how about item transforms??? using namespace Geom; + + if (!valid_index(_index)) { + return; + } + + /// @todo how about item transforms??? Piecewise > const & pwd2 = _pparam->get_pwd2(); Piecewise > const & n = _pparam->get_pwd2_normal(); @@ -123,6 +133,11 @@ Geom::Point PowerStrokePointArrayParamKnotHolderEntity::knot_get() { using namespace Geom; + + if (!valid_index(_index)) { + return Geom::Point(infinity(), infinity()); + } + Piecewise > const & pwd2 = _pparam->get_pwd2(); Piecewise > const & n = _pparam->get_pwd2_normal(); @@ -135,15 +150,22 @@ PowerStrokePointArrayParamKnotHolderEntity::knot_get() void PowerStrokePointArrayParamKnotHolderEntity::knot_click(guint state) { - g_print ("This is the %d handle associated to parameter '%s'\n", _index, _pparam->param_key.c_str()); +//g_print ("This is the %d handle associated to parameter '%s'\n", _index, _pparam->param_key.c_str()); if (state & GDK_CONTROL_MASK) { - std::vector & vec = _pparam->_vector; - vec.insert(vec.begin() + _index, 1, vec.at(_index)); - _pparam->param_set_and_write_new_value(vec); - g_print ("Added handle %d associated to parameter '%s'\n", _index, _pparam->param_key.c_str()); - /// @todo this BUGS ! the knot stuff should be reloaded when adding a new node! - } + if (state & GDK_MOD1_MASK) { + // delete the clicked knot + std::vector & vec = _pparam->_vector; + vec.erase(vec.begin() + _index); + _pparam->param_set_and_write_new_value(vec); + } else { + // add a knot + std::vector & vec = _pparam->_vector; + vec.insert(vec.begin() + _index, 1, vec.at(_index)); + _pparam->param_set_and_write_new_value(vec); + } + } + } void -- cgit v1.2.3 From d98a89be688002c6fb69775a324af6669203090a Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sun, 6 Nov 2011 00:46:09 +0100 Subject: Powerstroke: adjust control points when adding or deleting knots, to try and keep the shape a bit the same... (bzr r10728) --- .../parameter/powerstrokepointarray.cpp | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'src/live_effects/parameter/powerstrokepointarray.cpp') diff --git a/src/live_effects/parameter/powerstrokepointarray.cpp b/src/live_effects/parameter/powerstrokepointarray.cpp index 5139f0e41..fccbad7e5 100644 --- a/src/live_effects/parameter/powerstrokepointarray.cpp +++ b/src/live_effects/parameter/powerstrokepointarray.cpp @@ -76,6 +76,42 @@ void PowerStrokePointArrayParam::param_transform_multiply(Geom::Affine const& /* } +/** call this method to recalculate the controlpoints such that they stay at the same location relative to the new path. Useful after adding/deleting nodes to the path.*/ +void +PowerStrokePointArrayParam::recalculate_controlpoints_for_new_pwd2(Geom::Piecewise > const & pwd2_in) +{ + if (!last_pwd2.empty()) { + if (last_pwd2.size() > pwd2_in.size()) { + // Path has become shorter: rescale offsets + double factor = (double)pwd2_in.size() / (double)last_pwd2.size(); + for (unsigned int i = 0; i < _vector.size(); ++i) { + _vector[i][Geom::X] *= factor; + } + } else if (last_pwd2.size() < pwd2_in.size()) { + // Path has become longer: probably node added, maintain position of knots + Geom::Piecewise > normal = rot90(unitVector(derivative(pwd2_in))); + for (unsigned int i = 0; i < _vector.size(); ++i) { + Geom::Point pt = _vector[i]; + Geom::Point position = last_pwd2.valueAt(pt[Geom::X]) + pt[Geom::Y] * last_pwd2_normal.valueAt(pt[Geom::X]); + + double t = nearest_point(position, pwd2_in); + double offset = dot(position - pwd2_in.valueAt(t), normal.valueAt(t)); + _vector[i] = Geom::Point(t, offset); + } + } + + write_to_SVG(); + } +} + +void +PowerStrokePointArrayParam::set_pwd2(Geom::Piecewise > const & pwd2_in, Geom::Piecewise > const & pwd2_normal_in) +{ + last_pwd2 = pwd2_in; + last_pwd2_normal = pwd2_normal_in; +} + + void PowerStrokePointArrayParam::set_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color) { -- cgit v1.2.3