index cf6d1cecd91ce583f588ed013239abd98d840196..2eef0cd5b21b5cecb855150ec4424ae363865667 100644 (file)
#include "inkscape.h"
-// You might need to include other 2geom files. You can add them here:
#include <2geom/path.h>
namespace Inkscape {
namespace LivePathEffect {
+namespace PP {
+
+class KnotHolderEntityOffset : public LPEKnotHolderEntity
+{
+public:
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual Geom::Point knot_get();
+};
+
+} // namespace PP
+
LPEPerspectivePath::LPEPerspectivePath(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
// initialise your parameters here:
registerParameter( dynamic_cast<Parameter *>(&offsety) );
registerParameter( dynamic_cast<Parameter *>(&uses_plane_xy) );
+ registerKnotHolderHandle(new PP::KnotHolderEntityOffset(), _("Adjust the origin"));
+
concatenate_before_pwd2 = true; // don't split the path into its subpaths
Persp3D *persp = persp3d_document_first_persp(inkscape_active_document());
void
LPEPerspectivePath::doBeforeEffect (SPLPEItem *lpeitem)
{
- original_bbox(lpeitem, true);
+ original_bbox(lpeitem, true);
}
Geom::Piecewise<Geom::D2<Geom::SBasis> >
@@ -83,17 +95,16 @@ LPEPerspectivePath::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > cons
// remove this once we have unified coordinate systems
path_a_pw = path_a_pw + Geom::Point(offsetx, -offsety);
- D2<Piecewise<SBasis> > B = make_cuts_independant(path_a_pw);
+ D2<Piecewise<SBasis> > B = make_cuts_independent(path_a_pw);
Piecewise<SBasis> preimage[4];
- Geom::Point orig = Geom::Point(uses_plane_xy ? boundingbox_X.max() : boundingbox_X.min(),
- boundingbox_Y.middle());
-
//Geom::Point orig = Geom::Point(bounds_X.min(), bounds_Y.middle());
//orig = Geom::Point(orig[X], sp_document_height(inkscape_active_document()) - orig[Y]);
//double offset = uses_plane_xy ? boundingbox_X.extent() : 0.0;
+ orig = Point(uses_plane_xy ? boundingbox_X.max() : boundingbox_X.min(), boundingbox_Y.middle());
+
/**
g_print ("Orig: (%8.2f, %8.2f)\n", orig[X], orig[Y]);
@@ -128,7 +139,7 @@ LPEPerspectivePath::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > cons
+ preimage[2] * tmat[j][2]
+ tmat[j][3];
}
- D2<Piecewise<SBasis> > result(divide(res[0],res[2], 3),
+ D2<Piecewise<SBasis> > result(divide(res[0],res[2], 3),
divide(res[1],res[2], 3));
Piecewise<D2<SBasis> > output = sectionize(result);
@@ -136,7 +147,44 @@ LPEPerspectivePath::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > cons
return output;
}
-/* ######################## */
+namespace PP {
+
+// TODO: make this more generic
+static LPEPerspectivePath *
+get_effect(SPItem *item)
+{
+ Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
+ if (effect->effectType() != PERSPECTIVE_PATH) {
+ g_print ("Warning: Effect is not of type LPEPerspectivePath!\n");
+ return NULL;
+ }
+ return static_cast<LPEPerspectivePath *>(effect);
+}
+
+void
+KnotHolderEntityOffset::knot_set(Geom::Point const &p, Geom::Point const &origin, guint /*state*/)
+{
+ using namespace Geom;
+
+ LPEPerspectivePath* lpe = get_effect(item);
+
+ Geom::Point const s = snap_knot_position(p);
+
+ lpe->offsetx.param_set_value((s - origin)[Geom::X]);
+ lpe->offsety.param_set_value(-(s - origin)[Geom::Y]); // additional minus sign is due to coordinate system flipping
+
+ // FIXME: this should not directly ask for updating the item. It should write to SVG, which triggers updating.
+ sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
+}
+
+Geom::Point
+KnotHolderEntityOffset::knot_get()
+{
+ LPEPerspectivePath* lpe = get_effect(item);
+ return lpe->orig + Geom::Point(lpe->offsetx, -lpe->offsety);
+}
+
+} // namespace PP
} //namespace LivePathEffect
} /* namespace Inkscape */