summaryrefslogtreecommitdiff
path: root/src/primitives.cc
diff options
context:
space:
mode:
authorTorsten Paul <Torsten.Paul@gmx.de>2013-10-20 18:22:35 (GMT)
committerTorsten Paul <Torsten.Paul@gmx.de>2013-10-20 20:49:40 (GMT)
commitbc4ace7e2641c67fa0677587d4c34a3d2bb239b6 (patch)
treea90d165b3389c9c80f79cc01f8b65e4dc4d80d21 /src/primitives.cc
parent170d4a54970f34d4790b0b3ae3a3d4f2f7502660 (diff)
Add diameter variable to the sphere, cylinder and circle primitives (fixes #392).
When doing the lookup, the diameter value has priority so if both diameter and radius are given, the radius value is ignored and a warning is printed.
Diffstat (limited to 'src/primitives.cc')
-rw-r--r--src/primitives.cc48
1 files changed, 40 insertions, 8 deletions
diff --git a/src/primitives.cc b/src/primitives.cc
index 13a6794..a587d43 100644
--- a/src/primitives.cc
+++ b/src/primitives.cc
@@ -57,6 +57,8 @@ public:
primitive_type_e type;
PrimitiveModule(primitive_type_e type) : type(type) { }
virtual AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const;
+private:
+ Value lookup_radius(const Context &ctx, const std::string &radius_var, const std::string &diameter_var) const;
};
class PrimitiveNode : public AbstractPolyNode
@@ -105,6 +107,35 @@ public:
virtual PolySet *evaluate_polyset(class PolySetEvaluator *) const;
};
+/**
+ * Return a radius value by looking up both a diameter and radius variable.
+ * The diameter has higher priority, so if found an additionally set radius
+ * value is ignored.
+ *
+ * @param ctx data context with variable values.
+ * @param radius_var name of the variable to lookup for the radius value.
+ * @param diameter_var name of the variable to lookup for the diameter value.
+ * @return radius value of type Value::NUMBER or Value::UNDEFINED if both
+ * variables are invalid or not set.
+ */
+Value PrimitiveModule::lookup_radius(const Context &ctx, const std::string &diameter_var, const std::string &radius_var) const
+{
+ const Value d = ctx.lookup_variable(diameter_var, true);
+ const Value r = ctx.lookup_variable(radius_var, true);
+ const bool r_defined = (r.type() == Value::NUMBER);
+
+ if (d.type() == Value::NUMBER) {
+ if (r_defined) {
+ PRINTB("WARNING: Ignoring radius variable '%s' as diameter '%s' is defined too.", radius_var % diameter_var);
+ }
+ return Value(d.toDouble() / 2.0);
+ } else if (r_defined) {
+ return r;
+ } else {
+ return Value();
+ }
+}
+
AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const
{
PrimitiveNode *node = new PrimitiveNode(inst, this->type);
@@ -170,22 +201,21 @@ AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInsta
}
if (type == SPHERE) {
- Value r = c.lookup_variable("r");
+ const Value r = lookup_radius(c, "d", "r");
if (r.type() == Value::NUMBER) {
node->r1 = r.toDouble();
}
}
if (type == CYLINDER) {
- Value h = c.lookup_variable("h");
- Value r, r1, r2;
- r1 = c.lookup_variable("r1");
- r2 = c.lookup_variable("r2");
- r = c.lookup_variable("r", true); // silence warning since r has no default value
- Value center = c.lookup_variable("center");
+ const Value h = c.lookup_variable("h");
if (h.type() == Value::NUMBER) {
node->h = h.toDouble();
}
+
+ const Value r = lookup_radius(c, "d", "r");
+ const Value r1 = lookup_radius(c, "d1", "r1");
+ const Value r2 = lookup_radius(c, "d2", "r2");
if (r.type() == Value::NUMBER) {
node->r1 = r.toDouble();
node->r2 = r.toDouble();
@@ -196,6 +226,8 @@ AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInsta
if (r2.type() == Value::NUMBER) {
node->r2 = r2.toDouble();
}
+
+ const Value center = c.lookup_variable("center");
if (center.type() == Value::BOOL) {
node->center = center.toBool();
}
@@ -218,7 +250,7 @@ AbstractNode *PrimitiveModule::instantiate(const Context *ctx, const ModuleInsta
}
if (type == CIRCLE) {
- Value r = c.lookup_variable("r");
+ const Value r = lookup_radius(c, "d", "r");
if (r.type() == Value::NUMBER) {
node->r1 = r.toDouble();
}
contact: Jan Huwald // Impressum