Esempio n. 1
0
void VolumeDecomposer::process() {

    if (inport_.hasChanged())
        adjustToInputVolume();

    if (inport_.isReady()) {
        decomposeVolume();
        tgtAssert(sliceSequence_, "No slice sequence");
    }
    else {
        clearSliceSequence();
    }

    outport_.setData(sliceSequence_, false);
    outport_.invalidate();
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
void VolumeDecomposer::deinitialize() throw (tgt::Exception) {
    clearSliceSequence();
    delete sliceSequence_;

    RenderProcessor::deinitialize();
}