summaryrefslogtreecommitdiff
path: root/primitive.cc
diff options
context:
space:
mode:
Diffstat (limited to 'primitive.cc')
-rw-r--r--primitive.cc20
1 files changed, 14 insertions, 6 deletions
diff --git a/primitive.cc b/primitive.cc
index beb73ba..a3e0fce 100644
--- a/primitive.cc
+++ b/primitive.cc
@@ -41,6 +41,8 @@ class PrimitiveNode : public AbstractPolyNode
public:
bool center;
double x, y, z, h, r1, r2;
+ double fs_render, fa_render;
+ double fs_preview, fa_preview;
primitive_type_e type;
PrimitiveNode(primitive_type_e type) : type(type) { }
virtual PolySet *render_polyset(render_mode_e mode) const;
@@ -70,6 +72,11 @@ AbstractNode *PrimitiveModule::evaluate(const Context *ctx, const QVector<QStrin
Context c(ctx);
c.args(argnames, argexpr, call_argnames, call_argvalues);
+ node->fs_render = c.lookup_variable("$fs_render").num;
+ node->fa_render = c.lookup_variable("$fa_render").num;
+ node->fs_preview = c.lookup_variable("$fs_preview").num;
+ node->fa_preview = c.lookup_variable("$fa_preview").num;
+
if (type == CUBE) {
Value size = c.lookup_variable("size");
Value center = c.lookup_variable("center");
@@ -132,15 +139,16 @@ void register_builtin_primitive()
builtin_modules["cylinder"] = new PrimitiveModule(CYLINDER);
}
-int get_fragments_from_r(double r)
+int get_fragments_from_r(double r, double fs, double fa)
{
- double fa = 72, fs = 0.5;
- return ceil(fmax(360.0 / fa, fmax(r*M_PI / fs, 5)));
+ return ceil(fmax(fmin(360.0 / fa, r*M_PI / fs), 5));
}
PolySet *PrimitiveNode::render_polyset(render_mode_e mode) const
{
PolySet *p = new PolySet();
+ double fs = mode == RENDER_CGAL ? fs_render : fs_preview;
+ double fa = mode == RENDER_CGAL ? fa_render : fa_preview;
if (type == CUBE && x > 0 && y > 0 && z > 0)
{
@@ -208,14 +216,14 @@ PolySet *PrimitiveNode::render_polyset(render_mode_e mode) const
double r, z;
};
- int rings = get_fragments_from_r(r1);
+ int rings = get_fragments_from_r(r1, 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);
+ ring[i].fragments = get_fragments_from_r(ring[i].r, 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 +275,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));
+ int fragments = get_fragments_from_r(fmax(r1, r2), fs, fa);
double z1, z2;
if (center) {
contact: Jan Huwald // Impressum