diff options
| author | Maximilian Albert <maximilian.albert@gmail.com> | 2007-08-07 08:05:16 +0000 |
|---|---|---|
| committer | cilix42 <cilix42@users.sourceforge.net> | 2007-08-07 08:05:16 +0000 |
| commit | 977777edd809ed276b2b5e2941041373510b0b13 (patch) | |
| tree | 89fa394323d5671dd2a629430863edc6f53f9a96 /src/box3d.cpp | |
| parent | Don't reshape boxes in the direction of infinite VPs when dragging VPs (fixes... (diff) | |
| download | inkscape-977777edd809ed276b2b5e2941041373510b0b13.tar.gz inkscape-977777edd809ed276b2b5e2941041373510b0b13.zip | |
Compute the correct visible front corner (also for 'upended' boxes) and set the z-orders accordingly so that they are correct for any relative position of the handles
(bzr r3411)
Diffstat (limited to 'src/box3d.cpp')
| -rw-r--r-- | src/box3d.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/src/box3d.cpp b/src/box3d.cpp index 7f04efde6..0f71a99a8 100644 --- a/src/box3d.cpp +++ b/src/box3d.cpp @@ -406,7 +406,7 @@ bool sp_3dbox_recompute_z_orders (SP3DBox *box) Box3D::Perspective3D *persp = Box3D::get_persp_of_box (box); // TODO: Determine the front corner depending on the distance from VPs and/or the user presets - guint front_corner = 1; + guint front_corner = sp_3dbox_get_front_corner_id (box); gdouble dir_1x = sp_3dbox_corner_angle_to_VP (box, Box3D::X, front_corner); gdouble dir_3x = sp_3dbox_corner_angle_to_VP (box, Box3D::X, front_corner ^ Box3D::Y); @@ -419,25 +419,25 @@ bool sp_3dbox_recompute_z_orders (SP3DBox *box) // Still not perfect, but only fails in some rather degenerate cases. // I suspect that there is a more elegant model, though. :) - new_z_orders[0] = Box3D::face_to_int (Box3D::XY ^ Box3D::FRONT); + new_z_orders[0] = Box3D::face_containing_corner (Box3D::XY, front_corner); if (normalized_angle (dir_1y - dir_1z) > 0) { - new_z_orders[1] = Box3D::face_to_int (Box3D::YZ ^ Box3D::REAR); + new_z_orders[1] = Box3D::face_containing_corner (Box3D::YZ, front_corner); if (normalized_angle (dir_1x - dir_1z) > 0) { - new_z_orders[2] = Box3D::face_to_int (Box3D::XZ ^ Box3D::REAR); + new_z_orders[2] = Box3D::face_containing_corner (Box3D::XZ, front_corner ^ Box3D::Y); } else { - new_z_orders[2] = Box3D::face_to_int (Box3D::XZ ^ Box3D::FRONT); + new_z_orders[2] = Box3D::face_containing_corner (Box3D::XZ, front_corner); } } else { if (normalized_angle (dir_3x - dir_3z) > 0) { - new_z_orders[1] = Box3D::face_to_int (Box3D::XZ ^ Box3D::REAR); - new_z_orders[2] = Box3D::face_to_int (Box3D::YZ ^ Box3D::FRONT); + new_z_orders[1] = Box3D::face_containing_corner (Box3D::XZ, front_corner ^ Box3D::Y); + new_z_orders[2] = Box3D::face_containing_corner (Box3D::YZ, front_corner ^ Box3D::X); } else { if (normalized_angle (dir_1x - dir_1z) > 0) { - new_z_orders[1] = Box3D::face_to_int (Box3D::YZ ^ Box3D::FRONT); - new_z_orders[2] = Box3D::face_to_int (Box3D::XZ ^ Box3D::FRONT); + new_z_orders[1] = Box3D::face_containing_corner (Box3D::YZ, front_corner ^ Box3D::X); + new_z_orders[2] = Box3D::face_containing_corner (Box3D::XZ, front_corner); } else { - new_z_orders[1] = Box3D::face_to_int (Box3D::XZ ^ Box3D::FRONT); - new_z_orders[2] = Box3D::face_to_int (Box3D::YZ ^ Box3D::FRONT); + new_z_orders[1] = Box3D::face_containing_corner (Box3D::XZ, front_corner); + new_z_orders[2] = Box3D::face_containing_corner (Box3D::YZ, front_corner ^ Box3D::X); } } } @@ -448,8 +448,7 @@ bool sp_3dbox_recompute_z_orders (SP3DBox *box) /* We only need to look for changes among the topmost three faces because the order of the other ones is just inverted. */ - // Currently we can even skip the first test since the front face is always in the XY plane. - if (// (box->z_orders[0] != new_z_orders[0]) || + if ((box->z_orders[0] != new_z_orders[0]) || (box->z_orders[1] != new_z_orders[1]) || (box->z_orders[2] != new_z_orders[2])) { @@ -763,6 +762,16 @@ sp_3dbox_get_corner_along_edge (const SP3DBox *box, guint corner, Box3D::Axis ax return box->corners[sp_3dbox_get_corner_id_along_edge (box, corner, axis, rel_pos)]; } +guint +sp_3dbox_get_front_corner_id (const SP3DBox *box) +{ + guint front_corner = 1; // this could in fact be any corner, but we choose the one that is normally in front + front_corner = sp_3dbox_get_corner_id_along_edge (box, front_corner, Box3D::X, Box3D::FRONT); + front_corner = sp_3dbox_get_corner_id_along_edge (box, front_corner, Box3D::Y, Box3D::FRONT); + front_corner = sp_3dbox_get_corner_id_along_edge (box, front_corner, Box3D::Z, Box3D::FRONT); + return front_corner; +} + // auxiliary functions static void sp_3dbox_update_corner_with_value_from_svg (SPObject *object, guint corner_id, const gchar *value) |
