mirror of https://github.com/vitalif/openscad
Update drawing logic (fixes #1035).
- Draw negative part of the axis with stippled lines - Calculate contrast color for axis based on background color - Disable lighting for axis / crosshairmaster
parent
cf418188b9
commit
3992cc547b
|
@ -150,18 +150,20 @@ void GLView::setupCamera()
|
||||||
|
|
||||||
void GLView::paintGL()
|
void GLView::paintGL()
|
||||||
{
|
{
|
||||||
glEnable(GL_LIGHTING);
|
glDisable(GL_LIGHTING);
|
||||||
|
|
||||||
setupCamera();
|
setupCamera();
|
||||||
|
|
||||||
Color4f bgcol = ColorMap::getColor(*this->colorscheme, BACKGROUND_COLOR);
|
Color4f bgcol = ColorMap::getColor(*this->colorscheme, BACKGROUND_COLOR);
|
||||||
|
Color4f bgcontrast = ColorMap::getContrastColor(bgcol);
|
||||||
glClearColor(bgcol[0], bgcol[1], bgcol[2], 1.0);
|
glClearColor(bgcol[0], bgcol[1], bgcol[2], 1.0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||||
|
|
||||||
// Only for GIMBAL cam
|
// Only for GIMBAL cam
|
||||||
if (showcrosshairs) GLView::showCrosshairs();
|
if (showcrosshairs) GLView::showCrosshairs();
|
||||||
if (showaxes) GLView::showAxes();
|
if (showaxes) GLView::showAxes(bgcontrast);
|
||||||
|
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
glDepthFunc(GL_LESS);
|
glDepthFunc(GL_LESS);
|
||||||
glCullFace(GL_BACK);
|
glCullFace(GL_BACK);
|
||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
|
@ -174,10 +176,11 @@ void GLView::paintGL()
|
||||||
OpenCSG::setContext(this->opencsg_id);
|
OpenCSG::setContext(this->opencsg_id);
|
||||||
#endif
|
#endif
|
||||||
this->renderer->draw(showfaces, showedges);
|
this->renderer->draw(showfaces, showedges);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only for GIMBAL
|
// Only for GIMBAL
|
||||||
if (showaxes) GLView::showSmallaxes();
|
glDisable(GL_LIGHTING);
|
||||||
|
if (showaxes) GLView::showSmallaxes(bgcontrast);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_OPENCSG
|
#ifdef ENABLE_OPENCSG
|
||||||
|
@ -348,6 +351,7 @@ void GLView::initializeGL()
|
||||||
glEnable(GL_LIGHT1);
|
glEnable(GL_LIGHT1);
|
||||||
glEnable(GL_LIGHTING);
|
glEnable(GL_LIGHTING);
|
||||||
glEnable(GL_NORMALIZE);
|
glEnable(GL_NORMALIZE);
|
||||||
|
glEnable(GL_LINE_STIPPLE);
|
||||||
|
|
||||||
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
|
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
|
||||||
// The following line is reported to fix issue #71
|
// The following line is reported to fix issue #71
|
||||||
|
@ -358,7 +362,7 @@ void GLView::initializeGL()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLView::showSmallaxes()
|
void GLView::showSmallaxes(const Color4f &col)
|
||||||
{
|
{
|
||||||
// Fixme - this doesnt work in Vector Camera mode
|
// Fixme - this doesnt work in Vector Camera mode
|
||||||
|
|
||||||
|
@ -423,14 +427,9 @@ void GLView::showSmallaxes()
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
||||||
// FIXME: This was an attempt to keep contrast with background, but is suboptimal
|
glColor3f(col[0], col[1], col[2]);
|
||||||
// (e.g. nearly invisible against a gray background).
|
|
||||||
// int r,g,b;
|
float d = 3*dpi;
|
||||||
// r=g=b=0;
|
|
||||||
// bgcol.getRgb(&r, &g, &b);
|
|
||||||
// glColor3f((255.0f-r)/255.0f, (255.0f-g)/255.0f, (255.0f-b)/255.0f);
|
|
||||||
float d = 3*dpi;
|
|
||||||
glColor3f(0.0f, 0.0f, 0.0f);
|
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
// X Label
|
// X Label
|
||||||
glVertex3d(xlabel_x-d, xlabel_y-d, 0); glVertex3d(xlabel_x+d, xlabel_y+d, 0);
|
glVertex3d(xlabel_x-d, xlabel_y-d, 0); glVertex3d(xlabel_x+d, xlabel_y+d, 0);
|
||||||
|
@ -447,29 +446,40 @@ void GLView::showSmallaxes()
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLView::showAxes()
|
void GLView::showAxes(const Color4f &col)
|
||||||
{
|
{
|
||||||
|
double l = cam.projection == Camera::PERSPECTIVE ? cam.viewer_distance : cam.height;
|
||||||
|
|
||||||
// FIXME: doesn't work under Vector Camera
|
// FIXME: doesn't work under Vector Camera
|
||||||
// Large gray axis cross inline with the model
|
// Large gray axis cross inline with the model
|
||||||
// FIXME: This is always gray - adjust color to keep contrast with background
|
|
||||||
glLineWidth(this->getDPI());
|
glLineWidth(this->getDPI());
|
||||||
glColor3d(0.5, 0.5, 0.5);
|
glColor3f(col[0], col[1], col[2]);
|
||||||
|
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
double l = cam.projection == Camera::PERSPECTIVE ? cam.viewer_distance : cam.height;
|
glVertex3d(0, 0, 0);
|
||||||
glVertex3d(-l, 0, 0);
|
|
||||||
glVertex3d(+l, 0, 0);
|
glVertex3d(+l, 0, 0);
|
||||||
glVertex3d(0, -l, 0);
|
glVertex3d(0, 0, 0);
|
||||||
glVertex3d(0, +l, 0);
|
glVertex3d(0, +l, 0);
|
||||||
glVertex3d(0, 0, -l);
|
glVertex3d(0, 0, 0);
|
||||||
glVertex3d(0, 0, +l);
|
glVertex3d(0, 0, +l);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
|
glPushAttrib(GL_LINE_BIT);
|
||||||
|
glLineStipple(3, 0xAAAA);
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
glVertex3d(0, 0, 0);
|
||||||
|
glVertex3d(-l, 0, 0);
|
||||||
|
glVertex3d(0, 0, 0);
|
||||||
|
glVertex3d(0, -l, 0);
|
||||||
|
glVertex3d(0, 0, 0);
|
||||||
|
glVertex3d(0, 0, -l);
|
||||||
|
glEnd();
|
||||||
|
glPopAttrib();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLView::showCrosshairs()
|
void GLView::showCrosshairs()
|
||||||
{
|
{
|
||||||
// FIXME: this might not work with Vector camera
|
// FIXME: this might not work with Vector camera
|
||||||
// FIXME: Crosshairs and axes are lighted, this doesn't make sense and causes them
|
|
||||||
// to change color based on view orientation.
|
|
||||||
glLineWidth(3);
|
glLineWidth(3);
|
||||||
Color4f col = ColorMap::getColor(*this->colorscheme, CROSSHAIR_COLOR);
|
Color4f col = ColorMap::getColor(*this->colorscheme, CROSSHAIR_COLOR);
|
||||||
glColor3f(col[0], col[1], col[2]);
|
glColor3f(col[0], col[1], col[2]);
|
||||||
|
|
|
@ -42,10 +42,6 @@ public:
|
||||||
void setCamera(const Camera &cam);
|
void setCamera(const Camera &cam);
|
||||||
void setupCamera();
|
void setupCamera();
|
||||||
|
|
||||||
void showCrosshairs();
|
|
||||||
void showAxes();
|
|
||||||
void showSmallaxes();
|
|
||||||
|
|
||||||
void setColorScheme(const ColorScheme &cs);
|
void setColorScheme(const ColorScheme &cs);
|
||||||
void setColorScheme(const std::string &cs);
|
void setColorScheme(const std::string &cs);
|
||||||
void updateColorScheme();
|
void updateColorScheme();
|
||||||
|
@ -76,4 +72,8 @@ public:
|
||||||
bool opencsg_support;
|
bool opencsg_support;
|
||||||
int opencsg_id;
|
int opencsg_id;
|
||||||
#endif
|
#endif
|
||||||
|
private:
|
||||||
|
void showCrosshairs();
|
||||||
|
void showAxes(const Color4f &col);
|
||||||
|
void showSmallaxes(const Color4f &col);
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,6 +5,29 @@
|
||||||
|
|
||||||
static const char *DEFAULT_COLOR_SCHEME_NAME = "Cornfield";
|
static const char *DEFAULT_COLOR_SCHEME_NAME = "Cornfield";
|
||||||
|
|
||||||
|
// See http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv
|
||||||
|
static void rgbtohsv(float r, float g, float b, float &h, float &s, float &v)
|
||||||
|
{
|
||||||
|
float K = 0.f;
|
||||||
|
|
||||||
|
if (g < b)
|
||||||
|
{
|
||||||
|
std::swap(g, b);
|
||||||
|
K = -1.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r < g)
|
||||||
|
{
|
||||||
|
std::swap(r, g);
|
||||||
|
K = -2.f / 6.f - K;
|
||||||
|
}
|
||||||
|
|
||||||
|
float chroma = r - std::min(g, b);
|
||||||
|
h = fabs(K + (g - b) / (6.f * chroma + 1e-20f));
|
||||||
|
s = chroma / (r + 1e-20f);
|
||||||
|
v = r;
|
||||||
|
}
|
||||||
|
|
||||||
RenderColorScheme::RenderColorScheme() : _path("")
|
RenderColorScheme::RenderColorScheme() : _path("")
|
||||||
{
|
{
|
||||||
_name = DEFAULT_COLOR_SCHEME_NAME;
|
_name = DEFAULT_COLOR_SCHEME_NAME;
|
||||||
|
@ -196,6 +219,42 @@ Color4f ColorMap::getColor(const ColorScheme &cs, const RenderColor rc)
|
||||||
return Color4f(0, 0, 0, 127);
|
return Color4f(0, 0, 0, 127);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Color4f ColorMap::getColorHSV(const Color4f &col)
|
||||||
|
{
|
||||||
|
float h, s, v;
|
||||||
|
rgbtohsv(col[0], col[1], col[2], h, s, v);
|
||||||
|
return Color4f(h, s, v, col[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate contrast color. Based on the article
|
||||||
|
* http://gamedev.stackexchange.com/questions/38536/given-a-rgb-color-x-how-to-find-the-most-contrasting-color-y
|
||||||
|
*
|
||||||
|
* @param col the input color
|
||||||
|
* @return a color with high contrast to the input color
|
||||||
|
*/
|
||||||
|
Color4f ColorMap::getContrastColor(const Color4f &col)
|
||||||
|
{
|
||||||
|
Color4f hsv = ColorMap::getColorHSV(col);
|
||||||
|
float Y = 0.2126 * col[0] + 0.7152 * col[1] + 0.0722 * col[2];
|
||||||
|
float S = hsv[1];
|
||||||
|
|
||||||
|
if (S < 0.5) {
|
||||||
|
// low saturation, choose between black / white based on luminance Y
|
||||||
|
float val = Y > 0.5 ? 0.0f : 1.0f;
|
||||||
|
return Color4f(val, val, val, 1.0f);
|
||||||
|
} else {
|
||||||
|
float H = 360 * hsv[0];
|
||||||
|
if ((H < 60) || (H > 300)) {
|
||||||
|
return Color4f(0.0f, 1.0f, 1.0f, 1.0f); // red -> cyan
|
||||||
|
} else if (H < 180) {
|
||||||
|
return Color4f(1.0f, 0.0f, 1.0f, 1.0f); // green -> magenta
|
||||||
|
} else {
|
||||||
|
return Color4f(1.0f, 1.0f, 0.0f, 1.0f); // blue -> yellow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ColorMap::enumerateColorSchemesInPath(colorscheme_set_t &result_set, const fs::path basePath)
|
void ColorMap::enumerateColorSchemesInPath(colorscheme_set_t &result_set, const fs::path basePath)
|
||||||
{
|
{
|
||||||
const fs::path color_schemes = basePath / "color-schemes" / "render";
|
const fs::path color_schemes = basePath / "color-schemes" / "render";
|
||||||
|
|
|
@ -79,6 +79,8 @@ public:
|
||||||
std::list<std::string> colorSchemeNames(bool guiOnly = false) const;
|
std::list<std::string> colorSchemeNames(bool guiOnly = false) const;
|
||||||
|
|
||||||
static Color4f getColor(const ColorScheme &cs, const RenderColor rc);
|
static Color4f getColor(const ColorScheme &cs, const RenderColor rc);
|
||||||
|
static Color4f getContrastColor(const Color4f &col);
|
||||||
|
static Color4f getColorHSV(const Color4f &col);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ColorMap();
|
ColorMap();
|
||||||
|
|
Loading…
Reference in New Issue