124
124
static void sp_box3d_context_finish(SPEventContext *ec)
126
Box3DContext *bc = SP_BOX3D_CONTEXT(ec);
127
SPDesktop *desktop = ec->desktop;
126
Box3DContext *bc = SP_BOX3D_CONTEXT(ec);
127
SPDesktop *desktop = ec->desktop;
129
sp_canvas_item_ungrab(SP_CANVAS_ITEM(desktop->acetate), GDK_CURRENT_TIME);
129
sp_canvas_item_ungrab(SP_CANVAS_ITEM(desktop->acetate), GDK_CURRENT_TIME);
131
131
bc->sel_changed_connection.disconnect();
132
// sp_repr_remove_listener_by_data(cc->active_shape_repr, cc);
133
134
if (((SPEventContextClass *) parent_class)->finish) {
134
((SPEventContextClass *) parent_class)->finish(ec);
135
((SPEventContextClass *) parent_class)->finish(ec);
180
181
if (selection->perspList().size() == 1) {
181
182
// selecting a single box changes the current perspective
182
ec->desktop->doc()->current_persp3d = selection->perspList().front();
183
ec->desktop->doc()->setCurrentPersp3D(selection->perspList().front());
186
/* create a default perspective in document defs if none is present
187
(can happen after 'vacuum defs' or when a pre-0.46 file is opened) */
188
static void sp_box3d_context_check_for_persp_in_defs(SPDocument *document) {
187
/* Create a default perspective in document defs if none is present (which can happen, among other
188
* circumstances, after 'vacuum defs' or when a pre-0.46 file is opened).
190
static void sp_box3d_context_ensure_persp_in_defs(SPDocument *document) {
189
191
SPDefs *defs = (SPDefs *) SP_DOCUMENT_DEFS(document);
191
193
bool has_persp = false;
267
267
static bool dragging;
269
269
SPDesktop *desktop = event_context->desktop;
270
SPDocument *document = sp_desktop_document (desktop);
270
271
Inkscape::Selection *selection = sp_desktop_selection (desktop);
271
272
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
272
273
int const snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12);
274
275
Box3DContext *bc = SP_BOX3D_CONTEXT(event_context);
275
g_assert (SP_ACTIVE_DOCUMENT->current_persp3d);
276
Persp3D *cur_persp = SP_ACTIVE_DOCUMENT->current_persp3d;
276
Persp3D *cur_persp = document->getCurrentPersp3D();
278
278
event_context->tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
300
300
bc->drag_ptB = from_2geom(button_dt);
301
301
bc->drag_ptC = from_2geom(button_dt);
303
// This can happen after saving when the last remaining perspective was purged and must be recreated.
305
sp_box3d_context_ensure_persp_in_defs(document);
306
cur_persp = document->getCurrentPersp3D();
303
309
/* Projective preimages of clicked point under current perspective */
304
bc->drag_origin_proj = cur_persp->tmat.preimage (from_2geom(button_dt), 0, Proj::Z);
310
bc->drag_origin_proj = cur_persp->perspective_impl->tmat.preimage (from_2geom(button_dt), 0, Proj::Z);
305
311
bc->drag_ptB_proj = bc->drag_origin_proj;
306
312
bc->drag_ptC_proj = bc->drag_origin_proj;
307
313
bc->drag_ptC_proj.normalize();
310
316
/* Snap center */
311
317
SnapManager &m = desktop->namedview->snap_manager;
312
318
m.setup(desktop, true, bc->item);
313
m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, button_dt, Inkscape::SNAPSOURCE_HANDLE);
319
m.freeSnapReturnByRef(button_dt, Inkscape::SNAPSOURCE_NODE_HANDLE);
314
320
bc->center = from_2geom(button_dt);
316
322
sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate),
354
360
if (!bc->extruded) {
355
bc->drag_ptB = from_2geom(motion_dt);
356
bc->drag_ptC = from_2geom(motion_dt);
361
bc->drag_ptB = from_2geom(motion_dt);
362
bc->drag_ptC = from_2geom(motion_dt);
358
bc->drag_ptB_proj = cur_persp->tmat.preimage (from_2geom(motion_dt), 0, Proj::Z);
364
bc->drag_ptB_proj = cur_persp->perspective_impl->tmat.preimage (from_2geom(motion_dt), 0, Proj::Z);
359
365
bc->drag_ptC_proj = bc->drag_ptB_proj;
360
366
bc->drag_ptC_proj.normalize();
361
367
bc->drag_ptC_proj[Proj::Z] = 0.25;
364
370
// perspective line from drag_ptB to vanishing point Y.
365
371
if (!bc->ctrl_dragged) {
367
Box3D::PerspectiveLine pline (bc->drag_ptB, Proj::Z, SP_ACTIVE_DOCUMENT->current_persp3d);
373
Box3D::PerspectiveLine pline (bc->drag_ptB, Proj::Z, document->getCurrentPersp3D());
368
374
bc->drag_ptC = pline.closest_to (from_2geom(motion_dt));
370
376
bc->drag_ptB_proj.normalize();
371
bc->drag_ptC_proj = cur_persp->tmat.preimage (bc->drag_ptC, bc->drag_ptB_proj[Proj::X], Proj::X);
377
bc->drag_ptC_proj = cur_persp->perspective_impl->tmat.preimage (bc->drag_ptC, bc->drag_ptB_proj[Proj::X], Proj::X);
373
379
bc->drag_ptC = from_2geom(motion_dt);
375
381
bc->drag_ptB_proj.normalize();
376
bc->drag_ptC_proj = cur_persp->tmat.preimage (from_2geom(motion_dt), bc->drag_ptB_proj[Proj::X], Proj::X);
382
bc->drag_ptC_proj = cur_persp->perspective_impl->tmat.preimage (from_2geom(motion_dt), bc->drag_ptB_proj[Proj::X], Proj::X);
378
Geom::Point pt2g = to_2geom(bc->drag_ptC);
379
m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, pt2g, Inkscape::SNAPSOURCE_HANDLE);
380
bc->drag_ptC = from_2geom(pt2g);
384
m.freeSnapReturnByRef(bc->drag_ptC, Inkscape::SNAPSOURCE_NODE_HANDLE);
383
387
sp_box3d_drag(*bc, event->motion.state);
390
} else if (!sp_event_context_knot_mouseover(bc)) {
391
SnapManager &m = desktop->namedview->snap_manager;
394
Geom::Point const motion_w(event->motion.x, event->motion.y);
395
Geom::Point motion_dt(desktop->w2d(motion_w));
396
m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE));
388
399
case GDK_BUTTON_RELEASE:
426
437
case GDK_bracketright:
427
persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::X, -180/snaps, MOD__ALT);
428
sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
438
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::X, -180/snaps, MOD__ALT);
439
sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
429
440
_("Change perspective (angle of PLs)"));
433
444
case GDK_bracketleft:
434
persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::X, 180/snaps, MOD__ALT);
435
sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
445
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::X, 180/snaps, MOD__ALT);
446
sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
436
447
_("Change perspective (angle of PLs)"));
440
451
case GDK_parenright:
441
persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::Y, -180/snaps, MOD__ALT);
442
sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
452
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Y, -180/snaps, MOD__ALT);
453
sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
443
454
_("Change perspective (angle of PLs)"));
447
458
case GDK_parenleft:
448
persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::Y, 180/snaps, MOD__ALT);
449
sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
459
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Y, 180/snaps, MOD__ALT);
460
sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
450
461
_("Change perspective (angle of PLs)"));
454
465
case GDK_braceright:
455
persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::Z, -180/snaps, MOD__ALT);
456
sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
466
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Z, -180/snaps, MOD__ALT);
467
sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
457
468
_("Change perspective (angle of PLs)"));
461
472
case GDK_braceleft:
462
persp3d_rotate_VP (inkscape_active_document()->current_persp3d, Proj::Z, 180/snaps, MOD__ALT);
463
sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_3DBOX,
473
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Z, 180/snaps, MOD__ALT);
474
sp_document_done(document, SP_VERB_CONTEXT_3DBOX,
464
475
_("Change perspective (angle of PLs)"));