summaryrefslogtreecommitdiff
path: root/primitives.cc
diff options
context:
space:
mode:
authorclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2009-06-30 18:05:10 (GMT)
committerclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2009-06-30 18:05:10 (GMT)
commit78244d328918b149b86d9b925010e934244d0137 (patch)
tree54228d6e3480fc309143a4ed3d9deb0d51994f56 /primitives.cc
parenta70715ab8c31160f1be2a74d208681c2ad422bbb (diff)
Clifford Wolf:
Improved value handling Fixed math functions Improved control statements git-svn-id: http://svn.clifford.at/openscad/trunk@39 b57f626f-c46c-0410-a088-ec61d464b74c
Diffstat (limited to 'primitives.cc')
-rw-r--r--primitives.cc35
1 files changed, 17 insertions, 18 deletions
diff --git a/primitives.cc b/primitives.cc
index 59c5938..ae43a58 100644
--- a/primitives.cc
+++ b/primitives.cc
@@ -41,7 +41,7 @@ class PrimitiveNode : public AbstractPolyNode
public:
bool center;
double x, y, z, h, r1, r2;
- double fs, fa;
+ double fn, fs, fa;
primitive_type_e type;
PrimitiveNode(primitive_type_e type) : type(type) { }
virtual PolySet *render_polyset(render_mode_e mode) const;
@@ -71,22 +71,17 @@ AbstractNode *PrimitiveModule::evaluate(const Context *ctx, const QVector<QStrin
Context c(ctx);
c.args(argnames, argexpr, call_argnames, call_argvalues);
+ node->fn = c.lookup_variable("$fn").num;
node->fs = c.lookup_variable("$fs").num;
node->fa = c.lookup_variable("$fa").num;
if (type == CUBE) {
Value size = c.lookup_variable("size");
Value center = c.lookup_variable("center");
- if (size.type == Value::VECTOR) {
- node->x = size.x;
- node->y = size.y;
- node->z = size.z;
- }
- if (size.type == Value::NUMBER) {
- node->x = size.num;
- node->y = size.num;
- node->z = size.num;
- }
+ size.getnum(node->x);
+ size.getnum(node->y);
+ size.getnum(node->z);
+ size.getv3(node->x, node->y, node->z);
if (center.type == Value::BOOL) {
node->center = center.b;
}
@@ -101,9 +96,11 @@ AbstractNode *PrimitiveModule::evaluate(const Context *ctx, const QVector<QStrin
if (type == CYLINDER) {
Value h = c.lookup_variable("h");
- Value r = c.lookup_variable("r");
- Value r1 = c.lookup_variable("r1");
- Value r2 = c.lookup_variable("r2");
+ Value r, r1, r2;
+ r1 = c.lookup_variable("r1");
+ r2 = c.lookup_variable("r2");
+ if (r1.type != Value::NUMBER && r1.type != Value::NUMBER)
+ r = c.lookup_variable("r");
Value center = c.lookup_variable("center");
if (h.type == Value::NUMBER) {
node->h = h.num;
@@ -133,8 +130,10 @@ void register_builtin_primitives()
builtin_modules["cylinder"] = new PrimitiveModule(CYLINDER);
}
-int get_fragments_from_r(double r, double fs, double fa)
+int get_fragments_from_r(double r, double fn, double fs, double fa)
{
+ if (fn > 0.0)
+ return fn;
return (int)ceil(fmax(fmin(360.0 / fa, r*M_PI / fs), 5));
}
@@ -208,14 +207,14 @@ PolySet *PrimitiveNode::render_polyset(render_mode_e) const
double r, z;
};
- int rings = get_fragments_from_r(r1, fs, fa);
+ int rings = get_fragments_from_r(r1, fn, fs, fa);
ring_s ring[rings];
for (int i = 0; i < rings; i++) {
double phi = (M_PI * (i + 0.5)) / rings;
ring[i].r = r1 * sin(phi);
ring[i].z = r1 * cos(phi);
- ring[i].fragments = get_fragments_from_r(ring[i].r, fs, fa);
+ ring[i].fragments = get_fragments_from_r(ring[i].r, fn, fs, fa);
ring[i].points = new point2d[ring[i].fragments];
for (int j = 0; j < ring[i].fragments; j++) {
phi = (M_PI*2*j) / ring[i].fragments;
@@ -267,7 +266,7 @@ sphere_next_r2:
if (type == CYLINDER && h > 0 && r1 >=0 && r2 >= 0 && (r1 > 0 || r2 > 0))
{
- int fragments = get_fragments_from_r(fmax(r1, r2), fs, fa);
+ int fragments = get_fragments_from_r(fmax(r1, r2), fn, fs, fa);
double z1, z2;
if (center) {
contact: Jan Huwald // Impressum