--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/src/Manager.cpp Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,145 @@
+/*
+ * Name : Manager.cpp
+ * Description :
+ * Project : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0 which accompanies this
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Manager.h"
+
+#include <e32math.h>
+
+#include "Logger.h"
+
+CManager* CManager::NewL()
+{
+ CManager* self = new(ELeave) CManager;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+
+ return self;
+}
+
+CManager::~CManager()
+{
+ iObjectList.ResetAndDestroy();
+ iObjectList.Close();
+
+ iProviderList.ResetAndDestroy();
+ iProviderList.Close();
+}
+
+CManager::CManager()
+{}
+
+void CManager::ConstructL()
+{
+ _LIT8(KUri, "");
+
+ _LIT8(KLMXProvider, "lmx");
+ OpenMAR::CPOIProvider* lmx = OpenMAR::CPOIProvider::NewL(KLMXProvider, KUri);
+ lmx->SetObserver(this);
+ iProviderList.AppendL(lmx);
+
+ _LIT8(KGeonamesProvider, "geonames");
+ OpenMAR::CPOIProvider* geonames = OpenMAR::CPOIProvider::NewL(KGeonamesProvider, KUri);
+ geonames->SetObserver(this);
+ iProviderList.AppendL(geonames);
+}
+
+void CManager::POIProviderLoadedL(OpenMAR::CPOIProvider* aProvider, TInt aError)
+{
+ LOGARG("Landmark resource %x loaded with error %d", aProvider, aError);
+
+ // Handle error in some way
+}
+
+void CManager::POIObjectCreatedL(OpenMAR::CPOIObject* aPOIObject)
+{
+ CleanupStack::PushL(aPOIObject);
+
+ // Check if this POI already exists
+ TInt index = iObjectList.Find(aPOIObject, OpenMAR::CPOIObject::IdentityRelation);
+
+ if (index == KErrNotFound)
+ {
+ // Set world position
+ TCoordinate coordinate = aPOIObject->GetCoordinate();
+ aPOIObject->SetPosition(Transform(coordinate));
+
+ LOGARG("Appending new POI (%d)", aPOIObject->GetIdentifier());
+
+ iObjectList.AppendL(aPOIObject);
+
+ CleanupStack::Pop(aPOIObject);
+ }
+ else
+ {
+ LOGARG("POI already exists (%d). Destroying..", aPOIObject->GetIdentifier());
+
+ CleanupStack::PopAndDestroy(aPOIObject);
+ }
+}
+
+void CManager::POIObjectUpdatedL(OpenMAR::CPOIObject* aPOIObject)
+{}
+
+/**
+ * @brief Transform between WGS84 to Euclidean space
+ *
+ * Our Euclidean space will be determined by:
+ * +X : tangential to the ground and pointing to the EAST
+ * +Y : tangential to the ground and pointing to the NORTH
+ * +Z : perpendicular to the ground (pointing to the sky)
+ */
+const Vector3d CManager::Transform(const TCoordinate& aCoordinate)
+{
+ TReal32 distance = 0;
+ iOrigin.Distance(aCoordinate, distance);
+
+ TReal32 bearing = 0;
+ iOrigin.BearingTo(aCoordinate, bearing);
+
+ TReal32 angle = bearing * KDegToRad;
+
+ TReal cos = 0;
+ TReal sin = 0;
+ Math::Cos(cos, angle);
+ Math::Sin(sin, angle);
+
+ // X = sin(bearing) * d = cos(90 - bearing) * d = sin(bearing) * d
+ // Y = cos(bearing) * d = sin(90 - bearing) * d = cos(bearing) * d
+
+ TReal x = sin * distance;
+ TReal y = cos * distance;
+ TReal z = aCoordinate.Altitude();
+
+ return Vector3d(x, y, z);
+}
+
+void CManager::SetOrigin(const TCoordinate& aCoordinate)
+{
+ iOrigin = aCoordinate;
+}
+
+void CManager::RequestL(const TCoordinate& aCoordinate)
+{
+ const TReal32 radius = 3000;
+
+ for (TInt i = 0; i < iProviderList.Count(); ++i)
+ iProviderList[i]->RetrieveL(aCoordinate, radius);
+}
+
+void CManager::Render() const
+{
+ for (TInt i = 0; i < iObjectList.Count(); ++i)
+ iObjectList[i]->Render();
+}