summaryrefslogtreecommitdiffstats
path: root/src/box3d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/box3d.cpp')
-rw-r--r--src/box3d.cpp60
1 files changed, 44 insertions, 16 deletions
diff --git a/src/box3d.cpp b/src/box3d.cpp
index 94dfaf996..290b5111e 100644
--- a/src/box3d.cpp
+++ b/src/box3d.cpp
@@ -21,6 +21,7 @@ static void sp_3dbox_class_init(SP3DBoxClass *klass);
static void sp_3dbox_init(SP3DBox *box3d);
static void sp_3dbox_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
+static void sp_shape_release (SPObject *object);
static void sp_3dbox_set(SPObject *object, unsigned int key, const gchar *value);
static void sp_3dbox_update(SPObject *object, SPCtx *ctx, guint flags);
static Inkscape::XML::Node *sp_3dbox_write(SPObject *object, Inkscape::XML::Node *repr, guint flags);
@@ -75,8 +76,12 @@ sp_3dbox_class_init(SP3DBoxClass *klass)
static void
sp_3dbox_init(SP3DBox *box3d)
{
+ if (box3d == NULL) { g_warning ("box3d is NULL!\n"); }
+ box3d->faces[4] = new Box3DFace (box3d);
+ //box3d->faces[4]->hook_path_to_3dbox();
for (int i = 0; i < 6; ++i) {
- box3d->faces[i] = Box3DFace (box3d);
+ if (i == 4) continue;
+ box3d->faces[i] = NULL;
}
}
@@ -90,6 +95,22 @@ sp_3dbox_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr
//sp_object_read_attr(object, "width");
}
+static void
+sp_3dbox_release (SPObject *object)
+{
+ SP3DBox *box3d = SP_3DBOX(object);
+ for (int i = 0; i < 6; ++i) {
+ if (box3d->faces[i]) {
+ delete box3d->faces[i]; // FIXME: Anything else to do? Do we need to clean up the face first?
+ }
+ }
+
+ if (((SPObjectClass *) parent_class)->release) {
+ ((SPObjectClass *) parent_class)->release (object);
+ }
+}
+
+
static void sp_3dbox_set(SPObject *object, unsigned int key, const gchar *value)
{
//SP3DBox *box3d = SP_3DBOX(object);
@@ -140,12 +161,13 @@ static Inkscape::XML::Node *sp_3dbox_write(SPObject *object, Inkscape::XML::Node
}
- box3d->faces[0].set_path_repr();
+ box3d->faces[4]->set_path_repr();
if (bc->extruded) {
NR::Point corner1, corner2, corner3, corner4;
sp_3dbox_compute_specific_corners (bc, corner1, corner2, corner3, corner4);
for (int i = 0; i < 6; ++i) {
- box3d->faces[i].set_path_repr();
+ if (i == 4) continue;
+ box3d->faces[i]->set_path_repr();
}
}
if (((SPObjectClass *) (parent_class))->write) {
@@ -199,20 +221,26 @@ sp_3dbox_set_shape(SP3DBox *box3d)
if (bc->extruded) {
sp_3dbox_compute_specific_corners (bc, corner1, corner2, corner3, corner4);
- box3d->faces[2].set_shape(bc->drag_origin, corner4, Box3D::Z, Box3D::Y);
- box3d->faces[2].set_curve();
- box3d->faces[3].set_shape(corner2, corner4, Box3D::X, Box3D::Y);
- box3d->faces[3].set_curve();
- box3d->faces[4].set_shape(bc->drag_origin, corner2, Box3D::X, Box3D::Z);
- box3d->faces[4].set_curve();
- box3d->faces[5].set_shape(bc->drag_ptB, corner4, Box3D::X, Box3D::Z);
- box3d->faces[5].set_curve();
-
- box3d->faces[1].set_shape(corner1, bc->drag_ptC, Box3D::Z, Box3D::Y);
- box3d->faces[1].set_curve();
+ for (int i=0; i < 6; ++i) {
+ if (!box3d->faces[i]) {
+ g_warning ("Face no. %d does not exist!\n", i);
+ return;
+ }
+ }
+ box3d->faces[0]->set_face (bc->drag_origin, corner4, Box3D::Z, Box3D::Y);
+ box3d->faces[0]->set_curve();
+ box3d->faces[5]->set_face (corner3, bc->drag_ptC, Box3D::Y, Box3D::X);
+ box3d->faces[5]->set_curve();
+ box3d->faces[3]->set_face (bc->drag_origin, corner2, Box3D::X, Box3D::Z);
+ box3d->faces[3]->set_curve();
+ box3d->faces[2]->set_face (bc->drag_ptB, corner4, Box3D::X, Box3D::Z);
+ box3d->faces[2]->set_curve();
+
+ box3d->faces[1]->set_face (corner1, bc->drag_ptC, Box3D::Z, Box3D::Y);
+ box3d->faces[1]->set_curve();
}
- box3d->faces[0].set_shape(bc->drag_origin, bc->drag_ptB, Box3D::X, Box3D::Y);
- box3d->faces[0].set_curve();
+ box3d->faces[4]->set_face(bc->drag_origin, bc->drag_ptB, Box3D::Y, Box3D::X);
+ box3d->faces[4]->set_curve();
}