bool parse_ask(){ int i=0; do{ sock.recv(imsg[i],0); }while(imsg[i++].more()&&i<ASK_SIZE); if (i!=ASK_SIZE){ log_w("ask msg must has %d parts,but actually recv %d part(s)",ASK_SIZE,i); return false; } //check version uint32_t v=*(uint32_t*)imsg[ASK_VERSION].data(); if (v!=VERSION_NO){ log_w("APIs's version(%s) is not compatible with lib's(%s)", v2s(v).c_str(),v2s(VERSION_NO).c_str()); return false; } return true; }
float CVisualImpactCalculatorOSG::Implementation(bool bOneOffMode, GDALRasterBand *pRasterBand, float fScaleFactor, double dXSampleInterval, double dYSampleInterval, bool progress_callback(int)) { if (!m_bInitialised) return 0.0; osgViewer::Viewer *pViewer = vtGetScene()->getViewer(); osgViewer::Viewer::Cameras ActiveCameras; std::vector<CameraMask> NodeMasks; pViewer->getCameras(ActiveCameras, true); // Stop any other cameras rendering the scene for (osgViewer::Viewer::Cameras::iterator itr = ActiveCameras.begin(); itr != ActiveCameras.end(); ++itr) { if (*itr != m_pVisualImpactCamera.get()) { NodeMasks.push_back(CameraMask(*itr, (*itr)->getNodeMask())); (*itr)->setNodeMask(0); } } // Set up the render bins for (VisualImpactContributors::iterator itr = m_VisualImpactContributors.begin(); itr != m_VisualImpactContributors.end(); itr++) (*itr)->getOrCreateStateSet()->setRenderBinDetails(VISUAL_IMPACT_BIN_NUMBER, VISUAL_IMPACT_BIN_NAME); // Pick up the current main scene camera state osg::StateSet* pStateSet = new osg::StateSet(*ActiveCameras[0]->getOrCreateStateSet(), osg::CopyOp::DEEP_COPY_ALL); pStateSet->setAttribute(m_pVisualImpactCamera->getViewport()); m_pVisualImpactCamera->setStateSet(pStateSet); m_pVisualImpactCamera->setClearColor(ActiveCameras[0]->getClearColor()); // Enable the visual impact camera m_pVisualImpactCamera->setNodeMask(0xffffffff); if (bOneOffMode) { m_pVisualImpactCamera->setViewMatrix(m_ViewMatrix); pViewer->frame(); // Disable the visual impact camera m_pVisualImpactCamera->setNodeMask(0); for(std::vector<CameraMask>::iterator itr = NodeMasks.begin(); itr != NodeMasks.end(); ++itr) itr->m_pCamera->setNodeMask(itr->m_NodeMask); for (VisualImpactContributors::iterator itr = m_VisualImpactContributors.begin(); itr != m_VisualImpactContributors.end(); itr++) { osg::StateSet *pStateSet = (*itr)->getOrCreateStateSet(); pStateSet->setRenderBinMode(osg::StateSet::INHERIT_RENDERBIN_DETAILS); pStateSet->setRenderingHint(osg::StateSet::DEFAULT_BIN); } return InnerImplementation(); } else { DPoint2 CameraOrigin; DPoint2 CurrentCamera; vtHeightField3d *pHeightField = vtGetTS()->GetCurrentTerrain()->GetHeightField(); DRECT EarthExtents = pHeightField->GetEarthExtents(); CameraOrigin.x = EarthExtents.left; CameraOrigin.y = EarthExtents.bottom; int iCurrentY = 0; int iXsize = (int)((EarthExtents.right - EarthExtents.left)/dXSampleInterval); int iYsize = (int)((EarthExtents.top - EarthExtents.bottom)/dYSampleInterval); int iTotalProgress = iXsize * iYsize; #ifdef _DEBUG int iBlockSizeX, iBlockSizeY; pRasterBand->GetBlockSize(&iBlockSizeX, &iBlockSizeY); #endif for (CurrentCamera.y = CameraOrigin.y; CurrentCamera.y < EarthExtents.top; CurrentCamera.y += dYSampleInterval) { // Process horizontal scanline int iCurrentX = 0; for (CurrentCamera.x = CameraOrigin.x; CurrentCamera.x < EarthExtents.right; CurrentCamera.x += dXSampleInterval) { FPoint3 CameraTranslate; pHeightField->ConvertEarthToSurfacePoint(CurrentCamera, CameraTranslate); m_pVisualImpactCamera->setViewMatrixAsLookAt(v2s(CameraTranslate), v2s(m_Target), osg::Vec3(0.0, 1.0, 0.0)); pViewer->frame(); float fFactor = InnerImplementation(); pRasterBand->RasterIO(GF_Write, iCurrentX, iYsize - iCurrentY - 1, 1, 1, &fFactor, 1, 1, GDT_Float32, 0, 0); iCurrentX++; if ((*progress_callback)(100 * (iCurrentY * iXsize + iCurrentX) / iTotalProgress)) { // Disable the visual impact camera m_pVisualImpactCamera->setNodeMask(0); for(std::vector<CameraMask>::iterator itr = NodeMasks.begin(); itr != NodeMasks.end(); ++itr) itr->m_pCamera->setNodeMask(itr->m_NodeMask); for (VisualImpactContributors::iterator itr = m_VisualImpactContributors.begin(); itr != m_VisualImpactContributors.end(); itr++) { osg::StateSet *pStateSet = (*itr)->getOrCreateStateSet(); pStateSet->setRenderBinMode(osg::StateSet::INHERIT_RENDERBIN_DETAILS); pStateSet->setRenderingHint(osg::StateSet::DEFAULT_BIN); } VTLOG("CVisualImpactCalculatorOSG::Implementation - Cancelled by user\n"); return -1.0f; } } iCurrentY++; } // Disable the visual impact camera m_pVisualImpactCamera->setNodeMask(0); for(std::vector<CameraMask>::iterator itr = NodeMasks.begin(); itr != NodeMasks.end(); ++itr) itr->m_pCamera->setNodeMask(itr->m_NodeMask); for (VisualImpactContributors::iterator itr = m_VisualImpactContributors.begin(); itr != m_VisualImpactContributors.end(); itr++) { osg::StateSet *pStateSet = (*itr)->getOrCreateStateSet(); pStateSet->setRenderBinMode(osg::StateSet::INHERIT_RENDERBIN_DETAILS); pStateSet->setRenderingHint(osg::StateSet::DEFAULT_BIN); } return 0.0f; } }