//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- cvf::Vec3f RivGridBoxGenerator::cornerDirection(FaceType face1, FaceType face2) { cvf::Vec3f dir = sideNormalOutwards(face1) + sideNormalOutwards(face2); dir.normalize(); return dir; }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RivGridBoxGenerator::updateFromCamera(const cvf::Camera* camera) { m_gridBoxModel->removeAllParts(); if (m_gridBoxFaceParts.size() == 0) return; std::vector<bool> faceVisibility(6, false); for (size_t i = POS_X; i <= NEG_Z; i++) { bool isFaceVisible = false; cvf::Vec3f sideNorm = sideNormalOutwards((FaceType)i); if (camera->projection() == cvf::Camera::PERSPECTIVE) { cvf::Vec3d camToSide = camera->position() - pointOnSide((FaceType)i); camToSide.normalize(); isFaceVisible = sideNorm.dot(cvf::Vec3f(camToSide)) < 0.0; } else { cvf::Vec3d camToSide = camera->direction(); isFaceVisible = sideNorm.dot(cvf::Vec3f(camToSide)) > 0.0; } if (isFaceVisible) { m_gridBoxModel->addPart(m_gridBoxFaceParts[i].p()); faceVisibility[i] = true; } } std::vector<bool> edgeVisibility(12, false); computeEdgeVisibility(faceVisibility, edgeVisibility); CVF_ASSERT(m_gridBoxLegendParts.size() == (NEG_X_NEG_Y + 1)*2); for (size_t i = POS_Z_POS_X; i <= NEG_X_NEG_Y; i++) { if (edgeVisibility[i]) { // We have two parts for each edge - line and text m_gridBoxModel->addPart(m_gridBoxLegendParts[2 * i].p()); m_gridBoxModel->addPart(m_gridBoxLegendParts[2 * i + 1].p()); } } m_gridBoxModel->updateBoundingBoxesRecursive(); }