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); }
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_); }