summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2009-06-26 13:29:48 (GMT)
committerclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2009-06-26 13:29:48 (GMT)
commitcc913b4d8f8b62800223b1a86170077cf799dced (patch)
tree6516b214ef77a5da91d52772f535a0a24579693e
parentcdc62b4f286ae24d162d940e09faafc75628c7e4 (diff)
Clifford Wolf:
Added shader for pseudo-edges in opencsg mode git-svn-id: http://svn.clifford.at/openscad/trunk@24 b57f626f-c46c-0410-a088-ec61d464b74c
-rw-r--r--glview.cc117
-rw-r--r--mainwin.cc11
-rw-r--r--openscad.h4
-rw-r--r--polyset.cc25
4 files changed, 96 insertions, 61 deletions
diff --git a/glview.cc b/glview.cc
index 192dedb..793f449 100644
--- a/glview.cc
+++ b/glview.cc
@@ -22,6 +22,7 @@
#include <QWheelEvent>
#include <QMouseEvent>
+#include <GL/glew.h>
#define FAR_FAR_AWAY 100000.0
@@ -37,74 +38,80 @@ GLView::GLView(QWidget *parent) : QGLWidget(parent)
renderfunc = NULL;
renderfunc_vp = NULL;
+ edgeshader_prog = 0;
setMouseTracking(true);
}
+extern GLint e1, e2, e3;
+
void GLView::initializeGL()
{
+ GLenum err = glewInit();
+ if (GLEW_OK != err) {
+ fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
+ }
+
glEnable(GL_DEPTH_TEST);
glDepthRange(-FAR_FAR_AWAY, +FAR_FAR_AWAY);
glClearColor(1.0, 1.0, 0.9, 0.0);
-#if 0
- char *vs_source =
- "attribute float e1, e2, e3;\n"
- "varying float ve1, ve2, ve3;\n"
- "void main() {\n"
- " gl_FrontColor = gl_Color;\n"
- " gl_Position = ftransform();\n"
- " ve1 = e1; ve2 = e2; ve3 = e3;\n"
- "}\n";
-
- char *fs_source =
- "#extension GL_EXT_gpu_shader4 : enable\n"
- "varying float ve1, ve2, ve3;\n"
- "void main() {\n"
- " gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n"
- " if (ve1 > 0.9 || ve2 > 0.9 || ve3 > 0.9)\n"
- " gl_FragColor = vec4(0.0,1.0,0.0,1.0);\n"
- " gl_FragColor = gl_FrontColor;\n"
- "}\n";
-
- GLuint edgeshader_prog = glCreateProgram();
-
- GLuint vs = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vs, 1, (const GLchar**)&vs_source, NULL);
- glCompileShader(vs);
- glAttachShader(edgeshader_prog, vs);
-
- GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(fs, 1, (const GLchar**)&fs_source, NULL);
- glCompileShader(fs);
- glAttachShader(edgeshader_prog, fs);
-
- glLinkProgram(edgeshader_prog);
-
- GLint status;
- glGetProgramiv(edgeshader_prog, GL_LINK_STATUS, &status);
- if (status == GL_FALSE) {
- int loglen;
- char logbuffer[1000];
- glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer);
- fprintf(stderr, "OpenGL Program Linker Error:\n%.*s", loglen, logbuffer);
- } else {
- int loglen;
- char logbuffer[1000];
- glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer);
- if (loglen > 0) {
- fprintf(stderr, "OpenGL Program Link OK:\n%.*s", loglen, logbuffer);
- }
- glValidateProgram(edgeshader_prog);
- glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer);
- if (loglen > 0) {
- fprintf(stderr, "OpenGL Program Validation results:\n%.*s", loglen, logbuffer);
+ if (glewIsSupported("GL_VERSION_2_0"))
+ {
+ char *vs_source =
+ "attribute float e1, e2, e3;\n"
+ "varying float ve1, ve2, ve3;\n"
+ "void main() {\n"
+ " gl_FrontColor = gl_Color;\n"
+ " gl_Position = ftransform();\n"
+ " ve1 = e1; ve2 = e2; ve3 = e3;\n"
+ "}\n";
+
+ char *fs_source =
+ "varying float ve1, ve2, ve3;\n"
+ "void main() {\n"
+ " gl_FragColor = vec4(249.0/255.0, 215.0/255.0, 44.0/255.0, 1.0);\n"
+ " if (ve1 > 0.95 || ve2 > 0.95 || ve3 > 0.95)\n"
+ " gl_FragColor = vec4(255.0/255.0, 236.0/255.0, 94.0/255.0, 1.0);\n"
+ "}\n";
+
+ GLuint vs = glCreateShader(GL_VERTEX_SHADER);
+ glShaderSource(vs, 1, (const GLchar**)&vs_source, NULL);
+ glCompileShader(vs);
+
+ GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
+ glShaderSource(fs, 1, (const GLchar**)&fs_source, NULL);
+ glCompileShader(fs);
+
+ edgeshader_prog = glCreateProgram();
+ glAttachShader(edgeshader_prog, vs);
+ glAttachShader(edgeshader_prog, fs);
+ glLinkProgram(edgeshader_prog);
+
+ GLint status;
+ glGetProgramiv(edgeshader_prog, GL_LINK_STATUS, &status);
+ if (status == GL_FALSE) {
+ int loglen;
+ char logbuffer[1000];
+ glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer);
+ fprintf(stderr, "OpenGL Program Linker Error:\n%.*s", loglen, logbuffer);
+ } else {
+ int loglen;
+ char logbuffer[1000];
+ glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer);
+ if (loglen > 0) {
+ fprintf(stderr, "OpenGL Program Link OK:\n%.*s", loglen, logbuffer);
+ }
+ glValidateProgram(edgeshader_prog);
+ glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer);
+ if (loglen > 0) {
+ fprintf(stderr, "OpenGL Program Validation results:\n%.*s", loglen, logbuffer);
+ }
}
+ } else {
+ fprintf(stdout, "GLEW: GL_VERSION_2_0 is not supported!\n");
}
-
- glUseProgram(edgeshader_prog);
-#endif
}
void GLView::resizeGL(int w, int h)
diff --git a/mainwin.cc b/mainwin.cc
index 4ed76a9..dc0c8e8 100644
--- a/mainwin.cc
+++ b/mainwin.cc
@@ -419,6 +419,9 @@ static void renderGLviaOpenCSG(void *vp)
if (m->root_chain) {
std::vector<OpenCSG::Primitive*> primitives;
+ GLint e1 = glGetAttribLocation(m->screen->edgeshader_prog, "e1");
+ GLint e2 = glGetAttribLocation(m->screen->edgeshader_prog, "e2");
+ GLint e3 = glGetAttribLocation(m->screen->edgeshader_prog, "e3");
int j = 0;
for (int i = 0;; i++)
{
@@ -428,15 +431,15 @@ static void renderGLviaOpenCSG(void *vp)
{
OpenCSG::render(primitives, OpenCSG::Goldfeather, OpenCSG::NoDepthComplexitySampling);
glDepthFunc(GL_EQUAL);
+ glUseProgram(m->screen->edgeshader_prog);
for (; j < i; j++) {
if (m->root_chain->types[j] == CSGTerm::DIFFERENCE) {
- m->root_chain->polysets[j]->render_surface(PolySet::COLOR_CUTOUT);
- m->root_chain->polysets[j]->render_edges(PolySet::COLOR_CUTOUT);
+ m->root_chain->polysets[j]->render_surface(PolySet::COLOR_CUTOUT, e1, e2, e3);
} else {
- m->root_chain->polysets[j]->render_surface(PolySet::COLOR_MATERIAL);
- m->root_chain->polysets[j]->render_edges(PolySet::COLOR_MATERIAL);
+ m->root_chain->polysets[j]->render_surface(PolySet::COLOR_MATERIAL, e1, e2, e3);
}
}
+ glUseProgram(0);
for (unsigned int k = 0; k < primitives.size(); k++) {
delete primitives[k];
}
diff --git a/openscad.h b/openscad.h
index d37f6ac..1408f78 100644
--- a/openscad.h
+++ b/openscad.h
@@ -314,7 +314,7 @@ public:
COLOR_CUTOUT
};
- void render_surface(colormode_e colormode) const;
+ void render_surface(colormode_e colormode, GLint e1 = 0, GLint e2 = 0, GLint e3 = 0) const;
void render_edges(colormode_e colormode) const;
#ifdef ENABLE_CGAL
@@ -428,6 +428,8 @@ public:
double object_rot_z;
double w_h_ratio;
+ GLuint edgeshader_prog;
+
GLView(QWidget *parent = NULL);
protected:
diff --git a/polyset.cc b/polyset.cc
index 71463bd..54f8a3a 100644
--- a/polyset.cc
+++ b/polyset.cc
@@ -53,7 +53,28 @@ static void set_opengl_normal(double x1, double y1, double z1, double x2, double
glNormal3d(-nx, -ny, -nz);
}
-void PolySet::render_surface(colormode_e colormode) const
+static void set_triangle_point_data(GLint e1, GLint e2, GLint e3)
+{
+ static int state = 0;
+ if (state == 0) {
+ glVertexAttrib1d(e1, 1.0);
+ glVertexAttrib1d(e2, 1.0);
+ glVertexAttrib1d(e3, 0.0);
+ }
+ if (state == 1) {
+ glVertexAttrib1d(e1, 0.0);
+ glVertexAttrib1d(e2, 1.0);
+ glVertexAttrib1d(e3, 1.0);
+ }
+ if (state == 2) {
+ glVertexAttrib1d(e1, 1.0);
+ glVertexAttrib1d(e2, 0.0);
+ glVertexAttrib1d(e3, 1.0);
+ }
+ state = (state + 1) % 3;
+}
+
+void PolySet::render_surface(colormode_e colormode, GLint e1, GLint e2, GLint e3) const
{
if (colormode == COLOR_MATERIAL)
glColor3ub(249, 215, 44);
@@ -67,6 +88,8 @@ void PolySet::render_surface(colormode_e colormode) const
poly->at(2).x, poly->at(2).y, poly->at(2).z);
for (int j = 0; j < poly->size(); j++) {
const Point *p = &poly->at(j);
+ if (e1 && e2 && e3)
+ set_triangle_point_data(e1, e2, e3);
glVertex3d(p->x, p->y, p->z);
}
glEnd();
contact: Jan Huwald // Impressum