bool OpenSubdivPtexShader::bindPtexTexture(const MString& ptexFilename, OpenSubdiv::OsdGLPtexTexture **osdPtexPtr, int samplerUnit) { // Reload ptex texture if (*osdPtexPtr) delete *osdPtexPtr; *osdPtexPtr = loadPtex(ptexFilename); if (*osdPtexPtr == NULL) return false; // Rebind glActiveTexture(GL_TEXTURE0 + samplerUnit + 0); glBindTexture(GL_TEXTURE_2D_ARRAY, (*osdPtexPtr)->GetTexelsTexture()); glActiveTexture(GL_TEXTURE0 + samplerUnit + 1); glBindTexture(GL_TEXTURE_BUFFER, (*osdPtexPtr)->GetLayoutTextureBuffer()); glActiveTexture(GL_TEXTURE0 + samplerUnit + 2); glBindTexture(GL_TEXTURE_BUFFER, (*osdPtexPtr)->GetPagesTextureBuffer()); // Reset glActiveTexture(GL_TEXTURE0); return true; }
//=================================================== draw widget //=============================================================== void TFWidgetRen::draw_widget() { glColor4f(.1, .07, .57, 1); //balls float spos[3] = {0,0,0}; drawSphere(spos, blball); //bottom left spos[0] = width; drawSphere(spos, brball); //bottom right spos[1] = height; drawSphere(spos, trball); //top right spos[0] = 0; drawSphere(spos, tlball); //top left glColor4f(.09, .34, .55, 1); //bars float bpos[3] = {0,0,0}; drawBar(-90, WdgXAxis, height, bpos, lbar); //left drawBar(90, WdgYAxis, width, bpos, bbar); //bottom bpos[1] = height; drawBar(90, WdgYAxis, width, bpos, tbar); //top bpos[0] = width; bpos[1] = 0; drawBar(-90, WdgXAxis, height, bpos, rbar); //right glColor4f(1,1,1,0); //transfer function map depth glLoadName(tfsheet1); //glEnable(GL_TEXTURE_3D_EXT); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_LIGHTING); //glBindTexture(GL_TEXTURE_3D_EXT, gluvv.tf.ptextex); glBegin(GL_QUADS);{ //draw the transfer function glTexCoord3f(0, 0, .33333); glVertex3f(barRad*1.5, barRad*1.5, 0); glTexCoord3f(1, 0, .33333); glVertex3f(width-barRad*1.5, barRad*1.5, 0); glTexCoord3f(1, 1, .33333); glVertex3f(width-barRad*1.5, height-barRad*1.5, 0); glTexCoord3f(0, 1, .33333); glVertex3f(barRad*1.5, height-barRad*1.5,0); } glEnd(); glDisable(GL_BLEND); glDisable(GL_TEXTURE_3D_EXT); glEnable(GL_LIGHTING); //--------------------------- draw_probe(); //draw probe data value //-------------- load new pixel texture ---------------------------------- if(gluvv.tf.loadme){ clearPtex(); tris->rasterize(gluvv.tf.ptex); brush->rasterize(gluvv.tf.ptex); loadPtex(); gluvv.tf.loadme = 0; } //---------------------------------------------------------------------- if(pickedTri){ //boundary emphasis slider LevWidget * tt; if(tt = tris->get(pickedTri)){ float slider = tt->getBE(); float bepos[3] = {(width - 2*ballRad)*slider + ballRad, height, 0}; drawSlider(90, WdgYAxis, bepos, beslider); } } glColor4f(1,1,1,1); //transfer function map color glLoadName(tfsheet1); glEnable(GL_TEXTURE_3D_EXT); if(mode == colorBlend){ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_EQUAL); glDisable(GL_LIGHTING); glBindTexture(GL_TEXTURE_3D_EXT, gluvv.tf.ptextex); glBegin(GL_QUADS);{ //draw the transfer function glTexCoord3f(0, 0, .5); glVertex3f(barRad*1.5, barRad*1.5, 0); glTexCoord3f(1, 0, .5); glVertex3f(width-barRad*1.5, barRad*1.5, 0); glTexCoord3f(1, 1, .5); glVertex3f(width-barRad*1.5, height-barRad*1.5, 0); glTexCoord3f(0, 1, .5); glVertex3f(barRad*1.5, height-barRad*1.5,0); } glEnd(); glDepthFunc(GL_LESS); glDisable(GL_BLEND); glDisable(GL_TEXTURE_3D_EXT); glEnable(GL_LIGHTING); //---------------------------- glPushMatrix();{ //draw levoy triangles glTranslatef(ballRad, ballRad, ballRad); tris->draw(); } glPopMatrix(); if(gluvv.picking) brush->draw(); }