From 69ae98cb453849c6d32a1c7ea8bc057fb13deea3 Mon Sep 17 00:00:00 2001 From: "Liam P. White" Date: Wed, 25 Jun 2014 11:32:51 -0400 Subject: 1. make it compile (bzr r13341.5.1) --- src/persp3d.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/persp3d.cpp') diff --git a/src/persp3d.cpp b/src/persp3d.cpp index b10e5f23b..1088f098d 100644 --- a/src/persp3d.cpp +++ b/src/persp3d.cpp @@ -140,7 +140,7 @@ void Persp3D::set(unsigned key, gchar const *value) { } // FIXME: Is this the right place for resetting the draggers? - Inkscape::UI::Tools::ToolBase *ec = inkscape_active_event_context(); + Inkscape::UI::Tools::ToolBase *ec = INKSCAPE->active_event_context(); if (SP_IS_BOX3D_CONTEXT(ec)) { Inkscape::UI::Tools::Box3dTool *bc = SP_BOX3D_CONTEXT(ec); bc->_vpdrag->updateDraggers(); -- cgit v1.2.3 From 45f373f3319b598d8e0222fb48e9d3a4760b2044 Mon Sep 17 00:00:00 2001 From: "Liam P. White" Date: Fri, 27 Jun 2014 15:23:06 -0400 Subject: 5. Refactoring of Application class: make copy/assignment operators private, disallow pointers to Application (bzr r13341.5.9) --- src/persp3d.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/persp3d.cpp') diff --git a/src/persp3d.cpp b/src/persp3d.cpp index 1088f098d..7abfd0782 100644 --- a/src/persp3d.cpp +++ b/src/persp3d.cpp @@ -140,7 +140,7 @@ void Persp3D::set(unsigned key, gchar const *value) { } // FIXME: Is this the right place for resetting the draggers? - Inkscape::UI::Tools::ToolBase *ec = INKSCAPE->active_event_context(); + Inkscape::UI::Tools::ToolBase *ec = INKSCAPE.active_event_context(); if (SP_IS_BOX3D_CONTEXT(ec)) { Inkscape::UI::Tools::Box3dTool *bc = SP_BOX3D_CONTEXT(ec); bc->_vpdrag->updateDraggers(); @@ -289,7 +289,7 @@ persp3d_toggle_VP (Persp3D *persp, Proj::Axis axis, bool set_undo) { persp3d_update_box_reprs (persp); persp->updateRepr(SP_OBJECT_WRITE_EXT); if (set_undo) { - DocumentUndo::done(sp_desktop_document(inkscape_active_desktop()), SP_VERB_CONTEXT_3DBOX, + DocumentUndo::done(sp_desktop_document(INKSCAPE.active_desktop()), SP_VERB_CONTEXT_3DBOX, _("Toggle vanishing point")); } } @@ -300,7 +300,7 @@ persp3d_toggle_VPs (std::list p, Proj::Axis axis) { for (std::list::iterator i = p.begin(); i != p.end(); ++i) { persp3d_toggle_VP((*i), axis, false); } - DocumentUndo::done(sp_desktop_document(inkscape_active_desktop()), SP_VERB_CONTEXT_3DBOX, + DocumentUndo::done(sp_desktop_document(INKSCAPE.active_desktop()), SP_VERB_CONTEXT_3DBOX, _("Toggle multiple vanishing points")); } @@ -527,7 +527,7 @@ persp3d_print_all_selected() { g_print ("\n======================================\n"); g_print ("Selected perspectives and their boxes:\n"); - std::list sel_persps = sp_desktop_selection(inkscape_active_desktop())->perspList(); + std::list sel_persps = sp_desktop_selection(INKSCAPE.active_desktop())->perspList(); for (std::list::iterator j = sel_persps.begin(); j != sel_persps.end(); ++j) { Persp3D *persp = SP_PERSP3D(*j); -- cgit v1.2.3 From 8edb6edfedc2665a4fa72045ae7faedd0aaed958 Mon Sep 17 00:00:00 2001 From: "Liam P. White" Date: Tue, 25 Nov 2014 20:35:57 -0500 Subject: Replace INKSCAPE.active_desktop() by SP_ACTIVE_DESKTOP for easier grepability (bzr r13768) --- src/persp3d.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/persp3d.cpp') diff --git a/src/persp3d.cpp b/src/persp3d.cpp index 7abfd0782..d2c6978bb 100644 --- a/src/persp3d.cpp +++ b/src/persp3d.cpp @@ -289,7 +289,7 @@ persp3d_toggle_VP (Persp3D *persp, Proj::Axis axis, bool set_undo) { persp3d_update_box_reprs (persp); persp->updateRepr(SP_OBJECT_WRITE_EXT); if (set_undo) { - DocumentUndo::done(sp_desktop_document(INKSCAPE.active_desktop()), SP_VERB_CONTEXT_3DBOX, + DocumentUndo::done(sp_desktop_document(SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_3DBOX, _("Toggle vanishing point")); } } @@ -300,7 +300,7 @@ persp3d_toggle_VPs (std::list p, Proj::Axis axis) { for (std::list::iterator i = p.begin(); i != p.end(); ++i) { persp3d_toggle_VP((*i), axis, false); } - DocumentUndo::done(sp_desktop_document(INKSCAPE.active_desktop()), SP_VERB_CONTEXT_3DBOX, + DocumentUndo::done(sp_desktop_document(SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_3DBOX, _("Toggle multiple vanishing points")); } @@ -527,7 +527,7 @@ persp3d_print_all_selected() { g_print ("\n======================================\n"); g_print ("Selected perspectives and their boxes:\n"); - std::list sel_persps = sp_desktop_selection(INKSCAPE.active_desktop())->perspList(); + std::list sel_persps = sp_desktop_selection(SP_ACTIVE_DESKTOP)->perspList(); for (std::list::iterator j = sel_persps.begin(); j != sel_persps.end(); ++j) { Persp3D *persp = SP_PERSP3D(*j); -- cgit v1.2.3 From b39afa9ad799017c981668fa0de232e792fb1499 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 4 Dec 2014 14:06:17 +0100 Subject: Store 3d box tool coordinates stored in 'user units'. (bzr r13784) --- src/persp3d.cpp | 112 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 42 deletions(-) (limited to 'src/persp3d.cpp') diff --git a/src/persp3d.cpp b/src/persp3d.cpp index d2c6978bb..b21fd6cab 100644 --- a/src/persp3d.cpp +++ b/src/persp3d.cpp @@ -19,6 +19,7 @@ #include "vanishing-point.h" #include "ui/tools/box3d-tool.h" #include "box3d.h" +#include "svg/stringstream.h" #include "xml/document.h" #include "xml/node-event-vector.h" #include "desktop-handles.h" @@ -30,9 +31,6 @@ using Inkscape::DocumentUndo; static void persp3d_on_repr_attr_changed (Inkscape::XML::Node * repr, const gchar *key, const gchar *oldval, const gchar *newval, bool is_interactive, void * data); -static void persp3d_update_with_point (Persp3DImpl *persp_impl, Proj::Axis const axis, Proj::Pt2 const &new_image); -static gchar * persp3d_pt_to_str (Persp3DImpl *persp_impl, Proj::Axis const axis); - static int global_counter = 0; #include "sp-factory.h" @@ -102,36 +100,48 @@ void Persp3D::release() { // FIXME: Currently we only read the finite positions of vanishing points; // should we move VPs into their own repr (as it's done for SPStop, e.g.)? void Persp3D::set(unsigned key, gchar const *value) { - Persp3DImpl *persp_impl = this->perspective_impl; + + // Read values are in 'user units'. + double scale_x = 1.0; + double scale_y = 1.0; + SPRoot *root = document->getRoot(); + if( root->viewBox_set ) { + scale_x = root->width.computed / root->viewBox.width(); + scale_y = root->height.computed / root->viewBox.height(); + } switch (key) { case SP_ATTR_INKSCAPE_PERSP3D_VP_X: { if (value) { - Proj::Pt2 new_image (value); - persp3d_update_with_point (persp_impl, Proj::X, new_image); + Proj::Pt2 pt (value); + Proj::Pt2 ptn ( pt[0]*scale_x, pt[1]*scale_y, pt[2] ); + perspective_impl->tmat.set_image_pt( Proj::X, ptn ); } break; } case SP_ATTR_INKSCAPE_PERSP3D_VP_Y: { if (value) { - Proj::Pt2 new_image (value); - persp3d_update_with_point (persp_impl, Proj::Y, new_image); - break; + Proj::Pt2 pt (value); + Proj::Pt2 ptn ( pt[0]*scale_x, pt[1]*scale_y, pt[2] ); + perspective_impl->tmat.set_image_pt( Proj::Y, ptn ); } + break; } case SP_ATTR_INKSCAPE_PERSP3D_VP_Z: { if (value) { - Proj::Pt2 new_image (value); - persp3d_update_with_point (persp_impl, Proj::Z, new_image); - break; + Proj::Pt2 pt (value); + Proj::Pt2 ptn ( pt[0]*scale_x, pt[1]*scale_y, pt[2] ); + perspective_impl->tmat.set_image_pt( Proj::Z, ptn ); } + break; } case SP_ATTR_INKSCAPE_PERSP3D_ORIGIN: { if (value) { - Proj::Pt2 new_image (value); - persp3d_update_with_point (persp_impl, Proj::W, new_image); - break; + Proj::Pt2 pt (value); + Proj::Pt2 ptn ( pt[0]*scale_x, pt[1]*scale_y, pt[2] ); + perspective_impl->tmat.set_image_pt( Proj::W, ptn ); } + break; } default: { SPObject::set(key, value); @@ -169,10 +179,19 @@ Persp3D *persp3d_create_xml_element(SPDocument *document, Persp3DImpl *dup) {// repr = xml_doc->createElement("inkscape:perspective"); repr->setAttribute("sodipodi:type", "inkscape:persp3d"); - Proj::Pt2 proj_vp_x = Proj::Pt2 (0.0, document->getHeight().value("px")/2, 1.0); - Proj::Pt2 proj_vp_y = Proj::Pt2 (0.0, 1000.0, 0.0); - Proj::Pt2 proj_vp_z = Proj::Pt2 (document->getWidth().value("px"), document->getHeight().value("px")/2, 1.0); - Proj::Pt2 proj_origin = Proj::Pt2 (document->getWidth().value("px")/2, document->getHeight().value("px")/3, 1.0); + // Use 'user-units' + double width = document->getWidth().value("px"); + double height = document->getHeight().value("px"); + if( document->getRoot()->viewBox_set ) { + Geom::Rect vb = document->getRoot()->viewBox; + width = vb.width(); + height = vb.height(); + } + + Proj::Pt2 proj_vp_x = Proj::Pt2 (0.0, height/2.0, 1.0); + Proj::Pt2 proj_vp_y = Proj::Pt2 (0.0, 1000.0, 0.0); + Proj::Pt2 proj_vp_z = Proj::Pt2 (width, height/2.0, 1.0); + Proj::Pt2 proj_origin = Proj::Pt2 (width/2.0, height/3.0, 1.0 ); if (dup) { proj_vp_x = dup->tmat.column (Proj::X); @@ -217,7 +236,6 @@ Persp3D *persp3d_document_first_persp(SPDocument *document) * Virtual write: write object attributes to repr. */ Inkscape::XML::Node* Persp3D::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { - Persp3DImpl *persp_impl = this->perspective_impl; if ((flags & SP_OBJECT_WRITE_BUILD & SP_OBJECT_WRITE_EXT) && !repr) { // this is where we end up when saving as plain SVG (also in other circumstances?); @@ -226,18 +244,39 @@ Inkscape::XML::Node* Persp3D::write(Inkscape::XML::Document *xml_doc, Inkscape:: } if (flags & SP_OBJECT_WRITE_EXT) { - gchar *str = NULL; // FIXME: Should this be freed each time we set an attribute or only in the end or at all? - str = persp3d_pt_to_str (persp_impl, Proj::X); - repr->setAttribute("inkscape:vp_x", str); - - str = persp3d_pt_to_str (persp_impl, Proj::Y); - repr->setAttribute("inkscape:vp_y", str); - str = persp3d_pt_to_str (persp_impl, Proj::Z); - repr->setAttribute("inkscape:vp_z", str); - - str = persp3d_pt_to_str (persp_impl, Proj::W); - repr->setAttribute("inkscape:persp3d-origin", str); + // Written values are in 'user units'. + double scale_x = 1.0; + double scale_y = 1.0; + SPRoot *root = document->getRoot(); + if( root->viewBox_set ) { + scale_x = root->viewBox.width() / root->width.computed; + scale_y = root->viewBox.height() / root->height.computed; + } + { + Proj::Pt2 pt = perspective_impl->tmat.column( Proj::X ); + Inkscape::SVGOStringStream os; + os << pt[0] * scale_x << " : " << pt[1] * scale_y << " : " << pt[2]; + repr->setAttribute("inkscape:vp_x", os.str().c_str()); + } + { + Proj::Pt2 pt = perspective_impl->tmat.column( Proj::Y ); + Inkscape::SVGOStringStream os; + os << pt[0] * scale_x << " : " << pt[1] * scale_y << " : " << pt[2]; + repr->setAttribute("inkscape:vp_y", os.str().c_str()); + } + { + Proj::Pt2 pt = perspective_impl->tmat.column( Proj::Z ); + Inkscape::SVGOStringStream os; + os << pt[0] * scale_x << " : " << pt[1] * scale_y << " : " << pt[2]; + repr->setAttribute("inkscape:vp_z", os.str().c_str()); + } + { + Proj::Pt2 pt = perspective_impl->tmat.column( Proj::W ); + Inkscape::SVGOStringStream os; + os << pt[0] * scale_x << " : " << pt[1] * scale_y << " : " << pt[2]; + repr->setAttribute("inkscape:persp3d-origin", os.str().c_str()); + } } SPObject::write(xml_doc, repr, flags); @@ -328,11 +367,6 @@ persp3d_rotate_VP (Persp3D *persp, Proj::Axis axis, double angle, bool alt_press persp->updateRepr(SP_OBJECT_WRITE_EXT); } -void -persp3d_update_with_point (Persp3DImpl *persp_impl, Proj::Axis const axis, Proj::Pt2 const &new_image) { - persp_impl->tmat.set_image_pt (axis, new_image); -} - void persp3d_apply_affine_transformation (Persp3D *persp, Geom::Affine const &xform) { persp->perspective_impl->tmat *= xform; @@ -340,12 +374,6 @@ persp3d_apply_affine_transformation (Persp3D *persp, Geom::Affine const &xform) persp->updateRepr(SP_OBJECT_WRITE_EXT); } -gchar * -persp3d_pt_to_str (Persp3DImpl *persp_impl, Proj::Axis const axis) -{ - return persp_impl->tmat.pt_to_str(axis); -} - void persp3d_add_box (Persp3D *persp, SPBox3D *box) { Persp3DImpl *persp_impl = persp->perspective_impl; -- cgit v1.2.3 From 30b6a43219b66aba1a9ebade8aca50910f2c25cc Mon Sep 17 00:00:00 2001 From: "Liam P. White" Date: Sun, 21 Dec 2014 10:39:39 -0500 Subject: Deprecate and remove sp_desktop_selection in favor of SPDesktop::getSelection (bzr r13809) --- src/persp3d.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/persp3d.cpp') diff --git a/src/persp3d.cpp b/src/persp3d.cpp index b21fd6cab..797e439c0 100644 --- a/src/persp3d.cpp +++ b/src/persp3d.cpp @@ -22,6 +22,7 @@ #include "svg/stringstream.h" #include "xml/document.h" #include "xml/node-event-vector.h" +#include "desktop.h" #include "desktop-handles.h" #include #include "verbs.h" @@ -555,7 +556,7 @@ persp3d_print_all_selected() { g_print ("\n======================================\n"); g_print ("Selected perspectives and their boxes:\n"); - std::list sel_persps = sp_desktop_selection(SP_ACTIVE_DESKTOP)->perspList(); + std::list sel_persps = SP_ACTIVE_DESKTOP->getSelection()->perspList(); for (std::list::iterator j = sel_persps.begin(); j != sel_persps.end(); ++j) { Persp3D *persp = SP_PERSP3D(*j); -- cgit v1.2.3 From 3dbf9a08680c6d7252c79397dbf12082ead61bd7 Mon Sep 17 00:00:00 2001 From: "Liam P. White" Date: Sun, 21 Dec 2014 16:58:32 -0500 Subject: Remove sp_desktop_document and finish cleanup of desktop-handles.h (bzr r13820) --- src/persp3d.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/persp3d.cpp') diff --git a/src/persp3d.cpp b/src/persp3d.cpp index 797e439c0..c761947ad 100644 --- a/src/persp3d.cpp +++ b/src/persp3d.cpp @@ -23,7 +23,7 @@ #include "xml/document.h" #include "xml/node-event-vector.h" #include "desktop.h" -#include "desktop-handles.h" + #include #include "verbs.h" #include "util/units.h" @@ -329,7 +329,7 @@ persp3d_toggle_VP (Persp3D *persp, Proj::Axis axis, bool set_undo) { persp3d_update_box_reprs (persp); persp->updateRepr(SP_OBJECT_WRITE_EXT); if (set_undo) { - DocumentUndo::done(sp_desktop_document(SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_3DBOX, + DocumentUndo::done(SP_ACTIVE_DESKTOP->getDocument(), SP_VERB_CONTEXT_3DBOX, _("Toggle vanishing point")); } } @@ -340,7 +340,7 @@ persp3d_toggle_VPs (std::list p, Proj::Axis axis) { for (std::list::iterator i = p.begin(); i != p.end(); ++i) { persp3d_toggle_VP((*i), axis, false); } - DocumentUndo::done(sp_desktop_document(SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_3DBOX, + DocumentUndo::done(SP_ACTIVE_DESKTOP->getDocument(), SP_VERB_CONTEXT_3DBOX, _("Toggle multiple vanishing points")); } -- cgit v1.2.3