void CAddCameraController::onLMouseUp(int x, int y)
{
	IView *pView = getIView();
	ICameraSceneNode *cam = pView->getSceneMgr()->getActiveCamera();
		
	// get position
	core::vector3df hit;
	bool b = getPickPosition( &hit );
	
	if ( b )
	{
		core::vector3df camPos = cam->getAbsolutePosition();		
		core::line3df camRay( camPos, hit );

		if ( camRay.getLength() < 5000 )
		{
			CGameCamera *pObj =	pView->getCurrentZone()->createCamera();
			
			pObj->setPosition( hit );
			pObj->setVisible( true );

			// add history
			CHistoryManager::getInstance()->beginHistory();
			CHistoryManager::getInstance()->addHistoryCreateObj( pObj );
			CHistoryManager::getInstance()->endHistory();

		}
		else
			pView->alertError( L"Can not create object because is too far" );
	}
	else
		pView->alertError( L"Can not create object because is too far" );
}
bool CBaseAddController::getPickPosition( core::vector3df *pos )
{
	IView *pView = getIView();

	// move object
	core::line3df	ray = pView->getSelectRay();

	// check hit on terrain
	CDocument *pDoc = (CDocument*) pView->getDocument();
	ArrayZone* zones = pDoc->getAllZone();
	
	ArrayZoneIter i = zones->begin(), end = zones->end();
	while ( i != end )
	{
		core::vector3df		colPoint;
		core::triangle3df	colTri;
		float maxDistance = ray.getLengthSQ();

		if ( (*i)->getTerrainCollision( ray, maxDistance, colPoint, colTri ) == true )
		{
			*pos = colPoint;
			return true;
		}
		i++;
	}

	core::plane3df	plane( core::vector3df(0.0f, 0.0f, 0.0f), core::vector3df(0.0f, 1.0f, 0.0f) );
	
	// get position
	core::vector3df hit;
	bool b = plane.getIntersectionWithLine( ray.start, ray.getVector(), hit );
	
	if ( b )
	{
		ICameraSceneNode *cam = pView->getSceneMgr()->getActiveCamera();

		core::vector3df camPos = cam->getAbsolutePosition();		
		core::line3df camRay( camPos, hit );

		if ( camRay.getLength() < 5000 )
		{
			*pos = hit;
			return true;
		}
	}

	return false;
}
void CAddWaypointController::onLMouseUp	(int x, int y)
{
	IView *pView = getIView();
	ICameraSceneNode *cam = pView->getSceneMgr()->getActiveCamera();
		
	// get position
	core::vector3df hit;
	bool b = getPickPosition( &hit );
	
	if ( b )
	{
		core::vector3df camPos = cam->getAbsolutePosition();		
		core::line3df camRay( camPos, hit );

		if ( camRay.getLength() < 5000 )
		{
			CWayPoint *pObj =	pView->getCurrentZone()->createWaypoint();
			
			pObj->setPosition( hit );
			pObj->setVisible( true );

			// add history
			CHistoryManager* pHistory = CHistoryManager::createGetInstance();
			pHistory->beginHistory();
			pHistory->addHistoryCreateObj( pObj );

			if ( m_connect )
			{
				pHistory->addHistoryBeginModifyObj( m_connect );
				m_connect->setNext( pObj );
				pHistory->addHistoryEndModifyObj( m_connect );
				
				pHistory->addHistoryBeginModifyObj( pObj );
				pObj->setBack( m_connect );
				pHistory->addHistoryEndModifyObj( pObj );
			}
									
			pHistory->endHistory();

			m_connect = pObj;
		}
		else
			pView->alertError( L"Can not create object because is too far" );
	}
	else
		pView->alertError( L"Can not create object because is too far" );
}
void ossimPpjFrameSensor::worldToLineSample(const ossimGpt& world_point,
                                             ossimDpt&       image_point) const
{   
   ossimGpt wpt = world_point;
   if(wpt.isHgtNan())
   {
      wpt.height(m_averageProjectedHeight);
   }
   ossimEcefPoint gnd_ecf(wpt);
   ossimEcefPoint cam_ecf(m_adjustedCameraPosition);
   ossimEcefVector ecfRay(gnd_ecf - cam_ecf);
   ossimColumnVector3d camRay(m_ecef2Cam*ecfRay.data());   
      
   double x = m_principalPoint.x + m_adjustedFocalLength*camRay[0]/camRay[2];
   double y = m_principalPoint.y + m_adjustedFocalLength*camRay[1]/camRay[2];

   ossimDpt p(x, y);
    
   image_point = p;
}