void checkImagesEqual(vtkImageDataPtr input1, vtkImageDataPtr input2) { REQUIRE(input1.Get()!=(vtkImageData*)NULL); REQUIRE(input2.Get()!=(vtkImageData*)NULL); REQUIRE(input1->GetDataDimension() == input2->GetDataDimension()); REQUIRE(input1->GetScalarType() == input2->GetScalarType()); REQUIRE(input1->GetNumberOfScalarComponents() == input2->GetNumberOfScalarComponents()); REQUIRE(Eigen::Array3i(input1->GetDimensions()).isApprox(Eigen::Array3i(input2->GetDimensions()))); CHECK(Eigen::Array3d(input1->GetSpacing()).isApprox(Eigen::Array3d(input2->GetSpacing()), 1.0E-2)); CHECK(Eigen::Array3d(input1->GetOrigin()).isApprox(Eigen::Array3d(input2->GetOrigin()))); // check spacing, dim, type, origin vtkImageMathematicsPtr diff = vtkImageMathematicsPtr::New(); diff->SetOperationToSubtract(); diff->SetInput1Data(input1); diff->SetInput2Data(input2); diff->Update(); vtkImageAccumulatePtr histogram = vtkImageAccumulatePtr::New(); histogram->SetInputData(0, diff->GetOutput()); histogram->Update(); Eigen::Array3d histogramRange = Eigen::Array3d(histogram->GetMax()) - Eigen::Array3d(histogram->GetMin()); for (int i=0; i<input1->GetNumberOfScalarComponents(); ++i) { CHECK(histogramRange[i] < 0.01); CHECK(histogramRange[i] > -0.01); } }
virtual void updateTexture() { if (mMTime == mTexture->GetMTime()) { return; } mMTime = mTexture->GetMTime(); //vtkgl::ActiveTexture(getGLTextureForVolume(textureUnitIndex)); //TODO is this OK? GLenum size,internalType; boost::uint32_t dimx = mTexture ->GetDimensions( )[0]; boost::uint32_t dimy = mTexture ->GetDimensions( )[1]; boost::uint32_t dimz = mTexture ->GetDimensions( )[2]; mMemorySize = dimx * dimy * dimz; glEnable( GL_TEXTURE_3D ); glBindTexture(GL_TEXTURE_3D, textureId); report_gl_error(); glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP ); glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP ); glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP ); glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); switch (mTexture->GetScalarType()) { case VTK_UNSIGNED_CHAR: { size = GL_UNSIGNED_BYTE; internalType = GL_LUMINANCE; } break; //8UI_EXT; break; case VTK_UNSIGNED_SHORT: { size = GL_UNSIGNED_SHORT; internalType = GL_LUMINANCE16; mMemorySize *= 2; } break; //16UI_EXT; break; default: size = 0; internalType = 0; std::cout << "Bit size not supported!" << std::endl; QString dataType(mTexture->GetScalarTypeAsString()); CX_LOG_ERROR() << QString("Attempt to update 3D GL texture from type %1 failed. Only unsigned types supported").arg(dataType); break; } if (mTexture->GetNumberOfScalarComponents()==1) { void* data = mTexture->GetPointData()->GetScalars()->GetVoidPointer(0); glTexImage3D(GL_TEXTURE_3D, 0, internalType, dimx, dimy, dimz, 0, GL_LUMINANCE, size, data); } else if (mTexture->GetNumberOfScalarComponents()==3) { internalType = GL_RGB; void* data = mTexture->GetPointData()->GetScalars()->GetVoidPointer(0); glTexImage3D(GL_TEXTURE_3D, 0, internalType, dimx, dimy, dimz, 0, GL_RGB, size, data); mMemorySize *= 3; } else { std::cout << "unsupported number of image components" << std::endl; } glDisable(GL_TEXTURE_3D); report_gl_error(); }