diff options
| author | JF Barraud <jf.barraud@gmail.com> | 2009-01-25 00:45:24 +0000 |
|---|---|---|
| committer | jfbarraud <jfbarraud@users.sourceforge.net> | 2009-01-25 00:45:24 +0000 |
| commit | 50d81e385bf2d9d76f36985284d2aa3254c0f27c (patch) | |
| tree | 961160ed16302548fcbca959d349db011b4945df /src/live_effects | |
| parent | fix percentage coordinates for rect and line. (svgtestsuite-1.1/coords-units-... (diff) | |
| download | inkscape-50d81e385bf2d9d76f36985284d2aa3254c0f27c.tar.gz inkscape-50d81e385bf2d9d76f36985284d2aa3254c0f27c.zip | |
hatches lpe: parameters renamed + tips, knot-lpe: can use 'unit of stroke width'.
(bzr r7170)
Diffstat (limited to 'src/live_effects')
| -rw-r--r-- | src/live_effects/lpe-knot.cpp | 19 | ||||
| -rw-r--r-- | src/live_effects/lpe-knot.h | 6 | ||||
| -rw-r--r-- | src/live_effects/lpe-rough-hatches.cpp | 98 | ||||
| -rw-r--r-- | src/live_effects/lpe-rough-hatches.h | 7 |
4 files changed, 78 insertions, 52 deletions
diff --git a/src/live_effects/lpe-knot.cpp b/src/live_effects/lpe-knot.cpp index 1802135d7..e369dcd95 100644 --- a/src/live_effects/lpe-knot.cpp +++ b/src/live_effects/lpe-knot.cpp @@ -13,6 +13,7 @@ #include "display/curve.h" #include "live_effects/lpe-knot.h" #include "svg/svg.h" +#include "style.h" #include <2geom/sbasis-to-bezier.h> #include <2geom/sbasis.h> @@ -354,12 +355,14 @@ CrossingPoints::inherit_signs(CrossingPoints const &other, int default_value) LPEKnot::LPEKnot(LivePathEffectObject *lpeobject) : Effect(lpeobject), // initialise your parameters here: - interruption_width(_("Gap width"), _("The width of the gap in the path where it self-intersects"), "interruption_width", &wr, this, 10), + interruption_width(_("Interruption width"), _("Size of hidden region of lower string"), "interruption_width", &wr, this, 3), + prop_to_stroke_width(_("unit of stroke width"), _("Consider 'Gap width' as a ratio of stroke width."), "prop_to_stroke_width", &wr, this, true), switcher_size(_("Switcher size"), _("Orientation indicator/switcher size"), "switcher_size", &wr, this, 15), crossing_points_vector(_("Crossing Signs"), _("Crossings signs"), "crossing_points_vector", &wr, this) { // register all your parameters here, so Inkscape knows which parameters this effect has: registerParameter( dynamic_cast<Parameter *>(&interruption_width) ); + registerParameter( dynamic_cast<Parameter *>(&prop_to_stroke_width) ); registerParameter( dynamic_cast<Parameter *>(&switcher_size) ); registerParameter( dynamic_cast<Parameter *>(&crossing_points_vector) ); @@ -404,7 +407,11 @@ LPEKnot::doEffect_path (std::vector<Geom::Path> const &input_path) { using namespace Geom; std::vector<Geom::Path> path_out; + //double width = interruption_width; double width = interruption_width; + if ( prop_to_stroke_width.get_value() ) { + width *= stroke_width; + } LPEKnotNS::CrossingPoints old_crdata(crossing_points_vector.data()); @@ -459,6 +466,16 @@ LPEKnot::doEffect_path (std::vector<Geom::Path> const &input_path) } + +void +LPEKnot::doBeforeEffect (SPLPEItem *lpeitem) +{ + using namespace Geom; + //FIXME: do we have to be more carefull to access stroke width? + stroke_width = lpeitem->style->stroke_width.computed; +} + + static LPEKnot * get_effect(SPItem *item) { diff --git a/src/live_effects/lpe-knot.h b/src/live_effects/lpe-knot.h index cbd33466d..5ece6d6fb 100644 --- a/src/live_effects/lpe-knot.h +++ b/src/live_effects/lpe-knot.h @@ -16,7 +16,8 @@ #include "live_effects/effect.h" #include "live_effects/parameter/parameter.h" #include "live_effects/parameter/array.h" -#include "live_effects/parameter/path.h" +//#include "live_effects/parameter/path.h" +#include "live_effects/parameter/bool.h" #include "2geom/crossing.h" namespace Inkscape { @@ -56,6 +57,7 @@ public: virtual ~LPEKnot(); virtual void doOnApply (SPLPEItem *lpeitem); + virtual void doBeforeEffect (SPLPEItem *lpeitem); virtual std::vector<Geom::Path> doEffect_path (std::vector<Geom::Path> const & input_path); /* the knotholder entity classes must be declared friends */ @@ -68,7 +70,9 @@ private: void updateSwitcher(); // add the parameters for your effect here: ScalarParam interruption_width; + BoolParam prop_to_stroke_width; ScalarParam switcher_size; + double stroke_width; ArrayParam<double> crossing_points_vector; LPEKnotNS::CrossingPoints crossing_points; diff --git a/src/live_effects/lpe-rough-hatches.cpp b/src/live_effects/lpe-rough-hatches.cpp index 94d9669aa..1bac02ec4 100644 --- a/src/live_effects/lpe-rough-hatches.cpp +++ b/src/live_effects/lpe-rough-hatches.cpp @@ -141,22 +141,6 @@ public: (*this)[next.first][next.second].prev_on_curve = std::pair<unsigned,unsigned>(i,j);
}
}
-#if 0
- std::cout<<"\n";
- for (unsigned i=0; i<temp.size()-1; i++){
- std::cout<<temp[i].level<<","<<temp[i].idx<<" -> ";
- }
- std::cout<<"\n";
- for (unsigned i=0; i<size(); i++){
- for (unsigned j=0; j<(*this)[i].size(); j++){
- std::cout<<"level:"<<i<<", idx:"<<j<<" - ";
- std::cout<<"next:"<<(*this)[i][j].next_on_curve.first<<",";
- std::cout<<(*this)[i][j].next_on_curve.second<<" - ";
- std::cout<<"prev:"<<(*this)[i][j].prev_on_curve.first<<",";
- std::cout<<(*this)[i][j].prev_on_curve.second<<"\n";
- }
- }
-#endif
}
void findFirstUnused(unsigned &level, unsigned &idx){
@@ -267,32 +251,37 @@ Piecewise<D2<SBasis> > bend(Piecewise<D2<SBasis> > const &f, Piecewise<SBasis> b //--------------------------------------------------------
LPERoughHatches::LPERoughHatches(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
- dist_rdm(_("Dist randomness"), _("Variation of dist between hatches, in %."), "dist_rdm", &wr, this, 75),
+ direction(_("Hatches width and dir"), _("Defines hatches frequency and direction"), "direction", &wr, this, Geom::Point(50,0)),
+ dist_rdm(_("Frequency randomness"), _("Variation of dist between hatches, in %."), "dist_rdm", &wr, this, 75),
growth(_("Growth"), _("Growth of distance between hatches."), "growth", &wr, this, 0.),
- scale_tf(_("Start smothness (front side)"), _("MISSING DESCRIPTION"), "scale_tf", &wr, this, 1.),
- scale_tb(_("Start smothness (back side)"), _("MISSING DESCRIPTION"), "scale_tb", &wr, this, 1.),
- scale_bf(_("End smothness (front side)"), _("MISSING DESCRIPTION"), "scale_bf", &wr, this, 1.),
- scale_bb(_("End smothness (back side)"), _("MISSING DESCRIPTION"), "scale_bb", &wr, this, 1.),
- top_edge_variation(_("Start edge variance"), _("The amount of random jitter to move the hatches start"), "top_edge_variation", &wr, this, 0),
- bot_edge_variation(_("End edge variance"), _("The amount of random jitter to move the hatches end"), "bot_edge_variation", &wr, this, 0),
- top_tgt_variation(_("Start tangential variance"), _("The amount of random jitter to move the hatches start along the boundary"), "top_tgt_variation", &wr, this, 0),
- bot_tgt_variation(_("End tangential variance"), _("The amount of random jitter to move the hatches end along the boundary"), "bot_tgt_variation", &wr, this, 0),
- top_smth_variation(_("Start smoothness variance"), _("Randomness of the smoothness of the U turn at hatches start"), "top_smth_variation", &wr, this, 0),
- bot_smth_variation(_("End spacing variance"), _("Randomness of the smoothness of the U turn at hatches end"), "bot_smth_variation", &wr, this, 0),
- fat_output(_("Generate thick/thin path"), _("Simulate a stroke of varrying width"), "fat_output", &wr, this, true),
+//FIXME: top/bottom names are inverted in the UI/svg and in the code!!
+ scale_tf(_("Half turns smoothness: 1st side, in"), _("Set smoothness/sharpness of path when reaching a 'bottom' halfturn. 0=sharp, 1=default"), "scale_bf", &wr, this, 1.),
+ scale_tb(_("1st side, out"), _("Set smoothness/sharpness of path when leaving a 'bottom' halfturn. 0=sharp, 1=default"), "scale_bb", &wr, this, 1.),
+ scale_bf(_("2nd side, in "), _("Set smoothness/sharpness of path when reaching a 'top' halfturn. 0=sharp, 1=default"), "scale_tf", &wr, this, 1.),
+ scale_bb(_("2nd side, out"), _("Set smoothness/sharpness of path when leaving a 'top' halfturn. 0=sharp, 1=default"), "scale_tb", &wr, this, 1.),
+ top_smth_variation(_("variance: 1st side"), _("Randomness of 'bottom' halfturns smoothness"), "bottom_smth_variation", &wr, this, 0),
+ bot_smth_variation(_("2nd side"), _("Randomness of 'top' halfturns smoothness"), "bottom_smth_variation", &wr, this, 0),
+//
+ top_edge_variation(_("Magnitude jitter: 1st side"), _("Randomly moves 'bottom' halfsturns to produce magnitude variations."), "bottom_edge_variation", &wr, this, 0),
+ bot_edge_variation(_("2nd side"), _("Randomly moves 'top' halfsturns to produce magnitude variations."), "top_edge_variation", &wr, this, 0),
+ top_tgt_variation(_("Parallelism jitter: 1st side"), _("Add direction randomness by moving 'bottom' halfsturns tangentially to the boundary."), "bottom_tgt_variation", &wr, this, 0),
+ bot_tgt_variation(_("2nd side"), _("Add direction randomness by randomly moving 'top' halfsturns tangentially to the boundary."), "top_tgt_variation", &wr, this, 0),
+//
do_bend(_("Bend hatches"), _("Add a global bend to the hatches (slower)"), "do_bend", &wr, this, true),
- stroke_width_top(_("Stroke width (start side)"), _("Width at hatches 'start'"), "stroke_width_top", &wr, this, 1.),
- stroke_width_bot(_("Stroke width (end side)"), _("Width at hatches 'end'"), "stroke_width_bot", &wr, this, 1.),
- front_thickness(_("Front thickness (%)"), _("MISSING DESCRIPTION"), "front_thickness", &wr, this, 1.),
- back_thickness(_("Back thickness (%)"), _("MISSING DESCRIPTION"), "back_thickness", &wr, this, .25),
- bender(_("Global bending"), _("Relative position to ref point defines global bending direction and amount"), "bender", &wr, this, NULL, Geom::Point(-5,0)),
- direction(_("Hatches width and dir"), _("Defines hatches frequency and direction"), "direction", &wr, this, Geom::Point(50,0))
+ //bender(_("Global bending"), _("Relative position to ref point defines global bending direction and amount"), "bender", &wr, this, NULL, Geom::Point(-5,0)),
+ bender(_("Global bending"), _("Relative position to ref point defines global bending direction and amount"), "bender", &wr, this, Geom::Point(-5,0)),
+//
+ fat_output(_("Generate thick/thin path"), _("Simulate a stroke of varrying width"), "fat_output", &wr, this, true),
+ stroke_width_top(_("Thikness: at 1st side"), _("Width at 'bottom' half turns"), "stroke_width_bottom", &wr, this, 1.),
+ stroke_width_bot(_("at 2nd side"), _("Width at 'top' halfturns"), "stroke_width_bottom", &wr, this, 1.),
+ front_thickness(_("from 2nd to 1st side"), _("Width of paths from 'top' to 'bottom' halfturns"), "front_thickness", &wr, this, 1.),
+ back_thickness(_("from 1st to 2nd side"), _("Width of paths from 'top' to 'bottom' halfturns"), "back_thickness", &wr, this, .25)
{
registerParameter( dynamic_cast<Parameter *>(&direction) );
- registerParameter( dynamic_cast<Parameter *>(&do_bend) );
- registerParameter( dynamic_cast<Parameter *>(&bender) );
registerParameter( dynamic_cast<Parameter *>(&dist_rdm) );
registerParameter( dynamic_cast<Parameter *>(&growth) );
+ registerParameter( dynamic_cast<Parameter *>(&do_bend) );
+ registerParameter( dynamic_cast<Parameter *>(&bender) );
registerParameter( dynamic_cast<Parameter *>(&top_edge_variation) );
registerParameter( dynamic_cast<Parameter *>(&bot_edge_variation) );
registerParameter( dynamic_cast<Parameter *>(&top_tgt_variation) );
@@ -332,12 +321,15 @@ LPERoughHatches::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & Piecewise<D2<SBasis> > result;
Piecewise<D2<SBasis> > transformed_pwd2_in = pwd2_in;
+ Point transformed_org = direction.getOrigin();
Piecewise<SBasis> tilter;//used to bend the hatches
Matrix bend_mat;//used to bend the hatches
if (do_bend.get_value()){
- Point bend_dir = -rot90(unit_vector(direction.getOrigin() - bender));
- double bend_amount = L2(direction.getOrigin() - bender);
+ //Point bend_dir = -rot90(unit_vector(direction.getOrigin() - bender));
+ //double bend_amount = L2(direction.getOrigin() - bender);
+ Point bend_dir = -rot90(unit_vector(direction.getVector()));
+ double bend_amount = L2(direction.getVector());
bend_mat = Matrix(-bend_dir[Y], bend_dir[X], bend_dir[X], bend_dir[Y],0,0);
transformed_pwd2_in = pwd2_in * bend_mat;
tilter = Piecewise<SBasis>(shift(Linear(bend_amount),1));
@@ -351,9 +343,10 @@ LPERoughHatches::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & Point hatches_dir = rot90(unit_vector(direction.getVector()));
Matrix mat(-hatches_dir[Y], hatches_dir[X], hatches_dir[X], hatches_dir[Y],0,0);
transformed_pwd2_in = transformed_pwd2_in * mat;
+ transformed_org *= mat;
std::vector<std::vector<Point> > snakePoints;
- snakePoints = linearSnake(transformed_pwd2_in);
+ snakePoints = linearSnake(transformed_pwd2_in, transformed_org);
if ( snakePoints.size() > 0 ){
Piecewise<D2<SBasis> >smthSnake = smoothSnake(snakePoints);
smthSnake = smthSnake*mat.inverse();
@@ -371,9 +364,11 @@ LPERoughHatches::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & // Generate the levels with random, growth...
//------------------------------------------------
std::vector<double>
-LPERoughHatches::generateLevels(Interval const &domain){
+LPERoughHatches::generateLevels(Interval const &domain, double x_org){
std::vector<double> result;
- double x = domain.min() + double(hatch_dist)/2.;
+ int n = int((domain.min()-x_org)/hatch_dist);
+ double x = x_org + n * hatch_dist;
+ //double x = domain.min() + double(hatch_dist)/2.;
double step = double(hatch_dist);
double scale = 1+(hatch_dist*growth/domain.extent());
while (x < domain.max()){
@@ -392,17 +387,17 @@ LPERoughHatches::generateLevels(Interval const &domain){ // Walk through the intersections to create linear hatches
//-------------------------------------------------------
std::vector<std::vector<Point> >
-LPERoughHatches::linearSnake(Piecewise<D2<SBasis> > const &f){
+LPERoughHatches::linearSnake(Piecewise<D2<SBasis> > const &f, Point const &org){
std::vector<std::vector<Point> > result;
Piecewise<SBasis> x = make_cuts_independent(f)[X];
- //Rque: derivative is computed twice in the 2 lines below!!
+ //Remark: derivative is computed twice in the 2 lines below!!
Piecewise<SBasis> dx = derivative(x);
OptInterval range = bounds_exact(x);
if (not range) return result;
- std::vector<double> levels = generateLevels(*range);
+ std::vector<double> levels = generateLevels(*range, org[X]);
std::vector<std::vector<double> > times;
times = multi_roots(x,levels);
@@ -432,9 +427,16 @@ LPERoughHatches::linearSnake(Piecewise<D2<SBasis> > const &f){ LevelsCrossings lscs(times,f,dx);
unsigned i,j;
lscs.findFirstUnused(i,j);
+
std::vector<Point> result_component;
+ int n = int((range->min()-org[X])/hatch_dist);
while ( i < lscs.size() ){
int dir = 0;
+ //switch orientation of first segment according to org position.
+ if (n % 2 == 0){
+ j = lscs[i].size()-1;
+ dir = 2;
+ }
while ( i < lscs.size() ){
result_component.push_back(lscs[i][j].pt);
lscs[i][j].used = true;
@@ -572,9 +574,11 @@ LPERoughHatches::resetDefaults(SPItem * item) top_edge_variation.param_set_value( (*bbox)[Y].extent()/10, 0 );
bot_edge_variation.param_set_value( (*bbox)[Y].extent()/10, 0 );
}
- direction.set_and_write_new_values(origin, vector);
- bender.param_set_and_write_new_value( origin + Geom::Point(5,0) );
- hatch_dist = Geom::L2(vector)/5;
+ //direction.set_and_write_new_values(origin, vector);
+ //bender.param_set_and_write_new_value( origin + Geom::Point(5,0) );
+ direction.set_and_write_new_values(origin + Geom::Point(0,-5), vector);
+ bender.set_and_write_new_values( origin, Geom::Point(5,0) );
+ hatch_dist = Geom::L2(vector)/2;
}
diff --git a/src/live_effects/lpe-rough-hatches.h b/src/live_effects/lpe-rough-hatches.h index 23b2a0966..816955e4d 100644 --- a/src/live_effects/lpe-rough-hatches.h +++ b/src/live_effects/lpe-rough-hatches.h @@ -37,10 +37,10 @@ public: virtual void doBeforeEffect(SPLPEItem * item);
std::vector<double>
- generateLevels(Geom::Interval const &domain);
+ generateLevels(Geom::Interval const &domain, double x_org);
std::vector<std::vector<Geom::Point> >
- linearSnake(Geom::Piecewise<Geom::D2<Geom::SBasis> > const &f);
+ linearSnake(Geom::Piecewise<Geom::D2<Geom::SBasis> > const &f, Geom::Point const &org);
Geom::Piecewise<Geom::D2<Geom::SBasis> >
smoothSnake(std::vector<std::vector<Geom::Point> > const &linearSnake);
@@ -64,8 +64,9 @@ private: ScalarParam stroke_width_bot;
ScalarParam front_thickness, back_thickness;
- PointParam bender;
+ //PointParam bender;
VectorParam direction;
+ VectorParam bender;
LPERoughHatches(const LPERoughHatches&);
LPERoughHatches& operator=(const LPERoughHatches&);
|
