Example #1
0
	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;
	}
}