Skip to content

Commit b8f5484

Browse files
fix: separate arcore/reactvision to avoid confusions
1 parent 602fc5e commit b8f5484

2 files changed

Lines changed: 38 additions & 136 deletions

File tree

android/sharedCode/src/main/cpp/arcore/VROARSessionARCore.cpp

Lines changed: 18 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -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

ios/ViroKit/VROARSessioniOS.cpp

Lines changed: 20 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,10 +1555,10 @@ void VROARSessioniOS::setGeospatialAnchorProvider(VROGeospatialAnchorProvider pr
15551555
VROARSession::setGeospatialAnchorProvider(provider);
15561556

15571557
if (provider == VROGeospatialAnchorProvider::ReactVision) {
1558-
// ReactVision geospatial (RVCA metadata backend) is initialized via
1559-
// setCloudAnchorProvider(ReactVision) when provider="reactvision" is set.
1560-
// Do NOT enable ARCore/GAR geospatial mode — that belongs to provider="arcore".
1561-
// _geospatialProviderRV and _rvLocationDelegate are already set up.
1558+
// ReactVision has no ARCore/GAR dependency — no VPS, no GAR session config.
1559+
// GPS→AR placement (createGeospatialAnchor) is not supported for this provider.
1560+
// Use rvCreateGeospatialAnchor / rvFindNearbyGeospatialAnchors for RVCA metadata.
1561+
// _geospatialProviderRV is initialized in setCloudAnchorProvider(ReactVision).
15621562
return;
15631563
}
15641564

@@ -1678,13 +1678,18 @@ void VROARSessioniOS::createGeospatialAnchor(double latitude, double longitude,
16781678
VROQuaternion quaternion,
16791679
std::function<void(std::shared_ptr<VROGeospatialAnchor>)> onSuccess,
16801680
std::function<void(std::string error)> onFailure) {
1681-
// Always use the native ARKit geospatial path regardless of provider.
1682-
// Backend record creation is an explicit management operation (rvCreateGeospatialAnchor),
1683-
// not an implicit side-effect of placing an anchor in AR.
1681+
#if RVCCA_AVAILABLE
1682+
if (getGeospatialAnchorProvider() == VROGeospatialAnchorProvider::ReactVision) {
1683+
// ReactVision has no VPS — cannot map GPS coordinates to AR world space.
1684+
// Use rvCreateGeospatialAnchor to store GPS metadata, and resolveCloudAnchor
1685+
// to place anchors in AR via visual feature matching.
1686+
if (onFailure) onFailure("createGeospatialAnchor requires ARCore VPS (provider='arcore'). "
1687+
"ReactVision provider does not support GPS→AR placement.");
1688+
return;
1689+
}
1690+
#endif
16841691
if (!_cloudAnchorProviderARCore) {
1685-
if (onFailure) {
1686-
onFailure("Geospatial provider not initialized. Set geospatialAnchorProvider='arcore-geospatial'.");
1687-
}
1692+
if (onFailure) onFailure("Geospatial provider not initialized — set provider='arcore' first.");
16881693
return;
16891694
}
16901695

@@ -1713,44 +1718,16 @@ void VROARSessioniOS::createTerrainAnchor(double latitude, double longitude, dou
17131718
std::function<void(std::string error)> onFailure) {
17141719
#if RVCCA_AVAILABLE
17151720
if (getGeospatialAnchorProvider() == VROGeospatialAnchorProvider::ReactVision) {
1716-
if (!_geospatialProviderRV) {
1717-
if (onFailure) onFailure("ReactVision geospatial provider not initialized");
1718-
return;
1719-
}
1720-
ReactVisionCCA::GeospatialCreateRequest req;
1721-
req.projectId = _rvGeoProjectId;
1722-
req.lat = latitude;
1723-
req.lng = longitude;
1724-
req.alt = altitudeAboveTerrain;
1725-
req.altitudeMode = "street_level";
1726-
std::weak_ptr<VROARSessioniOS> weakSelf = shared_from_this();
1727-
_geospatialProviderRV->createAnchor(req,
1728-
[weakSelf, latitude, longitude, altitudeAboveTerrain, quaternion, onSuccess, onFailure]
1729-
(ReactVisionCCA::ApiResult<ReactVisionCCA::GeospatialAnchorRecord> result) {
1730-
auto self = weakSelf.lock();
1731-
if (!self) return;
1732-
if (result.success) {
1733-
auto geoAnchor = std::make_shared<VROGeospatialAnchor>(
1734-
VROGeospatialAnchorType::Terrain, latitude, longitude, altitudeAboveTerrain, quaternion);
1735-
geoAnchor->setId(result.data.id);
1736-
geoAnchor->setResolveState(VROGeospatialAnchorResolveState::Success);
1737-
self->addAnchor(geoAnchor);
1738-
if (onSuccess) onSuccess(geoAnchor);
1739-
} else {
1740-
if (onFailure) onFailure(result.error.message);
1741-
}
1742-
});
1721+
if (onFailure) onFailure("createTerrainAnchor requires ARCore VPS (provider='arcore'). "
1722+
"ReactVision provider does not support GPS→AR placement.");
17431723
return;
17441724
}
17451725
#endif
17461726
if (!_cloudAnchorProviderARCore) {
1747-
if (onFailure) {
1748-
onFailure("Geospatial provider not initialized. Set geospatialAnchorProvider='arcore-geospatial'.");
1749-
}
1727+
if (onFailure) onFailure("Geospatial provider not initialized — set provider='arcore' first.");
17501728
return;
17511729
}
17521730

1753-
// Convert VROQuaternion to simd_quatf
17541731
simd_quatf simdQuat = simd_quaternion(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W);
17551732

17561733
[_cloudAnchorProviderARCore createTerrainAnchor:latitude
@@ -1775,33 +1752,8 @@ void VROARSessioniOS::createRooftopAnchor(double latitude, double longitude, dou
17751752
std::function<void(std::string error)> onFailure) {
17761753
#if RVCCA_AVAILABLE
17771754
if (getGeospatialAnchorProvider() == VROGeospatialAnchorProvider::ReactVision) {
1778-
if (!_geospatialProviderRV) {
1779-
if (onFailure) onFailure("ReactVision geospatial provider not initialized");
1780-
return;
1781-
}
1782-
ReactVisionCCA::GeospatialCreateRequest req;
1783-
req.projectId = _rvGeoProjectId;
1784-
req.lat = latitude;
1785-
req.lng = longitude;
1786-
req.alt = altitudeAboveRooftop;
1787-
req.altitudeMode = "rooftop_level";
1788-
std::weak_ptr<VROARSessioniOS> weakSelf = shared_from_this();
1789-
_geospatialProviderRV->createAnchor(req,
1790-
[weakSelf, latitude, longitude, altitudeAboveRooftop, quaternion, onSuccess, onFailure]
1791-
(ReactVisionCCA::ApiResult<ReactVisionCCA::GeospatialAnchorRecord> result) {
1792-
auto self = weakSelf.lock();
1793-
if (!self) return;
1794-
if (result.success) {
1795-
auto geoAnchor = std::make_shared<VROGeospatialAnchor>(
1796-
VROGeospatialAnchorType::Rooftop, latitude, longitude, altitudeAboveRooftop, quaternion);
1797-
geoAnchor->setId(result.data.id);
1798-
geoAnchor->setResolveState(VROGeospatialAnchorResolveState::Success);
1799-
self->addAnchor(geoAnchor);
1800-
if (onSuccess) onSuccess(geoAnchor);
1801-
} else {
1802-
if (onFailure) onFailure(result.error.message);
1803-
}
1804-
});
1755+
if (onFailure) onFailure("createRooftopAnchor requires ARCore VPS (provider='arcore'). "
1756+
"ReactVision provider does not support GPS→AR placement.");
18051757
return;
18061758
}
18071759
#endif

0 commit comments

Comments
 (0)