index 0a8336102c290feaa5ac46f0c42e32c4563684ad..5ee1582342f6950ab89e294352e3e11f26e82d32 100644 (file)
--- a/src/vanishing-point.cpp
+++ b/src/vanishing-point.cpp
#include "event-context.h"
#include "xml/repr.h"
#include "perspective-line.h"
-
-#include "knotholder.h" // FIXME: can we avoid direct access to knotholder_update_knots?
+#include "shape-editor.h"
+#include "snap.h"
+#include "sp-namedview.h"
namespace Box3D {
};
static void
-vp_drag_sel_changed(Inkscape::Selection *selection, gpointer data)
+vp_drag_sel_changed(Inkscape::Selection */*selection*/, gpointer data)
{
VPDrag *drag = (VPDrag *) data;
drag->updateDraggers();
}
static void
-vp_drag_sel_modified (Inkscape::Selection *selection, guint flags, gpointer data)
+vp_drag_sel_modified (Inkscape::Selection */*selection*/, guint /*flags*/, gpointer data)
{
VPDrag *drag = (VPDrag *) data;
drag->updateLines ();
}
static void
-vp_knot_moved_handler (SPKnot *knot, NR::Point const *ppointer, guint state, gpointer data)
+vp_knot_moved_handler (SPKnot *knot, Geom::Point const *ppointer, guint state, gpointer data)
{
VPDragger *dragger = (VPDragger *) data;
VPDrag *drag = dragger->parent;
- NR::Point p = *ppointer;
+ Geom::Point p = *ppointer;
// FIXME: take from prefs
double snap_dist = SNAP_DIST / inkscape_active_desktop()->current_zoom();
if (!dragger->dragging_started && (state & GDK_SHIFT_MASK)) {
/* with Shift; if there is more than one box linked to this VP
we need to split it and create a new perspective */
- //g_print ("Number of boxes in dragger: %d\n", dragger->numberOfBoxes());
if (dragger->numberOfBoxes() > 1) { // FIXME: Don't do anything if *all* boxes of a VP are selected
- //g_print ("We need to split the VPDragger\n");
std::set<VanishingPoint*, less_ptr> sel_vps = dragger->VPsOfSelectedBoxes();
- /**
- g_print ("===== VPs of selected boxes: ===========================\n");
- for (std::set<VanishingPoint*, less_ptr>::iterator i = sel_vps.begin(); i != sel_vps.end(); ++i) {
- (*i)->printPt();
- }
- g_print ("========================================================\n");
- **/
std::list<SPBox3D *> sel_boxes;
for (std::set<VanishingPoint*, less_ptr>::iterator vp = sel_vps.begin(); vp != sel_vps.end(); ++vp) {
@@ -113,23 +105,17 @@ vp_knot_moved_handler (SPKnot *knot, NR::Point const *ppointer, guint state, gpo
sel_boxes = (*vp)->selectedBoxes(sp_desktop_selection(inkscape_active_desktop()));
// we create a new perspective ...
- Persp3D *new_persp = persp3d_create_xml_element (dragger->parent->document, old_persp);
+ Persp3D *new_persp = persp3d_create_xml_element (dragger->parent->document, old_persp->perspective_impl);
/* ... unlink the boxes from the old one and
FIXME: We need to unlink the _un_selected boxes of each VP so that
the correct boxes are kept with the VP being moved */
std::list<SPBox3D *> bx_lst = persp3d_list_of_boxes(old_persp);
for (std::list<SPBox3D *>::iterator i = bx_lst.begin(); i != bx_lst.end(); ++i) {
- //g_print ("Iterating over box #%d\n", (*i)->my_counter);
if (std::find(sel_boxes.begin(), sel_boxes.end(), *i) == sel_boxes.end()) {
/* if a box in the VP is unselected, move it to the
newly created perspective so that it doesn't get dragged **/
- //g_print (" switching box #%d to new perspective.\n", (*i)->my_counter);
- persp3d_remove_box (old_persp, *i);
- persp3d_add_box (new_persp, *i);
- gchar *href = g_strdup_printf("#%s", SP_OBJECT_REPR(new_persp)->attribute("id"));
- SP_OBJECT_REPR(*i)->setAttribute("inkscape:perspectiveID", href);
- g_free(href);
+ box3d_switch_perspectives(*i, old_persp, new_persp);
}
}
}
@@ -145,7 +131,7 @@ vp_knot_moved_handler (SPKnot *knot, NR::Point const *ppointer, guint state, gpo
// without Shift; see if we need to snap to another dragger
for (GList *di = dragger->parent->draggers; di != NULL; di = di->next) {
VPDragger *d_new = (VPDragger *) di->data;
- if ((d_new != dragger) && (NR::L2 (d_new->point - p) < snap_dist)) {
+ if ((d_new != dragger) && (Geom::L2 (d_new->point - p) < snap_dist)) {
if (have_VPs_of_same_perspective (dragger, d_new)) {
// this would result in degenerate boxes, which we disallow for the time being
continue;
@@ -167,9 +153,8 @@ vp_knot_moved_handler (SPKnot *knot, NR::Point const *ppointer, guint state, gpo
// ... and merge any duplicate perspectives
d_new->mergePerspectives();
-
+
// TODO: Update the new merged dragger
- //d_new->updateKnotShape ();
d_new->updateTip();
d_new->parent->updateBoxDisplays (); // FIXME: Only update boxes in current dragger!
@@ -187,10 +172,20 @@ vp_knot_moved_handler (SPKnot *knot, NR::Point const *ppointer, guint state, gpo
return;
}
}
- }
+ // We didn't snap to another dragger, so we'll try a regular snap
+ SPDesktop *desktop = inkscape_active_desktop();
+ SnapManager &m = desktop->namedview->snap_manager;
+ m.setup(desktop);
+ Inkscape::SnappedPoint s = m.freeSnap(Inkscape::SnapCandidatePoint(p, Inkscape::SNAPSOURCE_OTHER_HANDLE));
+ m.unSetup();
+ if (s.getSnapped()) {
+ p = s.getPoint();
+ sp_knot_moveto(knot, p);
+ }
+ }
- dragger->point = p; // FIXME: Brauchen wir dragger->point überhaupt?
+ dragger->point = p; // FIXME: Is dragger->point being used at all?
dragger->updateVPs(p);
dragger->updateBoxDisplays();
@@ -202,20 +197,8 @@ vp_knot_moved_handler (SPKnot *knot, NR::Point const *ppointer, guint state, gpo
dragger->dragging_started = true;
}
-/* helpful for debugging */
-static void
-vp_knot_clicked_handler(SPKnot *knot, guint state, gpointer data)
-{
- VPDragger *dragger = (VPDragger *) data;
- g_print ("\nVPDragger contains the following VPs: ");
- for (std::list<VanishingPoint>::iterator i = dragger->vps.begin(); i != dragger->vps.end(); ++i) {
- g_print("%d (%d) ", (*i).my_counter, (*i).get_perspective()->my_counter);
- }
- g_print("\n");
-}
-
void
-vp_knot_grabbed_handler (SPKnot *knot, unsigned int state, gpointer data)
+vp_knot_grabbed_handler (SPKnot */*knot*/, unsigned int /*state*/, gpointer data)
{
VPDragger *dragger = (VPDragger *) data;
VPDrag *drag = dragger->parent;
}
static void
-vp_knot_ungrabbed_handler (SPKnot *knot, guint state, gpointer data)
+vp_knot_ungrabbed_handler (SPKnot *knot, guint /*state*/, gpointer data)
{
VPDragger *dragger = (VPDragger *) data;
- //sp_canvas_end_forced_full_redraws(dragger->parent->desktop->canvas);
-
dragger->point_original = dragger->point = knot->pos;
dragger->dragging_started = false;
}
dragger->parent->updateDraggers ();
- //dragger->updateBoxReprs ();
dragger->parent->updateLines ();
dragger->parent->updateBoxHandles ();
void
VanishingPoint::set_pos(Proj::Pt2 const &pt) {
g_return_if_fail (_persp);
- _persp->tmat.set_image_pt (_axis, pt);
+ _persp->perspective_impl->tmat.set_image_pt (_axis, pt);
}
std::list<SPBox3D *>
return sel_boxes;
}
-VPDragger::VPDragger(VPDrag *parent, NR::Point p, VanishingPoint &vp)
+VPDragger::VPDragger(VPDrag *parent, Geom::Point p, VanishingPoint &vp)
{
- //this->vps = NULL;
-
this->parent = parent;
this->point = p;
sp_knot_update_ctrl(this->knot);
// move knot to the given point
- sp_knot_set_position (this->knot, &this->point, SP_KNOT_STATE_NORMAL);
+ sp_knot_set_position (this->knot, this->point, SP_KNOT_STATE_NORMAL);
sp_knot_show (this->knot);
// connect knot's signals
g_signal_connect (G_OBJECT (this->knot), "moved", G_CALLBACK (vp_knot_moved_handler), this);
- g_signal_connect (G_OBJECT (this->knot), "clicked", G_CALLBACK (vp_knot_clicked_handler), this);
g_signal_connect (G_OBJECT (this->knot), "grabbed", G_CALLBACK (vp_knot_grabbed_handler), this);
g_signal_connect (G_OBJECT (this->knot), "ungrabbed", G_CALLBACK (vp_knot_ungrabbed_handler), this);
- /***
- g_signal_connect (G_OBJECT (this->knot), "doubleclicked", G_CALLBACK (vp_knot_doubleclicked_handler), this);
- ***/
// add the initial VP (which may be NULL!)
this->addVP (vp);
- //updateKnotShape();
}
}
VPDragger::~VPDragger()
{
- // unselect if it was selected
- //this->parent->setDeselected(this);
-
// disconnect signals
g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (vp_knot_moved_handler), this);
- g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (vp_knot_clicked_handler), this);
g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (vp_knot_grabbed_handler), this);
g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (vp_knot_ungrabbed_handler), this);
- /***
- g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (vp_knot_doubleclicked_handler), this);
- ***/
-
/* unref should call destroy */
g_object_unref (G_OBJECT (this->knot));
-
- //g_slist_free (this->vps);
- //this->vps = NULL;
}
/**
void
VPDragger::addVP (VanishingPoint &vp, bool update_pos)
{
- //if (!vp.is_finite() || g_slist_find (this->vps, vp)) {
if (!vp.is_finite() || std::find (vps.begin(), vps.end(), vp) != vps.end()) {
// don't add infinite VPs; don't add the same VP twice
return;
if (update_pos) {
vp.set_pos (this->point);
}
- //this->vps = g_slist_prepend (this->vps, vp);
this->vps.push_front (vp);
- //this->persps.include (vp.get_perspective());
this->updateTip();
}
for (std::list<VanishingPoint>::iterator i = vps.begin(); i != vps.end(); ++i) {
if (persp3d_perspectives_coincide(persp, (*i).get_perspective())) {
return true;
- }
+ }
}
return false;
}
}
void
-VPDragger::updateVPs (NR::Point const &pt)
+VPDragger::updateVPs (Geom::Point const &pt)
{
for (std::list<VanishingPoint>::iterator i = this->vps.begin(); i != this->vps.end(); ++i) {
(*i).set_pos (pt);
void
VPDragger::printVPs() {
- g_print ("VPDragger at position (%f, %f):\n", point[NR::X], point[NR::Y]);
+ g_print ("VPDragger at position (%f, %f):\n", point[Geom::X], point[Geom::Y]);
for (std::list<VanishingPoint>::iterator i = this->vps.begin(); i != this->vps.end(); ++i) {
g_print (" VP %s\n", (*i).axisString());
}
this->show_lines = true;
this->front_or_rear_lines = 0x1;
- //this->selected = NULL;
this->dragging = false;
this->sel_changed_connection = this->selection->connectChanged(
VanishingPoint vp;
for (int i = 0; i < 3; ++i) {
- vp.set (box->persp_ref->getObject(), Proj::axes[i]);
+ vp.set(box3d_get_perspective(box), Proj::axes[i]);
addDragger (vp);
}
}
VPDrag::updateBoxHandles ()
{
// FIXME: Is there a way to update the knots without accessing the
- // (previously) statically linked function knotholder_update_knots?
+ // (previously) statically linked function KnotHolder::update_knots?
GSList *sel = (GSList *) selection->itemList();
if (!sel)
SPEventContext *ec = inkscape_active_event_context();
g_assert (ec != NULL);
- if (ec->shape_knot_holder != NULL) {
- knotholder_update_knots(ec->shape_knot_holder, (SPItem *) sel->data);
+ if (ec->shape_editor != NULL) {
+ ec->shape_editor->update_knotholder();
}
}
@@ -710,14 +668,14 @@ VPDrag::drawLinesForFace (const SPBox3D *box, Proj::Axis axis) //, guint corner1
default: g_assert_not_reached();
}
- NR::Point corner1, corner2, corner3, corner4;
+ Geom::Point corner1, corner2, corner3, corner4;
box3d_corners_for_PLs (box, axis, corner1, corner2, corner3, corner4);
- g_return_if_fail (box->persp_ref->getObject());
- Proj::Pt2 vp = persp3d_get_VP (box->persp_ref->getObject(), axis);
+ g_return_if_fail (box3d_get_perspective(box));
+ Proj::Pt2 vp = persp3d_get_VP (box3d_get_perspective(box), axis);
if (vp.is_finite()) {
// draw perspective lines for finite VPs
- NR::Point pt = vp.affine();
+ Geom::Point pt = vp.affine();
if (this->front_or_rear_lines & 0x1) {
// draw 'front' perspective lines
this->addLine (corner1, pt, color);
@@ -730,8 +688,8 @@ VPDrag::drawLinesForFace (const SPBox3D *box, Proj::Axis axis) //, guint corner1
}
} else {
// draw perspective lines for infinite VPs
- NR::Maybe<NR::Point> pt1, pt2, pt3, pt4;
- Persp3D *persp = box->persp_ref->getObject();
+ boost::optional<Geom::Point> pt1, pt2, pt3, pt4;
+ Persp3D *persp = box3d_get_perspective(box);
SPDesktop *desktop = inkscape_active_desktop (); // FIXME: Store the desktop in VPDrag
Box3D::PerspectiveLine pl (corner1, axis, persp);
pt1 = pl.intersection_with_viewbox(desktop);
// don't create draggers for infinite vanishing points
return;
}
- NR::Point p = vp.get_pos();
+ Geom::Point p = vp.get_pos();
for (GList *i = this->draggers; i != NULL; i = i->next) {
VPDragger *dragger = (VPDragger *) i->data;
- if (NR::L2 (dragger->point - p) < MERGE_DIST) {
+ if (Geom::L2 (dragger->point - p) < MERGE_DIST) {
// distance is small, merge this draggable into dragger, no need to create new dragger
dragger->addVP (vp);
- //dragger->updateKnotShape();
return;
}
}
Create a line from p1 to p2 and add it to the lines list
*/
void
-VPDrag::addLine (NR::Point p1, NR::Point p2, guint32 rgba)
+VPDrag::addLine (Geom::Point p1, Geom::Point p2, guint32 rgba)
{
SPCanvasItem *line = sp_canvas_item_new(sp_desktop_controls(inkscape_active_desktop()), SP_TYPE_CTRLLINE, NULL);
sp_ctrlline_set_coords(SP_CTRLLINE(line), p1, p2);
this->lines = g_slist_append (this->lines, line);
}
-} // namespace Box3D
-
+} // namespace Box3D
+
/*
Local Variables:
mode:c++