summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Kintel <marius@kintel.net>2010-11-07 22:50:57 (GMT)
committerMarius Kintel <marius@kintel.net>2010-11-07 22:50:57 (GMT)
commit93c00f9efe181caf1fc033c6eec986e6abefa814 (patch)
tree1755ea9b1635045a6333ec86890eaf82ca373c6e
parentab90b38780365943877d1f173d6ae0b692b6ce51 (diff)
Allow render_polyset() to return NULL
-rw-r--r--src/CGALRenderer.cc48
-rw-r--r--src/CSGTermRenderer.cc6
-rw-r--r--src/mainwin.cc18
-rw-r--r--src/openscad.cc6
-rw-r--r--src/primitives.cc4
5 files changed, 45 insertions, 37 deletions
diff --git a/src/CGALRenderer.cc b/src/CGALRenderer.cc
index 9e98b61..4963814 100644
--- a/src/CGALRenderer.cc
+++ b/src/CGALRenderer.cc
@@ -231,17 +231,19 @@ Response CGALRenderer::visit(State &state, const AbstractPolyNode &node)
// Then apply polyset operation
PolySet *ps = node.render_polyset(AbstractPolyNode::RENDER_CGAL, &this->psrenderer);
- try {
- CGAL_Nef_polyhedron N = renderCGALMesh(*ps);
+ if (ps) {
+ try {
+ CGAL_Nef_polyhedron N = renderCGALMesh(*ps);
// print_messages_pop();
- node.progress_report();
-
- ps->unlink();
- this->cache.insert(this->tree.getString(node), N);
- }
- catch (...) { // Don't leak the PolySet on ProgressCancelException
- ps->unlink();
- throw;
+ node.progress_report();
+
+ ps->unlink();
+ this->cache.insert(this->tree.getString(node), N);
+ }
+ catch (...) { // Don't leak the PolySet on ProgressCancelException
+ ps->unlink();
+ throw;
+ }
}
}
addToParent(state, node);
@@ -274,18 +276,20 @@ CGAL_Nef_polyhedron CGALRenderer::renderCGALMesh(const AbstractPolyNode &node)
// print_messages_push();
PolySet *ps = node.render_polyset(AbstractPolyNode::RENDER_CGAL);
- try {
- CGAL_Nef_polyhedron N = ps->renderCSGMesh();
- // FIXME: Insert into cache
- // print_messages_pop();
- node.progress_report();
-
- ps->unlink();
- return N;
- }
- catch (...) { // Don't leak the PolySet on ProgressCancelException
- ps->unlink();
- throw;
+ if (ps) {
+ try {
+ CGAL_Nef_polyhedron N = ps->renderCSGMesh();
+ // FIXME: Insert into cache
+ // print_messages_pop();
+ node.progress_report();
+
+ ps->unlink();
+ return N;
+ }
+ catch (...) { // Don't leak the PolySet on ProgressCancelException
+ ps->unlink();
+ throw;
+ }
}
}
#endif
diff --git a/src/CSGTermRenderer.cc b/src/CSGTermRenderer.cc
index 6f1f90c..0f5910f 100644
--- a/src/CSGTermRenderer.cc
+++ b/src/CSGTermRenderer.cc
@@ -100,8 +100,12 @@ static CSGTerm *render_csg_term_from_ps(const double m[20],
Response CSGTermRenderer::visit(State &state, const AbstractPolyNode &node)
{
if (state.isPostfix()) {
+ CSGTerm *t1 = NULL;
PolySet *ps = node.render_polyset(AbstractPolyNode::RENDER_OPENCSG, this->psrenderer);
- CSGTerm *t1 = render_csg_term_from_ps(state.matrix(), this->highlights, this->background, ps, node.modinst, node);
+ if (ps) {
+ t1 = render_csg_term_from_ps(state.matrix(), this->highlights, this->background,
+ ps, node.modinst, node);
+ }
this->stored_term[node.index()] = t1;
addToParent(state, node);
}
diff --git a/src/mainwin.cc b/src/mainwin.cc
index 7b69190..3e8ac45 100644
--- a/src/mainwin.cc
+++ b/src/mainwin.cc
@@ -147,9 +147,9 @@ MainWindow::MainWindow(const QString &filename)
Value zero3;
zero3.type = Value::VECTOR;
- zero3.vec.append(new Value(0.0));
- zero3.vec.append(new Value(0.0));
- zero3.vec.append(new Value(0.0));
+ zero3.append(new Value(0.0));
+ zero3.append(new Value(0.0));
+ zero3.append(new Value(0.0));
root_ctx.set_variable("$vpt", zero3);
root_ctx.set_variable("$vpr", zero3);
@@ -603,16 +603,16 @@ void MainWindow::compile(bool procevents)
Value vpt;
vpt.type = Value::VECTOR;
- vpt.vec.append(new Value(-screen->object_trans_x));
- vpt.vec.append(new Value(-screen->object_trans_y));
- vpt.vec.append(new Value(-screen->object_trans_z));
+ vpt.append(new Value(-screen->object_trans_x));
+ vpt.append(new Value(-screen->object_trans_y));
+ vpt.append(new Value(-screen->object_trans_z));
this->root_ctx.set_variable("$vpt", vpt);
Value vpr;
vpr.type = Value::VECTOR;
- vpr.vec.append(new Value(fmodf(360 - screen->object_rot_x + 90, 360)));
- vpr.vec.append(new Value(fmodf(360 - screen->object_rot_y, 360)));
- vpr.vec.append(new Value(fmodf(360 - screen->object_rot_z, 360)));
+ vpr.append(new Value(fmodf(360 - screen->object_rot_x + 90, 360)));
+ vpr.append(new Value(fmodf(360 - screen->object_rot_y, 360)));
+ vpr.append(new Value(fmodf(360 - screen->object_rot_z, 360)));
root_ctx.set_variable("$vpr", vpr);
// Parse
diff --git a/src/openscad.cc b/src/openscad.cc
index 4f63bb4..be5b716 100644
--- a/src/openscad.cc
+++ b/src/openscad.cc
@@ -265,9 +265,9 @@ int main(int argc, char **argv)
Value zero3;
zero3.type = Value::VECTOR;
- zero3.vec.append(new Value(0.0));
- zero3.vec.append(new Value(0.0));
- zero3.vec.append(new Value(0.0));
+ zero3.append(new Value(0.0));
+ zero3.append(new Value(0.0));
+ zero3.append(new Value(0.0));
root_ctx.set_variable("$vpt", zero3);
root_ctx.set_variable("$vpr", zero3);
diff --git a/src/primitives.cc b/src/primitives.cc
index 187a4ea..2c1cf1f 100644
--- a/src/primitives.cc
+++ b/src/primitives.cc
@@ -509,8 +509,8 @@ sphere_next_r2:
double x,y;
if (!this->points.vec[i]->getv2(x, y)) {
PRINTF("ERROR: Unable to convert point at index %d to a vec2 of numbers", i);
- // FIXME: Return NULL and make sure this is checked by all callers?
- return p;
+ p->unlink();
+ return NULL;
}
dd.points.append(DxfData::Point(x, y));
}
contact: Jan Huwald // Impressum