@@ -1409,9 +1409,10 @@ void VROARSessionARCore::setGeospatialAnchorProvider(VROGeospatialAnchorProvider
14091409 VROARSession::setGeospatialAnchorProvider (provider);
14101410
14111411 if (provider == VROGeospatialAnchorProvider::ReactVision) {
1412- // ReactVision geospatial (RVCA metadata backend) is initialized via
1413- // setReactVisionConfig() when provider="reactvision" is set.
1414- // Do NOT enable ARCore geospatial mode (VPS) — that belongs to provider="arcore".
1412+ // ReactVision has no ARCore dependency — no VPS, no ARCore session config.
1413+ // GPS→AR placement (createGeospatialAnchor) is not supported for this provider.
1414+ // Use rvCreateGeospatialAnchor / rvFindNearbyGeospatialAnchors for RVCA metadata.
1415+ // _geospatialProviderRV is initialized in setReactVisionConfig().
14151416 if (!_geospatialProviderRV) {
14161417 pwarn (" VROARSessionARCore: ReactVision geospatial not ready — "
14171418 " setReactVisionConfig() must be called first." );
@@ -1544,9 +1545,16 @@ void VROARSessionARCore::createGeospatialAnchor(double latitude, double longitud
15441545 VROQuaternion quaternion,
15451546 std::function<void (std::shared_ptr<VROGeospatialAnchor>)> onSuccess,
15461547 std::function<void(std::string error)> onFailure) {
1547- // Always use the native ARCore geospatial path regardless of provider.
1548- // Backend record creation is an explicit management operation (rvCreateGeospatialAnchor),
1549- // not an implicit side-effect of placing an anchor in AR.
1548+ #if RVCCA_AVAILABLE
1549+ if (getGeospatialAnchorProvider () == VROGeospatialAnchorProvider::ReactVision) {
1550+ // ReactVision has no VPS — cannot map GPS coordinates to AR world space.
1551+ // Use rvCreateGeospatialAnchor to store GPS metadata, and resolveCloudAnchor
1552+ // to place anchors in AR via visual feature matching.
1553+ if (onFailure) onFailure (" createGeospatialAnchor requires ARCore VPS (provider='arcore'). "
1554+ " ReactVision provider does not support GPS→AR placement." );
1555+ return ;
1556+ }
1557+ #endif
15501558 if (_geospatialMode == arcore::GeospatialMode::Disabled) {
15511559 if (onFailure) onFailure (" Geospatial mode is disabled" );
15521560 return ;
@@ -1587,37 +1595,8 @@ void VROARSessionARCore::createTerrainAnchor(double latitude, double longitude,
15871595 std::function<void(std::string error)> onFailure) {
15881596#if RVCCA_AVAILABLE
15891597 if (getGeospatialAnchorProvider () == VROGeospatialAnchorProvider::ReactVision) {
1590- if (!_geospatialProviderRV) {
1591- if (onFailure) onFailure (" ReactVision geospatial provider not initialized" );
1592- return ;
1593- }
1594- ReactVisionCCA::GeospatialCreateRequest req;
1595- req.projectId = _rvProjectId;
1596- req.lat = latitude;
1597- req.lng = longitude;
1598- req.alt = altitudeAboveTerrain;
1599- req.altitudeMode = " street_level" ;
1600- std::weak_ptr<VROARSessionARCore> weakSelf = shared_from_this ();
1601- _geospatialProviderRV->createAnchor (req,
1602- [weakSelf, latitude, longitude, altitudeAboveTerrain, quaternion, onSuccess, onFailure]
1603- (ReactVisionCCA::ApiResult<ReactVisionCCA::GeospatialAnchorRecord> result) {
1604- VROPlatformDispatchAsyncRenderer ([=] {
1605- auto self = weakSelf.lock ();
1606- if (!self) return ;
1607- if (result.success ) {
1608- auto geoAnchor = std::make_shared<VROGeospatialAnchor>(
1609- VROGeospatialAnchorType::Terrain, latitude, longitude, altitudeAboveTerrain, quaternion);
1610- geoAnchor->setId (result.data .id );
1611- geoAnchor->setResolveState (VROGeospatialAnchorResolveState::Success);
1612- std::shared_ptr<VROARAnchorARCore> vAnchor = std::make_shared<VROARAnchorARCore>(
1613- result.data .id , nullptr , geoAnchor, self);
1614- self->addAnchor (vAnchor);
1615- if (onSuccess) onSuccess (geoAnchor);
1616- } else {
1617- if (onFailure) onFailure (result.error .message );
1618- }
1619- });
1620- });
1598+ if (onFailure) onFailure (" createTerrainAnchor requires ARCore VPS (provider='arcore'). "
1599+ " ReactVision provider does not support GPS→AR placement." );
16211600 return ;
16221601 }
16231602#endif
@@ -1671,37 +1650,8 @@ void VROARSessionARCore::createRooftopAnchor(double latitude, double longitude,
16711650 std::function<void(std::string error)> onFailure) {
16721651#if RVCCA_AVAILABLE
16731652 if (getGeospatialAnchorProvider () == VROGeospatialAnchorProvider::ReactVision) {
1674- if (!_geospatialProviderRV) {
1675- if (onFailure) onFailure (" ReactVision geospatial provider not initialized" );
1676- return ;
1677- }
1678- ReactVisionCCA::GeospatialCreateRequest req;
1679- req.projectId = _rvProjectId;
1680- req.lat = latitude;
1681- req.lng = longitude;
1682- req.alt = altitudeAboveRooftop;
1683- req.altitudeMode = " rooftop_level" ;
1684- std::weak_ptr<VROARSessionARCore> weakSelf = shared_from_this ();
1685- _geospatialProviderRV->createAnchor (req,
1686- [weakSelf, latitude, longitude, altitudeAboveRooftop, quaternion, onSuccess, onFailure]
1687- (ReactVisionCCA::ApiResult<ReactVisionCCA::GeospatialAnchorRecord> result) {
1688- VROPlatformDispatchAsyncRenderer ([=] {
1689- auto self = weakSelf.lock ();
1690- if (!self) return ;
1691- if (result.success ) {
1692- auto geoAnchor = std::make_shared<VROGeospatialAnchor>(
1693- VROGeospatialAnchorType::Rooftop, latitude, longitude, altitudeAboveRooftop, quaternion);
1694- geoAnchor->setId (result.data .id );
1695- geoAnchor->setResolveState (VROGeospatialAnchorResolveState::Success);
1696- std::shared_ptr<VROARAnchorARCore> vAnchor = std::make_shared<VROARAnchorARCore>(
1697- result.data .id , nullptr , geoAnchor, self);
1698- self->addAnchor (vAnchor);
1699- if (onSuccess) onSuccess (geoAnchor);
1700- } else {
1701- if (onFailure) onFailure (result.error .message );
1702- }
1703- });
1704- });
1653+ if (onFailure) onFailure (" createRooftopAnchor requires ARCore VPS (provider='arcore'). "
1654+ " ReactVision provider does not support GPS→AR placement." );
17051655 return ;
17061656 }
17071657#endif
0 commit comments