From 9fdf0384b7a8aad24874d7d7bc367cbd18edea2c Mon Sep 17 00:00:00 2001
From: vigmond <ed.vigmond@gmail.com>
Date: Fri, 16 Oct 2020 09:27:43 +0200
Subject: [PATCH] Really fixed surface opacity

---
 src/Surfaces.cc  | 19 ++++++++-----------
 src/TBmeshWin.cc | 38 +++++++++++++++++---------------------
 src/TBmeshWin.h  |  2 +-
 3 files changed, 26 insertions(+), 33 deletions(-)

diff --git a/src/Surfaces.cc b/src/Surfaces.cc
index 4fd533e..93aac91 100644
--- a/src/Surfaces.cc
+++ b/src/Surfaces.cc
@@ -107,22 +107,21 @@ void Surfaces::zsort( void *context, int stride, bool sort )
 
     if( memcmp(mvp, _oldmvp, sizeof(mvp) ) || stride != _oldstride) {
       memcpy( _oldmvp, mvp, sizeof(mvp) );
+    }
 #pragma omp parallel for 
-      for ( int i=0; i<_ele.size(); i+=stride ){
-        const PPoint *pts = _ele[i]->pt();
-        _zlist[i] = {i,0,_index};
-        const int *nn     = _ele[i]->obj();
-        for( int k=0; k<3; k++ )
-          _zlist[i].z += z_proj(mvp,pts->pt(nn[k]));
-      }
-      std::sort( _zlist.begin(), _zlist.end(),[](const vtx_z a, const vtx_z b){return a.z<b.z;} );
+    for ( int i=0; i<_ele.size(); i+=stride ){
+      const PPoint *pts = _ele[i]->pt();
+      _zlist[i] = {i,0,_index};
+      const int *nn     = _ele[i]->obj();
+      for( int k=0; k<3; k++ )
+        _zlist[i].z += z_proj(mvp,pts->pt(nn[k]));
     }
+    std::sort( _zlist.begin(), _zlist.end(),[](const vtx_z a, const vtx_z b){return a.z<b.z;} );
 
   } else {
     for ( int i=0; i<_ele.size(); i+=stride )
       _zlist[i/stride] = { i, 0, _index };
   }
-
   _oldstride = stride;
 }
 
@@ -185,8 +184,6 @@ void Surfaces::buffer( GLfloat *fill, Colourscale *cs, DATA_TYPE *dat,
 void Surfaces::buffer_opaque( float opaque, GLfloat *fill, Colourscale *cs, DATA_TYPE *dat,
                      dataOpac* dataopac, GLfloat *&buffer, bool flat )
 {
-  return;
-
   set<int> solid;
 
   for ( int j=0; j<_zlist.size(); j++ ) {
diff --git a/src/TBmeshWin.cc b/src/TBmeshWin.cc
index 9245bdd..77633c5 100644
--- a/src/TBmeshWin.cc
+++ b/src/TBmeshWin.cc
@@ -194,10 +194,10 @@ void TBmeshWin :: draw()
     glDepthFunc( GL_LEQUAL );
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     glViewport( 0, 0, pixel_w(), pixel_h() );
-    glClearColor( bc[0], bc[1], bc[2], bgd_trans?0:1 );
-    if ( renderMode == GL_SELECT ) {		// for picking and vertex list
+    if ( renderMode == GL_SELECT )		// for picking and vertex list
       glClearColor( 0, 0, 0, 0 );
-    }
+    else
+      glClearColor( bc[0], bc[1], bc[2], bgd_trans?0:1 );
     float maxdim = model->maxdim();
     float xdim   = maxdim;
     float ydim   = maxdim;
@@ -406,8 +406,8 @@ TBmeshWin::draw_surfaces( RenderTris &rd, vector<vtx_z> &trans, bool wireframe )
   if( translucent && rd.num()>MAX_SURFELE_REALTIME && _spinning )
     return;
 
-  bool newView = (REDRAW(VBO_View))&&translucent;
-  if( REBUFFER_SURF(_redraw_state) || newView )  { // refill buffer
+  bool newView = REBUFFER_SURF(_redraw_state) || ((REDRAW(VBO_View))&&translucent);
+  if( newView )  { // refill buffer
     int ntris   = 0;
     for ( int s=0; s<model->numSurf(); s++ ) { 
       Surfaces *surf = model->surface(s);
@@ -432,7 +432,7 @@ TBmeshWin::draw_surfaces( RenderTris &rd, vector<vtx_z> &trans, bool wireframe )
     rd.set_material( s, props );
 
     if ( wireframe ? sf->outline() : sf->filled() ) {
-      if( REBUFFER_SURF(_redraw_state) || newView )  {
+      if( newView )  {
         if( draw_surface(sf, vbobuf, wireframe ) ) {
           // merge elements into list, keeping order
           unsigned int te_sz = trans.size();
@@ -468,10 +468,10 @@ bool
 TBmeshWin::draw_surface(Surfaces* sf, GLfloat *&vbobuf, bool wf )
 {
   int stride        = 1;
+  Object_t obj      = wf ? SurfEle : Surface;
   GLfloat *s_colour = wf ? sf->outlinecolor() : sf->fillcolor();
   bool     showData = datadst&(wf?SurfEdge_flg:Surface_flg) && have_data!=NoData; 
-  bool     dopac_on = dataopac->dop[wf?SurfEle:Surface].on();
-  bool     on_tr    = translucency( wf?SurfEle:Surface, s_colour );
+  bool     on_tr    = translucency( obj, s_colour );
 
   glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
   sf->zsort( context(), stride, on_tr );
@@ -479,9 +479,9 @@ TBmeshWin::draw_surface(Surfaces* sf, GLfloat *&vbobuf, bool wf )
     // all elements are opaque
     sf->buffer( s_colour, cs, showData?(facetshading?sf->to_elem(data).data():data):NULL,
  		NULL, vbobuf, facetshading );
-  else if( on_tr && showData && dataopac->dop[wf?SurfEle:Surface].on() ) {
+  else if( on_tr && showData && dataopac->dop[obj].on() ) {
     sf->buffer_opaque(  OPAQUE_LIMIT, s_colour, cs, facetshading?sf->to_elem(data).data():data,
-                                                  dataopac->dop+Surface, vbobuf, facetshading );
+                                       dataopac->dop+obj, vbobuf, facetshading );
   }
   return sf->zl_sz();
 }
@@ -498,12 +498,12 @@ TBmeshWin::draw_sorted_elements( RenderTris &rd, vector<vtx_z> &elems, bool newT
 {
   if( !elems.size() && !rd.opaque() ) return;
 
-  bool showData=datadst&(wf?SurfEdge_flg:Surface_flg) && have_data!=NoData; 
-  const GLfloat *vn=NULL;
-  Surfaces* sf;
-  int prev_s = -1;
+  bool           showData = datadst&(wf?SurfEdge_flg:Surface_flg) && have_data!=NoData; 
+  const GLfloat *vn       = NULL;
+  int            prev_s   = -1;
+  Surfaces      *sf;
 
-  if( REBUFFER_SURF(_redraw_state) || newTransView ) {
+  if( newTransView ) {
     GLfloat *vbobuf = rd.transBuffer();
     GLfloat *scol;
     map<int,vector<GLfloat>> edata;
@@ -518,9 +518,9 @@ TBmeshWin::draw_sorted_elements( RenderTris &rd, vector<vtx_z> &elems, bool newT
       sf->buffer_elem( e.i, scol, cs, showData?(facetshading?edata[e.s].data():data):NULL,
               dataopac->dop+Surface, vbobuf, facetshading );
     }
-  }
-  if(REBUFFER_SURF(_redraw_state) || newTransView)
     rd.update_nodalbuff();
+  }
+
   rd.mesh_render(wf);
 }
 
@@ -1536,10 +1536,6 @@ TBmeshWin::process_hits( Frame &frame )
   frame.pixel_color( x, pixel_h()-1-y, pickedCol.data() );
   int select_vtx = _select.col2i( pickedCol.data() );
 
-  /* cout << "( " << x << ", " << " " << y << " ): " << select_vtx << " [" <<
-      short(pickedCol[0]) << ", " << short(pickedCol[1]) << ", " << short(pickedCol[2]) << ", "
-      << short(pickedCol[3]) << " ]" <<endl; */
-
   if( select_vtx>=0 && select_vtx<model->pt.num() ) {
     highlight( Vertex, select_vtx );
     contwin->verthi->value( select_vtx );
diff --git a/src/TBmeshWin.h b/src/TBmeshWin.h
index c81b606..21dc740 100644
--- a/src/TBmeshWin.h
+++ b/src/TBmeshWin.h
@@ -227,7 +227,7 @@ class TBmeshWin:public Fl_Gl_Tb_Window
     vector<GLuint> hitbuffer;
     bool      process_hits(Frame &);		// determine picked node
     DATA_TYPE* timevec = NULL;
-    unsigned long framenum;			// keep track if a frame is drawn
+    unsigned long framenum=0;			// keep track if a frame is drawn
     bool      dump_vert_list = false;
     DataReaderEnum getReaderType( const char * );
     bool      facetshading = false;	// do not blend over surface elements
-- 
GitLab