From: cilix42 Date: Tue, 10 Jul 2007 13:50:59 +0000 (+0000) Subject: More 3D auxiliary/convenience functions X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=5ab319377e453e88687f4d1e450b23633a6534c6;p=inkscape.git More 3D auxiliary/convenience functions --- diff --git a/src/box3d.cpp b/src/box3d.cpp index b02e88e1e..16bbd3544 100644 --- a/src/box3d.cpp +++ b/src/box3d.cpp @@ -330,7 +330,7 @@ sp_3dbox_get_midpoint_between_corners (SP3DBox *box, guint id_corner1, guint id_ Box3D::PerspectiveLine pl (*adjacent_face_center, orth_dir); return pl.intersect(Box3D::PerspectiveLine(box->corners[id_corner1], corner_axes)); } else { - Box3D::Axis dir = Box3D::extract_single_axis_direction (corner_axes); + Box3D::Axis dir = Box3D::extract_first_axis_direction (corner_axes); Box3D::Line diag1 (box->corners[id_corner1], box->corners[id_corner2]); Box3D::Line diag2 (box->corners[id_corner1 ^ dir], box->corners[id_corner2 ^ dir]); return diag1.intersect(diag2); diff --git a/src/vanishing-point.cpp b/src/vanishing-point.cpp index bd1c8f5b0..c4540fa73 100644 --- a/src/vanishing-point.cpp +++ b/src/vanishing-point.cpp @@ -16,6 +16,10 @@ namespace Box3D { +Axis axes[3] = { X, Y, Z }; +Axis planes[3] = { XY, XZ, YZ }; +FrontOrRear face_positions [2] = { FRONT, REAR }; + // FIXME: We should always require to have both the point (for finite VPs) // and the direction (for infinite VPs) set. Otherwise toggling // shows very unexpected behaviour. diff --git a/src/vanishing-point.h b/src/vanishing-point.h index cc11f9749..b7f3d12a1 100644 --- a/src/vanishing-point.h +++ b/src/vanishing-point.h @@ -35,24 +35,72 @@ enum Axis { NONE = 0 }; +// We use the fourth bit in binary representation +// to indicate whether a face is front or rear. +enum FrontOrRear { // find a better name + FRONT = 0, + REAR = 8 +}; + +extern Axis axes[3]; +extern Axis planes[3]; +extern FrontOrRear face_positions [2]; + +// Given a bit sequence that unambiguously specifies the face of a 3D box, +// return a number between 0 and 5 corresponding to that particular face +// (which is normally used to index an array). Return -1 if the bit sequence +// does not specify a face. A face can either be given by its plane (e.g, XY) +// or by the axis that is orthogonal to it (e.g., Z). +inline gint face_to_int (guint face_id) { + switch (face_id) { + case 1: return 0; + case 2: return 2; + case 4: return 4; + case 3: return 4; + case 5: return 2; + case 6: return 0; + + case 9: return 1; + case 10: return 3; + case 12: return 5; + case 11: return 5; + case 13: return 3; + case 14: return 1; + + default: return -1; + } +} inline bool is_single_axis_direction (Box3D::Axis dir) { // tests whether dir is nonzero and a power of 2 return (!(dir & (dir - 1)) && dir); } -/** Given two axis directions out of {X, Y, Z}, returns the remaining one */ +/** + * Given two axis directions out of {X, Y, Z} or the corresponding plane, return the remaining one + * We don't check if 'plane' really specifies a plane (i.e., if it consists of precisely two directions). + */ inline Box3D::Axis third_axis_direction (Box3D::Axis dir1, Box3D::Axis dir2) { return (Box3D::Axis) ((dir1 + dir2) ^ 0x7); } +inline Box3D::Axis third_axis_direction (Box3D::Axis plane) { + return (Box3D::Axis) (plane ^ 0x7); +} -/* returns the first axis direction occuring in the (possibly compound) expression 'dirs' */ -inline Box3D::Axis extract_single_axis_direction (Box3D::Axis dirs) { +/* returns the first/second axis direction occuring in the (possibly compound) expression 'dirs' */ +inline Box3D::Axis extract_first_axis_direction (Box3D::Axis dirs) { if (dirs & Box3D::X) return Box3D::X; if (dirs & Box3D::Y) return Box3D::Y; if (dirs & Box3D::Z) return Box3D::Z; return Box3D::NONE; } +inline Box3D::Axis extract_second_axis_direction (Box3D::Axis dirs) { + return extract_first_axis_direction ((Box3D::Axis) (dirs ^ extract_first_axis_direction(dirs))); +} + +inline Box3D::Axis orth_plane (Box3D::Axis axis) { + return (Box3D::Axis) (Box3D::XYZ ^ axis); +} /* returns an axis direction perpendicular to the ones occuring in the (possibly compound) expression 'dirs' */ inline Box3D::Axis get_perpendicular_axis_direction (Box3D::Axis dirs) { @@ -62,6 +110,13 @@ inline Box3D::Axis get_perpendicular_axis_direction (Box3D::Axis dirs) { return Box3D::NONE; } +inline gchar * string_from_axes (Box3D::Axis axes) { + GString *pstring = g_string_new(""); + if (axes & Box3D::X) g_string_append_printf (pstring, "X"); + if (axes & Box3D::Y) g_string_append_printf (pstring, "Y"); + if (axes & Box3D::Z) g_string_append_printf (pstring, "Z"); + return pstring->str; +} // FIXME: Store the Axis of the VP inside the class class VanishingPoint : public NR::Point {