diff options
author | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2010-01-07 14:59:10 (GMT) |
---|---|---|
committer | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2010-01-07 14:59:10 (GMT) |
commit | daddf419b00f086ab64834269c7a7d3ab7412aca (patch) | |
tree | b89aad61635f66a127e1b19fd8a832b4eab301b4 | |
parent | a74cb7f221237658fe069f80e410f7ea1c034b14 (diff) |
Clifford Wolf:
Added color() statement
git-svn-id: http://svn.clifford.at/openscad/trunk@227 b57f626f-c46c-0410-a088-ec61d464b74c
-rw-r--r-- | csgops.cc | 4 | ||||
-rw-r--r-- | csgterm.cc | 4 | ||||
-rw-r--r-- | examples/example017.scad | 6 | ||||
-rw-r--r-- | mainwin.cc | 26 | ||||
-rw-r--r-- | module.cc | 6 | ||||
-rw-r--r-- | openscad.h | 12 | ||||
-rw-r--r-- | polyset.cc | 4 | ||||
-rw-r--r-- | render.cc | 6 | ||||
-rw-r--r-- | transform.cc | 46 |
9 files changed, 77 insertions, 37 deletions
@@ -45,7 +45,7 @@ public: #ifdef ENABLE_CGAL virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const; #endif - CSGTerm *render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; + CSGTerm *render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; virtual QString dump(QString indent) const; }; @@ -110,7 +110,7 @@ CGAL_Nef_polyhedron CsgNode::render_cgal_nef_polyhedron() const #endif /* ENABLE_CGAL */ -CSGTerm *CsgNode::render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const +CSGTerm *CsgNode::render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const { CSGTerm *t1 = NULL; foreach (AbstractNode *v, children) { @@ -22,14 +22,14 @@ #include "openscad.h" -CSGTerm::CSGTerm(PolySet *polyset, double m[16], QString label) +CSGTerm::CSGTerm(PolySet *polyset, double m[20], QString label) { this->type = TYPE_PRIMITIVE; this->polyset = polyset; this->label = label; this->left = NULL; this->right = NULL; - for (int i = 0; i < 16; i++) + for (int i = 0; i < 20; i++) this->m[i] = m[i]; refcounter = 1; } diff --git a/examples/example017.scad b/examples/example017.scad index d6c9173..2b624e2 100644 --- a/examples/example017.scad +++ b/examples/example017.scad @@ -99,10 +99,9 @@ module exploded() translate([ 0, 0, total_height + thickness ]) linear_extrude(height = thickness, convexity = 4) shape_inner_disc(); linear_extrude(height = thickness, convexity = 4) shape_outer_disc(); - for (alpha = [ 0, 120, 240 ]) + color([ 0.7, 0.7, 1 ]) for (alpha = [ 0, 120, 240 ]) rotate(alpha) translate([ 0, thickness*2 + locklen1 + inner1_to_inner2 + boltlen + midhole, 1.5*thickness ]) rotate([ 90, 0, -90 ]) linear_extrude(height = thickness, convexity = 10, center = true) shape_tripod(); - } module assembled() @@ -110,10 +109,9 @@ module assembled() translate([ 0, 0, total_height - thickness*2 ]) linear_extrude(height = thickness, convexity = 4) shape_inner_disc(); linear_extrude(height = thickness, convexity = 4) shape_outer_disc(); - for (alpha = [ 0, 120, 240 ]) + color([ 0.7, 0.7, 1 ]) for (alpha = [ 0, 120, 240 ]) rotate(alpha) translate([ 0, thickness*2 + locklen1 + inner1_to_inner2 + boltlen + midhole, 0 ]) rotate([ 90, 0, -90 ]) linear_extrude(height = thickness, convexity = 10, center = true) shape_tripod(); - } parts(); @@ -535,10 +535,12 @@ void MainWindow::compile(bool procevents) if (procevents) QApplication::processEvents(); - double m[16]; + double m[20]; for (int i = 0; i < 16; i++) m[i] = i % 5 == 0 ? 1.0 : 0.0; + for (int i = 16; i < 20; i++) + m[i] = -1; root_raw_term = root_node->render_csg_term(m, &highlight_terms, &background_terms); @@ -1171,13 +1173,21 @@ static void renderCSGChainviaOpenCSG(CSGChain *chain, GLint *shaderinfo, bool hi if (shaderinfo) glUseProgram(shaderinfo[0]); for (; j < i; j++) { + double *m = chain->matrices[j]; glPushMatrix(); - glMultMatrixd(chain->matrices[j]); + glMultMatrixd(m); int csgmode = chain->types[j] == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL; if (highlight) { chain->polysets[j]->render_surface(PolySet::COLORMODE_HIGHLIGHT, PolySet::csgmode_e(csgmode + 20), shaderinfo); } else if (background) { chain->polysets[j]->render_surface(PolySet::COLORMODE_BACKGROUND, PolySet::csgmode_e(csgmode + 10), shaderinfo); + } else if (m[16] >= 0 || m[17] >= 0 || m[18] >= 0 || m[19] >= 0) { + glColor4d(m[16], m[17], m[18], m[19]); + if (shaderinfo) { + glUniform4f(shaderinfo[1], m[16], m[17], m[18], m[19]); + glUniform4f(shaderinfo[2], (m[16]+1)/2, (m[17]+1)/2, (m[18]+1)/2, 1.0); + } + chain->polysets[j]->render_surface(PolySet::COLORMODE_NONE, PolySet::csgmode_e(csgmode), shaderinfo); } else if (chain->types[j] == CSGTerm::TYPE_DIFFERENCE) { chain->polysets[j]->render_surface(PolySet::COLORMODE_CUTOUT, PolySet::csgmode_e(csgmode), shaderinfo); } else { @@ -1390,8 +1400,9 @@ static void renderGLThrownTogetherChain(MainWindow *m, CSGChain *chain, bool hig for (int i = 0; i < chain->polysets.size(); i++) { if (polySetVisitMark[QPair<PolySet*,double*>(chain->polysets[i], chain->matrices[i])]++ > 0) continue; + double *m = chain->matrices[i]; glPushMatrix(); - glMultMatrixd(chain->matrices[i]); + glMultMatrixd(m); int csgmode = chain->types[i] == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL; if (highlight) { chain->polysets[i]->render_surface(PolySet::COLORMODE_HIGHLIGHT, PolySet::csgmode_e(csgmode + 20)); @@ -1415,6 +1426,15 @@ static void renderGLThrownTogetherChain(MainWindow *m, CSGChain *chain, bool hig } else { chain->polysets[i]->render_surface(PolySet::COLORMODE_NONE, PolySet::csgmode_e(csgmode)); } + } else if (m[16] >= 0 || m[17] >= 0 || m[18] >= 0 || m[19] >= 0) { + glColor4d(m[16], m[17], m[18], m[19]); + chain->polysets[i]->render_surface(PolySet::COLORMODE_NONE, PolySet::csgmode_e(csgmode)); + if (showEdges) { + glDisable(GL_LIGHTING); + glColor4d((m[16]+1)/2, (m[17]+1)/2, (m[18]+1)/2, 1.0); + chain->polysets[i]->render_edges(PolySet::COLORMODE_NONE, PolySet::csgmode_e(csgmode)); + glEnable(GL_LIGHTING); + } } else if (chain->types[i] == CSGTerm::TYPE_DIFFERENCE) { chain->polysets[i]->render_surface(PolySet::COLORMODE_CUTOUT, PolySet::csgmode_e(csgmode)); if (showEdges) { @@ -288,7 +288,7 @@ CGAL_Nef_polyhedron AbstractIntersectionNode::render_cgal_nef_polyhedron() const #endif /* ENABLE_CGAL */ -static CSGTerm *render_csg_term_backend(const AbstractNode *that, bool intersect, double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) +static CSGTerm *render_csg_term_backend(const AbstractNode *that, bool intersect, double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) { CSGTerm *t1 = NULL; foreach(AbstractNode *v, that->children) { @@ -311,12 +311,12 @@ static CSGTerm *render_csg_term_backend(const AbstractNode *that, bool intersect return t1; } -CSGTerm *AbstractNode::render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const +CSGTerm *AbstractNode::render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const { return render_csg_term_backend(this, false, m, highlights, background); } -CSGTerm *AbstractIntersectionNode::render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const +CSGTerm *AbstractIntersectionNode::render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const { return render_csg_term_backend(this, true, m, highlights, background); } @@ -595,10 +595,10 @@ public: QString label; CSGTerm *left; CSGTerm *right; - double m[16]; + double m[20]; int refcounter; - CSGTerm(PolySet *polyset, double m[16], QString label); + CSGTerm(PolySet *polyset, double m[20], QString label); CSGTerm(type_e type, CSGTerm *left, CSGTerm *right); CSGTerm *normalize(); @@ -650,7 +650,7 @@ public: static QCache<QString, cgal_nef_cache_entry> cgal_nef_cache; virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const; #endif - virtual CSGTerm *render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; + virtual CSGTerm *render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; virtual QString dump(QString indent) const; }; @@ -661,7 +661,7 @@ public: #ifdef ENABLE_CGAL virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const; #endif - virtual CSGTerm *render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; + virtual CSGTerm *render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; virtual QString dump(QString indent) const; }; @@ -677,8 +677,8 @@ public: #ifdef ENABLE_CGAL virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const; #endif - virtual CSGTerm *render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; - static CSGTerm *render_csg_term_from_ps(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background, PolySet *ps, const ModuleInstantiation *modinst, int idx); + virtual CSGTerm *render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; + static CSGTerm *render_csg_term_from_ps(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background, PolySet *ps, const ModuleInstantiation *modinst, int idx); }; extern int progress_report_count; @@ -448,13 +448,13 @@ CGAL_Nef_polyhedron AbstractPolyNode::render_cgal_nef_polyhedron() const #endif /* ENABLE_CGAL */ -CSGTerm *AbstractPolyNode::render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const +CSGTerm *AbstractPolyNode::render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const { PolySet *ps = render_polyset(RENDER_OPENCSG); return render_csg_term_from_ps(m, highlights, background, ps, modinst, idx); } -CSGTerm *AbstractPolyNode::render_csg_term_from_ps(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background, PolySet *ps, const ModuleInstantiation *modinst, int idx) +CSGTerm *AbstractPolyNode::render_csg_term_from_ps(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background, PolySet *ps, const ModuleInstantiation *modinst, int idx) { CSGTerm *t = new CSGTerm(ps, m, QString("n%1").arg(idx)); if (modinst->tag_highlight && highlights) @@ -42,7 +42,7 @@ public: #ifdef ENABLE_CGAL virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const; #endif - CSGTerm *render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; + CSGTerm *render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; virtual QString dump(QString indent) const; }; @@ -122,7 +122,7 @@ static void report_func(const class AbstractNode*, void *vp, int mark) QApplication::processEvents(); } -CSGTerm *RenderNode::render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const +CSGTerm *RenderNode::render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const { QString key = mk_cache_id(); if (PolySet::ps_cache.contains(key)) { @@ -228,7 +228,7 @@ CSGTerm *RenderNode::render_csg_term(double m[16], QVector<CSGTerm*> *highlights #else -CSGTerm *RenderNode::render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const +CSGTerm *RenderNode::render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const { CSGTerm *t1 = NULL; PRINT("WARNING: Found render() statement but compiled without CGAL support!"); diff --git a/transform.cc b/transform.cc index 5e86bde..a920dd5 100644 --- a/transform.cc +++ b/transform.cc @@ -27,7 +27,8 @@ enum transform_type_e { SCALE, ROTATE, TRANSLATE, - MULTMATRIX + MULTMATRIX, + COLOR }; class TransformModule : public AbstractModule @@ -41,12 +42,12 @@ public: class TransformNode : public AbstractNode { public: - double m[16]; + double m[20]; TransformNode(const ModuleInstantiation *mi) : AbstractNode(mi) { } #ifdef ENABLE_CGAL virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const; #endif - virtual CSGTerm *render_csg_term(double m[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; + virtual CSGTerm *render_csg_term(double m[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const; virtual QString dump(QString indent) const; }; @@ -54,9 +55,10 @@ AbstractNode *TransformModule::evaluate(const Context *ctx, const ModuleInstanti { TransformNode *node = new TransformNode(inst); - for (int i = 0; i < 16; i++) { + for (int i = 0; i < 16; i++) node->m[i] = i % 5 == 0 ? 1.0 : 0.0; - } + for (int i = 16; i < 20; i++) + node->m[i] = -1; QVector<QString> argnames; QVector<Expression*> argexpr; @@ -73,6 +75,9 @@ AbstractNode *TransformModule::evaluate(const Context *ctx, const ModuleInstanti if (type == MULTMATRIX) { argnames = QVector<QString>() << "m"; } + if (type == COLOR) { + argnames = QVector<QString>() << "c"; + } Context c(ctx); c.args(argnames, argexpr, inst->argnames, inst->argvalues); @@ -173,6 +178,14 @@ AbstractNode *TransformModule::evaluate(const Context *ctx, const ModuleInstanti } } } + if (type == COLOR) + { + Value v = c.lookup_variable("c"); + if (v.type == Value::VECTOR) { + for (int i = 0; i < 4; i++) + node->m[16+i] = i < v.vec.size() ? v.vec[i]->num : 1.0; + } + } foreach (ModuleInstantiation *v, inst->children) { AbstractNode *n = v->evaluate(inst->ctx); @@ -255,9 +268,9 @@ CGAL_Nef_polyhedron TransformNode::render_cgal_nef_polyhedron() const #endif /* ENABLE_CGAL */ -CSGTerm *TransformNode::render_csg_term(double c[16], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const +CSGTerm *TransformNode::render_csg_term(double c[20], QVector<CSGTerm*> *highlights, QVector<CSGTerm*> *background) const { - double x[16]; + double x[20]; for (int i = 0; i < 16; i++) { @@ -268,6 +281,9 @@ CSGTerm *TransformNode::render_csg_term(double c[16], QVector<CSGTerm*> *highlig x[i] += c[c_row + j*4] * m[m_col*4 + j]; } + for (int i = 16; i < 20; i++) + x[i] = m[i] < 0 ? c[i] : m[i]; + CSGTerm *t1 = NULL; foreach(AbstractNode *v, children) { @@ -291,11 +307,16 @@ QString TransformNode::dump(QString indent) const { if (dump_cache.isEmpty()) { QString text; - text.sprintf("n%d: multmatrix([[%f, %f, %f, %f], [%f, %f, %f, %f], [%f, %f, %f, %f], [%f, %f, %f, %f]])", idx, - m[0], m[4], m[ 8], m[12], - m[1], m[5], m[ 9], m[13], - m[2], m[6], m[10], m[14], - m[3], m[7], m[11], m[15]); + if (m[16] >= 0 || m[17] >= 0 || m[18] >= 0 || m[19] >= 0) + text.sprintf("n%d: color([%f, %f, %f, %f])", idx, + m[16], m[17], m[18], m[19]); + else + text.sprintf("n%d: multmatrix([[%f, %f, %f, %f], [%f, %f, %f, %f], " + "[%f, %f, %f, %f], [%f, %f, %f, %f]])", idx, + m[0], m[4], m[ 8], m[12], + m[1], m[5], m[ 9], m[13], + m[2], m[6], m[10], m[14], + m[3], m[7], m[11], m[15]); text = indent + text + " {\n"; foreach (AbstractNode *v, children) text += v->dump(indent + QString("\t")); @@ -310,5 +331,6 @@ void register_builtin_transform() builtin_modules["rotate"] = new TransformModule(ROTATE); builtin_modules["translate"] = new TransformModule(TRANSLATE); builtin_modules["multmatrix"] = new TransformModule(MULTMATRIX); + builtin_modules["color"] = new TransformModule(COLOR); } |