void WorldPinsScaleController::GetScreenLocation(const WorldPinItemModel& worldPinItemModel, Eegeo::v2& screenLocation, const Eegeo::Camera::RenderCamera& renderCamera) const { Eegeo::dv3 ecefLocation; m_worldPinsService.GetPinEcefAndScreenLocations(worldPinItemModel, ecefLocation, screenLocation); Eegeo::v3 cameraLocal = (ecefLocation - renderCamera.GetEcefLocation()).ToSingle(); Eegeo::v3 screenPos; renderCamera.Project(cameraLocal, screenPos); screenLocation.Set(screenPos.GetX(), screenPos.GetY()); }
float CompassModel::GetHeadingRadians() const { const Eegeo::Camera::RenderCamera renderCamera = m_cameraController.GetRenderCamera(); const Eegeo::m44& cameraModelMatrix = renderCamera.GetModelMatrix(); const Eegeo::v3& viewDirection = cameraModelMatrix.GetRow(2); Eegeo::v3 ecefUp = renderCamera.GetEcefLocation().ToSingle().Norm(); const float epsilon = 0.001f; Eegeo::v3 heading; if (Eegeo::Math::Abs(Eegeo::v3::Dot(viewDirection, ecefUp)) > (1.f - epsilon)) { const Eegeo::v3& viewUp = cameraModelMatrix.GetRow(1); heading = viewUp; } else { heading = viewDirection; } return Eegeo::Camera::CameraHelpers::GetAbsoluteBearingRadians(renderCamera.GetEcefLocation(), heading); }
void WorldPinsInFocusController::Update(float deltaSeconds, const Eegeo::dv3& ecefInterestPoint, const Eegeo::Camera::RenderCamera& renderCamera) { const IWorldPinsInFocusModel* pClosest = NULL; double minDistanceSq = std::numeric_limits<double>::max(); Eegeo::v2 closestScreenPinLocation; Eegeo::v2 screenInterestPoint = ProjectEcefToScreen(ecefInterestPoint, renderCamera); if(m_focusEnabled) { for(size_t i = 0; i < m_worldPinsRepository.GetItemCount(); ++i) { ExampleApp::WorldPins::SdkModel::WorldPinItemModel* worldPinItemModel = m_worldPinsRepository.GetItemAtIndex(i); if (!worldPinItemModel->IsFocusable()) { continue; } Eegeo::dv3 ecefPinLocation; Eegeo::v2 screenPinLocation; m_worldPinsService.GetPinEcefAndScreenLocations(*worldPinItemModel, ecefPinLocation, screenPinLocation); Eegeo::v3 cameraLocal = (ecefPinLocation - renderCamera.GetEcefLocation()).ToSingle(); Eegeo::v3 cameraSurfaceNormal = cameraLocal.Norm(); Eegeo::v3 upNormal = ecefPinLocation.Norm().ToSingle(); float dp = Eegeo::v3::Dot(cameraSurfaceNormal, upNormal); if(dp > 0.0f) { continue; } screenPinLocation = ProjectEcefToScreen(ecefPinLocation, renderCamera); double distanceToFocusSq = (screenInterestPoint - screenPinLocation).LengthSq(); if(distanceToFocusSq < minDistanceSq && worldPinItemModel->IsVisible()) { pClosest = &worldPinItemModel->GetInFocusModel(); minDistanceSq = distanceToFocusSq; closestScreenPinLocation = screenPinLocation; } } } if(m_pLastFocussedModel != pClosest) { m_pLastFocussedModel = pClosest; if(m_pLastFocussedModel != NULL) { m_messageBus.Publish(WorldPinGainedFocusMessage(WorldPinsInFocusModel(m_pLastFocussedModel->GetPinId(), m_pLastFocussedModel->GetTitle(), m_pLastFocussedModel->GetSubtitle(), m_pLastFocussedModel->GetVendor(), m_pLastFocussedModel->GetJsonData(), m_pLastFocussedModel->GetRatingsImage(), m_pLastFocussedModel->GetReviewCount()), closestScreenPinLocation)); } else { m_messageBus.Publish(WorldPinLostFocusMessage()); } } else { if(m_pLastFocussedModel != NULL) { m_messageBus.Publish(WorldPinInFocusChangedLocationMessage(closestScreenPinLocation)); } } }