void VolumeDecomposer::process() { if (inport_.hasChanged()) adjustToInputVolume(); if (inport_.isReady()) { decomposeVolume(); tgtAssert(sliceSequence_, "No slice sequence"); } else { clearSliceSequence(); } outport_.setData(sliceSequence_, false); outport_.invalidate(); }
void VolumeDecomposer::decomposeVolume() { tgtAssert(sliceSequence_, "No slice sequence"); clearSliceSequence(); if (startSlice_.get() > endSlice_.get()) { tgtAssert(false, "Start slice greater than end slice"); LERROR("Start slice greater than end slice"); return; } const VolumeHandleBase* volumeHandle = inport_.getData(); tgtAssert(volumeHandle, "No volume handle"); const Volume* volume = volumeHandle->getRepresentation<Volume>(); tgtAssert(volume, "No volume"); //std::string volFilepath = volumeHandle->getOrigin().getPath(); float scalingFactor; if (volume->getBitsStored() == 8) scalingFactor = 1.f; else if (volume->getBitsStored() == 16) scalingFactor = 1.f; else if (volume->getBitsStored() == 12) scalingFactor = 256.f; else { LWARNING("Only 8,12 and 16 bit intensity volumes supported"); return; } tgt::svec3 sliceDims(volume->getDimensions().x, volume->getDimensions().y, 1); size_t zStart = startSlice_.get(); size_t zEnd = std::min(static_cast<size_t>(endSlice_.get()), volume->getDimensions().z-1); for (size_t z=zStart; z<=zEnd; ++z) { tgt::Texture* slice = new tgt::Texture(sliceDims, GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT, tgt::Texture::LINEAR); for (int x=0; x<slice->getWidth(); ++x) { for (int y=0; y<slice->getHeight(); ++y) { float intensity = volume->getVoxelFloat(x,y,z) * scalingFactor; slice->texel<float>(x,y) = intensity; } } slice->uploadTexture(); //slice->setName(volFilepath); sliceSequence_->add(slice); } LGL_ERROR; }
void VolumeDecomposer::decomposeVolume() { tgtAssert(sliceSequence_, "No slice sequence"); clearSliceSequence(); if (startSlice_.get() > endSlice_.get()) { tgtAssert(false, "Start slice greater than end slice"); LERROR("Start slice greater than end slice"); return; } const VolumeBase* volumeHandle = inport_.getData(); tgtAssert(volumeHandle, "No volume handle"); const VolumeRAM* volume = volumeHandle->getRepresentation<VolumeRAM>(); tgtAssert(volume, "No volume"); //std::string volFilepath = volumeHandle->getOrigin().getPath(); tgt::svec3 sliceDims(volume->getDimensions().x, volume->getDimensions().y, 1); size_t zStart = startSlice_.get(); size_t zEnd = std::min(static_cast<size_t>(endSlice_.get()), volume->getDimensions().z-1); setProgress(0.f); for (size_t z=zStart; z<=zEnd; ++z) { setProgress(static_cast<float>(z-zStart) / static_cast<float>(zEnd-zStart+1)); tgt::Texture* slice = new tgt::Texture(sliceDims, GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT, tgt::Texture::LINEAR); for (int x=0; x<slice->getWidth(); ++x) { for (int y=0; y<slice->getHeight(); ++y) { float intensity = volume->getVoxelNormalized(x,y,z); slice->texel<float>(x,y) = intensity; } } slice->uploadTexture(); //slice->setName(volFilepath); sliceSequence_->add(slice); } setProgress(1.f); LGL_ERROR; }
void VolumeDecomposer::deinitialize() throw (tgt::Exception) { clearSliceSequence(); delete sliceSequence_; RenderProcessor::deinitialize(); }