void SoOrthoSlice::rayPick(SoRayPickAction * action) { if (!this->shouldRayPick(action)) return; SoState * state = action->getState(); if (!PRIVATE(this)->confirmValidInContext(state)) { return; } const CvrVoxelBlockElement * vbelem = CvrVoxelBlockElement::getInstance(state); if (vbelem == NULL) { return; } this->computeObjectSpaceRay(action); const SbLine & ray = action->getLine(); const SbPlane sliceplane = PRIVATE(this)->getSliceAsPlane(action); SbVec3f intersection; if (sliceplane.intersect(ray, intersection) && // returns FALSE if parallel action->isBetweenPlanes(intersection)) { SbVec3s ijk = vbelem->objectCoordsToIJK(intersection); const SbVec3s & voxcubedims = vbelem->getVoxelCubeDimensions(); const SbBox3s voxcubebounds(SbVec3s(0, 0, 0), voxcubedims - SbVec3s(1, 1, 1)); if (voxcubebounds.intersect(ijk)) { SoPickedPoint * pp = action->addIntersection(intersection); // if NULL, something else is obstructing the view to the // volume, the app programmer only want the nearest, and we // don't need to continue our intersection tests if (pp == NULL) return; pp->setObjectNormal(sliceplane.getNormal()); SoOrthoSliceDetail * detail = new SoOrthoSliceDetail; pp->setDetail(detail, this); detail->objectcoords = intersection; detail->ijkcoords = ijk; detail->voxelvalue = vbelem->getVoxelValue(ijk); if (CvrUtil::useFlippedYAxis()) { static SbBool flag = FALSE; if (!flag) { SoDebugError::postWarning("SoOrthoSlice::rayPick", "RayPick'ing will not be correct for SoOrthoSlice when the " "obsolete CVR_USE_FLIPPED_Y_AXIS envvar is active."); flag = TRUE; } } } } // Common clipping plane handling. SoOrthoSlice::doAction(action); }
Base::Vector3f ViewVolumeProjection::inverse (const Base::Vector3f &pt) const { #if 1 SbVec3f pt3d(2.0f*pt.x-1.0f, 2.0f*pt.y-1.0f, 2.0f*pt.z-1.0f); viewVolume.getMatrix().inverse().multVecMatrix(pt3d, pt3d); #elif 1 SbLine line; SbVec3f pt3d; SbPlane distPlane = viewVolume.getPlane(viewVolume.getNearDist()); viewVolume.projectPointToLine(SbVec2f(pt.x,pt.x), line); distPlane.intersect(line, pt3d); #else SbVec3f pt3d = viewVolume.getPlanePoint(viewVolume.getNearDist(), SbVec2f(pt.x,pt.y)); #endif return Base::Vector3f(pt3d[0],pt3d[1],pt3d[2]); }
void SoXipDicomExaminer::rayPick( SoRayPickAction* action ) { // Set the Dicom Element setElement( action ); action->getState()->push(); action->traverse( getCamera() ); action->setObjectSpace(); const SbViewVolume& viewVolume = getCamera()->getViewVolume(); const SbLine& line = action->getLine(); // Intersect the focal plane with the picking ray SbPlane plane = viewVolume.getPlane(-0.0001f); SbVec3f intersection; if( plane.intersect( line, intersection ) ) action->addIntersection( intersection ); action->getState()->pop(); SoXipKit::rayPick( action ); }