diff --git a/openscad.pro b/openscad.pro index 2b2d1a0e..e16020e8 100644 --- a/openscad.pro +++ b/openscad.pro @@ -221,6 +221,7 @@ HEADERS += src/typedefs.h \ src/parsersettings.h \ src/renderer.h \ src/rendersettings.h \ + src/colormap.h \ src/ThrownTogetherRenderer.h \ src/CGAL_renderer.h \ src/OGL_helper.h \ @@ -378,6 +379,7 @@ SOURCES += src/version_check.cc \ src/export_png.cc \ src/import.cc \ src/renderer.cc \ + src/colormap.cc \ src/ThrownTogetherRenderer.cc \ src/CSGTermEvaluator.cc \ src/svg.cc \ diff --git a/src/CGALRenderer.cc b/src/CGALRenderer.cc index c59df6bc..b42dd307 100644 --- a/src/CGALRenderer.cc +++ b/src/CGALRenderer.cc @@ -32,6 +32,7 @@ // dxfdata.h must come first for Eigen SIMD alignment issues #include "dxfdata.h" #include "polyset.h" +#include "printutils.h" #include "CGALRenderer.h" #include "CGAL_renderer.h" @@ -51,19 +52,7 @@ CGALRenderer::CGALRenderer(shared_ptr geom) else if (shared_ptr new_N = dynamic_pointer_cast(geom)) { assert(new_N->getDimension() == 3); if (!new_N->isEmpty()) { - this->polyhedron.reset(new Polyhedron()); - // FIXME: Make independent of Preferences - // this->polyhedron->setColor(Polyhedron::CGAL_NEF3_MARKED_FACET_COLOR, - // Preferences::inst()->color(Preferences::CGAL_FACE_BACK_COLOR).red(), - // Preferences::inst()->color(Preferences::CGAL_FACE_BACK_COLOR).green(), - // Preferences::inst()->color(Preferences::CGAL_FACE_BACK_COLOR).blue()); - // this->polyhedron->setColor(Polyhedron::CGAL_NEF3_UNMARKED_FACET_COLOR, - // Preferences::inst()->color(Preferences::CGAL_FACE_FRONT_COLOR).red(), - // Preferences::inst()->color(Preferences::CGAL_FACE_FRONT_COLOR).green(), - // Preferences::inst()->color(Preferences::CGAL_FACE_FRONT_COLOR).blue()); - - CGAL::OGL::Nef3_Converter::convert_to_OGLPolyhedron(*new_N->p3, this->polyhedron.get()); - this->polyhedron->init(); + this->N = new_N; } } } @@ -72,9 +61,37 @@ CGALRenderer::~CGALRenderer() { } +shared_ptr CGALRenderer::getPolyhedron() const +{ + if (this->N && !this->polyhedron) buildPolyhedron(); + return this->polyhedron; +} + +void CGALRenderer::buildPolyhedron() const +{ + PRINTD("buildPolyhedron"); + this->polyhedron.reset(new Polyhedron(*this->colorscheme)); + CGAL::OGL::Nef3_Converter::convert_to_OGLPolyhedron(*this->N->p3, this->polyhedron.get()); + // CGAL_NEF3_MARKED_FACET_COLOR <- CGAL_FACE_BACK_COLOR + // CGAL_NEF3_UNMARKED_FACET_COLOR <- CGAL_FACE_FRONT_COLOR + this->polyhedron->init(); + PRINTD("buildPolyhedron() end"); +} + +// Overridden from Renderer +void CGALRenderer::setColorScheme(const ColorScheme &cs) +{ + PRINTD("setColorScheme"); + Renderer::setColorScheme(cs); + this->polyhedron.reset(); // Mark as dirty + PRINTD("setColorScheme done"); +} + void CGALRenderer::draw(bool showfaces, bool showedges) const { + PRINTD("draw()"); if (this->polyset) { + PRINTD("draw() polyset"); if (this->polyset->getDimension() == 2) { // Draw 2D polygons glDisable(GL_LIGHTING); @@ -106,27 +123,33 @@ void CGALRenderer::draw(bool showfaces, bool showedges) const this->polyset->render_surface(CSGMODE_NORMAL, Transform3d::Identity(), NULL); } } - else if (this->polyhedron) { - if (showfaces) this->polyhedron->set_style(SNC_BOUNDARY); - else this->polyhedron->set_style(SNC_SKELETON); - - this->polyhedron->draw(showfaces && showedges); - } + else { + shared_ptr polyhedron = getPolyhedron(); + if (polyhedron) { + PRINTD("draw() polyhedron"); + if (showfaces) polyhedron->set_style(SNC_BOUNDARY); + else polyhedron->set_style(SNC_SKELETON); + polyhedron->draw(showfaces && showedges); + } + } + PRINTD("draw() end"); } BoundingBox CGALRenderer::getBoundingBox() const { BoundingBox bbox; - if (this->polyhedron) { - CGAL::Bbox_3 cgalbbox = this->polyhedron->bbox(); - bbox = BoundingBox( - Vector3d(cgalbbox.xmin(), cgalbbox.ymin(), cgalbbox.zmin()), - Vector3d(cgalbbox.xmax(), cgalbbox.ymax(), cgalbbox.zmax()) ); - } - else if (this->polyset) { + if (this->polyset) { bbox = this->polyset->getBoundingBox(); } - + else { + shared_ptr polyhedron = getPolyhedron(); + if (polyhedron) { + CGAL::Bbox_3 cgalbbox = polyhedron->bbox(); + bbox = BoundingBox( + Vector3d(cgalbbox.xmin(), cgalbbox.ymin(), cgalbbox.zmin()), + Vector3d(cgalbbox.xmax(), cgalbbox.ymax(), cgalbbox.zmax())); + } + } return bbox; } diff --git a/src/CGALRenderer.h b/src/CGALRenderer.h index 5a5b3ac6..4bb2c673 100644 --- a/src/CGALRenderer.h +++ b/src/CGALRenderer.h @@ -1,16 +1,22 @@ #pragma once #include "renderer.h" +#include "CGAL_Nef_polyhedron.h" class CGALRenderer : public Renderer { public: CGALRenderer(shared_ptr geom); - virtual ~CGALRenderer(); + ~CGALRenderer(); virtual void draw(bool showfaces, bool showedges) const; + virtual void setColorScheme(const ColorScheme &cs); virtual BoundingBox getBoundingBox() const; -public: - shared_ptr polyhedron; +private: + shared_ptr getPolyhedron() const; + void buildPolyhedron() const; + + mutable shared_ptr polyhedron; + shared_ptr N; shared_ptr polyset; }; diff --git a/src/CGAL_renderer.h b/src/CGAL_renderer.h index c66337e3..433eb7d6 100644 --- a/src/CGAL_renderer.h +++ b/src/CGAL_renderer.h @@ -27,14 +27,11 @@ #pragma once #ifndef NULLGL -#include "OGL_helper.h" -#undef CGAL_NEF3_MARKED_VERTEX_COLOR -#undef CGAL_NEF3_MARKED_EDGE_COLOR -#undef CGAL_NEF3_MARKED_FACET_COLOR -#undef CGAL_NEF3_UNMARKED_VERTEX_COLOR -#undef CGAL_NEF3_UNMARKED_EDGE_COLOR -#undef CGAL_NEF3_UNMARKED_FACET_COLOR +#include "colormap.h" +#include "rendersettings.h" +#include "OGL_helper.h" +#include "printutils.h" using CGAL::OGL::SNC_BOUNDARY; using CGAL::OGL::SNC_SKELETON; @@ -53,16 +50,18 @@ public: NUM_COLORS }; - Polyhedron() { + Polyhedron(const ColorScheme &cs) { + PRINTD("Polyhedron()"); + // Set default colors. setColor(CGAL_NEF3_MARKED_VERTEX_COLOR,0xb7,0xe8,0x5c); - setColor(CGAL_NEF3_MARKED_EDGE_COLOR,0xab,0xd8,0x56); - setColor(CGAL_NEF3_MARKED_FACET_COLOR,0x9d,0xcb,0x51); setColor(CGAL_NEF3_UNMARKED_VERTEX_COLOR,0xff,0xf6,0x7c); - setColor(CGAL_NEF3_UNMARKED_EDGE_COLOR,0xff,0xec,0x5e); - setColor(CGAL_NEF3_UNMARKED_FACET_COLOR,0xf9,0xd7,0x2c); + // Face and Edge colors are taken from default colorscheme + setColorScheme(cs); + PRINTD("Polyhedron() end"); } void draw(bool showedges) const { + PRINTD("draw()"); if(this->style == SNC_BOUNDARY) { glCallList(this->object_list_+2); if(showedges) { @@ -75,27 +74,51 @@ public: glCallList(this->object_list_+1); glCallList(this->object_list_); } + PRINTD("draw() end"); } + + // overrides function in OGL_helper.h CGAL::Color getVertexColor(Vertex_iterator v) const { + PRINTD("getVertexColor"); CGAL::Color c = v->mark() ? colors[CGAL_NEF3_UNMARKED_VERTEX_COLOR] : colors[CGAL_NEF3_MARKED_VERTEX_COLOR]; return c; } + // overrides function in OGL_helper.h CGAL::Color getEdgeColor(Edge_iterator e) const { + PRINTD("getEdgeColor"); CGAL::Color c = e->mark() ? colors[CGAL_NEF3_UNMARKED_EDGE_COLOR] : colors[CGAL_NEF3_MARKED_EDGE_COLOR]; return c; } - CGAL::Color getFacetColor(Halffacet_iterator f) const { + // overrides function in OGL_helper.h + CGAL::Color getFacetColor(Halffacet_iterator f, bool is_back_facing) const { + PRINTD("getFacetColor"); CGAL::Color c = f->mark() ? colors[CGAL_NEF3_UNMARKED_FACET_COLOR] : colors[CGAL_NEF3_MARKED_FACET_COLOR]; return c; } + void setColor(Polyhedron::RenderColor color_index, const Color4f &c) { + PRINTDB("setColor %i %f %f %f",color_index%c[0]%c[1]%c[2]); + this->colors[color_index] = CGAL::Color(c[0]*255,c[1]*255,c[2]*255); + } + void setColor(Polyhedron::RenderColor color_index, unsigned char r, unsigned char g, unsigned char b) { - assert(color_index < Polyhedron::NUM_COLORS); + PRINTDB("setColor %i %i %i %i",color_index%r%g%b); this->colors[color_index] = CGAL::Color(r,g,b); } + + // set this->colors based on the given colorscheme. vertex colors + // are not set here as colorscheme doesnt yet hold vertex colors. + void setColorScheme(const ColorScheme &cs) { + PRINTD("setColorScheme"); + setColor(CGAL_NEF3_MARKED_FACET_COLOR, ColorMap::getColor(cs, CGAL_FACE_BACK_COLOR)); + setColor(CGAL_NEF3_UNMARKED_FACET_COLOR, ColorMap::getColor(cs, CGAL_FACE_FRONT_COLOR)); + setColor(CGAL_NEF3_MARKED_EDGE_COLOR, ColorMap::getColor(cs, CGAL_EDGE_BACK_COLOR)); + setColor(CGAL_NEF3_UNMARKED_EDGE_COLOR, ColorMap::getColor(cs, CGAL_EDGE_FRONT_COLOR)); + } + private: CGAL::Color colors[NUM_COLORS]; diff --git a/src/Camera.cc b/src/Camera.cc index 7f4d3c12..29ecc013 100644 --- a/src/Camera.cc +++ b/src/Camera.cc @@ -5,6 +5,7 @@ Camera::Camera(enum CameraType camtype) : type(camtype), projection(Camera::PERSPECTIVE), fov(45), height(60), viewall(false) { + PRINTD("Camera()"); if (this->type == Camera::GIMBAL) { object_trans << 0,0,0; object_rot << 35,0,25; @@ -92,6 +93,10 @@ void Camera::viewAll(const BoundingBox &bbox, float scalefactor) } break; } + PRINTDB("modified center x y z %f %f %f",center.x() % center.y() % center.z()); + PRINTDB("modified eye x y z %f %f %f",eye.x() % eye.y() % eye.z()); + PRINTDB("modified obj trans x y z %f %f %f",object_trans.x() % object_trans.y() % object_trans.z()); + PRINTDB("modified obj rot x y z %f %f %f",object_rot.x() % object_rot.y() % object_rot.z()); } void Camera::zoom(int delta) diff --git a/src/GLView.cc b/src/GLView.cc index 60589a18..a75e41fc 100644 --- a/src/GLView.cc +++ b/src/GLView.cc @@ -1,8 +1,10 @@ #include "GLView.h" #include "stdio.h" +#include "colormap.h" #include "rendersettings.h" #include "mathc99.h" +#include "printutils.h" #include "renderer.h" #ifdef _WIN32 @@ -22,6 +24,7 @@ GLView::GLView() showaxes = false; showcrosshairs = false; renderer = NULL; + colorscheme = &ColorMap::inst()->defaultColorScheme(); cam = Camera(); far_far_away = RenderSettings::inst()->far_gl_clip_limit; #ifdef ENABLE_OPENCSG @@ -39,6 +42,32 @@ void GLView::setRenderer(Renderer* r) renderer = r; } +/* update the color schemes of the Renderer attached to this GLView +to match the colorscheme of this GLView.*/ +void GLView::updateColorScheme() +{ + if (this->renderer) this->renderer->setColorScheme(*this->colorscheme); +} + +/* change this GLView's colorscheme to the one given, and update the +Renderer attached to this GLView as well. */ +void GLView::setColorScheme(const ColorScheme &cs) +{ + this->colorscheme = &cs; + this->updateColorScheme(); +} + +void GLView::setColorScheme(const std::string &cs) +{ + const ColorScheme *colorscheme = ColorMap::inst()->findColorScheme(cs); + if (colorscheme) { + setColorScheme(*colorscheme); + } + else { + PRINTB("WARNING: GLView: unknown colorscheme %s", cs); + } +} + void GLView::resizeGL(int w, int h) { #ifdef ENABLE_OPENCSG @@ -125,7 +154,7 @@ void GLView::paintGL() setupCamera(); - Color4f bgcol = RenderSettings::inst()->color(RenderSettings::BACKGROUND_COLOR); + Color4f bgcol = ColorMap::getColor(*this->colorscheme, BACKGROUND_COLOR); glClearColor(bgcol[0], bgcol[1], bgcol[2], 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); @@ -440,7 +469,7 @@ void GLView::showCrosshairs() // FIXME: Crosshairs and axes are lighted, this doesn't make sense and causes them // to change color based on view orientation. glLineWidth(3); - Color4f col = RenderSettings::inst()->color(RenderSettings::CROSSHAIR_COLOR); + Color4f col = ColorMap::getColor(*this->colorscheme, CROSSHAIR_COLOR); glColor3f(col[0], col[1], col[2]); glBegin(GL_LINES); for (double xf = -1; xf <= +1; xf += 2) diff --git a/src/GLView.h b/src/GLView.h index 83559aff..f3f98ae2 100644 --- a/src/GLView.h +++ b/src/GLView.h @@ -26,6 +26,7 @@ Some actions (showCrossHairs) only work properly on Gimbal Camera. #include "system-gl.h" #include #include "Camera.h" +#include "colormap.h" class GLView { @@ -45,11 +46,16 @@ public: void showAxes(); void showSmallaxes(); + void setColorScheme(const ColorScheme &cs); + void setColorScheme(const std::string &cs); + void updateColorScheme(); + virtual bool save(const char *filename) = 0; virtual std::string getRendererInfo() const = 0; virtual float getDPI() { return 1.0f; } Renderer *renderer; + const ColorScheme *colorscheme; Camera cam; double far_far_away; size_t width; diff --git a/src/MainWindow.h b/src/MainWindow.h index af347b1f..be4e338b 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -79,6 +79,7 @@ private slots: void updateUndockMode(bool undockMode); void setFileName(const QString &filename); void setFont(const QString &family, uint size); + void setColorScheme(const QString &cs); void showProgress(); void openCSGSettingsChanged(); diff --git a/src/OGL_helper.h b/src/OGL_helper.h index 1c7ba2c1..488ee133 100644 --- a/src/OGL_helper.h +++ b/src/OGL_helper.h @@ -17,6 +17,8 @@ // // Author(s) : Peter Hachenberger +// Modified for OpenSCAD + #pragma once #include @@ -25,16 +27,18 @@ #include "system-gl.h" #include -#define CGAL_NEF3_MARKED_VERTEX_COLOR 183,232,92 -#define CGAL_NEF3_MARKED_EDGE_COLOR 171,216,86 -#define CGAL_NEF3_MARKED_FACET_COLOR 157,203,81 -#define CGAL_NEF3_MARKED_BACK_FACET_COLOR 157,103,181 - -#define CGAL_NEF3_UNMARKED_VERTEX_COLOR 255,246,124 -#define CGAL_NEF3_UNMARKED_EDGE_COLOR 255,236,94 -#define CGAL_NEF3_UNMARKED_FACET_COLOR 249,215,44 -#define CGAL_NEF3_UNMARKED_BACK_FACET_COLOR 249,115,144 +// Overridden in CGAL_renderer +/* +#define CGAL_NEF3_OGL_MARKED_VERTEX_COLOR 183,232,92 +#define CGAL_NEF3_OGL_MARKED_EDGE_COLOR 171,216,86 +#define CGAL_NEF3_OGL_MARKED_FACET_COLOR 157,203,81 +#define CGAL_NEF3_OGL_MARKED_BACK_FACET_COLOR 157,103,181 +#define CGAL_NEF3_OGL_UNMARKED_VERTEX_COLOR 255,246,124 +#define CGAL_NEF3_OGL_UNMARKED_EDGE_COLOR 255,236,94 +#define CGAL_NEF3_OGL_UNMARKED_FACET_COLOR 249,215,44 +#define CGAL_NEF3_OGL_UNMARKED_BACK_FACET_COLOR 249,115,144 +*/ const bool cull_backfaces = false; const bool color_backfaces = false; @@ -362,18 +366,24 @@ namespace OGL { Bbox_3 bbox() const { return bbox_; } Bbox_3& bbox() { return bbox_; } + // Overridden in CGAL_renderer virtual CGAL::Color getVertexColor(Vertex_iterator v) const { - CGAL::Color cf(CGAL_NEF3_MARKED_VERTEX_COLOR), - ct(CGAL_NEF3_UNMARKED_VERTEX_COLOR); // more blue-ish - CGAL::Color c = v->mark() ? ct : cf; + PRINTD("getVertexColor()"); + (void)v; +// CGAL::Color cf(CGAL_NEF3_OGL_MARKED_VERTEX_COLOR), +// ct(CGAL_NEF3_OGL_UNMARKED_VERTEX_COLOR); // more blue-ish +// CGAL::Color c = v->mark() ? ct : cf; + CGAL::Color c(0,0,200); return c; } void draw(Vertex_iterator v) const { + PRINTD("draw( Vertex_iterator )"); // CGAL_NEF_TRACEN("drawing vertex "<<*v); CGAL::Color c = getVertexColor(v); glPointSize(10); + //glPointSize(1); glColor3ub(c.red(), c.green(), c.blue()); glBegin(GL_POINTS); glVertex3d(v->x(),v->y(),v->z()); @@ -384,19 +394,26 @@ namespace OGL { glEnd(); } + // Overridden in CGAL_renderer virtual CGAL::Color getEdgeColor(Edge_iterator e) const { - CGAL::Color cf(CGAL_NEF3_MARKED_EDGE_COLOR), - ct(CGAL_NEF3_UNMARKED_EDGE_COLOR); // more blue-ish - CGAL::Color c = e->mark() ? ct : cf; + PRINTD("getEdgeColor)"); + (void)e; +// CGAL::Color cf(CGAL_NEF3_OGL_MARKED_EDGE_COLOR), +// ct(CGAL_NEF3_OGL_UNMARKED_EDGE_COLOR); // more blue-ish +// CGAL::Color c = e->mark() ? ct : cf; + // Overridden in CGAL_renderer + CGAL::Color c(200,0,0); return c; } void draw(Edge_iterator e) const { + PRINTD("draw(Edge_iterator)"); // CGAL_NEF_TRACEN("drawing edge "<<*e); Double_point p = e->source(), q = e->target(); CGAL::Color c = getEdgeColor(e); glLineWidth(5); + //glLineWidth(1); glColor3ub(c.red(),c.green(),c.blue()); glBegin(GL_LINE_STRIP); glVertex3d(p.x(), p.y(), p.z()); @@ -404,18 +421,32 @@ namespace OGL { glEnd(); } + + // Overridden in CGAL_renderer virtual CGAL::Color getFacetColor(Halffacet_iterator f, bool is_back_facing) const { + PRINTD("getFacetColor"); +/* + (void)f; +// CGAL::Color cf(CGAL_NEF3_OGL_MARKED_FACET_COLOR), +// ct(CGAL_NEF3_OGL_UNMARKED_FACET_COLOR); // more blue-ish +// CGAL::Color c = (f->mark() ? ct : cf); +*/ + CGAL::Color c(0,200,0); + return c; +/* if (is_back_facing) return !f->mark() - ? CGAL::Color(CGAL_NEF3_MARKED_BACK_FACET_COLOR) - : CGAL::Color(CGAL_NEF3_UNMARKED_BACK_FACET_COLOR); + ? CGAL::Color(CGAL_NEF3_OGL_MARKED_BACK_FACET_COLOR) + : CGAL::Color(CGAL_NEF3_OGL_UNMARKED_BACK_FACET_COLOR); else return !f->mark() - ? CGAL::Color(CGAL_NEF3_MARKED_FACET_COLOR) - : CGAL::Color(CGAL_NEF3_UNMARKED_FACET_COLOR); + ? CGAL::Color(CGAL_NEF3_OGL_MARKED_FACET_COLOR) + : CGAL::Color(CGAL_NEF3_OGL_UNMARKED_FACET_COLOR); +*/ } void draw(Halffacet_iterator f, bool is_back_facing) const { + PRINTD("draw(Halffacet_iterator)"); // CGAL_NEF_TRACEN("drawing facet "<<(f->debug(),"")); GLUtesselator* tess_ = gluNewTess(); gluTessCallback(tess_, GLenum(GLU_TESS_VERTEX_DATA), @@ -458,6 +489,7 @@ namespace OGL { void construct_axes() const { + PRINTD("construct_axes"); glLineWidth(2.0); // red x-axis glColor3f(1.0,0.0,0.0); @@ -491,6 +523,7 @@ namespace OGL { void fill_display_lists() { + PRINTD("fill_display_lists"); glNewList(object_list_, GL_COMPILE); Vertex_iterator v; for(v=vertices_.begin();v!=vertices_.end();++v) @@ -528,6 +561,7 @@ namespace OGL { } void init() { + PRINTD("init()"); if (init_) return; init_ = true; switches[SNC_AXES] = false; @@ -535,11 +569,13 @@ namespace OGL { object_list_ = glGenLists(4); CGAL_assertion(object_list_); fill_display_lists(); + PRINTD("init() end"); } void draw() const { + PRINTD("draw()"); if (!is_initialized()) const_cast(*this).init(); double l = (std::max)( (std::max)( bbox().xmax() - bbox().xmin(), bbox().ymax() - bbox().ymin()), @@ -562,6 +598,7 @@ namespace OGL { glCallList(object_list_+1); // edges glCallList(object_list_); // vertices if (switches[SNC_AXES]) glCallList(object_list_+3); // axis + PRINTD("draw() end"); } void debug(std::ostream& os = std::cerr) const diff --git a/src/Preferences.cc b/src/Preferences.cc index 94df31b3..a0bf5b49 100644 --- a/src/Preferences.cc +++ b/src/Preferences.cc @@ -37,6 +37,8 @@ #ifdef ENABLE_CGAL #include "CGALCache.h" #endif +#include "colormap.h" +#include "rendersettings.h" Preferences *Preferences::instance = NULL; @@ -87,7 +89,6 @@ Preferences::Preferences(QWidget *parent) : QMainWindow(parent) this->fontSize->setEditText( QString("%1").arg( savedsize ) ); // Setup default settings - this->defaultmap["3dview/colorscheme"] = this->colorSchemeChooser->currentItem()->text(); this->defaultmap["advanced/opencsg_show_warning"] = true; this->defaultmap["advanced/enable_opencsg_opengl1x"] = true; this->defaultmap["advanced/polysetCacheSize"] = uint(GeometryCache::instance()->maxSize()); @@ -120,38 +121,7 @@ Preferences::Preferences(QWidget *parent) : QMainWindow(parent) this->actionTriggered(this->prefsAction3DView); // 3D View pane - this->colorschemes["Cornfield"][RenderSettings::BACKGROUND_COLOR] = Color4f(0xff, 0xff, 0xe5); - this->colorschemes["Cornfield"][RenderSettings::OPENCSG_FACE_FRONT_COLOR] = Color4f(0xf9, 0xd7, 0x2c); - this->colorschemes["Cornfield"][RenderSettings::OPENCSG_FACE_BACK_COLOR] = Color4f(0x9d, 0xcb, 0x51); - this->colorschemes["Cornfield"][RenderSettings::CGAL_FACE_FRONT_COLOR] = Color4f(0xf9, 0xd7, 0x2c); - this->colorschemes["Cornfield"][RenderSettings::CGAL_FACE_BACK_COLOR] = Color4f(0x9d, 0xcb, 0x51); - this->colorschemes["Cornfield"][RenderSettings::CGAL_FACE_2D_COLOR] = Color4f(0x00, 0xbf, 0x99); - this->colorschemes["Cornfield"][RenderSettings::CGAL_EDGE_FRONT_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colorschemes["Cornfield"][RenderSettings::CGAL_EDGE_BACK_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colorschemes["Cornfield"][RenderSettings::CGAL_EDGE_2D_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colorschemes["Cornfield"][RenderSettings::CROSSHAIR_COLOR] = Color4f(0x80, 0x00, 0x00); - - this->colorschemes["Metallic"][RenderSettings::BACKGROUND_COLOR] = Color4f(0xaa, 0xaa, 0xff); - this->colorschemes["Metallic"][RenderSettings::OPENCSG_FACE_FRONT_COLOR] = Color4f(0xdd, 0xdd, 0xff); - this->colorschemes["Metallic"][RenderSettings::OPENCSG_FACE_BACK_COLOR] = Color4f(0xdd, 0x22, 0xdd); - this->colorschemes["Metallic"][RenderSettings::CGAL_FACE_FRONT_COLOR] = Color4f(0xdd, 0xdd, 0xff); - this->colorschemes["Metallic"][RenderSettings::CGAL_FACE_BACK_COLOR] = Color4f(0xdd, 0x22, 0xdd); - this->colorschemes["Metallic"][RenderSettings::CGAL_FACE_2D_COLOR] = Color4f(0x00, 0xbf, 0x99); - this->colorschemes["Metallic"][RenderSettings::CGAL_EDGE_FRONT_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colorschemes["Metallic"][RenderSettings::CGAL_EDGE_BACK_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colorschemes["Metallic"][RenderSettings::CGAL_EDGE_2D_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colorschemes["Metallic"][RenderSettings::CROSSHAIR_COLOR] = Color4f(0x80, 0x00, 0x00); - - this->colorschemes["Sunset"][RenderSettings::BACKGROUND_COLOR] = Color4f(0xaa, 0x44, 0x44); - this->colorschemes["Sunset"][RenderSettings::OPENCSG_FACE_FRONT_COLOR] = Color4f(0xff, 0xaa, 0xaa); - this->colorschemes["Sunset"][RenderSettings::OPENCSG_FACE_BACK_COLOR] = Color4f(0x88, 0x22, 0x33); - this->colorschemes["Sunset"][RenderSettings::CGAL_FACE_FRONT_COLOR] = Color4f(0xff, 0xaa, 0xaa); - this->colorschemes["Sunset"][RenderSettings::CGAL_FACE_BACK_COLOR] = Color4f(0x88, 0x22, 0x33); - this->colorschemes["Sunset"][RenderSettings::CGAL_FACE_2D_COLOR] = Color4f(0x00, 0xbf, 0x99); - this->colorschemes["Sunset"][RenderSettings::CGAL_EDGE_FRONT_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colorschemes["Sunset"][RenderSettings::CGAL_EDGE_BACK_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colorschemes["Sunset"][RenderSettings::CGAL_EDGE_2D_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colorschemes["Sunset"][RenderSettings::CROSSHAIR_COLOR] = Color4f(0x80, 0x00, 0x00); + this->defaultmap["3dview/colorscheme"] = "Cornfield"; // Advanced pane QValidator *validator = new QIntValidator(this); @@ -163,8 +133,6 @@ Preferences::Preferences(QWidget *parent) : QMainWindow(parent) setupFeaturesPage(); updateGUI(); - - RenderSettings::inst()->setColors(this->colorschemes[getValue("3dview/colorscheme").toString()]); } Preferences::~Preferences() @@ -275,10 +243,7 @@ void Preferences::on_colorSchemeChooser_itemSelectionChanged() QString scheme = this->colorSchemeChooser->currentItem()->text(); QSettings settings; settings.setValue("3dview/colorscheme", scheme); - - RenderSettings::inst()->setColors(this->colorschemes[scheme]); - - emit requestRedraw(); + emit colorSchemeChanged( scheme ); } void Preferences::on_fontChooser_activated(const QString &family) diff --git a/src/Preferences.h b/src/Preferences.h index 102ddf15..4aad048d 100644 --- a/src/Preferences.h +++ b/src/Preferences.h @@ -3,9 +3,7 @@ #include #include #include "ui_Preferences.h" -#include "rendersettings.h" -#include "linalg.h" -#include +#include "colormap.h" class Preferences : public QMainWindow, public Ui::Preferences { @@ -43,6 +41,7 @@ signals: void updateMdiMode(bool mdi) const; void updateUndockMode(bool mdi) const; void fontChanged(const QString &family, uint size) const; + void colorSchemeChanged(const QString &scheme) const; void openCSGSettingsChanged() const; void syntaxHighlightChanged(const QString &s); @@ -55,7 +54,6 @@ private: void addPrefPage(QActionGroup *group, QAction *action, QWidget *widget); QSettings::SettingsMap defaultmap; - QHash > colorschemes; QHash prefPages; static Preferences *instance; diff --git a/src/Preferences.ui b/src/Preferences.ui index 2eb1b129..80cff0cf 100644 --- a/src/Preferences.ui +++ b/src/Preferences.ui @@ -44,6 +44,12 @@ + + + 0 + 0 + + false @@ -65,6 +71,26 @@ Sunset + + + Starnight + + + + + BeforeDawn + + + + + Nature + + + + + DeepOcean + + @@ -89,6 +115,9 @@ Qt::Vertical + + QSizePolicy::Expanding + 20 @@ -170,7 +199,7 @@ 0 - + 75 diff --git a/src/ThrownTogetherRenderer.cc b/src/ThrownTogetherRenderer.cc index d95e7afe..4b114041 100644 --- a/src/ThrownTogetherRenderer.cc +++ b/src/ThrownTogetherRenderer.cc @@ -27,6 +27,7 @@ #include "ThrownTogetherRenderer.h" #include "polyset.h" #include "csgterm.h" +#include "printutils.h" #include "system-gl.h" @@ -43,6 +44,7 @@ ThrownTogetherRenderer::ThrownTogetherRenderer(CSGChain *root_chain, void ThrownTogetherRenderer::draw(bool /*showfaces*/, bool showedges) const { + PRINTD("Thrown draw"); if (this->root_chain) { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); @@ -62,6 +64,7 @@ void ThrownTogetherRenderer::renderCSGChain(CSGChain *chain, bool highlight, bool background, bool showedges, bool fberror) const { + PRINTD("Thrown renderCSGChain"); glDepthFunc(GL_LEQUAL); boost::unordered_map,int> geomVisitMark; BOOST_FOREACH(const CSGChainObject &obj, chain->objects) { diff --git a/src/color.cc b/src/color.cc index b91fed15..390a11d4 100644 --- a/src/color.cc +++ b/src/color.cc @@ -35,18 +35,18 @@ #include #include using namespace boost::assign; // bring 'operator+=()' into scope +#include "colormap.h" class ColorModule : public AbstractModule { public: - ColorModule() { } + ColorModule() : webcolors(ColorMap::inst()->webColors()) { } virtual AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const; private: - static boost::unordered_map colormap; + const boost::unordered_map &webcolors; }; -#include "colormap.h" AbstractNode *ColorModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const { ColorNode *node = new ColorNode(inst); @@ -72,8 +72,8 @@ AbstractNode *ColorModule::instantiate(const Context *ctx, const ModuleInstantia std::string colorname = v.toString(); boost::algorithm::to_lower(colorname); Color4f color; - if (colormap.find(colorname) != colormap.end()) { - node->color = colormap[colorname]; + if (webcolors.find(colorname) != webcolors.end()) { + node->color = webcolors.at(colorname); } else { PRINTB_NOCACHE("WARNING: Color name \"%s\" unknown. Please see", colorname); PRINT_NOCACHE("WARNING: http://en.wikipedia.org/wiki/Web_colors"); diff --git a/src/colormap.h b/src/colormap.h index 7c0652ca..9f305efd 100644 --- a/src/colormap.h +++ b/src/colormap.h @@ -1,149 +1,43 @@ -boost::unordered_map ColorModule::colormap = map_list_of - ("aliceblue", Color4f(240, 248, 255)) - ("antiquewhite", Color4f(250, 235, 215)) - ("aqua", Color4f(0, 255, 255)) - ("aquamarine", Color4f(127, 255, 212)) - ("azure", Color4f(240, 255, 255)) - ("beige", Color4f(245, 245, 220)) - ("bisque", Color4f(255, 228, 196)) - ("black", Color4f(0, 0, 0)) - ("blanchedalmond", Color4f(255, 235, 205)) - ("blue", Color4f(0, 0, 255)) - ("blueviolet", Color4f(138, 43, 226)) - ("brown", Color4f(165, 42, 42)) - ("burlywood", Color4f(222, 184, 135)) - ("cadetblue", Color4f(95, 158, 160)) - ("chartreuse", Color4f(127, 255, 0)) - ("chocolate", Color4f(210, 105, 30)) - ("coral", Color4f(255, 127, 80)) - ("cornflowerblue", Color4f(100, 149, 237)) - ("cornsilk", Color4f(255, 248, 220)) - ("crimson", Color4f(220, 20, 60)) - ("cyan", Color4f(0, 255, 255)) - ("darkblue", Color4f(0, 0, 139)) - ("darkcyan", Color4f(0, 139, 139)) - ("darkgoldenrod", Color4f(184, 134, 11)) - ("darkgray", Color4f(169, 169, 169)) - ("darkgreen", Color4f(0, 100, 0)) - ("darkgrey", Color4f(169, 169, 169)) - ("darkkhaki", Color4f(189, 183, 107)) - ("darkmagenta", Color4f(139, 0, 139)) - ("darkolivegreen", Color4f(85, 107, 47)) - ("darkorange", Color4f(255, 140, 0)) - ("darkorchid", Color4f(153, 50, 204)) - ("darkred", Color4f(139, 0, 0)) - ("darksalmon", Color4f(233, 150, 122)) - ("darkseagreen", Color4f(143, 188, 143)) - ("darkslateblue", Color4f(72, 61, 139)) - ("darkslategray", Color4f(47, 79, 79)) - ("darkslategrey", Color4f(47, 79, 79)) - ("darkturquoise", Color4f(0, 206, 209)) - ("darkviolet", Color4f(148, 0, 211)) - ("deeppink", Color4f(255, 20, 147)) - ("deepskyblue", Color4f(0, 191, 255)) - ("dimgray", Color4f(105, 105, 105)) - ("dimgrey", Color4f(105, 105, 105)) - ("dodgerblue", Color4f(30, 144, 255)) - ("firebrick", Color4f(178, 34, 34)) - ("floralwhite", Color4f(255, 250, 240)) - ("forestgreen", Color4f(34, 139, 34)) - ("fuchsia", Color4f(255, 0, 255)) - ("gainsboro", Color4f(220, 220, 220)) - ("ghostwhite", Color4f(248, 248, 255)) - ("gold", Color4f(255, 215, 0)) - ("goldenrod", Color4f(218, 165, 32)) - ("gray", Color4f(128, 128, 128)) - ("green", Color4f(0, 128, 0)) - ("greenyellow", Color4f(173, 255, 47)) - ("grey", Color4f(128, 128, 128)) - ("honeydew", Color4f(240, 255, 240)) - ("hotpink", Color4f(255, 105, 180)) - ("indianred", Color4f(205, 92, 92)) - ("indigo", Color4f(75, 0, 130)) - ("ivory", Color4f(255, 255, 240)) - ("khaki", Color4f(240, 230, 140)) - ("lavender", Color4f(230, 230, 250)) - ("lavenderblush", Color4f(255, 240, 245)) - ("lawngreen", Color4f(124, 252, 0)) - ("lemonchiffon", Color4f(255, 250, 205)) - ("lightblue", Color4f(173, 216, 230)) - ("lightcoral", Color4f(240, 128, 128)) - ("lightcyan", Color4f(224, 255, 255)) - ("lightgoldenrodyellow", Color4f(250, 250, 210)) - ("lightgray", Color4f(211, 211, 211)) - ("lightgreen", Color4f(144, 238, 144)) - ("lightgrey", Color4f(211, 211, 211)) - ("lightpink", Color4f(255, 182, 193)) - ("lightsalmon", Color4f(255, 160, 122)) - ("lightseagreen", Color4f(32, 178, 170)) - ("lightskyblue", Color4f(135, 206, 250)) - ("lightslategray", Color4f(119, 136, 153)) - ("lightslategrey", Color4f(119, 136, 153)) - ("lightsteelblue", Color4f(176, 196, 222)) - ("lightyellow", Color4f(255, 255, 224)) - ("lime", Color4f(0, 255, 0)) - ("limegreen", Color4f(50, 205, 50)) - ("linen", Color4f(250, 240, 230)) - ("magenta", Color4f(255, 0, 255)) - ("maroon", Color4f(128, 0, 0)) - ("mediumaquamarine", Color4f(102, 205, 170)) - ("mediumblue", Color4f(0, 0, 205)) - ("mediumorchid", Color4f(186, 85, 211)) - ("mediumpurple", Color4f(147, 112, 219)) - ("mediumseagreen", Color4f(60, 179, 113)) - ("mediumslateblue", Color4f(123, 104, 238)) - ("mediumspringgreen", Color4f(0, 250, 154)) - ("mediumturquoise", Color4f(72, 209, 204)) - ("mediumvioletred", Color4f(199, 21, 133)) - ("midnightblue", Color4f(25, 25, 112)) - ("mintcream", Color4f(245, 255, 250)) - ("mistyrose", Color4f(255, 228, 225)) - ("moccasin", Color4f(255, 228, 181)) - ("navajowhite", Color4f(255, 222, 173)) - ("navy", Color4f(0, 0, 128)) - ("oldlace", Color4f(253, 245, 230)) - ("olive", Color4f(128, 128, 0)) - ("olivedrab", Color4f(107, 142, 35)) - ("orange", Color4f(255, 165, 0)) - ("orangered", Color4f(255, 69, 0)) - ("orchid", Color4f(218, 112, 214)) - ("palegoldenrod", Color4f(238, 232, 170)) - ("palegreen", Color4f(152, 251, 152)) - ("paleturquoise", Color4f(175, 238, 238)) - ("palevioletred", Color4f(219, 112, 147)) - ("papayawhip", Color4f(255, 239, 213)) - ("peachpuff", Color4f(255, 218, 185)) - ("peru", Color4f(205, 133, 63)) - ("pink", Color4f(255, 192, 203)) - ("plum", Color4f(221, 160, 221)) - ("powderblue", Color4f(176, 224, 230)) - ("purple", Color4f(128, 0, 128)) - ("red", Color4f(255, 0, 0)) - ("rosybrown", Color4f(188, 143, 143)) - ("royalblue", Color4f(65, 105, 225)) - ("saddlebrown", Color4f(139, 69, 19)) - ("salmon", Color4f(250, 128, 114)) - ("sandybrown", Color4f(244, 164, 96)) - ("seagreen", Color4f(46, 139, 87)) - ("seashell", Color4f(255, 245, 238)) - ("sienna", Color4f(160, 82, 45)) - ("silver", Color4f(192, 192, 192)) - ("skyblue", Color4f(135, 206, 235)) - ("slateblue", Color4f(106, 90, 205)) - ("slategray", Color4f(112, 128, 144)) - ("slategrey", Color4f(112, 128, 144)) - ("snow", Color4f(255, 250, 250)) - ("springgreen", Color4f(0, 255, 127)) - ("steelblue", Color4f(70, 130, 180)) - ("tan", Color4f(210, 180, 140)) - ("teal", Color4f(0, 128, 128)) - ("thistle", Color4f(216, 191, 216)) - ("tomato", Color4f(255, 99, 71)) - ("transparent", Color4f(0, 0, 0, 0)) - ("turquoise", Color4f(64, 224, 208)) - ("violet", Color4f(238, 130, 238)) - ("wheat", Color4f(245, 222, 179)) - ("white", Color4f(255, 255, 255)) - ("whitesmoke", Color4f(245, 245, 245)) - ("yellow", Color4f(255, 255, 0)) - ("yellowgreen", Color4f(154, 205, 50)); +#pragma once + +#include +#include +#include +#include "linalg.h" +#include + +enum RenderColor { + BACKGROUND_COLOR, + OPENCSG_FACE_FRONT_COLOR, + OPENCSG_FACE_BACK_COLOR, + CGAL_FACE_FRONT_COLOR, + CGAL_FACE_2D_COLOR, + CGAL_FACE_BACK_COLOR, + CGAL_EDGE_FRONT_COLOR, + CGAL_EDGE_BACK_COLOR, + CGAL_EDGE_2D_COLOR, + CROSSHAIR_COLOR +}; + +typedef std::map ColorScheme; + +class ColorMap +{ +public: + static ColorMap *inst(bool erase = false); + + const ColorScheme &defaultColorScheme() const; + + const boost::unordered_map &webColors() const { return webcolors; } + const ColorScheme *findColorScheme(const std::string &name) const; + std::list colorSchemeNames() const; + + static Color4f getColor(const ColorScheme &cs, const RenderColor rc); + +private: + ColorMap(); + ~ColorMap() {} + + boost::unordered_map webcolors; + boost::unordered_map colorschemes; +}; diff --git a/src/export_png.cc b/src/export_png.cc index befdda4e..fad2a42f 100644 --- a/src/export_png.cc +++ b/src/export_png.cc @@ -38,6 +38,7 @@ void export_png(const Geometry *root_geom, Camera &cam, std::ostream &output) glview->setCamera(cam); glview->setRenderer(&cgalRenderer); + glview->setColorScheme(RenderSettings::inst()->colorscheme); glview->paintGL(); glview->save(output); } @@ -85,6 +86,7 @@ void export_png_preview_common(Tree &tree, Camera &cam, std::ostream &output, Pr OpenCSG::setContext(0); OpenCSG::setOption(OpenCSG::OffscreenSetting, OpenCSG::FrameBufferObject); #endif + csgInfo.glview->setColorScheme(RenderSettings::inst()->colorscheme); csgInfo.glview->paintGL(); csgInfo.glview->save(output); } diff --git a/src/linalg.h b/src/linalg.h index d43a28a5..69fe316f 100644 --- a/src/linalg.h +++ b/src/linalg.h @@ -3,7 +3,7 @@ #include #include #include -#include +#include EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::Vector2d) using Eigen::Vector2d; diff --git a/src/mainwin.cc b/src/mainwin.cc index d166f6a3..a2e9f4ad 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -28,6 +28,7 @@ #include "ModuleCache.h" #include "MainWindow.h" #include "parsersettings.h" +#include "rendersettings.h" #include "Preferences.h" #include "printutils.h" #include "node.h" @@ -409,8 +410,13 @@ MainWindow::MainWindow(const QString &filename) this, SLOT(openCSGSettingsChanged())); connect(Preferences::inst(), SIGNAL(syntaxHighlightChanged(const QString&)), editor, SLOT(setHighlightScheme(const QString&))); + connect(Preferences::inst(), SIGNAL(colorSchemeChanged(const QString&)), + this, SLOT(setColorScheme(const QString&))); Preferences::inst()->apply(); + QString cs = Preferences::inst()->getValue("3dview/colorscheme").toString(); + this->setColorScheme(cs); + connect(this->findTypeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectFindType(int))); connect(this->findInputField, SIGNAL(returnPressed()), this->nextButton, SLOT(animateClick())); find_panel->installEventFilter(this); @@ -1917,7 +1923,7 @@ void MainWindow::actionExportCSG() return; } - std::ofstream fstream(csg_filename.toUtf8()); + std::ofstream fstream(csg_filename.toLocal8Bit()); if (!fstream.is_open()) { PRINTB("Can't open file \"%s\" for export", csg_filename.toLocal8Bit().constData()); } @@ -1979,6 +1985,7 @@ void MainWindow::viewModePreview() viewModeActionsUncheck(); viewActionPreview->setChecked(true); this->qglview->setRenderer(this->opencsgRenderer ? (Renderer *)this->opencsgRenderer : (Renderer *)this->thrownTogetherRenderer); + this->qglview->updateColorScheme(); this->qglview->updateGL(); } else { viewModeThrownTogether(); @@ -1995,6 +2002,7 @@ void MainWindow::viewModeSurface() viewActionSurfaces->setChecked(true); this->qglview->setShowFaces(true); this->qglview->setRenderer(this->cgalRenderer); + this->qglview->updateColorScheme(); this->qglview->updateGL(); } @@ -2004,6 +2012,7 @@ void MainWindow::viewModeWireframe() viewActionWireframe->setChecked(true); this->qglview->setShowFaces(false); this->qglview->setRenderer(this->cgalRenderer); + this->qglview->updateColorScheme(); this->qglview->updateGL(); } @@ -2014,6 +2023,7 @@ void MainWindow::viewModeThrownTogether() viewModeActionsUncheck(); viewActionThrownTogether->setChecked(true); this->qglview->setRenderer(this->thrownTogetherRenderer); + this->qglview->updateColorScheme(); this->qglview->updateGL(); } @@ -2352,6 +2362,13 @@ MainWindow::preferences() Preferences::inst()->raise(); } +void MainWindow::setColorScheme(const QString &scheme) +{ + RenderSettings::inst()->colorscheme = scheme.toStdString(); + this->qglview->setColorScheme(scheme.toStdString()); + this->qglview->updateGL(); +} + void MainWindow::setFont(const QString &family, uint size) { QFont font; diff --git a/src/openscad.cc b/src/openscad.cc index 9c0fc6b6..1b860030 100644 --- a/src/openscad.cc +++ b/src/openscad.cc @@ -114,6 +114,7 @@ static void help(const char *progname) "%2%[ --viewall ] \\\n" "%2%[ --imgsize=width,height ] [ --projection=(o)rtho|(p)ersp] \\\n" "%2%[ --render | --preview[=throwntogether] ] \\\n" + "%2%[ --colorscheme=[Cornfield|Sunset|Metallic|Starnight|BeforeDawn|Nature|DeepOcean] ] \\\n" "%2%[ --csglimit=num ]" #ifdef ENABLE_EXPERIMENTAL " [ --enable= ]" @@ -152,7 +153,7 @@ static void info() exit(0); } -Camera get_camera( po::variables_map vm ) +Camera get_camera(po::variables_map vm) { Camera camera; @@ -623,6 +624,7 @@ int main(int argc, char **argv) ("viewall", "adjust camera to fit object") ("imgsize", po::value(), "=width,height for exporting png") ("projection", po::value(), "(o)rtho or (p)erspective when exporting png") + ("colorscheme", po::value(), "colorscheme") ("debug", po::value(), "special debug info") ("o,o", po::value(), "out-file") ("s,s", po::value(), "stl-file") @@ -723,6 +725,19 @@ int main(int argc, char **argv) } #endif + if (vm.count("colorscheme")) { + std::string colorscheme = vm["colorscheme"].as(); + if (ColorMap::inst()->findColorScheme(colorscheme)) { + RenderSettings::inst()->colorscheme = colorscheme; + } else { + PRINT("Unknown color scheme. Valid schemes:"); + BOOST_FOREACH (const std::string &name, ColorMap::inst()->colorSchemeNames()) { + PRINT(name); + } + exit(1); + } + } + currentdir = boosty::stringy(fs::current_path()); Camera camera = get_camera(vm); diff --git a/src/polyset.cc b/src/polyset.cc index 0d811e4a..222bfcb2 100644 --- a/src/polyset.cc +++ b/src/polyset.cc @@ -239,6 +239,7 @@ static void gl_draw_triangle(GLint *shaderinfo, const Vector3d &p0, const Vector void PolySet::render_surface(Renderer::csgmode_e csgmode, const Transform3d &m, GLint *shaderinfo) const { + PRINTD("Polyset render"); bool mirrored = m.matrix().determinant() < 0; #ifdef ENABLE_OPENCSG if (shaderinfo) { diff --git a/src/renderer.cc b/src/renderer.cc index 2f64999b..3b7a2a8a 100644 --- a/src/renderer.cc +++ b/src/renderer.cc @@ -3,47 +3,46 @@ #include "Geometry.h" #include "polyset.h" #include "Polygon2d.h" +#include "colormap.h" +#include "printutils.h" bool Renderer::getColor(Renderer::ColorMode colormode, Color4f &col) const { - switch (colormode) { - case COLORMODE_NONE: - return false; - break; - case COLORMODE_MATERIAL: - col = RenderSettings::inst()->color(RenderSettings::OPENCSG_FACE_FRONT_COLOR); - break; - case COLORMODE_CUTOUT: - col = RenderSettings::inst()->color(RenderSettings::OPENCSG_FACE_BACK_COLOR); - break; - case COLORMODE_HIGHLIGHT: - col.setRgb(255, 81, 81, 128); - break; - case COLORMODE_BACKGROUND: - col.setRgb(180, 180, 180, 128); - break; - case COLORMODE_MATERIAL_EDGES: - col.setRgb(255, 236, 94); - break; - case COLORMODE_CUTOUT_EDGES: - col.setRgb(171, 216, 86); - break; - case COLORMODE_HIGHLIGHT_EDGES: - col.setRgb(255, 171, 86, 128); - break; - case COLORMODE_BACKGROUND_EDGES: - col.setRgb(150, 150, 150, 128); - break; - default: - return false; - break; + if (colormode==COLORMODE_NONE) return false; + if (colormap.count(colormode) > 0) { + col = colormap.at(colormode); + return true; } - return true; + return false; +} + +Renderer::Renderer() : colorscheme(NULL) +{ + PRINTD("Renderer() start"); + // Setup default colors + // The main colors, MATERIAL and CUTOUT, come from this object's + // colorscheme. Colorschemes don't currently hold information + // for Highlight/Background colors + // but it wouldn't be too hard to make them do so. + + // MATERIAL is set by this object's colorscheme + // CUTOUT is set by this object's colorscheme + colormap[COLORMODE_HIGHLIGHT] = Color4f(255, 81, 81, 128); + colormap[COLORMODE_BACKGROUND] = Color4f(180, 180, 180, 128); + // MATERIAL_EDGES is set by this object's colorscheme + // CUTOUT_EDGES is set by this object's colorscheme + colormap[COLORMODE_HIGHLIGHT_EDGES] = Color4f(255, 171, 86, 128); + colormap[COLORMODE_BACKGROUND_EDGES] = Color4f(150, 150, 150, 128); + + setColorScheme(ColorMap::inst()->defaultColorScheme()); + PRINTD("Renderer() end"); } void Renderer::setColor(const float color[4], GLint *shaderinfo) const { - Color4f col = RenderSettings::inst()->color(RenderSettings::OPENCSG_FACE_FRONT_COLOR); + PRINTD("setColor a"); + Color4f col; + getColor(COLORMODE_MATERIAL,col); float c[4] = {color[0], color[1], color[2], color[3]}; if (c[0] < 0) c[0] = col[0]; if (c[1] < 0) c[1] = col[1]; @@ -60,6 +59,7 @@ void Renderer::setColor(const float color[4], GLint *shaderinfo) const void Renderer::setColor(ColorMode colormode, const float color[4], GLint *shaderinfo) const { + PRINTD("setColor b"); Color4f basecol; if (getColor(colormode, basecol)) { if (colormode == COLORMODE_BACKGROUND) { @@ -80,10 +80,25 @@ void Renderer::setColor(ColorMode colormode, const float color[4], GLint *shader void Renderer::setColor(ColorMode colormode, GLint *shaderinfo) const { + PRINTD("setColor c"); float c[4] = {-1,-1,-1,-1}; setColor(colormode, c, shaderinfo); } +/* fill this->colormap with matching entries from the colorscheme. note +this does not change Highlight or Background colors as they are not +represented in the colorscheme (yet). Also edgecolors are currently the +same for CGAL & OpenCSG */ +void Renderer::setColorScheme(const ColorScheme &cs) { + PRINTD("setColorScheme"); + colormap[COLORMODE_MATERIAL] = ColorMap::getColor(cs, OPENCSG_FACE_FRONT_COLOR); + colormap[COLORMODE_CUTOUT] = ColorMap::getColor(cs, OPENCSG_FACE_BACK_COLOR); + colormap[COLORMODE_MATERIAL_EDGES] = ColorMap::getColor(cs, CGAL_EDGE_FRONT_COLOR); + colormap[COLORMODE_CUTOUT_EDGES] = ColorMap::getColor(cs, CGAL_EDGE_BACK_COLOR); + colormap[COLORMODE_EMPTY_SPACE] = ColorMap::getColor(cs, BACKGROUND_COLOR); + this->colorscheme = &cs; +} + void Renderer::render_surface(shared_ptr geom, csgmode_e csgmode, const Transform3d &m, GLint *shaderinfo) { shared_ptr ps; diff --git a/src/renderer.h b/src/renderer.h index 992ef347..d8498607 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -3,6 +3,7 @@ #include "system-gl.h" #include "linalg.h" #include "memory.h" +#include "colormap.h" #ifdef _MSC_VER // NULL #include @@ -11,6 +12,7 @@ class Renderer { public: + Renderer(); virtual ~Renderer() {} virtual void draw(bool showfaces, bool showedges) const = 0; virtual BoundingBox getBoundingBox() const = 0; @@ -35,14 +37,20 @@ public: COLORMODE_MATERIAL_EDGES, COLORMODE_CUTOUT_EDGES, COLORMODE_HIGHLIGHT_EDGES, - COLORMODE_BACKGROUND_EDGES + COLORMODE_BACKGROUND_EDGES, + COLORMODE_EMPTY_SPACE }; virtual bool getColor(ColorMode colormode, Color4f &col) const; virtual void setColor(const float color[4], GLint *shaderinfo = NULL) const; virtual void setColor(ColorMode colormode, GLint *shaderinfo = NULL) const; virtual void setColor(ColorMode colormode, const float color[4], GLint *shaderinfo = NULL) const; + virtual void setColorScheme(const ColorScheme &cs); static void render_surface(shared_ptr geom, csgmode_e csgmode, const Transform3d &m, GLint *shaderinfo = NULL); static void render_edges(shared_ptr geom, csgmode_e csgmode); + +protected: + std::map colormap; + const ColorScheme *colorscheme; }; diff --git a/src/rendersettings.cc b/src/rendersettings.cc index ba68dc5d..b3eb86b2 100644 --- a/src/rendersettings.cc +++ b/src/rendersettings.cc @@ -1,4 +1,6 @@ #include "rendersettings.h" +#include "colormap.h" +#include "printutils.h" RenderSettings *RenderSettings::inst(bool erase) { @@ -16,24 +18,5 @@ RenderSettings::RenderSettings() far_gl_clip_limit = 100000.0; img_width = 512; img_height = 512; - this->colors[BACKGROUND_COLOR] = Color4f(0xff, 0xff, 0xe5); - this->colors[OPENCSG_FACE_FRONT_COLOR] = Color4f(0xf9, 0xd7, 0x2c); - this->colors[OPENCSG_FACE_BACK_COLOR] = Color4f(0x9d, 0xcb, 0x51); - this->colors[CGAL_FACE_FRONT_COLOR] = Color4f(0xf9, 0xd7, 0x2c); - this->colors[CGAL_FACE_BACK_COLOR] = Color4f(0x9d, 0xcb, 0x51); - this->colors[CGAL_FACE_2D_COLOR] = Color4f(0x00, 0xbf, 0x99); - this->colors[CGAL_EDGE_FRONT_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colors[CGAL_EDGE_BACK_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colors[CGAL_EDGE_2D_COLOR] = Color4f(0xff, 0x00, 0x00); - this->colors[CROSSHAIR_COLOR] = Color4f(0x80, 0x00, 0x00); -} - -Color4f RenderSettings::color(RenderColor idx) -{ - return this->colors[idx]; -} - -void RenderSettings::setColors(const std::map &colors) -{ - this->colors = colors; + colorscheme = "Cornfield"; } diff --git a/src/rendersettings.h b/src/rendersettings.h index e0be8174..09be9ded 100644 --- a/src/rendersettings.h +++ b/src/rendersettings.h @@ -2,33 +2,17 @@ #include #include "linalg.h" +#include "colormap.h" class RenderSettings { public: static RenderSettings *inst(bool erase = false); - enum RenderColor { - BACKGROUND_COLOR, - OPENCSG_FACE_FRONT_COLOR, - OPENCSG_FACE_BACK_COLOR, - CGAL_FACE_FRONT_COLOR, - CGAL_FACE_2D_COLOR, - CGAL_FACE_BACK_COLOR, - CGAL_EDGE_FRONT_COLOR, - CGAL_EDGE_BACK_COLOR, - CGAL_EDGE_2D_COLOR, - CROSSHAIR_COLOR - }; - - void setColors(const std::map &colors); - Color4f color(RenderColor idx); - unsigned int openCSGTermLimit, img_width, img_height; double far_gl_clip_limit; + std::string colorscheme; private: RenderSettings(); ~RenderSettings() {} - - std::map colors; }; diff --git a/src/typedefs.h b/src/typedefs.h index a7516ca6..56cd5e8a 100644 --- a/src/typedefs.h +++ b/src/typedefs.h @@ -2,13 +2,14 @@ #include #include +#include #include class Assignment : public std::pair > { public: - Assignment(std::string name) : pair(name, boost::shared_ptr()) {} - Assignment(std::string name, boost::shared_ptr expr) : pair(name, expr) {} + Assignment(std::string name) { first = name; second = boost::shared_ptr(); } + Assignment(std::string name, boost::shared_ptr expr) { first = name; second = expr; } }; typedef std::vector AssignmentList; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 24a4e3ac..0e48957a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -622,6 +622,7 @@ set(CORE_SOURCES ../src/parsersettings.cc ../src/mathc99.cc ../src/linalg.cc + ../src/colormap.cc ../src/Camera.cc ../src/handle_dep.cc ../src/value.cc @@ -905,6 +906,18 @@ function(add_cmdline_test TESTCMD_BASENAME) if (${DISABLED} EQUAL -1) + set(EXPERIMENTAL_OPTION "") + string(REGEX MATCH "csgtexttest" match_result1 ${TEST_FULLNAME}) + string(REGEX MATCH "cgalstlsanity" match_result2 ${TEST_FULLNAME}) + string(REGEX MATCH "dumptest" match_result3 ${TEST_FULLNAME}) + if( "${match_result1}" STREQUAL "" ) + if( "${match_result2}" STREQUAL "" ) + if( "${match_result3}" STREQUAL "" ) + set(EXPERIMENTAL_OPTION "--enable=text") + endif() + endif() + endif() + # 2D tests should be viewed from the top, not an angle. set(CAMERA_OPTION "") foreach(test2d IN LISTS TESTS_2D) @@ -933,7 +946,7 @@ function(add_cmdline_test TESTCMD_BASENAME) set(FILENAME_OPTION -f ${FILE_BASENAME}) endif() - add_test(NAME ${TEST_FULLNAME} ${CONFARG} ${CONFVAL} COMMAND ${PYTHON_EXECUTABLE} ${tests_SOURCE_DIR}/test_cmdline_tool.py --comparator=${COMPARATOR} -c ${IMAGE_COMPARE_EXECUTABLE} -s ${TESTCMD_SUFFIX} ${EXTRA_OPTIONS} ${TESTNAME_OPTION} ${FILENAME_OPTION} ${TESTCMD_EXE} ${TESTCMD_SCRIPT} "${SCADFILE}" ${CAMERA_OPTION} ${TESTCMD_ARGS}) + add_test(NAME ${TEST_FULLNAME} ${CONFARG} ${CONFVAL} COMMAND ${PYTHON_EXECUTABLE} ${tests_SOURCE_DIR}/test_cmdline_tool.py --comparator=${COMPARATOR} -c ${IMAGE_COMPARE_EXECUTABLE} -s ${TESTCMD_SUFFIX} ${EXTRA_OPTIONS} ${TESTNAME_OPTION} ${FILENAME_OPTION} ${TESTCMD_EXE} ${TESTCMD_SCRIPT} "${SCADFILE}" ${CAMERA_OPTION} ${EXPERIMENTAL_OPTION} ${TESTCMD_ARGS}) set_property(TEST ${TEST_FULLNAME} PROPERTY ENVIRONMENT "${CTEST_ENVIRONMENT}") endif() endforeach() @@ -1028,6 +1041,8 @@ disable_tests( offpngtest_iteration stlpngtest_fractal offpngtest_fractal + stlpngtest_logo_and_text + offpngtest_logo_and_text ) # mark which tests are 2d (regex match inside add_cmdline_test) @@ -1085,7 +1100,23 @@ set_test_config(Heavy cgalpngtest_rotate_extrude-tests cgalpngtest_linear_extrude-scale-zero-tests csgpngtest_linear_extrude-scale-zero-tests cgalpngtest_sphere-tests - csgpngtest_resize-tests) + csgpngtest_resize-tests + csgpngtest_resize-tests + stlpngtest_fence + stlpngtest_surface + stlpngtest_demo_cut + stlpngtest_search + stlpngtest_rounded_box + stlpngtest_difference + stlpngtest_translation + offpngtest_fence + offpngtest_surface + offpngtest_demo_cut + offpngtest_search + offpngtest_rounded_box + offpngtest_difference + offpngtest_translation +) # Bugs @@ -1313,11 +1344,35 @@ add_cmdline_test(openscad-cameyeortho-viewall EXE ${OPENSCAD_BINPATH} SUFFIX png FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/features/camera-tests.scad) - +# Colorscheme tests +add_cmdline_test(openscad-colorscheme-cornfield EXE ${OPENSCAD_BINPATH} + ARGS --colorscheme=Cornfield -o + SUFFIX png + FILES ${CMAKE_SOURCE_DIR}/../examples/Basics/difference_cube.scad) +add_cmdline_test(openscad-colorscheme-metallic EXE ${OPENSCAD_BINPATH} + ARGS --colorscheme=Metallic -o + SUFFIX png + FILES ${CMAKE_SOURCE_DIR}/../examples/Basics/difference_cube.scad) +add_cmdline_test(openscad-colorscheme-metallic-render EXE ${OPENSCAD_BINPATH} + ARGS --colorscheme=Metallic --render -o + SUFFIX png + FILES ${CMAKE_SOURCE_DIR}/../examples/Basics/difference_cube.scad) +add_cmdline_test(openscad-colorscheme-sunset EXE ${OPENSCAD_BINPATH} + ARGS --colorscheme=Sunset -o + SUFFIX png + FILES ${CMAKE_SOURCE_DIR}/../examples/Basics/difference_cube.scad) +add_cmdline_test(openscad-colorscheme-starnight EXE ${OPENSCAD_BINPATH} + ARGS --colorscheme=Starnight -o + SUFFIX png + FILES ${CMAKE_SOURCE_DIR}/../examples/Basics/difference_cube.scad) +add_cmdline_test(openscad-colorscheme-monotone EXE ${OPENSCAD_BINPATH} + ARGS --colorscheme=Monotone -o + SUFFIX png + FILES ${CMAKE_SOURCE_DIR}/../examples/Basics/difference_cube.scad) #message("Available test configurations: ${TEST_CONFIGS}") #foreach(CONF ${TEST_CONFIGS}) # message("${CONF}: ${${CONF}_TEST_CONFIG}") #endforeach() -message("CPPFLAGS: ${CMAKE_CXX_FLAGS}") +message(STATUS "CPPFLAGS: ${CMAKE_CXX_FLAGS}") diff --git a/tests/regression/throwntogethertest/logo_and_text-expected.png b/tests/regression/throwntogethertest/logo_and_text-expected.png index 279f2a9e..cb13d2a2 100644 Binary files a/tests/regression/throwntogethertest/logo_and_text-expected.png and b/tests/regression/throwntogethertest/logo_and_text-expected.png differ