diff --git a/CHANGES.md b/CHANGES.md index 11e7ebaa..6961bb31 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,10 @@ # Change Log +### v0.22.0 - 2024-09-03 + +* Cesium for Omniverse now supports using non-WGS84 ellipsoids. + * A `CesiumEllipsoidPrim` should be specified on the `ellipsoidBinding` field of a `CesiumReferencePrim`. + ### v0.21.0 - 2024-06-03 * Added `pointSize` attribute to `CesiumTilesetPrim` for controlling the size of points. diff --git a/exts/cesium.omniverse/cesium/omniverse/ui/attributes/__init__.py b/exts/cesium.omniverse/cesium/omniverse/ui/attributes/__init__.py index a35f83da..714712b6 100644 --- a/exts/cesium.omniverse/cesium/omniverse/ui/attributes/__init__.py +++ b/exts/cesium.omniverse/cesium/omniverse/ui/attributes/__init__.py @@ -1,4 +1,5 @@ from .data_attributes_widget import CesiumDataSchemaAttributesWidget # noqa: F401 +from .ellipsoid_attributes_widget import CesiumEllipsoidAttributesWidget # noqa: F401 from .georeference_attributes_widget import CesiumGeoreferenceSchemaAttributesWidget # noqa :F401 from .tileset_attributes_widget import CesiumTilesetAttributesWidget # noqa: F401 from .globe_anchor_attributes_widget import CesiumGlobeAnchorAttributesWidget # noqa: F401 diff --git a/exts/cesium.omniverse/cesium/omniverse/ui/attributes/ellipsoid_attributes_widget.py b/exts/cesium.omniverse/cesium/omniverse/ui/attributes/ellipsoid_attributes_widget.py new file mode 100644 index 00000000..66befb0f --- /dev/null +++ b/exts/cesium.omniverse/cesium/omniverse/ui/attributes/ellipsoid_attributes_widget.py @@ -0,0 +1,22 @@ +import logging +from omni.kit.property.usd.custom_layout_helper import CustomLayoutFrame, CustomLayoutGroup, CustomLayoutProperty +from omni.kit.property.usd.usd_property_widget import SchemaPropertiesWidget +from cesium.usd.plugins.CesiumUsdSchemas import Ellipsoid as CesiumEllipsoid + + +class CesiumEllipsoidAttributesWidget(SchemaPropertiesWidget): + def __init__(self): + super().__init__("Ellipsoid", CesiumEllipsoid, include_inherited=False) + + self._logger = logging.getLogger(__name__) + + def clean(self): + super().clean() + + def _customize_props_layout(self, props): + frame = CustomLayoutFrame(hide_extra=True) + + with frame: + CustomLayoutProperty("cesium:radii") + + return frame.apply(props) diff --git a/exts/cesium.omniverse/cesium/omniverse/ui/attributes/georeference_attributes_widget.py b/exts/cesium.omniverse/cesium/omniverse/ui/attributes/georeference_attributes_widget.py index 562ff490..bbc476cb 100644 --- a/exts/cesium.omniverse/cesium/omniverse/ui/attributes/georeference_attributes_widget.py +++ b/exts/cesium.omniverse/cesium/omniverse/ui/attributes/georeference_attributes_widget.py @@ -1,7 +1,10 @@ import logging from omni.kit.property.usd.custom_layout_helper import CustomLayoutFrame, CustomLayoutGroup, CustomLayoutProperty from omni.kit.property.usd.usd_property_widget import SchemaPropertiesWidget -from cesium.usd.plugins.CesiumUsdSchemas import Georeference as CesiumGeoreference +from cesium.usd.plugins.CesiumUsdSchemas import ( + Ellipsoid as CesiumEllipsoid, + Georeference as CesiumGeoreference, +) class CesiumGeoreferenceSchemaAttributesWidget(SchemaPropertiesWidget): @@ -21,5 +24,18 @@ def _customize_props_layout(self, props): CustomLayoutProperty("cesium:georeferenceOrigin:latitude", "Latitude") CustomLayoutProperty("cesium:georeferenceOrigin:longitude", "Longitude") CustomLayoutProperty("cesium:georeferenceOrigin:height", "Height") + with CustomLayoutGroup("Ellipsoid"): + CustomLayoutProperty("cesium:ellipsoidBinding") return frame.apply(props) + + def _filter_props_to_build(self, props): + filtered_props = super()._filter_props_to_build(props) + filtered_props.extend(prop for prop in props if prop.GetName() == "cesium:ellipsoidBinding") + return filtered_props + + def get_additional_kwargs(self, ui_attr): + if ui_attr.prop_name == "cesium:ellipsoidBinding": + return None, {"target_picker_filter_type_list": [CesiumEllipsoid], "targets_limit": 1} + + return None, {"targets_limit": 0} diff --git a/exts/cesium.omniverse/cesium/omniverse/ui/attributes_widget_controller.py b/exts/cesium.omniverse/cesium/omniverse/ui/attributes_widget_controller.py index e039b863..cade4616 100644 --- a/exts/cesium.omniverse/cesium/omniverse/ui/attributes_widget_controller.py +++ b/exts/cesium.omniverse/cesium/omniverse/ui/attributes_widget_controller.py @@ -2,6 +2,7 @@ import omni.kit.window.property from .attributes import ( CesiumDataSchemaAttributesWidget, + CesiumEllipsoidAttributesWidget, CesiumGeoreferenceSchemaAttributesWidget, CesiumTilesetAttributesWidget, CesiumGlobeAnchorAttributesWidget, @@ -26,6 +27,7 @@ def __init__(self, _cesium_omniverse_interface: ICesiumOmniverseInterface): self._logger = logging.getLogger(__name__) self._register_data_attributes_widget() + self._register_ellipsoid_attributes_widget() self._register_georeference_attributes_widget() self._register_tileset_attributes_widget() self._register_global_anchor_attributes_widget() @@ -38,6 +40,7 @@ def __init__(self, _cesium_omniverse_interface: ICesiumOmniverseInterface): def destroy(self): self._unregister_data_attributes_widget() + self._unregister_ellipsoid_attributes_widget() self._unregister_georeference_attributes_widget() self._unregister_tileset_attributes_widget() self._unregister_global_anchor_attributes_widget() @@ -60,6 +63,18 @@ def _unregister_data_attributes_widget(): if window is not None: window.unregister_widget("prim", "cesiumData") + @staticmethod + def _register_ellipsoid_attributes_widget(): + window = omni.kit.window.property.get_window() + if window is not None: + window.register_widget("prim", "cesiumEllipsoid", CesiumEllipsoidAttributesWidget()) + + @staticmethod + def _unregister_ellipsoid_attributes_widget(): + window = omni.kit.window.property.get_window() + if window is not None: + window.unregister_widget("prim", "cesiumEllipsoid") + @staticmethod def _register_georeference_attributes_widget(): window = omni.kit.window.property.get_window() diff --git a/exts/cesium.usd.plugins/cesium/usd/plugins/CesiumUsdSchemas/__init__.pyi b/exts/cesium.usd.plugins/cesium/usd/plugins/CesiumUsdSchemas/__init__.pyi index 43ebfdbc..f7654e30 100644 --- a/exts/cesium.usd.plugins/cesium/usd/plugins/CesiumUsdSchemas/__init__.pyi +++ b/exts/cesium.usd.plugins/cesium/usd/plugins/CesiumUsdSchemas/__init__.pyi @@ -67,6 +67,27 @@ class Data(pxr.Usd.Typed): @classmethod def __reduce__(cls) -> Any: ... +class Ellipsoid(pxr.Usd.Typed): + __instance_size__: ClassVar[int] = ... + @classmethod + def __init__(cls, *args, **kwargs) -> None: ... + @classmethod + def CreateRadiiAttr(cls, *args, **kwargs) -> Any: ... + @classmethod + def Define(cls, *args, **kwargs) -> Any: ... + @classmethod + def Get(cls, *args, **kwargs) -> Any: ... + @classmethod + def GetRadiiAttr(cls, *args, **kwargs) -> Any: ... + @classmethod + def GetSchemaAttributeNames(cls, *args, **kwargs) -> Any: ... + @classmethod + def _GetStaticTfType(cls, *args, **kwargs) -> Any: ... + @classmethod + def __bool__(cls) -> bool: ... + @classmethod + def __reduce__(cls) -> Any: ... + class Georeference(pxr.Usd.Typed): __instance_size__: ClassVar[int] = ... @classmethod @@ -74,6 +95,8 @@ class Georeference(pxr.Usd.Typed): @classmethod def CreateEcefToUsdTransformAttr(cls, *args, **kwargs) -> Any: ... @classmethod + def CreateEllipsoidBindingRel(cls, *args, **kwargs) -> Any: ... + @classmethod def CreateGeoreferenceOriginHeightAttr(cls, *args, **kwargs) -> Any: ... @classmethod def CreateGeoreferenceOriginLatitudeAttr(cls, *args, **kwargs) -> Any: ... @@ -86,6 +109,8 @@ class Georeference(pxr.Usd.Typed): @classmethod def GetEcefToUsdTransformAttr(cls, *args, **kwargs) -> Any: ... @classmethod + def GetEllipsoidBindingRel(cls, *args, **kwargs) -> Any: ... + @classmethod def GetGeoreferenceOriginHeightAttr(cls, *args, **kwargs) -> Any: ... @classmethod def GetGeoreferenceOriginLatitudeAttr(cls, *args, **kwargs) -> Any: ... @@ -489,6 +514,8 @@ class Tokens(Boost.Python.instance): @property def cesiumEcefToUsdTransform(self) -> Any: ... @property + def cesiumEllipsoidBinding(self) -> Any: ... + @property def cesiumEnableFogCulling(self) -> Any: ... @property def cesiumEnableFrustumCulling(self) -> Any: ... @@ -561,6 +588,8 @@ class Tokens(Boost.Python.instance): @property def cesiumProjectDefaultIonAccessTokenId(self) -> Any: ... @property + def cesiumRadii(self) -> Any: ... + @property def cesiumRasterOverlayBinding(self) -> Any: ... @property def cesiumRootTilesX(self) -> Any: ... diff --git a/exts/cesium.usd.plugins/schemas/cesium_schemas.usda b/exts/cesium.usd.plugins/schemas/cesium_schemas.usda index 3ae3b821..7317ac6b 100644 --- a/exts/cesium.usd.plugins/schemas/cesium_schemas.usda +++ b/exts/cesium.usd.plugins/schemas/cesium_schemas.usda @@ -199,7 +199,7 @@ class CesiumGeoreferencePrim "CesiumGeoreferencePrim" ( string apiName = "georeferenceOriginHeight" } displayName = "Georeference Origin Height" - doc = "The height of the origin in meters above the WGS84 ellipsoid. Do not confuse this with a geoid height or height above mean sea level, which can be tens of meters higher or lower depending on where in the world the origin is located." + doc = "The height of the origin in meters above the ellipsoid. Do not confuse this with a geoid height or height above mean sea level, which can be tens of meters higher or lower depending on where in the world the origin is located." ) matrix4d cesium:ecefToUsdTransform ( @@ -209,6 +209,14 @@ class CesiumGeoreferencePrim "CesiumGeoreferencePrim" ( displayName = "ECEF to USD Transform (read only)" doc = "The 4x4 transformation matrix (row major) from global ECEF coordinates to USD stage coordinates based on the georeference origin (read only)." ) + + rel cesium:ellipsoidBinding ( + customData = { + string apiName = "ellipsoidBinding" + } + displayName = "Ellipsoid Binding" + doc = "The ellipsoid." + ) } class CesiumTilesetPrim "CesiumTilesetPrim" ( @@ -857,3 +865,19 @@ class "CesiumGlobeAnchorSchemaAPI" ( doc = "The Georeference Origin prim used for the globe anchor calculations." ) } + +class CesiumEllipsoidPrim "CesiumEllipsoidPrim" ( + doc = """An ellipsoid.""" + inherits = + customData = { + string className = "Ellipsoid" + } +) { + double3 cesium:radii = (0.0, 0.0, 0.0) ( + customData = { + string apiName = "radii" + } + displayName = "Radii" + doc = "The radii of this ellipsoid. The X coordinate should be the radius of the largest axis and the Z coordinate should be the radius of the smallest axis." + ) +} diff --git a/src/core/include/cesium/omniverse/AssetRegistry.h b/src/core/include/cesium/omniverse/AssetRegistry.h index 5980b18d..8a49557a 100644 --- a/src/core/include/cesium/omniverse/AssetRegistry.h +++ b/src/core/include/cesium/omniverse/AssetRegistry.h @@ -11,6 +11,7 @@ namespace cesium::omniverse { class Context; class OmniCartographicPolygon; class OmniData; +class OmniEllipsoid; class OmniGeoreference; class OmniGlobeAnchor; class OmniRasterOverlay; @@ -25,6 +26,7 @@ struct Viewport; enum AssetType { DATA, + ELLIPSOID, TILESET, ION_RASTER_OVERLAY, POLYGON_RASTER_OVERLAY, @@ -54,6 +56,11 @@ class AssetRegistry { [[nodiscard]] OmniData* getData(const pxr::SdfPath& path) const; [[nodiscard]] OmniData* getFirstData() const; + OmniEllipsoid& addEllipsoid(const pxr::SdfPath& path); + void removeEllipsoid(const pxr::SdfPath& path); + [[nodiscard]] OmniEllipsoid* getEllipsoid(const pxr::SdfPath& path) const; + [[nodiscard]] const std::vector>& getEllipsoids() const; + OmniTileset& addTileset(const pxr::SdfPath& path); void removeTileset(const pxr::SdfPath& path); [[nodiscard]] OmniTileset* getTileset(const pxr::SdfPath& path) const; @@ -114,6 +121,7 @@ class AssetRegistry { private: Context* _pContext; std::vector> _datas; + std::vector> _ellipsoids; std::vector> _tilesets; std::vector> _ionRasterOverlays; std::vector> _polygonRasterOverlays; diff --git a/src/core/include/cesium/omniverse/OmniEllipsoid.h b/src/core/include/cesium/omniverse/OmniEllipsoid.h new file mode 100644 index 00000000..b4b9a583 --- /dev/null +++ b/src/core/include/cesium/omniverse/OmniEllipsoid.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +namespace CesiumGeospatial { +class Ellipsoid; +} + +namespace cesium::omniverse { + +class Context; + +class OmniEllipsoid { + public: + OmniEllipsoid(Context* pContext, const pxr::SdfPath& path); + ~OmniEllipsoid() = default; + OmniEllipsoid(const OmniEllipsoid&) = delete; + OmniEllipsoid& operator=(const OmniEllipsoid&) = delete; + OmniEllipsoid(OmniEllipsoid&&) noexcept = default; + OmniEllipsoid& operator=(OmniEllipsoid&&) noexcept = default; + + [[nodiscard]] const pxr::SdfPath& getPath() const; + [[nodiscard]] CesiumGeospatial::Ellipsoid getEllipsoid() const; + + private: + Context* _pContext; + pxr::SdfPath _path; +}; +} // namespace cesium::omniverse diff --git a/src/core/include/cesium/omniverse/OmniGeoreference.h b/src/core/include/cesium/omniverse/OmniGeoreference.h index 5389d957..dfed2539 100644 --- a/src/core/include/cesium/omniverse/OmniGeoreference.h +++ b/src/core/include/cesium/omniverse/OmniGeoreference.h @@ -24,6 +24,7 @@ class OmniGeoreference { [[nodiscard]] const pxr::SdfPath& getPath() const; [[nodiscard]] CesiumGeospatial::Cartographic getOrigin() const; + [[nodiscard]] pxr::SdfPath getEllipsoidPath() const; [[nodiscard]] const CesiumGeospatial::Ellipsoid& getEllipsoid() const; [[nodiscard]] CesiumGeospatial::LocalHorizontalCoordinateSystem getLocalCoordinateSystem() const; void update(); diff --git a/src/core/include/cesium/omniverse/UsdNotificationHandler.h b/src/core/include/cesium/omniverse/UsdNotificationHandler.h index 238800f6..0e519642 100644 --- a/src/core/include/cesium/omniverse/UsdNotificationHandler.h +++ b/src/core/include/cesium/omniverse/UsdNotificationHandler.h @@ -22,6 +22,7 @@ class UsdNotificationHandler final : public pxr::TfWeakBase { private: enum class ChangedPrimType { CESIUM_DATA, + CESIUM_ELLIPSOID, CESIUM_TILESET, CESIUM_ION_RASTER_OVERLAY, CESIUM_POLYGON_RASTER_OVERLAY, diff --git a/src/core/include/cesium/omniverse/UsdUtil.h b/src/core/include/cesium/omniverse/UsdUtil.h index 4b742563..77afb253 100644 --- a/src/core/include/cesium/omniverse/UsdUtil.h +++ b/src/core/include/cesium/omniverse/UsdUtil.h @@ -10,6 +10,7 @@ PXR_NAMESPACE_OPEN_SCOPE class CesiumData; +class CesiumEllipsoid; class CesiumGeoreference; class CesiumGlobeAnchorAPI; class CesiumRasterOverlay; @@ -108,6 +109,7 @@ std::string getSafeName(const std::string& name); pxr::TfToken getDynamicTextureProviderAssetPathToken(const std::string_view& name); pxr::CesiumData defineCesiumData(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); +pxr::CesiumEllipsoid defineCesiumEllipsoid(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); pxr::CesiumTileset defineCesiumTileset(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); pxr::CesiumIonRasterOverlay defineCesiumIonRasterOverlay(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); pxr::CesiumPolygonRasterOverlay @@ -117,6 +119,7 @@ pxr::CesiumIonServer defineCesiumIonServer(const pxr::UsdStageWeakPtr& pStage, c pxr::CesiumGlobeAnchorAPI applyCesiumGlobeAnchor(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); pxr::CesiumData getCesiumData(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); +pxr::CesiumEllipsoid getCesiumEllipsoid(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); pxr::CesiumTileset getCesiumTileset(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); pxr::CesiumRasterOverlay getCesiumRasterOverlay(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); pxr::CesiumIonRasterOverlay getCesiumIonRasterOverlay(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); @@ -136,6 +139,7 @@ pxr::UsdShadeShader getUsdShader(const pxr::UsdStageWeakPtr& pStage, const pxr:: pxr::UsdGeomBasisCurves getUsdBasisCurves(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); bool isCesiumData(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); +bool isCesiumEllipsoid(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); bool isCesiumTileset(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); bool isCesiumRasterOverlay(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); bool isCesiumIonRasterOverlay(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path); diff --git a/src/core/src/AssetRegistry.cpp b/src/core/src/AssetRegistry.cpp index 99495aa0..5df2a610 100644 --- a/src/core/src/AssetRegistry.cpp +++ b/src/core/src/AssetRegistry.cpp @@ -4,6 +4,7 @@ #include "cesium/omniverse/CppUtil.h" #include "cesium/omniverse/OmniCartographicPolygon.h" #include "cesium/omniverse/OmniData.h" +#include "cesium/omniverse/OmniEllipsoid.h" #include "cesium/omniverse/OmniGeoreference.h" #include "cesium/omniverse/OmniGlobeAnchor.h" #include "cesium/omniverse/OmniIonRasterOverlay.h" @@ -55,6 +56,28 @@ OmniData* AssetRegistry::getFirstData() const { return _datas.front().get(); } +OmniEllipsoid& AssetRegistry::addEllipsoid(const pxr::SdfPath& path) { + return *_ellipsoids.insert(_ellipsoids.end(), std::make_unique(_pContext, path))->get(); +} + +void AssetRegistry::removeEllipsoid(const pxr::SdfPath& path) { + CppUtil::eraseIf(_ellipsoids, [&path](const auto& pEllipsoid) { return pEllipsoid->getPath() == path; }); +} + +OmniEllipsoid* AssetRegistry::getEllipsoid(const pxr::SdfPath& path) const { + for (const auto& pEllipsoid : _ellipsoids) { + if (pEllipsoid->getPath() == path) { + return pEllipsoid.get(); + } + } + + return nullptr; +} + +const std::vector>& AssetRegistry::getEllipsoids() const { + return _ellipsoids; +} + OmniTileset& AssetRegistry::addTileset(const pxr::SdfPath& path) { return *_tilesets.insert(_tilesets.end(), std::make_unique(_pContext, path, _tilesetId++))->get(); } @@ -349,6 +372,8 @@ const std::vector>& AssetRegistry::getC AssetType AssetRegistry::getAssetType(const pxr::SdfPath& path) const { if (getData(path)) { return AssetType::DATA; + } else if (getEllipsoid(path)) { + return AssetType::ELLIPSOID; } else if (getTileset(path)) { return AssetType::TILESET; } else if (getIonRasterOverlay(path)) { @@ -375,6 +400,7 @@ bool AssetRegistry::hasAsset(const pxr::SdfPath& path) const { void AssetRegistry::clear() { _datas.clear(); + _ellipsoids.clear(); _tilesets.clear(); _ionRasterOverlays.clear(); _polygonRasterOverlays.clear(); diff --git a/src/core/src/OmniEllipsoid.cpp b/src/core/src/OmniEllipsoid.cpp new file mode 100644 index 00000000..74c42e78 --- /dev/null +++ b/src/core/src/OmniEllipsoid.cpp @@ -0,0 +1,33 @@ +#include "cesium/omniverse/OmniEllipsoid.h" + +#include "cesium/omniverse/Context.h" +#include "cesium/omniverse/UsdUtil.h" + +#include +#include + +namespace cesium::omniverse { + +OmniEllipsoid::OmniEllipsoid(Context* pContext, const pxr::SdfPath& path) + : _pContext(pContext) + , _path(path) {} + +const pxr::SdfPath& OmniEllipsoid::getPath() const { + return _path; +} + +CesiumGeospatial::Ellipsoid OmniEllipsoid::getEllipsoid() const { + const auto cesiumEllipsoid = UsdUtil::getCesiumEllipsoid(_pContext->getUsdStage(), _path); + + glm::dvec3 radii(0.0); + + if (UsdUtil::isSchemaValid(cesiumEllipsoid)) { + pxr::GfVec3d radiiUsd; + cesiumEllipsoid.GetRadiiAttr().Get(&radiiUsd); + radii = UsdUtil::usdToGlmVector(radiiUsd); + } + + return {radii}; +} + +} // namespace cesium::omniverse diff --git a/src/core/src/OmniGeoreference.cpp b/src/core/src/OmniGeoreference.cpp index ec678d2d..7df0d858 100644 --- a/src/core/src/OmniGeoreference.cpp +++ b/src/core/src/OmniGeoreference.cpp @@ -1,6 +1,8 @@ #include "cesium/omniverse/OmniGeoreference.h" +#include "cesium/omniverse/AssetRegistry.h" #include "cesium/omniverse/Context.h" +#include "cesium/omniverse/OmniEllipsoid.h" #include "cesium/omniverse/UsdUtil.h" #include @@ -39,6 +41,22 @@ CesiumGeospatial::Cartographic OmniGeoreference::getOrigin() const { return {glm::radians(longitude), glm::radians(latitude), height}; } +pxr::SdfPath OmniGeoreference::getEllipsoidPath() const { + const auto cesiumGeoreference = UsdUtil::getCesiumGeoreference(_pContext->getUsdStage(), _path); + if (!UsdUtil::isSchemaValid(cesiumGeoreference)) { + return {}; + } + + pxr::SdfPathVector targets; + cesiumGeoreference.GetEllipsoidBindingRel().GetForwardedTargets(&targets); + + if (!targets.empty()) { + return targets.front(); + } + + return {}; +} + const CesiumGeospatial::Ellipsoid& OmniGeoreference::getEllipsoid() const { return _ellipsoid; } @@ -76,6 +94,9 @@ void OmniGeoreference::update() { return; } + const auto pEllipsoid = _pContext->getAssetRegistry().getEllipsoid(getEllipsoidPath()); + _ellipsoid = pEllipsoid ? pEllipsoid->getEllipsoid() : CesiumGeospatial::Ellipsoid::WGS84; + const auto ecefToUsdTransform = getLocalCoordinateSystem().getEcefToLocalTransformation(); cesiumGeoreference.GetEcefToUsdTransformAttr().Set(UsdUtil::glmToUsdMatrix(ecefToUsdTransform)); diff --git a/src/core/src/UsdNotificationHandler.cpp b/src/core/src/UsdNotificationHandler.cpp index f3b8fd9d..8ca9ead1 100644 --- a/src/core/src/UsdNotificationHandler.cpp +++ b/src/core/src/UsdNotificationHandler.cpp @@ -6,6 +6,7 @@ #include "cesium/omniverse/FabricResourceManager.h" #include "cesium/omniverse/FabricUtil.h" #include "cesium/omniverse/OmniCartographicPolygon.h" +#include "cesium/omniverse/OmniEllipsoid.h" #include "cesium/omniverse/OmniGeoreference.h" #include "cesium/omniverse/OmniGlobeAnchor.h" #include "cesium/omniverse/OmniIonRasterOverlay.h" @@ -110,6 +111,18 @@ void updateGeoreferenceBindings(const Context& context) { } } +void updateEllipsoidBindings(const Context& context, const pxr::SdfPath& ellipsoidPath) { + const auto& georeferences = context.getAssetRegistry().getGeoreferences(); + + // Update georeferences that reference this ellipsoid + for (const auto& pGeoreference : georeferences) { + if (pGeoreference->getEllipsoidPath() == ellipsoidPath) { + pGeoreference->update(); + updateGeoreferenceBindings(context); + } + } +} + bool isFirstData(const Context& context, const pxr::SdfPath& dataPath) { const auto pData = context.getAssetRegistry().getData(dataPath); const auto pFirstData = context.getAssetRegistry().getFirstData(); @@ -157,6 +170,30 @@ bool isFirstData(const Context& context, const pxr::SdfPath& dataPath) { return reloadStage; } +void processCesiumEllipsoidChanged( + const Context& context, + const pxr::SdfPath& ellipsoidPath, + const std::vector& properties) { + const auto pEllipsoid = context.getAssetRegistry().getEllipsoid(ellipsoidPath); + if (!pEllipsoid) { + return; + } + + auto updateBindings = false; + + // clang-format off + for (const auto& property : properties) { + if (property == pxr::CesiumTokens->cesiumRadii) { + updateBindings = true; + } + } + // clang-format on + + if (updateBindings) { + updateEllipsoidBindings(context, ellipsoidPath); + } +} + void processCesiumGlobeAnchorChanged( const Context& context, const pxr::SdfPath& globeAnchorPath, @@ -682,6 +719,11 @@ void processUsdShaderChanged( return reloadStage; } +void processCesiumEllipsoidRemoved(Context& context, const pxr::SdfPath& ellipsoidPath) { + context.getAssetRegistry().removeEllipsoid(ellipsoidPath); + updateEllipsoidBindings(context, ellipsoidPath); +} + void processCesiumTilesetRemoved(Context& context, const pxr::SdfPath& tilesetPath) { context.getAssetRegistry().removeTileset(tilesetPath); } @@ -747,6 +789,15 @@ void processCesiumCartographicPolygonRemoved(Context& context, const pxr::SdfPat return isFirstData(context, dataPath); } +void processCesiumEllipsoidAdded(Context& context, const pxr::SdfPath& ellipsoidPath) { + if (context.getAssetRegistry().getGlobeAnchor(ellipsoidPath)) { + return; + } + + context.getAssetRegistry().addEllipsoid(ellipsoidPath); + updateEllipsoidBindings(context, ellipsoidPath); +} + void processCesiumGlobeAnchorAdded(Context& context, const pxr::SdfPath& globeAnchorPath) { if (context.getAssetRegistry().getGlobeAnchor(globeAnchorPath)) { return; @@ -937,6 +988,9 @@ bool UsdNotificationHandler::processChangedPrim(const ChangedPrim& changedPrim) case ChangedPrimType::CESIUM_DATA: reloadStage = processCesiumDataChanged(*_pContext, changedPrim.primPath, changedPrim.properties); break; + case ChangedPrimType::CESIUM_ELLIPSOID: + processCesiumEllipsoidChanged(*_pContext, changedPrim.primPath, changedPrim.properties); + break; case ChangedPrimType::CESIUM_TILESET: processCesiumTilesetChanged(*_pContext, changedPrim.primPath, changedPrim.properties); break; @@ -982,6 +1036,9 @@ bool UsdNotificationHandler::processChangedPrim(const ChangedPrim& changedPrim) case ChangedPrimType::CESIUM_DATA: reloadStage = processCesiumDataAdded(*_pContext, changedPrim.primPath); break; + case ChangedPrimType::CESIUM_ELLIPSOID: + processCesiumEllipsoidAdded(*_pContext, changedPrim.primPath); + break; case ChangedPrimType::CESIUM_TILESET: processCesiumTilesetAdded(*_pContext, changedPrim.primPath); break; @@ -1022,6 +1079,9 @@ bool UsdNotificationHandler::processChangedPrim(const ChangedPrim& changedPrim) case ChangedPrimType::CESIUM_DATA: reloadStage = processCesiumDataRemoved(*_pContext, changedPrim.primPath); break; + case ChangedPrimType::CESIUM_ELLIPSOID: + processCesiumEllipsoidRemoved(*_pContext, changedPrim.primPath); + break; case ChangedPrimType::CESIUM_TILESET: processCesiumTilesetRemoved(*_pContext, changedPrim.primPath); break; @@ -1123,6 +1183,14 @@ void UsdNotificationHandler::onPrimRemoved(const pxr::SdfPath& primPath) { } // Remove prims in the asset registry + const auto& ellipsoids = _pContext->getAssetRegistry().getEllipsoids(); + for (const auto& pEllipsoid : ellipsoids) { + const auto ellipsoidPath = pEllipsoid->getPath(); + if (isPrimOrDescendant(ellipsoidPath, primPath)) { + insertRemovedPrim(ellipsoidPath, ChangedPrimType::CESIUM_ELLIPSOID); + } + } + const auto& tilesets = _pContext->getAssetRegistry().getTilesets(); for (const auto& pTileset : tilesets) { const auto tilesetPath = pTileset->getPath(); @@ -1214,6 +1282,8 @@ void UsdNotificationHandler::insertPropertyChanged( UsdNotificationHandler::ChangedPrimType UsdNotificationHandler::getTypeFromStage(const pxr::SdfPath& path) const { if (UsdUtil::isCesiumData(_pContext->getUsdStage(), path)) { return ChangedPrimType::CESIUM_DATA; + } else if (UsdUtil::isCesiumEllipsoid(_pContext->getUsdStage(), path)) { + return ChangedPrimType::CESIUM_ELLIPSOID; } else if (UsdUtil::isCesiumTileset(_pContext->getUsdStage(), path)) { return ChangedPrimType::CESIUM_TILESET; } else if (UsdUtil::isCesiumIonRasterOverlay(_pContext->getUsdStage(), path)) { @@ -1249,6 +1319,8 @@ UsdNotificationHandler::getTypeFromAssetRegistry(const pxr::SdfPath& path) const switch (assetType) { case AssetType::DATA: return ChangedPrimType::CESIUM_DATA; + case AssetType::ELLIPSOID: + return ChangedPrimType::CESIUM_ELLIPSOID; case AssetType::TILESET: return ChangedPrimType::CESIUM_TILESET; case AssetType::ION_RASTER_OVERLAY: diff --git a/src/core/src/UsdUtil.cpp b/src/core/src/UsdUtil.cpp index 23f71a85..711f2c33 100644 --- a/src/core/src/UsdUtil.cpp +++ b/src/core/src/UsdUtil.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -315,6 +316,10 @@ pxr::CesiumData defineCesiumData(const pxr::UsdStageWeakPtr& pStage, const pxr:: return pxr::CesiumData::Define(pStage, path); } +pxr::CesiumEllipsoid defineCesiumEllipsoid(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path) { + return pxr::CesiumEllipsoid::Define(pStage, path); +} + pxr::CesiumTileset defineCesiumTileset(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path) { return pxr::CesiumTileset::Define(pStage, path); } @@ -346,6 +351,10 @@ pxr::CesiumData getCesiumData(const pxr::UsdStageWeakPtr& pStage, const pxr::Sdf return pxr::CesiumData::Get(pStage, path); } +pxr::CesiumEllipsoid getCesiumEllipsoid(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path) { + return pxr::CesiumEllipsoid::Get(pStage, path); +} + pxr::CesiumTileset getCesiumTileset(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path) { return pxr::CesiumTileset::Get(pStage, path); } @@ -413,6 +422,15 @@ bool isCesiumData(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path) return prim.IsA(); } +bool isCesiumEllipsoid(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path) { + const auto prim = pStage->GetPrimAtPath(path); + if (!prim.IsValid()) { + return false; + } + + return prim.IsA(); +} + bool isCesiumTileset(const pxr::UsdStageWeakPtr& pStage, const pxr::SdfPath& path) { const auto prim = pStage->GetPrimAtPath(path); if (!prim.IsValid()) { diff --git a/src/plugins/CesiumUsdSchemas/CMakeLists.txt b/src/plugins/CesiumUsdSchemas/CMakeLists.txt index dbc1643f..0dfdec9a 100644 --- a/src/plugins/CesiumUsdSchemas/CMakeLists.txt +++ b/src/plugins/CesiumUsdSchemas/CMakeLists.txt @@ -2,6 +2,7 @@ include(Macros) set(SOURCES "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/data.cpp" + "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/ellipsoid.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/globeAnchorAPI.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/georeference.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/ionServer.cpp" @@ -18,6 +19,7 @@ set(PY_BINDING_SOURCES "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/module.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/moduleDeps.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/wrapData.cpp" + "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/wrapEllipsoid.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/wrapGlobeAnchorAPI.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/wrapGeoreference.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/CesiumUsdSchemas/wrapIonServer.cpp" diff --git a/src/plugins/CesiumUsdSchemas/generatedSchema.usda.in b/src/plugins/CesiumUsdSchemas/generatedSchema.usda.in index dad3f808..07d5aed9 100644 --- a/src/plugins/CesiumUsdSchemas/generatedSchema.usda.in +++ b/src/plugins/CesiumUsdSchemas/generatedSchema.usda.in @@ -91,9 +91,13 @@ class CesiumGeoreferencePrim "CesiumGeoreferencePrim" ( displayName = "ECEF to USD Transform (read only)" doc = "The 4x4 transformation matrix (row major) from global ECEF coordinates to USD stage coordinates based on the georeference origin (read only)." ) + rel cesium:ellipsoidBinding ( + displayName = "Ellipsoid Binding" + doc = "The ellipsoid." + ) double cesium:georeferenceOrigin:height = 2250 ( displayName = "Georeference Origin Height" - doc = "The height of the origin in meters above the WGS84 ellipsoid. Do not confuse this with a geoid height or height above mean sea level, which can be tens of meters higher or lower depending on where in the world the origin is located." + doc = "The height of the origin in meters above the ellipsoid. Do not confuse this with a geoid height or height above mean sea level, which can be tens of meters higher or lower depending on where in the world the origin is located." ) double cesium:georeferenceOrigin:latitude = 39.736401 ( displayName = "Georeference Original Latitude" @@ -697,3 +701,13 @@ class "CesiumGlobeAnchorSchemaAPI" ( ) } +class CesiumEllipsoidPrim "CesiumEllipsoidPrim" ( + doc = "An ellipsoid." +) +{ + double3 cesium:radii = (0, 0, 0) ( + displayName = "Radii" + doc = "The radii of this ellipsoid. The X coordinate should be the radius of the largest axis and the Z coordinate should be the radius of the smallest axis." + ) +} + diff --git a/src/plugins/CesiumUsdSchemas/plugInfo.json.in b/src/plugins/CesiumUsdSchemas/plugInfo.json.in index f4a75ede..820d5e3b 100644 --- a/src/plugins/CesiumUsdSchemas/plugInfo.json.in +++ b/src/plugins/CesiumUsdSchemas/plugInfo.json.in @@ -16,6 +16,16 @@ ], "schemaKind": "concreteTyped" }, + "CesiumEllipsoid": { + "alias": { + "UsdSchemaBase": "CesiumEllipsoidPrim" + }, + "autoGenerated": true, + "bases": [ + "UsdTyped" + ], + "schemaKind": "concreteTyped" + }, "CesiumGeoreference": { "alias": { "UsdSchemaBase": "CesiumGeoreferencePrim" diff --git a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/ellipsoid.cpp b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/ellipsoid.cpp new file mode 100644 index 00000000..9b1a31be --- /dev/null +++ b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/ellipsoid.cpp @@ -0,0 +1,139 @@ +#include ".//ellipsoid.h" +#include "pxr/usd/usd/schemaRegistry.h" +#include "pxr/usd/usd/typed.h" + +#include "pxr/usd/sdf/types.h" +#include "pxr/usd/sdf/assetPath.h" + +PXR_NAMESPACE_OPEN_SCOPE + +// Register the schema with the TfType system. +TF_REGISTRY_FUNCTION(TfType) +{ + TfType::Define >(); + + // Register the usd prim typename as an alias under UsdSchemaBase. This + // enables one to call + // TfType::Find().FindDerivedByName("CesiumEllipsoidPrim") + // to find TfType, which is how IsA queries are + // answered. + TfType::AddAlias("CesiumEllipsoidPrim"); +} + +/* virtual */ +CesiumEllipsoid::~CesiumEllipsoid() +{ +} + +/* static */ +CesiumEllipsoid +CesiumEllipsoid::Get(const UsdStagePtr &stage, const SdfPath &path) +{ + if (!stage) { + TF_CODING_ERROR("Invalid stage"); + return CesiumEllipsoid(); + } + return CesiumEllipsoid(stage->GetPrimAtPath(path)); +} + +/* static */ +CesiumEllipsoid +CesiumEllipsoid::Define( + const UsdStagePtr &stage, const SdfPath &path) +{ + static TfToken usdPrimTypeName("CesiumEllipsoidPrim"); + if (!stage) { + TF_CODING_ERROR("Invalid stage"); + return CesiumEllipsoid(); + } + return CesiumEllipsoid( + stage->DefinePrim(path, usdPrimTypeName)); +} + +/* virtual */ +UsdSchemaKind CesiumEllipsoid::_GetSchemaKind() const +{ + return CesiumEllipsoid::schemaKind; +} + +/* static */ +const TfType & +CesiumEllipsoid::_GetStaticTfType() +{ + static TfType tfType = TfType::Find(); + return tfType; +} + +/* static */ +bool +CesiumEllipsoid::_IsTypedSchema() +{ + static bool isTyped = _GetStaticTfType().IsA(); + return isTyped; +} + +/* virtual */ +const TfType & +CesiumEllipsoid::_GetTfType() const +{ + return _GetStaticTfType(); +} + +UsdAttribute +CesiumEllipsoid::GetRadiiAttr() const +{ + return GetPrim().GetAttribute(CesiumTokens->cesiumRadii); +} + +UsdAttribute +CesiumEllipsoid::CreateRadiiAttr(VtValue const &defaultValue, bool writeSparsely) const +{ + return UsdSchemaBase::_CreateAttr(CesiumTokens->cesiumRadii, + SdfValueTypeNames->Double3, + /* custom = */ false, + SdfVariabilityVarying, + defaultValue, + writeSparsely); +} + +namespace { +static inline TfTokenVector +_ConcatenateAttributeNames(const TfTokenVector& left,const TfTokenVector& right) +{ + TfTokenVector result; + result.reserve(left.size() + right.size()); + result.insert(result.end(), left.begin(), left.end()); + result.insert(result.end(), right.begin(), right.end()); + return result; +} +} + +/*static*/ +const TfTokenVector& +CesiumEllipsoid::GetSchemaAttributeNames(bool includeInherited) +{ + static TfTokenVector localNames = { + CesiumTokens->cesiumRadii, + }; + static TfTokenVector allNames = + _ConcatenateAttributeNames( + UsdTyped::GetSchemaAttributeNames(true), + localNames); + + if (includeInherited) + return allNames; + else + return localNames; +} + +PXR_NAMESPACE_CLOSE_SCOPE + +// ===================================================================== // +// Feel free to add custom code below this line. It will be preserved by +// the code generator. +// +// Just remember to wrap code in the appropriate delimiters: +// 'PXR_NAMESPACE_OPEN_SCOPE', 'PXR_NAMESPACE_CLOSE_SCOPE'. +// ===================================================================== // +// --(BEGIN CUSTOM CODE)-- diff --git a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/ellipsoid.h b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/ellipsoid.h new file mode 100644 index 00000000..8e4f0a07 --- /dev/null +++ b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/ellipsoid.h @@ -0,0 +1,165 @@ +#ifndef CESIUMUSDSCHEMAS_GENERATED_ELLIPSOID_H +#define CESIUMUSDSCHEMAS_GENERATED_ELLIPSOID_H + +/// \file CesiumUsdSchemas/ellipsoid.h + +#include "pxr/pxr.h" +#include ".//api.h" +#include "pxr/usd/usd/typed.h" +#include "pxr/usd/usd/prim.h" +#include "pxr/usd/usd/stage.h" +#include ".//tokens.h" + +#include "pxr/base/vt/value.h" + +#include "pxr/base/gf/vec3d.h" +#include "pxr/base/gf/vec3f.h" +#include "pxr/base/gf/matrix4d.h" + +#include "pxr/base/tf/token.h" +#include "pxr/base/tf/type.h" + +PXR_NAMESPACE_OPEN_SCOPE + +class SdfAssetPath; + +// -------------------------------------------------------------------------- // +// CESIUMELLIPSOIDPRIM // +// -------------------------------------------------------------------------- // + +/// \class CesiumEllipsoid +/// +/// An ellipsoid. +/// +class CesiumEllipsoid : public UsdTyped +{ +public: + /// Compile time constant representing what kind of schema this class is. + /// + /// \sa UsdSchemaKind + static const UsdSchemaKind schemaKind = UsdSchemaKind::ConcreteTyped; + + /// Construct a CesiumEllipsoid on UsdPrim \p prim . + /// Equivalent to CesiumEllipsoid::Get(prim.GetStage(), prim.GetPath()) + /// for a \em valid \p prim, but will not immediately throw an error for + /// an invalid \p prim + explicit CesiumEllipsoid(const UsdPrim& prim=UsdPrim()) + : UsdTyped(prim) + { + } + + /// Construct a CesiumEllipsoid on the prim held by \p schemaObj . + /// Should be preferred over CesiumEllipsoid(schemaObj.GetPrim()), + /// as it preserves SchemaBase state. + explicit CesiumEllipsoid(const UsdSchemaBase& schemaObj) + : UsdTyped(schemaObj) + { + } + + /// Destructor. + CESIUMUSDSCHEMAS_API + virtual ~CesiumEllipsoid(); + + /// Return a vector of names of all pre-declared attributes for this schema + /// class and all its ancestor classes. Does not include attributes that + /// may be authored by custom/extended methods of the schemas involved. + CESIUMUSDSCHEMAS_API + static const TfTokenVector & + GetSchemaAttributeNames(bool includeInherited=true); + + /// Return a CesiumEllipsoid holding the prim adhering to this + /// schema at \p path on \p stage. If no prim exists at \p path on + /// \p stage, or if the prim at that path does not adhere to this schema, + /// return an invalid schema object. This is shorthand for the following: + /// + /// \code + /// CesiumEllipsoid(stage->GetPrimAtPath(path)); + /// \endcode + /// + CESIUMUSDSCHEMAS_API + static CesiumEllipsoid + Get(const UsdStagePtr &stage, const SdfPath &path); + + /// Attempt to ensure a \a UsdPrim adhering to this schema at \p path + /// is defined (according to UsdPrim::IsDefined()) on this stage. + /// + /// If a prim adhering to this schema at \p path is already defined on this + /// stage, return that prim. Otherwise author an \a SdfPrimSpec with + /// \a specifier == \a SdfSpecifierDef and this schema's prim type name for + /// the prim at \p path at the current EditTarget. Author \a SdfPrimSpec s + /// with \p specifier == \a SdfSpecifierDef and empty typeName at the + /// current EditTarget for any nonexistent, or existing but not \a Defined + /// ancestors. + /// + /// The given \a path must be an absolute prim path that does not contain + /// any variant selections. + /// + /// If it is impossible to author any of the necessary PrimSpecs, (for + /// example, in case \a path cannot map to the current UsdEditTarget's + /// namespace) issue an error and return an invalid \a UsdPrim. + /// + /// Note that this method may return a defined prim whose typeName does not + /// specify this schema class, in case a stronger typeName opinion overrides + /// the opinion at the current EditTarget. + /// + CESIUMUSDSCHEMAS_API + static CesiumEllipsoid + Define(const UsdStagePtr &stage, const SdfPath &path); + +protected: + /// Returns the kind of schema this class belongs to. + /// + /// \sa UsdSchemaKind + CESIUMUSDSCHEMAS_API + UsdSchemaKind _GetSchemaKind() const override; + +private: + // needs to invoke _GetStaticTfType. + friend class UsdSchemaRegistry; + CESIUMUSDSCHEMAS_API + static const TfType &_GetStaticTfType(); + + static bool _IsTypedSchema(); + + // override SchemaBase virtuals. + CESIUMUSDSCHEMAS_API + const TfType &_GetTfType() const override; + +public: + // --------------------------------------------------------------------- // + // RADII + // --------------------------------------------------------------------- // + /// The radii of this ellipsoid. The X coordinate should be the radius of the largest axis and the Z coordinate should be the radius of the smallest axis. + /// + /// | || + /// | -- | -- | + /// | Declaration | `double3 cesium:radii = (0, 0, 0)` | + /// | C++ Type | GfVec3d | + /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Double3 | + CESIUMUSDSCHEMAS_API + UsdAttribute GetRadiiAttr() const; + + /// See GetRadiiAttr(), and also + /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create. + /// If specified, author \p defaultValue as the attribute's default, + /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true - + /// the default for \p writeSparsely is \c false. + CESIUMUSDSCHEMAS_API + UsdAttribute CreateRadiiAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; + +public: + // ===================================================================== // + // Feel free to add custom code below this line, it will be preserved by + // the code generator. + // + // Just remember to: + // - Close the class declaration with }; + // - Close the namespace with PXR_NAMESPACE_CLOSE_SCOPE + // - Close the include guard with #endif + // ===================================================================== // + // --(BEGIN CUSTOM CODE)-- +}; + +PXR_NAMESPACE_CLOSE_SCOPE + +#endif diff --git a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/georeference.cpp b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/georeference.cpp index 583212b3..41c78b58 100644 --- a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/georeference.cpp +++ b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/georeference.cpp @@ -148,6 +148,19 @@ CesiumGeoreference::CreateEcefToUsdTransformAttr(VtValue const &defaultValue, bo writeSparsely); } +UsdRelationship +CesiumGeoreference::GetEllipsoidBindingRel() const +{ + return GetPrim().GetRelationship(CesiumTokens->cesiumEllipsoidBinding); +} + +UsdRelationship +CesiumGeoreference::CreateEllipsoidBindingRel() const +{ + return GetPrim().CreateRelationship(CesiumTokens->cesiumEllipsoidBinding, + /* custom = */ false); +} + namespace { static inline TfTokenVector _ConcatenateAttributeNames(const TfTokenVector& left,const TfTokenVector& right) diff --git a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/georeference.h b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/georeference.h index 82aa26b2..5e98ffa3 100644 --- a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/georeference.h +++ b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/georeference.h @@ -173,7 +173,7 @@ class CesiumGeoreference : public UsdTyped // --------------------------------------------------------------------- // // GEOREFERENCEORIGINHEIGHT // --------------------------------------------------------------------- // - /// The height of the origin in meters above the WGS84 ellipsoid. Do not confuse this with a geoid height or height above mean sea level, which can be tens of meters higher or lower depending on where in the world the origin is located. + /// The height of the origin in meters above the ellipsoid. Do not confuse this with a geoid height or height above mean sea level, which can be tens of meters higher or lower depending on where in the world the origin is located. /// /// | || /// | -- | -- | @@ -213,6 +213,20 @@ class CesiumGeoreference : public UsdTyped CESIUMUSDSCHEMAS_API UsdAttribute CreateEcefToUsdTransformAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; +public: + // --------------------------------------------------------------------- // + // ELLIPSOIDBINDING + // --------------------------------------------------------------------- // + /// The ellipsoid. + /// + CESIUMUSDSCHEMAS_API + UsdRelationship GetEllipsoidBindingRel() const; + + /// See GetEllipsoidBindingRel(), and also + /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create + CESIUMUSDSCHEMAS_API + UsdRelationship CreateEllipsoidBindingRel() const; + public: // ===================================================================== // // Feel free to add custom code below this line, it will be preserved by diff --git a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/module.cpp b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/module.cpp index e6813861..2734dab0 100644 --- a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/module.cpp +++ b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/module.cpp @@ -6,6 +6,7 @@ PXR_NAMESPACE_USING_DIRECTIVE TF_WRAP_MODULE { TF_WRAP(CesiumData); + TF_WRAP(CesiumEllipsoid); TF_WRAP(CesiumGeoreference); TF_WRAP(CesiumGlobeAnchorAPI); TF_WRAP(CesiumIonServer); diff --git a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/tokens.cpp b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/tokens.cpp index a9544958..af5f36a1 100644 --- a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/tokens.cpp +++ b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/tokens.cpp @@ -27,6 +27,7 @@ CesiumTokensType::CesiumTokensType() : cesiumDisplayName("cesium:displayName", TfToken::Immortal), cesiumEast("cesium:east", TfToken::Immortal), cesiumEcefToUsdTransform("cesium:ecefToUsdTransform", TfToken::Immortal), + cesiumEllipsoidBinding("cesium:ellipsoidBinding", TfToken::Immortal), cesiumEnableFogCulling("cesium:enableFogCulling", TfToken::Immortal), cesiumEnableFrustumCulling("cesium:enableFrustumCulling", TfToken::Immortal), cesiumEnforceCulledScreenSpaceError("cesium:enforceCulledScreenSpaceError", TfToken::Immortal), @@ -63,6 +64,7 @@ CesiumTokensType::CesiumTokensType() : cesiumPreloadSiblings("cesium:preloadSiblings", TfToken::Immortal), cesiumProjectDefaultIonAccessToken("cesium:projectDefaultIonAccessToken", TfToken::Immortal), cesiumProjectDefaultIonAccessTokenId("cesium:projectDefaultIonAccessTokenId", TfToken::Immortal), + cesiumRadii("cesium:radii", TfToken::Immortal), cesiumRasterOverlayBinding("cesium:rasterOverlayBinding", TfToken::Immortal), cesiumRootTilesX("cesium:rootTilesX", TfToken::Immortal), cesiumRootTilesY("cesium:rootTilesY", TfToken::Immortal), @@ -114,6 +116,7 @@ CesiumTokensType::CesiumTokensType() : cesiumDisplayName, cesiumEast, cesiumEcefToUsdTransform, + cesiumEllipsoidBinding, cesiumEnableFogCulling, cesiumEnableFrustumCulling, cesiumEnforceCulledScreenSpaceError, @@ -150,6 +153,7 @@ CesiumTokensType::CesiumTokensType() : cesiumPreloadSiblings, cesiumProjectDefaultIonAccessToken, cesiumProjectDefaultIonAccessTokenId, + cesiumRadii, cesiumRasterOverlayBinding, cesiumRootTilesX, cesiumRootTilesY, diff --git a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/tokens.h b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/tokens.h index 1b77f7de..57d67056 100644 --- a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/tokens.h +++ b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/tokens.h @@ -135,6 +135,10 @@ struct CesiumTokensType { /// /// CesiumGeoreference const TfToken cesiumEcefToUsdTransform; + /// \brief "cesium:ellipsoidBinding" + /// + /// CesiumGeoreference + const TfToken cesiumEllipsoidBinding; /// \brief "cesium:enableFogCulling" /// /// CesiumTileset @@ -279,6 +283,10 @@ struct CesiumTokensType { /// /// CesiumIonServer const TfToken cesiumProjectDefaultIonAccessTokenId; + /// \brief "cesium:radii" + /// + /// CesiumEllipsoid + const TfToken cesiumRadii; /// \brief "cesium:rasterOverlayBinding" /// /// CesiumTileset diff --git a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/wrapEllipsoid.cpp b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/wrapEllipsoid.cpp new file mode 100644 index 00000000..3c120003 --- /dev/null +++ b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/wrapEllipsoid.cpp @@ -0,0 +1,115 @@ +#include ".//ellipsoid.h" +#include "pxr/usd/usd/schemaBase.h" + +#include "pxr/usd/sdf/primSpec.h" + +#include "pxr/usd/usd/pyConversions.h" +#include "pxr/base/tf/pyContainerConversions.h" +#include "pxr/base/tf/pyResultConversions.h" +#include "pxr/base/tf/pyUtils.h" +#include "pxr/base/tf/wrapTypeHelpers.h" + +#include + +#include + +using namespace boost::python; + +PXR_NAMESPACE_USING_DIRECTIVE + +namespace { + +#define WRAP_CUSTOM \ + template static void _CustomWrapCode(Cls &_class) + +// fwd decl. +WRAP_CUSTOM; + + +static UsdAttribute +_CreateRadiiAttr(CesiumEllipsoid &self, + object defaultVal, bool writeSparsely) { + return self.CreateRadiiAttr( + UsdPythonToSdfType(defaultVal, SdfValueTypeNames->Double3), writeSparsely); +} + +static std::string +_Repr(const CesiumEllipsoid &self) +{ + std::string primRepr = TfPyRepr(self.GetPrim()); + return TfStringPrintf( + "CesiumUsdSchemas.Ellipsoid(%s)", + primRepr.c_str()); +} + +} // anonymous namespace + +void wrapCesiumEllipsoid() +{ + typedef CesiumEllipsoid This; + + class_ > + cls("Ellipsoid"); + + cls + .def(init(arg("prim"))) + .def(init(arg("schemaObj"))) + .def(TfTypePythonClass()) + + .def("Get", &This::Get, (arg("stage"), arg("path"))) + .staticmethod("Get") + + .def("Define", &This::Define, (arg("stage"), arg("path"))) + .staticmethod("Define") + + .def("GetSchemaAttributeNames", + &This::GetSchemaAttributeNames, + arg("includeInherited")=true, + return_value_policy()) + .staticmethod("GetSchemaAttributeNames") + + .def("_GetStaticTfType", (TfType const &(*)()) TfType::Find, + return_value_policy()) + .staticmethod("_GetStaticTfType") + + .def(!self) + + + .def("GetRadiiAttr", + &This::GetRadiiAttr) + .def("CreateRadiiAttr", + &_CreateRadiiAttr, + (arg("defaultValue")=object(), + arg("writeSparsely")=false)) + + .def("__repr__", ::_Repr) + ; + + _CustomWrapCode(cls); +} + +// ===================================================================== // +// Feel free to add custom code below this line, it will be preserved by +// the code generator. The entry point for your custom code should look +// minimally like the following: +// +// WRAP_CUSTOM { +// _class +// .def("MyCustomMethod", ...) +// ; +// } +// +// Of course any other ancillary or support code may be provided. +// +// Just remember to wrap code in the appropriate delimiters: +// 'namespace {', '}'. +// +// ===================================================================== // +// --(BEGIN CUSTOM CODE)-- + +namespace { + +WRAP_CUSTOM { +} + +} diff --git a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/wrapGeoreference.cpp b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/wrapGeoreference.cpp index 12bd6ea1..13067309 100644 --- a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/wrapGeoreference.cpp +++ b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/wrapGeoreference.cpp @@ -124,6 +124,11 @@ void wrapCesiumGeoreference() (arg("defaultValue")=object(), arg("writeSparsely")=false)) + + .def("GetEllipsoidBindingRel", + &This::GetEllipsoidBindingRel) + .def("CreateEllipsoidBindingRel", + &This::CreateEllipsoidBindingRel) .def("__repr__", ::_Repr) ; diff --git a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/wrapTokens.cpp b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/wrapTokens.cpp index 74568a3b..448eab2d 100644 --- a/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/wrapTokens.cpp +++ b/src/plugins/CesiumUsdSchemas/src/CesiumUsdSchemas/wrapTokens.cpp @@ -65,6 +65,7 @@ void wrapCesiumTokens() _AddToken(cls, "cesiumDisplayName", CesiumTokens->cesiumDisplayName); _AddToken(cls, "cesiumEast", CesiumTokens->cesiumEast); _AddToken(cls, "cesiumEcefToUsdTransform", CesiumTokens->cesiumEcefToUsdTransform); + _AddToken(cls, "cesiumEllipsoidBinding", CesiumTokens->cesiumEllipsoidBinding); _AddToken(cls, "cesiumEnableFogCulling", CesiumTokens->cesiumEnableFogCulling); _AddToken(cls, "cesiumEnableFrustumCulling", CesiumTokens->cesiumEnableFrustumCulling); _AddToken(cls, "cesiumEnforceCulledScreenSpaceError", CesiumTokens->cesiumEnforceCulledScreenSpaceError); @@ -101,6 +102,7 @@ void wrapCesiumTokens() _AddToken(cls, "cesiumPreloadSiblings", CesiumTokens->cesiumPreloadSiblings); _AddToken(cls, "cesiumProjectDefaultIonAccessToken", CesiumTokens->cesiumProjectDefaultIonAccessToken); _AddToken(cls, "cesiumProjectDefaultIonAccessTokenId", CesiumTokens->cesiumProjectDefaultIonAccessTokenId); + _AddToken(cls, "cesiumRadii", CesiumTokens->cesiumRadii); _AddToken(cls, "cesiumRasterOverlayBinding", CesiumTokens->cesiumRasterOverlayBinding); _AddToken(cls, "cesiumRootTilesX", CesiumTokens->cesiumRootTilesX); _AddToken(cls, "cesiumRootTilesY", CesiumTokens->cesiumRootTilesY);