コード例 #1
0
void CubeMeshProxyGeometry::process() {
    tgtAssert(inport_.getData(), "no input volume");

    // adapt clipping plane properties on volume change
    if (inport_.hasChanged()) {
        adjustClipPropertiesRanges();
    }

    const VolumeHandleBase* inputVolume = inport_.getData();
    tgt::vec3 volumeSize = inputVolume->getCubeSize();

     // vertex and tex coords of bounding box without clipping
    tgt::vec3 coordLlf = inputVolume->getLLF();
    tgt::vec3 coordUrb = inputVolume->getURB();
    const tgt::vec3 noClippingTexLlf(0, 0, 0);
    const tgt::vec3 noClippingTexUrb(1, 1, 1);

    tgt::vec3 texLlf;
    tgt::vec3 texUrb;
    if (enableClipping_.get()) {
        tgt::ivec3 orgDims = inputVolume->getOriginalDimensions();
        // adjust vertex and tex coords to clipping
        texLlf = tgt::vec3(
            clipRight_.get()  / static_cast<float>(orgDims.x),
            clipFront_.get()  / static_cast<float>(orgDims.y),
            clipBottom_.get() / static_cast<float>(orgDims.z));
        texUrb = tgt::vec3(
            (clipLeft_.get()+1.0f) / static_cast<float>(orgDims.x),
            (clipBack_.get()+1.0f) / static_cast<float>(orgDims.y),
            (clipTop_.get()+1.0f)  / static_cast<float>(orgDims.z));

        // calculate original offset and clip volume
        tgt::vec3 orgDimSpac = static_cast<tgt::vec3>(orgDims)*inputVolume->getSpacing();
        tgt::vec3 orgOffset = orgDimSpac / tgt::max(orgDimSpac); 
        tgt::vec3 coordLlfOrg = (texLlf*(2.f*orgOffset))-orgOffset;
        tgt::vec3 coordUrbOrg = (texUrb*(2.f*orgOffset))-orgOffset;
        tgt::vec3 coordSize = coordUrb-coordLlf;

        // calculate correct volume coordinates [-1, 1]
        coordLlf = tgt::min(tgt::max(coordLlfOrg, coordLlf), coordUrb);
        coordUrb = tgt::max(tgt::min(coordUrbOrg, coordUrb), coordLlf);

        // calculate correct texture coordinates [0, 1]
        texLlf = (coordLlf-inputVolume->getLLF())/(coordSize);
        texUrb = tgt::vec3(1.f)-(inputVolume->getURB()-coordUrb)/(coordSize);
    }
    else {
        texLlf = noClippingTexLlf;
        texUrb = noClippingTexUrb;
    }

    // create output mesh
    MeshListGeometry* geometry = new MeshListGeometry();
    geometry->addMesh(MeshGeometry::createCube(coordLlf, coordUrb, texLlf, texUrb, texLlf, texUrb));
    geometry->transform(inputVolume->getPhysicalToWorldMatrix());

    outport_.setData(geometry);
}
コード例 #2
0
void CubeMeshProxyGeometry::process() {
    tgtAssert(inport_.getData()->getVolume(), "no input volume");

    // adapt clipping plane properties on volume change
    if (inport_.hasChanged()) {
        adjustClipPropertiesRanges();
    }

    Volume* inputVolume = inport_.getData()->getVolume();
    tgt::vec3 volumeSize = inputVolume->getCubeSize();
    tgt::ivec3 numSlices = inputVolume->getDimensions();

    // vertex and tex coords of bounding box without clipping
    tgt::vec3 coordLlf = inputVolume->getLLF();
    tgt::vec3 coordUrb = inputVolume->getURB();
    const tgt::vec3 noClippingTexLlf(0, 0, 0);
    const tgt::vec3 noClippingTexUrb(1, 1, 1);

    tgt::vec3 texLlf;
    tgt::vec3 texUrb;
    if (enableClipping_.get()) {
        // adjust vertex and tex coords to clipping
        texLlf = tgt::vec3(
            clipRight_.get()  / static_cast<float>(numSlices.x),
            clipFront_.get()  / static_cast<float>(numSlices.y),
            clipBottom_.get() / static_cast<float>(numSlices.z));
        texUrb = tgt::vec3(
            (clipLeft_.get()+1.0f) / static_cast<float>(numSlices.x),
            (clipBack_.get()+1.0f) / static_cast<float>(numSlices.y),
            (clipTop_.get()+1.0f)  / static_cast<float>(numSlices.z));

        coordLlf -= volumeSize * (noClippingTexLlf - texLlf);
        coordUrb -= volumeSize * (noClippingTexUrb - texUrb);
    }
    else {
        texLlf = noClippingTexLlf;
        texUrb = noClippingTexUrb;
    }

    // create output mesh
    geometry_->clear();
    geometry_->addMesh(MeshGeometry::createCube(coordLlf, coordUrb, texLlf, texUrb, texLlf, texUrb));
    geometry_->transform(inputVolume->getTransformation());

    outport_.setData(geometry_);
}