Route* RouteSimulationAnimationExample::BuildRoute()
{
    const float halfWidth = 5.f;
    
    // 0.00185 is a factor that works well for the animation
    // speed of this model
    const float routeSpeedMetersPerSecond = 30.f;
    m_modelAnimationSpeed = routeSpeedMetersPerSecond * 0.00185;
    
    const Eegeo::v4 routeColor(1, 0, 1, 0.6f);
    const float altitudeMeters = 3.f;
    
    RouteBuilder builder;
    
    std::vector<RouteVertex> points = builder.Start(routeColor, halfWidth, routeSpeedMetersPerSecond, Routes::Road)
    .AddPoint(37.795729,-122.401698, altitudeMeters)
    .AddPoint(37.794873,-122.401516, altitudeMeters)
    .AddPoint(37.794728,-122.403179, altitudeMeters)
    .AddPoint(37.794483,-122.404863, altitudeMeters)
    .AddPoint(37.793618,-122.404670, altitudeMeters)
    .AddPoint(37.793813,-122.403007, altitudeMeters)
    .AddPoint(37.792940,-122.402825, altitudeMeters)
    .AddPoint(37.793109,-122.401108, altitudeMeters)
    .AddPoint(37.792143,-122.400990, altitudeMeters)
    .AddPoint(37.790303,-122.400603, altitudeMeters)
    .AddPoint(37.790324,-122.400126, altitudeMeters)
    .AddPoint(37.794449,-122.394906, altitudeMeters)
    .AddPoint(37.793253,-122.393238, altitudeMeters)
    .AddPoint(37.793707,-122.392578, altitudeMeters)
    .FinishRoute();
    
    const Eegeo::Routes::Style::RouteStyle style(Eegeo::Routes::Style::RouteStyle::JoinStyleArc, m_routeThicknessPolicy);
    return m_routeService.CreateRoute(points, style, false);
}
Ejemplo n.º 2
0
Route* RouteSimulationExample::BuildRoute() const
{
    const float halfWidth = 5.f;
    const float routeSpeedMetersPerSecond = 20.f;
    const Eegeo::v4 routeColor(1, 0, 1, 0.6f);
    const float altitudeMeters = 3.f;

    RouteBuilder builder;

    std::vector<RouteVertex> points = builder.Start(routeColor, halfWidth, routeSpeedMetersPerSecond, Routes::Road)
                                      .AddPoint(37.795729,-122.401698, altitudeMeters)
                                      .AddPoint(37.794873,-122.401516, altitudeMeters)
                                      .AddPoint(37.794728,-122.403179, altitudeMeters)
                                      .AddPoint(37.794483,-122.404863, altitudeMeters)
                                      .AddPoint(37.793618,-122.404670, altitudeMeters)
                                      .AddPoint(37.793813,-122.403007, altitudeMeters)
                                      .AddPoint(37.792940,-122.402825, altitudeMeters)
                                      .AddPoint(37.793109,-122.401108, altitudeMeters)
                                      .AddPoint(37.792143,-122.400990, altitudeMeters)
                                      .AddPoint(37.790303,-122.400603, altitudeMeters)
                                      .AddPoint(37.790324,-122.400126, altitudeMeters)
                                      .AddPoint(37.794449,-122.394906, altitudeMeters)
                                      .AddPoint(37.793253,-122.393238, altitudeMeters)
                                      .AddPoint(37.793707,-122.392578, altitudeMeters)
                                      .FinishRoute();

    const Eegeo::Routes::Style::RouteStyle routeStyle(&m_routeThicknessPolicy, Eegeo::Routes::Style::RouteStyle::DebugStyleNone);
    return m_routeService.CreateRoute(points, routeStyle, false);
}
void RouteMatchingExample::CreateRoutes(bool shouldMatchToNavigationGraph)
{
	// This function generates some routes, potentially matching them to the navigation graph based on the
	// value of the shouldMatchToNavigationGraph parameter. The API used here to build and submit the routes
	// is not explained as has been covered in RouteDrawingExample.cpp - please refer to this example for more
	// information about these API points at http://www.eegeo.com/developers/documentation/routes

	const float halfWidth = 5.f;
	const float routeSpeedMetersPerSecond = 40.f;
	const Eegeo::v4 routeRed(1, 0, 0, 0.6f);
	const Eegeo::v4 routeGreen(0, 1, 0, 0.6f);
	const Eegeo::v4 routeBlue(0, 0, 1, 0.6f);
	const float altitudeMeters = 3.f;
	Eegeo::Routes::Style::RouteStyle routeStyle(&m_routeThicknessPolicy, Eegeo::Routes::Style::RouteStyle::DebugStyleNone);

	RouteBuilder builder;

	// Create a route on roads at the north coast of San Francisco at Fishermans wharf. This route
	// demonstrates fitting to the road graph
	//
	std::vector<RouteVertex> fishermansWharfPoints = builder.Start(routeRed, halfWidth, routeSpeedMetersPerSecond, Routes::Road)
	        .AddPoint(37.807173,-122.408929, altitudeMeters)
	        .AddPoint(37.806982,-122.410527, altitudeMeters)
	        .ChangeColor(routeGreen)
	        .AddPoint(37.806059,-122.41035, altitudeMeters)
	        .AddPoint(37.805847,-122.411986, altitudeMeters)
	        .ChangeColor(routeRed)
	        .AddPoint(37.805385,-122.411916, altitudeMeters)
	        .AddPoint(37.805177,-122.413537, altitudeMeters)
	        .ChangeColor(routeBlue)
	        .AddPoint(37.805635,-122.413633, altitudeMeters)
	        .AddPoint(37.80658,-122.413816, altitudeMeters)
	        .FinishRoute();

	Route* route = m_routeService.CreateRoute(fishermansWharfPoints, routeStyle, shouldMatchToNavigationGraph);
	m_routes.push_back(route);

	// Create a route at Buena Vista park in San Francisco - the park is on a hill, this example demonstrates
	// fitting to the road graph on elevated terrain.
	//
	std::vector<RouteVertex> buenaVistaPoints = builder.Start(routeBlue, halfWidth/2.f, routeSpeedMetersPerSecond, Routes::Road)
	        .AddPoint(37.766088,-122.442888,altitudeMeters)
	        .AddPoint(37.76597,-122.442698,altitudeMeters)
	        .AddPoint(37.766037,-122.442576,altitudeMeters)
	        .AddPoint(37.766129,-122.442381,altitudeMeters)
	        .AddPoint(37.766171,-122.442263,altitudeMeters)
	        .AddPoint(37.766307,-122.442053,altitudeMeters)
	        .AddPoint(37.766667,-122.44175,altitudeMeters)
	        .AddPoint(37.766945,-122.441635,altitudeMeters)
	        .AddPoint(37.767274,-122.441549,altitudeMeters)
	        .AddPoint(37.767683,-122.441276,altitudeMeters)
	        .FinishRoute();

	m_routes.push_back(m_routeService.CreateRoute(buenaVistaPoints, routeStyle, shouldMatchToNavigationGraph));

	// Create a route on Treasure Island in San Francisco. This route starts on the road network, but includes a
	// pedestrian section. The road vertices are colored red and the pedestrian section is colored blue. The
	// pedestrian section is not matched to any navigation graphs, while the road section is (if the value of
	// shouldMatchToNavigationGraph is true).
	//
	std::vector<RouteVertex> islandPoints = builder.Start(routeRed, halfWidth, routeSpeedMetersPerSecond, Routes::Road)
	                                        .AddPoint(37.817416,-122.3681912, altitudeMeters)
	                                        .AddPoint(37.818747,-122.369023, altitudeMeters)
	                                        .AddPoint(37.818243,-122.370348, altitudeMeters)
	                                        .AddPoint(37.820277,-122.3717, altitudeMeters)
	                                        .AddPoint(37.820768,-122.370456, altitudeMeters)
	                                        .AddPoint(37.822794,-122.371775, altitudeMeters)
	                                        .ChangeClassification(Routes::Pedestrian)
	                                        .ChangeColor(routeBlue)
	                                        .AddPoint(37.822887,-122.371207, altitudeMeters)
	                                        .AddPoint(37.822396,-122.370273, altitudeMeters)
	                                        .AddPoint(37.824709,-122.370316, altitudeMeters)
	                                        .FinishRoute();

	m_routes.push_back(m_routeService.CreateRoute(islandPoints, routeStyle, shouldMatchToNavigationGraph));

	//We have created the routes so don't need to do so again.
	m_createdRoutes = true;
}
void RouteDrawingExample::Update(float dt)
{
    //Defer creating the routes until the loading state is over.
    if(m_world.Initialising()) {
        return;
    }
    
    //Just create the routes once.
    if(!m_createdRoutes)
    {
        //An arbitrarily selected default half-width for the route line segments.
        const float halfWidth = 5.f;
        const float routeSpeedMetersPerSecond = 40.f;

        //The color format is (Red, Green, Blue, Transparency - 0.0 is fully transparent and 1.0 is fully opaque).
        const Eegeo::v4 routeRed(1, 0, 0, 0.6f);
        const Eegeo::v4 routeGreen(0, 1, 0, 0.6f);
        const Eegeo::v4 routeBlue(0, 0, 1, 0.6f);
        
        //An arbitrarily selected altitude for the route visualisation.
        const float altitudeMeters = 3.f;
        
        //The route builder helper object provides a fluent interface to make building a route simpler.
        RouteBuilder builder;
        
        //We want the set of route vertices, and we get it by starting with an initial color and width and
        //adding points. This route starts near the Transamerica Pyramid.
        //
        //We can add points by (latDegrees, longDegrees, altitudeMeters) tuples or by a LatLongAltitide object..
        //
        //The color can be changed arbitrarily along the route.
        //
        std::vector<RouteVertex> points = builder.Start(routeRed, halfWidth, routeSpeedMetersPerSecond, Routes::Road)
        .AddPoint(37.795729,-122.401698, altitudeMeters)
        .AddPoint(37.794873,-122.401516, altitudeMeters)
        .AddPoint(37.794728,-122.403179, altitudeMeters)
        .ChangeColor(routeGreen)
        .AddPoint(37.794483,-122.404863, altitudeMeters)
        .AddPoint(37.793618,-122.404670, altitudeMeters)
        .AddPoint(37.793813,-122.403007, altitudeMeters)
        .ChangeColor(routeRed)
        .AddPoint(37.792940,-122.402825, altitudeMeters)
        .AddPoint(37.793109,-122.401108, altitudeMeters)
        .AddPoint(37.792143,-122.400990, altitudeMeters)
        .AddPoint(37.790303,-122.400603, altitudeMeters)
        .AddPoint(37.790324,-122.400126, altitudeMeters)
        .AddPoint(37.794449,-122.394906, altitudeMeters)
        .ChangeColor(routeBlue)
        .AddPoint(37.793253,-122.393238, altitudeMeters)
        .ChangeColor(routeRed)
        .AddPoint(37.793707,-122.392578, altitudeMeters)
        .FinishRoute(); //Calling FinishRoute returns to us the set of points...
        
        // Select a Style for the route, use the JoinStyleArc to give a curved arc join; JoinStyleHard can be used to give
        // hard angular joins if preferred.
        //
        // A route thickness scaling policy should be provided; this informs the route how it should modify its thickness
        // (for example, based on camera altitude, or to play a "pulse" animation). Two implementations are provided; the
        // IdentityRouteThicknessPolicy and the LinearAltitudeScaleBasedRouteThicknessPolicy. For this example we use the
        // identity policy which will not modify the thickness of the route. The style accepts a const reference, so it
        // does not take ownership over the thickness policy.
        Eegeo::Routes::Style::RouteStyle hardJoinStyle(Eegeo::Routes::Style::RouteStyle::JoinStyleHard, m_routeThicknessPolicy);
        
        //We can now create a route from this set of points.
        //
        //The route can be created using the CreateRoute method on the RouteService, which must
        //be destroyed through the complementary DestroyRoute method on RouteService.
        Route* route = m_routeService.CreateRoute(points, hardJoinStyle, false);
        
        //Keep a reference to the route so we can Destroy it later.
        m_routes.push_back(route);
        
        //Create a separate route to demonstrate multiple routes drawing at once...
        //
        //This route surrounds AT & T Park. This route has some nasty data; the route
        //doubles back on itself (to produce exactly opposing poly-line segments)
        //and has a duplicated point, but still renders.
        std::vector<RouteVertex> otherPoints = builder.Start(routeBlue, halfWidth/2.f, routeSpeedMetersPerSecond, Routes::Road)
        .AddPoint(37.779483,-122.388609,altitudeMeters)
        .AddPoint(37.779916,-122.389317,altitudeMeters)
        .ChangeColor(routeGreen)
        //a nasty bit with a duplicated point and a parallel line
        .AddPoint(37.777957,-122.391785,altitudeMeters)
        .AddPoint(37.779916,-122.389317,altitudeMeters)
        .AddPoint(37.777957,-122.391785,altitudeMeters)
        .AddPoint(37.777957,-122.391785,altitudeMeters)
        .ChangeColor(routeRed)
        .AddPoint(37.777126,-122.390551,altitudeMeters)
        .AddPoint(37.776134,-122.389972,altitudeMeters)
        .ChangeColor(routeBlue)
        .AddPoint(37.776397,-122.387922,altitudeMeters)
        .FinishRoute();
        
        Eegeo::Routes::Style::RouteStyle arcJoinStyle(Eegeo::Routes::Style::RouteStyle::JoinStyleArc, m_routeThicknessPolicy);
        m_routes.push_back(m_routeService.CreateRoute(otherPoints, arcJoinStyle, false));
        
        //this route curves around entirely on itself, and traces the bounds of treasure island
        std::vector<RouteVertex> islandCircuitPoints = builder.Start(routeGreen, halfWidth, routeSpeedMetersPerSecond, Routes::Road)
        .AddPoint(37.826701,-122.379162, altitudeMeters)
        .AddPoint(37.830429,-122.377531, altitudeMeters)
        .AddPoint(37.832328,-122.373368, altitudeMeters)
        .AddPoint(37.831209,-122.368605, altitudeMeters)
        .AddPoint(37.822633,-122.362983, altitudeMeters)
        .AddPoint(37.818768,-122.364313, altitudeMeters)
        .AddPoint(37.816158,-122.371480, altitudeMeters)
        .AddPoint(37.818294,-122.373368, altitudeMeters)
        .AddPoint(37.816938,-122.375128, altitudeMeters)
        .AddPoint(37.820226,-122.374742, altitudeMeters)
        .AddPoint(37.824158,-122.377574, altitudeMeters)
        .FinishRoute();
        
        m_routes.push_back(m_routeService.CreateRoute(islandCircuitPoints, arcJoinStyle, false));
        
        //We have created the routes so don't need to do so again.
        m_createdRoutes = true;
    }
}
void RouteThicknessPolicyExample::Update(float dt)
{
	//Defer creating the routes until the loading state is over.
	if(m_world.Initialising())
	{
		return;
	}

	//Just create the routes once.
	if(!m_createdRoutes)
	{
		//Some route data...
		const float halfWidth = 5.f;
		const float routeSpeedMetersPerSecond = 40.f;
		const Eegeo::v4 routeColor(1, 0, 1, 0.6f);
		const float altitudeMeters = 3.f;

		RouteBuilder builder;

		//// Demonstrate a custom route scaling policy on a route around the transamerica pyramid.
		//// This route animates to thicken and thin.
		std::vector<Eegeo::Routes::RouteVertex> transamericaPyramidRoutePoints = builder.Start(routeColor, halfWidth, routeSpeedMetersPerSecond, Routes::Road)
		        .AddPoint(37.795729,-122.401698, altitudeMeters)
		        .AddPoint(37.794873,-122.401516, altitudeMeters)
		        .AddPoint(37.794728,-122.403179, altitudeMeters)
		        .AddPoint(37.794483,-122.404863, altitudeMeters)
		        .AddPoint(37.793618,-122.404670, altitudeMeters)
		        .AddPoint(37.793813,-122.403007, altitudeMeters)
		        .AddPoint(37.792940,-122.402825, altitudeMeters)
		        .AddPoint(37.793109,-122.401108, altitudeMeters)
		        .AddPoint(37.792143,-122.400990, altitudeMeters)
		        .AddPoint(37.790303,-122.400603, altitudeMeters)
		        .AddPoint(37.790324,-122.400126, altitudeMeters)
		        .AddPoint(37.794449,-122.394906, altitudeMeters)
		        .AddPoint(37.793253,-122.393238, altitudeMeters)
		        .AddPoint(37.793707,-122.392578, altitudeMeters)
		        .FinishRoute();

		Eegeo::Routes::Style::RouteStyle transamericaPyramidStyle(&m_myScalingRouteThicknessPolicy, Eegeo::Routes::Style::RouteStyle::DebugStyleNone);
		Route* transamericaPyramidRoute = m_routeService.CreateRoute(transamericaPyramidRoutePoints, transamericaPyramidStyle, false);
		m_routes.push_back(transamericaPyramidRoute);

		//// Demonstrate the built-in altitude based route scaling policy on a route at north treasure isle. This route thickens as the camera
		//// altitude increases.
		std::vector<Eegeo::Routes::RouteVertex> northTreasureIsleRoutePoints = builder.Start(routeColor, halfWidth, routeSpeedMetersPerSecond, Routes::Road)
		        .AddPoint(37.827209,-122.377746,altitudeMeters)
		        .AddPoint(37.826057,-122.37663,altitudeMeters)
		        .AddPoint(37.825802,-122.374223,altitudeMeters)
		        .AddPoint(37.825921,-122.372035,altitudeMeters)
		        .AddPoint(37.826802,-122.369674,altitudeMeters)
		        .AddPoint(37.828667,-122.369159,altitudeMeters)
		        .AddPoint(37.830209,-122.369824,altitudeMeters)
		        .AddPoint(37.830328,-122.373172,altitudeMeters)
		        .FinishRoute();

		Eegeo::Routes::Style::RouteStyle northTreasureIsleStyle(&m_linearAltitudeBasedRouteThicknessPolicy, Eegeo::Routes::Style::RouteStyle::DebugStyleNone);
		Route* northTreasureIsleRoute = m_routeService.CreateRoute(northTreasureIsleRoutePoints, northTreasureIsleStyle, false);
		m_routes.push_back(northTreasureIsleRoute);

		//// Demonstrate the built-in identity route scaling policy on a route at south treasure isle. This route remains
		//// the same thickness.
		std::vector<Eegeo::Routes::RouteVertex> southTreasureIsleRoutePoints = builder.Start(routeColor, halfWidth, routeSpeedMetersPerSecond, Routes::Road)
		        .AddPoint(37.818226,-122.370339,altitudeMeters)
		        .AddPoint(37.820294,-122.371713,altitudeMeters)
		        .AddPoint(37.821599,-122.370940,altitudeMeters)
		        .AddPoint(37.822701,-122.368279,altitudeMeters)
		        .AddPoint(37.822260,-122.366735,altitudeMeters)
		        .AddPoint(37.820277,-122.365361,altitudeMeters)
		        .FinishRoute();

		Eegeo::Routes::Style::RouteStyle southTreasureIsleStyle(&m_identityRouteThicknessPolicy, Eegeo::Routes::Style::RouteStyle::DebugStyleNone);
		Route* southTreasureIsleRoute = m_routeService.CreateRoute(southTreasureIsleRoutePoints, southTreasureIsleStyle, false);
		m_routes.push_back(southTreasureIsleRoute);


		//We have created the routes so don't need to do so again.
		m_createdRoutes = true;
	}

	//Update our custom thickness policy to make it animate.
	m_myScalingRouteThicknessPolicy.UpdateScale();
    
    // Update the altitude based scaler with the current camera's altitude.
    float altitude = GetGlobeCameraController().GetRenderCamera().GetAltitude();
    m_linearAltitudeBasedRouteThicknessPolicy.SetAltitude(altitude);
}