diff options
author | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-06-26 13:29:48 (GMT) |
---|---|---|
committer | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-06-26 13:29:48 (GMT) |
commit | cc913b4d8f8b62800223b1a86170077cf799dced (patch) | |
tree | 6516b214ef77a5da91d52772f535a0a24579693e | |
parent | cdc62b4f286ae24d162d940e09faafc75628c7e4 (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.cc | 117 | ||||
-rw-r--r-- | mainwin.cc | 11 | ||||
-rw-r--r-- | openscad.h | 4 | ||||
-rw-r--r-- | polyset.cc | 25 |
4 files changed, 96 insertions, 61 deletions
@@ -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) @@ -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]; } @@ -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: @@ -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(); |