fix for coloring on quad elements, transparent clipping plane

This commit is contained in:
Joachim Schoeberl 2013-02-03 14:41:44 +00:00
parent affda364a2
commit 4ea8277920
4 changed files with 133 additions and 28 deletions

View File

@ -366,7 +366,14 @@ namespace netgen
clipplane[2] = n.Z(); clipplane[2] = n.Z();
clipplane[3] = -(Vec3d(center) * n) + rad * vispar.clipping.dist; clipplane[3] = -(Vec3d(center) * n) + rad * vispar.clipping.dist;
glClipPlane(GL_CLIP_PLANE0, clipplane); double clipplane2[4];
clipplane2[0] = n.X();
clipplane2[1] = n.Y();
clipplane2[2] = n.Z();
clipplane2[3] = -(Vec3d(center) * n) +
rad * (vispar.clipping.dist + vispar.clipping.dist2);
glClipPlane(GL_CLIP_PLANE0, clipplane2);
glEnable(GL_CLIP_PLANE0); glEnable(GL_CLIP_PLANE0);
} }
else else
@ -462,7 +469,7 @@ namespace netgen
void VisualScene :: CreateTexture (int ncols, int linear, int typ) void VisualScene :: CreateTexture (int ncols, int linear, double alpha, int typ)
{ {
if (linear) ncols = 32; if (linear) ncols = 32;
else ncols = 8; else ncols = 8;
@ -502,7 +509,7 @@ namespace netgen
colortexture[4*i] = GLubyte (255 * col[0]); colortexture[4*i] = GLubyte (255 * col[0]);
colortexture[4*i+1] = GLubyte (255 * col[1]); colortexture[4*i+1] = GLubyte (255 * col[1]);
colortexture[4*i+2] = GLubyte (255 * col[2]); colortexture[4*i+2] = GLubyte (255 * col[2]);
colortexture[4*i+3] = GLubyte(255); colortexture[4*i+3] = GLubyte(255*alpha);
} }
// glPixelStorei (GL_UNPACK_ALIGNMENT, 1); // glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
@ -547,7 +554,7 @@ namespace netgen
{ {
if (!vispar.drawcolorbar) return; if (!vispar.drawcolorbar) return;
CreateTexture (8, linear, GL_DECAL); CreateTexture (8, linear, 1, GL_DECAL);
if (logscale && maxval <= 0) maxval = 1; if (logscale && maxval <= 0) maxval = 1;
if (logscale && minval <= 0) minval = 1e-4 * maxval; if (logscale && minval <= 0) minval = 1e-4 * maxval;

View File

@ -79,7 +79,7 @@ namespace netgen
static void SetBackGroundColor (double col) static void SetBackGroundColor (double col)
{ backcolor = col; } { backcolor = col; }
DLL_HEADER void CreateTexture (int ncols, int linear, int typ = GL_DECAL); DLL_HEADER void CreateTexture (int ncols, int linear, double alpha, int typ);
DLL_HEADER void DrawColorBar (double minval, double maxval, int logscale = 0, bool linear = 1); DLL_HEADER void DrawColorBar (double minval, double maxval, int logscale = 0, bool linear = 1);
DLL_HEADER void DrawCoordinateCross (); DLL_HEADER void DrawCoordinateCross ();
DLL_HEADER void DrawNetgenLogo (); DLL_HEADER void DrawNetgenLogo ();

View File

@ -27,13 +27,16 @@ public:
public: public:
Vec3d normal; Vec3d normal;
double dist; double dist;
double dist2;
int enable; int enable;
int timestamp; int timestamp;
bool operator== (Clipping & clip2) bool operator== (Clipping & clip2)
{ {
return return
(normal == clip2.normal) && (dist == clip2.dist) (normal == clip2.normal) &&
&& (enable == clip2.enable); (dist == clip2.dist) &&
// (dist2 == clip2.dist2) &&
(enable == clip2.enable);
} }
}; };
Clipping clipping; Clipping clipping;

View File

@ -353,9 +353,10 @@ namespace netgen
BuildScene(); BuildScene();
CreateTexture (numtexturecols, lineartexture, GL_MODULATE); CreateTexture (numtexturecols, lineartexture, 0.5, GL_MODULATE);
glClearColor(backcolor, backcolor, backcolor, 1); glClearColor(backcolor, backcolor, backcolor, 1);
// glClearColor(backcolor, backcolor, backcolor, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SetLight(); SetLight();
@ -405,25 +406,108 @@ namespace netgen
glMatrixMode (GL_MODELVIEW); glMatrixMode (GL_MODELVIEW);
} }
if (vispar.drawfilledtrigs || vispar.drawtetsdomain > 0 || vispar.drawdomainsurf > 0) if (vispar.drawfilledtrigs || vispar.drawtetsdomain > 0 || vispar.drawdomainsurf > 0)
{ {
SetClippingPlane (); // Change for Martin:
glCallList (surfellist); // orig:
SetClippingPlane ();
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
// glEnable(GL_BLEND);
glDisable(GL_BLEND);
glCallList (surfellist);
glDisable(GL_BLEND);
/*
// transparent test ...
glColor4f (1, 0, 0, 0.1);
glEnable (GL_COLOR_MATERIAL);
glDepthFunc(GL_GREATER);
glDepthMask(GL_FALSE);
// glBlendFunc(GL_ONE_MINUS_DST_ALPHA,GL_DST_ALPHA);
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA,GL_SRC_ALPHA);
glCallList (surfellist);
glDisable(GL_BLEND);
glDepthFunc(GL_LEQUAL);
glDepthMask(GL_TRUE);
glCallList (surfellist);
// end test ...
*/
glCallList (surface_vector_list); glCallList (surface_vector_list);
glDisable(GL_CLIP_PLANE0); glDisable(GL_CLIP_PLANE0);
} }
if (showclipsolution) if (showclipsolution)
{ {
if (clipsolution == 1) if (clipsolution == 1)
glCallList (clipplanelist_scal); {
// Martin
// orig:
// glCallList (clipplanelist_scal);
// transparent experiments
// see http://wiki.delphigl.com/index.php/Blenden
/*
glColor4f (1, 1, 1, 0.5);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_COLOR);
glDepthFunc(GL_GREATER);
glDepthMask(GL_FALSE);
glCallList (clipplanelist_scal);
glDepthFunc(GL_LEQUAL);
glDepthMask(GL_TRUE);
glCallList (clipplanelist_scal);
glDisable(GL_BLEND);
*/
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
// CreateTexture (numtexturecols, lineartexture, 0.25, GL_MODULATE);
// glCallList (clipplanelist_scal);
glEnable(GL_BLEND);
// glDisable(GL_DEPTH_TEST);
// CreateTexture (numtexturecols, lineartexture, 0.25, GL_MODULATE);
glCallList (clipplanelist_scal);
// glDepthFunc(GL_LEQUAL);
// glDepthMask(GL_TRUE);
// glCallList (clipplanelist_scal);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
// end test
}
if (clipsolution == 2) if (clipsolution == 2)
glCallList (clipplanelist_vec); {
// glDisable(GL_DEPTH_TEST);
glCallList (clipplanelist_vec);
// glEnable(GL_DEPTH_TEST);
}
} }
if (draw_fieldlines) if (draw_fieldlines)
{ {
SetClippingPlane(); SetClippingPlane();
@ -474,8 +558,12 @@ namespace netgen
if (vispar.drawoutline && !numisolines) if (vispar.drawoutline && !numisolines)
{ {
SetClippingPlane (); // change for Martin
SetClippingPlane ();
glDepthMask(GL_FALSE);
glCallList (linelist); glCallList (linelist);
glDepthMask(GL_TRUE);
glDisable(GL_CLIP_PLANE0); glDisable(GL_CLIP_PLANE0);
} }
@ -1023,7 +1111,7 @@ namespace netgen
glLineWidth (1.0f); glLineWidth (1.0f);
GLfloat col_grey[] = { 0.6f, 0.6f, 0.6f }; GLfloat col_grey[] = { 0.6f, 0.6f, 0.6f, 1.0f };
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col_grey); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col_grey);
@ -1078,16 +1166,17 @@ namespace netgen
int npt = (n+1)*(n+1); int npt = (n+1)*(n+1);
if (curved) if (curved)
for (int ii = 0; ii < npt; ii++) {
{ for (int ii = 0; ii < npt; ii++)
Point<2> xref = pref[ii]; {
Mat<3,2> dxdxi; Point<2> xref = pref[ii];
mesh->GetCurvedElements(). mesh->GetCurvedElements().
CalcSurfaceTransformation (xref, sei, points[ii], dxdxi); CalcSurfaceTransformation (xref, sei, points[ii], dxdxis[ii]);
nvs[ii] = Cross (dxdxi.Col(0), dxdxi.Col(1)); nvs[ii] = Cross (dxdxis[ii].Col(0), dxdxis[ii].Col(1));
nvs[ii].Normalize(); nvs[ii].Normalize();
} }
}
else else
{ {
Point<3> lpi[4]; Point<3> lpi[4];
@ -1105,6 +1194,11 @@ namespace netgen
double x = pref[ii](0); double x = pref[ii](0);
double y = pref[ii](1); double y = pref[ii](1);
points[ii] = lpi[0] + x * vx + y * vy + x*y * vtwist; points[ii] = lpi[0] + x * vx + y * vy + x*y * vtwist;
for (int j = 0; j < 3; j++)
{
dxdxis[ii](j,0) = vx(j) + y*vtwist(j);
dxdxis[ii](j,1) = vy(j) + x*vtwist(j);
}
} }
Vec<3> nv = Cross (vx, vy); Vec<3> nv = Cross (vx, vy);
@ -1174,7 +1268,7 @@ namespace netgen
valuesc[index[j]].imag() ); valuesc[index[j]].imag() );
} }
else else
glColor3fv (col_grey); glColor4fv (col_grey);
glNormal3dv (nvs[index[j]]); glNormal3dv (nvs[index[j]]);
glVertex3dv (points[index[j]]); glVertex3dv (points[index[j]]);
@ -1198,6 +1292,7 @@ namespace netgen
for(SurfaceElementIndex sei = 0; sei < nse; sei++) for(SurfaceElementIndex sei = 0; sei < nse; sei++)
{ {
const Element2d & el = (*mesh)[sei]; const Element2d & el = (*mesh)[sei];
// if (el.GetIndex() <= 1) continue;
if(vispar.drawdomainsurf > 0) if(vispar.drawdomainsurf > 0)
{ {
@ -1297,7 +1392,7 @@ namespace netgen
glTexCoord2f ( valuesc[hi].real(), valuesc[hi].imag() ); glTexCoord2f ( valuesc[hi].real(), valuesc[hi].imag() );
} }
else else
glColor3fv (col_grey); glColor4fv (col_grey);
glNormal3dv (nvs[hi]); glNormal3dv (nvs[hi]);
glVertex3dv (points[hi]); glVertex3dv (points[hi]);