diff --git a/src/Surfaces.cc b/src/Surfaces.cc index 4fd533e5044d261614f1859ef9efd06602da0999..93aac91305c26cd7b0ef88b0e9da1b716cd82e0c 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 9245bddda4d71169368b3c3c80a9a7335c8d3cc0..77633c5698dffe371cbc0996fc76b8943d4f99f2 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 c81b606ec6e4a70497b3b7bdbabc99ed01fac304..21dc740afed05089ca92352f82424813a804e567 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