45 #include <vtkOpenGLExtensionManager.h>
46 #include <vtkRenderer.h>
47 #include <vtkShaderProgram2.h>
48 #include <vtkShader2.h>
49 #include <vtkShader2Collection.h>
50 #include <vtkUniformVariables.h>
51 #include <vtkObjectFactory.h>
52 #include <vtkOpenGLRenderWindow.h>
56 #include <OpenGL/glu.h>
105 mVolumeBuffer = buffer;
124 mVolumeBuffer->allocate();
126 mLutBuffer->allocate();
131 QString fullName = QString(
"%1[%2]").arg(name).arg(mIndex);
137 QString fullName = QString(
"%1[%2]").arg(name).arg(mIndex);
146 mVolumeBuffer->bind(mIndex);
148 int texture = 2*mIndex;
149 int lut = 2*mIndex+1;
154 mLutBuffer->bind(mIndex);
155 lutsize = mLutBuffer->getLutSize();
158 vtkUniformVariables* uniforms = shader->GetUniformVariables();
172 hasLoadedExtensions(false)
181 QString TextureSlicePainter::loadShaderFile()
183 QString filepath = mShaderPath +
"/cxOverlay2D_frag.glsl";
187 fp.open(QFile::ReadOnly);
188 QTextStream shaderfile(&fp);
189 return shaderfile.readAll();
193 std::cout <<
"TextureSlicer can't read shaderfile [" << fp.fileName() <<
"]" << std::endl;
200 if (this->LastContext)
208 if (this->Shader != 0)
210 this->Shader->ReleaseGraphicsResources();
215 this->LastContext = 0;
216 this->Superclass::ReleaseGraphicsResources(win);
225 this->LastContext = 0;
226 this->Superclass::PrepareForRendering(renderer, actor);
230 GLint oldTextureUnit;
231 glGetIntegerv(GL_ACTIVE_TEXTURE, &oldTextureUnit);
233 vtkRenderWindow* renWin = renderer->GetRenderWindow();
234 if (this->LastContext != renWin)
237 hasLoadedExtensions =
false;
239 this->LastContext = renWin;
241 vtkOpenGLRenderWindow *context = vtkOpenGLRenderWindow::SafeDownCast(renWin);
242 if (!hasLoadedExtensions)
248 hasLoadedExtensions =
true;
251 for (
unsigned i = 0; i < this->mElement.size(); ++i)
252 this->mElement[i].initializeRendering();
257 QString shaderSource = this->loadShaderFile();
258 shaderSource = this->replaceShaderSourceMacros(shaderSource);
262 this->buildProgram(shaderSource, context);
265 glPixelStorei(GL_PACK_ALIGNMENT, 1);
266 glPixelStorei(GL_PACK_ROW_LENGTH, 0);
267 glPixelStorei(GL_PACK_SKIP_ROWS, 0);
268 glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
270 this->Superclass::PrepareForRendering(renderer, actor);
272 glActiveTexture(oldTextureUnit);
275 QString TextureSlicePainter::replaceShaderSourceMacros(QString shaderSource)
278 int layers = this->mElement.size();
279 shaderSource = shaderSource.replace(
"${LAYERS}", QString(
"%1").arg(layers));
282 QString element =
"\tif (index==%1) return texture1D(lut[%1], idx);\n";
283 QString sampleLutContent;
284 for (
unsigned i=0; i<layers; ++i)
285 sampleLutContent += element.arg(i);
286 shaderSource = shaderSource.replace(
"${SAMPLE_LUT_CONTENT}", sampleLutContent);
293 bool forceCompileOnly)
300 GLint oldTextureUnit;
301 glGetIntegerv(GL_ACTIVE_TEXTURE, &oldTextureUnit);
303 int layers = this->mElement.size();
304 this->Shader->GetUniformVariables()->SetUniformi(
"layers", 1, &layers);
306 for (
unsigned i = 0; i < this->mElement.size(); ++i)
308 this->mElement[i].eachRenderInternal(this->Shader);
313 if (!this->Shader->IsValid())
315 vtkErrorMacro(<<
" validation of the program failed: "<< this->Shader->GetLastValidateLog());
318 this->Superclass::RenderInternal(renderer, actor, typeflags, forceCompileOnly);
320 this->Shader->Restore();
322 glActiveTexture(oldTextureUnit);
327 return !this->mElement.empty();
332 bool loaded = mgr->LoadSupportedExtension(
cstring_cast(
id));
334 std::cout <<
"TextureSlicePainter Error: GL extension " +
id +
" not found" << std::endl;
347 this->safeIndex(index).
SetBuffer(buffer);
352 this->safeIndex(index).
SetBuffer(buffer);
370 if ((
int)mElement.size() <= index)
372 mElement.resize(index+1);
375 return mElement[index];
378 void TextureSlicePainter::buildProgram(QString shaderSource, vtkOpenGLRenderWindow* renderWindow)
381 pgm->SetContext(renderWindow);
384 s2->SetType(VTK_SHADER_TYPE_FRAGMENT);
386 s2->SetContext(pgm->GetContext());
387 pgm->GetShaders()->AddItem(s2);
391 if (pgm->GetLastBuildStatus() != VTK_SHADER_PROGRAM2_LINK_SUCCEEDED)
393 vtkErrorMacro(
"Pass Two failed.");
402 if (this->Shader != 0)
404 this->Shader->ReleaseGraphicsResources();
vtkSmartPointer< class vtkShaderProgram2 > vtkShaderProgram2Ptr
bool CanRender(vtkRenderer *, vtkActor *)
void PrintSelf(ostream &os, vtkIndent indent)
void SetLutBuffer(int index, GPUImageLutBufferPtr buffer)
~SingleVolumePainterHelper()
void setUniformiArray(vtkUniformVariables *uniforms, QString name, int val)
void initializeRendering()
void eachRenderInternal(vtkSmartPointer< vtkShaderProgram2 > shader)
void SetColorAttribute(float window, float level, float llr, float alpha)
void ClearGraphicsResources()
cstring_cast_Placeholder cstring_cast(const T &val)
vtkCxxRevisionMacro(TextureSlicePainter,"$Revision: 647 $")
void setShaderPath(QString path)
SingleVolumePainterHelper()
virtual ~TextureSlicePainter()
void releaseGraphicsResources(int index)
virtual void PrepareForRendering(vtkRenderer *, vtkActor *)
static bool LoadRequiredExtension(vtkOpenGLExtensionManager *mgr, QString id)
vtkStandardNewMacro(TextureSlicePainter)
static bool LoadRequiredExtensions(vtkOpenGLExtensionManager *mgr)
void SetVolumeBuffer(int index, GPUImageDataBufferPtr buffer)
void setUniformfArray(vtkUniformVariables *uniforms, QString name, float val)
boost::shared_ptr< class GPUImageDataBuffer > GPUImageDataBufferPtr
void RenderInternal(vtkRenderer *renderer, vtkActor *actor, unsigned long typeflags, bool forceCompileOnly)
boost::shared_ptr< class GPUImageLutBuffer > GPUImageLutBufferPtr
vtkSmartPointer< class vtkShader2 > vtkShader2Ptr
void SetBuffer(GPUImageDataBufferPtr buffer)
void SetColorAttribute(int index, float window, float level, float llr, float alpha)
virtual void ReleaseGraphicsResources(vtkWindow *)
#define report_gl_error()