diff --git a/src/modules/RevealedCutModule.cpp b/src/modules/RevealedCutModule.cpp index a2cbc28ee23a8069f34ff56db871f804952b8eb0..69d530a7f72f6660ef56f6c245eee8ff8badf882 100644 --- a/src/modules/RevealedCutModule.cpp +++ b/src/modules/RevealedCutModule.cpp @@ -37,6 +37,7 @@ RevealedCutModule::RevealedCutModule(): ShapeModule(), RevealedModule() { m_name="cut"; m_cutWin=NULL; m_updateOnce=false; + m_shapeGeom = Reveal::GEOM_BOX; Reveal::getInstance()->getGeom(Reveal::GEOM_BOX)->registerModule(this); @@ -58,6 +59,7 @@ RevealedCutModule::RevealedCutModule(): ShapeModule(), RevealedModule() { addAttribute(new Attribute("window", Attribute::STRING_ATTRIBUTE, windowCallback, this, 1)); + addAttribute(new Attribute("selection_position", Attribute::INT_ATTRIBUTE, selPosCallback, this, 2)); @@ -72,8 +74,12 @@ RevealedCutModule::RevealedCutModule(): ShapeModule(), RevealedModule() { addTransformationAttributes(); addRevealedAttributes(); addRevealedOutputAttributes(); - m_inside=9; m_localInsideAxes=true; + m_insideDensityAlpha=0; + m_insideGradientAlpha=0; + m_insideTextureAlpha=1.0; + m_insideVisible=true; + m_insideTextureBlend=false; Reveal::getInstance()->addUpdateObserver(this); } @@ -86,16 +92,15 @@ RevealedCutModule::~RevealedCutModule() { void RevealedCutModule::refreshWindows() { CutWindowsManager* winsMan = CutWindowsManager::getInstance(); winsMan->updateWindowsList(); - - vector<string> names; - names.push_back("none"); - vector<CutWindow*>& wins = winsMan->editWindowList(); - vector<CutWindow*>::iterator itWin = wins.begin(); - for(; itWin!=wins.end(); ++itWin) { - names.push_back(((*itWin)->getName()).c_str()); - } - m_attributesMap["window"]->editStringValuesChoices().assign(1,names); - m_attributesMap["window"]->initStrings(vector<string>(1, names[0])); + m_windowNames.clear(); + m_windowNames.push_back("none"); + vector<CutWindow*>& wins = winsMan->editWindowList(); + vector<CutWindow*>::iterator itWin = wins.begin(); + for(; itWin!=wins.end(); ++itWin) { + m_windowNames.push_back(((*itWin)->getName()).c_str()); + } + m_attributesMap["window"]->editStringValuesChoices().assign(1,m_windowNames); + m_attributesMap["window"]->initStrings(vector<string>(1, m_windowNames[0])); } void RevealedCutModule::setWindow(const std::string& winName) { @@ -113,6 +118,7 @@ void RevealedCutModule::setWindow(const std::string& winName) { m_winW=m_cutWin->getWidth(); m_winH=m_cutWin->getHeight(); recomputePixels(); + m_initTex=false; } } @@ -199,14 +205,24 @@ void RevealedCutModule::draw(const int& contextID, glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, - m_nbPixPerRow, m_cutWin->getHeight(), - m_layersNb, 0, - GL_RGBA, GL_UNSIGNED_BYTE, - m_cutWin->grabImage()); + if(!m_initTex) { + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, + m_nbPixPerRow, m_cutWin->getHeight(), + m_layersNb, 0, + GL_BGRA, GL_UNSIGNED_BYTE, + m_cutWin->grabImage()); + m_initTex=true; + } + else { + glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, + m_nbPixPerRow, m_cutWin->getHeight(), m_layersNb, + GL_BGRA, GL_UNSIGNED_BYTE, + m_cutWin->grabImage()); + } m_updateOnceDone=true; } + /* glUniform1i(uniforms[Reveal::COORDSTEX], 4); glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, m_coordsIDMap[contextID]); @@ -220,7 +236,7 @@ void RevealedCutModule::draw(const int& contextID, 0, GL_RG, GL_FLOAT, m_coordImage); m_coordsUpMap[contextID]=false; - } + }*/ } } @@ -341,7 +357,7 @@ void CutWindowsManager::updateWindowsList() { #ifdef LINUX Window *list = getWinList(m_disp, &len); - for(int i=0;i<(int)len;i++) { + for(int i=0; i<(int)len; i++) { char* name = getWinName(m_disp, list[i]); CutWindow* newWin=NULL; if(prevWins.find(string(name))!=prevWins.end()) { @@ -361,13 +377,14 @@ void CutWindowsManager::updateWindowsList() { #ifdef LINUX char* CutWindowsManager::getWinName(Display* disp, Window win) { - Atom prop = XInternAtom(disp,"WM_NAME",false); + Atom prop = XInternAtom(disp,"_NET_WM_NAME",false); + Atom utf8Atom = XInternAtom(disp,"UTF8_STRING",false); Atom type; int form; unsigned long remain, len; unsigned char *list; - if (XGetWindowProperty(disp,win,prop,0,1024,false,XA_STRING, + if (XGetWindowProperty(disp,win,prop,0,65536,false,utf8Atom, &type,&form,&len,&remain,&list) != Success) { cout<<"Error getting window name"<<endl; return NULL; diff --git a/src/modules/RevealedCutModule.hpp b/src/modules/RevealedCutModule.hpp index 86dafd430e73aee9297e7cdae7ad4d19ae12a681..79994c3020295d78c87fbb1fa3bccb62d13250e3 100644 --- a/src/modules/RevealedCutModule.hpp +++ b/src/modules/RevealedCutModule.hpp @@ -87,6 +87,8 @@ class RevealedCutModule : public ShapeModule, public RevealedModule { std::vector<int> m_destIndices; bool m_updateOnce; bool m_updateOnceDone; + std::vector<std::string> m_windowNames; + bool m_initTex; }; class CutWindow { diff --git a/src/shaders/render43.fs b/src/shaders/render43.fs index 2efd3ea30f90d0ac951bd66e35f499e6a39fb472..197e2123b91b58f0b78743fa510a937c45b8947f 100644 --- a/src/shaders/render43.fs +++ b/src/shaders/render43.fs @@ -247,116 +247,126 @@ void main(void) { switch(shapeGeom) { case PATH : { - //use min/max/size of current segment - pixelPos = (subShapeInvMat*vec4(pixelPos,1.0)).xyz; - if(length(vec2(pixelPos.x, pixelPos.y))<=0.5 && (pixelPos.z>-0.5 && pixelPos.z<0.5)) { - float xx = (pixelPos.x)*(pixelPos.x); - float yy = (pixelPos.y)*(pixelPos.y); - float ax = sqrt(0.25-yy); - diffMin.x = pixelPos.x+ax; - diffMax.x = ax-pixelPos.x; - float ay = sqrt(0.25-xx); - diffMin.y = pixelPos.y+ay; - diffMax.y = ay-pixelPos.y; - diffMin.z = pixelPos.z+0.5; - diffMax.z = 0.5-pixelPos.z; - rendered=1; - } - } break; + //use min/max/size of current segment + pixelPos = (subShapeInvMat*vec4(pixelPos,1.0)).xyz; + if(length(vec2(pixelPos.x, pixelPos.y))<=0.5 && (pixelPos.z>-0.5 && pixelPos.z<0.5)) { + float xx = (pixelPos.x)*(pixelPos.x); + float yy = (pixelPos.y)*(pixelPos.y); + float ax = sqrt(0.25-yy); + diffMin.x = pixelPos.x+ax; + diffMax.x = ax-pixelPos.x; + float ay = sqrt(0.25-xx); + diffMin.y = pixelPos.y+ay; + diffMax.y = ay-pixelPos.y; + diffMin.z = pixelPos.z+0.5; + diffMax.z = 0.5-pixelPos.z; + rendered=1; + } + } break; case CONE : { - if(pixelPos.y<0.5 && pixelPos.y>-0.5) { - float xx = (pixelPos.x)*(pixelPos.x); - float yy = (pixelPos.y-0.5)*(pixelPos.y-0.5); - float zz = (pixelPos.z)*(pixelPos.z); - if((xx+zz)/yy<0.25){ - float ax = sqrt(0.25*yy-zz); - diffMin.x = pixelPos.x+ax; - diffMax.x = ax-pixelPos.x; - float ay = sqrt((yy+xx)/0.25); - diffMin.y = pixelPos.y+0.5; - diffMax.y = 0.5-pixelPos.y; - float az = sqrt(0.25*yy-xx); - diffMin.z = pixelPos.z+az; - diffMax.z = az-pixelPos.z; - rendered=1; - } - } - } break; + if(pixelPos.y<0.5 && pixelPos.y>-0.5) { + float xx = (pixelPos.x)*(pixelPos.x); + float yy = (pixelPos.y-0.5)*(pixelPos.y-0.5); + float zz = (pixelPos.z)*(pixelPos.z); + if((xx+zz)/yy<0.25){ + float ax = sqrt(0.25*yy-zz); + diffMin.x = pixelPos.x+ax; + diffMax.x = ax-pixelPos.x; + float ay = sqrt((yy+xx)/0.25); + diffMin.y = pixelPos.y+0.5; + diffMax.y = 0.5-pixelPos.y; + float az = sqrt(0.25*yy-xx); + diffMin.z = pixelPos.z+az; + diffMax.z = az-pixelPos.z; + rendered=1; + } + } + } break; case TUBE : { - if(length(vec2(pixelPos.x, pixelPos.z))<=0.5 && (pixelPos.y>-0.5 && pixelPos.y<0.5)) { - float xx = (pixelPos.x)*(pixelPos.x); - float zz = (pixelPos.z)*(pixelPos.z); - float ax = sqrt(0.25-zz); - diffMin.x = pixelPos.x+ax; - diffMax.x = ax-pixelPos.x; - float az = sqrt(0.25-xx); - diffMin.z = pixelPos.z+az; - diffMax.z = az-pixelPos.z; - diffMin.y = pixelPos.y+0.5; - diffMax.y = 0.5-pixelPos.y; - rendered=1; - } - } break; + if(length(vec2(pixelPos.x, pixelPos.z))<=0.5 && (pixelPos.y>-0.5 && pixelPos.y<0.5)) { + float xx = (pixelPos.x)*(pixelPos.x); + float zz = (pixelPos.z)*(pixelPos.z); + float ax = sqrt(0.25-zz); + diffMin.x = pixelPos.x+ax; + diffMax.x = ax-pixelPos.x; + float az = sqrt(0.25-xx); + diffMin.z = pixelPos.z+az; + diffMax.z = az-pixelPos.z; + diffMin.y = pixelPos.y+0.5; + diffMax.y = 0.5-pixelPos.y; + rendered=1; + } + } break; case SPHERE : { - if(length(pixelPos)<=0.5) { - float xx = (pixelPos.x)*(pixelPos.x); - float yy = (pixelPos.y)*(pixelPos.y); - float zz = (pixelPos.z)*(pixelPos.z); - float ax = sqrt(0.25-yy-zz); - diffMin.x = pixelPos.x+ax; - diffMax.x = ax-pixelPos.x; - float ay = sqrt(0.25-xx-zz); - diffMin.y = pixelPos.y+ay; - diffMax.y = ay-pixelPos.y; - float az = sqrt(0.25-xx-yy); - diffMin.z = pixelPos.z+az; - diffMax.z = az-pixelPos.z; - rendered=1; - } - } break; + if(length(pixelPos)<=0.5) { + float xx = (pixelPos.x)*(pixelPos.x); + float yy = (pixelPos.y)*(pixelPos.y); + float zz = (pixelPos.z)*(pixelPos.z); + float ax = sqrt(0.25-yy-zz); + diffMin.x = pixelPos.x+ax; + diffMax.x = ax-pixelPos.x; + float ay = sqrt(0.25-xx-zz); + diffMin.y = pixelPos.y+ay; + diffMax.y = ay-pixelPos.y; + float az = sqrt(0.25-xx-yy); + diffMin.z = pixelPos.z+az; + diffMax.z = az-pixelPos.z; + rendered=1; + } + } break; case BOX : { - diffMin = pixelPos - vec3(-0.5, -0.5, -0.5); - diffMax = vec3(0.5, 0.5, 0.5) - pixelPos; - if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 && diffMin.z>0 && diffMax.z>0){ - rendered=1; - } - } break; + diffMin = pixelPos - vec3(-0.5, -0.5, -0.5); + diffMax = vec3(0.5, 0.5, 0.5) - pixelPos; + if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 + && diffMin.z>0 && diffMax.z>0){ + rendered=1; + } + } break; case FRAME : { - diffMin = pixelPos - vec3(-0.5, -0.5, -0.5); - diffMax = vec3(0.5, 0.5, 0.5) - pixelPos; - if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 && diffMin.z>0 && diffMax.z>0){ - rendered=1; - } - } break; + diffMin = pixelPos - vec3(-0.5, -0.5, -0.5); + diffMax = vec3(0.5, 0.5, 0.5) - pixelPos; + if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 + && diffMin.z>0 && diffMax.z>0){ + rendered=1; + } + } break; case MODEL : { - ivec2 selSize = textureSize(selectTex, 0); - vec4 sel = texelFetch(selectTex, - ivec2(coordX*float(selSize.x), coordY*float(selSize.y)), 0); - //get front surfaces before depth map - if(pixZ<=cutZ+thickness/1000.0) { - if(sel.z==0) { - if(sel.x==shapeID) { - rendered=1; - } - else if((int(shapeIDBit)&int(sel.w))>0) { - diffMin = pixelPos - vec3(-0.5, -0.5, -0.5); - diffMax = vec3(0.5, 0.5, 0.5) - pixelPos; - if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 && diffMin.z>0 && diffMax.z>0){ - rendered=1; - } - } - } - if(surface>0 && (pixZ>cutZ || (sel.z>0 && (int(shapeIDBit)&int(sel.w))>0))) { - rendered=2; - } - } - } break; + ivec2 selSize = textureSize(selectTex, 0); + vec4 sel = texelFetch(selectTex, + ivec2(coordX*float(selSize.x), coordY*float(selSize.y)), 0); + //get front surfaces before depth map + if(pixZ<=cutZ+thickness/1000.0) { + if(sel.z==0) { + if(sel.x==shapeID) { + rendered=1; + } + else if((int(shapeIDBit)&int(sel.w))>0) { + diffMin = pixelPos - vec3(-0.5, -0.5, -0.5); + diffMax = vec3(0.5, 0.5, 0.5) - pixelPos; + if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 + && diffMax.y>0 && diffMin.z>0 + && diffMax.z>0){ + rendered=1; + } + } + } + if(surface>0 + && (pixZ>cutZ || (sel.z>0 + && (int(shapeIDBit)&int(sel.w))>0))) { + rendered=2; + } + } + } break; } if(rendered>0) { ratioWithinBox = (pixelPos)+0.5; //test if on the surface - if(diffMin.x*modelScale.x<thickness || diffMax.x*modelScale.x<thickness || diffMin.y*modelScale.y<thickness || - diffMax.y*modelScale.y<thickness || diffMin.z*modelScale.z<thickness || diffMax.z*modelScale.z<thickness) { + if(diffMin.x*modelScale.x<thickness + || diffMax.x*modelScale.x<thickness + || diffMin.y*modelScale.y<thickness + || diffMax.y*modelScale.y<thickness + || diffMin.z*modelScale.z<thickness + || diffMax.z*modelScale.z<thickness) { rendered=2; } //extend ratiowithinbox to multiplesubshapes @@ -527,15 +537,24 @@ void main(void) { pixRatio.y = clamp(pixRatio.y, 0.0, 1.0); //compute offset in voxel output int voxOff = outOffset+revVoxels; - voxOff+=5*(int(pixRatio.x*voxelOutSize) + int((1.0-pixRatio.y)*voxelOutSize)*voxelOutSize); + voxOff+=5*(int(pixRatio.x*voxelOutSize) + + int((1.0-pixRatio.y)*voxelOutSize)*voxelOutSize); //accumulate points - imageAtomicAdd(outputTex, ivec2(mod(voxOff,outCols), floor((voxOff)/outCols)), 1); + imageAtomicAdd(outputTex, ivec2(mod(voxOff,outCols), + floor((voxOff)/outCols)), 1); //accumulate coords - imageAtomicAdd(outputTex, ivec2(mod(voxOff+1,outCols), floor((voxOff+1)/outCols)), clamp(int(outRatioWithinBox.x*1000.0),0,1000)); - imageAtomicAdd(outputTex, ivec2(mod(voxOff+2,outCols),floor((voxOff+2)/outCols)), clamp(int(outRatioWithinBox.y*1000.0),0,1000)); - imageAtomicAdd(outputTex, ivec2(mod(voxOff+3,outCols), floor((voxOff+3)/outCols)), clamp(int(outRatioWithinBox.z*1000.0),0,1000)); + imageAtomicAdd(outputTex, ivec2(mod(voxOff+1,outCols), + floor((voxOff+1)/outCols)), + clamp(int(outRatioWithinBox.x*1000.0),0,1000)); + imageAtomicAdd(outputTex, ivec2(mod(voxOff+2,outCols), + floor((voxOff+2)/outCols)), + clamp(int(outRatioWithinBox.y*1000.0),0,1000)); + imageAtomicAdd(outputTex, ivec2(mod(voxOff+3,outCols), + floor((voxOff+3)/outCols)), + clamp(int(outRatioWithinBox.z*1000.0),0,1000)); //accumulate lum - imageAtomicAdd(outputTex, ivec2(mod(voxOff+4,outCols), floor((voxOff+4)/outCols)), + imageAtomicAdd(outputTex, ivec2(mod(voxOff+4,outCols), + floor((voxOff+4)/outCols)), clamp(int(hsv.z*1000.0),0,1000)); } } @@ -546,7 +565,9 @@ void main(void) { finalColor = surfaceColor; if(revSurface>0 && sli.x>=1.0 && depthID<=depthOutNb) { - imageAtomicMax(outputTex, ivec2(mod(outOffset+revSurface,outCols), floor((outOffset+revSurface)/outCols)), 1); + imageAtomicMax(outputTex, + ivec2(mod(outOffset+revSurface,outCols), + floor((outOffset+revSurface)/outCols)), 1); } } }