summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2009-06-26 17:07:40 (GMT)
committerclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2009-06-26 17:07:40 (GMT)
commit7b153c2092f74d58e86f08934760a6df490ac038 (patch)
treecc0217fbb83db984c4a456cdd4a0348accfb2f87
parentcc913b4d8f8b62800223b1a86170077cf799dced (diff)
Clifford Wolf:
Improvements in pseudo wireframe shader git-svn-id: http://svn.clifford.at/openscad/trunk@25 b57f626f-c46c-0410-a088-ec61d464b74c
-rw-r--r--glview.cc38
-rw-r--r--mainwin.cc9
-rw-r--r--openscad.h4
-rw-r--r--polyset.cc47
4 files changed, 51 insertions, 47 deletions
diff --git a/glview.cc b/glview.cc
index 793f449..2bdccbe 100644
--- a/glview.cc
+++ b/glview.cc
@@ -38,7 +38,9 @@ GLView::GLView(QWidget *parent) : QGLWidget(parent)
renderfunc = NULL;
renderfunc_vp = NULL;
- edgeshader_prog = 0;
+
+ for (int i = 0; i < 10; i++)
+ shaderinfo[i] = 0;
setMouseTracking(true);
}
@@ -59,21 +61,21 @@ void GLView::initializeGL()
if (glewIsSupported("GL_VERSION_2_0"))
{
- char *vs_source =
- "attribute float e1, e2, e3;\n"
- "varying float ve1, ve2, ve3;\n"
+ const char *vs_source =
+ "attribute vec3 tripos;\n"
+ "varying vec3 tp;\n"
"void main() {\n"
- " gl_FrontColor = gl_Color;\n"
- " gl_Position = ftransform();\n"
- " ve1 = e1; ve2 = e2; ve3 = e3;\n"
+ " gl_Position = ftransform();\n"
+ " tp = tripos;\n"
"}\n";
- char *fs_source =
- "varying float ve1, ve2, ve3;\n"
+ const char *fs_source =
+ "uniform vec4 color1, color2;\n"
+ "varying vec3 tp;\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"
+ " gl_FragColor = color1;\n"
+ " if (tp.x > 0.95 || tp.y > 0.95 || tp.z > 0.95)\n"
+ " gl_FragColor = color2;\n"
"}\n";
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
@@ -84,11 +86,21 @@ void GLView::initializeGL()
glShaderSource(fs, 1, (const GLchar**)&fs_source, NULL);
glCompileShader(fs);
- edgeshader_prog = glCreateProgram();
+ GLuint edgeshader_prog = glCreateProgram();
glAttachShader(edgeshader_prog, vs);
glAttachShader(edgeshader_prog, fs);
glLinkProgram(edgeshader_prog);
+ shaderinfo[0] = edgeshader_prog;
+ shaderinfo[1] = glGetUniformLocation(edgeshader_prog, "color1");
+ shaderinfo[2] = glGetUniformLocation(edgeshader_prog, "color2");
+ shaderinfo[3] = glGetAttribLocation(edgeshader_prog, "tripos");
+
+ GLenum err = glGetError();
+ if (err != GL_NO_ERROR) {
+ fprintf(stderr, "OpenGL Error: %s\n", gluErrorString(err));
+ }
+
GLint status;
glGetProgramiv(edgeshader_prog, GL_LINK_STATUS, &status);
if (status == GL_FALSE) {
diff --git a/mainwin.cc b/mainwin.cc
index dc0c8e8..166e1df 100644
--- a/mainwin.cc
+++ b/mainwin.cc
@@ -419,9 +419,6 @@ 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++)
{
@@ -431,12 +428,12 @@ static void renderGLviaOpenCSG(void *vp)
{
OpenCSG::render(primitives, OpenCSG::Goldfeather, OpenCSG::NoDepthComplexitySampling);
glDepthFunc(GL_EQUAL);
- glUseProgram(m->screen->edgeshader_prog);
+ glUseProgram(m->screen->shaderinfo[0]);
for (; j < i; j++) {
if (m->root_chain->types[j] == CSGTerm::DIFFERENCE) {
- m->root_chain->polysets[j]->render_surface(PolySet::COLOR_CUTOUT, e1, e2, e3);
+ m->root_chain->polysets[j]->render_surface(PolySet::COLOR_CUTOUT, m->screen->shaderinfo);
} else {
- m->root_chain->polysets[j]->render_surface(PolySet::COLOR_MATERIAL, e1, e2, e3);
+ m->root_chain->polysets[j]->render_surface(PolySet::COLOR_MATERIAL, m->screen->shaderinfo);
}
}
glUseProgram(0);
diff --git a/openscad.h b/openscad.h
index 1408f78..c6f469e 100644
--- a/openscad.h
+++ b/openscad.h
@@ -314,7 +314,7 @@ public:
COLOR_CUTOUT
};
- void render_surface(colormode_e colormode, GLint e1 = 0, GLint e2 = 0, GLint e3 = 0) const;
+ void render_surface(colormode_e colormode, GLint *shaderinfo = NULL) const;
void render_edges(colormode_e colormode) const;
#ifdef ENABLE_CGAL
@@ -428,7 +428,7 @@ public:
double object_rot_z;
double w_h_ratio;
- GLuint edgeshader_prog;
+ GLint shaderinfo[10];
GLView(QWidget *parent = NULL);
diff --git a/polyset.cc b/polyset.cc
index 54f8a3a..8df3d96 100644
--- a/polyset.cc
+++ b/polyset.cc
@@ -53,33 +53,22 @@ static void set_opengl_normal(double x1, double y1, double z1, double x2, double
glNormal3d(-nx, -ny, -nz);
}
-static void set_triangle_point_data(GLint e1, GLint e2, GLint e3)
+void PolySet::render_surface(colormode_e colormode, GLint *shaderinfo) const
{
- 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)
+ if (colormode == COLOR_MATERIAL) {
glColor3ub(249, 215, 44);
- if (colormode == COLOR_CUTOUT)
+ if (shaderinfo) {
+ glUniform4f(shaderinfo[1], 249 / 255.0, 215 / 255.0, 44 / 255.0, 1.0);
+ glUniform4f(shaderinfo[2], 255 / 255.0, 236 / 255.0, 94 / 255.0, 1.0);
+ }
+ }
+ if (colormode == COLOR_CUTOUT) {
glColor3ub(157, 203, 81);
+ if (shaderinfo) {
+ glUniform4f(shaderinfo[1], 157 / 255.0, 203 / 255.0, 81 / 255.0, 1.0);
+ glUniform4f(shaderinfo[2], 171 / 255.0, 216 / 255.0, 86 / 255.0, 1.0);
+ }
+ }
for (int i = 0; i < polygons.size(); i++) {
const Polygon *poly = &polygons[i];
glBegin(GL_POLYGON);
@@ -88,8 +77,14 @@ void PolySet::render_surface(colormode_e colormode, GLint e1, GLint e2, GLint e3
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);
+ if (shaderinfo) {
+ if (j%3 == 0)
+ glVertexAttrib3d(shaderinfo[3], 1.0, 1.0, 0.0);
+ if (j%3 == 1)
+ glVertexAttrib3d(shaderinfo[3], 1.0, 0.0, 1.0);
+ if (j%3 == 2)
+ glVertexAttrib3d(shaderinfo[3], 0.0, 1.0, 1.0);
+ }
glVertex3d(p->x, p->y, p->z);
}
glEnd();
contact: Jan Huwald // Impressum