diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dffc4b733..d416075593 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,489 @@ # Change Log +## [23.08] - 2023-07-21 + +We anticipate moving to the [VFX Reference Platform CY2022](https://vfxplatform.com/) +and C++17 in an upcoming release. Note that as part of the migration to C++17, +some API signatures will change from using boost to using the std equivalent. + +### Build + +- Made numerous changes to remove uses of boost from parts of USD and usdImaging + as part of ongoing effort to remove boost throughout the code base. + (Issue: [#2203](https://github.com/PixarAnimationStudios/USD/issues/2203), + [#2250](https://github.com/PixarAnimationStudios/OpenUSD/issues/2250), + [#2257](https://github.com/PixarAnimationStudios/OpenUSD/issues/2257), + [#2272](https://github.com/PixarAnimationStudios/OpenUSD/issues/2272), + [#2243](https://github.com/PixarAnimationStudios/OpenUSD/issues/2243), + [#2318](https://github.com/PixarAnimationStudios/OpenUSD/issues/2318), + [#2211](https://github.com/PixarAnimationStudios/OpenUSD/issues/2211), + [#2236](https://github.com/PixarAnimationStudios/OpenUSD/issues/2236), + [#2203](https://github.com/PixarAnimationStudios/OpenUSD/issues/2203), + PR: [#2205](https://github.com/PixarAnimationStudios/OpenUSD/pull/2205), + [#2207](https://github.com/PixarAnimationStudios/OpenUSD/pull/2207), + [#2208](https://github.com/PixarAnimationStudios/OpenUSD/pull/2208), + [#2209](https://github.com/PixarAnimationStudios/OpenUSD/pull/2209), + [#2214](https://github.com/PixarAnimationStudios/OpenUSD/pull/2214), + [#2237](https://github.com/PixarAnimationStudios/OpenUSD/pull/2237), + [#2244](https://github.com/PixarAnimationStudios/OpenUSD/pull/2244), + [#2251](https://github.com/PixarAnimationStudios/OpenUSD/pull/2251), + [#2252](https://github.com/PixarAnimationStudios/OpenUSD/pull/2252), + [#2253](https://github.com/PixarAnimationStudios/OpenUSD/pull/2253), + [#2259](https://github.com/PixarAnimationStudios/OpenUSD/pull/2259), + [#2261](https://github.com/PixarAnimationStudios/OpenUSD/pull/2261), + [#2270](https://github.com/PixarAnimationStudios/OpenUSD/pull/2270), + [#2271](https://github.com/PixarAnimationStudios/OpenUSD/pull/2271), + [#2273](https://github.com/PixarAnimationStudios/OpenUSD/pull/2273), + [#2285](https://github.com/PixarAnimationStudios/OpenUSD/pull/2285), + [#2292](https://github.com/PixarAnimationStudios/OpenUSD/pull/2292), + [#2293](https://github.com/PixarAnimationStudios/OpenUSD/pull/2293), + [#2294](https://github.com/PixarAnimationStudios/OpenUSD/pull/2294), + [#2295](https://github.com/PixarAnimationStudios/OpenUSD/pull/2295), + [#2309](https://github.com/PixarAnimationStudios/OpenUSD/pull/2309), + [#2320](https://github.com/PixarAnimationStudios/OpenUSD/pull/2320), + [#2345](https://github.com/PixarAnimationStudios/OpenUSD/pull/2345)) + +- Added a new build_usd.py command line option `--cmake-build-args` which will + propagate arguments to all CMake invocations during the build process. + (PR: ([#2484](https://github.com/PixarAnimationStudios/OpenUSD/pull/2484)) + +- Updated pxrConfig.cmake to add the Python version used at build time for + downstream projects to find during their cmake build configuration step. + (PR: [#2093](https://github.com/PixarAnimationStudios/OpenUSD/pull/2093)) + +- Removed support for PySide 1.x. This had been deprecated in the 22.08 release. + +### USD + +- Sublayers are now loaded in parallel during UsdStage composition. + +- Fixed a bug in VtArray Python binding where setting values at index -1 would + do nothing. + (Issue: [#2327](https://github.com/PixarAnimationStudios/OpenUSD/issues/2327)) + +- UsdFlattenLayerStack now only adds a ".usda" extension if the tag + provided is empty. This allows client code to flatten to their + desired schema/format. + +- Deprecated spec-based functions on UsdPrimDefinition in favor of new property + definition accessors. + +- Changed some behaviors of API schema composition in prim definitions. + - Authored API schemas have been changed to be the weakest schemas instead of + the strongest schemas when composing properties in a prim definition. + - The "default" and "hidden" fields of properties can now be composed in from + a weaker API if a stronger schema with the same property has no opinion for + those fields. + - The result of UsdPrim::GetAppliedSchemas now will never contain duplicate + schema names. + (Issue: [#2336](https://github.com/PixarAnimationStudios/OpenUSD/issues/2336)) + +- Added a function to PcpDynamicFileFormatContext that allows dynamic file + formats to also compose and use attribute default values when determining the + file format arguments for a dynamic payload. + +- Updated UsdUtilsComputeAllDependencies and UsdUtilsExtractExternalReferences + to now work correctly with anonymous layer identifiers. + (Issue: [#2073](https://github.com/PixarAnimationStudios/USD/issues/2073) + +- Fixed bug where UsdUtilsComputeAllDependencies would return layers with + unexpected identifiers. + (Issue: [#2074](https://github.com/PixarAnimationStudios/USD/issues/2074) + +- Fixed an issue in which nested usdz packages could result in additional + dependencies being processed. + (Issue: [#2134](https://github.com/PixarAnimationStudios/USD/issues/2134) + +- Fixed an issue to prevent asstInfo:identifier metadata from triggering an + additional dependency when creating usdz archives. + (Issue: [#2135](https://github.com/PixarAnimationStudios/USD/issues/2135) + +- Fixed a regression in UsdUtilsModifyAssetPaths to preserve explicit + declaration of an empty SdfAssetPath. + +- Fixed a bug where UsdUtils.UsdzAssetIterator would change the process' current + working directory. + +- Updated UsdSkel to remove warnings when UsdSkel attributes are authored on a + prim but the UsdSkelBindingAPI schema is not applied. Please ensure that prims + that have authored UsdSkel attributes have the UsdSkelBindingAPI schema + applied. + +- Added stage variable expressions feature. The initial implementation supports + string-valued variables and expressions with string substitutions + (e.g., `"asset_${NAME}".usd`) in sublayer, reference, and payload asset paths, + variant selections, and asset and asset[]-valued attributes and metadata. + Additional work slated for an upcoming release include: + - Support for integer and boolean value types as well as comparison and other + functions. + - Improved change processing to avoid resync notices for affected prims when + variables are authored. + - Detailed documentation + +- Fixed error messages for invalid specs in SdfCopySpec. + (PR: [#2440](https://github.com/PixarAnimationStudios/OpenUSD/pull/2440)) + +- Removed the use of USD_SHADE_MATERIAL_BINDING_API_CHECK environment variable. + Updated UsdShadeMaterialBindingAPI application check by adding a + supportLegacyBindings argument to relevant APIs, which currently defaults to + true. Note this default will be updated when Hydra 2.0 is enabled by default. + +- Fixed thread-safety issues that could lead to crashes in UsdSkel computations. + (Issue: [#1742](https://github.com/PixarAnimationStudios/OpenUSD/issues/1742), + PR: [#2369](https://github.com/PixarAnimationStudios/OpenUSD/pull/2369)) + +### UsdImaging + +- Added UsdImagingPrimAdadpter::GetFullModelDrawMode and + UsdImagingDelegate::GetModelDrawMode to support access of model draw mode from + Hydra scene delegate. + +- Disabled shadows on the "simple" headlight. + (PR: [#2373](https://github.com/PixarAnimationStudios/OpenUSD/pull/2373)) + +- Added various updates and fixes to UsdImagingStageSceneIndex. This class is + being developed as a replacement for UsdImagingDelegate and is missing support + for UsdSkel, UsdGeomSubset, and material binding collections. Code that wants + to try the new implementation can add it to a render index by following the + example of UsdImagingGLEngine, or enable it in UsdImagingGLEngine (and + usdview) with the USDIMAGINGGL_ENGINE_ENABLE_SCENE_INDEX env var. + - Added support for coordinate systems. Clients + expecting prims of type coordSys (such as hdPrman) need to run + HdsiCoordSysPrimSceneIndex to pick up the coordinate systems from the + UsdImagingStageSceneIndex. + - Added support for material binding strength (UsdShade's bindMaterialAs). + - Improved support for selection and instancing. + - Updated to force instance interpolation for non-constant and non-uniform + primvars on point instancers. + - Updated to prefer (prefixed) primvars over custom primvars (such as + normals). + - Applied multiple fixes to native and point instancing. + - Updated to honor displayColor/Opacity authored on materials. + - Added support for showing unloaded prims as bounding boxes. + - Updated to communicate to schema adapters whether a USD property was updated + or resynced. + - Added UsdImagingRootOverridesSceneIndex and HdsiLegacyDisplayStyleOverrideSceneIndex + and used these to implement some UsdImagingGLEngine behaviors when using + scene indices. + - Added support for UsdGeomNurbsCurves and UsdGeomNurbsPatches. Note that + these are currently drawn as hulls by Storm, and not tessellated or + evaluated. + - Added both time-varying and property change invalidation for the "light" + data source. + - Made change when adding a new UsdImaging_DrawModeStandin draw mode standin + prim that now deletes its child subtree of draw mode standin prims. + - Made change that skips the draw mode processing of dirtied prims with an + existing draw mode standin ancestor. + - Made change that includes instancedBy data source in the draw mode standin + data source. + +- Updated UsdImagingGLEngine to use the scene globals scene index to set the + active render settings prim. + +- Fixed a performance regression in HdLight::Sync. + (Issue: [#2416](https://github.com/PixarAnimationStudios/OpenUSD/issues/2416)) + +- Allow population of instanced USD materials as uninstanced Hydra materials. + While Hydra doesn't directly support instanced materials yet, this allows + scenes to make use of instancing at the USD level and still render correctly. + If a UsdShadeMaterial is natively instanced on the UsdStage, it will share the + potentially numerous UsdShadeShader nodes, and the material-level parameter + interface (which can be connected to shader parameters) can be overridden on + each instance. + +- Fixed issues where certain authored transforms were being lost in certain + cases where point instancers were being instanced by native instancers, or + where transforms were authored on a point instancer's non-imageable prototype + root. + (Issue: [#1663](https://github.com/PixarAnimationStudios/OpenUSD/issues/1663), + [#2359](https://github.com/PixarAnimationStudios/OpenUSD/issues/2359)) + +- UsdImaging now returns material networks by render context, + and strips render context namespace from the terminal names. + Consequently we no longer need HdsiTerminalsResolvingSceneIndex. + Saved 30+ seconds of production shot Storm load time by keeping + Storm from traversing RenderMan-specific USD material networks + only to then immediately discard them. + +- Made change so UsdImagingDataSourceMaterial now strips the material path + prefix from names of the nodes in the network. This both makes + networks more concise to inspect and removes an unnecessary + source of superficial variation in otherwise-matching materials + recurring across models, enabling more effective de-duplication + of matching material networks across assets. + +- Made UsdImaging_PiPrototypeSceneIndex performance improvements, + reducing load time of a production shot from 67 sec to 13 sec. + +- Moved UsdImagingModelSchema to HdModelSchema. + +### Storm + +- Fixed value of aspectMask in HgiVulkanTexture::CopyBufferToTexture. + (PR: [#2442](https://github.com/PixarAnimationStudios/OpenUSD/pull/2442)) + +- Fixed a bug with GPU instance frustum culling prims with geom subsets. + (Issue: [#1892](https://github.com/PixarAnimationStudios/OpenUSD/issues/1892)) + +- Updated HdStRenderPassState::ComputeViewport to use _GetFramebufferHeight when + computing the viewport. + +- Made various fixes for Metal backend: + - Fixed null pointer checks during buffer binding. + (PR: [#2401](https://github.com/PixarAnimationStudios/OpenUSD/pull/2401)) + - Fixed 1x1 texture mipmap generation. + (PR: [#2264](https://github.com/PixarAnimationStudios/OpenUSD/pull/2264)) + - Fixed HgiInteropMetal to use FP16 textures to allow clients to make use of + Extended Dynamic Range (EDR). + (PR: [#2482](https://github.com/PixarAnimationStudios/OpenUSD/pull/2482)) + - Fixed tessellation for Intel GPUs. + +- Cleaned up HdStRenderPassState setup of face cull mode. + (PR: [#2433](https://github.com/PixarAnimationStudios/OpenUSD/pull/2433)) + +- Cleaned up codeGen mixins related to OpenSubdiv to reduce the size of compiled + shader source. + +- Moved several Storm specific implementation aspects from lib/hd to lib/hdSt + including: smoothNormals, flatNormals, vertexAdjacency, bufferArrayRegistry, + strategyBase, resource, bufferResource, computation, extComp, drawItem BAR + accessors. + +- Updated Basis curves shader to use difference rather than tangent vector when + the latter is degenerate. This prevents artifacts where the last segment + during tessellation is dropped when pinning curves (having the last points of + a cubic curve all equal). + +- Fixed rendering of pinned catmullRom curves to include the first and last + segments when drawn as lines. + (Issue: [#2445](https://github.com/PixarAnimationStudios/OpenUSD/issues/2445)) + +- Optimized shader processing in Storm to provide stable shadertext to the + GPU. This allows some GPU drivers to fully utilize shader compilation caches, + significantly reducing the time spent compiling and linking GLSL shaders. In + one production shot, this time went from 5+ seconds to 60 ms. + +### Hydra + +- HdsiPrimTypePruningSceneIndex now nulls out the primType + and dataSource of pruned prims without also pruning the subtree + beneath them. This allows application-supplied renderBuffers, + drawTargets, etc. that are children of pruned prim types to survive. + +- HdFlatteningSceneIndex now lazily populates its cache + of flattened data sources using a two phase scheme that + more efficiently accommodates both scene updates and concurrent traversal. + +- Fixed HdRenderIndex::GetSceneDelegateAndInstancerIds for prims that don't + contain a "delegate" data source. + +- Added API for accessing model draw mode data in HdSceneDelegate. + +- Fixed alpha channel blending in hgiInterop composite functions. + +- Added lens distortion, focus, and split diopter parameters to HdCamera. + +- Updated fullscreen shader to use the correct texture sampling function for the + depth texture. + +- Updated HdxAovInputTask to create and manage a "depthIntermediate" texture to + facilitate ping-pong behavior for image shaders. + +- Added legacy and Hydra 2.0 support for the render terminals in + PxrRenderTerminalsAPI + +- Made HdFlatteningSceneIndex modular by allowing clients to give a container + data source mapping names of data sources to instances of + HdFlattenedDataSourceProvider which a client can implement to provide + additional flattening policies. Some other fixes and potential performance + improvements to HdFlatteningSceneIndex. + +- Updated HdFlatteningSceneIndex to additionally flatten coordinate system + bindings and constant primvars. + +- Introduced HdsiPrimTypePruningSceneIndex which generalizes + HdsiMaterialPruningSceneIndex and is also used to prune scene lights. + +- Renamed HdMaterialBindingSchema to HdMaterialBindingsSchema and made it + contain a schema rather than just a path to the material to bind. This is to + facilitate material binding strength in usdImaging. + +- Added GetSchemaToken to Hydra schemas where appropriate. + +- Made shading nodes with implementation source code work with scene indices. + Updated HdRenderPassState to make the calls to set the camera, override window + policy, and framing/viewport orthogonal. + +- Added scene index to manage global scene data such as the active render + settings prim. + +- Added scene index that provides dependency registration and namespace + filtering functionality in service of render settings prims. + +- Removed query of "material" data source for + HdSceneIndexAdapterSceneDelegate::GetLightParamValue as it has significant + overhead. + +- Updated to return light parameters within "light" data source from + UsdImagingStageSceneIndex in order to satisfy render delegates which don't + make use of GetMaterialResource for lights. + +- Added display names and tags for scene index instances (in service of user + interfaces). + +- Added renderInstanceId on HdRenderIndex (used for application-specific + tracking and in service of user interfaces). + +- Added scene index plug-in registry support for closure-based registration for + application-specific configuration of downstream scene indices. + +- Updated HdSceneIndexPluginRegistry::InsertionPhase from unsigned int to int + (in preparation for future "before vs after per-renderer branch distinction"). + +- Added HdSceneIndexObserver::RenamePrims for future use (with fallback behavior + to convert to removes and adds). + +- Updated back-end Hydra emulation to allow fallthrough to delegate->Get for an + empty result even when a "primvars" data source is present. + +- Updated HioImage plugin precedence to space values out, for more flexibility. + Note that the relative precedence of existing HioImage subclasses has not + changed. Future plugin authors can add support for new image loading libraries + by subclassing HioImage, specifying supported file extensions, and choosing a + precedence relative to the basic USD plugins; the highest precedence plugin is + used. + +- Added native instancing and point instancer support for lights to Hydra and + HdPrman. Analytic and geometric (mesh) lights are now supported in instance + prototypes all the way through Hydra, and Hydra render bridges may now expect + to see instancing information on light prims. Note that mesh light support in + HdPrman still requires that scene indices be enabled. + +- Made various performance improvements: + - HdMergingSceneIndex now traverses the contents of added input scenes + using task parallelism. + - Improved performance of Hd_SortedItems when using Hydra scene indexes + with nested point and native USD instancing, reducing load time of a + production shot by 3 seconds. + - Added a new approach to toggling use of scene materials, using + a Hydra filtering scene index to prune material prims and bindings. + Reduced time to load a production shot in Storm (with scene materials off) + by 10 seconds, by avoiding unnecessary shader compiling and linking. + - HdxColorCorrectionTask now does OCIO 3D LUT generation and shadertext + generation in an async task, saving 750 msec of render startup time by + moving work off the main thread. + +### RenderMan Hydra Plugin + +- Added support for RenderMan 25. + +- Fixed a bug where black artifacts often show up in RenderMan renders that use + UsdPreviewSurface with a normal map. The fix handles bumpNormals that are + facing away from the camera when the surface is facing forwards, based on what + PxrNormalMap does in the RixAdjustNormal method. + +- Added support to use scene option settings on the active render settings prim. + +- Added functionality to configure and use the render settings filtering scene + index for filtering and dependency functionality. + +- Improved performance of HdPrman significantly when rendering scenes with very + high instance counts by making use of RenderMan nested group instancing. + +- Added support for instanced lights. + +- Updated RenderMan args parser to camelCase shader node context for + displayFilters, to match how its done for sampleFilter, lightFilter and + pixelFilter. + +- Updated usdRiPxr schemas to reflect updates to RenderMan args files for + RenderMan 24.0. + +### usddiff + +- Enhanced usddiff to work with usdz packages. Files contained in usdz packages + are now iterated and diffed individually. A specific diff program may be + specified when image files are encountered in packages by setting the + USD_IMAGE_DIFF environment variable. The USD_IMAGE_DIFF_FORMATS environment + variable can optionally be set to indicate the file extensions that the image + diffing tool supports. These are specified in a comma-separated list with the + default being "'bmp', 'jpg', 'jpeg', 'png', 'tga', 'hdr'". + +### usdrecord + +- Disabled HdxPresentTask from running during recordings to avoid unneeded use + of GL. + (PR: [#2391](https://github.com/PixarAnimationStudios/OpenUSD/pull/2391)) + +### usdview + +- Fixed a bug in usdview's metadata tab where not all inherited paths would + necessarily be listed for the inherits field. + +- Fixed PySide object initialization to avoid runtime exceptions when using + PySide6 6.5.x. + (PR: [#2392](https://github.com/PixarAnimationStudios/OpenUSD/pull/2392)) + +- Fixed a bug with display of prims having property paths for IDs in Python + Hydra scene browser. + +### Alembic plugin + +- Updated UsdAbc plugin to re-enable USD_ABC_READ_ARCHIVE_USE_MMAP to be true by + default and match the current behavior of Alembic 1.7.9+. + (PR: ([#2439](https://github.com/PixarAnimationStudios/OpenUSD/pull/2439)) + +### MaterialX + +- Added MaterialX v1.38.7 support to allow for MaterialX support on Metal. + (Issue: [#2216](https://github.com/PixarAnimationStudios/OpenUSD/issues/2216), + PR: [#1965](https://github.com/PixarAnimationStudios/OpenUSD/pull/1965), + [#2324](https://github.com/PixarAnimationStudios/OpenUSD/pull/2324), + [#2402](https://github.com/PixarAnimationStudios/OpenUSD/pull/2402)) + +- Fixed a bug where calling SdfLayer::ImportFromString with a .mtlx document + would fail to resolve relative XML include paths. + +- Added Distant light support to MaterialX in Hydra. + (Issue: [#2411](https://github.com/PixarAnimationStudios/OpenUSD/issues/2411)) + +### Documentation + +- Made various documentation updates: + - Fixed various broken links and replaced references to graphics.pixar.com + with openusd.org + - Clarified propagation of UsdNotice::ObjectChanged() notification + - Updated dynamic payload doc with new uniform attributes + - Fixed usdRender RenderPass doc example + - Added descriptions for opaque and group attribute types + - Added more info on using session layer + +- Added the doxygen awesome theme to doc build. This theme adds responsive + design so documentation can be viewed on mobile devices, and a dark/light + theme to improve visibility. Note that doxygen awesome needs doxygen 1.9 or + better to build properly. + (PR: [#2050](https://github.com/PixarAnimationStudios/OpenUSD/pull/2050)) + +- Fixed typo in primvar documentation + (Issue: [#2386](https://github.com/PixarAnimationStudios/OpenUSD/issues/2386)) + +- Fixed reported broken link + (Issue: [#2450](https://github.com/PixarAnimationStudios/OpenUSD/issues/2450)) + +- Fixed pipeline plugInfo.json doc example + (Issue: [#2346](https://github.com/PixarAnimationStudios/OpenUSD/issues/2346)) + +- Replaced references to ASCII with Text in USD binaries to account for UTF-8 + support + (PR: [#2394](https://github.com/PixarAnimationStudios/OpenUSD/pull/2394), + [#2395](https://github.com/PixarAnimationStudios/OpenUSD/pull/2395)) + +- Clarified sourceColorSpace = sRGB only applies to transfer curve and not gamut + (Issue: [#2303](https://github.com/PixarAnimationStudios/OpenUSD/issues/2303)) + +- Added info on changing metadata via variants + (Issue: [#2326](https://github.com/PixarAnimationStudios/OpenUSD/issues/2326)) + ## [23.05] - 2023-04-18 Support for Python 2 has been removed in this release. diff --git a/LICENSE.txt b/LICENSE.txt index 3a2751f37f..2341d8e8bc 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -304,6 +304,32 @@ OpenEXR/IlmBase/Half // /////////////////////////////////////////////////////////////////////////// +============================================================ +libdeflate +============================================================ + +Copyright 2016 Eric Biggers + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation files +(the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + ============================================================ Apple Technical Q&A QA1361 - Detecting the Debugger https://developer.apple.com/library/content/qa/qa1361/_index.html @@ -646,3 +672,80 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +================================================================ +The Art of C++ : PEGTL (Parsing Expression Grammar Template Library) +================================================================ + +The MIT License (MIT) + +Copyright (c) 2007-2020 Dr. Colin Hirsch and Daniel Frey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +================================================================ +invoke.hpp +================================================================ + +MIT License + +Copyright (C) 2018-2023, by Matvey Cherevko (blackmatov@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +================================================================ +Doxygen Awesome +================================================================ + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/VERSIONS.md b/VERSIONS.md index 1e27da3839..03f51d3c4a 100644 --- a/VERSIONS.md +++ b/VERSIONS.md @@ -27,10 +27,10 @@ Our test machines have the following software versions installed | Qt for Python | PySide2 5.14.1 | PySide6 6.3.1 | PySide2 5.14.1 | | PyOpenGL | 3.1.5 | 3.1.5 | 3.1.5 | | Embree | 3.2.2 | 3.13.3 | 3.2.2 | -| RenderMan | 24.4 | 24.4 | 24.4 | +| RenderMan | 24.4, 25.0 | 24.4, 25.0 | 24.4, 25.0 | | Alembic | 1.7.10 | 1.8.3 | 1.7.10 | | OpenEXR | 2.4.3 | 2.4.3 | 2.5.2 | -| MaterialX | 1.38.4 | 1.38.4 | 1.38.4 | +| MaterialX | 1.38.7 | 1.38.7 | 1.38.7 | | Jinja2 | 2.0 | | | | Flex | 2.5.39 | | | | Bison | 2.4.1 | | | diff --git a/build_scripts/build_usd.py b/build_scripts/build_usd.py index 80acf4aa37..b98e147374 100644 --- a/build_scripts/build_usd.py +++ b/build_scripts/build_usd.py @@ -21,8 +21,6 @@ # KIND, either express or implied. See the Apache License for the specific # language governing permissions and limitations under the Apache License. # -from __future__ import print_function - # Check whether this script is being run under Python 2 first. Otherwise, # any Python 3-only code below will cause the script to fail with an # unhelpful error message. @@ -51,15 +49,8 @@ import sysconfig import zipfile -if sys.version_info.major >= 3: - from urllib.request import urlopen - from shutil import which -else: - from urllib2 import urlopen - - # Doesn't deal with .bat / .cmd like shutil.which, but only option - # available with stock python-2 - from distutils.spawn import find_executable as which +from urllib.request import urlopen +from shutil import which # Helpers for printing output verbosity = 1 @@ -101,9 +92,6 @@ def MacOS(): if MacOS(): import apple_utils -def Python3(): - return sys.version_info.major == 3 - def GetLocale(): return sys.stdout.encoding or locale.getdefaultlocale()[1] or "UTF-8" @@ -175,8 +163,7 @@ def GetPythonInfo(context): in the Boost and USD builds. By taking this approach we can support having USD builds for different Python versions built on the same machine. This is very useful, especially when developers have multiple - versions installed on their machine, which is quite common now with - Python2 and Python3 co-existing. + versions installed on their machine. """ # If we were given build python info then just use it. @@ -189,7 +176,7 @@ def GetPythonInfo(context): # First we extract the information that can be uniformly dealt with across # the platforms: pythonExecPath = sys.executable - pythonVersion = sysconfig.get_config_var("py_version_short") # "2.7" + pythonVersion = sysconfig.get_config_var("py_version_short") # "3.7" # Lib path is unfortunately special for each platform and there is no # config_var for it. But we can deduce it for each platform, and this @@ -219,10 +206,6 @@ def _GetPythonLibraryFilename(context): # if in a venv, installed_base will be the "original" python, # which is where the libs are ("base" will be the venv dir) pythonBaseDir = sysconfig.get_config_var("installed_base") - if not pythonBaseDir or not os.path.isdir(pythonBaseDir): - # for python-2.7 - pythonBaseDir = sysconfig.get_config_var("base") - if Windows(): pythonLibPath = os.path.join(pythonBaseDir, "libs", _GetPythonLibraryFilename(context)) @@ -368,6 +351,14 @@ def RunCMake(context, force, extraArgs = None): source code is located in the current working directory.""" # Create a directory for out-of-source builds in the build directory # using the name of the current working directory. + if extraArgs is None: + extraArgs = [] + else: + # ensure we can freely modify our extraArgs without affecting caller + extraArgs = list(extraArgs) + + if context.cmakeBuildArgs: + extraArgs.insert(0, context.cmakeBuildArgs) srcDir = os.getcwd() instDir = (context.usdInstDir if srcDir == context.usdSrcDir else context.instDir) @@ -1480,17 +1471,7 @@ def GetPyOpenGLInstructions(): def GetPySideInstructions(): # For licensing reasons, this script cannot install PySide itself. - if Windows(): - # There is no distribution of PySide2 for Windows for Python 2.7. - # So use PySide instead. See the following for more details: - # https://wiki.qt.io/Qt_for_Python/Considerations#Missing_Windows_.2F_Python_2.7_release - return ('PySide is not installed. If you have pip ' - 'installed, run "pip install PySide" ' - 'to install it, then re-run this script.\n' - 'If PySide is already installed, you may need to ' - 'update your PYTHONPATH to indicate where it is ' - 'located.') - elif MacOS(): + if MacOS(): # PySide6 is required for Apple Silicon support, so is the default # across all macOS hardware platforms. return ('PySide6 is not installed. If you have pip ' @@ -1508,7 +1489,7 @@ def GetPySideInstructions(): 'located.') PYSIDE = PythonDependency("PySide", GetPySideInstructions, - moduleNames=["PySide", "PySide2", "PySide6"]) + moduleNames=["PySide2", "PySide6"]) ############################################################ # HDF5 @@ -1582,10 +1563,19 @@ def InstallDraco(context, force, buildArgs): ############################################################ # MaterialX -MATERIALX_URL = "https://github.com/materialx/MaterialX/archive/v1.38.4.zip" +MATERIALX_URL = "https://github.com/materialx/MaterialX/archive/v1.38.7.zip" def InstallMaterialX(context, force, buildArgs): with CurrentWorkingDirectory(DownloadURL(MATERIALX_URL, context, force)): + # MaterialX 1.38.7 fails to build on windows using VS2017 because of a + # missing header include, following patch fixes the same. This patch + # should be removed when underlying issue is resolved. + # https://github.com/AcademySoftwareFoundation/MaterialX/issues/1401 + if IsVisualStudio2017OrGreater() and not IsVisualStudio2019OrGreater(): + PatchFile("source\\MaterialXGenMsl\\MslShaderGenerator.cpp", + [("#include ", + "#include \n" + + "#include ")]) cmakeOptions = ['-DMATERIALX_BUILD_SHARED_LIBS=ON', '-DMATERIALX_BUILD_TESTS=OFF' ] @@ -1634,15 +1624,14 @@ def InstallUSD(context, force, buildArgs): if context.buildPython: extraArgs.append('-DPXR_ENABLE_PYTHON_SUPPORT=ON') - extraArgs.append('-DPXR_USE_PYTHON_3={}' - .format('ON' if Python3() else 'OFF')) - - # Many people on Windows may not have python with the - # debugging symbol ( python27_d.lib ) installed, this is the common case - # where one downloads the python from official download website. Therefore we - # can still let people decide to build USD with release version of python if - # debugging into python land is not what they want which can be done by setting the - # debugPython + + # Many people on Windows may not have Python libraries with debug + # symbols (denoted by a '_d') installed. This is the common + # case when a user installs Python from the official download + # website. Therefore we can still let people decide to build USD + # with the release version of Python if debugging into Python land + # is not what they want which can be done by setting the debugPython + # argument. if context.buildDebug and context.debugPython: extraArgs.append('-DPXR_USE_DEBUG_PYTHON=ON') else: @@ -1660,16 +1649,12 @@ def InstallUSD(context, force, buildArgs): # itself rather than rely on CMake's heuristics. pythonInfo = GetPythonInfo(context) if pythonInfo: - prefix = "Python3" if Python3() else "Python2" - extraArgs.append('-D{prefix}_EXECUTABLE="{pyExecPath}"' - .format(prefix=prefix, - pyExecPath=pythonInfo[0])) - extraArgs.append('-D{prefix}_LIBRARY="{pyLibPath}"' - .format(prefix=prefix, - pyLibPath=pythonInfo[1])) - extraArgs.append('-D{prefix}_INCLUDE_DIR="{pyIncPath}"' - .format(prefix=prefix, - pyIncPath=pythonInfo[2])) + extraArgs.append('-DPython3_EXECUTABLE="{pyExecPath}"' + .format(pyExecPath=pythonInfo[0])) + extraArgs.append('-DPython3_LIBRARY="{pyLibPath}"' + .format(pyLibPath=pythonInfo[1])) + extraArgs.append('-DPython3_INCLUDE_DIR="{pyIncPath}"' + .format(pyIncPath=pythonInfo[2])) else: extraArgs.append('-DPXR_ENABLE_PYTHON_SUPPORT=OFF') @@ -1908,8 +1893,13 @@ def InstallUSD(context, force, buildArgs): group.add_argument("--build-args", type=str, nargs="*", default=[], help=("Custom arguments to pass to build system when " "building libraries (see docs above)")) +group.add_argument("--cmake-build-args", type=str, + help=("Custom arguments to pass to all builds that use " + "cmake; a single string, similar to the args passed " + "for a single dependency in --build-args")) group.add_argument("--build-python-info", type=str, nargs=4, default=[], - metavar=('PYTHON_EXECUTABLE', 'PYTHON_INCLUDE_DIR', 'PYTHON_LIBRARY', 'PYTHON_VERSION'), + metavar=('PYTHON_EXECUTABLE', 'PYTHON_INCLUDE_DIR', + 'PYTHON_LIBRARY', 'PYTHON_VERSION'), help=("Specify a custom python to use during build")) group.add_argument("--force", type=str, action="append", dest="force_build", default=[], @@ -2002,11 +1992,14 @@ def InstallUSD(context, force, buildArgs): "malformed input files") subgroup = group.add_mutually_exclusive_group() -subgroup.add_argument("--debug-python", dest="debug_python", action="store_true", - help="Define Boost Python Debug if your Python library comes with Debugging symbols.") - -subgroup.add_argument("--no-debug-python", dest="debug_python", action="store_false", - help="Don't define Boost Python Debug if your Python library comes with Debugging symbols.") +subgroup.add_argument("--debug-python", dest="debug_python", + action="store_true", help= + "Define Boost Python Debug if your Python library " + "comes with Debugging symbols.") +subgroup.add_argument("--no-debug-python", dest="debug_python", + action="store_false", help= + "Don't define Boost Python Debug if your Python " + "library comes with Debugging symbols.") (NO_IMAGING, IMAGING, USD_IMAGING) = (0, 1, 2) @@ -2143,6 +2136,7 @@ def __init__(self, args): # CMake generator and toolset self.cmakeGenerator = args.generator self.cmakeToolset = args.toolset + self.cmakeBuildArgs = args.cmake_build_args # Number of jobs self.numJobs = args.jobs @@ -2423,27 +2417,18 @@ def _JoinVersion(v): usdBuildArgs = context.GetBuildArguments(USD) given_pysideUic = 'PYSIDEUICBINARY' in " ".join(usdBuildArgs) - # The USD build will skip building usdview if pyside2-uic or pyside-uic is + # The USD build will skip building usdview if pyside6-uic or pyside2-uic is # not found, so check for it here to avoid confusing users. This list of # PySide executable names comes from cmake/modules/FindPySide.cmake pyside6Uic = ["pyside6-uic"] found_pyside6Uic = any([which(p) for p in pyside6Uic]) - pyside2Uic = ["pyside2-uic", "python2-pyside2-uic", "pyside2-uic-2.7"] + pyside2Uic = ["pyside2-uic"] found_pyside2Uic = any([which(p) for p in pyside2Uic]) - pysideUic = ["pyside-uic", "python2-pyside-uic", "pyside-uic-2.7"] - found_pysideUic = any([which(p) for p in pysideUic]) - if not given_pysideUic and not found_pyside2Uic and not found_pysideUic and not found_pyside6Uic: - if Windows(): - # Windows does not support PySide2 with Python2.7 - PrintError("pyside-uic not found -- please install PySide and" - " adjust your PATH. (Note that this program may be named" - " {0} depending on your platform)" - .format(" or ".join(pysideUic))) - else: - PrintError("uic not found -- please install PySide2 or PySide6 and" - " adjust your PATH. (Note that this program may be" - " named {0} depending on your platform)" - .format(" or ".join(set(pyside2Uic+pyside6Uic)))) + if not given_pysideUic and not found_pyside2Uic and not found_pyside6Uic: + PrintError("uic not found -- please install PySide2 or PySide6 and" + " adjust your PATH. (Note that this program may be" + " named {0} depending on your platform)" + .format(" or ".join(set(pyside2Uic+pyside6Uic)))) sys.exit(1) # Summarize @@ -2479,7 +2464,6 @@ def _JoinVersion(v): usdview: {buildUsdview} Python support {buildPython} Python Debug: {debugPython} - Python 3: {enablePython3} Python docs: {buildPythonDocs} Documentation {buildDocs} Tests {buildTests} @@ -2541,7 +2525,6 @@ def FormatBuildArguments(buildArgs): buildUsdview=("On" if context.buildUsdview else "Off"), buildPython=("On" if context.buildPython else "Off"), debugPython=("On" if context.debugPython else "Off"), - enablePython3=("On" if Python3() else "Off"), buildPythonDocs=("On" if context.buildPythonDocs else "Off"), buildDocs=("On" if context.buildDocs else "Off"), buildTests=("On" if context.buildTests else "Off"), diff --git a/cmake/defaults/Version.cmake b/cmake/defaults/Version.cmake index 647b8aabee..dafcd80710 100644 --- a/cmake/defaults/Version.cmake +++ b/cmake/defaults/Version.cmake @@ -24,6 +24,6 @@ # Versioning information set(PXR_MAJOR_VERSION "0") set(PXR_MINOR_VERSION "23") -set(PXR_PATCH_VERSION "05") +set(PXR_PATCH_VERSION "8") # NOTE: Must not have leading 0 for single digits math(EXPR PXR_VERSION "${PXR_MAJOR_VERSION} * 10000 + ${PXR_MINOR_VERSION} * 100 + ${PXR_PATCH_VERSION}") diff --git a/cmake/defaults/clangdefaults.cmake b/cmake/defaults/clangdefaults.cmake index 0cba9b9927..4e20af3210 100644 --- a/cmake/defaults/clangdefaults.cmake +++ b/cmake/defaults/clangdefaults.cmake @@ -26,6 +26,12 @@ include(gccclangshareddefaults) set(_PXR_CXX_FLAGS "${_PXR_GCC_CLANG_SHARED_CXX_FLAGS}") +# Prevent floating point result discrepancies on Apple platforms +# due to multiplication+additions being converted to FMA +if (APPLE) + set(_PXR_CXX_FLAGS "${_PXR_CXX_FLAGS} -ffp-contract=off") +endif() + # clang annoyingly warns about the -pthread option if it's only linking. if(CMAKE_USE_PTHREADS_INIT) _disable_warning("unused-command-line-argument") diff --git a/cmake/modules/FindPySide.cmake b/cmake/modules/FindPySide.cmake index 32f2426830..94d9199f37 100644 --- a/cmake/modules/FindPySide.cmake +++ b/cmake/modules/FindPySide.cmake @@ -26,8 +26,7 @@ if (NOT PYTHON_EXECUTABLE) return() endif() -# Prefer PySide6 over PySide2 and PySide -# Note: Windows does not support PySide2 with Python2.7 +# Prefer PySide6 over PySide2 execute_process( COMMAND "${PYTHON_EXECUTABLE}" "-c" "import PySide6" RESULT_VARIABLE pySideImportResult @@ -45,21 +44,7 @@ if (pySideImportResult EQUAL 1 OR PYSIDE_USE_PYSIDE2) ) if (pySideImportResult EQUAL 0) set(pySideImportResult "PySide2") - set(pySideUIC pyside2-uic python2-pyside2-uic pyside2-uic-2.7) - endif() -endif() - -# PySide2 not found OR PYSIDE explicitly requested -if (pySideImportResult EQUAL 1 OR PYSIDE_USE_PYSIDE) - execute_process( - COMMAND "${PYTHON_EXECUTABLE}" "-c" "import PySide" - RESULT_VARIABLE pySideImportResult - ) - if (pySideImportResult EQUAL 0) - set(pySideImportResult "PySide") - set(pySideUIC pyside-uic python2-pyside-uic pyside-uic-2.7) - else() - set(pySideImportResult 0) + set(pySideUIC pyside2-uic) endif() endif() @@ -76,9 +61,7 @@ if (pySideImportResult) set(PYSIDE_AVAILABLE False) endif() else() - if (PYSIDE_USE_PYSIDE) - message(STATUS "Did not find PySide with ${PYTHON_EXECUTABLE}") - elseif (PYSIDE_USE_PYSIDE2) + if (PYSIDE_USE_PYSIDE2) message(STATUS "Did not find PySide2 with ${PYTHON_EXECUTABLE}") else() message(STATUS "Did not find PySide6 with ${PYTHON_EXECUTABLE}") diff --git a/docs/_static/css/pxr_custom.css b/docs/_static/css/pxr_custom.css index 76984d95cd..47fefef329 100644 --- a/docs/_static/css/pxr_custom.css +++ b/docs/_static/css/pxr_custom.css @@ -47,7 +47,7 @@ h4 { .icon-home:before { vertical-align: middle; - content: url("https://graphics.pixar.com/usd/images/USDLogo24.svg"); + content: url("https://openusd.org/images/USDLogo24.svg"); } #usd-home > h1 { diff --git a/docs/conf.py b/docs/conf.py index 810adcaa12..c4b78b45a3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -153,4 +153,4 @@ def GetSphinxLogger(): html_sidebars = { '**': ['globaltoc.html', 'relations.html', 'sourcelink.html', 'searchbox.html'] } -html_favicon = 'https://graphics.pixar.com/usd/images/USDIcon.ico' +html_favicon = 'https://openusd.org/images/USDIcon.ico' diff --git a/docs/contributing_supplemental.rst b/docs/contributing_supplemental.rst index 636c28186a..d94152552a 100644 --- a/docs/contributing_supplemental.rst +++ b/docs/contributing_supplemental.rst @@ -2,7 +2,7 @@ Supplemental Terms =================== -By and in consideration for using a Pixar site (e.g., Pixar's USD-proposals +By and in consideration for using a Pixar site (e.g., Pixar's OpenUSD-proposals site), providing Submissions to Pixar, or by clicking a box that states that you accept or agree to these terms, you signify your agreement to these Supplemental Terms. diff --git a/docs/dl_city_set.rst b/docs/dl_city_set.rst index 2218a52657..02442b73b9 100644 --- a/docs/dl_city_set.rst +++ b/docs/dl_city_set.rst @@ -9,7 +9,7 @@ City Set .. raw:: html
-
+
diff --git a/docs/dl_downloads.rst b/docs/dl_downloads.rst index 2416b79b69..2303a9bc43 100644 --- a/docs/dl_downloads.rst +++ b/docs/dl_downloads.rst @@ -7,16 +7,16 @@ Downloads and Videos SIGGRAPH 2019 Course Notes ========================== -| `Download All `_ -| `Download All (No Presentation Notes) `_ +| `Download All `_ +| `Download All (No Presentation Notes) `_ **Presentation notes included in files below:** -| `USD Introduction and Overview `_ -| `USD Composition `_ -| `USD Authoring and Advanced Features `_ -| `Pipeline Case Studies `_ -| `Hydra `_ +| `USD Introduction and Overview `_ +| `USD Composition `_ +| `USD Authoring and Advanced Features `_ +| `Pipeline Case Studies `_ +| `Hydra `_ -------- @@ -29,28 +29,28 @@ Videos `Open Source at Pixar (SIGGRAPH 2022) `_ ^^^ - .. image:: https://graphics.pixar.com/usd/images/USDOpenSource2022Video.jpg + .. image:: https://openusd.org/images/USDOpenSource2022Video.jpg :target: https://vimeo.com/752352357 --- `USD: Building Asset Pipelines `_ ^^^ - .. image:: https://graphics.pixar.com/usd/images/USDPipelineAssetsVideo.png + .. image:: https://openusd.org/images/USDPipelineAssetsVideo.png :target: https://vimeo.com/211022588 --- `Open Source at Pixar (SIGGRAPH 2017) `_ ^^^ - .. image:: https://graphics.pixar.com/usd/images/USDOpenSource2017Video.png + .. image:: https://openusd.org/images/USDOpenSource2017Video.png :target: https://vimeo.com/237018208 --- `USD-Based Pipeline (2016) `_ ^^^ - .. image:: https://graphics.pixar.com/usd/images/USDPipeline2016_video.png + .. image:: https://openusd.org/images/USDPipeline2016_video.png :target: https://vimeo.com/188191100 -------- @@ -63,19 +63,19 @@ Assets :doc:`Kitchen Set ` ^^^ - .. image:: https://graphics.pixar.com/usd/images/Kitchen_set_thumb.png + .. image:: https://openusd.org/images/Kitchen_set_thumb.png :target: dl_kitchen_set.html --- :doc:`City Set ` ^^^ - .. image:: https://graphics.pixar.com/usd/images/PointInstancedMedCity.png + .. image:: https://openusd.org/images/PointInstancedMedCity.png :target: dl_city_set.html --- :doc:`UsdSkel Examples ` ^^^ - .. image:: https://graphics.pixar.com/usd/images/HumanFemale.png + .. image:: https://openusd.org/images/HumanFemale.png :target: dl_usdskel_examples.html Additional Assets diff --git a/docs/dl_kitchen_set.rst b/docs/dl_kitchen_set.rst index 84083ee235..9e5e81847b 100644 --- a/docs/dl_kitchen_set.rst +++ b/docs/dl_kitchen_set.rst @@ -9,7 +9,7 @@ Kitchen Set .. raw:: html
-
+
diff --git a/docs/dl_usdskel_examples.rst b/docs/dl_usdskel_examples.rst index a6af66edce..681174b8e3 100644 --- a/docs/dl_usdskel_examples.rst +++ b/docs/dl_usdskel_examples.rst @@ -9,7 +9,7 @@ UsdSkel Examples .. raw:: html
-
+
diff --git a/docs/doxygen/Doxyfile.in b/docs/doxygen/Doxyfile.in index 0c57a7c86d..ea9edd2bae 100644 --- a/docs/doxygen/Doxyfile.in +++ b/docs/doxygen/Doxyfile.in @@ -796,7 +796,7 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = docs/include/pxr/base/tf/pxrPEGTL # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -1114,8 +1114,9 @@ HTML_STYLESHEET = # Doxygen will copy the style sheet file to the output directory. For an example # see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. +# !!NOTE: We override HTML_EXTRA_STYLESHEET in the doxygen awesome settings below -HTML_EXTRA_STYLESHEET = docs/doxygen/usd_style.css +# HTML_EXTRA_STYLESHEET = docs/doxygen/usd_style.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1124,6 +1125,7 @@ HTML_EXTRA_STYLESHEET = docs/doxygen/usd_style.css # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. +# NOTE: See also Doxygen Awesome additions below HTML_EXTRA_FILES = @@ -2343,3 +2345,13 @@ GENERATE_LEGEND = YES DOT_CLEANUP = YES #CLANG_ASSISTED_PARSING = YES + +# Setup for Doxygen Awesome CSS + +FULL_SIDEBAR = NO +HTML_EXTRA_STYLESHEET = docs/doxygen/doxygen-awesome-css/doxygen-awesome.css \ + docs/doxygen/usd_style.css +HTML_EXTRA_FILES = docs/doxygen/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js \ + docs/doxygen/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js +# HTML_COLORSTYLE is a Doxygen 1.9.x config required for Doxygen Awesome +HTML_COLORSTYLE = LIGHT \ No newline at end of file diff --git a/docs/doxygen/doxygen-awesome-css/LICENSE b/docs/doxygen/doxygen-awesome-css/LICENSE new file mode 100644 index 0000000000..8bf804a2a6 --- /dev/null +++ b/docs/doxygen/doxygen-awesome-css/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docs/doxygen/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js b/docs/doxygen/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js new file mode 100644 index 0000000000..40fe2d38e0 --- /dev/null +++ b/docs/doxygen/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js @@ -0,0 +1,157 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeDarkModeToggle extends HTMLElement { + // SVG icons from https://fonts.google.com/icons + // Licensed under the Apache 2.0 license: + // https://www.apache.org/licenses/LICENSE-2.0.html + static lightModeIcon = `` + static darkModeIcon = `` + static title = "Toggle Light/Dark Mode" + + static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode" + static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode" + + static _staticConstructor = function() { + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference) + // Update the color scheme when the browsers preference changes + // without user interaction on the website. + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + }) + // Update the color scheme when the tab is made visible again. + // It is possible that the appearance was changed in another tab + // while this tab was in the background. + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + } + }); + }() + + static init() { + $(function() { + $(document).ready(function() { + const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle') + toggleButton.title = DoxygenAwesomeDarkModeToggle.title + toggleButton.updateIcon() + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + toggleButton.updateIcon() + }) + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + toggleButton.updateIcon() + } + }); + + $(document).ready(function(){ + document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) + }) + $(window).resize(function(){ + document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) + }) + }) + }) + } + + constructor() { + super(); + this.onclick=this.toggleDarkMode + } + + /** + * @returns `true` for dark-mode, `false` for light-mode system preference + */ + static get systemPreference() { + return window.matchMedia('(prefers-color-scheme: dark)').matches + } + + /** + * @returns `true` for dark-mode, `false` for light-mode user preference + */ + static get userPreference() { + return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) || + (DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)) + } + + static set userPreference(userPreference) { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference + if(!userPreference) { + if(DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey) + } + } else { + if(!DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey) + } + } + DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged() + } + + static enableDarkMode(enable) { + if(enable) { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = true + document.documentElement.classList.add("dark-mode") + document.documentElement.classList.remove("light-mode") + } else { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = false + document.documentElement.classList.remove("dark-mode") + document.documentElement.classList.add("light-mode") + } + } + + static onSystemPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + static onUserPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + toggleDarkMode() { + DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference + this.updateIcon() + } + + updateIcon() { + if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) { + this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon + } else { + this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon + } + } +} + +customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle); diff --git a/docs/doxygen/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js b/docs/doxygen/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js new file mode 100644 index 0000000000..86c16fd93a --- /dev/null +++ b/docs/doxygen/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js @@ -0,0 +1,85 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeFragmentCopyButton extends HTMLElement { + constructor() { + super(); + this.onclick=this.copyContent + } + static title = "Copy to clipboard" + static copyIcon = `` + static successIcon = `` + static successDuration = 980 + static init() { + $(function() { + $(document).ready(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const fragmentWrapper = document.createElement("div") + fragmentWrapper.className = "doxygen-awesome-fragment-wrapper" + const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button") + fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title + + fragment.parentNode.replaceChild(fragmentWrapper, fragment) + fragmentWrapper.appendChild(fragment) + fragmentWrapper.appendChild(fragmentCopyButton) + + } + } + }) + }) + } + + + copyContent() { + const content = this.previousSibling.cloneNode(true) + // filter out line number from file listings + content.querySelectorAll(".lineno, .ttc").forEach((node) => { + node.remove() + }) + let textContent = content.textContent + // remove trailing newlines that appear in file listings + let numberOfTrailingNewlines = 0 + while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') { + numberOfTrailingNewlines++; + } + textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines) + navigator.clipboard.writeText(textContent); + this.classList.add("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon + window.setTimeout(() => { + this.classList.remove("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + }, DoxygenAwesomeFragmentCopyButton.successDuration); + } +} + +customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton) diff --git a/docs/doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css b/docs/doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css new file mode 100644 index 0000000000..d207446e0b --- /dev/null +++ b/docs/doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css @@ -0,0 +1,40 @@ + +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +@media screen and (min-width: 768px) { + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height)); + } +} diff --git a/docs/doxygen/doxygen-awesome-css/doxygen-awesome.css b/docs/doxygen/doxygen-awesome-css/doxygen-awesome.css new file mode 100644 index 0000000000..08238977a6 --- /dev/null +++ b/docs/doxygen/doxygen-awesome-css/doxygen-awesome.css @@ -0,0 +1,2530 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + --primary-color: #1779c4; + --primary-dark-color: #335c80; + --primary-light-color: #70b1e9; + + /* page base colors */ + --page-background-color: #ffffff; + --page-foreground-color: #2f4153; + --page-secondary-foreground-color: #6f7e8e; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #dedede; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 8px; + --border-radius-small: 4px; + --border-radius-medium: 6px; + + /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 5px; + --spacing-medium: 10px; + --spacing-large: 16px; + + /* default box shadow used for raising an element above the normal content. Used in dropdowns, search result, ... */ + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + + --odd-color: rgba(0,0,0,.028); + + /* font-families. will affect all text on the website + * font-family: the normal font for text, headlines, menus + * font-family-monospace: used for preformatted text in memtitle, code, fragments + */ + --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; + --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + + /* font sizes */ + --page-font-size: 15.6px; + --navigation-font-size: 14.4px; + --toc-font-size: 13.4px; + --code-font-size: 14px; /* affects code, fragment */ + --title-font-size: 22px; + + /* content text properties. These only affect the page content, not the navigation or any other ui elements */ + --content-line-height: 27px; + /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ + --content-maxwidth: 1050px; + --table-line-height: 24px; + --toc-sticky-top: var(--spacing-medium); + --toc-width: 200px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 85px); + + /* colors for various content boxes: @warning, @note, @deprecated @bug */ + --warning-color: #f8d1cc; + --warning-color-dark: #b61825; + --warning-color-darker: #75070f; + --note-color: #faf3d8; + --note-color-dark: #f3a600; + --note-color-darker: #5f4204; + --todo-color: #e4f3ff; + --todo-color-dark: #1879C4; + --todo-color-darker: #274a5c; + --deprecated-color: #ecf0f3; + --deprecated-color-dark: #5b6269; + --deprecated-color-darker: #43454a; + --bug-color: #e4dafd; + --bug-color-dark: #5b2bdd; + --bug-color-darker: #2a0d72; + --invariant-color: #d8f1e3; + --invariant-color-dark: #44b86f; + --invariant-color-darker: #265532; + + /* blockquote colors */ + --blockquote-background: #f8f9fa; + --blockquote-foreground: #636568; + + /* table colors */ + --tablehead-background: #f1f1f1; + --tablehead-foreground: var(--page-foreground-color); + + /* menu-display: block | none + * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. + * `GENERATE_TREEVIEW` MUST be enabled! + */ + --menu-display: block; + + --menu-focus-foreground: var(--page-background-color); + --menu-focus-background: var(--primary-color); + --menu-selected-background: rgba(0,0,0,.05); + + + --header-background: var(--page-background-color); + --header-foreground: var(--page-foreground-color); + + /* searchbar colors */ + --searchbar-background: var(--side-nav-background); + --searchbar-foreground: var(--page-foreground-color); + + /* searchbar size + * (`searchbar-width` is only applied on screens >= 768px. + * on smaller screens the searchbar will always fill the entire screen width) */ + --searchbar-height: 33px; + --searchbar-width: 210px; + --searchbar-border-radius: var(--searchbar-height); + + /* code block colors */ + --code-background: #f5f5f5; + --code-foreground: var(--page-foreground-color); + + /* fragment colors */ + --fragment-background: #F8F9FA; + --fragment-foreground: #37474F; + --fragment-keyword: #bb6bb2; + --fragment-keywordtype: #8258b3; + --fragment-keywordflow: #d67c3b; + --fragment-token: #438a59; + --fragment-comment: #969696; + --fragment-link: #5383d6; + --fragment-preprocessor: #46aaa5; + --fragment-linenumber-color: #797979; + --fragment-linenumber-background: #f4f4f5; + --fragment-linenumber-border: #e3e5e7; + --fragment-lineheight: 20px; + + /* sidebar navigation (treeview) colors */ + --side-nav-background: #fbfbfb; + --side-nav-foreground: var(--page-foreground-color); + --side-nav-arrow-opacity: 0; + --side-nav-arrow-hover-opacity: 0.9; + + --toc-background: var(--side-nav-background); + --toc-foreground: var(--side-nav-foreground); + + /* height of an item in any tree / collapsible table */ + --tree-item-height: 30px; + + --memname-font-size: var(--code-font-size); + --memtitle-font-size: 18px; + + --webkit-scrollbar-size: 7px; + --webkit-scrollbar-padding: 4px; + --webkit-scrollbar-color: var(--separator-color); +} + +@media screen and (max-width: 767px) { + html { + --page-font-size: 16px; + --navigation-font-size: 16px; + --toc-font-size: 15px; + --code-font-size: 15px; /* affects code, fragment */ + --title-font-size: 22px; + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; + } +} + +/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ +html.dark-mode { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; +} + +body { + color: var(--page-foreground-color); + background-color: var(--page-background-color); + font-size: var(--page-font-size); +} + +body, table, div, p, dl, #nav-tree .label, .title, +.sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, +.SelectItem, #MSearchField, .navpath li.navelem a, +.navpath li.navelem a:hover, p.reference, p.definition { + font-family: var(--font-family); +} + +h1, h2, h3, h4, h5 { + margin-top: .9em; + font-weight: 600; + line-height: initial; +} + +p, div, table, dl, p.reference, p.definition { + font-size: var(--page-font-size); +} + +p.reference, p.definition { + color: var(--page-secondary-foreground-color); +} + +a:link, a:visited, a:hover, a:focus, a:active { + color: var(--primary-color) !important; + font-weight: 500; +} + +a.anchor { + scroll-margin-top: var(--spacing-large); + display: block; +} + +/* + Title and top navigation + */ + +#top { + background: var(--header-background); + border-bottom: 1px solid var(--separator-color); +} + +@media screen and (min-width: 768px) { + #top { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + } +} + +#main-nav { + flex-grow: 5; + padding: var(--spacing-small) var(--spacing-medium); +} + +#titlearea { + width: auto; + padding: var(--spacing-medium) var(--spacing-large); + background: none; + color: var(--header-foreground); + border-bottom: none; +} + +@media screen and (max-width: 767px) { + #titlearea { + padding-bottom: var(--spacing-small); + } +} + +#titlearea table tbody tr { + height: auto !important; +} + +#projectname { + font-size: var(--title-font-size); + font-weight: 600; +} + +#projectnumber { + font-family: inherit; + font-size: 60%; +} + +#projectbrief { + font-family: inherit; + font-size: 80%; +} + +#projectlogo { + vertical-align: middle; +} + +#projectlogo img { + max-height: calc(var(--title-font-size) * 2); + margin-right: var(--spacing-small); +} + +.sm-dox, .tabs, .tabs2, .tabs3 { + background: none; + padding: 0; +} + +.tabs, .tabs2, .tabs3 { + border-bottom: 1px solid var(--separator-color); + margin-bottom: -1px; +} + +.main-menu-btn-icon, .main-menu-btn-icon:before, .main-menu-btn-icon:after { + background: var(--page-secondary-foreground-color); +} + +@media screen and (max-width: 767px) { + .sm-dox a span.sub-arrow { + background: var(--code-background); + } + + #main-menu a.has-submenu span.sub-arrow { + color: var(--page-secondary-foreground-color); + border-radius: var(--border-radius-medium); + } + + #main-menu a.has-submenu:hover span.sub-arrow { + color: var(--page-foreground-color); + } +} + +@media screen and (min-width: 768px) { + .sm-dox li, .tablist li { + display: var(--menu-display); + } + + .sm-dox a span.sub-arrow { + border-color: var(--header-foreground) transparent transparent transparent; + } + + .sm-dox a:hover span.sub-arrow { + border-color: var(--menu-focus-foreground) transparent transparent transparent; + } + + .sm-dox ul a span.sub-arrow { + border-color: transparent transparent transparent var(--page-foreground-color); + } + + .sm-dox ul a:hover span.sub-arrow { + border-color: transparent transparent transparent var(--menu-focus-foreground); + } +} + +.sm-dox ul { + background: var(--page-background-color); + box-shadow: var(--box-shadow); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium) !important; + padding: var(--spacing-small); + animation: ease-out 150ms slideInMenu; +} + +@keyframes slideInMenu { + from { + opacity: 0; + transform: translate(0px, -2px); + } + + to { + opacity: 1; + transform: translate(0px, 0px); + } +} + +.sm-dox ul a { + color: var(--page-foreground-color) !important; + background: var(--page-background-color); + font-size: var(--navigation-font-size); +} + +.sm-dox>li>ul:after { + border-bottom-color: var(--page-background-color) !important; +} + +.sm-dox>li>ul:before { + border-bottom-color: var(--separator-color) !important; +} + +.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { + font-size: var(--navigation-font-size) !important; + color: var(--menu-focus-foreground) !important; + text-shadow: none; + background-color: var(--menu-focus-background); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { + text-shadow: none; + background: transparent; + background-image: none !important; + color: var(--header-foreground) !important; + font-weight: normal; + font-size: var(--navigation-font-size); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a:focus { + outline: auto; +} + +.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { + text-shadow: none; + font-weight: normal; + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; + border-radius: var(--border-radius-small) !important; + font-size: var(--navigation-font-size); +} + +.tablist li.current { + border-radius: var(--border-radius-small); + background: var(--menu-selected-background); +} + +.tablist li { + margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); +} + +.tablist a { + padding: 0 var(--spacing-large); +} + + +/* + Search box + */ + +#MSearchBox { + height: var(--searchbar-height); + background: var(--searchbar-background); + border-radius: var(--searchbar-border-radius); + border: 1px solid var(--separator-color); + overflow: hidden; + width: var(--searchbar-width); + position: relative; + box-shadow: none; + display: block; + margin-top: 0; +} + +/* until Doxygen 1.9.4 */ +.left img#MSearchSelect { + left: 0; + user-select: none; + padding-left: 8px; +} + +/* Doxygen 1.9.5 */ +.left span#MSearchSelect { + left: 0; + user-select: none; + margin-left: 8px; + padding: 0; +} + +.left #MSearchSelect[src$=".png"] { + padding-left: 0 +} + +.SelectionMark { + user-select: none; +} + +.tabs .left #MSearchSelect { + padding-left: 0; +} + +.tabs #MSearchBox { + position: absolute; + right: var(--spacing-medium); +} + +@media screen and (max-width: 767px) { + .tabs #MSearchBox { + position: relative; + right: 0; + margin-left: var(--spacing-medium); + margin-top: 0; + } +} + +#MSearchSelectWindow, #MSearchResultsWindow { + z-index: 9999; +} + +#MSearchBox.MSearchBoxActive { + border-color: var(--primary-color); + box-shadow: inset 0 0 0 1px var(--primary-color); +} + +#main-menu > li:last-child { + margin-right: 0; +} + +@media screen and (max-width: 767px) { + #main-menu > li:last-child { + height: 50px; + } +} + +#MSearchField { + font-size: var(--navigation-font-size); + height: calc(var(--searchbar-height) - 2px); + background: transparent; + width: calc(var(--searchbar-width) - 64px); +} + +.MSearchBoxActive #MSearchField { + color: var(--searchbar-foreground); +} + +#MSearchSelect { + top: calc(calc(var(--searchbar-height) / 2) - 11px); +} + +#MSearchBox span.left, #MSearchBox span.right { + background: none; + background-image: none; +} + +#MSearchBox span.right { + padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); + position: absolute; + right: var(--spacing-small); +} + +.tabs #MSearchBox span.right { + top: calc(calc(var(--searchbar-height) / 2) - 12px); +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + left: auto !important; + right: var(--spacing-medium); + border-radius: var(--border-radius-large); + border: 1px solid var(--separator-color); + transform: translate(0, 20px); + box-shadow: var(--box-shadow); + animation: ease-out 280ms slideInSearchResults; + background: var(--page-background-color); +} + +iframe#MSearchResults { + margin: 4px; +} + +iframe { + color-scheme: normal; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) iframe#MSearchResults { + filter: invert() hue-rotate(180deg); + } +} + +html.dark-mode iframe#MSearchResults { + filter: invert() hue-rotate(180deg); +} + +#MSearchResults .SRPage { + background-color: transparent; +} + +#MSearchResults .SRPage .SREntry { + font-size: 10pt; + padding: var(--spacing-small) var(--spacing-medium); +} + +#MSearchSelectWindow { + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + background: var(--page-background-color); + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); +} + +#MSearchSelectWindow a.SelectItem { + font-size: var(--navigation-font-size); + line-height: var(--content-line-height); + margin: 0 var(--spacing-small); + border-radius: var(--border-radius-small); + color: var(--page-foreground-color) !important; + font-weight: normal; +} + +#MSearchSelectWindow a.SelectItem:hover { + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; +} + +@media screen and (max-width: 767px) { + #MSearchBox { + margin-top: var(--spacing-medium); + margin-bottom: var(--spacing-medium); + width: calc(100vw - 30px); + } + + #main-menu > li:last-child { + float: none !important; + } + + #MSearchField { + width: calc(100vw - 110px); + } + + @keyframes slideInSearchResultsMobile { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: var(--spacing-medium); + overflow: auto; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResultsMobile; + width: auto !important; + } + + /* + * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 + */ + label.main-menu-btn ~ #searchBoxPos1 { + top: 3px !important; + right: 6px !important; + left: 45px; + display: flex; + } + + label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { + margin-top: 0; + margin-bottom: 0; + flex-grow: 2; + float: left; + } +} + +/* + Tree view + */ + +#side-nav { + padding: 0 !important; + background: var(--side-nav-background); + min-width: 8px; + max-width: 50vw; +} + +@media screen and (max-width: 767px) { + #side-nav { + display: none; + } + + #doc-content { + margin-left: 0 !important; + } +} + +#nav-tree { + background: transparent; + margin-right: 1px; +} + +#nav-tree .label { + font-size: var(--navigation-font-size); +} + +#nav-tree .item { + height: var(--tree-item-height); + line-height: var(--tree-item-height); +} + +#nav-sync { + bottom: 12px; + right: 12px; + top: auto !important; + user-select: none; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: transparent; + position: relative; +} + +#nav-tree .selected::after { + content: ""; + position: absolute; + top: 1px; + bottom: 1px; + left: 0; + width: 4px; + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + background: var(--primary-color); +} + + +#nav-tree a { + color: var(--side-nav-foreground) !important; + font-weight: normal; +} + +#nav-tree a:focus { + outline-style: auto; +} + +#nav-tree .arrow { + opacity: var(--side-nav-arrow-opacity); +} + +.arrow { + color: inherit; + cursor: pointer; + font-size: 45%; + vertical-align: middle; + margin-right: 2px; + font-family: serif; + height: auto; + text-align: right; +} + +#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { + opacity: var(--side-nav-arrow-hover-opacity); +} + +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: bolder; + font-weight: 600; +} + +.ui-resizable-e { + width: 4px; + background: transparent; + box-shadow: inset -1px 0 0 0 var(--separator-color); +} + +/* + Contents + */ + +div.header { + border-bottom: 1px solid var(--separator-color); + background-color: var(--page-background-color); + background-image: none; +} + +@media screen and (min-width: 1000px) { + #doc-content > div > div.contents, + .PageDoc > div.contents { + display: flex; + flex-direction: row-reverse; + flex-wrap: nowrap; + align-items: flex-start; + } + + div.contents .textblock { + min-width: 200px; + flex-grow: 1; + } +} + +div.contents, div.header .title, div.header .summary { + max-width: var(--content-maxwidth); +} + +div.contents, div.header .title { + line-height: initial; + margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; +} + +div.header .summary { + margin: var(--spacing-medium) auto 0 auto; +} + +div.headertitle { + padding: 0; +} + +div.header .title { + font-weight: 600; + font-size: 225%; + padding: var(--spacing-medium) var(--spacing-large); + word-break: break-word; +} + +div.header .summary { + width: auto; + display: block; + float: none; + padding: 0 var(--spacing-large); +} + +td.memSeparator { + border-color: var(--separator-color); +} + +span.mlabel { + background: var(--primary-color); + border: none; + padding: 4px 9px; + border-radius: 12px; + margin-right: var(--spacing-medium); +} + +span.mlabel:last-of-type { + margin-right: 2px; +} + +div.contents { + padding: 0 var(--spacing-large); +} + +div.contents p, div.contents li { + line-height: var(--content-line-height); +} + +div.contents div.dyncontent { + margin: var(--spacing-medium) 0; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) div.contents div.dyncontent img, + html:not(.light-mode) div.contents center img, + html:not(.light-mode) div.contents > table img, + html:not(.light-mode) div.contents div.dyncontent iframe, + html:not(.light-mode) div.contents center iframe, + html:not(.light-mode) div.contents table iframe, + html:not(.light-mode) div.contents .dotgraph iframe { + filter: brightness(89%) hue-rotate(180deg) invert(); + } +} + +html.dark-mode div.contents div.dyncontent img, +html.dark-mode div.contents center img, +html.dark-mode div.contents > table img, +html.dark-mode div.contents div.dyncontent iframe, +html.dark-mode div.contents center iframe, +html.dark-mode div.contents table iframe, +html.dark-mode div.contents .dotgraph iframe + { + filter: brightness(89%) hue-rotate(180deg) invert(); +} + +h2.groupheader { + border-bottom: 0px; + color: var(--page-foreground-color); + box-shadow: + 100px 0 var(--page-background-color), + -100px 0 var(--page-background-color), + 100px 0.75px var(--separator-color), + -100px 0.75px var(--separator-color), + 500px 0 var(--page-background-color), + -500px 0 var(--page-background-color), + 500px 0.75px var(--separator-color), + -500px 0.75px var(--separator-color), + 900px 0 var(--page-background-color), + -900px 0 var(--page-background-color), + 900px 0.75px var(--separator-color), + -900px 0.75px var(--separator-color), + 1400px 0 var(--page-background-color), + -1400px 0 var(--page-background-color), + 1400px 0.75px var(--separator-color), + -1400px 0.75px var(--separator-color), + 1900px 0 var(--page-background-color), + -1900px 0 var(--page-background-color), + 1900px 0.75px var(--separator-color), + -1900px 0.75px var(--separator-color); +} + +blockquote { + margin: 0 var(--spacing-medium) 0 var(--spacing-medium); + padding: var(--spacing-small) var(--spacing-large); + background: var(--blockquote-background); + color: var(--blockquote-foreground); + border-left: 0; + overflow: visible; + border-radius: var(--border-radius-medium); + overflow: visible; + position: relative; +} + +blockquote::before, blockquote::after { + font-weight: bold; + font-family: serif; + font-size: 360%; + opacity: .15; + position: absolute; +} + +blockquote::before { + content: "“"; + left: -10px; + top: 4px; +} + +blockquote::after { + content: "”"; + right: -8px; + bottom: -25px; +} + +blockquote p { + margin: var(--spacing-small) 0 var(--spacing-medium) 0; +} +.paramname { + font-weight: 600; + color: var(--primary-dark-color); +} + +.paramname > code { + border: 0; +} + +table.params .paramname { + font-weight: 600; + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + padding-right: var(--spacing-small); + line-height: var(--table-line-height); +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--primary-light-color); +} + +.alphachar a { + color: var(--page-foreground-color); +} + +.dotgraph { + max-width: 100%; + overflow-x: scroll; +} + +.dotgraph .caption { + position: sticky; + left: 0; +} + +/* Wrap Graphviz graphs with the `interactive_dotgraph` class if `INTERACTIVE_SVG = YES` */ +.interactive_dotgraph .dotgraph iframe { + max-width: 100%; +} + +/* + Table of Contents + */ + +div.contents .toc { + max-height: var(--toc-max-height); + min-width: var(--toc-width); + border: 0; + border-left: 1px solid var(--separator-color); + border-radius: 0; + background-color: transparent; + box-shadow: none; + position: sticky; + top: var(--toc-sticky-top); + padding: 0 var(--spacing-large); + margin: var(--spacing-small) 0 var(--spacing-large) var(--spacing-large); +} + +div.toc h3 { + color: var(--toc-foreground); + font-size: var(--navigation-font-size); + margin: var(--spacing-large) 0 var(--spacing-medium) 0; +} + +div.toc li { + padding: 0; + background: none; + line-height: var(--toc-font-size); + margin: var(--toc-font-size) 0 0 0; +} + +div.toc li::before { + display: none; +} + +div.toc ul { + margin-top: 0 +} + +div.toc li a { + font-size: var(--toc-font-size); + color: var(--page-foreground-color) !important; + text-decoration: none; +} + +div.toc li a:hover, div.toc li a.active { + color: var(--primary-color) !important; +} + +div.toc li a.aboveActive { + color: var(--page-secondary-foreground-color) !important; +} + + +@media screen and (max-width: 999px) { + div.contents .toc { + max-height: 45vh; + float: none; + width: auto; + margin: 0 0 var(--spacing-medium) 0; + position: relative; + top: 0; + position: relative; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + background-color: var(--toc-background); + box-shadow: var(--box-shadow); + } + + div.contents .toc.interactive { + max-height: calc(var(--navigation-font-size) + 2 * var(--spacing-large)); + overflow: hidden; + } + + div.contents .toc > h3 { + -webkit-tap-highlight-color: transparent; + cursor: pointer; + position: sticky; + top: 0; + background-color: var(--toc-background); + margin: 0; + padding: var(--spacing-large) 0; + display: block; + } + + div.contents .toc.interactive > h3::before { + content: ""; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + display: inline-block; + margin-right: var(--spacing-small); + margin-bottom: calc(var(--navigation-font-size) / 4); + transform: rotate(-90deg); + transition: transform 0.25s ease-out; + } + + div.contents .toc.interactive.open > h3::before { + transform: rotate(0deg); + } + + div.contents .toc.interactive.open { + max-height: 45vh; + overflow: auto; + transition: max-height 0.2s ease-in-out; + } + + div.contents .toc a, div.contents .toc a.active { + color: var(--primary-color) !important; + } + + div.contents .toc a:hover { + text-decoration: underline; + } +} + +/* + Code & Fragments + */ + +code, div.fragment, pre.fragment { + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + overflow: hidden; +} + +code { + display: inline; + background: var(--code-background); + color: var(--code-foreground); + padding: 2px 6px; +} + +div.fragment, pre.fragment { + margin: var(--spacing-medium) 0; + padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); + background: var(--fragment-background); + color: var(--fragment-foreground); + overflow-x: auto; +} + +@media screen and (max-width: 767px) { + div.fragment, pre.fragment { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } + + .contents > div.fragment, + .textblock > div.fragment, + .textblock > pre.fragment, + .contents > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + border-radius: 0; + border-left: 0; + } + + .textblock li > .fragment, + .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + } + + .memdoc li > .fragment, + .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + } + + .textblock ul, .memdoc ul { + overflow: initial; + } + + .memdoc > div.fragment, + .memdoc > pre.fragment, + dl dd > div.fragment, + dl dd pre.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, + dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, + dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + border-radius: 0; + border-left: 0; + } +} + +code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size) !important; +} + +div.line:after { + margin-right: var(--spacing-medium); +} + +div.fragment .line, pre.fragment { + white-space: pre; + word-wrap: initial; + line-height: var(--fragment-lineheight); +} + +div.fragment span.keyword { + color: var(--fragment-keyword); +} + +div.fragment span.keywordtype { + color: var(--fragment-keywordtype); +} + +div.fragment span.keywordflow { + color: var(--fragment-keywordflow); +} + +div.fragment span.stringliteral { + color: var(--fragment-token) +} + +div.fragment span.comment { + color: var(--fragment-comment); +} + +div.fragment a.code { + color: var(--fragment-link) !important; +} + +div.fragment span.preprocessor { + color: var(--fragment-preprocessor); +} + +div.fragment span.lineno { + display: inline-block; + width: 27px; + border-right: none; + background: var(--fragment-linenumber-background); + color: var(--fragment-linenumber-color); +} + +div.fragment span.lineno a { + background: none; + color: var(--fragment-link) !important; +} + +div.fragment .line:first-child .lineno { + box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); +} + +div.line { + border-radius: var(--border-radius-small); +} + +div.line.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +/* + dl warning, attention, note, deprecated, bug, ... + */ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.post, dl.todo, dl.remark { + padding: var(--spacing-medium); + margin: var(--spacing-medium) 0; + color: var(--page-background-color); + overflow: hidden; + margin-left: 0; + border-radius: var(--border-radius-small); +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color); + border-left: 8px solid var(--warning-color-dark); + color: var(--warning-color-darker); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-dark); +} + +dl.note, dl.remark { + background: var(--note-color); + border-left: 8px solid var(--note-color-dark); + color: var(--note-color-darker); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-dark); +} + +dl.todo { + background: var(--todo-color); + border-left: 8px solid var(--todo-color-dark); + color: var(--todo-color-darker); +} + +dl.todo dt { + color: var(--todo-color-dark); +} + +dl.bug dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug { + background: var(--bug-color); + border-left: 8px solid var(--bug-color-dark); + color: var(--bug-color-darker); +} + +dl.bug dt a { + color: var(--bug-color-dark) !important; +} + +dl.deprecated { + background: var(--deprecated-color); + border-left: 8px solid var(--deprecated-color-dark); + color: var(--deprecated-color-darker); +} + +dl.deprecated dt a { + color: var(--deprecated-color-dark) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color); + border-left: 8px solid var(--invariant-color-dark); + color: var(--invariant-color-darker); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-dark); +} + +/* + memitem + */ + +div.memdoc, div.memproto, h2.memtitle { + box-shadow: none; + background-image: none; + border: none; +} + +div.memdoc { + padding: 0 var(--spacing-medium); + background: var(--page-background-color); +} + +h2.memtitle, div.memitem { + border: 1px solid var(--separator-color); + box-shadow: var(--box-shadow); +} + +h2.memtitle { + box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); +} + +div.memitem { + transition: none; +} + +div.memproto, h2.memtitle { + background: var(--fragment-background); +} + +h2.memtitle { + font-weight: 500; + font-size: var(--memtitle-font-size); + font-family: var(--font-family-monospace); + border-bottom: none; + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + word-break: break-all; + position: relative; +} + +h2.memtitle:after { + content: ""; + display: block; + background: var(--fragment-background); + height: var(--spacing-medium); + bottom: calc(0px - var(--spacing-medium)); + left: 0; + right: -14px; + position: absolute; + border-top-right-radius: var(--border-radius-medium); +} + +h2.memtitle > span.permalink { + font-size: inherit; +} + +h2.memtitle > span.permalink > a { + text-decoration: none; + padding-left: 3px; + margin-right: -4px; + user-select: none; + display: inline-block; + margin-top: -6px; +} + +h2.memtitle > span.permalink > a:hover { + color: var(--primary-dark-color) !important; +} + +a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { + border-color: var(--primary-light-color); +} + +div.memitem { + border-top-right-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-medium); + overflow: hidden; + display: block !important; +} + +div.memdoc { + border-radius: 0; +} + +div.memproto { + border-radius: 0 var(--border-radius-small) 0 0; + overflow: auto; + border-bottom: 1px solid var(--separator-color); + padding: var(--spacing-medium); + margin-bottom: -1px; +} + +div.memtitle { + border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-medium); +} + +div.memproto table.memname { + font-family: var(--font-family-monospace); + color: var(--page-foreground-color); + font-size: var(--memname-font-size); + text-shadow: none; +} + +div.memproto div.memtemplate { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--memname-font-size); + margin-left: 2px; + text-shadow: none; +} + +table.mlabels, table.mlabels > tbody { + display: block; +} + +td.mlabels-left { + width: auto; +} + +td.mlabels-right { + margin-top: 3px; + position: sticky; + left: 0; +} + +table.mlabels > tbody > tr:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.memname, .memitem span.mlabels { + margin: 0 +} + +/* + reflist + */ + +dl.reflist { + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-medium); + border: 1px solid var(--separator-color); + overflow: hidden; + padding: 0; +} + + +dl.reflist dt, dl.reflist dd { + box-shadow: none; + text-shadow: none; + background-image: none; + border: none; + padding: 12px; +} + + +dl.reflist dt { + font-weight: 500; + border-radius: 0; + background: var(--code-background); + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color) +} + + +dl.reflist dd { + background: none; +} + +/* + Table + */ + +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname), +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: inline-block; + max-width: 100%; +} + +.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); +} + +table.fieldtable, +table.markdownTable tbody, +table.doxtable tbody { + border: none; + margin: var(--spacing-medium) 0; + box-shadow: 0 0 0 1px var(--separator-color); + border-radius: var(--border-radius-small); +} + +table.markdownTable, table.doxtable, table.fieldtable { + padding: 1px; +} + +table.doxtable caption { + display: block; +} + +table.fieldtable { + border-collapse: collapse; + width: 100%; +} + +th.markdownTableHeadLeft, +th.markdownTableHeadRight, +th.markdownTableHeadCenter, +th.markdownTableHeadNone, +table.doxtable th { + background: var(--tablehead-background); + color: var(--tablehead-foreground); + font-weight: 600; + font-size: var(--page-font-size); +} + +th.markdownTableHeadLeft:first-child, +th.markdownTableHeadRight:first-child, +th.markdownTableHeadCenter:first-child, +th.markdownTableHeadNone:first-child, +table.doxtable tr th:first-child { + border-top-left-radius: var(--border-radius-small); +} + +th.markdownTableHeadLeft:last-child, +th.markdownTableHeadRight:last-child, +th.markdownTableHeadCenter:last-child, +th.markdownTableHeadNone:last-child, +table.doxtable tr th:last-child { + border-top-right-radius: var(--border-radius-small); +} + +table.markdownTable td, +table.markdownTable th, +table.fieldtable td, +table.fieldtable th, +table.doxtable td, +table.doxtable th { + border: 1px solid var(--separator-color); + padding: var(--spacing-small) var(--spacing-medium); +} + +table.markdownTable td:last-child, +table.markdownTable th:last-child, +table.fieldtable td:last-child, +table.fieldtable th:last-child, +table.doxtable td:last-child, +table.doxtable th:last-child { + border-right: none; +} + +table.markdownTable td:first-child, +table.markdownTable th:first-child, +table.fieldtable td:first-child, +table.fieldtable th:first-child, +table.doxtable td:first-child, +table.doxtable th:first-child { + border-left: none; +} + +table.markdownTable tr:first-child td, +table.markdownTable tr:first-child th, +table.fieldtable tr:first-child td, +table.fieldtable tr:first-child th, +table.doxtable tr:first-child td, +table.doxtable tr:first-child th { + border-top: none; +} + +table.markdownTable tr:last-child td, +table.markdownTable tr:last-child th, +table.fieldtable tr:last-child td, +table.fieldtable tr:last-child th, +table.doxtable tr:last-child td, +table.doxtable tr:last-child th { + border-bottom: none; +} + +table.markdownTable tr, table.doxtable tr { + border-bottom: 1px solid var(--separator-color); +} + +table.markdownTable tr:last-child, table.doxtable tr:last-child { + border-bottom: none; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + display: block; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: table; + width: 100%; +} + +table.fieldtable th { + font-size: var(--page-font-size); + font-weight: 600; + background-image: none; + background-color: var(--tablehead-background); + color: var(--tablehead-foreground); +} + +table.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fielddoc, .fieldtable th { + border-bottom: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); +} + +table.fieldtable tr:last-child td:first-child { + border-bottom-left-radius: var(--border-radius-small); +} + +table.fieldtable tr:last-child td:last-child { + border-bottom-right-radius: var(--border-radius-small); +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +table.memberdecls { + display: block; + -webkit-tap-highlight-color: transparent; +} + +table.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); +} + +table.memberdecls tr[class^='memitem'] .memTemplParams { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + color: var(--primary-dark-color); + white-space: normal; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memItemRight, +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight, +table.memberdecls .memTemplParams { + transition: none; + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + background-color: var(--fragment-background); +} + +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight { + padding-top: 2px; +} + +table.memberdecls .memTemplParams { + border-bottom: 0; + border-left: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + padding-bottom: var(--spacing-small); +} + +table.memberdecls .memTemplItemLeft { + border-radius: 0 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memTemplItemRight { + border-radius: 0 0 var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-left: 0; + border-top: 0; +} + +table.memberdecls .memItemLeft { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + padding-left: var(--spacing-medium); + padding-right: 0; +} + +table.memberdecls .memItemRight { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-right: var(--spacing-medium); + padding-left: 0; + +} + +table.memberdecls .mdescLeft, table.memberdecls .mdescRight { + background: none; + color: var(--page-foreground-color); + padding: var(--spacing-small) 0; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memTemplItemLeft { + padding-right: var(--spacing-medium); +} + +table.memberdecls .memSeparator { + background: var(--page-background-color); + height: var(--spacing-large); + border: 0; + transition: none; +} + +table.memberdecls .groupheader { + margin-bottom: var(--spacing-large); +} + +table.memberdecls .inherit_header td { + padding: 0 0 var(--spacing-medium) 0; + text-indent: -12px; + color: var(--page-secondary-foreground-color); +} + +table.memberdecls img[src="closed.png"], +table.memberdecls img[src="open.png"], +div.dynheader img[src="open.png"], +div.dynheader img[src="closed.png"] { + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + margin-top: 8px; + display: block; + float: left; + margin-left: -10px; + transition: transform 0.25s ease-out; +} + +table.memberdecls img { + margin-right: 10px; +} + +table.memberdecls img[src="closed.png"], +div.dynheader img[src="closed.png"] { + transform: rotate(-90deg); + +} + +.compoundTemplParams { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--code-font-size); +} + +@media screen and (max-width: 767px) { + + table.memberdecls .memItemLeft, + table.memberdecls .memItemRight, + table.memberdecls .mdescLeft, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemLeft, + table.memberdecls .memTemplItemRight, + table.memberdecls .memTemplParams { + display: block; + text-align: left; + padding-left: var(--spacing-large); + margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); + border-right: none; + border-left: none; + border-radius: 0; + white-space: normal; + } + + table.memberdecls .memItemLeft, + table.memberdecls .mdescLeft, + table.memberdecls .memTemplItemLeft { + border-bottom: 0; + padding-bottom: 0; + } + + table.memberdecls .memTemplItemLeft { + padding-top: 0; + } + + table.memberdecls .mdescLeft { + margin-bottom: calc(0px - var(--page-font-size)); + } + + table.memberdecls .memItemRight, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemRight { + border-top: 0; + padding-top: 0; + padding-right: var(--spacing-large); + overflow-x: auto; + } + + table.memberdecls tr[class^='memitem']:not(.inherit) { + display: block; + width: calc(100vw - 2 * var(--spacing-large)); + } + + table.memberdecls .mdescRight { + color: var(--page-foreground-color); + } + + table.memberdecls tr.inherit { + visibility: hidden; + } + + table.memberdecls tr[style="display: table-row;"] { + display: block !important; + visibility: visible; + width: calc(100vw - 2 * var(--spacing-large)); + animation: fade .5s; + } + + @keyframes fade { + 0% { + opacity: 0; + max-height: 0; + } + + 100% { + opacity: 1; + max-height: 200px; + } + } +} + + +/* + Horizontal Rule + */ + +hr { + margin-top: var(--spacing-large); + margin-bottom: var(--spacing-large); + height: 1px; + background-color: var(--separator-color); + border: 0; +} + +.contents hr { + box-shadow: 100px 0 0 var(--separator-color), + -100px 0 0 var(--separator-color), + 500px 0 0 var(--separator-color), + -500px 0 0 var(--separator-color), + 1500px 0 0 var(--separator-color), + -1500px 0 0 var(--separator-color), + 2000px 0 0 var(--separator-color), + -2000px 0 0 var(--separator-color); +} + +.contents img, .contents .center, .contents center, .contents div.image object { + max-width: 100%; + overflow: auto; +} + +@media screen and (max-width: 767px) { + .contents .dyncontent > .center, .contents > center { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); + } +} + +/* + Directories + */ +div.directory { + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + width: auto; +} + +table.directory { + font-family: var(--font-family); + font-size: var(--page-font-size); + font-weight: normal; + width: 100%; +} + +table.directory td.entry, table.directory td.desc { + padding: calc(var(--spacing-small) / 2) var(--spacing-small); + line-height: var(--table-line-height); +} + +table.directory tr.even td:last-child { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; +} + +table.directory tr.even td:first-child { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); +} + +table.directory tr.even:last-child td:last-child { + border-radius: 0 var(--border-radius-small) 0 0; +} + +table.directory tr.even:last-child td:first-child { + border-radius: var(--border-radius-small) 0 0 0; +} + +table.directory td.desc { + min-width: 250px; +} + +table.directory tr.even { + background-color: var(--odd-color); +} + +table.directory tr.odd { + background-color: transparent; +} + +.icona { + width: auto; + height: auto; + margin: 0 var(--spacing-small); +} + +.icon { + background: var(--primary-color); + border-radius: var(--border-radius-small); + font-size: var(--page-font-size); + padding: calc(var(--page-font-size) / 5); + line-height: var(--page-font-size); + transform: scale(0.8); + height: auto; + width: var(--page-font-size); + user-select: none; +} + +.iconfopen, .icondoc, .iconfclosed { + background-position: center; + margin-bottom: 0; + height: var(--table-line-height); +} + +.icondoc { + filter: saturate(0.2); +} + +@media screen and (max-width: 767px) { + div.directory { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode .iconfopen, html.dark-mode .iconfclosed { + filter: hue-rotate(180deg) invert(); +} + +/* + Class list + */ + +.classindex dl.odd { + background: var(--odd-color); + border-radius: var(--border-radius-small); +} + +.classindex dl.even { + background-color: transparent; +} + +/* + Class Index Doxygen 1.8 +*/ + +table.classindex { + margin-left: 0; + margin-right: 0; + width: 100%; +} + +table.classindex table div.ah { + background-image: none; + background-color: initial; + border-color: var(--separator-color); + color: var(--page-foreground-color); + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-large); + padding: var(--spacing-small); +} + +div.qindex { + background-color: var(--odd-color); + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + padding: var(--spacing-small) 0; +} + +/* + Footer and nav-path + */ + +#nav-path { + width: 100%; +} + +#nav-path ul { + background-image: none; + background: var(--page-background-color); + border: none; + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + border-bottom: 0; + box-shadow: 0 0.75px 0 var(--separator-color); + font-size: var(--navigation-font-size); +} + +img.footer { + width: 60px; +} + +.navpath li.footer { + color: var(--page-secondary-foreground-color); +} + +address.footer { + color: var(--page-secondary-foreground-color); + margin-bottom: var(--spacing-large); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--primary-color) !important; +} + +.navpath li.navelem b { + color: var(--primary-dark-color); + font-weight: 500; +} + +li.navelem { + padding: 0; + margin-left: -8px; +} + +li.navelem:first-child { + margin-left: var(--spacing-large); +} + +li.navelem:first-child:before { + display: none; +} + +#nav-path li.navelem:after { + content: ''; + border: 5px solid var(--page-background-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(4.2); + z-index: 10; + margin-left: 6px; +} + +#nav-path li.navelem:before { + content: ''; + border: 5px solid var(--separator-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(3.2); + margin-right: var(--spacing-small); +} + +.navpath li.navelem a:hover { + color: var(--primary-color); +} + +/* + Scrollbars for Webkit +*/ + +#nav-tree::-webkit-scrollbar, +div.fragment::-webkit-scrollbar, +pre.fragment::-webkit-scrollbar, +div.memproto::-webkit-scrollbar, +.contents center::-webkit-scrollbar, +.contents .center::-webkit-scrollbar, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar, +div.contents .toc::-webkit-scrollbar, +.contents .dotgraph::-webkit-scrollbar, +.contents .tabs-overview-container::-webkit-scrollbar { + background: transparent; + width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); +} + +#nav-tree::-webkit-scrollbar-thumb, +div.fragment::-webkit-scrollbar-thumb, +pre.fragment::-webkit-scrollbar-thumb, +div.memproto::-webkit-scrollbar-thumb, +.contents center::-webkit-scrollbar-thumb, +.contents .center::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-thumb, +div.contents .toc::-webkit-scrollbar-thumb, +.contents .dotgraph::-webkit-scrollbar-thumb, +.contents .tabs-overview-container::-webkit-scrollbar-thumb { + background-color: transparent; + border: var(--webkit-scrollbar-padding) solid transparent; + border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + background-clip: padding-box; +} + +#nav-tree:hover::-webkit-scrollbar-thumb, +div.fragment:hover::-webkit-scrollbar-thumb, +pre.fragment:hover::-webkit-scrollbar-thumb, +div.memproto:hover::-webkit-scrollbar-thumb, +.contents center:hover::-webkit-scrollbar-thumb, +.contents .center:hover::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody:hover::-webkit-scrollbar-thumb, +div.contents .toc:hover::-webkit-scrollbar-thumb, +.contents .dotgraph:hover::-webkit-scrollbar-thumb, +.contents .tabs-overview-container:hover::-webkit-scrollbar-thumb { + background-color: var(--webkit-scrollbar-color); +} + +#nav-tree::-webkit-scrollbar-track, +div.fragment::-webkit-scrollbar-track, +pre.fragment::-webkit-scrollbar-track, +div.memproto::-webkit-scrollbar-track, +.contents center::-webkit-scrollbar-track, +.contents .center::-webkit-scrollbar-track, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-track, +div.contents .toc::-webkit-scrollbar-track, +.contents .dotgraph::-webkit-scrollbar-track, +.contents .tabs-overview-container::-webkit-scrollbar-track { + background: transparent; +} + +#nav-tree::-webkit-scrollbar-corner { + background-color: var(--side-nav-background); +} + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc { + overflow-x: auto; + overflow-x: overlay; +} + +#nav-tree { + overflow-x: auto; + overflow-y: auto; + overflow-y: overlay; +} + +/* + Scrollbars for Firefox +*/ + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc, +.contents .dotgraph, +.contents .tabs-overview-container { + scrollbar-width: thin; +} + +/* + Optional Dark mode toggle button +*/ + +doxygen-awesome-dark-mode-toggle { + display: inline-block; + margin: 0 0 0 var(--spacing-small); + padding: 0; + width: var(--searchbar-height); + height: var(--searchbar-height); + background: none; + border: none; + border-radius: var(--searchbar-height); + vertical-align: middle; + text-align: center; + line-height: var(--searchbar-height); + font-size: 22px; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + cursor: pointer; +} + +doxygen-awesome-dark-mode-toggle > svg { + transition: transform .1s ease-in-out; +} + +doxygen-awesome-dark-mode-toggle:active > svg { + transform: scale(.5); +} + +doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.03); +} + +html.dark-mode doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.18); +} + +/* + Optional fragment copy button +*/ +.doxygen-awesome-fragment-wrapper { + position: relative; +} + +doxygen-awesome-fragment-copy-button { + opacity: 0; + background: var(--fragment-background); + width: 28px; + height: 28px; + position: absolute; + right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + border: 1px solid var(--fragment-foreground); + cursor: pointer; + border-radius: var(--border-radius-small); + display: flex; + justify-content: center; + align-items: center; +} + +.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { + opacity: .28; +} + +doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { + opacity: 1 !important; +} + +doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { + transform: scale(.91); +} + +doxygen-awesome-fragment-copy-button svg { + fill: var(--fragment-foreground); + width: 18px; + height: 18px; +} + +doxygen-awesome-fragment-copy-button.success svg { + fill: rgb(14, 168, 14); +} + +doxygen-awesome-fragment-copy-button.success { + border-color: rgb(14, 168, 14); +} + +@media screen and (max-width: 767px) { + .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { + right: 0; + } +} + +/* + Optional paragraph link button +*/ + +a.anchorlink { + font-size: 90%; + margin-left: var(--spacing-small); + color: var(--page-foreground-color) !important; + text-decoration: none; + opacity: .15; + display: none; + transition: opacity .1s ease-in-out, color .1s ease-in-out; +} + +a.anchorlink svg { + fill: var(--page-foreground-color); +} + +h3 a.anchorlink svg, h4 a.anchorlink svg { + margin-bottom: -3px; + margin-top: -4px; +} + +a.anchorlink:hover { + opacity: .45; +} + +h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { + display: inline-block; +} + +/* + Optional tab feature +*/ + +.tabbed { + margin: var(--spacing-medium) auto; +} + +.tabbed ul { + padding-inline-start: 0px; + margin: 0; + padding: var(--spacing-small) 0; + border-bottom: 1px solid var(--separator-color); +} + +.tabbed li { + display: none; +} + +.tabbed li.selected { + display: block; +} + +.tabs-overview-container { + overflow-x: auto; + display: block; + overflow-y: visible; +} + +.tabs-overview { + border-bottom: 1px solid var(--separator-color); + display: flex; + flex-direction: row; +} + +.tabs-overview button.tab-button { + color: var(--page-foreground-color); + margin: 0; + border: none; + background: transparent; + padding: var(--spacing-small) 0; + display: inline-block; + font-size: var(--page-font-size); + cursor: pointer; + box-shadow: 0 1px 0 0 var(--separator-color); + position: relative; +} + +.tabs-overview button.tab-button .tab-title { + float: left; + white-space: nowrap; + padding: var(--spacing-small) var(--spacing-large); + border-radius: var(--border-radius-medium); +} + +.tabs-overview button.tab-button:not(:last-child) .tab-title { + box-shadow: 8px 0 0 -7px var(--separator-color); +} + +.tabs-overview button.tab-button:hover .tab-title { + background: var(--separator-color); + box-shadow: none; +} + +.tabs-overview button.tab-button.active { + color: var(--primary-color); +} + +.tabs-overview button.tab-button.active::after { + content: ''; + display: block; + position: absolute; + left: 0px; + bottom: 0; + right: 0px; + height: 3px; + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + background-color: var(--primary-color); +} diff --git a/docs/doxygen/header.html b/docs/doxygen/header.html index 245b7bd0b8..76396e03e7 100644 --- a/docs/doxygen/header.html +++ b/docs/doxygen/header.html @@ -16,9 +16,54 @@ $mathjax $extrastylesheet - + + + + + + + + + + + - +
diff --git a/docs/doxygen/images/USDLogoDocs.png b/docs/doxygen/images/USDLogoDocs.png index 3f36005b7c..691661489a 100644 Binary files a/docs/doxygen/images/USDLogoDocs.png and b/docs/doxygen/images/USDLogoDocs.png differ diff --git a/docs/doxygen/usd_style.css b/docs/doxygen/usd_style.css index 954c42279f..77f4b71897 100644 --- a/docs/doxygen/usd_style.css +++ b/docs/doxygen/usd_style.css @@ -19,3 +19,16 @@ table.doxtable th:empty { padding: 0; border: 0; } + +/* Style used for "warning banner" shown on non-release version pages, see + also the doxygen header.html AddWarningBanner() fcn */ +.non_release_version_warning { + padding: 0.5em; + text-align: center; + background-color: #FFBABA; + color: #6A0E0E; + margin-bottom: 10px; + font-family: var(--san-serif); + font-weight: 400; + font-size: 16px; +} diff --git a/docs/glossary.rst b/docs/glossary.rst index 30fb169fed..27b4200a3b 100644 --- a/docs/glossary.rst +++ b/docs/glossary.rst @@ -2732,14 +2732,20 @@ creation-time, a session layer participates fully in the stage's `composition <#usdglossary-composition>`_, as the strongest layer in the stage's `Root LayerStack <#usdglossary-rootlayerstack>`_, and can possess its own `SubLayers <#usdglossary-sublayers>`_. Session layers generally embody "application state", -and, if saved, would saved as part of application state rather than as part of -the data set they modify. :ref:`toolset:usdview` creates a sesssion layer, into -which are targeted all `VariantSet <#usdglossary-variantset>`_ selections, +and, if saved, would be saved as part of application state rather than as part +of the data set they modify. :ref:`toolset:usdview` creates a sesssion layer, +into which are targeted all `VariantSet <#usdglossary-variantset>`_ selections, `vis/invis <#usdglossary-visibility>`_ opinions, and `activation/deactivation <#usdglossary-active-inactive>`_ operations provided by the GUI. In keeping with the view of session-layer as application state rather than asset data, :usdcpp:`UsdStage::Save` **does not save its stage's session layer(s)**. +To edit content in a session layer, get the layer's edit target using +:usdcpp:`stage->GetEditTargetForLocalLayer(stage->GetSessionLayer()) +` and set that target in the stage by +calling :usdcpp:`UsdStage::SetEditTarget` or creating a +:usdcpp:`UsdEditContext`. + .. _usdglossary-specializes: Specializes @@ -3344,6 +3350,38 @@ with the addition of allowing the "-" character, and an optional leading ".". { } +A variant can contain overriding opinions (for properties, metadata, and more), +as well as any arbitrary scene description (entire child prim subtrees, etc). +Variants can also **include additional composition arcs**. This gives us great +flexibility in building up variations out of existing, modular pieces that +can be `referenced <#usdglossary-references>`_, `inherited +<#usdglossary-inherits>`_, etc. In the following example snippet, the +"referenceVariantSet" VariantSet contains two variants that reference different +USD assets. Changing the variant selection controls which asset is referenced in +the scene. + +.. code-block:: usda + :caption: VariantSet with references + + over "Model" ( + prepend variantSets = "referenceVariantSet" + variants = { + string referenceVariantSet = "asset1" + } + ) + { + variantSet "referenceVariantSet" = { + "asset1" ( + prepend references = @Asset1.usda@ + ) { + } + "asset2" ( + prepend references = @Asset2.usda@ + ) { + } + } + } + .. _usdglossary-variantset: VariantSet @@ -3441,14 +3479,6 @@ Here is an example of a very simple VariantSet: .. - * Each Variant can contain arbitrary scene description **including the - introduction of additional composition arcs**. This gives us great - flexibility in building up variations out of existing, modular pieces that - can be `referenced <#usdglossary-references>`_, `inherited - <#usdglossary-inherits>`_, etc. - - .. - * Because VariantSets are just composition arcs, this implies that **VariantSets can be directly nested inside each other**, by allowing a Variant of a VariantSet to introduce a new VariantSet. This allows a diff --git a/docs/index_body.rst b/docs/index_body.rst index cc8919bb95..239ad7e8b0 100644 --- a/docs/index_body.rst +++ b/docs/index_body.rst @@ -15,7 +15,7 @@ USD Home |usdlogo| :usdtitletext:`Universal Scene Description` - .. image:: https://graphics.pixar.com/usd/images/piper-banner.jpg + .. image:: https://openusd.org/images/piper-banner.jpg :class: +card-img .. div:: usd-index-brief @@ -60,7 +60,7 @@ USD Home ^^^^^^^^^^^^^ - :doc:`Terms and Concepts ` - `API Documentation `_ - - `usd-interest Group `_ + - `OpenUSD Forum `_ - :doc:`Specifications ` - :doc:`Proposals ` - `USD Cookbook `_ diff --git a/docs/rolesAndUtils.rst b/docs/rolesAndUtils.rst index 989f593e48..798b5e1603 100644 --- a/docs/rolesAndUtils.rst +++ b/docs/rolesAndUtils.rst @@ -44,5 +44,5 @@ .. role:: usdtitletext :class: usd-title-text sidebar-title -.. |usdlogo| image:: https://graphics.pixar.com/usd/images/USDLogoUnsized.svg +.. |usdlogo| image:: https://openusd.org/images/USDLogoUnsized.svg :class: usd-logo-image diff --git a/docs/spec_usdpreviewsurface.rst b/docs/spec_usdpreviewsurface.rst index cee6371122..d61c2fdb34 100644 --- a/docs/spec_usdpreviewsurface.rst +++ b/docs/spec_usdpreviewsurface.rst @@ -429,7 +429,8 @@ UDIM's. * *raw* : Use texture data as it was read from the texture and do not mark it as using a specific color space. - * *sRGB* : Mark texture as sRGB when reading. + * *sRGB* : Mark texture as sRGB when reading. The texture will be read using + the sRGB transfer curve, but not filtered against the sRGB gamut. * *auto* : Check for gamma/color space metadata in the texture file itself; if metadata is indicative of sRGB, mark texture as *sRGB* . If no relevant @@ -1000,7 +1001,7 @@ Changes, by Version Version 2.0 - Initial Public Specification ########################################## -`USD Preview Surface Proposal Version 2.0 `_ +`USD Preview Surface Proposal Version 2.0 `_ Version 2.2 - Before Type Changes ################################# @@ -1012,7 +1013,7 @@ From version 2.0... * Adds :ref:`opacityThreshold ` and clarification of *opacity* behavior for UsdPreviewSurface -`USD Preview Surface Proposal Version 2.2 `_ +`USD Preview Surface Proposal Version 2.2 `_ Version 2.3 ########### diff --git a/docs/toc.rst b/docs/toc.rst index 6185d1e020..b9270200db 100644 --- a/docs/toc.rst +++ b/docs/toc.rst @@ -30,7 +30,7 @@ :caption: Collaborate Source Code @ GitHub - usd-interest Group + OpenUSD Forum Contributing Contributors diff --git a/docs/tut_authoring_variants.rst b/docs/tut_authoring_variants.rst index 8c13d33171..25ec7a34d6 100644 --- a/docs/tut_authoring_variants.rst +++ b/docs/tut_authoring_variants.rst @@ -344,9 +344,9 @@ these files to a working directory and make them writable. .. image:: http://openusd.org/images/tut_authoring_variants_helloworld2.png #. In the interpreter you can see the variant selections that usdview authors to - the session layer. This is the same sparse override you would see if you - referenced this layer into another one and authored the variant selection in - the referencing layer. + the `session layer <#usdglossary-sessionlayer>`_ . This is the same sparse + override you would see if you referenced this layer into another one and + authored the variant selection in the referencing layer. .. code-block:: python diff --git a/docs/tut_generating_new_schema.rst b/docs/tut_generating_new_schema.rst index 0110c8d40b..9150272ca3 100644 --- a/docs/tut_generating_new_schema.rst +++ b/docs/tut_generating_new_schema.rst @@ -383,7 +383,7 @@ Create a usd file named Test.usda with the following content: .. code-block:: usda :caption: Test.usda - #usda 1.0 + #usda 1.0 def ComplexPrim "Complex" { @@ -442,20 +442,20 @@ and uses the API provided by schema code generation. .. code-block:: python :caption: Python Example - from pxr import Usd, UsdSchemaExamples - stage = Usd.Stage.Open("Test.usda") - cp = stage.GetPrimAtPath("/Complex") - simple = UsdSchemaExamples.Simple(cp) - target = simple.GetTargetRel() - intAttr = simple.GetIntAttrAttr() - complex = UsdSchemaExamples.Complex(cp) - print('complexString: %s' % complex.GetComplexStringAttr().Get()) - obj = stage.GetPrimAtPath("/Object") - paramsAPI = UsdSchemaExamples.ParamsAPI.Apply(obj) - assert obj.HasAPI(UsdSchemaExamples.ParamsAPI) - print('mass: %s' % paramsAPI.GetMassAttr().Get()) - print('velocity: %s' % paramsAPI.GetVelocityAttr().Get()) - print('volume: %s' % paramsAPI.GetVolumeAttr().Get()) + from pxr import Usd, UsdSchemaExamples + stage = Usd.Stage.Open("Test.usda") + cp = stage.GetPrimAtPath("/Complex") + simple = UsdSchemaExamples.Simple(cp) + target = simple.GetTargetRel() + intAttr = simple.GetIntAttrAttr() + complex = UsdSchemaExamples.Complex(cp) + print('complexString: %s' % complex.GetComplexStringAttr().Get()) + obj = stage.GetPrimAtPath("/Object") + paramsAPI = UsdSchemaExamples.ParamsAPI.Apply(obj) + assert obj.HasAPI(UsdSchemaExamples.ParamsAPI) + print('mass: %s' % paramsAPI.GetMassAttr().Get()) + print('velocity: %s' % paramsAPI.GetVelocityAttr().Get()) + print('volume: %s' % paramsAPI.GetVolumeAttr().Get()) Codeless Schemas **************** diff --git a/docs/tut_setup_version_badge.rst b/docs/tut_setup_version_badge.rst index 0ac8bd56ee..2e0e836ff9 100644 --- a/docs/tut_setup_version_badge.rst +++ b/docs/tut_setup_version_badge.rst @@ -2,4 +2,4 @@ :fa:`cogs` :ref:`Configure your Environment ` - :fa:`check` Tested with `USD 23.05 `_ + :fa:`check` Tested with `USD 23.08 `_ diff --git a/docs/tut_traversing_stage.rst b/docs/tut_traversing_stage.rst index cdfd8974f0..75b584fbb8 100644 --- a/docs/tut_traversing_stage.rst +++ b/docs/tut_traversing_stage.rst @@ -77,7 +77,8 @@ folder to a working directory and make its contents writable. .. image:: http://openusd.org/images/tut_traversing_stage_refexample.png - You can inspect the contents of the session layer in the interpreter to see + You can inspect the contents of the + `session layer <#usdglossary-sessionlayer>`_ in the interpreter to see the authored deactivation opinion. .. code-block:: pycon diff --git a/docs/wp.rst b/docs/wp.rst index aa68931f25..bb2b06d1d0 100644 --- a/docs/wp.rst +++ b/docs/wp.rst @@ -2,8 +2,12 @@ Proposals ######### +.. note:: + + New proposals will no longer be added here. Proposals should now be posted + and reviewed at `OpenUSD-proposals `_ + .. toctree:: - :caption: Proposals :titlesonly: wp_usdlux_for_geometry_lights diff --git a/docs/wp_schema_versioning.rst b/docs/wp_schema_versioning.rst index a413a7e7d7..c1b2224e46 100644 --- a/docs/wp_schema_versioning.rst +++ b/docs/wp_schema_versioning.rst @@ -262,7 +262,7 @@ versions of an API schema to be applied to the same prim might facilitate interchange between DCCs that are running different versions of USD. We believe that a preferable approach with fewer side-effects for accomplishing this same goal might be to extend the existing feature of `fallback prim types -`_ +`_ to apply to authored API schemas (currently the feature is only defined for concrete prim type names) and to automatically determine fallback types for schema versions that are authored but don’t exist in the USD version. But diff --git a/docs/wp_stage_variables.rst b/docs/wp_stage_variables.rst index ff6a01ca4a..040827c9d4 100644 --- a/docs/wp_stage_variables.rst +++ b/docs/wp_stage_variables.rst @@ -2,642 +2,7 @@ Stage Variable Expressions ========================== -.. include:: rolesAndUtils.rst -.. include:: +.. note:: -Copyright |copy| 2022, Pixar Animation Studios, *version 1.0* - -.. contents:: :local: - -Introduction -============ - -We propose adding the ability to specify expressions in scene description that -will be evaluated by USD at runtime. These expressions will be allowed to refer -to "stage variables," which are entries in a dictionary-valued layer metadata -field that (with some limitations) are composed across composition arcs. - -Support for these expressions will initially be limited to two specific areas: - -- Asset paths (including sublayer, reference, and payload asset paths as well as - asset path-valued attributes and metadata) -- Variant selections - -.. code-block:: usda - :caption: Mock-up with Stage Variables and Expressions - - #usda 1.0 - ( - stageVariables = { - string PROD = "s101" - string SHOT = "01" - bool IS_SPECIAL_SHOT = "`in(${SHOT}, ['01', '03', '05'])`" - string CROWDS_SHADING_VARIANT = "baked" - } - - # Examples of expressions in sublayer asset paths. - subLayers = [ - @`if(${IS_SPECIAL_SHOT}, "special_shot_overrides.usd")`@, - @`${PROD}_${SHOT}_fx.usd`@ - ] - ) - - # Examples of expressions in references and asset-valued attributes. - def "Sox" ( - references = @`${PROD}/Sox/usd/Sox.usd`@ - ) - { - asset skinTexture = @`Sox_${SHOT}_Texture.png`@ - } - - # Example of conditional variant selection - def "Buzz" ( - references = @Buzz/usd/Buzz.usd@ - variants = { - string modelVariant = "`if(eq(${SHOT}, "01"), "01_variant", "regular")`" - } - ) - { - # ... - } - - # Example of unified variant selection - def "CrowdCharA" ( - references = @CrowdCharA/usd/CrowdCharA@ - variants = { - string shadingVariant = "`${CROWDS_SHADING_VARIANT}`" - } - ) - { - # ... - } - - def "CrowdCharB" ( - references = @CrowdCharB/usd/CrowdCharB@ - variants = { - string shadingVariant = "`${CROWDS_SHADING_VARIANT}`" - } - ) - { - # ... - } - -Expressions -=========== - -Expressions are written in a custom domain-specific language. The syntax and -initial set of operations is TBD. In particular, expressions should be -functional and strongly-typed. The examples in this document are strawmen for -discussion. - -Expressions are represented as strings that are surrounded with backticks -(`````). This allows code to recognize expressions with a simple test, which helps -minimize performance cost when this feature is not being used and allows better -error messages. If we didn't explicitly identify expressions somehow, the only -way we'd know it was an expression would be to try to evaluate it (or at least -parse it). - -Since expressions are just decorated strings clients could just set them using -existing API for authoring asset paths and variant selections. For example: - -.. code-block:: python - - # Asset Paths: - assetPathWithExpr = Sdf.AssetPath('`if(eq(${SHOT}, "01"), "shot_01.usd", "shot_other.usd")`') - - # Variant Selections: - primSpec.variantSelections['modelVariant'] = '`if(eq(${SHOT}, "01"), "shot_01_variant", "shot_other_variant")`' - -Stage Variables -=============== - -Stage variables are the only scene description that expressions are allowed to -refer to. These variables may be strings, bools, or ints and are stored in a -dictionary-valued layer metadata field named ``stageVariables``. Stage variables -may themselves be expressions, so that common logic can be factored into a -single location for convenience and brevity. - -As the name implies, stage variables are stage metadata, meaning they must be -authored on either the root or session layer of a stage or in the root layer of -a referenced layer stack. See below for more discussion of the composition -behaviors. - -.. code-block:: usda - - #usda 1.0 - ( - stageVariables = { - string SHOT = "01" - string PROD = "r345" - bool IS_SHOT_01 = '`eq(${SHOT}, "01")`' - } - ) - - # ... - -Stage Variables DO NOT Compose Across Sublayers ------------------------------------------------ - -Like all other stage metadata, stage variables do not compose across sublayers -in a layer stack except for the session and root layers of a stage. - -This restriction is primarily needed because sublayers may themselves be -specified using expressions that rely on stage variables. If we allowed stage -variables to compose across sublayers, we'd introduce circular dependencies that -would be, at best, difficult to handle consistently. For example, - -.. code-block:: usda - - #usda 1.0 - ( - subLayers = [ - # sub_2.usd specifies stageVariables[MYFLAG] = 2 - @`if(eq(${MYFLAG}, 1), "sub_2.usd", "sub_1.usd")`@, - - # Specifies stageVariables[MYFLAG] = 1 - @prod.usd@ - ] - ) - - # ... - -Let's assume stage variables did compose across sublayers. This layer stack -could be evaluated two different ways: - -- If the expression is evaluated first, it will not find a MYFLAG stage var and - will load sub_1.usd . Then, prod.usd will be loaded, which introduces MYFLAG=1 - . If a user were to ask the stage for the composed stage vars, it would return - MYFLAG=1 , but that would be inconsistent with the fact that sub_1.usd had - been loaded. - -- If the weakest layer is evaluated first, the stage var MYFLAG=1 will be set, - which will cause the expression to evaluate to and load sub_2.usd , which sets - MYFLAG=2 . If a user were to ask for the composed stage vars, it would return - MYFLAG=2 (because it was introduced in a stronger sublayer), but again this - would be inconsistent with the sublayers that had actually been loaded. - -This example also shows that allowing composition across sublayers would make it -difficult (impossible?) to enable multithreaded loading of sublayers in layer -stacks, again because of intra-sublayer dependencies. - -Stage Variables DO Compose Across References / Payloads -------------------------------------------------------- - -If a referenced layer stack contains expressions that refer to stage variables, -the stage variables from the chain of referencing layer stacks will be composed -together and used to evaluate those expressions. However, note that the sublayer -restriction from above still applies, so only stage variables authored on the -root layer of the layer stacks will be considered. - -This ensures that assets that internally use expressions referring to stage -variables can be referenced by another asset and still work as expected. This -also gives the referencing asset the ability to override the stage variables -used by the referenced asset. For example: - -.. code-block:: usda - :caption: ModelGroup.usd - - #usda 1.0 - ( - stageVariables = { - string MODEL_VARIANT = "var_1" - } - ) - - def "ModelGroup" - { - def "Model_1" ( - variantSelections = { - string modelVariant = "`${MODEL_VARIANT}`" - } - ) { } - - def "Model_2" ( - variantSelections = { - string modelVariant = "`${MODEL_VARIANT}`" - } - ) { } - } - -.. code-block:: usda - :caption: Stage1.usd - - #usda 1.0 - - # The expected behavior would be to bring in ModelGroup - # with variant selection "modelVariant=var_1" for all - # models in the group. - def "ModelGroup" ( - references = @./ModelGroup.usd@ - ) - { - } - -.. code-block:: usda - :caption: Stage2.usd - - #usda 1.0 - ( - stageVariables = { - string MODEL_VARIANT = "var_2" - } - ) - - # Now all models in this model group come in with - # variantSelection "modelVariant=var_2" - def "ModelGroup" ( - references = @./ModelGroup.usd@ - ) - { - } - -Areas of Consideration -====================== - -Composition ------------ - -During composition, `Pcp `_ will inspect layer asset -paths in composition arcs (e.g, sublayers, references, payloads) to determine if -they contain an expression and, if so, will evaluate them using the stage -variables composed to that point in the composition graph. - -If the expression is successfully evaluated, Pcp will treat the resulting string -like it would any other authored asset path: it will try to find or open the -layer at that path to continue the composition process and issue a composition -error if it fails to do so. - -If the expression cannot be evaluated, Pcp will issue a composition error that -will include information about the expression. The expression may fail to -evaluate due to a syntax error, or because it references a stage variable that -has no value. This error is distinct from the "invalid asset path" error -mentioned above that is issued when a layer at a given asset path cannot be -opened. It's important to treat these separately to provide the user with good -diagnostics. However, if an expression evaluates to an empty string, it will be -treated as though there was no value and will *not* result in an "invalid asset -path" error. - -The behavior is the same for variant selections containing expressions. If the -expression is successfully evaluated Pcp will treat the resulting string like it -would an authored variant selection. If the expression fails to evaluate (for -the same reasons above), Pcp will issue a composition error including -information about the expression. - -Asset Path Attributes and Metadata ----------------------------------- - -Currently, calling :usdcpp:`UsdAttribute::Get` on asset path-valued attributes -returns an :usdcpp:`SdfAssetPath` containing two fields: - -- The "unresolved" asset path, which today is just the strongest authored value - for the attribute. - -- The "resolved" asset path, which is the result of resolving the above via - :usdcpp:`ArResolver`. If :usdcpp:`UsdAttribute` detects that the unresolved - asset path contains an expression, it will evaluate them using the stage - variables composed to the point in the composition graph where the asset path - was authored. - -If the expression is successfully evaluated into an asset path, -:usdcpp:`UsdAttribute` will return an :usdcpp:`SdfAssetPath` with the unresolved -path set to the evaluated asset path and the resolved path set to the result of -resolving that asset path. - -If the evaluation fails due to a syntax error, the unresolved asset path will be -set to the authored expression and no attempt to resolve that path will -occur. However, if the evaluation produces an asset path that just has a missing -variable substitution, the unresolved path will be set to that "partial" result -instead and :usdcpp:`UsdAttribute` will attempt to resolve that path. For example: - -.. code-block:: usda - - # Usd.Attribute.Get() returns Sdf.AssetPath('`bogus_expression("foo.usd")`', '') - asset badExpression = @`bogus_expression("foo.usd")`@ - - # Usd.Attribute.Get() returns Sdf.AssetPath(`foo_${THIS_VAR_MISSING}.usd`, '') - asset partialExpression = @`if(${SOME_TRUE_VALUE}, "foo_${THIS_VAR_MISSING}.usd")`@ - -This partial expression behavior allows substitution tokens to pass through Usd -for further evaluation by downstream clients. - -The same behavior described above applies for asset path-valued metadata -(including asset paths authored in dictionaries) retrieved via -:usdcpp:`UsdObject::GetMetadata`. - -Change Processing ------------------ - -Changes to stage variables that are used in expressions in references and other -composition arcs will trigger recomposition as needed, as much of the necessary -dependency tracking for this is already in place in Pcp. - -Changes that affect expressions in asset path-valued attributes and metadata -present a bigger problem. Ideally, these would cause :usdcpp:`UsdStage` to send -out a change notice for just the prims and properties that were -affected. However, since :usdcpp:`UsdStage` does not cache or pre-compute any of -these values, it currently has no way of determining exactly what objects on the -stage depend on a given stage variable. - -To work around this, when the composed value of a stage variable changes, -:usdcpp:`UsdStage` will send out a notice indicating a full resync of the stage, -even though internally nothing may actually be recomposed. This is a heavy -hammer but ensures that clients will be made aware that there was a possible -change to any asset path-valued attributes. :usdcpp:`UsdStage` already takes -this approach when dealing with "resolver changed" notices from Ar, which -indicate that any asset path that had previously been resolved might now resolve -to a new path (see here). - -An alternative solution is to provide a new Usd notice (or an extra bit on the -existing :usdcpp:`UsdNotice::ObjectsChanged` notice) that specifically indicates -that all asset path values may have changed on the associated change, instead of -sending out the full resync notice. This allows clients to choose the level of -invalidation they need to perform in response to this change, but it puts -clients on the hook for processing this new notice. - -Yet another alternative is to implement the caching for asset path-valued -attributes and metadata mentioned above. :usdcpp:`UsdStage` would keep track of -the asset paths it has handed out via :usdcpp:`UsdAttribute::Get` and other API -and use that to determine what asset paths were affected by a stage variable -change. This would allow the normal :usdcpp:`UsdNotice::ObjectsChanged` notice -to be sent instead of the coarse invalidation mentioned above. This approach -would fit into existing client code more easily, but would add extra overhead -and complexity to UsdStage when retrieving the asset path values. This overhead -should be limited to just asset path values, although some experimentation would -be needed to confirm this. - -Dependency Analysis / Asset Isolation -------------------------------------- - -Dependency analysis involves inspecting a given asset for all other assets it -refers to. This information is used by asset isolation to create a separate copy -of an asset in a different location that can be packaged up and distributed to -other locations while maintaining the same behaviors. In USD, this is primarily -handled by code like :usdcpp:`UsdUtilsComputeAllDependencies`. - -The analysis process recursively walks layers while looking at scene description -like composition arcs and attributes for references to other assets, which are -recorded as dependencies. This process gets complicated with expressions in the -mix, since the full set of referenced assets may not be enumerable just by -looking at the scene description. - -The simplest case is an asset where all of the stage variables referenced by -expressions in that asset are defined. In that case, every expression can be -evaluated and the resulting assets noted as explicit dependencies. For example, -consider something like: - -.. code-block:: usda - - #usda 1.0 - ( - stageVariables = { - string VAR = "x" - } - ) - - def "Asset" ( - references = @`if(eq(${VAR}, "x"), "x.usd" : "y.usd"`@ - ) - { - } - -In this case, dependency analysis can determine that this asset in its current -state depends only on :filename:`x.usd`, so asset isolation would just copy over -that file. That should be sufficient for cases where we only need to consume the -isolated asset as-is. - -But, what if we needed to work with the isolated asset fully and change VAR to -"y" sometimes? In that case, we'd need dependency analysis to recognize that -:filename:`y.usd` is a possible dependency and must also be captured. That is -possible in the example above, since the results of the "if" expression are -enumerable just by looking at the expression itself. But just a simple direct -substitution in an asset path makes this impossible: - -.. code-block:: usda - - #usda 1.0 - ( - stageVariables = { - string VAR = "x" - } - ) - - def "Asset" ( - references = @`${VAR}.usd`@ - ) - { - } - -In this case, the best that dependency analysis can do is note that -:filename:`x.usd` is a dependency – it has no idea that :filename:`y.usd` is a -possible value. - -Dependency analysis will make a "best effort" attempt at enumerating all -possible dependencies. This implies the ability to evaluate expressions in some -mode where all possible results are returned if possible. As an initial step, -for cases like variable substitutions where the possible results are not -enumerable, dependency analysis will issue a warning. - -In the future (or possibly as part of this work, if we deem it necessary), the -dependency analysis functions would allow users to supply a callback or plugin -that would be expected to list all of the possible results of a given -expression. We could provide a default callback implementation that relies on -filesystem operations and globbing. - -GUI Support ------------ - -:ref:`toolset:usdview` will be updated to display the evaluated expression (or -optionally the authored expression) in its UI for payload/references/sublayer -asset paths. - -For variant selections, the combo box that lets users pick a selection will be -disabled, but will display the evaluated expression. - -In both cases, we may want to add some kind of affordance to allow users to view -the expression itself. - -Example Use Cases -================= - -Variant Selections ------------------- - -Stage variable expressions can provide flexible ways of specifying variations -for logical groups of prims that are controlled via a single stage variable. - -For example, consider an asset with a large crowd of models, each with variants -controlling some aspect of their look, like a color palette. The crowds artist -could select models that should have the same color palette and set their -variant selections to corresponding stage variables, like: - -.. code-block:: usda - :caption: Crowd.usd - - #usda 1.0 - ( - stageVariables = { - string COLOR_GROUP_1 = "regular" - string COLOR_GROUP_2 = "regular" - } - ) - - def "Crowd" - { - def "Model_1" ( - variantSelection = { - string palette = "${COLOR_GROUP_1}" - } - ) - { - } - - def "Model_2" ( - variantSelection = { - string palette = "${COLOR_GROUP_2}" - } - ) - { - } - - # etc., etc. ... - } - -When an artist references this crowd asset into their own stage, they can -change the color palettes for all of the prims in the groups determined -by the original crowd artist just by overriding the stage variable: - -.. code-block:: usda - :caption: Shot.usd - - #usda 1.0 - ( - stageVariables = { - string COLOR_GROUP_1 = "rainbow" - string COLOR_GROUP_2 = "monochrome" - } - ) - - def "Crowd" (references = @Crowd.usd@) - { - } - -The artist can still change the palette variant on individual models if -they desire simply by overriding the variant selection on the specific prim. - -Varying Texture Format ----------------------- - -Disney Animation's Moana Island data set uses :filename:`.png` and -:filename:`.exr` files for environment maps by default. However, RenderMan -does not support these formats, so the data set provides an alternate root -layer that overrides the attributes specifying these maps with -:filename:`.tex` images instead. On one hand, this demonstrates the power -of USD's sparse overrides. On the other hand, it means these overrides -have to be kept in sync with the underlying data set -- if the namespace -location of the skydome prim changed, for example, the overrides would -need to be updated as well. - -With stage variable expressions, this difference could be encoded at the -asset path attribute itself: - -.. code-block:: usda - - asset inputs:texture:file = @`if(${FOR_PRMAN}, "../textures/islandsunEnv.tex", "../textures/islandsun.exr")@ - -The data set could still provide the RenderMan-specific root layer as an -entry point, but instead of overriding the texture attributes it would just -set the FOR_PRMAN stage variable to true. - -Render Passes -------------- - -One intended use case at Pixar is to encode a named "render pass" into a -stage variable and conditionally include sublayers based on the specified -render pass. For example, an artist could specify that they are rendering the -``fx`` render pass for a given shot via a stage variable. The shot's sublayer -list would include a special sublayer that deactivated non-effects-related -geometry to speed up processing. Shots might have many different render pass -layers for the artist to choose from, each of which would prune out geometry -or perform other overrides specific to that pass. This might look like: - -.. code-block:: usda - - #usda 1.0 - ( - subLayers = [ - @render_pass_${RENDER_PASS}.usd@, - ... - ] - ) - -Shot-Level Overrides in Sequences ---------------------------------- - -At Pixar, animation is organized into sequences (e.g. r720) that are groups of -shots (e.g. r720_1, r720_2, etc.). Sequences may contain tens of shots. The -scene description for each shot typically consists of a root layer for that -shot, which then includes a series of sublayers for various departments that are -specific to that shot, followed by a series of sublayers that are specific to -that sequence and shared among all of the constituent shots. Here's a very -simplified example: - -+-------------------+-------------------+ -| r720_1 layers | r720_2 layers | -+===================+===================+ -| r720_1.usd | r720_2.usd | -+-------------------+-------------------+ -| r720_1_anim.usd | r720_2_anim.usd | -+-------------------+-------------------+ -| r720_1_layout.usd | r720_2_layout.usd | -+-------------------+-------------------+ -| r720.usd | -+---------------------------------------+ -| r720_anim.usd | -+---------------------------------------+ -| r720_layout.usd | -+---------------------------------------+ - -During production, there are cases where the same set of overrides must -be authored on a subset of the shots in a sequence. We currently deal with -this by using a tool that iterates over the desired shots and applies the -edits to each one. Scene variable expressions could simplify this greatly -by authoring the edits into a sequence-level sublayer that is only included -for the desired shots. This might look like: - -.. code-block:: usda - :caption: r720_1.usd - - #usda 1.0 - ( - stageVariables = { - string SHOT = "01" - } - ) - - #... - -.. code-block:: usda - :caption: r720_2.usd - - #usda 1.0 - ( - stageVariables = { - string SHOT = "02" - } - ) - - #... - -.. code-block:: usda - :caption: r720.usd - - #usda 1.0 - ( - subLayers = [ - @`if(in(${SHOT}, ["01", "03"]), "r720_shot_edits.usd")`@, - @r720_anim.usd@, - ... - ] - ) - - #... + This proposal has been migrated to `OpenUSD-proposals: Stage Variable Expressions + `_. \ No newline at end of file diff --git a/docs/wp_usdlux_for_geometry_lights.rst b/docs/wp_usdlux_for_geometry_lights.rst index 98938e7fd0..63e781e610 100644 --- a/docs/wp_usdlux_for_geometry_lights.rst +++ b/docs/wp_usdlux_for_geometry_lights.rst @@ -43,7 +43,7 @@ add GeometryLight support to Hydra and HdPrman, we need to address two concerns: In support of the first concern, we have had extensive internal discussions about workflow. This document and the proposal it contains are derived from those discussions, with inspiration also from several key discussions on the -usd-interest forum. +OpenUSD forum. In support of the second concern, we have done a documentation search on `RenderMan `_, `Arnold diff --git a/docs/wp_usdlux_for_renderers.rst b/docs/wp_usdlux_for_renderers.rst index 8407ea2af7..7416b09a52 100644 --- a/docs/wp_usdlux_for_renderers.rst +++ b/docs/wp_usdlux_for_renderers.rst @@ -83,7 +83,7 @@ The **limitation** of fully representing lights as Sdr-based shaders is that Sdr's dynamic and fluid nature cannot provide any mechanism for standardization of classes or types of shaders, and therefore it cannot help us define a standard for cross-renderer interchange - this analysis extends to the pattern -(which has been suggested on the *usd-interest* forum) of binding lights to +(which has been suggested on the OpenUSD forum) of binding lights to UsdShadeMaterials to achieve complete expressiveness of light-shader networks. Cross-renderer interchange of lights is the entire point of UsdLux, which, in addition to providing certain core encodings and behaviors such as light diff --git a/extras/imaging/examples/hdui/sceneIndexDebuggerWidget.cpp b/extras/imaging/examples/hdui/sceneIndexDebuggerWidget.cpp index c7e0b813d3..2a01a10a90 100644 --- a/extras/imaging/examples/hdui/sceneIndexDebuggerWidget.cpp +++ b/extras/imaging/examples/hdui/sceneIndexDebuggerWidget.cpp @@ -44,15 +44,6 @@ PXR_NAMESPACE_OPEN_SCOPE -// XXX stevel: low-tech temporary symbol name demangling until we manage these -// via a formal plug-in/type registry -static -std::string -Hdui_StripNumericPrefix(const std::string &s) -{ - return TfStringTrimLeft(s, "0123456789"); -} - HduiSceneIndexDebuggerWidget::HduiSceneIndexDebuggerWidget(QWidget *parent) : QWidget(parent) { @@ -156,8 +147,7 @@ HduiSceneIndexDebuggerWidget::SetSceneIndex(const std::string &displayName, std::ostringstream buffer; if (sceneIndex) { buffer << "("; - std::string typeName = typeid(*sceneIndex).name(); - buffer << Hdui_StripNumericPrefix(typeName); + buffer << sceneIndex->GetDisplayName(); buffer << ") "; } buffer << displayName; @@ -238,7 +228,8 @@ HduiSceneIndexDebuggerWidget::_AddSceneIndexToTreeMenu( if (includeSelf) { _InputSelectionItem *item = new _InputSelectionItem(parentItem); item->setText(0, - Hdui_StripNumericPrefix(typeid(*sceneIndex).name()).c_str()); + sceneIndex->GetDisplayName().c_str()); + item->sceneIndex = sceneIndex; parentItem = item; diff --git a/extras/imaging/examples/hdui/sceneIndexObserverLoggingTreeView.cpp b/extras/imaging/examples/hdui/sceneIndexObserverLoggingTreeView.cpp index ddbd61b59e..2df4a4ca87 100644 --- a/extras/imaging/examples/hdui/sceneIndexObserverLoggingTreeView.cpp +++ b/extras/imaging/examples/hdui/sceneIndexObserverLoggingTreeView.cpp @@ -165,6 +165,25 @@ HduiSceneIndexObserverLoggingTreeView::_ObserverModel::PrimsDirtied( endInsertRows(); } +void +HduiSceneIndexObserverLoggingTreeView::_ObserverModel::PrimsRenamed( + const HdSceneIndexBase &sender, + const RenamedPrimEntries &entries) +{ + if (!_isRecording) { + return; + } + + std::unique_ptr<_RenamedPrimsNoticeModel> notice( + new _RenamedPrimsNoticeModel); + notice->_entries = entries; + notice->_index = _notices.size(); + + beginInsertRows(QModelIndex(), _notices.size(), _notices.size()); + _notices.push_back(std::move(notice)); + endInsertRows(); +} + //----------------------------------------------------------------------------- HduiSceneIndexObserverLoggingTreeView::_ObserverModel::_NoticeModelBase * @@ -387,4 +406,42 @@ ::data(const QModelIndex &index, int role) return QVariant(); } +//----------------------------------------------------------------------------- + +const char * +HduiSceneIndexObserverLoggingTreeView::_ObserverModel::_RenamedPrimsNoticeModel +::noticeTypeString() +{ + static const char *s = "Renamed"; + return s; +} + +int +HduiSceneIndexObserverLoggingTreeView::_ObserverModel::_RenamedPrimsNoticeModel +::rowCount() +{ + return static_cast(_entries.size()); +} + +QVariant +HduiSceneIndexObserverLoggingTreeView::_ObserverModel::_RenamedPrimsNoticeModel +::data(const QModelIndex &index, int role) +{ + if (index.row() >= static_cast(_entries.size())) { + return QVariant(); + } + + if (index.column() == 0) { + return QVariant( + QString(_entries[index.row()].oldPrimPath.GetString().c_str())); + } + + if (index.column() == 1) { + return QVariant( + QString(_entries[index.row()].newPrimPath.GetString().c_str())); + } + + return QVariant(); +} + PXR_NAMESPACE_CLOSE_SCOPE diff --git a/extras/imaging/examples/hdui/sceneIndexObserverLoggingTreeView.h b/extras/imaging/examples/hdui/sceneIndexObserverLoggingTreeView.h index 544ee95ef8..ee93f3157a 100644 --- a/extras/imaging/examples/hdui/sceneIndexObserverLoggingTreeView.h +++ b/extras/imaging/examples/hdui/sceneIndexObserverLoggingTreeView.h @@ -77,6 +77,10 @@ public Q_SLOTS: const HdSceneIndexBase &sender, const DirtiedPrimEntries &entries) override; + void PrimsRenamed( + const HdSceneIndexBase &sender, + const RenamedPrimEntries &entries) override; + // satisfying QAbstractItemModel QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; @@ -139,6 +143,16 @@ public Q_SLOTS: RemovedPrimEntries _entries; }; + struct _RenamedPrimsNoticeModel : _NoticeModelBase + { + const char * noticeTypeString() override; + int rowCount() override; + QVariant data(const QModelIndex &index, + int role = Qt::DisplayRole) override; + + RenamedPrimEntries _entries; + }; + _NoticeModelBase * _GetModelBase(void *ptr) const; std::vector> _notices; diff --git a/extras/imaging/examples/hdui/sceneIndexTreeWidget.cpp b/extras/imaging/examples/hdui/sceneIndexTreeWidget.cpp index f9eac0bb03..5e46202ab0 100644 --- a/extras/imaging/examples/hdui/sceneIndexTreeWidget.cpp +++ b/extras/imaging/examples/hdui/sceneIndexTreeWidget.cpp @@ -292,6 +292,13 @@ HduiSceneIndexTreeWidget::PrimsDirtied( } } +void +HduiSceneIndexTreeWidget::PrimsRenamed( + const HdSceneIndexBase &sender, + const RenamedPrimEntries &entries) +{ + ConvertPrimsRenamedToRemovedAndAdded(sender, entries, this); +} void HduiSceneIndexTreeWidget::SetSceneIndex(HdSceneIndexBaseRefPtr inputSceneIndex) diff --git a/extras/imaging/examples/hdui/sceneIndexTreeWidget.h b/extras/imaging/examples/hdui/sceneIndexTreeWidget.h index 60c7f49212..6653c1024a 100644 --- a/extras/imaging/examples/hdui/sceneIndexTreeWidget.h +++ b/extras/imaging/examples/hdui/sceneIndexTreeWidget.h @@ -55,6 +55,9 @@ class HduiSceneIndexTreeWidget : public QTreeWidget, public HdSceneIndexObserver const HdSceneIndexBase &sender, const DirtiedPrimEntries &entries) override; + void PrimsRenamed( + const HdSceneIndexBase &sender, + const RenamedPrimEntries &entries) override; void SetSceneIndex(HdSceneIndexBaseRefPtr inputSceneIndex); diff --git a/extras/usd/examples/usdDancingCubesExample/CMakeLists.txt b/extras/usd/examples/usdDancingCubesExample/CMakeLists.txt index 4776ca3fe9..6f2da3e85d 100644 --- a/extras/usd/examples/usdDancingCubesExample/CMakeLists.txt +++ b/extras/usd/examples/usdDancingCubesExample/CMakeLists.txt @@ -46,7 +46,7 @@ if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux" AND pxr_register_test(testUsdDancingCubesExample PYTHON COMMAND "${CMAKE_INSTALL_PREFIX}/tests/testUsdDancingCubesExample" - DIFF_COMPARE dynamicContents.usda newDynamicContents.usda + DIFF_COMPARE dynamicContents.usda newDynamicContents.usda dynamicContentsFromAttrs.usda EXPECTED_RETURN_CODE 0 ENV ${PXR_PLUGINPATH_NAME}=${CMAKE_INSTALL_PREFIX}/share/usd/examples/plugin/usdDancingCubesExample/resources diff --git a/extras/usd/examples/usdDancingCubesExample/fileFormat.cpp b/extras/usd/examples/usdDancingCubesExample/fileFormat.cpp index 8ff4aca95f..a78510d726 100644 --- a/extras/usd/examples/usdDancingCubesExample/fileFormat.cpp +++ b/extras/usd/examples/usdDancingCubesExample/fileFormat.cpp @@ -142,6 +142,18 @@ UsdDancingCubesExampleFileFormat::ComposeFieldsForFileFormatArguments( val.UncheckedGet()); } + // In addition, each parameter can optionally be specified via an attribute + // on the prim with the same name and type as the parameter. If present, the + // attributes default value will be used as the parameter value. + #define xx(TYPE, NAME, DEFAULT) \ + if (context.ComposeAttributeDefaultValue( \ + UsdDancingCubesExample_DataParamsTokens->NAME, &val) && \ + val.IsHolding()) { \ + params.NAME = val.UncheckedGet(); \ + } + USD_DANCING_CUBES_EXAMPLE_DATA_PARAMS_X_FIELDS + #undef xx + // Convert the entire params object to file format arguments. We always // convert all parameters even if they're default as the args are part of // the identity of the layer. diff --git a/extras/usd/examples/usdDancingCubesExample/fileFormat.h b/extras/usd/examples/usdDancingCubesExample/fileFormat.h index f475a69a71..147b91f988 100644 --- a/extras/usd/examples/usdDancingCubesExample/fileFormat.h +++ b/extras/usd/examples/usdDancingCubesExample/fileFormat.h @@ -108,15 +108,25 @@ class UsdDancingCubesExampleFileFormat : public SdfFileFormat, FileFormatArguments *args, VtValue *contextDependencyData) const override; - /// A required PcpDynamicFileFormatInterface override for processing whether - /// a field change may affect the file format arguments within a given - /// context. + /// A PcpDynamicFileFormatInterface override for more finely processing + /// whether a field change may affect the file format arguments within a + /// given context. bool CanFieldChangeAffectFileFormatArguments( const TfToken &field, const VtValue &oldValue, const VtValue &newValue, const VtValue &contextDependencyData) const override; + // Calling out that this function could be overridden to more finely tune + // change processing of attribute default value changes. But in this example + // we don't override it and let it fall back to processing all default value + // changes of the relevant attributes. + // bool CanAttributeDefaultValueChangeAffectFileFormatArguments( + // const TfToken &field, + // const VtValue &oldValue, + // const VtValue &newValue, + // const VtValue &contextDependencyData) const override; + protected: SDF_FILE_FORMAT_FACTORY_ACCESS; diff --git a/extras/usd/examples/usdDancingCubesExample/testenv/testUsdDancingCubesExample.py b/extras/usd/examples/usdDancingCubesExample/testenv/testUsdDancingCubesExample.py index fc57a8542b..5337c2c1f4 100644 --- a/extras/usd/examples/usdDancingCubesExample/testenv/testUsdDancingCubesExample.py +++ b/extras/usd/examples/usdDancingCubesExample/testenv/testUsdDancingCubesExample.py @@ -67,6 +67,27 @@ # Export the new dynamic layer as usda for baseline comparison. dynamicLayers[0].Export("newDynamicContents.usda") +# Change all the parametes back to the original values but do it by creating +# attributes for each parameter and setting default values. Default values from +# attributes will take precedence over the parameters in the metadata +# dictionary. +p = stage.GetPrimAtPath('/Root') +p.CreateAttribute('geomType', Sdf.ValueTypeNames.Token).Set("Cube") +p.CreateAttribute('distance', Sdf.ValueTypeNames.Double).Set(6.0) +p.CreateAttribute('numFrames', Sdf.ValueTypeNames.Int).Set(20) +p.CreateAttribute('perSide', Sdf.ValueTypeNames.Int).Set(4) +p.CreateAttribute('framesPerCycle', Sdf.ValueTypeNames.Int).Set(16) +p.CreateAttribute('moveScale', Sdf.ValueTypeNames.Double).Set(1.5) + +# Find the dynamic layer again. Note that this layer has a different identity +# as the file format arguments have changed. +dynamicLayers = list(filter(lambda l: l.GetFileFormat() == dynamicFormat, + stage.GetUsedLayers())) +assert len(dynamicLayers) == 1 + +# Export the new dynamic layer as usda for baseline comparison. +dynamicLayers[0].Export("dynamicContentsFromAttrs.usda") + # Verify mute and unmute behavior on the dynamic layer itself. A muted layer # is empty (except the pseudoroot) premuteLayerString = dynamicLayers[0].ExportToString() diff --git a/extras/usd/examples/usdDancingCubesExample/testenv/testUsdDancingCubesExample/baseline/dynamicContentsFromAttrs.usda b/extras/usd/examples/usdDancingCubesExample/testenv/testUsdDancingCubesExample/baseline/dynamicContentsFromAttrs.usda new file mode 100644 index 0000000000..319acd0a31 --- /dev/null +++ b/extras/usd/examples/usdDancingCubesExample/testenv/testUsdDancingCubesExample/baseline/dynamicContentsFromAttrs.usda @@ -0,0 +1,4806 @@ +#usda 1.0 +( + defaultPrim = "Root" + endTimeCode = 19 + startTimeCode = 0 +) + +def "Root" +{ + def "prim_0" + { + def "prim_0" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.5, 1, 0.5)], + 1: [(0.6913417, 0.96193975, 0.30865827)], + 2: [(0.8535534, 0.8535534, 0.14644662)], + 3: [(0.96193975, 0.6913417, 0.038060233)], + 4: [(1, 0.5, 0)], + 5: [(0.96193975, 0.30865827, 0.038060233)], + 6: [(0.8535534, 0.14644662, 0.14644662)], + 7: [(0.6913417, 0.038060233, 0.30865827)], + 8: [(0.5, 0, 0.5)], + 9: [(0.30865827, 0.038060233, 0.6913417)], + 10: [(0.14644662, 0.14644662, 0.8535534)], + 11: [(0.038060233, 0.30865827, 0.96193975)], + 12: [(0, 0.5, 1)], + 13: [(0.038060233, 0.6913417, 0.96193975)], + 14: [(0.14644662, 0.8535534, 0.8535534)], + 15: [(0.30865827, 0.96193975, 0.6913417)], + 16: [(0.5, 1, 0.5)], + 17: [(0.6913417, 0.96193975, 0.30865827)], + 18: [(0.8535534, 0.8535534, 0.14644662)], + 19: [(0.96193975, 0.6913417, 0.038060233)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (0, 0, 0), + 1: (22.5, 22.5, 22.5), + 2: (45, 45, 45), + 3: (67.5, 67.5, 67.5), + 4: (90, 90, 90), + 5: (112.5, 112.5, 112.5), + 6: (135, 135, 135), + 7: (157.5, 157.5, 157.5), + 8: (180, 180, 180), + 9: (202.5, 202.5, 202.5), + 10: (225, 225, 225), + 11: (247.5, 247.5, 247.5), + 12: (270, 270, 270), + 13: (292.5, 292.5, 292.5), + 14: (315, 315, 315), + 15: (337.5, 337.5, 337.5), + 16: (360, 360, 360), + 17: (382.5, 382.5, 382.5), + 18: (405, 405, 405), + 19: (427.5, 427.5, 427.5), + } + double3 xformOp:translate = (-12, -12, -12) + double3 xformOp:translate.timeSamples = { + 0: (-12, -12, -12), + 1: (-10.277924554357096, -10.277924554357096, -10.277924554357096), + 2: (-8.818019484660535, -8.818019484660535, -8.818019484660535), + 3: (-7.84254210369921, -7.84254210369921, -7.84254210369921), + 4: (-7.5, -7.5, -7.5), + 5: (-7.84254210369921, -7.84254210369921, -7.84254210369921), + 6: (-8.818019484660535, -8.818019484660535, -8.818019484660535), + 7: (-10.277924554357096, -10.277924554357096, -10.277924554357096), + 8: (-12, -12, -12), + 9: (-13.722075445642904, -13.722075445642904, -13.722075445642904), + 10: (-15.181980515339465, -15.181980515339465, -15.181980515339465), + 11: (-16.15745789630079, -16.15745789630079, -16.15745789630079), + 12: (-16.5, -16.5, -16.5), + 13: (-16.15745789630079, -16.15745789630079, -16.15745789630079), + 14: (-15.181980515339465, -15.181980515339465, -15.181980515339465), + 15: (-13.722075445642906, -13.722075445642906, -13.722075445642906), + 16: (-12, -12, -12), + 17: (-10.277924554357096, -10.277924554357096, -10.277924554357096), + 18: (-8.818019484660535, -8.818019484660535, -8.818019484660535), + 19: (-7.84254210369921, -7.84254210369921, -7.84254210369921), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.92581093, 0.2545877)], + 1: [(0.8896822, 0.7994828, 0.11031782)], + 2: [(0.97462654, 0.62756115, 0.025373489)], + 3: [(0.9873133, 0.43621942, 0.012686744)], + 4: [(0.92581093, 0.2545877, 0.07418902)], + 5: [(0.7994828, 0.11031782, 0.20051716)], + 6: [(0.62756115, 0.025373489, 0.37243885)], + 7: [(0.43621942, 0.012686744, 0.56378055)], + 8: [(0.2545877, 0.07418902, 0.74541223)], + 9: [(0.11031782, 0.20051716, 0.8896822)], + 10: [(0.025373489, 0.37243885, 0.97462654)], + 11: [(0.012686744, 0.56378055, 0.9873133)], + 12: [(0.07418902, 0.74541223, 0.92581093)], + 13: [(0.20051716, 0.8896822, 0.7994828)], + 14: [(0.37243885, 0.97462654, 0.62756115)], + 15: [(0.56378055, 0.9873133, 0.43621942)], + 16: [(0.74541223, 0.92581093, 0.2545877)], + 17: [(0.8896822, 0.7994828, 0.11031782)], + 18: [(0.97462654, 0.62756115, 0.025373489)], + 19: [(0.9873133, 0.43621942, 0.012686744)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (30, 30, 30), + 1: (52.5, 52.5, 52.5), + 2: (75, 75, 75), + 3: (97.5, 97.5, 97.5), + 4: (120, 120, 120), + 5: (142.5, 142.5, 142.5), + 6: (165, 165, 165), + 7: (187.5, 187.5, 187.5), + 8: (210, 210, 210), + 9: (232.5, 232.5, 232.5), + 10: (255, 255, 255), + 11: (277.5, 277.5, 277.5), + 12: (300, 300, 300), + 13: (322.5, 322.5, 322.5), + 14: (345, 345, 345), + 15: (367.5, 367.5, 367.5), + 16: (390, 390, 390), + 17: (412.5, 412.5, 412.5), + 18: (435, 435, 435), + 19: (457.5, 457.5, 457.5), + } + double3 xformOp:translate = (-12, -12, -6) + double3 xformOp:translate.timeSamples = { + 0: (-9.79128953112491, -9.79128953112491, -3.7912895311249093), + 1: (-8.492860357673429, -8.492860357673429, -2.492860357673428), + 2: (-7.72836140246614, -7.72836140246614, -1.72836140246614), + 3: (-7.61418070123307, -7.61418070123307, -1.61418070123307), + 4: (-8.167701230686319, -8.167701230686319, -2.167701230686318), + 5: (-9.304654507892721, -9.304654507892721, -3.304654507892722), + 6: (-10.85194970290473, -10.85194970290473, -4.851949702904729), + 7: (-12.574025148547635, -12.574025148547635, -6.574025148547635), + 8: (-14.208710468875092, -14.208710468875092, -8.208710468875092), + 9: (-15.507139642326573, -15.507139642326573, -9.507139642326573), + 10: (-16.271638597533858, -16.271638597533858, -10.27163859753386), + 11: (-16.38581929876693, -16.38581929876693, -10.385819298766929), + 12: (-15.832298769313681, -15.832298769313681, -9.832298769313681), + 13: (-14.695345492107277, -14.695345492107277, -8.695345492107277), + 14: (-13.14805029709527, -13.14805029709527, -7.14805029709527), + 15: (-11.425974851452366, -11.425974851452366, -5.425974851452367), + 16: (-9.79128953112491, -9.79128953112491, -3.791289531124911), + 17: (-8.492860357673429, -8.492860357673429, -2.4928603576734285), + 18: (-7.72836140246614, -7.72836140246614, -1.72836140246614), + 19: (-7.614180701233069, -7.614180701233069, -1.6141807012330691), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.74541223, 0.07418902)], + 1: [(0.9873133, 0.56378055, 0.012686744)], + 2: [(0.97462654, 0.37243885, 0.025373489)], + 3: [(0.8896822, 0.20051716, 0.11031782)], + 4: [(0.74541223, 0.07418902, 0.2545877)], + 5: [(0.56378055, 0.012686744, 0.43621942)], + 6: [(0.37243885, 0.025373489, 0.62756115)], + 7: [(0.20051716, 0.11031782, 0.7994828)], + 8: [(0.07418902, 0.2545877, 0.92581093)], + 9: [(0.012686744, 0.43621942, 0.9873133)], + 10: [(0.025373489, 0.62756115, 0.97462654)], + 11: [(0.11031782, 0.7994828, 0.8896822)], + 12: [(0.2545877, 0.92581093, 0.74541223)], + 13: [(0.43621942, 0.9873133, 0.56378055)], + 14: [(0.62756115, 0.97462654, 0.37243885)], + 15: [(0.7994828, 0.8896822, 0.20051716)], + 16: [(0.92581093, 0.74541223, 0.07418902)], + 17: [(0.9873133, 0.56378055, 0.012686744)], + 18: [(0.97462654, 0.37243885, 0.025373489)], + 19: [(0.8896822, 0.20051716, 0.11031782)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (60, 60, 60), + 1: (82.5, 82.5, 82.5), + 2: (105, 105, 105), + 3: (127.5, 127.5, 127.5), + 4: (150, 150, 150), + 5: (172.5, 172.5, 172.5), + 6: (195, 195, 195), + 7: (217.5, 217.5, 217.5), + 8: (240, 240, 240), + 9: (262.5, 262.5, 262.5), + 10: (285, 285, 285), + 11: (307.5, 307.5, 307.5), + 12: (330, 330, 330), + 13: (352.5, 352.5, 352.5), + 14: (375, 375, 375), + 15: (397.5, 397.5, 397.5), + 16: (420, 420, 420), + 17: (442.5, 442.5, 442.5), + 18: (465, 465, 465), + 19: (487.5, 487.5, 487.5), + } + double3 xformOp:translate = (-12, -12, 0) + double3 xformOp:translate.timeSamples = { + 0: (-8.167701230686319, -8.167701230686319, 3.832298769313681), + 1: (-7.61418070123307, -7.61418070123307, 4.38581929876693), + 2: (-7.72836140246614, -7.72836140246614, 4.27163859753386), + 3: (-8.492860357673425, -8.492860357673425, 3.5071396423265737), + 4: (-9.791289531124908, -9.791289531124908, 2.2087104688750916), + 5: (-11.425974851452363, -11.425974851452363, 0.5740251485476362), + 6: (-13.148050297095267, -13.148050297095267, -1.148050297095268), + 7: (-14.695345492107275, -14.695345492107275, -2.6953454921072764), + 8: (-15.832298769313681, -15.832298769313681, -3.83229876931368), + 9: (-16.38581929876693, -16.38581929876693, -4.385819298766929), + 10: (-16.271638597533858, -16.271638597533858, -4.27163859753386), + 11: (-15.507139642326575, -15.507139642326575, -3.5071396423265737), + 12: (-14.208710468875093, -14.208710468875093, -2.2087104688750934), + 13: (-12.574025148547637, -12.574025148547637, -0.5740251485476365), + 14: (-10.85194970290473, -10.85194970290473, 1.1480502970952713), + 15: (-9.304654507892721, -9.304654507892721, 2.695345492107279), + 16: (-8.167701230686317, -8.167701230686317, 3.8322987693136823), + 17: (-7.614180701233069, -7.614180701233069, 4.385819298766931), + 18: (-7.72836140246614, -7.72836140246614, 4.27163859753386), + 19: (-8.492860357673429, -8.492860357673429, 3.5071396423265715), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(1, 0.5, 0)], + 1: [(0.96193975, 0.30865827, 0.038060233)], + 2: [(0.8535534, 0.14644662, 0.14644662)], + 3: [(0.6913417, 0.038060233, 0.30865827)], + 4: [(0.5, 0, 0.5)], + 5: [(0.30865827, 0.038060233, 0.6913417)], + 6: [(0.14644662, 0.14644662, 0.8535534)], + 7: [(0.038060233, 0.30865827, 0.96193975)], + 8: [(0, 0.5, 1)], + 9: [(0.038060233, 0.6913417, 0.96193975)], + 10: [(0.14644662, 0.8535534, 0.8535534)], + 11: [(0.30865827, 0.96193975, 0.6913417)], + 12: [(0.5, 1, 0.5)], + 13: [(0.6913417, 0.96193975, 0.30865827)], + 14: [(0.8535534, 0.8535534, 0.14644662)], + 15: [(0.96193975, 0.6913417, 0.038060233)], + 16: [(1, 0.5, 0)], + 17: [(0.96193975, 0.30865827, 0.038060233)], + 18: [(0.8535534, 0.14644662, 0.14644662)], + 19: [(0.6913417, 0.038060233, 0.30865827)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (90, 90, 90), + 1: (112.5, 112.5, 112.5), + 2: (135, 135, 135), + 3: (157.5, 157.5, 157.5), + 4: (180, 180, 180), + 5: (202.5, 202.5, 202.5), + 6: (225, 225, 225), + 7: (247.5, 247.5, 247.5), + 8: (270, 270, 270), + 9: (292.5, 292.5, 292.5), + 10: (315, 315, 315), + 11: (337.5, 337.5, 337.5), + 12: (360, 360, 360), + 13: (382.5, 382.5, 382.5), + 14: (405, 405, 405), + 15: (427.5, 427.5, 427.5), + 16: (450, 450, 450), + 17: (472.5, 472.5, 472.5), + 18: (495, 495, 495), + 19: (517.5, 517.5, 517.5), + } + double3 xformOp:translate = (-12, -12, 6) + double3 xformOp:translate.timeSamples = { + 0: (-7.5, -7.5, 10.5), + 1: (-7.84254210369921, -7.84254210369921, 10.15745789630079), + 2: (-8.818019484660535, -8.818019484660535, 9.181980515339465), + 3: (-10.277924554357096, -10.277924554357096, 7.722075445642904), + 4: (-12, -12, 6.000000000000001), + 5: (-13.722075445642904, -13.722075445642904, 4.277924554357096), + 6: (-15.181980515339465, -15.181980515339465, 2.818019484660536), + 7: (-16.15745789630079, -16.15745789630079, 1.842542103699211), + 8: (-16.5, -16.5, 1.5), + 9: (-16.15745789630079, -16.15745789630079, 1.84254210369921), + 10: (-15.181980515339465, -15.181980515339465, 2.8180194846605358), + 11: (-13.722075445642906, -13.722075445642906, 4.277924554357093), + 12: (-12, -12, 6), + 13: (-10.277924554357096, -10.277924554357096, 7.722075445642904), + 14: (-8.818019484660535, -8.818019484660535, 9.181980515339465), + 15: (-7.84254210369921, -7.84254210369921, 10.15745789630079), + 16: (-7.5, -7.5, 10.5), + 17: (-7.84254210369921, -7.84254210369921, 10.15745789630079), + 18: (-8.818019484660535, -8.818019484660535, 9.181980515339465), + 19: (-10.277924554357096, -10.277924554357096, 7.722075445642904), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_1" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.92581093, 0.2545877)], + 1: [(0.8896822, 0.7994828, 0.11031782)], + 2: [(0.97462654, 0.62756115, 0.025373489)], + 3: [(0.9873133, 0.43621942, 0.012686744)], + 4: [(0.92581093, 0.2545877, 0.07418902)], + 5: [(0.7994828, 0.11031782, 0.20051716)], + 6: [(0.62756115, 0.025373489, 0.37243885)], + 7: [(0.43621942, 0.012686744, 0.56378055)], + 8: [(0.2545877, 0.07418902, 0.74541223)], + 9: [(0.11031782, 0.20051716, 0.8896822)], + 10: [(0.025373489, 0.37243885, 0.97462654)], + 11: [(0.012686744, 0.56378055, 0.9873133)], + 12: [(0.07418902, 0.74541223, 0.92581093)], + 13: [(0.20051716, 0.8896822, 0.7994828)], + 14: [(0.37243885, 0.97462654, 0.62756115)], + 15: [(0.56378055, 0.9873133, 0.43621942)], + 16: [(0.74541223, 0.92581093, 0.2545877)], + 17: [(0.8896822, 0.7994828, 0.11031782)], + 18: [(0.97462654, 0.62756115, 0.025373489)], + 19: [(0.9873133, 0.43621942, 0.012686744)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (30, 30, 30), + 1: (52.5, 52.5, 52.5), + 2: (75, 75, 75), + 3: (97.5, 97.5, 97.5), + 4: (120, 120, 120), + 5: (142.5, 142.5, 142.5), + 6: (165, 165, 165), + 7: (187.5, 187.5, 187.5), + 8: (210, 210, 210), + 9: (232.5, 232.5, 232.5), + 10: (255, 255, 255), + 11: (277.5, 277.5, 277.5), + 12: (300, 300, 300), + 13: (322.5, 322.5, 322.5), + 14: (345, 345, 345), + 15: (367.5, 367.5, 367.5), + 16: (390, 390, 390), + 17: (412.5, 412.5, 412.5), + 18: (435, 435, 435), + 19: (457.5, 457.5, 457.5), + } + double3 xformOp:translate = (-12, -6, -12) + double3 xformOp:translate.timeSamples = { + 0: (-9.79128953112491, -3.7912895311249093, -9.79128953112491), + 1: (-8.492860357673429, -2.492860357673428, -8.492860357673429), + 2: (-7.72836140246614, -1.72836140246614, -7.72836140246614), + 3: (-7.61418070123307, -1.61418070123307, -7.61418070123307), + 4: (-8.167701230686319, -2.167701230686318, -8.167701230686319), + 5: (-9.304654507892721, -3.304654507892722, -9.304654507892721), + 6: (-10.85194970290473, -4.851949702904729, -10.85194970290473), + 7: (-12.574025148547635, -6.574025148547635, -12.574025148547635), + 8: (-14.208710468875092, -8.208710468875092, -14.208710468875092), + 9: (-15.507139642326573, -9.507139642326573, -15.507139642326573), + 10: (-16.271638597533858, -10.27163859753386, -16.271638597533858), + 11: (-16.38581929876693, -10.385819298766929, -16.38581929876693), + 12: (-15.832298769313681, -9.832298769313681, -15.832298769313681), + 13: (-14.695345492107277, -8.695345492107277, -14.695345492107277), + 14: (-13.14805029709527, -7.14805029709527, -13.14805029709527), + 15: (-11.425974851452366, -5.425974851452367, -11.425974851452366), + 16: (-9.79128953112491, -3.791289531124911, -9.79128953112491), + 17: (-8.492860357673429, -2.4928603576734285, -8.492860357673429), + 18: (-7.72836140246614, -1.72836140246614, -7.72836140246614), + 19: (-7.614180701233069, -1.6141807012330691, -7.614180701233069), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.74541223, 0.07418902)], + 1: [(0.9873133, 0.56378055, 0.012686744)], + 2: [(0.97462654, 0.37243885, 0.025373489)], + 3: [(0.8896822, 0.20051716, 0.11031782)], + 4: [(0.74541223, 0.07418902, 0.2545877)], + 5: [(0.56378055, 0.012686744, 0.43621942)], + 6: [(0.37243885, 0.025373489, 0.62756115)], + 7: [(0.20051716, 0.11031782, 0.7994828)], + 8: [(0.07418902, 0.2545877, 0.92581093)], + 9: [(0.012686744, 0.43621942, 0.9873133)], + 10: [(0.025373489, 0.62756115, 0.97462654)], + 11: [(0.11031782, 0.7994828, 0.8896822)], + 12: [(0.2545877, 0.92581093, 0.74541223)], + 13: [(0.43621942, 0.9873133, 0.56378055)], + 14: [(0.62756115, 0.97462654, 0.37243885)], + 15: [(0.7994828, 0.8896822, 0.20051716)], + 16: [(0.92581093, 0.74541223, 0.07418902)], + 17: [(0.9873133, 0.56378055, 0.012686744)], + 18: [(0.97462654, 0.37243885, 0.025373489)], + 19: [(0.8896822, 0.20051716, 0.11031782)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (60, 60, 60), + 1: (82.5, 82.5, 82.5), + 2: (105, 105, 105), + 3: (127.5, 127.5, 127.5), + 4: (150, 150, 150), + 5: (172.5, 172.5, 172.5), + 6: (195, 195, 195), + 7: (217.5, 217.5, 217.5), + 8: (240, 240, 240), + 9: (262.5, 262.5, 262.5), + 10: (285, 285, 285), + 11: (307.5, 307.5, 307.5), + 12: (330, 330, 330), + 13: (352.5, 352.5, 352.5), + 14: (375, 375, 375), + 15: (397.5, 397.5, 397.5), + 16: (420, 420, 420), + 17: (442.5, 442.5, 442.5), + 18: (465, 465, 465), + 19: (487.5, 487.5, 487.5), + } + double3 xformOp:translate = (-12, -6, -6) + double3 xformOp:translate.timeSamples = { + 0: (-8.167701230686319, -2.167701230686319, -2.167701230686319), + 1: (-7.61418070123307, -1.61418070123307, -1.61418070123307), + 2: (-7.72836140246614, -1.72836140246614, -1.72836140246614), + 3: (-8.492860357673425, -2.4928603576734263, -2.4928603576734263), + 4: (-9.791289531124908, -3.7912895311249084, -3.7912895311249084), + 5: (-11.425974851452363, -5.425974851452364, -5.425974851452364), + 6: (-13.148050297095267, -7.148050297095268, -7.148050297095268), + 7: (-14.695345492107275, -8.695345492107275, -8.695345492107275), + 8: (-15.832298769313681, -9.832298769313681, -9.832298769313681), + 9: (-16.38581929876693, -10.385819298766929, -10.385819298766929), + 10: (-16.271638597533858, -10.27163859753386, -10.27163859753386), + 11: (-15.507139642326575, -9.507139642326575, -9.507139642326575), + 12: (-14.208710468875093, -8.208710468875093, -8.208710468875093), + 13: (-12.574025148547637, -6.574025148547636, -6.574025148547636), + 14: (-10.85194970290473, -4.8519497029047285, -4.8519497029047285), + 15: (-9.304654507892721, -3.304654507892721, -3.304654507892721), + 16: (-8.167701230686317, -2.1677012306863177, -2.1677012306863177), + 17: (-7.614180701233069, -1.6141807012330691, -1.6141807012330691), + 18: (-7.72836140246614, -1.72836140246614, -1.72836140246614), + 19: (-8.492860357673429, -2.4928603576734285, -2.4928603576734285), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(1, 0.5, 0)], + 1: [(0.96193975, 0.30865827, 0.038060233)], + 2: [(0.8535534, 0.14644662, 0.14644662)], + 3: [(0.6913417, 0.038060233, 0.30865827)], + 4: [(0.5, 0, 0.5)], + 5: [(0.30865827, 0.038060233, 0.6913417)], + 6: [(0.14644662, 0.14644662, 0.8535534)], + 7: [(0.038060233, 0.30865827, 0.96193975)], + 8: [(0, 0.5, 1)], + 9: [(0.038060233, 0.6913417, 0.96193975)], + 10: [(0.14644662, 0.8535534, 0.8535534)], + 11: [(0.30865827, 0.96193975, 0.6913417)], + 12: [(0.5, 1, 0.5)], + 13: [(0.6913417, 0.96193975, 0.30865827)], + 14: [(0.8535534, 0.8535534, 0.14644662)], + 15: [(0.96193975, 0.6913417, 0.038060233)], + 16: [(1, 0.5, 0)], + 17: [(0.96193975, 0.30865827, 0.038060233)], + 18: [(0.8535534, 0.14644662, 0.14644662)], + 19: [(0.6913417, 0.038060233, 0.30865827)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (90, 90, 90), + 1: (112.5, 112.5, 112.5), + 2: (135, 135, 135), + 3: (157.5, 157.5, 157.5), + 4: (180, 180, 180), + 5: (202.5, 202.5, 202.5), + 6: (225, 225, 225), + 7: (247.5, 247.5, 247.5), + 8: (270, 270, 270), + 9: (292.5, 292.5, 292.5), + 10: (315, 315, 315), + 11: (337.5, 337.5, 337.5), + 12: (360, 360, 360), + 13: (382.5, 382.5, 382.5), + 14: (405, 405, 405), + 15: (427.5, 427.5, 427.5), + 16: (450, 450, 450), + 17: (472.5, 472.5, 472.5), + 18: (495, 495, 495), + 19: (517.5, 517.5, 517.5), + } + double3 xformOp:translate = (-12, -6, 0) + double3 xformOp:translate.timeSamples = { + 0: (-7.5, -1.5, 4.5), + 1: (-7.84254210369921, -1.84254210369921, 4.15745789630079), + 2: (-8.818019484660535, -2.8180194846605358, 3.1819805153394642), + 3: (-10.277924554357096, -4.277924554357096, 1.7220754456429046), + 4: (-12, -5.999999999999999, 5.51091059616309e-16), + 5: (-13.722075445642904, -7.722075445642904, -1.7220754456429037), + 6: (-15.181980515339465, -9.181980515339465, -3.181980515339464), + 7: (-16.15745789630079, -10.157457896300789, -4.157457896300789), + 8: (-16.5, -10.5, -4.5), + 9: (-16.15745789630079, -10.15745789630079, -4.15745789630079), + 10: (-15.181980515339465, -9.181980515339465, -3.1819805153394642), + 11: (-13.722075445642906, -7.722075445642907, -1.7220754456429066), + 12: (-12, -6, 0), + 13: (-10.277924554357096, -4.277924554357096, 1.722075445642904), + 14: (-8.818019484660535, -2.818019484660536, 3.181980515339464), + 15: (-7.84254210369921, -1.84254210369921, 4.15745789630079), + 16: (-7.5, -1.5, 4.5), + 17: (-7.84254210369921, -1.84254210369921, 4.15745789630079), + 18: (-8.818019484660535, -2.8180194846605358, 3.1819805153394642), + 19: (-10.277924554357096, -4.277924554357096, 1.7220754456429046), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (-12, -6, 6) + double3 xformOp:translate.timeSamples = { + 0: (-8.167701230686319, -2.167701230686318, 9.832298769313681), + 1: (-9.304654507892721, -3.304654507892722, 8.695345492107279), + 2: (-10.85194970290473, -4.851949702904729, 7.148050297095271), + 3: (-12.574025148547632, -6.574025148547632, 5.425974851452368), + 4: (-14.20871046887509, -8.20871046887509, 3.791289531124911), + 5: (-15.507139642326571, -9.507139642326571, 2.492860357673429), + 6: (-16.271638597533858, -10.271638597533858, 1.728361402466141), + 7: (-16.385819298766933, -10.38581929876693, 1.6141807012330691), + 8: (-15.832298769313683, -9.832298769313683, 2.1677012306863173), + 9: (-14.695345492107279, -8.695345492107279, 3.30465450789272), + 10: (-13.148050297095272, -7.148050297095273, 4.851949702904727), + 11: (-11.425974851452366, -5.425974851452367, 6.574025148547633), + 12: (-9.79128953112491, -3.791289531124911, 8.20871046887509), + 13: (-8.492860357673429, -2.4928603576734285, 9.507139642326571), + 14: (-7.72836140246614, -1.72836140246614, 10.27163859753386), + 15: (-7.614180701233069, -1.6141807012330691, 10.38581929876693), + 16: (-8.167701230686317, -2.1677012306863173, 9.832298769313683), + 17: (-9.304654507892721, -3.304654507892721, 8.695345492107279), + 18: (-10.851949702904728, -4.851949702904728, 7.148050297095272), + 19: (-12.574025148547632, -6.574025148547632, 5.425974851452368), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_2" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.74541223, 0.07418902)], + 1: [(0.9873133, 0.56378055, 0.012686744)], + 2: [(0.97462654, 0.37243885, 0.025373489)], + 3: [(0.8896822, 0.20051716, 0.11031782)], + 4: [(0.74541223, 0.07418902, 0.2545877)], + 5: [(0.56378055, 0.012686744, 0.43621942)], + 6: [(0.37243885, 0.025373489, 0.62756115)], + 7: [(0.20051716, 0.11031782, 0.7994828)], + 8: [(0.07418902, 0.2545877, 0.92581093)], + 9: [(0.012686744, 0.43621942, 0.9873133)], + 10: [(0.025373489, 0.62756115, 0.97462654)], + 11: [(0.11031782, 0.7994828, 0.8896822)], + 12: [(0.2545877, 0.92581093, 0.74541223)], + 13: [(0.43621942, 0.9873133, 0.56378055)], + 14: [(0.62756115, 0.97462654, 0.37243885)], + 15: [(0.7994828, 0.8896822, 0.20051716)], + 16: [(0.92581093, 0.74541223, 0.07418902)], + 17: [(0.9873133, 0.56378055, 0.012686744)], + 18: [(0.97462654, 0.37243885, 0.025373489)], + 19: [(0.8896822, 0.20051716, 0.11031782)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (60, 60, 60), + 1: (82.5, 82.5, 82.5), + 2: (105, 105, 105), + 3: (127.5, 127.5, 127.5), + 4: (150, 150, 150), + 5: (172.5, 172.5, 172.5), + 6: (195, 195, 195), + 7: (217.5, 217.5, 217.5), + 8: (240, 240, 240), + 9: (262.5, 262.5, 262.5), + 10: (285, 285, 285), + 11: (307.5, 307.5, 307.5), + 12: (330, 330, 330), + 13: (352.5, 352.5, 352.5), + 14: (375, 375, 375), + 15: (397.5, 397.5, 397.5), + 16: (420, 420, 420), + 17: (442.5, 442.5, 442.5), + 18: (465, 465, 465), + 19: (487.5, 487.5, 487.5), + } + double3 xformOp:translate = (-12, 0, -12) + double3 xformOp:translate.timeSamples = { + 0: (-8.167701230686319, 3.832298769313681, -8.167701230686319), + 1: (-7.61418070123307, 4.38581929876693, -7.61418070123307), + 2: (-7.72836140246614, 4.27163859753386, -7.72836140246614), + 3: (-8.492860357673425, 3.5071396423265737, -8.492860357673425), + 4: (-9.791289531124908, 2.2087104688750916, -9.791289531124908), + 5: (-11.425974851452363, 0.5740251485476362, -11.425974851452363), + 6: (-13.148050297095267, -1.148050297095268, -13.148050297095267), + 7: (-14.695345492107275, -2.6953454921072764, -14.695345492107275), + 8: (-15.832298769313681, -3.83229876931368, -15.832298769313681), + 9: (-16.38581929876693, -4.385819298766929, -16.38581929876693), + 10: (-16.271638597533858, -4.27163859753386, -16.271638597533858), + 11: (-15.507139642326575, -3.5071396423265737, -15.507139642326575), + 12: (-14.208710468875093, -2.2087104688750934, -14.208710468875093), + 13: (-12.574025148547637, -0.5740251485476365, -12.574025148547637), + 14: (-10.85194970290473, 1.1480502970952713, -10.85194970290473), + 15: (-9.304654507892721, 2.695345492107279, -9.304654507892721), + 16: (-8.167701230686317, 3.8322987693136823, -8.167701230686317), + 17: (-7.614180701233069, 4.385819298766931, -7.614180701233069), + 18: (-7.72836140246614, 4.27163859753386, -7.72836140246614), + 19: (-8.492860357673429, 3.5071396423265715, -8.492860357673429), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(1, 0.5, 0)], + 1: [(0.96193975, 0.30865827, 0.038060233)], + 2: [(0.8535534, 0.14644662, 0.14644662)], + 3: [(0.6913417, 0.038060233, 0.30865827)], + 4: [(0.5, 0, 0.5)], + 5: [(0.30865827, 0.038060233, 0.6913417)], + 6: [(0.14644662, 0.14644662, 0.8535534)], + 7: [(0.038060233, 0.30865827, 0.96193975)], + 8: [(0, 0.5, 1)], + 9: [(0.038060233, 0.6913417, 0.96193975)], + 10: [(0.14644662, 0.8535534, 0.8535534)], + 11: [(0.30865827, 0.96193975, 0.6913417)], + 12: [(0.5, 1, 0.5)], + 13: [(0.6913417, 0.96193975, 0.30865827)], + 14: [(0.8535534, 0.8535534, 0.14644662)], + 15: [(0.96193975, 0.6913417, 0.038060233)], + 16: [(1, 0.5, 0)], + 17: [(0.96193975, 0.30865827, 0.038060233)], + 18: [(0.8535534, 0.14644662, 0.14644662)], + 19: [(0.6913417, 0.038060233, 0.30865827)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (90, 90, 90), + 1: (112.5, 112.5, 112.5), + 2: (135, 135, 135), + 3: (157.5, 157.5, 157.5), + 4: (180, 180, 180), + 5: (202.5, 202.5, 202.5), + 6: (225, 225, 225), + 7: (247.5, 247.5, 247.5), + 8: (270, 270, 270), + 9: (292.5, 292.5, 292.5), + 10: (315, 315, 315), + 11: (337.5, 337.5, 337.5), + 12: (360, 360, 360), + 13: (382.5, 382.5, 382.5), + 14: (405, 405, 405), + 15: (427.5, 427.5, 427.5), + 16: (450, 450, 450), + 17: (472.5, 472.5, 472.5), + 18: (495, 495, 495), + 19: (517.5, 517.5, 517.5), + } + double3 xformOp:translate = (-12, 0, -6) + double3 xformOp:translate.timeSamples = { + 0: (-7.5, 4.5, -1.5), + 1: (-7.84254210369921, 4.15745789630079, -1.84254210369921), + 2: (-8.818019484660535, 3.1819805153394642, -2.8180194846605358), + 3: (-10.277924554357096, 1.7220754456429046, -4.277924554357096), + 4: (-12, 5.51091059616309e-16, -5.999999999999999), + 5: (-13.722075445642904, -1.7220754456429037, -7.722075445642904), + 6: (-15.181980515339465, -3.181980515339464, -9.181980515339465), + 7: (-16.15745789630079, -4.157457896300789, -10.157457896300789), + 8: (-16.5, -4.5, -10.5), + 9: (-16.15745789630079, -4.15745789630079, -10.15745789630079), + 10: (-15.181980515339465, -3.1819805153394642, -9.181980515339465), + 11: (-13.722075445642906, -1.7220754456429066, -7.722075445642907), + 12: (-12, 0, -6), + 13: (-10.277924554357096, 1.722075445642904, -4.277924554357096), + 14: (-8.818019484660535, 3.181980515339464, -2.818019484660536), + 15: (-7.84254210369921, 4.15745789630079, -1.84254210369921), + 16: (-7.5, 4.5, -1.5), + 17: (-7.84254210369921, 4.15745789630079, -1.84254210369921), + 18: (-8.818019484660535, 3.1819805153394642, -2.8180194846605358), + 19: (-10.277924554357096, 1.7220754456429046, -4.277924554357096), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (-12, 0, 0) + double3 xformOp:translate.timeSamples = { + 0: (-8.167701230686319, 3.832298769313682, 3.832298769313682), + 1: (-9.304654507892721, 2.695345492107278, 2.695345492107278), + 2: (-10.85194970290473, 1.1480502970952704, 1.1480502970952704), + 3: (-12.574025148547632, -0.5740251485476322, -0.5740251485476322), + 4: (-14.20871046887509, -2.208710468875089, -2.208710468875089), + 5: (-15.507139642326571, -3.507139642326571, -3.507139642326571), + 6: (-16.271638597533858, -4.271638597533859, -4.271638597533859), + 7: (-16.385819298766933, -4.385819298766931, -4.385819298766931), + 8: (-15.832298769313683, -3.8322987693136827, -3.8322987693136827), + 9: (-14.695345492107279, -2.69534549210728, -2.69534549210728), + 10: (-13.148050297095272, -1.148050297095273, -1.148050297095273), + 11: (-11.425974851452366, 0.5740251485476326, 0.5740251485476326), + 12: (-9.79128953112491, 2.208710468875089, 2.208710468875089), + 13: (-8.492860357673429, 3.5071396423265715, 3.5071396423265715), + 14: (-7.72836140246614, 4.27163859753386, 4.27163859753386), + 15: (-7.614180701233069, 4.385819298766931, 4.385819298766931), + 16: (-8.167701230686317, 3.8322987693136827, 3.8322987693136827), + 17: (-9.304654507892721, 2.695345492107279, 2.695345492107279), + 18: (-10.851949702904728, 1.148050297095272, 1.148050297095272), + 19: (-12.574025148547632, -0.5740251485476322, -0.5740251485476322), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (-12, 0, 6) + double3 xformOp:translate.timeSamples = { + 0: (-9.791289531124908, 2.2087104688750916, 8.208710468875092), + 1: (-11.425974851452363, 0.5740251485476362, 6.574025148547636), + 2: (-13.148050297095267, -1.148050297095268, 4.851949702904732), + 3: (-14.695345492107275, -2.6953454921072764, 3.3046545078927236), + 4: (-15.832298769313681, -3.83229876931368, 2.16770123068632), + 5: (-16.38581929876693, -4.385819298766929, 1.614180701233071), + 6: (-16.271638597533858, -4.27163859753386, 1.72836140246614), + 7: (-15.507139642326575, -3.5071396423265737, 2.4928603576734263), + 8: (-14.208710468875093, -2.2087104688750934, 3.7912895311249066), + 9: (-12.574025148547637, -0.5740251485476365, 5.425974851452364), + 10: (-10.851949702904735, 1.1480502970952653, 7.148050297095265), + 11: (-9.304654507892726, 2.6953454921072737, 8.695345492107274), + 12: (-8.16770123068632, 3.832298769313679, 9.83229876931368), + 13: (-7.614180701233071, 4.385819298766929, 10.385819298766929), + 14: (-7.728361402466139, 4.271638597533861, 10.271638597533862), + 15: (-8.492860357673425, 3.507139642326575, 9.507139642326575), + 16: (-9.791289531124905, 2.2087104688750947, 8.208710468875095), + 17: (-11.425974851452361, 0.5740251485476393, 6.574025148547639), + 18: (-13.148050297095265, -1.1480502970952648, 4.851949702904735), + 19: (-14.695345492107274, -2.6953454921072737, 3.3046545078927263), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_3" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(1, 0.5, 0)], + 1: [(0.96193975, 0.30865827, 0.038060233)], + 2: [(0.8535534, 0.14644662, 0.14644662)], + 3: [(0.6913417, 0.038060233, 0.30865827)], + 4: [(0.5, 0, 0.5)], + 5: [(0.30865827, 0.038060233, 0.6913417)], + 6: [(0.14644662, 0.14644662, 0.8535534)], + 7: [(0.038060233, 0.30865827, 0.96193975)], + 8: [(0, 0.5, 1)], + 9: [(0.038060233, 0.6913417, 0.96193975)], + 10: [(0.14644662, 0.8535534, 0.8535534)], + 11: [(0.30865827, 0.96193975, 0.6913417)], + 12: [(0.5, 1, 0.5)], + 13: [(0.6913417, 0.96193975, 0.30865827)], + 14: [(0.8535534, 0.8535534, 0.14644662)], + 15: [(0.96193975, 0.6913417, 0.038060233)], + 16: [(1, 0.5, 0)], + 17: [(0.96193975, 0.30865827, 0.038060233)], + 18: [(0.8535534, 0.14644662, 0.14644662)], + 19: [(0.6913417, 0.038060233, 0.30865827)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (90, 90, 90), + 1: (112.5, 112.5, 112.5), + 2: (135, 135, 135), + 3: (157.5, 157.5, 157.5), + 4: (180, 180, 180), + 5: (202.5, 202.5, 202.5), + 6: (225, 225, 225), + 7: (247.5, 247.5, 247.5), + 8: (270, 270, 270), + 9: (292.5, 292.5, 292.5), + 10: (315, 315, 315), + 11: (337.5, 337.5, 337.5), + 12: (360, 360, 360), + 13: (382.5, 382.5, 382.5), + 14: (405, 405, 405), + 15: (427.5, 427.5, 427.5), + 16: (450, 450, 450), + 17: (472.5, 472.5, 472.5), + 18: (495, 495, 495), + 19: (517.5, 517.5, 517.5), + } + double3 xformOp:translate = (-12, 6, -12) + double3 xformOp:translate.timeSamples = { + 0: (-7.5, 10.5, -7.5), + 1: (-7.84254210369921, 10.15745789630079, -7.84254210369921), + 2: (-8.818019484660535, 9.181980515339465, -8.818019484660535), + 3: (-10.277924554357096, 7.722075445642904, -10.277924554357096), + 4: (-12, 6.000000000000001, -12), + 5: (-13.722075445642904, 4.277924554357096, -13.722075445642904), + 6: (-15.181980515339465, 2.818019484660536, -15.181980515339465), + 7: (-16.15745789630079, 1.842542103699211, -16.15745789630079), + 8: (-16.5, 1.5, -16.5), + 9: (-16.15745789630079, 1.84254210369921, -16.15745789630079), + 10: (-15.181980515339465, 2.8180194846605358, -15.181980515339465), + 11: (-13.722075445642906, 4.277924554357093, -13.722075445642906), + 12: (-12, 6, -12), + 13: (-10.277924554357096, 7.722075445642904, -10.277924554357096), + 14: (-8.818019484660535, 9.181980515339465, -8.818019484660535), + 15: (-7.84254210369921, 10.15745789630079, -7.84254210369921), + 16: (-7.5, 10.5, -7.5), + 17: (-7.84254210369921, 10.15745789630079, -7.84254210369921), + 18: (-8.818019484660535, 9.181980515339465, -8.818019484660535), + 19: (-10.277924554357096, 7.722075445642904, -10.277924554357096), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (-12, 6, -6) + double3 xformOp:translate.timeSamples = { + 0: (-8.167701230686319, 9.832298769313681, -2.167701230686318), + 1: (-9.304654507892721, 8.695345492107279, -3.304654507892722), + 2: (-10.85194970290473, 7.148050297095271, -4.851949702904729), + 3: (-12.574025148547632, 5.425974851452368, -6.574025148547632), + 4: (-14.20871046887509, 3.791289531124911, -8.20871046887509), + 5: (-15.507139642326571, 2.492860357673429, -9.507139642326571), + 6: (-16.271638597533858, 1.728361402466141, -10.271638597533858), + 7: (-16.385819298766933, 1.6141807012330691, -10.38581929876693), + 8: (-15.832298769313683, 2.1677012306863173, -9.832298769313683), + 9: (-14.695345492107279, 3.30465450789272, -8.695345492107279), + 10: (-13.148050297095272, 4.851949702904727, -7.148050297095273), + 11: (-11.425974851452366, 6.574025148547633, -5.425974851452367), + 12: (-9.79128953112491, 8.20871046887509, -3.791289531124911), + 13: (-8.492860357673429, 9.507139642326571, -2.4928603576734285), + 14: (-7.72836140246614, 10.27163859753386, -1.72836140246614), + 15: (-7.614180701233069, 10.38581929876693, -1.6141807012330691), + 16: (-8.167701230686317, 9.832298769313683, -2.1677012306863173), + 17: (-9.304654507892721, 8.695345492107279, -3.304654507892721), + 18: (-10.851949702904728, 7.148050297095272, -4.851949702904728), + 19: (-12.574025148547632, 5.425974851452368, -6.574025148547632), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (-12, 6, 0) + double3 xformOp:translate.timeSamples = { + 0: (-9.791289531124908, 8.208710468875092, 2.2087104688750916), + 1: (-11.425974851452363, 6.574025148547636, 0.5740251485476362), + 2: (-13.148050297095267, 4.851949702904732, -1.148050297095268), + 3: (-14.695345492107275, 3.3046545078927236, -2.6953454921072764), + 4: (-15.832298769313681, 2.16770123068632, -3.83229876931368), + 5: (-16.38581929876693, 1.614180701233071, -4.385819298766929), + 6: (-16.271638597533858, 1.72836140246614, -4.27163859753386), + 7: (-15.507139642326575, 2.4928603576734263, -3.5071396423265737), + 8: (-14.208710468875093, 3.7912895311249066, -2.2087104688750934), + 9: (-12.574025148547637, 5.425974851452364, -0.5740251485476365), + 10: (-10.851949702904735, 7.148050297095265, 1.1480502970952653), + 11: (-9.304654507892726, 8.695345492107274, 2.6953454921072737), + 12: (-8.16770123068632, 9.83229876931368, 3.832298769313679), + 13: (-7.614180701233071, 10.385819298766929, 4.385819298766929), + 14: (-7.728361402466139, 10.271638597533862, 4.271638597533861), + 15: (-8.492860357673425, 9.507139642326575, 3.507139642326575), + 16: (-9.791289531124905, 8.208710468875095, 2.2087104688750947), + 17: (-11.425974851452361, 6.574025148547639, 0.5740251485476393), + 18: (-13.148050297095265, 4.851949702904735, -1.1480502970952648), + 19: (-14.695345492107274, 3.3046545078927263, -2.6953454921072737), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.5, 0, 0.5)], + 1: [(0.30865827, 0.038060233, 0.6913417)], + 2: [(0.14644662, 0.14644662, 0.8535534)], + 3: [(0.038060233, 0.30865827, 0.96193975)], + 4: [(0, 0.5, 1)], + 5: [(0.038060233, 0.6913417, 0.96193975)], + 6: [(0.14644662, 0.8535534, 0.8535534)], + 7: [(0.30865827, 0.96193975, 0.6913417)], + 8: [(0.5, 1, 0.5)], + 9: [(0.6913417, 0.96193975, 0.30865827)], + 10: [(0.8535534, 0.8535534, 0.14644662)], + 11: [(0.96193975, 0.6913417, 0.038060233)], + 12: [(1, 0.5, 0)], + 13: [(0.96193975, 0.30865827, 0.038060233)], + 14: [(0.8535534, 0.14644662, 0.14644662)], + 15: [(0.6913417, 0.038060233, 0.30865827)], + 16: [(0.5, 0, 0.5)], + 17: [(0.30865827, 0.038060233, 0.6913417)], + 18: [(0.14644662, 0.14644662, 0.8535534)], + 19: [(0.038060233, 0.30865827, 0.96193975)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (180, 180, 180), + 1: (202.5, 202.5, 202.5), + 2: (225, 225, 225), + 3: (247.5, 247.5, 247.5), + 4: (270, 270, 270), + 5: (292.5, 292.5, 292.5), + 6: (315, 315, 315), + 7: (337.5, 337.5, 337.5), + 8: (360, 360, 360), + 9: (382.5, 382.5, 382.5), + 10: (405, 405, 405), + 11: (427.5, 427.5, 427.5), + 12: (450, 450, 450), + 13: (472.5, 472.5, 472.5), + 14: (495, 495, 495), + 15: (517.5, 517.5, 517.5), + 16: (540, 540, 540), + 17: (562.5, 562.5, 562.5), + 18: (585, 585, 585), + 19: (607.5, 607.5, 607.5), + } + double3 xformOp:translate = (-12, 6, 6) + double3 xformOp:translate.timeSamples = { + 0: (-12, 6.000000000000001, 6.000000000000001), + 1: (-13.722075445642904, 4.277924554357096, 4.277924554357096), + 2: (-15.181980515339465, 2.818019484660536, 2.818019484660536), + 3: (-16.15745789630079, 1.842542103699211, 1.842542103699211), + 4: (-16.5, 1.5, 1.5), + 5: (-16.15745789630079, 1.84254210369921, 1.84254210369921), + 6: (-15.181980515339465, 2.8180194846605358, 2.8180194846605358), + 7: (-13.722075445642906, 4.277924554357093, 4.277924554357093), + 8: (-12, 6, 6), + 9: (-10.277924554357096, 7.722075445642904, 7.722075445642904), + 10: (-8.818019484660535, 9.181980515339465, 9.181980515339465), + 11: (-7.84254210369921, 10.15745789630079, 10.15745789630079), + 12: (-7.5, 10.5, 10.5), + 13: (-7.84254210369921, 10.15745789630079, 10.15745789630079), + 14: (-8.818019484660535, 9.181980515339465, 9.181980515339465), + 15: (-10.277924554357096, 7.722075445642904, 7.722075445642904), + 16: (-12, 6.000000000000001, 6.000000000000001), + 17: (-13.722075445642904, 4.277924554357096, 4.277924554357096), + 18: (-15.181980515339465, 2.818019484660536, 2.818019484660536), + 19: (-16.15745789630079, 1.842542103699211, 1.842542103699211), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + } + + def "prim_1" + { + def "prim_0" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.92581093, 0.2545877)], + 1: [(0.8896822, 0.7994828, 0.11031782)], + 2: [(0.97462654, 0.62756115, 0.025373489)], + 3: [(0.9873133, 0.43621942, 0.012686744)], + 4: [(0.92581093, 0.2545877, 0.07418902)], + 5: [(0.7994828, 0.11031782, 0.20051716)], + 6: [(0.62756115, 0.025373489, 0.37243885)], + 7: [(0.43621942, 0.012686744, 0.56378055)], + 8: [(0.2545877, 0.07418902, 0.74541223)], + 9: [(0.11031782, 0.20051716, 0.8896822)], + 10: [(0.025373489, 0.37243885, 0.97462654)], + 11: [(0.012686744, 0.56378055, 0.9873133)], + 12: [(0.07418902, 0.74541223, 0.92581093)], + 13: [(0.20051716, 0.8896822, 0.7994828)], + 14: [(0.37243885, 0.97462654, 0.62756115)], + 15: [(0.56378055, 0.9873133, 0.43621942)], + 16: [(0.74541223, 0.92581093, 0.2545877)], + 17: [(0.8896822, 0.7994828, 0.11031782)], + 18: [(0.97462654, 0.62756115, 0.025373489)], + 19: [(0.9873133, 0.43621942, 0.012686744)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (30, 30, 30), + 1: (52.5, 52.5, 52.5), + 2: (75, 75, 75), + 3: (97.5, 97.5, 97.5), + 4: (120, 120, 120), + 5: (142.5, 142.5, 142.5), + 6: (165, 165, 165), + 7: (187.5, 187.5, 187.5), + 8: (210, 210, 210), + 9: (232.5, 232.5, 232.5), + 10: (255, 255, 255), + 11: (277.5, 277.5, 277.5), + 12: (300, 300, 300), + 13: (322.5, 322.5, 322.5), + 14: (345, 345, 345), + 15: (367.5, 367.5, 367.5), + 16: (390, 390, 390), + 17: (412.5, 412.5, 412.5), + 18: (435, 435, 435), + 19: (457.5, 457.5, 457.5), + } + double3 xformOp:translate = (-6, -12, -12) + double3 xformOp:translate.timeSamples = { + 0: (-3.7912895311249093, -9.79128953112491, -9.79128953112491), + 1: (-2.492860357673428, -8.492860357673429, -8.492860357673429), + 2: (-1.72836140246614, -7.72836140246614, -7.72836140246614), + 3: (-1.61418070123307, -7.61418070123307, -7.61418070123307), + 4: (-2.167701230686318, -8.167701230686319, -8.167701230686319), + 5: (-3.304654507892722, -9.304654507892721, -9.304654507892721), + 6: (-4.851949702904729, -10.85194970290473, -10.85194970290473), + 7: (-6.574025148547635, -12.574025148547635, -12.574025148547635), + 8: (-8.208710468875092, -14.208710468875092, -14.208710468875092), + 9: (-9.507139642326573, -15.507139642326573, -15.507139642326573), + 10: (-10.27163859753386, -16.271638597533858, -16.271638597533858), + 11: (-10.385819298766929, -16.38581929876693, -16.38581929876693), + 12: (-9.832298769313681, -15.832298769313681, -15.832298769313681), + 13: (-8.695345492107277, -14.695345492107277, -14.695345492107277), + 14: (-7.14805029709527, -13.14805029709527, -13.14805029709527), + 15: (-5.425974851452367, -11.425974851452366, -11.425974851452366), + 16: (-3.791289531124911, -9.79128953112491, -9.79128953112491), + 17: (-2.4928603576734285, -8.492860357673429, -8.492860357673429), + 18: (-1.72836140246614, -7.72836140246614, -7.72836140246614), + 19: (-1.6141807012330691, -7.614180701233069, -7.614180701233069), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.74541223, 0.07418902)], + 1: [(0.9873133, 0.56378055, 0.012686744)], + 2: [(0.97462654, 0.37243885, 0.025373489)], + 3: [(0.8896822, 0.20051716, 0.11031782)], + 4: [(0.74541223, 0.07418902, 0.2545877)], + 5: [(0.56378055, 0.012686744, 0.43621942)], + 6: [(0.37243885, 0.025373489, 0.62756115)], + 7: [(0.20051716, 0.11031782, 0.7994828)], + 8: [(0.07418902, 0.2545877, 0.92581093)], + 9: [(0.012686744, 0.43621942, 0.9873133)], + 10: [(0.025373489, 0.62756115, 0.97462654)], + 11: [(0.11031782, 0.7994828, 0.8896822)], + 12: [(0.2545877, 0.92581093, 0.74541223)], + 13: [(0.43621942, 0.9873133, 0.56378055)], + 14: [(0.62756115, 0.97462654, 0.37243885)], + 15: [(0.7994828, 0.8896822, 0.20051716)], + 16: [(0.92581093, 0.74541223, 0.07418902)], + 17: [(0.9873133, 0.56378055, 0.012686744)], + 18: [(0.97462654, 0.37243885, 0.025373489)], + 19: [(0.8896822, 0.20051716, 0.11031782)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (60, 60, 60), + 1: (82.5, 82.5, 82.5), + 2: (105, 105, 105), + 3: (127.5, 127.5, 127.5), + 4: (150, 150, 150), + 5: (172.5, 172.5, 172.5), + 6: (195, 195, 195), + 7: (217.5, 217.5, 217.5), + 8: (240, 240, 240), + 9: (262.5, 262.5, 262.5), + 10: (285, 285, 285), + 11: (307.5, 307.5, 307.5), + 12: (330, 330, 330), + 13: (352.5, 352.5, 352.5), + 14: (375, 375, 375), + 15: (397.5, 397.5, 397.5), + 16: (420, 420, 420), + 17: (442.5, 442.5, 442.5), + 18: (465, 465, 465), + 19: (487.5, 487.5, 487.5), + } + double3 xformOp:translate = (-6, -12, -6) + double3 xformOp:translate.timeSamples = { + 0: (-2.167701230686319, -8.167701230686319, -2.167701230686319), + 1: (-1.61418070123307, -7.61418070123307, -1.61418070123307), + 2: (-1.72836140246614, -7.72836140246614, -1.72836140246614), + 3: (-2.4928603576734263, -8.492860357673425, -2.4928603576734263), + 4: (-3.7912895311249084, -9.791289531124908, -3.7912895311249084), + 5: (-5.425974851452364, -11.425974851452363, -5.425974851452364), + 6: (-7.148050297095268, -13.148050297095267, -7.148050297095268), + 7: (-8.695345492107275, -14.695345492107275, -8.695345492107275), + 8: (-9.832298769313681, -15.832298769313681, -9.832298769313681), + 9: (-10.385819298766929, -16.38581929876693, -10.385819298766929), + 10: (-10.27163859753386, -16.271638597533858, -10.27163859753386), + 11: (-9.507139642326575, -15.507139642326575, -9.507139642326575), + 12: (-8.208710468875093, -14.208710468875093, -8.208710468875093), + 13: (-6.574025148547636, -12.574025148547637, -6.574025148547636), + 14: (-4.8519497029047285, -10.85194970290473, -4.8519497029047285), + 15: (-3.304654507892721, -9.304654507892721, -3.304654507892721), + 16: (-2.1677012306863177, -8.167701230686317, -2.1677012306863177), + 17: (-1.6141807012330691, -7.614180701233069, -1.6141807012330691), + 18: (-1.72836140246614, -7.72836140246614, -1.72836140246614), + 19: (-2.4928603576734285, -8.492860357673429, -2.4928603576734285), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(1, 0.5, 0)], + 1: [(0.96193975, 0.30865827, 0.038060233)], + 2: [(0.8535534, 0.14644662, 0.14644662)], + 3: [(0.6913417, 0.038060233, 0.30865827)], + 4: [(0.5, 0, 0.5)], + 5: [(0.30865827, 0.038060233, 0.6913417)], + 6: [(0.14644662, 0.14644662, 0.8535534)], + 7: [(0.038060233, 0.30865827, 0.96193975)], + 8: [(0, 0.5, 1)], + 9: [(0.038060233, 0.6913417, 0.96193975)], + 10: [(0.14644662, 0.8535534, 0.8535534)], + 11: [(0.30865827, 0.96193975, 0.6913417)], + 12: [(0.5, 1, 0.5)], + 13: [(0.6913417, 0.96193975, 0.30865827)], + 14: [(0.8535534, 0.8535534, 0.14644662)], + 15: [(0.96193975, 0.6913417, 0.038060233)], + 16: [(1, 0.5, 0)], + 17: [(0.96193975, 0.30865827, 0.038060233)], + 18: [(0.8535534, 0.14644662, 0.14644662)], + 19: [(0.6913417, 0.038060233, 0.30865827)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (90, 90, 90), + 1: (112.5, 112.5, 112.5), + 2: (135, 135, 135), + 3: (157.5, 157.5, 157.5), + 4: (180, 180, 180), + 5: (202.5, 202.5, 202.5), + 6: (225, 225, 225), + 7: (247.5, 247.5, 247.5), + 8: (270, 270, 270), + 9: (292.5, 292.5, 292.5), + 10: (315, 315, 315), + 11: (337.5, 337.5, 337.5), + 12: (360, 360, 360), + 13: (382.5, 382.5, 382.5), + 14: (405, 405, 405), + 15: (427.5, 427.5, 427.5), + 16: (450, 450, 450), + 17: (472.5, 472.5, 472.5), + 18: (495, 495, 495), + 19: (517.5, 517.5, 517.5), + } + double3 xformOp:translate = (-6, -12, 0) + double3 xformOp:translate.timeSamples = { + 0: (-1.5, -7.5, 4.5), + 1: (-1.84254210369921, -7.84254210369921, 4.15745789630079), + 2: (-2.8180194846605358, -8.818019484660535, 3.1819805153394642), + 3: (-4.277924554357096, -10.277924554357096, 1.7220754456429046), + 4: (-5.999999999999999, -12, 5.51091059616309e-16), + 5: (-7.722075445642904, -13.722075445642904, -1.7220754456429037), + 6: (-9.181980515339465, -15.181980515339465, -3.181980515339464), + 7: (-10.157457896300789, -16.15745789630079, -4.157457896300789), + 8: (-10.5, -16.5, -4.5), + 9: (-10.15745789630079, -16.15745789630079, -4.15745789630079), + 10: (-9.181980515339465, -15.181980515339465, -3.1819805153394642), + 11: (-7.722075445642907, -13.722075445642906, -1.7220754456429066), + 12: (-6, -12, 0), + 13: (-4.277924554357096, -10.277924554357096, 1.722075445642904), + 14: (-2.818019484660536, -8.818019484660535, 3.181980515339464), + 15: (-1.84254210369921, -7.84254210369921, 4.15745789630079), + 16: (-1.5, -7.5, 4.5), + 17: (-1.84254210369921, -7.84254210369921, 4.15745789630079), + 18: (-2.8180194846605358, -8.818019484660535, 3.1819805153394642), + 19: (-4.277924554357096, -10.277924554357096, 1.7220754456429046), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (-6, -12, 6) + double3 xformOp:translate.timeSamples = { + 0: (-2.167701230686318, -8.167701230686319, 9.832298769313681), + 1: (-3.304654507892722, -9.304654507892721, 8.695345492107279), + 2: (-4.851949702904729, -10.85194970290473, 7.148050297095271), + 3: (-6.574025148547632, -12.574025148547632, 5.425974851452368), + 4: (-8.20871046887509, -14.20871046887509, 3.791289531124911), + 5: (-9.507139642326571, -15.507139642326571, 2.492860357673429), + 6: (-10.271638597533858, -16.271638597533858, 1.728361402466141), + 7: (-10.38581929876693, -16.385819298766933, 1.6141807012330691), + 8: (-9.832298769313683, -15.832298769313683, 2.1677012306863173), + 9: (-8.695345492107279, -14.695345492107279, 3.30465450789272), + 10: (-7.148050297095273, -13.148050297095272, 4.851949702904727), + 11: (-5.425974851452367, -11.425974851452366, 6.574025148547633), + 12: (-3.791289531124911, -9.79128953112491, 8.20871046887509), + 13: (-2.4928603576734285, -8.492860357673429, 9.507139642326571), + 14: (-1.72836140246614, -7.72836140246614, 10.27163859753386), + 15: (-1.6141807012330691, -7.614180701233069, 10.38581929876693), + 16: (-2.1677012306863173, -8.167701230686317, 9.832298769313683), + 17: (-3.304654507892721, -9.304654507892721, 8.695345492107279), + 18: (-4.851949702904728, -10.851949702904728, 7.148050297095272), + 19: (-6.574025148547632, -12.574025148547632, 5.425974851452368), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_1" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.74541223, 0.07418902)], + 1: [(0.9873133, 0.56378055, 0.012686744)], + 2: [(0.97462654, 0.37243885, 0.025373489)], + 3: [(0.8896822, 0.20051716, 0.11031782)], + 4: [(0.74541223, 0.07418902, 0.2545877)], + 5: [(0.56378055, 0.012686744, 0.43621942)], + 6: [(0.37243885, 0.025373489, 0.62756115)], + 7: [(0.20051716, 0.11031782, 0.7994828)], + 8: [(0.07418902, 0.2545877, 0.92581093)], + 9: [(0.012686744, 0.43621942, 0.9873133)], + 10: [(0.025373489, 0.62756115, 0.97462654)], + 11: [(0.11031782, 0.7994828, 0.8896822)], + 12: [(0.2545877, 0.92581093, 0.74541223)], + 13: [(0.43621942, 0.9873133, 0.56378055)], + 14: [(0.62756115, 0.97462654, 0.37243885)], + 15: [(0.7994828, 0.8896822, 0.20051716)], + 16: [(0.92581093, 0.74541223, 0.07418902)], + 17: [(0.9873133, 0.56378055, 0.012686744)], + 18: [(0.97462654, 0.37243885, 0.025373489)], + 19: [(0.8896822, 0.20051716, 0.11031782)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (60, 60, 60), + 1: (82.5, 82.5, 82.5), + 2: (105, 105, 105), + 3: (127.5, 127.5, 127.5), + 4: (150, 150, 150), + 5: (172.5, 172.5, 172.5), + 6: (195, 195, 195), + 7: (217.5, 217.5, 217.5), + 8: (240, 240, 240), + 9: (262.5, 262.5, 262.5), + 10: (285, 285, 285), + 11: (307.5, 307.5, 307.5), + 12: (330, 330, 330), + 13: (352.5, 352.5, 352.5), + 14: (375, 375, 375), + 15: (397.5, 397.5, 397.5), + 16: (420, 420, 420), + 17: (442.5, 442.5, 442.5), + 18: (465, 465, 465), + 19: (487.5, 487.5, 487.5), + } + double3 xformOp:translate = (-6, -6, -12) + double3 xformOp:translate.timeSamples = { + 0: (-2.167701230686319, -2.167701230686319, -8.167701230686319), + 1: (-1.61418070123307, -1.61418070123307, -7.61418070123307), + 2: (-1.72836140246614, -1.72836140246614, -7.72836140246614), + 3: (-2.4928603576734263, -2.4928603576734263, -8.492860357673425), + 4: (-3.7912895311249084, -3.7912895311249084, -9.791289531124908), + 5: (-5.425974851452364, -5.425974851452364, -11.425974851452363), + 6: (-7.148050297095268, -7.148050297095268, -13.148050297095267), + 7: (-8.695345492107275, -8.695345492107275, -14.695345492107275), + 8: (-9.832298769313681, -9.832298769313681, -15.832298769313681), + 9: (-10.385819298766929, -10.385819298766929, -16.38581929876693), + 10: (-10.27163859753386, -10.27163859753386, -16.271638597533858), + 11: (-9.507139642326575, -9.507139642326575, -15.507139642326575), + 12: (-8.208710468875093, -8.208710468875093, -14.208710468875093), + 13: (-6.574025148547636, -6.574025148547636, -12.574025148547637), + 14: (-4.8519497029047285, -4.8519497029047285, -10.85194970290473), + 15: (-3.304654507892721, -3.304654507892721, -9.304654507892721), + 16: (-2.1677012306863177, -2.1677012306863177, -8.167701230686317), + 17: (-1.6141807012330691, -1.6141807012330691, -7.614180701233069), + 18: (-1.72836140246614, -1.72836140246614, -7.72836140246614), + 19: (-2.4928603576734285, -2.4928603576734285, -8.492860357673429), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(1, 0.5, 0)], + 1: [(0.96193975, 0.30865827, 0.038060233)], + 2: [(0.8535534, 0.14644662, 0.14644662)], + 3: [(0.6913417, 0.038060233, 0.30865827)], + 4: [(0.5, 0, 0.5)], + 5: [(0.30865827, 0.038060233, 0.6913417)], + 6: [(0.14644662, 0.14644662, 0.8535534)], + 7: [(0.038060233, 0.30865827, 0.96193975)], + 8: [(0, 0.5, 1)], + 9: [(0.038060233, 0.6913417, 0.96193975)], + 10: [(0.14644662, 0.8535534, 0.8535534)], + 11: [(0.30865827, 0.96193975, 0.6913417)], + 12: [(0.5, 1, 0.5)], + 13: [(0.6913417, 0.96193975, 0.30865827)], + 14: [(0.8535534, 0.8535534, 0.14644662)], + 15: [(0.96193975, 0.6913417, 0.038060233)], + 16: [(1, 0.5, 0)], + 17: [(0.96193975, 0.30865827, 0.038060233)], + 18: [(0.8535534, 0.14644662, 0.14644662)], + 19: [(0.6913417, 0.038060233, 0.30865827)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (90, 90, 90), + 1: (112.5, 112.5, 112.5), + 2: (135, 135, 135), + 3: (157.5, 157.5, 157.5), + 4: (180, 180, 180), + 5: (202.5, 202.5, 202.5), + 6: (225, 225, 225), + 7: (247.5, 247.5, 247.5), + 8: (270, 270, 270), + 9: (292.5, 292.5, 292.5), + 10: (315, 315, 315), + 11: (337.5, 337.5, 337.5), + 12: (360, 360, 360), + 13: (382.5, 382.5, 382.5), + 14: (405, 405, 405), + 15: (427.5, 427.5, 427.5), + 16: (450, 450, 450), + 17: (472.5, 472.5, 472.5), + 18: (495, 495, 495), + 19: (517.5, 517.5, 517.5), + } + double3 xformOp:translate = (-6, -6, -6) + double3 xformOp:translate.timeSamples = { + 0: (-1.5, -1.5, -1.5), + 1: (-1.84254210369921, -1.84254210369921, -1.84254210369921), + 2: (-2.8180194846605358, -2.8180194846605358, -2.8180194846605358), + 3: (-4.277924554357096, -4.277924554357096, -4.277924554357096), + 4: (-5.999999999999999, -5.999999999999999, -5.999999999999999), + 5: (-7.722075445642904, -7.722075445642904, -7.722075445642904), + 6: (-9.181980515339465, -9.181980515339465, -9.181980515339465), + 7: (-10.157457896300789, -10.157457896300789, -10.157457896300789), + 8: (-10.5, -10.5, -10.5), + 9: (-10.15745789630079, -10.15745789630079, -10.15745789630079), + 10: (-9.181980515339465, -9.181980515339465, -9.181980515339465), + 11: (-7.722075445642907, -7.722075445642907, -7.722075445642907), + 12: (-6, -6, -6), + 13: (-4.277924554357096, -4.277924554357096, -4.277924554357096), + 14: (-2.818019484660536, -2.818019484660536, -2.818019484660536), + 15: (-1.84254210369921, -1.84254210369921, -1.84254210369921), + 16: (-1.5, -1.5, -1.5), + 17: (-1.84254210369921, -1.84254210369921, -1.84254210369921), + 18: (-2.8180194846605358, -2.8180194846605358, -2.8180194846605358), + 19: (-4.277924554357096, -4.277924554357096, -4.277924554357096), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (-6, -6, 0) + double3 xformOp:translate.timeSamples = { + 0: (-2.167701230686318, -2.167701230686318, 3.832298769313682), + 1: (-3.304654507892722, -3.304654507892722, 2.695345492107278), + 2: (-4.851949702904729, -4.851949702904729, 1.1480502970952704), + 3: (-6.574025148547632, -6.574025148547632, -0.5740251485476322), + 4: (-8.20871046887509, -8.20871046887509, -2.208710468875089), + 5: (-9.507139642326571, -9.507139642326571, -3.507139642326571), + 6: (-10.271638597533858, -10.271638597533858, -4.271638597533859), + 7: (-10.38581929876693, -10.38581929876693, -4.385819298766931), + 8: (-9.832298769313683, -9.832298769313683, -3.8322987693136827), + 9: (-8.695345492107279, -8.695345492107279, -2.69534549210728), + 10: (-7.148050297095273, -7.148050297095273, -1.148050297095273), + 11: (-5.425974851452367, -5.425974851452367, 0.5740251485476326), + 12: (-3.791289531124911, -3.791289531124911, 2.208710468875089), + 13: (-2.4928603576734285, -2.4928603576734285, 3.5071396423265715), + 14: (-1.72836140246614, -1.72836140246614, 4.27163859753386), + 15: (-1.6141807012330691, -1.6141807012330691, 4.385819298766931), + 16: (-2.1677012306863173, -2.1677012306863173, 3.8322987693136827), + 17: (-3.304654507892721, -3.304654507892721, 2.695345492107279), + 18: (-4.851949702904728, -4.851949702904728, 1.148050297095272), + 19: (-6.574025148547632, -6.574025148547632, -0.5740251485476322), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (-6, -6, 6) + double3 xformOp:translate.timeSamples = { + 0: (-3.7912895311249084, -3.7912895311249084, 8.208710468875092), + 1: (-5.425974851452364, -5.425974851452364, 6.574025148547636), + 2: (-7.148050297095268, -7.148050297095268, 4.851949702904732), + 3: (-8.695345492107275, -8.695345492107275, 3.3046545078927236), + 4: (-9.832298769313681, -9.832298769313681, 2.16770123068632), + 5: (-10.385819298766929, -10.385819298766929, 1.614180701233071), + 6: (-10.27163859753386, -10.27163859753386, 1.72836140246614), + 7: (-9.507139642326575, -9.507139642326575, 2.4928603576734263), + 8: (-8.208710468875093, -8.208710468875093, 3.7912895311249066), + 9: (-6.574025148547636, -6.574025148547636, 5.425974851452364), + 10: (-4.851949702904735, -4.851949702904735, 7.148050297095265), + 11: (-3.3046545078927263, -3.3046545078927263, 8.695345492107274), + 12: (-2.167701230686321, -2.167701230686321, 9.83229876931368), + 13: (-1.614180701233071, -1.614180701233071, 10.385819298766929), + 14: (-1.7283614024661391, -1.7283614024661391, 10.271638597533862), + 15: (-2.492860357673425, -2.492860357673425, 9.507139642326575), + 16: (-3.7912895311249053, -3.7912895311249053, 8.208710468875095), + 17: (-5.425974851452361, -5.425974851452361, 6.574025148547639), + 18: (-7.148050297095265, -7.148050297095265, 4.851949702904735), + 19: (-8.695345492107274, -8.695345492107274, 3.3046545078927263), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_2" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(1, 0.5, 0)], + 1: [(0.96193975, 0.30865827, 0.038060233)], + 2: [(0.8535534, 0.14644662, 0.14644662)], + 3: [(0.6913417, 0.038060233, 0.30865827)], + 4: [(0.5, 0, 0.5)], + 5: [(0.30865827, 0.038060233, 0.6913417)], + 6: [(0.14644662, 0.14644662, 0.8535534)], + 7: [(0.038060233, 0.30865827, 0.96193975)], + 8: [(0, 0.5, 1)], + 9: [(0.038060233, 0.6913417, 0.96193975)], + 10: [(0.14644662, 0.8535534, 0.8535534)], + 11: [(0.30865827, 0.96193975, 0.6913417)], + 12: [(0.5, 1, 0.5)], + 13: [(0.6913417, 0.96193975, 0.30865827)], + 14: [(0.8535534, 0.8535534, 0.14644662)], + 15: [(0.96193975, 0.6913417, 0.038060233)], + 16: [(1, 0.5, 0)], + 17: [(0.96193975, 0.30865827, 0.038060233)], + 18: [(0.8535534, 0.14644662, 0.14644662)], + 19: [(0.6913417, 0.038060233, 0.30865827)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (90, 90, 90), + 1: (112.5, 112.5, 112.5), + 2: (135, 135, 135), + 3: (157.5, 157.5, 157.5), + 4: (180, 180, 180), + 5: (202.5, 202.5, 202.5), + 6: (225, 225, 225), + 7: (247.5, 247.5, 247.5), + 8: (270, 270, 270), + 9: (292.5, 292.5, 292.5), + 10: (315, 315, 315), + 11: (337.5, 337.5, 337.5), + 12: (360, 360, 360), + 13: (382.5, 382.5, 382.5), + 14: (405, 405, 405), + 15: (427.5, 427.5, 427.5), + 16: (450, 450, 450), + 17: (472.5, 472.5, 472.5), + 18: (495, 495, 495), + 19: (517.5, 517.5, 517.5), + } + double3 xformOp:translate = (-6, 0, -12) + double3 xformOp:translate.timeSamples = { + 0: (-1.5, 4.5, -7.5), + 1: (-1.84254210369921, 4.15745789630079, -7.84254210369921), + 2: (-2.8180194846605358, 3.1819805153394642, -8.818019484660535), + 3: (-4.277924554357096, 1.7220754456429046, -10.277924554357096), + 4: (-5.999999999999999, 5.51091059616309e-16, -12), + 5: (-7.722075445642904, -1.7220754456429037, -13.722075445642904), + 6: (-9.181980515339465, -3.181980515339464, -15.181980515339465), + 7: (-10.157457896300789, -4.157457896300789, -16.15745789630079), + 8: (-10.5, -4.5, -16.5), + 9: (-10.15745789630079, -4.15745789630079, -16.15745789630079), + 10: (-9.181980515339465, -3.1819805153394642, -15.181980515339465), + 11: (-7.722075445642907, -1.7220754456429066, -13.722075445642906), + 12: (-6, 0, -12), + 13: (-4.277924554357096, 1.722075445642904, -10.277924554357096), + 14: (-2.818019484660536, 3.181980515339464, -8.818019484660535), + 15: (-1.84254210369921, 4.15745789630079, -7.84254210369921), + 16: (-1.5, 4.5, -7.5), + 17: (-1.84254210369921, 4.15745789630079, -7.84254210369921), + 18: (-2.8180194846605358, 3.1819805153394642, -8.818019484660535), + 19: (-4.277924554357096, 1.7220754456429046, -10.277924554357096), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (-6, 0, -6) + double3 xformOp:translate.timeSamples = { + 0: (-2.167701230686318, 3.832298769313682, -2.167701230686318), + 1: (-3.304654507892722, 2.695345492107278, -3.304654507892722), + 2: (-4.851949702904729, 1.1480502970952704, -4.851949702904729), + 3: (-6.574025148547632, -0.5740251485476322, -6.574025148547632), + 4: (-8.20871046887509, -2.208710468875089, -8.20871046887509), + 5: (-9.507139642326571, -3.507139642326571, -9.507139642326571), + 6: (-10.271638597533858, -4.271638597533859, -10.271638597533858), + 7: (-10.38581929876693, -4.385819298766931, -10.38581929876693), + 8: (-9.832298769313683, -3.8322987693136827, -9.832298769313683), + 9: (-8.695345492107279, -2.69534549210728, -8.695345492107279), + 10: (-7.148050297095273, -1.148050297095273, -7.148050297095273), + 11: (-5.425974851452367, 0.5740251485476326, -5.425974851452367), + 12: (-3.791289531124911, 2.208710468875089, -3.791289531124911), + 13: (-2.4928603576734285, 3.5071396423265715, -2.4928603576734285), + 14: (-1.72836140246614, 4.27163859753386, -1.72836140246614), + 15: (-1.6141807012330691, 4.385819298766931, -1.6141807012330691), + 16: (-2.1677012306863173, 3.8322987693136827, -2.1677012306863173), + 17: (-3.304654507892721, 2.695345492107279, -3.304654507892721), + 18: (-4.851949702904728, 1.148050297095272, -4.851949702904728), + 19: (-6.574025148547632, -0.5740251485476322, -6.574025148547632), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (-6, 0, 0) + double3 xformOp:translate.timeSamples = { + 0: (-3.7912895311249084, 2.2087104688750916, 2.2087104688750916), + 1: (-5.425974851452364, 0.5740251485476362, 0.5740251485476362), + 2: (-7.148050297095268, -1.148050297095268, -1.148050297095268), + 3: (-8.695345492107275, -2.6953454921072764, -2.6953454921072764), + 4: (-9.832298769313681, -3.83229876931368, -3.83229876931368), + 5: (-10.385819298766929, -4.385819298766929, -4.385819298766929), + 6: (-10.27163859753386, -4.27163859753386, -4.27163859753386), + 7: (-9.507139642326575, -3.5071396423265737, -3.5071396423265737), + 8: (-8.208710468875093, -2.2087104688750934, -2.2087104688750934), + 9: (-6.574025148547636, -0.5740251485476365, -0.5740251485476365), + 10: (-4.851949702904735, 1.1480502970952653, 1.1480502970952653), + 11: (-3.3046545078927263, 2.6953454921072737, 2.6953454921072737), + 12: (-2.167701230686321, 3.832298769313679, 3.832298769313679), + 13: (-1.614180701233071, 4.385819298766929, 4.385819298766929), + 14: (-1.7283614024661391, 4.271638597533861, 4.271638597533861), + 15: (-2.492860357673425, 3.507139642326575, 3.507139642326575), + 16: (-3.7912895311249053, 2.2087104688750947, 2.2087104688750947), + 17: (-5.425974851452361, 0.5740251485476393, 0.5740251485476393), + 18: (-7.148050297095265, -1.1480502970952648, -1.1480502970952648), + 19: (-8.695345492107274, -2.6953454921072737, -2.6953454921072737), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.5, 0, 0.5)], + 1: [(0.30865827, 0.038060233, 0.6913417)], + 2: [(0.14644662, 0.14644662, 0.8535534)], + 3: [(0.038060233, 0.30865827, 0.96193975)], + 4: [(0, 0.5, 1)], + 5: [(0.038060233, 0.6913417, 0.96193975)], + 6: [(0.14644662, 0.8535534, 0.8535534)], + 7: [(0.30865827, 0.96193975, 0.6913417)], + 8: [(0.5, 1, 0.5)], + 9: [(0.6913417, 0.96193975, 0.30865827)], + 10: [(0.8535534, 0.8535534, 0.14644662)], + 11: [(0.96193975, 0.6913417, 0.038060233)], + 12: [(1, 0.5, 0)], + 13: [(0.96193975, 0.30865827, 0.038060233)], + 14: [(0.8535534, 0.14644662, 0.14644662)], + 15: [(0.6913417, 0.038060233, 0.30865827)], + 16: [(0.5, 0, 0.5)], + 17: [(0.30865827, 0.038060233, 0.6913417)], + 18: [(0.14644662, 0.14644662, 0.8535534)], + 19: [(0.038060233, 0.30865827, 0.96193975)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (180, 180, 180), + 1: (202.5, 202.5, 202.5), + 2: (225, 225, 225), + 3: (247.5, 247.5, 247.5), + 4: (270, 270, 270), + 5: (292.5, 292.5, 292.5), + 6: (315, 315, 315), + 7: (337.5, 337.5, 337.5), + 8: (360, 360, 360), + 9: (382.5, 382.5, 382.5), + 10: (405, 405, 405), + 11: (427.5, 427.5, 427.5), + 12: (450, 450, 450), + 13: (472.5, 472.5, 472.5), + 14: (495, 495, 495), + 15: (517.5, 517.5, 517.5), + 16: (540, 540, 540), + 17: (562.5, 562.5, 562.5), + 18: (585, 585, 585), + 19: (607.5, 607.5, 607.5), + } + double3 xformOp:translate = (-6, 0, 6) + double3 xformOp:translate.timeSamples = { + 0: (-5.999999999999999, 5.51091059616309e-16, 6.000000000000001), + 1: (-7.722075445642904, -1.7220754456429037, 4.277924554357096), + 2: (-9.181980515339465, -3.181980515339464, 2.818019484660536), + 3: (-10.157457896300789, -4.157457896300789, 1.842542103699211), + 4: (-10.5, -4.5, 1.5), + 5: (-10.15745789630079, -4.15745789630079, 1.84254210369921), + 6: (-9.181980515339465, -3.1819805153394642, 2.8180194846605358), + 7: (-7.722075445642907, -1.7220754456429066, 4.277924554357093), + 8: (-6, 0, 6), + 9: (-4.277924554357096, 1.722075445642904, 7.722075445642904), + 10: (-2.818019484660536, 3.181980515339464, 9.181980515339465), + 11: (-1.84254210369921, 4.15745789630079, 10.15745789630079), + 12: (-1.5, 4.5, 10.5), + 13: (-1.84254210369921, 4.15745789630079, 10.15745789630079), + 14: (-2.8180194846605358, 3.1819805153394642, 9.181980515339465), + 15: (-4.277924554357096, 1.7220754456429046, 7.722075445642904), + 16: (-5.999999999999999, 5.51091059616309e-16, 6.000000000000001), + 17: (-7.722075445642904, -1.7220754456429037, 4.277924554357096), + 18: (-9.181980515339465, -3.181980515339464, 2.818019484660536), + 19: (-10.157457896300789, -4.157457896300789, 1.842542103699211), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_3" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (-6, 6, -12) + double3 xformOp:translate.timeSamples = { + 0: (-2.167701230686318, 9.832298769313681, -8.167701230686319), + 1: (-3.304654507892722, 8.695345492107279, -9.304654507892721), + 2: (-4.851949702904729, 7.148050297095271, -10.85194970290473), + 3: (-6.574025148547632, 5.425974851452368, -12.574025148547632), + 4: (-8.20871046887509, 3.791289531124911, -14.20871046887509), + 5: (-9.507139642326571, 2.492860357673429, -15.507139642326571), + 6: (-10.271638597533858, 1.728361402466141, -16.271638597533858), + 7: (-10.38581929876693, 1.6141807012330691, -16.385819298766933), + 8: (-9.832298769313683, 2.1677012306863173, -15.832298769313683), + 9: (-8.695345492107279, 3.30465450789272, -14.695345492107279), + 10: (-7.148050297095273, 4.851949702904727, -13.148050297095272), + 11: (-5.425974851452367, 6.574025148547633, -11.425974851452366), + 12: (-3.791289531124911, 8.20871046887509, -9.79128953112491), + 13: (-2.4928603576734285, 9.507139642326571, -8.492860357673429), + 14: (-1.72836140246614, 10.27163859753386, -7.72836140246614), + 15: (-1.6141807012330691, 10.38581929876693, -7.614180701233069), + 16: (-2.1677012306863173, 9.832298769313683, -8.167701230686317), + 17: (-3.304654507892721, 8.695345492107279, -9.304654507892721), + 18: (-4.851949702904728, 7.148050297095272, -10.851949702904728), + 19: (-6.574025148547632, 5.425974851452368, -12.574025148547632), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (-6, 6, -6) + double3 xformOp:translate.timeSamples = { + 0: (-3.7912895311249084, 8.208710468875092, -3.7912895311249084), + 1: (-5.425974851452364, 6.574025148547636, -5.425974851452364), + 2: (-7.148050297095268, 4.851949702904732, -7.148050297095268), + 3: (-8.695345492107275, 3.3046545078927236, -8.695345492107275), + 4: (-9.832298769313681, 2.16770123068632, -9.832298769313681), + 5: (-10.385819298766929, 1.614180701233071, -10.385819298766929), + 6: (-10.27163859753386, 1.72836140246614, -10.27163859753386), + 7: (-9.507139642326575, 2.4928603576734263, -9.507139642326575), + 8: (-8.208710468875093, 3.7912895311249066, -8.208710468875093), + 9: (-6.574025148547636, 5.425974851452364, -6.574025148547636), + 10: (-4.851949702904735, 7.148050297095265, -4.851949702904735), + 11: (-3.3046545078927263, 8.695345492107274, -3.3046545078927263), + 12: (-2.167701230686321, 9.83229876931368, -2.167701230686321), + 13: (-1.614180701233071, 10.385819298766929, -1.614180701233071), + 14: (-1.7283614024661391, 10.271638597533862, -1.7283614024661391), + 15: (-2.492860357673425, 9.507139642326575, -2.492860357673425), + 16: (-3.7912895311249053, 8.208710468875095, -3.7912895311249053), + 17: (-5.425974851452361, 6.574025148547639, -5.425974851452361), + 18: (-7.148050297095265, 4.851949702904735, -7.148050297095265), + 19: (-8.695345492107274, 3.3046545078927263, -8.695345492107274), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.5, 0, 0.5)], + 1: [(0.30865827, 0.038060233, 0.6913417)], + 2: [(0.14644662, 0.14644662, 0.8535534)], + 3: [(0.038060233, 0.30865827, 0.96193975)], + 4: [(0, 0.5, 1)], + 5: [(0.038060233, 0.6913417, 0.96193975)], + 6: [(0.14644662, 0.8535534, 0.8535534)], + 7: [(0.30865827, 0.96193975, 0.6913417)], + 8: [(0.5, 1, 0.5)], + 9: [(0.6913417, 0.96193975, 0.30865827)], + 10: [(0.8535534, 0.8535534, 0.14644662)], + 11: [(0.96193975, 0.6913417, 0.038060233)], + 12: [(1, 0.5, 0)], + 13: [(0.96193975, 0.30865827, 0.038060233)], + 14: [(0.8535534, 0.14644662, 0.14644662)], + 15: [(0.6913417, 0.038060233, 0.30865827)], + 16: [(0.5, 0, 0.5)], + 17: [(0.30865827, 0.038060233, 0.6913417)], + 18: [(0.14644662, 0.14644662, 0.8535534)], + 19: [(0.038060233, 0.30865827, 0.96193975)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (180, 180, 180), + 1: (202.5, 202.5, 202.5), + 2: (225, 225, 225), + 3: (247.5, 247.5, 247.5), + 4: (270, 270, 270), + 5: (292.5, 292.5, 292.5), + 6: (315, 315, 315), + 7: (337.5, 337.5, 337.5), + 8: (360, 360, 360), + 9: (382.5, 382.5, 382.5), + 10: (405, 405, 405), + 11: (427.5, 427.5, 427.5), + 12: (450, 450, 450), + 13: (472.5, 472.5, 472.5), + 14: (495, 495, 495), + 15: (517.5, 517.5, 517.5), + 16: (540, 540, 540), + 17: (562.5, 562.5, 562.5), + 18: (585, 585, 585), + 19: (607.5, 607.5, 607.5), + } + double3 xformOp:translate = (-6, 6, 0) + double3 xformOp:translate.timeSamples = { + 0: (-5.999999999999999, 6.000000000000001, 5.51091059616309e-16), + 1: (-7.722075445642904, 4.277924554357096, -1.7220754456429037), + 2: (-9.181980515339465, 2.818019484660536, -3.181980515339464), + 3: (-10.157457896300789, 1.842542103699211, -4.157457896300789), + 4: (-10.5, 1.5, -4.5), + 5: (-10.15745789630079, 1.84254210369921, -4.15745789630079), + 6: (-9.181980515339465, 2.8180194846605358, -3.1819805153394642), + 7: (-7.722075445642907, 4.277924554357093, -1.7220754456429066), + 8: (-6, 6, 0), + 9: (-4.277924554357096, 7.722075445642904, 1.722075445642904), + 10: (-2.818019484660536, 9.181980515339465, 3.181980515339464), + 11: (-1.84254210369921, 10.15745789630079, 4.15745789630079), + 12: (-1.5, 10.5, 4.5), + 13: (-1.84254210369921, 10.15745789630079, 4.15745789630079), + 14: (-2.8180194846605358, 9.181980515339465, 3.1819805153394642), + 15: (-4.277924554357096, 7.722075445642904, 1.7220754456429046), + 16: (-5.999999999999999, 6.000000000000001, 5.51091059616309e-16), + 17: (-7.722075445642904, 4.277924554357096, -1.7220754456429037), + 18: (-9.181980515339465, 2.818019484660536, -3.181980515339464), + 19: (-10.157457896300789, 1.842542103699211, -4.157457896300789), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.2545877, 0.07418902, 0.74541223)], + 1: [(0.11031782, 0.20051716, 0.8896822)], + 2: [(0.025373489, 0.37243885, 0.97462654)], + 3: [(0.012686744, 0.56378055, 0.9873133)], + 4: [(0.07418902, 0.74541223, 0.92581093)], + 5: [(0.20051716, 0.8896822, 0.7994828)], + 6: [(0.37243885, 0.97462654, 0.62756115)], + 7: [(0.56378055, 0.9873133, 0.43621942)], + 8: [(0.74541223, 0.92581093, 0.2545877)], + 9: [(0.8896822, 0.7994828, 0.11031782)], + 10: [(0.97462654, 0.62756115, 0.025373489)], + 11: [(0.9873133, 0.43621942, 0.012686744)], + 12: [(0.92581093, 0.2545877, 0.07418902)], + 13: [(0.7994828, 0.11031782, 0.20051716)], + 14: [(0.62756115, 0.025373489, 0.37243885)], + 15: [(0.43621942, 0.012686744, 0.56378055)], + 16: [(0.2545877, 0.07418902, 0.74541223)], + 17: [(0.11031782, 0.20051716, 0.8896822)], + 18: [(0.025373489, 0.37243885, 0.97462654)], + 19: [(0.012686744, 0.56378055, 0.9873133)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (210, 210, 210), + 1: (232.5, 232.5, 232.5), + 2: (255, 255, 255), + 3: (277.5, 277.5, 277.5), + 4: (300, 300, 300), + 5: (322.5, 322.5, 322.5), + 6: (345, 345, 345), + 7: (367.5, 367.5, 367.5), + 8: (390, 390, 390), + 9: (412.5, 412.5, 412.5), + 10: (435, 435, 435), + 11: (457.5, 457.5, 457.5), + 12: (480, 480, 480), + 13: (502.5, 502.5, 502.5), + 14: (525, 525, 525), + 15: (547.5, 547.5, 547.5), + 16: (570, 570, 570), + 17: (592.5, 592.5, 592.5), + 18: (615, 615, 615), + 19: (637.5, 637.5, 637.5), + } + double3 xformOp:translate = (-6, 6, 6) + double3 xformOp:translate.timeSamples = { + 0: (-8.20871046887509, 3.791289531124911, 3.791289531124911), + 1: (-9.507139642326571, 2.492860357673429, 2.492860357673429), + 2: (-10.271638597533858, 1.728361402466141, 1.728361402466141), + 3: (-10.38581929876693, 1.6141807012330691, 1.6141807012330691), + 4: (-9.832298769313683, 2.1677012306863173, 2.1677012306863173), + 5: (-8.695345492107279, 3.30465450789272, 3.30465450789272), + 6: (-7.148050297095273, 4.851949702904727, 4.851949702904727), + 7: (-5.425974851452367, 6.574025148547633, 6.574025148547633), + 8: (-3.791289531124911, 8.20871046887509, 8.20871046887509), + 9: (-2.4928603576734285, 9.507139642326571, 9.507139642326571), + 10: (-1.72836140246614, 10.27163859753386, 10.27163859753386), + 11: (-1.6141807012330691, 10.38581929876693, 10.38581929876693), + 12: (-2.1677012306863173, 9.832298769313683, 9.832298769313683), + 13: (-3.304654507892721, 8.695345492107279, 8.695345492107279), + 14: (-4.851949702904728, 7.148050297095272, 7.148050297095272), + 15: (-6.574025148547632, 5.425974851452368, 5.425974851452368), + 16: (-8.20871046887509, 3.791289531124911, 3.791289531124911), + 17: (-9.507139642326571, 2.492860357673429, 2.492860357673429), + 18: (-10.271638597533858, 1.728361402466141, 1.728361402466141), + 19: (-10.38581929876693, 1.6141807012330691, 1.6141807012330691), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + } + + def "prim_2" + { + def "prim_0" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.74541223, 0.07418902)], + 1: [(0.9873133, 0.56378055, 0.012686744)], + 2: [(0.97462654, 0.37243885, 0.025373489)], + 3: [(0.8896822, 0.20051716, 0.11031782)], + 4: [(0.74541223, 0.07418902, 0.2545877)], + 5: [(0.56378055, 0.012686744, 0.43621942)], + 6: [(0.37243885, 0.025373489, 0.62756115)], + 7: [(0.20051716, 0.11031782, 0.7994828)], + 8: [(0.07418902, 0.2545877, 0.92581093)], + 9: [(0.012686744, 0.43621942, 0.9873133)], + 10: [(0.025373489, 0.62756115, 0.97462654)], + 11: [(0.11031782, 0.7994828, 0.8896822)], + 12: [(0.2545877, 0.92581093, 0.74541223)], + 13: [(0.43621942, 0.9873133, 0.56378055)], + 14: [(0.62756115, 0.97462654, 0.37243885)], + 15: [(0.7994828, 0.8896822, 0.20051716)], + 16: [(0.92581093, 0.74541223, 0.07418902)], + 17: [(0.9873133, 0.56378055, 0.012686744)], + 18: [(0.97462654, 0.37243885, 0.025373489)], + 19: [(0.8896822, 0.20051716, 0.11031782)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (60, 60, 60), + 1: (82.5, 82.5, 82.5), + 2: (105, 105, 105), + 3: (127.5, 127.5, 127.5), + 4: (150, 150, 150), + 5: (172.5, 172.5, 172.5), + 6: (195, 195, 195), + 7: (217.5, 217.5, 217.5), + 8: (240, 240, 240), + 9: (262.5, 262.5, 262.5), + 10: (285, 285, 285), + 11: (307.5, 307.5, 307.5), + 12: (330, 330, 330), + 13: (352.5, 352.5, 352.5), + 14: (375, 375, 375), + 15: (397.5, 397.5, 397.5), + 16: (420, 420, 420), + 17: (442.5, 442.5, 442.5), + 18: (465, 465, 465), + 19: (487.5, 487.5, 487.5), + } + double3 xformOp:translate = (0, -12, -12) + double3 xformOp:translate.timeSamples = { + 0: (3.832298769313681, -8.167701230686319, -8.167701230686319), + 1: (4.38581929876693, -7.61418070123307, -7.61418070123307), + 2: (4.27163859753386, -7.72836140246614, -7.72836140246614), + 3: (3.5071396423265737, -8.492860357673425, -8.492860357673425), + 4: (2.2087104688750916, -9.791289531124908, -9.791289531124908), + 5: (0.5740251485476362, -11.425974851452363, -11.425974851452363), + 6: (-1.148050297095268, -13.148050297095267, -13.148050297095267), + 7: (-2.6953454921072764, -14.695345492107275, -14.695345492107275), + 8: (-3.83229876931368, -15.832298769313681, -15.832298769313681), + 9: (-4.385819298766929, -16.38581929876693, -16.38581929876693), + 10: (-4.27163859753386, -16.271638597533858, -16.271638597533858), + 11: (-3.5071396423265737, -15.507139642326575, -15.507139642326575), + 12: (-2.2087104688750934, -14.208710468875093, -14.208710468875093), + 13: (-0.5740251485476365, -12.574025148547637, -12.574025148547637), + 14: (1.1480502970952713, -10.85194970290473, -10.85194970290473), + 15: (2.695345492107279, -9.304654507892721, -9.304654507892721), + 16: (3.8322987693136823, -8.167701230686317, -8.167701230686317), + 17: (4.385819298766931, -7.614180701233069, -7.614180701233069), + 18: (4.27163859753386, -7.72836140246614, -7.72836140246614), + 19: (3.5071396423265715, -8.492860357673429, -8.492860357673429), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(1, 0.5, 0)], + 1: [(0.96193975, 0.30865827, 0.038060233)], + 2: [(0.8535534, 0.14644662, 0.14644662)], + 3: [(0.6913417, 0.038060233, 0.30865827)], + 4: [(0.5, 0, 0.5)], + 5: [(0.30865827, 0.038060233, 0.6913417)], + 6: [(0.14644662, 0.14644662, 0.8535534)], + 7: [(0.038060233, 0.30865827, 0.96193975)], + 8: [(0, 0.5, 1)], + 9: [(0.038060233, 0.6913417, 0.96193975)], + 10: [(0.14644662, 0.8535534, 0.8535534)], + 11: [(0.30865827, 0.96193975, 0.6913417)], + 12: [(0.5, 1, 0.5)], + 13: [(0.6913417, 0.96193975, 0.30865827)], + 14: [(0.8535534, 0.8535534, 0.14644662)], + 15: [(0.96193975, 0.6913417, 0.038060233)], + 16: [(1, 0.5, 0)], + 17: [(0.96193975, 0.30865827, 0.038060233)], + 18: [(0.8535534, 0.14644662, 0.14644662)], + 19: [(0.6913417, 0.038060233, 0.30865827)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (90, 90, 90), + 1: (112.5, 112.5, 112.5), + 2: (135, 135, 135), + 3: (157.5, 157.5, 157.5), + 4: (180, 180, 180), + 5: (202.5, 202.5, 202.5), + 6: (225, 225, 225), + 7: (247.5, 247.5, 247.5), + 8: (270, 270, 270), + 9: (292.5, 292.5, 292.5), + 10: (315, 315, 315), + 11: (337.5, 337.5, 337.5), + 12: (360, 360, 360), + 13: (382.5, 382.5, 382.5), + 14: (405, 405, 405), + 15: (427.5, 427.5, 427.5), + 16: (450, 450, 450), + 17: (472.5, 472.5, 472.5), + 18: (495, 495, 495), + 19: (517.5, 517.5, 517.5), + } + double3 xformOp:translate = (0, -12, -6) + double3 xformOp:translate.timeSamples = { + 0: (4.5, -7.5, -1.5), + 1: (4.15745789630079, -7.84254210369921, -1.84254210369921), + 2: (3.1819805153394642, -8.818019484660535, -2.8180194846605358), + 3: (1.7220754456429046, -10.277924554357096, -4.277924554357096), + 4: (5.51091059616309e-16, -12, -5.999999999999999), + 5: (-1.7220754456429037, -13.722075445642904, -7.722075445642904), + 6: (-3.181980515339464, -15.181980515339465, -9.181980515339465), + 7: (-4.157457896300789, -16.15745789630079, -10.157457896300789), + 8: (-4.5, -16.5, -10.5), + 9: (-4.15745789630079, -16.15745789630079, -10.15745789630079), + 10: (-3.1819805153394642, -15.181980515339465, -9.181980515339465), + 11: (-1.7220754456429066, -13.722075445642906, -7.722075445642907), + 12: (0, -12, -6), + 13: (1.722075445642904, -10.277924554357096, -4.277924554357096), + 14: (3.181980515339464, -8.818019484660535, -2.818019484660536), + 15: (4.15745789630079, -7.84254210369921, -1.84254210369921), + 16: (4.5, -7.5, -1.5), + 17: (4.15745789630079, -7.84254210369921, -1.84254210369921), + 18: (3.1819805153394642, -8.818019484660535, -2.8180194846605358), + 19: (1.7220754456429046, -10.277924554357096, -4.277924554357096), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (0, -12, 0) + double3 xformOp:translate.timeSamples = { + 0: (3.832298769313682, -8.167701230686319, 3.832298769313682), + 1: (2.695345492107278, -9.304654507892721, 2.695345492107278), + 2: (1.1480502970952704, -10.85194970290473, 1.1480502970952704), + 3: (-0.5740251485476322, -12.574025148547632, -0.5740251485476322), + 4: (-2.208710468875089, -14.20871046887509, -2.208710468875089), + 5: (-3.507139642326571, -15.507139642326571, -3.507139642326571), + 6: (-4.271638597533859, -16.271638597533858, -4.271638597533859), + 7: (-4.385819298766931, -16.385819298766933, -4.385819298766931), + 8: (-3.8322987693136827, -15.832298769313683, -3.8322987693136827), + 9: (-2.69534549210728, -14.695345492107279, -2.69534549210728), + 10: (-1.148050297095273, -13.148050297095272, -1.148050297095273), + 11: (0.5740251485476326, -11.425974851452366, 0.5740251485476326), + 12: (2.208710468875089, -9.79128953112491, 2.208710468875089), + 13: (3.5071396423265715, -8.492860357673429, 3.5071396423265715), + 14: (4.27163859753386, -7.72836140246614, 4.27163859753386), + 15: (4.385819298766931, -7.614180701233069, 4.385819298766931), + 16: (3.8322987693136827, -8.167701230686317, 3.8322987693136827), + 17: (2.695345492107279, -9.304654507892721, 2.695345492107279), + 18: (1.148050297095272, -10.851949702904728, 1.148050297095272), + 19: (-0.5740251485476322, -12.574025148547632, -0.5740251485476322), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (0, -12, 6) + double3 xformOp:translate.timeSamples = { + 0: (2.2087104688750916, -9.791289531124908, 8.208710468875092), + 1: (0.5740251485476362, -11.425974851452363, 6.574025148547636), + 2: (-1.148050297095268, -13.148050297095267, 4.851949702904732), + 3: (-2.6953454921072764, -14.695345492107275, 3.3046545078927236), + 4: (-3.83229876931368, -15.832298769313681, 2.16770123068632), + 5: (-4.385819298766929, -16.38581929876693, 1.614180701233071), + 6: (-4.27163859753386, -16.271638597533858, 1.72836140246614), + 7: (-3.5071396423265737, -15.507139642326575, 2.4928603576734263), + 8: (-2.2087104688750934, -14.208710468875093, 3.7912895311249066), + 9: (-0.5740251485476365, -12.574025148547637, 5.425974851452364), + 10: (1.1480502970952653, -10.851949702904735, 7.148050297095265), + 11: (2.6953454921072737, -9.304654507892726, 8.695345492107274), + 12: (3.832298769313679, -8.16770123068632, 9.83229876931368), + 13: (4.385819298766929, -7.614180701233071, 10.385819298766929), + 14: (4.271638597533861, -7.728361402466139, 10.271638597533862), + 15: (3.507139642326575, -8.492860357673425, 9.507139642326575), + 16: (2.2087104688750947, -9.791289531124905, 8.208710468875095), + 17: (0.5740251485476393, -11.425974851452361, 6.574025148547639), + 18: (-1.1480502970952648, -13.148050297095265, 4.851949702904735), + 19: (-2.6953454921072737, -14.695345492107274, 3.3046545078927263), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_1" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(1, 0.5, 0)], + 1: [(0.96193975, 0.30865827, 0.038060233)], + 2: [(0.8535534, 0.14644662, 0.14644662)], + 3: [(0.6913417, 0.038060233, 0.30865827)], + 4: [(0.5, 0, 0.5)], + 5: [(0.30865827, 0.038060233, 0.6913417)], + 6: [(0.14644662, 0.14644662, 0.8535534)], + 7: [(0.038060233, 0.30865827, 0.96193975)], + 8: [(0, 0.5, 1)], + 9: [(0.038060233, 0.6913417, 0.96193975)], + 10: [(0.14644662, 0.8535534, 0.8535534)], + 11: [(0.30865827, 0.96193975, 0.6913417)], + 12: [(0.5, 1, 0.5)], + 13: [(0.6913417, 0.96193975, 0.30865827)], + 14: [(0.8535534, 0.8535534, 0.14644662)], + 15: [(0.96193975, 0.6913417, 0.038060233)], + 16: [(1, 0.5, 0)], + 17: [(0.96193975, 0.30865827, 0.038060233)], + 18: [(0.8535534, 0.14644662, 0.14644662)], + 19: [(0.6913417, 0.038060233, 0.30865827)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (90, 90, 90), + 1: (112.5, 112.5, 112.5), + 2: (135, 135, 135), + 3: (157.5, 157.5, 157.5), + 4: (180, 180, 180), + 5: (202.5, 202.5, 202.5), + 6: (225, 225, 225), + 7: (247.5, 247.5, 247.5), + 8: (270, 270, 270), + 9: (292.5, 292.5, 292.5), + 10: (315, 315, 315), + 11: (337.5, 337.5, 337.5), + 12: (360, 360, 360), + 13: (382.5, 382.5, 382.5), + 14: (405, 405, 405), + 15: (427.5, 427.5, 427.5), + 16: (450, 450, 450), + 17: (472.5, 472.5, 472.5), + 18: (495, 495, 495), + 19: (517.5, 517.5, 517.5), + } + double3 xformOp:translate = (0, -6, -12) + double3 xformOp:translate.timeSamples = { + 0: (4.5, -1.5, -7.5), + 1: (4.15745789630079, -1.84254210369921, -7.84254210369921), + 2: (3.1819805153394642, -2.8180194846605358, -8.818019484660535), + 3: (1.7220754456429046, -4.277924554357096, -10.277924554357096), + 4: (5.51091059616309e-16, -5.999999999999999, -12), + 5: (-1.7220754456429037, -7.722075445642904, -13.722075445642904), + 6: (-3.181980515339464, -9.181980515339465, -15.181980515339465), + 7: (-4.157457896300789, -10.157457896300789, -16.15745789630079), + 8: (-4.5, -10.5, -16.5), + 9: (-4.15745789630079, -10.15745789630079, -16.15745789630079), + 10: (-3.1819805153394642, -9.181980515339465, -15.181980515339465), + 11: (-1.7220754456429066, -7.722075445642907, -13.722075445642906), + 12: (0, -6, -12), + 13: (1.722075445642904, -4.277924554357096, -10.277924554357096), + 14: (3.181980515339464, -2.818019484660536, -8.818019484660535), + 15: (4.15745789630079, -1.84254210369921, -7.84254210369921), + 16: (4.5, -1.5, -7.5), + 17: (4.15745789630079, -1.84254210369921, -7.84254210369921), + 18: (3.1819805153394642, -2.8180194846605358, -8.818019484660535), + 19: (1.7220754456429046, -4.277924554357096, -10.277924554357096), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (0, -6, -6) + double3 xformOp:translate.timeSamples = { + 0: (3.832298769313682, -2.167701230686318, -2.167701230686318), + 1: (2.695345492107278, -3.304654507892722, -3.304654507892722), + 2: (1.1480502970952704, -4.851949702904729, -4.851949702904729), + 3: (-0.5740251485476322, -6.574025148547632, -6.574025148547632), + 4: (-2.208710468875089, -8.20871046887509, -8.20871046887509), + 5: (-3.507139642326571, -9.507139642326571, -9.507139642326571), + 6: (-4.271638597533859, -10.271638597533858, -10.271638597533858), + 7: (-4.385819298766931, -10.38581929876693, -10.38581929876693), + 8: (-3.8322987693136827, -9.832298769313683, -9.832298769313683), + 9: (-2.69534549210728, -8.695345492107279, -8.695345492107279), + 10: (-1.148050297095273, -7.148050297095273, -7.148050297095273), + 11: (0.5740251485476326, -5.425974851452367, -5.425974851452367), + 12: (2.208710468875089, -3.791289531124911, -3.791289531124911), + 13: (3.5071396423265715, -2.4928603576734285, -2.4928603576734285), + 14: (4.27163859753386, -1.72836140246614, -1.72836140246614), + 15: (4.385819298766931, -1.6141807012330691, -1.6141807012330691), + 16: (3.8322987693136827, -2.1677012306863173, -2.1677012306863173), + 17: (2.695345492107279, -3.304654507892721, -3.304654507892721), + 18: (1.148050297095272, -4.851949702904728, -4.851949702904728), + 19: (-0.5740251485476322, -6.574025148547632, -6.574025148547632), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (0, -6, 0) + double3 xformOp:translate.timeSamples = { + 0: (2.2087104688750916, -3.7912895311249084, 2.2087104688750916), + 1: (0.5740251485476362, -5.425974851452364, 0.5740251485476362), + 2: (-1.148050297095268, -7.148050297095268, -1.148050297095268), + 3: (-2.6953454921072764, -8.695345492107275, -2.6953454921072764), + 4: (-3.83229876931368, -9.832298769313681, -3.83229876931368), + 5: (-4.385819298766929, -10.385819298766929, -4.385819298766929), + 6: (-4.27163859753386, -10.27163859753386, -4.27163859753386), + 7: (-3.5071396423265737, -9.507139642326575, -3.5071396423265737), + 8: (-2.2087104688750934, -8.208710468875093, -2.2087104688750934), + 9: (-0.5740251485476365, -6.574025148547636, -0.5740251485476365), + 10: (1.1480502970952653, -4.851949702904735, 1.1480502970952653), + 11: (2.6953454921072737, -3.3046545078927263, 2.6953454921072737), + 12: (3.832298769313679, -2.167701230686321, 3.832298769313679), + 13: (4.385819298766929, -1.614180701233071, 4.385819298766929), + 14: (4.271638597533861, -1.7283614024661391, 4.271638597533861), + 15: (3.507139642326575, -2.492860357673425, 3.507139642326575), + 16: (2.2087104688750947, -3.7912895311249053, 2.2087104688750947), + 17: (0.5740251485476393, -5.425974851452361, 0.5740251485476393), + 18: (-1.1480502970952648, -7.148050297095265, -1.1480502970952648), + 19: (-2.6953454921072737, -8.695345492107274, -2.6953454921072737), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.5, 0, 0.5)], + 1: [(0.30865827, 0.038060233, 0.6913417)], + 2: [(0.14644662, 0.14644662, 0.8535534)], + 3: [(0.038060233, 0.30865827, 0.96193975)], + 4: [(0, 0.5, 1)], + 5: [(0.038060233, 0.6913417, 0.96193975)], + 6: [(0.14644662, 0.8535534, 0.8535534)], + 7: [(0.30865827, 0.96193975, 0.6913417)], + 8: [(0.5, 1, 0.5)], + 9: [(0.6913417, 0.96193975, 0.30865827)], + 10: [(0.8535534, 0.8535534, 0.14644662)], + 11: [(0.96193975, 0.6913417, 0.038060233)], + 12: [(1, 0.5, 0)], + 13: [(0.96193975, 0.30865827, 0.038060233)], + 14: [(0.8535534, 0.14644662, 0.14644662)], + 15: [(0.6913417, 0.038060233, 0.30865827)], + 16: [(0.5, 0, 0.5)], + 17: [(0.30865827, 0.038060233, 0.6913417)], + 18: [(0.14644662, 0.14644662, 0.8535534)], + 19: [(0.038060233, 0.30865827, 0.96193975)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (180, 180, 180), + 1: (202.5, 202.5, 202.5), + 2: (225, 225, 225), + 3: (247.5, 247.5, 247.5), + 4: (270, 270, 270), + 5: (292.5, 292.5, 292.5), + 6: (315, 315, 315), + 7: (337.5, 337.5, 337.5), + 8: (360, 360, 360), + 9: (382.5, 382.5, 382.5), + 10: (405, 405, 405), + 11: (427.5, 427.5, 427.5), + 12: (450, 450, 450), + 13: (472.5, 472.5, 472.5), + 14: (495, 495, 495), + 15: (517.5, 517.5, 517.5), + 16: (540, 540, 540), + 17: (562.5, 562.5, 562.5), + 18: (585, 585, 585), + 19: (607.5, 607.5, 607.5), + } + double3 xformOp:translate = (0, -6, 6) + double3 xformOp:translate.timeSamples = { + 0: (5.51091059616309e-16, -5.999999999999999, 6.000000000000001), + 1: (-1.7220754456429037, -7.722075445642904, 4.277924554357096), + 2: (-3.181980515339464, -9.181980515339465, 2.818019484660536), + 3: (-4.157457896300789, -10.157457896300789, 1.842542103699211), + 4: (-4.5, -10.5, 1.5), + 5: (-4.15745789630079, -10.15745789630079, 1.84254210369921), + 6: (-3.1819805153394642, -9.181980515339465, 2.8180194846605358), + 7: (-1.7220754456429066, -7.722075445642907, 4.277924554357093), + 8: (0, -6, 6), + 9: (1.722075445642904, -4.277924554357096, 7.722075445642904), + 10: (3.181980515339464, -2.818019484660536, 9.181980515339465), + 11: (4.15745789630079, -1.84254210369921, 10.15745789630079), + 12: (4.5, -1.5, 10.5), + 13: (4.15745789630079, -1.84254210369921, 10.15745789630079), + 14: (3.1819805153394642, -2.8180194846605358, 9.181980515339465), + 15: (1.7220754456429046, -4.277924554357096, 7.722075445642904), + 16: (5.51091059616309e-16, -5.999999999999999, 6.000000000000001), + 17: (-1.7220754456429037, -7.722075445642904, 4.277924554357096), + 18: (-3.181980515339464, -9.181980515339465, 2.818019484660536), + 19: (-4.157457896300789, -10.157457896300789, 1.842542103699211), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_2" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (0, 0, -12) + double3 xformOp:translate.timeSamples = { + 0: (3.832298769313682, 3.832298769313682, -8.167701230686319), + 1: (2.695345492107278, 2.695345492107278, -9.304654507892721), + 2: (1.1480502970952704, 1.1480502970952704, -10.85194970290473), + 3: (-0.5740251485476322, -0.5740251485476322, -12.574025148547632), + 4: (-2.208710468875089, -2.208710468875089, -14.20871046887509), + 5: (-3.507139642326571, -3.507139642326571, -15.507139642326571), + 6: (-4.271638597533859, -4.271638597533859, -16.271638597533858), + 7: (-4.385819298766931, -4.385819298766931, -16.385819298766933), + 8: (-3.8322987693136827, -3.8322987693136827, -15.832298769313683), + 9: (-2.69534549210728, -2.69534549210728, -14.695345492107279), + 10: (-1.148050297095273, -1.148050297095273, -13.148050297095272), + 11: (0.5740251485476326, 0.5740251485476326, -11.425974851452366), + 12: (2.208710468875089, 2.208710468875089, -9.79128953112491), + 13: (3.5071396423265715, 3.5071396423265715, -8.492860357673429), + 14: (4.27163859753386, 4.27163859753386, -7.72836140246614), + 15: (4.385819298766931, 4.385819298766931, -7.614180701233069), + 16: (3.8322987693136827, 3.8322987693136827, -8.167701230686317), + 17: (2.695345492107279, 2.695345492107279, -9.304654507892721), + 18: (1.148050297095272, 1.148050297095272, -10.851949702904728), + 19: (-0.5740251485476322, -0.5740251485476322, -12.574025148547632), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (0, 0, -6) + double3 xformOp:translate.timeSamples = { + 0: (2.2087104688750916, 2.2087104688750916, -3.7912895311249084), + 1: (0.5740251485476362, 0.5740251485476362, -5.425974851452364), + 2: (-1.148050297095268, -1.148050297095268, -7.148050297095268), + 3: (-2.6953454921072764, -2.6953454921072764, -8.695345492107275), + 4: (-3.83229876931368, -3.83229876931368, -9.832298769313681), + 5: (-4.385819298766929, -4.385819298766929, -10.385819298766929), + 6: (-4.27163859753386, -4.27163859753386, -10.27163859753386), + 7: (-3.5071396423265737, -3.5071396423265737, -9.507139642326575), + 8: (-2.2087104688750934, -2.2087104688750934, -8.208710468875093), + 9: (-0.5740251485476365, -0.5740251485476365, -6.574025148547636), + 10: (1.1480502970952653, 1.1480502970952653, -4.851949702904735), + 11: (2.6953454921072737, 2.6953454921072737, -3.3046545078927263), + 12: (3.832298769313679, 3.832298769313679, -2.167701230686321), + 13: (4.385819298766929, 4.385819298766929, -1.614180701233071), + 14: (4.271638597533861, 4.271638597533861, -1.7283614024661391), + 15: (3.507139642326575, 3.507139642326575, -2.492860357673425), + 16: (2.2087104688750947, 2.2087104688750947, -3.7912895311249053), + 17: (0.5740251485476393, 0.5740251485476393, -5.425974851452361), + 18: (-1.1480502970952648, -1.1480502970952648, -7.148050297095265), + 19: (-2.6953454921072737, -2.6953454921072737, -8.695345492107274), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.5, 0, 0.5)], + 1: [(0.30865827, 0.038060233, 0.6913417)], + 2: [(0.14644662, 0.14644662, 0.8535534)], + 3: [(0.038060233, 0.30865827, 0.96193975)], + 4: [(0, 0.5, 1)], + 5: [(0.038060233, 0.6913417, 0.96193975)], + 6: [(0.14644662, 0.8535534, 0.8535534)], + 7: [(0.30865827, 0.96193975, 0.6913417)], + 8: [(0.5, 1, 0.5)], + 9: [(0.6913417, 0.96193975, 0.30865827)], + 10: [(0.8535534, 0.8535534, 0.14644662)], + 11: [(0.96193975, 0.6913417, 0.038060233)], + 12: [(1, 0.5, 0)], + 13: [(0.96193975, 0.30865827, 0.038060233)], + 14: [(0.8535534, 0.14644662, 0.14644662)], + 15: [(0.6913417, 0.038060233, 0.30865827)], + 16: [(0.5, 0, 0.5)], + 17: [(0.30865827, 0.038060233, 0.6913417)], + 18: [(0.14644662, 0.14644662, 0.8535534)], + 19: [(0.038060233, 0.30865827, 0.96193975)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (180, 180, 180), + 1: (202.5, 202.5, 202.5), + 2: (225, 225, 225), + 3: (247.5, 247.5, 247.5), + 4: (270, 270, 270), + 5: (292.5, 292.5, 292.5), + 6: (315, 315, 315), + 7: (337.5, 337.5, 337.5), + 8: (360, 360, 360), + 9: (382.5, 382.5, 382.5), + 10: (405, 405, 405), + 11: (427.5, 427.5, 427.5), + 12: (450, 450, 450), + 13: (472.5, 472.5, 472.5), + 14: (495, 495, 495), + 15: (517.5, 517.5, 517.5), + 16: (540, 540, 540), + 17: (562.5, 562.5, 562.5), + 18: (585, 585, 585), + 19: (607.5, 607.5, 607.5), + } + double3 xformOp:translate = (0, 0, 0) + double3 xformOp:translate.timeSamples = { + 0: (5.51091059616309e-16, 5.51091059616309e-16, 5.51091059616309e-16), + 1: (-1.7220754456429037, -1.7220754456429037, -1.7220754456429037), + 2: (-3.181980515339464, -3.181980515339464, -3.181980515339464), + 3: (-4.157457896300789, -4.157457896300789, -4.157457896300789), + 4: (-4.5, -4.5, -4.5), + 5: (-4.15745789630079, -4.15745789630079, -4.15745789630079), + 6: (-3.1819805153394642, -3.1819805153394642, -3.1819805153394642), + 7: (-1.7220754456429066, -1.7220754456429066, -1.7220754456429066), + 8: (0, 0, 0), + 9: (1.722075445642904, 1.722075445642904, 1.722075445642904), + 10: (3.181980515339464, 3.181980515339464, 3.181980515339464), + 11: (4.15745789630079, 4.15745789630079, 4.15745789630079), + 12: (4.5, 4.5, 4.5), + 13: (4.15745789630079, 4.15745789630079, 4.15745789630079), + 14: (3.1819805153394642, 3.1819805153394642, 3.1819805153394642), + 15: (1.7220754456429046, 1.7220754456429046, 1.7220754456429046), + 16: (5.51091059616309e-16, 5.51091059616309e-16, 5.51091059616309e-16), + 17: (-1.7220754456429037, -1.7220754456429037, -1.7220754456429037), + 18: (-3.181980515339464, -3.181980515339464, -3.181980515339464), + 19: (-4.157457896300789, -4.157457896300789, -4.157457896300789), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.2545877, 0.07418902, 0.74541223)], + 1: [(0.11031782, 0.20051716, 0.8896822)], + 2: [(0.025373489, 0.37243885, 0.97462654)], + 3: [(0.012686744, 0.56378055, 0.9873133)], + 4: [(0.07418902, 0.74541223, 0.92581093)], + 5: [(0.20051716, 0.8896822, 0.7994828)], + 6: [(0.37243885, 0.97462654, 0.62756115)], + 7: [(0.56378055, 0.9873133, 0.43621942)], + 8: [(0.74541223, 0.92581093, 0.2545877)], + 9: [(0.8896822, 0.7994828, 0.11031782)], + 10: [(0.97462654, 0.62756115, 0.025373489)], + 11: [(0.9873133, 0.43621942, 0.012686744)], + 12: [(0.92581093, 0.2545877, 0.07418902)], + 13: [(0.7994828, 0.11031782, 0.20051716)], + 14: [(0.62756115, 0.025373489, 0.37243885)], + 15: [(0.43621942, 0.012686744, 0.56378055)], + 16: [(0.2545877, 0.07418902, 0.74541223)], + 17: [(0.11031782, 0.20051716, 0.8896822)], + 18: [(0.025373489, 0.37243885, 0.97462654)], + 19: [(0.012686744, 0.56378055, 0.9873133)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (210, 210, 210), + 1: (232.5, 232.5, 232.5), + 2: (255, 255, 255), + 3: (277.5, 277.5, 277.5), + 4: (300, 300, 300), + 5: (322.5, 322.5, 322.5), + 6: (345, 345, 345), + 7: (367.5, 367.5, 367.5), + 8: (390, 390, 390), + 9: (412.5, 412.5, 412.5), + 10: (435, 435, 435), + 11: (457.5, 457.5, 457.5), + 12: (480, 480, 480), + 13: (502.5, 502.5, 502.5), + 14: (525, 525, 525), + 15: (547.5, 547.5, 547.5), + 16: (570, 570, 570), + 17: (592.5, 592.5, 592.5), + 18: (615, 615, 615), + 19: (637.5, 637.5, 637.5), + } + double3 xformOp:translate = (0, 0, 6) + double3 xformOp:translate.timeSamples = { + 0: (-2.208710468875089, -2.208710468875089, 3.791289531124911), + 1: (-3.507139642326571, -3.507139642326571, 2.492860357673429), + 2: (-4.271638597533859, -4.271638597533859, 1.728361402466141), + 3: (-4.385819298766931, -4.385819298766931, 1.6141807012330691), + 4: (-3.8322987693136827, -3.8322987693136827, 2.1677012306863173), + 5: (-2.69534549210728, -2.69534549210728, 3.30465450789272), + 6: (-1.148050297095273, -1.148050297095273, 4.851949702904727), + 7: (0.5740251485476326, 0.5740251485476326, 6.574025148547633), + 8: (2.208710468875089, 2.208710468875089, 8.20871046887509), + 9: (3.5071396423265715, 3.5071396423265715, 9.507139642326571), + 10: (4.27163859753386, 4.27163859753386, 10.27163859753386), + 11: (4.385819298766931, 4.385819298766931, 10.38581929876693), + 12: (3.8322987693136827, 3.8322987693136827, 9.832298769313683), + 13: (2.695345492107279, 2.695345492107279, 8.695345492107279), + 14: (1.148050297095272, 1.148050297095272, 7.148050297095272), + 15: (-0.5740251485476322, -0.5740251485476322, 5.425974851452368), + 16: (-2.208710468875089, -2.208710468875089, 3.791289531124911), + 17: (-3.507139642326571, -3.507139642326571, 2.492860357673429), + 18: (-4.271638597533859, -4.271638597533859, 1.728361402466141), + 19: (-4.385819298766931, -4.385819298766931, 1.6141807012330691), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_3" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (0, 6, -12) + double3 xformOp:translate.timeSamples = { + 0: (2.2087104688750916, 8.208710468875092, -9.791289531124908), + 1: (0.5740251485476362, 6.574025148547636, -11.425974851452363), + 2: (-1.148050297095268, 4.851949702904732, -13.148050297095267), + 3: (-2.6953454921072764, 3.3046545078927236, -14.695345492107275), + 4: (-3.83229876931368, 2.16770123068632, -15.832298769313681), + 5: (-4.385819298766929, 1.614180701233071, -16.38581929876693), + 6: (-4.27163859753386, 1.72836140246614, -16.271638597533858), + 7: (-3.5071396423265737, 2.4928603576734263, -15.507139642326575), + 8: (-2.2087104688750934, 3.7912895311249066, -14.208710468875093), + 9: (-0.5740251485476365, 5.425974851452364, -12.574025148547637), + 10: (1.1480502970952653, 7.148050297095265, -10.851949702904735), + 11: (2.6953454921072737, 8.695345492107274, -9.304654507892726), + 12: (3.832298769313679, 9.83229876931368, -8.16770123068632), + 13: (4.385819298766929, 10.385819298766929, -7.614180701233071), + 14: (4.271638597533861, 10.271638597533862, -7.728361402466139), + 15: (3.507139642326575, 9.507139642326575, -8.492860357673425), + 16: (2.2087104688750947, 8.208710468875095, -9.791289531124905), + 17: (0.5740251485476393, 6.574025148547639, -11.425974851452361), + 18: (-1.1480502970952648, 4.851949702904735, -13.148050297095265), + 19: (-2.6953454921072737, 3.3046545078927263, -14.695345492107274), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.5, 0, 0.5)], + 1: [(0.30865827, 0.038060233, 0.6913417)], + 2: [(0.14644662, 0.14644662, 0.8535534)], + 3: [(0.038060233, 0.30865827, 0.96193975)], + 4: [(0, 0.5, 1)], + 5: [(0.038060233, 0.6913417, 0.96193975)], + 6: [(0.14644662, 0.8535534, 0.8535534)], + 7: [(0.30865827, 0.96193975, 0.6913417)], + 8: [(0.5, 1, 0.5)], + 9: [(0.6913417, 0.96193975, 0.30865827)], + 10: [(0.8535534, 0.8535534, 0.14644662)], + 11: [(0.96193975, 0.6913417, 0.038060233)], + 12: [(1, 0.5, 0)], + 13: [(0.96193975, 0.30865827, 0.038060233)], + 14: [(0.8535534, 0.14644662, 0.14644662)], + 15: [(0.6913417, 0.038060233, 0.30865827)], + 16: [(0.5, 0, 0.5)], + 17: [(0.30865827, 0.038060233, 0.6913417)], + 18: [(0.14644662, 0.14644662, 0.8535534)], + 19: [(0.038060233, 0.30865827, 0.96193975)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (180, 180, 180), + 1: (202.5, 202.5, 202.5), + 2: (225, 225, 225), + 3: (247.5, 247.5, 247.5), + 4: (270, 270, 270), + 5: (292.5, 292.5, 292.5), + 6: (315, 315, 315), + 7: (337.5, 337.5, 337.5), + 8: (360, 360, 360), + 9: (382.5, 382.5, 382.5), + 10: (405, 405, 405), + 11: (427.5, 427.5, 427.5), + 12: (450, 450, 450), + 13: (472.5, 472.5, 472.5), + 14: (495, 495, 495), + 15: (517.5, 517.5, 517.5), + 16: (540, 540, 540), + 17: (562.5, 562.5, 562.5), + 18: (585, 585, 585), + 19: (607.5, 607.5, 607.5), + } + double3 xformOp:translate = (0, 6, -6) + double3 xformOp:translate.timeSamples = { + 0: (5.51091059616309e-16, 6.000000000000001, -5.999999999999999), + 1: (-1.7220754456429037, 4.277924554357096, -7.722075445642904), + 2: (-3.181980515339464, 2.818019484660536, -9.181980515339465), + 3: (-4.157457896300789, 1.842542103699211, -10.157457896300789), + 4: (-4.5, 1.5, -10.5), + 5: (-4.15745789630079, 1.84254210369921, -10.15745789630079), + 6: (-3.1819805153394642, 2.8180194846605358, -9.181980515339465), + 7: (-1.7220754456429066, 4.277924554357093, -7.722075445642907), + 8: (0, 6, -6), + 9: (1.722075445642904, 7.722075445642904, -4.277924554357096), + 10: (3.181980515339464, 9.181980515339465, -2.818019484660536), + 11: (4.15745789630079, 10.15745789630079, -1.84254210369921), + 12: (4.5, 10.5, -1.5), + 13: (4.15745789630079, 10.15745789630079, -1.84254210369921), + 14: (3.1819805153394642, 9.181980515339465, -2.8180194846605358), + 15: (1.7220754456429046, 7.722075445642904, -4.277924554357096), + 16: (5.51091059616309e-16, 6.000000000000001, -5.999999999999999), + 17: (-1.7220754456429037, 4.277924554357096, -7.722075445642904), + 18: (-3.181980515339464, 2.818019484660536, -9.181980515339465), + 19: (-4.157457896300789, 1.842542103699211, -10.157457896300789), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.2545877, 0.07418902, 0.74541223)], + 1: [(0.11031782, 0.20051716, 0.8896822)], + 2: [(0.025373489, 0.37243885, 0.97462654)], + 3: [(0.012686744, 0.56378055, 0.9873133)], + 4: [(0.07418902, 0.74541223, 0.92581093)], + 5: [(0.20051716, 0.8896822, 0.7994828)], + 6: [(0.37243885, 0.97462654, 0.62756115)], + 7: [(0.56378055, 0.9873133, 0.43621942)], + 8: [(0.74541223, 0.92581093, 0.2545877)], + 9: [(0.8896822, 0.7994828, 0.11031782)], + 10: [(0.97462654, 0.62756115, 0.025373489)], + 11: [(0.9873133, 0.43621942, 0.012686744)], + 12: [(0.92581093, 0.2545877, 0.07418902)], + 13: [(0.7994828, 0.11031782, 0.20051716)], + 14: [(0.62756115, 0.025373489, 0.37243885)], + 15: [(0.43621942, 0.012686744, 0.56378055)], + 16: [(0.2545877, 0.07418902, 0.74541223)], + 17: [(0.11031782, 0.20051716, 0.8896822)], + 18: [(0.025373489, 0.37243885, 0.97462654)], + 19: [(0.012686744, 0.56378055, 0.9873133)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (210, 210, 210), + 1: (232.5, 232.5, 232.5), + 2: (255, 255, 255), + 3: (277.5, 277.5, 277.5), + 4: (300, 300, 300), + 5: (322.5, 322.5, 322.5), + 6: (345, 345, 345), + 7: (367.5, 367.5, 367.5), + 8: (390, 390, 390), + 9: (412.5, 412.5, 412.5), + 10: (435, 435, 435), + 11: (457.5, 457.5, 457.5), + 12: (480, 480, 480), + 13: (502.5, 502.5, 502.5), + 14: (525, 525, 525), + 15: (547.5, 547.5, 547.5), + 16: (570, 570, 570), + 17: (592.5, 592.5, 592.5), + 18: (615, 615, 615), + 19: (637.5, 637.5, 637.5), + } + double3 xformOp:translate = (0, 6, 0) + double3 xformOp:translate.timeSamples = { + 0: (-2.208710468875089, 3.791289531124911, -2.208710468875089), + 1: (-3.507139642326571, 2.492860357673429, -3.507139642326571), + 2: (-4.271638597533859, 1.728361402466141, -4.271638597533859), + 3: (-4.385819298766931, 1.6141807012330691, -4.385819298766931), + 4: (-3.8322987693136827, 2.1677012306863173, -3.8322987693136827), + 5: (-2.69534549210728, 3.30465450789272, -2.69534549210728), + 6: (-1.148050297095273, 4.851949702904727, -1.148050297095273), + 7: (0.5740251485476326, 6.574025148547633, 0.5740251485476326), + 8: (2.208710468875089, 8.20871046887509, 2.208710468875089), + 9: (3.5071396423265715, 9.507139642326571, 3.5071396423265715), + 10: (4.27163859753386, 10.27163859753386, 4.27163859753386), + 11: (4.385819298766931, 10.38581929876693, 4.385819298766931), + 12: (3.8322987693136827, 9.832298769313683, 3.8322987693136827), + 13: (2.695345492107279, 8.695345492107279, 2.695345492107279), + 14: (1.148050297095272, 7.148050297095272, 1.148050297095272), + 15: (-0.5740251485476322, 5.425974851452368, -0.5740251485476322), + 16: (-2.208710468875089, 3.791289531124911, -2.208710468875089), + 17: (-3.507139642326571, 2.492860357673429, -3.507139642326571), + 18: (-4.271638597533859, 1.728361402466141, -4.271638597533859), + 19: (-4.385819298766931, 1.6141807012330691, -4.385819298766931), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.07418902, 0.2545877, 0.92581093)], + 1: [(0.012686744, 0.43621942, 0.9873133)], + 2: [(0.025373489, 0.62756115, 0.97462654)], + 3: [(0.11031782, 0.7994828, 0.8896822)], + 4: [(0.2545877, 0.92581093, 0.74541223)], + 5: [(0.43621942, 0.9873133, 0.56378055)], + 6: [(0.62756115, 0.97462654, 0.37243885)], + 7: [(0.7994828, 0.8896822, 0.20051716)], + 8: [(0.92581093, 0.74541223, 0.07418902)], + 9: [(0.9873133, 0.56378055, 0.012686744)], + 10: [(0.97462654, 0.37243885, 0.025373489)], + 11: [(0.8896822, 0.20051716, 0.11031782)], + 12: [(0.74541223, 0.07418902, 0.2545877)], + 13: [(0.56378055, 0.012686744, 0.43621942)], + 14: [(0.37243885, 0.025373489, 0.62756115)], + 15: [(0.20051716, 0.11031782, 0.7994828)], + 16: [(0.07418902, 0.2545877, 0.92581093)], + 17: [(0.012686744, 0.43621942, 0.9873133)], + 18: [(0.025373489, 0.62756115, 0.97462654)], + 19: [(0.11031782, 0.7994828, 0.8896822)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (240, 240, 240), + 1: (262.5, 262.5, 262.5), + 2: (285, 285, 285), + 3: (307.5, 307.5, 307.5), + 4: (330, 330, 330), + 5: (352.5, 352.5, 352.5), + 6: (375, 375, 375), + 7: (397.5, 397.5, 397.5), + 8: (420, 420, 420), + 9: (442.5, 442.5, 442.5), + 10: (465, 465, 465), + 11: (487.5, 487.5, 487.5), + 12: (510, 510, 510), + 13: (532.5, 532.5, 532.5), + 14: (555, 555, 555), + 15: (577.5, 577.5, 577.5), + 16: (600, 600, 600), + 17: (622.5, 622.5, 622.5), + 18: (645, 645, 645), + 19: (667.5, 667.5, 667.5), + } + double3 xformOp:translate = (0, 6, 6) + double3 xformOp:translate.timeSamples = { + 0: (-3.83229876931368, 2.16770123068632, 2.16770123068632), + 1: (-4.385819298766929, 1.614180701233071, 1.614180701233071), + 2: (-4.27163859753386, 1.72836140246614, 1.72836140246614), + 3: (-3.5071396423265737, 2.4928603576734263, 2.4928603576734263), + 4: (-2.2087104688750934, 3.7912895311249066, 3.7912895311249066), + 5: (-0.5740251485476365, 5.425974851452364, 5.425974851452364), + 6: (1.1480502970952653, 7.148050297095265, 7.148050297095265), + 7: (2.6953454921072737, 8.695345492107274, 8.695345492107274), + 8: (3.832298769313679, 9.83229876931368, 9.83229876931368), + 9: (4.385819298766929, 10.385819298766929, 10.385819298766929), + 10: (4.271638597533861, 10.271638597533862, 10.271638597533862), + 11: (3.507139642326575, 9.507139642326575, 9.507139642326575), + 12: (2.2087104688750947, 8.208710468875095, 8.208710468875095), + 13: (0.5740251485476393, 6.574025148547639, 6.574025148547639), + 14: (-1.1480502970952648, 4.851949702904735, 4.851949702904735), + 15: (-2.6953454921072737, 3.3046545078927263, 3.3046545078927263), + 16: (-3.8322987693136783, 2.1677012306863217, 2.1677012306863217), + 17: (-4.385819298766929, 1.614180701233071, 1.614180701233071), + 18: (-4.271638597533861, 1.7283614024661391, 1.7283614024661391), + 19: (-3.507139642326575, 2.492860357673425, 2.492860357673425), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + } + + def "prim_3" + { + def "prim_0" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(1, 0.5, 0)], + 1: [(0.96193975, 0.30865827, 0.038060233)], + 2: [(0.8535534, 0.14644662, 0.14644662)], + 3: [(0.6913417, 0.038060233, 0.30865827)], + 4: [(0.5, 0, 0.5)], + 5: [(0.30865827, 0.038060233, 0.6913417)], + 6: [(0.14644662, 0.14644662, 0.8535534)], + 7: [(0.038060233, 0.30865827, 0.96193975)], + 8: [(0, 0.5, 1)], + 9: [(0.038060233, 0.6913417, 0.96193975)], + 10: [(0.14644662, 0.8535534, 0.8535534)], + 11: [(0.30865827, 0.96193975, 0.6913417)], + 12: [(0.5, 1, 0.5)], + 13: [(0.6913417, 0.96193975, 0.30865827)], + 14: [(0.8535534, 0.8535534, 0.14644662)], + 15: [(0.96193975, 0.6913417, 0.038060233)], + 16: [(1, 0.5, 0)], + 17: [(0.96193975, 0.30865827, 0.038060233)], + 18: [(0.8535534, 0.14644662, 0.14644662)], + 19: [(0.6913417, 0.038060233, 0.30865827)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (90, 90, 90), + 1: (112.5, 112.5, 112.5), + 2: (135, 135, 135), + 3: (157.5, 157.5, 157.5), + 4: (180, 180, 180), + 5: (202.5, 202.5, 202.5), + 6: (225, 225, 225), + 7: (247.5, 247.5, 247.5), + 8: (270, 270, 270), + 9: (292.5, 292.5, 292.5), + 10: (315, 315, 315), + 11: (337.5, 337.5, 337.5), + 12: (360, 360, 360), + 13: (382.5, 382.5, 382.5), + 14: (405, 405, 405), + 15: (427.5, 427.5, 427.5), + 16: (450, 450, 450), + 17: (472.5, 472.5, 472.5), + 18: (495, 495, 495), + 19: (517.5, 517.5, 517.5), + } + double3 xformOp:translate = (6, -12, -12) + double3 xformOp:translate.timeSamples = { + 0: (10.5, -7.5, -7.5), + 1: (10.15745789630079, -7.84254210369921, -7.84254210369921), + 2: (9.181980515339465, -8.818019484660535, -8.818019484660535), + 3: (7.722075445642904, -10.277924554357096, -10.277924554357096), + 4: (6.000000000000001, -12, -12), + 5: (4.277924554357096, -13.722075445642904, -13.722075445642904), + 6: (2.818019484660536, -15.181980515339465, -15.181980515339465), + 7: (1.842542103699211, -16.15745789630079, -16.15745789630079), + 8: (1.5, -16.5, -16.5), + 9: (1.84254210369921, -16.15745789630079, -16.15745789630079), + 10: (2.8180194846605358, -15.181980515339465, -15.181980515339465), + 11: (4.277924554357093, -13.722075445642906, -13.722075445642906), + 12: (6, -12, -12), + 13: (7.722075445642904, -10.277924554357096, -10.277924554357096), + 14: (9.181980515339465, -8.818019484660535, -8.818019484660535), + 15: (10.15745789630079, -7.84254210369921, -7.84254210369921), + 16: (10.5, -7.5, -7.5), + 17: (10.15745789630079, -7.84254210369921, -7.84254210369921), + 18: (9.181980515339465, -8.818019484660535, -8.818019484660535), + 19: (7.722075445642904, -10.277924554357096, -10.277924554357096), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (6, -12, -6) + double3 xformOp:translate.timeSamples = { + 0: (9.832298769313681, -8.167701230686319, -2.167701230686318), + 1: (8.695345492107279, -9.304654507892721, -3.304654507892722), + 2: (7.148050297095271, -10.85194970290473, -4.851949702904729), + 3: (5.425974851452368, -12.574025148547632, -6.574025148547632), + 4: (3.791289531124911, -14.20871046887509, -8.20871046887509), + 5: (2.492860357673429, -15.507139642326571, -9.507139642326571), + 6: (1.728361402466141, -16.271638597533858, -10.271638597533858), + 7: (1.6141807012330691, -16.385819298766933, -10.38581929876693), + 8: (2.1677012306863173, -15.832298769313683, -9.832298769313683), + 9: (3.30465450789272, -14.695345492107279, -8.695345492107279), + 10: (4.851949702904727, -13.148050297095272, -7.148050297095273), + 11: (6.574025148547633, -11.425974851452366, -5.425974851452367), + 12: (8.20871046887509, -9.79128953112491, -3.791289531124911), + 13: (9.507139642326571, -8.492860357673429, -2.4928603576734285), + 14: (10.27163859753386, -7.72836140246614, -1.72836140246614), + 15: (10.38581929876693, -7.614180701233069, -1.6141807012330691), + 16: (9.832298769313683, -8.167701230686317, -2.1677012306863173), + 17: (8.695345492107279, -9.304654507892721, -3.304654507892721), + 18: (7.148050297095272, -10.851949702904728, -4.851949702904728), + 19: (5.425974851452368, -12.574025148547632, -6.574025148547632), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (6, -12, 0) + double3 xformOp:translate.timeSamples = { + 0: (8.208710468875092, -9.791289531124908, 2.2087104688750916), + 1: (6.574025148547636, -11.425974851452363, 0.5740251485476362), + 2: (4.851949702904732, -13.148050297095267, -1.148050297095268), + 3: (3.3046545078927236, -14.695345492107275, -2.6953454921072764), + 4: (2.16770123068632, -15.832298769313681, -3.83229876931368), + 5: (1.614180701233071, -16.38581929876693, -4.385819298766929), + 6: (1.72836140246614, -16.271638597533858, -4.27163859753386), + 7: (2.4928603576734263, -15.507139642326575, -3.5071396423265737), + 8: (3.7912895311249066, -14.208710468875093, -2.2087104688750934), + 9: (5.425974851452364, -12.574025148547637, -0.5740251485476365), + 10: (7.148050297095265, -10.851949702904735, 1.1480502970952653), + 11: (8.695345492107274, -9.304654507892726, 2.6953454921072737), + 12: (9.83229876931368, -8.16770123068632, 3.832298769313679), + 13: (10.385819298766929, -7.614180701233071, 4.385819298766929), + 14: (10.271638597533862, -7.728361402466139, 4.271638597533861), + 15: (9.507139642326575, -8.492860357673425, 3.507139642326575), + 16: (8.208710468875095, -9.791289531124905, 2.2087104688750947), + 17: (6.574025148547639, -11.425974851452361, 0.5740251485476393), + 18: (4.851949702904735, -13.148050297095265, -1.1480502970952648), + 19: (3.3046545078927263, -14.695345492107274, -2.6953454921072737), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.5, 0, 0.5)], + 1: [(0.30865827, 0.038060233, 0.6913417)], + 2: [(0.14644662, 0.14644662, 0.8535534)], + 3: [(0.038060233, 0.30865827, 0.96193975)], + 4: [(0, 0.5, 1)], + 5: [(0.038060233, 0.6913417, 0.96193975)], + 6: [(0.14644662, 0.8535534, 0.8535534)], + 7: [(0.30865827, 0.96193975, 0.6913417)], + 8: [(0.5, 1, 0.5)], + 9: [(0.6913417, 0.96193975, 0.30865827)], + 10: [(0.8535534, 0.8535534, 0.14644662)], + 11: [(0.96193975, 0.6913417, 0.038060233)], + 12: [(1, 0.5, 0)], + 13: [(0.96193975, 0.30865827, 0.038060233)], + 14: [(0.8535534, 0.14644662, 0.14644662)], + 15: [(0.6913417, 0.038060233, 0.30865827)], + 16: [(0.5, 0, 0.5)], + 17: [(0.30865827, 0.038060233, 0.6913417)], + 18: [(0.14644662, 0.14644662, 0.8535534)], + 19: [(0.038060233, 0.30865827, 0.96193975)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (180, 180, 180), + 1: (202.5, 202.5, 202.5), + 2: (225, 225, 225), + 3: (247.5, 247.5, 247.5), + 4: (270, 270, 270), + 5: (292.5, 292.5, 292.5), + 6: (315, 315, 315), + 7: (337.5, 337.5, 337.5), + 8: (360, 360, 360), + 9: (382.5, 382.5, 382.5), + 10: (405, 405, 405), + 11: (427.5, 427.5, 427.5), + 12: (450, 450, 450), + 13: (472.5, 472.5, 472.5), + 14: (495, 495, 495), + 15: (517.5, 517.5, 517.5), + 16: (540, 540, 540), + 17: (562.5, 562.5, 562.5), + 18: (585, 585, 585), + 19: (607.5, 607.5, 607.5), + } + double3 xformOp:translate = (6, -12, 6) + double3 xformOp:translate.timeSamples = { + 0: (6.000000000000001, -12, 6.000000000000001), + 1: (4.277924554357096, -13.722075445642904, 4.277924554357096), + 2: (2.818019484660536, -15.181980515339465, 2.818019484660536), + 3: (1.842542103699211, -16.15745789630079, 1.842542103699211), + 4: (1.5, -16.5, 1.5), + 5: (1.84254210369921, -16.15745789630079, 1.84254210369921), + 6: (2.8180194846605358, -15.181980515339465, 2.8180194846605358), + 7: (4.277924554357093, -13.722075445642906, 4.277924554357093), + 8: (6, -12, 6), + 9: (7.722075445642904, -10.277924554357096, 7.722075445642904), + 10: (9.181980515339465, -8.818019484660535, 9.181980515339465), + 11: (10.15745789630079, -7.84254210369921, 10.15745789630079), + 12: (10.5, -7.5, 10.5), + 13: (10.15745789630079, -7.84254210369921, 10.15745789630079), + 14: (9.181980515339465, -8.818019484660535, 9.181980515339465), + 15: (7.722075445642904, -10.277924554357096, 7.722075445642904), + 16: (6.000000000000001, -12, 6.000000000000001), + 17: (4.277924554357096, -13.722075445642904, 4.277924554357096), + 18: (2.818019484660536, -15.181980515339465, 2.818019484660536), + 19: (1.842542103699211, -16.15745789630079, 1.842542103699211), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_1" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.92581093, 0.2545877, 0.07418902)], + 1: [(0.7994828, 0.11031782, 0.20051716)], + 2: [(0.62756115, 0.025373489, 0.37243885)], + 3: [(0.43621942, 0.012686744, 0.56378055)], + 4: [(0.2545877, 0.07418902, 0.74541223)], + 5: [(0.11031782, 0.20051716, 0.8896822)], + 6: [(0.025373489, 0.37243885, 0.97462654)], + 7: [(0.012686744, 0.56378055, 0.9873133)], + 8: [(0.07418902, 0.74541223, 0.92581093)], + 9: [(0.20051716, 0.8896822, 0.7994828)], + 10: [(0.37243885, 0.97462654, 0.62756115)], + 11: [(0.56378055, 0.9873133, 0.43621942)], + 12: [(0.74541223, 0.92581093, 0.2545877)], + 13: [(0.8896822, 0.7994828, 0.11031782)], + 14: [(0.97462654, 0.62756115, 0.025373489)], + 15: [(0.9873133, 0.43621942, 0.012686744)], + 16: [(0.92581093, 0.2545877, 0.07418902)], + 17: [(0.7994828, 0.11031782, 0.20051716)], + 18: [(0.62756115, 0.025373489, 0.37243885)], + 19: [(0.43621942, 0.012686744, 0.56378055)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (120, 120, 120), + 1: (142.5, 142.5, 142.5), + 2: (165, 165, 165), + 3: (187.5, 187.5, 187.5), + 4: (210, 210, 210), + 5: (232.5, 232.5, 232.5), + 6: (255, 255, 255), + 7: (277.5, 277.5, 277.5), + 8: (300, 300, 300), + 9: (322.5, 322.5, 322.5), + 10: (345, 345, 345), + 11: (367.5, 367.5, 367.5), + 12: (390, 390, 390), + 13: (412.5, 412.5, 412.5), + 14: (435, 435, 435), + 15: (457.5, 457.5, 457.5), + 16: (480, 480, 480), + 17: (502.5, 502.5, 502.5), + 18: (525, 525, 525), + 19: (547.5, 547.5, 547.5), + } + double3 xformOp:translate = (6, -6, -12) + double3 xformOp:translate.timeSamples = { + 0: (9.832298769313681, -2.167701230686318, -8.167701230686319), + 1: (8.695345492107279, -3.304654507892722, -9.304654507892721), + 2: (7.148050297095271, -4.851949702904729, -10.85194970290473), + 3: (5.425974851452368, -6.574025148547632, -12.574025148547632), + 4: (3.791289531124911, -8.20871046887509, -14.20871046887509), + 5: (2.492860357673429, -9.507139642326571, -15.507139642326571), + 6: (1.728361402466141, -10.271638597533858, -16.271638597533858), + 7: (1.6141807012330691, -10.38581929876693, -16.385819298766933), + 8: (2.1677012306863173, -9.832298769313683, -15.832298769313683), + 9: (3.30465450789272, -8.695345492107279, -14.695345492107279), + 10: (4.851949702904727, -7.148050297095273, -13.148050297095272), + 11: (6.574025148547633, -5.425974851452367, -11.425974851452366), + 12: (8.20871046887509, -3.791289531124911, -9.79128953112491), + 13: (9.507139642326571, -2.4928603576734285, -8.492860357673429), + 14: (10.27163859753386, -1.72836140246614, -7.72836140246614), + 15: (10.38581929876693, -1.6141807012330691, -7.614180701233069), + 16: (9.832298769313683, -2.1677012306863173, -8.167701230686317), + 17: (8.695345492107279, -3.304654507892721, -9.304654507892721), + 18: (7.148050297095272, -4.851949702904728, -10.851949702904728), + 19: (5.425974851452368, -6.574025148547632, -12.574025148547632), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (6, -6, -6) + double3 xformOp:translate.timeSamples = { + 0: (8.208710468875092, -3.7912895311249084, -3.7912895311249084), + 1: (6.574025148547636, -5.425974851452364, -5.425974851452364), + 2: (4.851949702904732, -7.148050297095268, -7.148050297095268), + 3: (3.3046545078927236, -8.695345492107275, -8.695345492107275), + 4: (2.16770123068632, -9.832298769313681, -9.832298769313681), + 5: (1.614180701233071, -10.385819298766929, -10.385819298766929), + 6: (1.72836140246614, -10.27163859753386, -10.27163859753386), + 7: (2.4928603576734263, -9.507139642326575, -9.507139642326575), + 8: (3.7912895311249066, -8.208710468875093, -8.208710468875093), + 9: (5.425974851452364, -6.574025148547636, -6.574025148547636), + 10: (7.148050297095265, -4.851949702904735, -4.851949702904735), + 11: (8.695345492107274, -3.3046545078927263, -3.3046545078927263), + 12: (9.83229876931368, -2.167701230686321, -2.167701230686321), + 13: (10.385819298766929, -1.614180701233071, -1.614180701233071), + 14: (10.271638597533862, -1.7283614024661391, -1.7283614024661391), + 15: (9.507139642326575, -2.492860357673425, -2.492860357673425), + 16: (8.208710468875095, -3.7912895311249053, -3.7912895311249053), + 17: (6.574025148547639, -5.425974851452361, -5.425974851452361), + 18: (4.851949702904735, -7.148050297095265, -7.148050297095265), + 19: (3.3046545078927263, -8.695345492107274, -8.695345492107274), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.5, 0, 0.5)], + 1: [(0.30865827, 0.038060233, 0.6913417)], + 2: [(0.14644662, 0.14644662, 0.8535534)], + 3: [(0.038060233, 0.30865827, 0.96193975)], + 4: [(0, 0.5, 1)], + 5: [(0.038060233, 0.6913417, 0.96193975)], + 6: [(0.14644662, 0.8535534, 0.8535534)], + 7: [(0.30865827, 0.96193975, 0.6913417)], + 8: [(0.5, 1, 0.5)], + 9: [(0.6913417, 0.96193975, 0.30865827)], + 10: [(0.8535534, 0.8535534, 0.14644662)], + 11: [(0.96193975, 0.6913417, 0.038060233)], + 12: [(1, 0.5, 0)], + 13: [(0.96193975, 0.30865827, 0.038060233)], + 14: [(0.8535534, 0.14644662, 0.14644662)], + 15: [(0.6913417, 0.038060233, 0.30865827)], + 16: [(0.5, 0, 0.5)], + 17: [(0.30865827, 0.038060233, 0.6913417)], + 18: [(0.14644662, 0.14644662, 0.8535534)], + 19: [(0.038060233, 0.30865827, 0.96193975)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (180, 180, 180), + 1: (202.5, 202.5, 202.5), + 2: (225, 225, 225), + 3: (247.5, 247.5, 247.5), + 4: (270, 270, 270), + 5: (292.5, 292.5, 292.5), + 6: (315, 315, 315), + 7: (337.5, 337.5, 337.5), + 8: (360, 360, 360), + 9: (382.5, 382.5, 382.5), + 10: (405, 405, 405), + 11: (427.5, 427.5, 427.5), + 12: (450, 450, 450), + 13: (472.5, 472.5, 472.5), + 14: (495, 495, 495), + 15: (517.5, 517.5, 517.5), + 16: (540, 540, 540), + 17: (562.5, 562.5, 562.5), + 18: (585, 585, 585), + 19: (607.5, 607.5, 607.5), + } + double3 xformOp:translate = (6, -6, 0) + double3 xformOp:translate.timeSamples = { + 0: (6.000000000000001, -5.999999999999999, 5.51091059616309e-16), + 1: (4.277924554357096, -7.722075445642904, -1.7220754456429037), + 2: (2.818019484660536, -9.181980515339465, -3.181980515339464), + 3: (1.842542103699211, -10.157457896300789, -4.157457896300789), + 4: (1.5, -10.5, -4.5), + 5: (1.84254210369921, -10.15745789630079, -4.15745789630079), + 6: (2.8180194846605358, -9.181980515339465, -3.1819805153394642), + 7: (4.277924554357093, -7.722075445642907, -1.7220754456429066), + 8: (6, -6, 0), + 9: (7.722075445642904, -4.277924554357096, 1.722075445642904), + 10: (9.181980515339465, -2.818019484660536, 3.181980515339464), + 11: (10.15745789630079, -1.84254210369921, 4.15745789630079), + 12: (10.5, -1.5, 4.5), + 13: (10.15745789630079, -1.84254210369921, 4.15745789630079), + 14: (9.181980515339465, -2.8180194846605358, 3.1819805153394642), + 15: (7.722075445642904, -4.277924554357096, 1.7220754456429046), + 16: (6.000000000000001, -5.999999999999999, 5.51091059616309e-16), + 17: (4.277924554357096, -7.722075445642904, -1.7220754456429037), + 18: (2.818019484660536, -9.181980515339465, -3.181980515339464), + 19: (1.842542103699211, -10.157457896300789, -4.157457896300789), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.2545877, 0.07418902, 0.74541223)], + 1: [(0.11031782, 0.20051716, 0.8896822)], + 2: [(0.025373489, 0.37243885, 0.97462654)], + 3: [(0.012686744, 0.56378055, 0.9873133)], + 4: [(0.07418902, 0.74541223, 0.92581093)], + 5: [(0.20051716, 0.8896822, 0.7994828)], + 6: [(0.37243885, 0.97462654, 0.62756115)], + 7: [(0.56378055, 0.9873133, 0.43621942)], + 8: [(0.74541223, 0.92581093, 0.2545877)], + 9: [(0.8896822, 0.7994828, 0.11031782)], + 10: [(0.97462654, 0.62756115, 0.025373489)], + 11: [(0.9873133, 0.43621942, 0.012686744)], + 12: [(0.92581093, 0.2545877, 0.07418902)], + 13: [(0.7994828, 0.11031782, 0.20051716)], + 14: [(0.62756115, 0.025373489, 0.37243885)], + 15: [(0.43621942, 0.012686744, 0.56378055)], + 16: [(0.2545877, 0.07418902, 0.74541223)], + 17: [(0.11031782, 0.20051716, 0.8896822)], + 18: [(0.025373489, 0.37243885, 0.97462654)], + 19: [(0.012686744, 0.56378055, 0.9873133)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (210, 210, 210), + 1: (232.5, 232.5, 232.5), + 2: (255, 255, 255), + 3: (277.5, 277.5, 277.5), + 4: (300, 300, 300), + 5: (322.5, 322.5, 322.5), + 6: (345, 345, 345), + 7: (367.5, 367.5, 367.5), + 8: (390, 390, 390), + 9: (412.5, 412.5, 412.5), + 10: (435, 435, 435), + 11: (457.5, 457.5, 457.5), + 12: (480, 480, 480), + 13: (502.5, 502.5, 502.5), + 14: (525, 525, 525), + 15: (547.5, 547.5, 547.5), + 16: (570, 570, 570), + 17: (592.5, 592.5, 592.5), + 18: (615, 615, 615), + 19: (637.5, 637.5, 637.5), + } + double3 xformOp:translate = (6, -6, 6) + double3 xformOp:translate.timeSamples = { + 0: (3.791289531124911, -8.20871046887509, 3.791289531124911), + 1: (2.492860357673429, -9.507139642326571, 2.492860357673429), + 2: (1.728361402466141, -10.271638597533858, 1.728361402466141), + 3: (1.6141807012330691, -10.38581929876693, 1.6141807012330691), + 4: (2.1677012306863173, -9.832298769313683, 2.1677012306863173), + 5: (3.30465450789272, -8.695345492107279, 3.30465450789272), + 6: (4.851949702904727, -7.148050297095273, 4.851949702904727), + 7: (6.574025148547633, -5.425974851452367, 6.574025148547633), + 8: (8.20871046887509, -3.791289531124911, 8.20871046887509), + 9: (9.507139642326571, -2.4928603576734285, 9.507139642326571), + 10: (10.27163859753386, -1.72836140246614, 10.27163859753386), + 11: (10.38581929876693, -1.6141807012330691, 10.38581929876693), + 12: (9.832298769313683, -2.1677012306863173, 9.832298769313683), + 13: (8.695345492107279, -3.304654507892721, 8.695345492107279), + 14: (7.148050297095272, -4.851949702904728, 7.148050297095272), + 15: (5.425974851452368, -6.574025148547632, 5.425974851452368), + 16: (3.791289531124911, -8.20871046887509, 3.791289531124911), + 17: (2.492860357673429, -9.507139642326571, 2.492860357673429), + 18: (1.728361402466141, -10.271638597533858, 1.728361402466141), + 19: (1.6141807012330691, -10.38581929876693, 1.6141807012330691), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_2" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.74541223, 0.07418902, 0.2545877)], + 1: [(0.56378055, 0.012686744, 0.43621942)], + 2: [(0.37243885, 0.025373489, 0.62756115)], + 3: [(0.20051716, 0.11031782, 0.7994828)], + 4: [(0.07418902, 0.2545877, 0.92581093)], + 5: [(0.012686744, 0.43621942, 0.9873133)], + 6: [(0.025373489, 0.62756115, 0.97462654)], + 7: [(0.11031782, 0.7994828, 0.8896822)], + 8: [(0.2545877, 0.92581093, 0.74541223)], + 9: [(0.43621942, 0.9873133, 0.56378055)], + 10: [(0.62756115, 0.97462654, 0.37243885)], + 11: [(0.7994828, 0.8896822, 0.20051716)], + 12: [(0.92581093, 0.74541223, 0.07418902)], + 13: [(0.9873133, 0.56378055, 0.012686744)], + 14: [(0.97462654, 0.37243885, 0.025373489)], + 15: [(0.8896822, 0.20051716, 0.11031782)], + 16: [(0.74541223, 0.07418902, 0.2545877)], + 17: [(0.56378055, 0.012686744, 0.43621942)], + 18: [(0.37243885, 0.025373489, 0.62756115)], + 19: [(0.20051716, 0.11031782, 0.7994828)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (150, 150, 150), + 1: (172.5, 172.5, 172.5), + 2: (195, 195, 195), + 3: (217.5, 217.5, 217.5), + 4: (240, 240, 240), + 5: (262.5, 262.5, 262.5), + 6: (285, 285, 285), + 7: (307.5, 307.5, 307.5), + 8: (330, 330, 330), + 9: (352.5, 352.5, 352.5), + 10: (375, 375, 375), + 11: (397.5, 397.5, 397.5), + 12: (420, 420, 420), + 13: (442.5, 442.5, 442.5), + 14: (465, 465, 465), + 15: (487.5, 487.5, 487.5), + 16: (510, 510, 510), + 17: (532.5, 532.5, 532.5), + 18: (555, 555, 555), + 19: (577.5, 577.5, 577.5), + } + double3 xformOp:translate = (6, 0, -12) + double3 xformOp:translate.timeSamples = { + 0: (8.208710468875092, 2.2087104688750916, -9.791289531124908), + 1: (6.574025148547636, 0.5740251485476362, -11.425974851452363), + 2: (4.851949702904732, -1.148050297095268, -13.148050297095267), + 3: (3.3046545078927236, -2.6953454921072764, -14.695345492107275), + 4: (2.16770123068632, -3.83229876931368, -15.832298769313681), + 5: (1.614180701233071, -4.385819298766929, -16.38581929876693), + 6: (1.72836140246614, -4.27163859753386, -16.271638597533858), + 7: (2.4928603576734263, -3.5071396423265737, -15.507139642326575), + 8: (3.7912895311249066, -2.2087104688750934, -14.208710468875093), + 9: (5.425974851452364, -0.5740251485476365, -12.574025148547637), + 10: (7.148050297095265, 1.1480502970952653, -10.851949702904735), + 11: (8.695345492107274, 2.6953454921072737, -9.304654507892726), + 12: (9.83229876931368, 3.832298769313679, -8.16770123068632), + 13: (10.385819298766929, 4.385819298766929, -7.614180701233071), + 14: (10.271638597533862, 4.271638597533861, -7.728361402466139), + 15: (9.507139642326575, 3.507139642326575, -8.492860357673425), + 16: (8.208710468875095, 2.2087104688750947, -9.791289531124905), + 17: (6.574025148547639, 0.5740251485476393, -11.425974851452361), + 18: (4.851949702904735, -1.1480502970952648, -13.148050297095265), + 19: (3.3046545078927263, -2.6953454921072737, -14.695345492107274), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.5, 0, 0.5)], + 1: [(0.30865827, 0.038060233, 0.6913417)], + 2: [(0.14644662, 0.14644662, 0.8535534)], + 3: [(0.038060233, 0.30865827, 0.96193975)], + 4: [(0, 0.5, 1)], + 5: [(0.038060233, 0.6913417, 0.96193975)], + 6: [(0.14644662, 0.8535534, 0.8535534)], + 7: [(0.30865827, 0.96193975, 0.6913417)], + 8: [(0.5, 1, 0.5)], + 9: [(0.6913417, 0.96193975, 0.30865827)], + 10: [(0.8535534, 0.8535534, 0.14644662)], + 11: [(0.96193975, 0.6913417, 0.038060233)], + 12: [(1, 0.5, 0)], + 13: [(0.96193975, 0.30865827, 0.038060233)], + 14: [(0.8535534, 0.14644662, 0.14644662)], + 15: [(0.6913417, 0.038060233, 0.30865827)], + 16: [(0.5, 0, 0.5)], + 17: [(0.30865827, 0.038060233, 0.6913417)], + 18: [(0.14644662, 0.14644662, 0.8535534)], + 19: [(0.038060233, 0.30865827, 0.96193975)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (180, 180, 180), + 1: (202.5, 202.5, 202.5), + 2: (225, 225, 225), + 3: (247.5, 247.5, 247.5), + 4: (270, 270, 270), + 5: (292.5, 292.5, 292.5), + 6: (315, 315, 315), + 7: (337.5, 337.5, 337.5), + 8: (360, 360, 360), + 9: (382.5, 382.5, 382.5), + 10: (405, 405, 405), + 11: (427.5, 427.5, 427.5), + 12: (450, 450, 450), + 13: (472.5, 472.5, 472.5), + 14: (495, 495, 495), + 15: (517.5, 517.5, 517.5), + 16: (540, 540, 540), + 17: (562.5, 562.5, 562.5), + 18: (585, 585, 585), + 19: (607.5, 607.5, 607.5), + } + double3 xformOp:translate = (6, 0, -6) + double3 xformOp:translate.timeSamples = { + 0: (6.000000000000001, 5.51091059616309e-16, -5.999999999999999), + 1: (4.277924554357096, -1.7220754456429037, -7.722075445642904), + 2: (2.818019484660536, -3.181980515339464, -9.181980515339465), + 3: (1.842542103699211, -4.157457896300789, -10.157457896300789), + 4: (1.5, -4.5, -10.5), + 5: (1.84254210369921, -4.15745789630079, -10.15745789630079), + 6: (2.8180194846605358, -3.1819805153394642, -9.181980515339465), + 7: (4.277924554357093, -1.7220754456429066, -7.722075445642907), + 8: (6, 0, -6), + 9: (7.722075445642904, 1.722075445642904, -4.277924554357096), + 10: (9.181980515339465, 3.181980515339464, -2.818019484660536), + 11: (10.15745789630079, 4.15745789630079, -1.84254210369921), + 12: (10.5, 4.5, -1.5), + 13: (10.15745789630079, 4.15745789630079, -1.84254210369921), + 14: (9.181980515339465, 3.1819805153394642, -2.8180194846605358), + 15: (7.722075445642904, 1.7220754456429046, -4.277924554357096), + 16: (6.000000000000001, 5.51091059616309e-16, -5.999999999999999), + 17: (4.277924554357096, -1.7220754456429037, -7.722075445642904), + 18: (2.818019484660536, -3.181980515339464, -9.181980515339465), + 19: (1.842542103699211, -4.157457896300789, -10.157457896300789), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.2545877, 0.07418902, 0.74541223)], + 1: [(0.11031782, 0.20051716, 0.8896822)], + 2: [(0.025373489, 0.37243885, 0.97462654)], + 3: [(0.012686744, 0.56378055, 0.9873133)], + 4: [(0.07418902, 0.74541223, 0.92581093)], + 5: [(0.20051716, 0.8896822, 0.7994828)], + 6: [(0.37243885, 0.97462654, 0.62756115)], + 7: [(0.56378055, 0.9873133, 0.43621942)], + 8: [(0.74541223, 0.92581093, 0.2545877)], + 9: [(0.8896822, 0.7994828, 0.11031782)], + 10: [(0.97462654, 0.62756115, 0.025373489)], + 11: [(0.9873133, 0.43621942, 0.012686744)], + 12: [(0.92581093, 0.2545877, 0.07418902)], + 13: [(0.7994828, 0.11031782, 0.20051716)], + 14: [(0.62756115, 0.025373489, 0.37243885)], + 15: [(0.43621942, 0.012686744, 0.56378055)], + 16: [(0.2545877, 0.07418902, 0.74541223)], + 17: [(0.11031782, 0.20051716, 0.8896822)], + 18: [(0.025373489, 0.37243885, 0.97462654)], + 19: [(0.012686744, 0.56378055, 0.9873133)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (210, 210, 210), + 1: (232.5, 232.5, 232.5), + 2: (255, 255, 255), + 3: (277.5, 277.5, 277.5), + 4: (300, 300, 300), + 5: (322.5, 322.5, 322.5), + 6: (345, 345, 345), + 7: (367.5, 367.5, 367.5), + 8: (390, 390, 390), + 9: (412.5, 412.5, 412.5), + 10: (435, 435, 435), + 11: (457.5, 457.5, 457.5), + 12: (480, 480, 480), + 13: (502.5, 502.5, 502.5), + 14: (525, 525, 525), + 15: (547.5, 547.5, 547.5), + 16: (570, 570, 570), + 17: (592.5, 592.5, 592.5), + 18: (615, 615, 615), + 19: (637.5, 637.5, 637.5), + } + double3 xformOp:translate = (6, 0, 0) + double3 xformOp:translate.timeSamples = { + 0: (3.791289531124911, -2.208710468875089, -2.208710468875089), + 1: (2.492860357673429, -3.507139642326571, -3.507139642326571), + 2: (1.728361402466141, -4.271638597533859, -4.271638597533859), + 3: (1.6141807012330691, -4.385819298766931, -4.385819298766931), + 4: (2.1677012306863173, -3.8322987693136827, -3.8322987693136827), + 5: (3.30465450789272, -2.69534549210728, -2.69534549210728), + 6: (4.851949702904727, -1.148050297095273, -1.148050297095273), + 7: (6.574025148547633, 0.5740251485476326, 0.5740251485476326), + 8: (8.20871046887509, 2.208710468875089, 2.208710468875089), + 9: (9.507139642326571, 3.5071396423265715, 3.5071396423265715), + 10: (10.27163859753386, 4.27163859753386, 4.27163859753386), + 11: (10.38581929876693, 4.385819298766931, 4.385819298766931), + 12: (9.832298769313683, 3.8322987693136827, 3.8322987693136827), + 13: (8.695345492107279, 2.695345492107279, 2.695345492107279), + 14: (7.148050297095272, 1.148050297095272, 1.148050297095272), + 15: (5.425974851452368, -0.5740251485476322, -0.5740251485476322), + 16: (3.791289531124911, -2.208710468875089, -2.208710468875089), + 17: (2.492860357673429, -3.507139642326571, -3.507139642326571), + 18: (1.728361402466141, -4.271638597533859, -4.271638597533859), + 19: (1.6141807012330691, -4.385819298766931, -4.385819298766931), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.07418902, 0.2545877, 0.92581093)], + 1: [(0.012686744, 0.43621942, 0.9873133)], + 2: [(0.025373489, 0.62756115, 0.97462654)], + 3: [(0.11031782, 0.7994828, 0.8896822)], + 4: [(0.2545877, 0.92581093, 0.74541223)], + 5: [(0.43621942, 0.9873133, 0.56378055)], + 6: [(0.62756115, 0.97462654, 0.37243885)], + 7: [(0.7994828, 0.8896822, 0.20051716)], + 8: [(0.92581093, 0.74541223, 0.07418902)], + 9: [(0.9873133, 0.56378055, 0.012686744)], + 10: [(0.97462654, 0.37243885, 0.025373489)], + 11: [(0.8896822, 0.20051716, 0.11031782)], + 12: [(0.74541223, 0.07418902, 0.2545877)], + 13: [(0.56378055, 0.012686744, 0.43621942)], + 14: [(0.37243885, 0.025373489, 0.62756115)], + 15: [(0.20051716, 0.11031782, 0.7994828)], + 16: [(0.07418902, 0.2545877, 0.92581093)], + 17: [(0.012686744, 0.43621942, 0.9873133)], + 18: [(0.025373489, 0.62756115, 0.97462654)], + 19: [(0.11031782, 0.7994828, 0.8896822)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (240, 240, 240), + 1: (262.5, 262.5, 262.5), + 2: (285, 285, 285), + 3: (307.5, 307.5, 307.5), + 4: (330, 330, 330), + 5: (352.5, 352.5, 352.5), + 6: (375, 375, 375), + 7: (397.5, 397.5, 397.5), + 8: (420, 420, 420), + 9: (442.5, 442.5, 442.5), + 10: (465, 465, 465), + 11: (487.5, 487.5, 487.5), + 12: (510, 510, 510), + 13: (532.5, 532.5, 532.5), + 14: (555, 555, 555), + 15: (577.5, 577.5, 577.5), + 16: (600, 600, 600), + 17: (622.5, 622.5, 622.5), + 18: (645, 645, 645), + 19: (667.5, 667.5, 667.5), + } + double3 xformOp:translate = (6, 0, 6) + double3 xformOp:translate.timeSamples = { + 0: (2.16770123068632, -3.83229876931368, 2.16770123068632), + 1: (1.614180701233071, -4.385819298766929, 1.614180701233071), + 2: (1.72836140246614, -4.27163859753386, 1.72836140246614), + 3: (2.4928603576734263, -3.5071396423265737, 2.4928603576734263), + 4: (3.7912895311249066, -2.2087104688750934, 3.7912895311249066), + 5: (5.425974851452364, -0.5740251485476365, 5.425974851452364), + 6: (7.148050297095265, 1.1480502970952653, 7.148050297095265), + 7: (8.695345492107274, 2.6953454921072737, 8.695345492107274), + 8: (9.83229876931368, 3.832298769313679, 9.83229876931368), + 9: (10.385819298766929, 4.385819298766929, 10.385819298766929), + 10: (10.271638597533862, 4.271638597533861, 10.271638597533862), + 11: (9.507139642326575, 3.507139642326575, 9.507139642326575), + 12: (8.208710468875095, 2.2087104688750947, 8.208710468875095), + 13: (6.574025148547639, 0.5740251485476393, 6.574025148547639), + 14: (4.851949702904735, -1.1480502970952648, 4.851949702904735), + 15: (3.3046545078927263, -2.6953454921072737, 3.3046545078927263), + 16: (2.1677012306863217, -3.8322987693136783, 2.1677012306863217), + 17: (1.614180701233071, -4.385819298766929, 1.614180701233071), + 18: (1.7283614024661391, -4.271638597533861, 1.7283614024661391), + 19: (2.492860357673425, -3.507139642326575, 2.492860357673425), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + + def "prim_3" + { + def Cube "prim_0" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.5, 0, 0.5)], + 1: [(0.30865827, 0.038060233, 0.6913417)], + 2: [(0.14644662, 0.14644662, 0.8535534)], + 3: [(0.038060233, 0.30865827, 0.96193975)], + 4: [(0, 0.5, 1)], + 5: [(0.038060233, 0.6913417, 0.96193975)], + 6: [(0.14644662, 0.8535534, 0.8535534)], + 7: [(0.30865827, 0.96193975, 0.6913417)], + 8: [(0.5, 1, 0.5)], + 9: [(0.6913417, 0.96193975, 0.30865827)], + 10: [(0.8535534, 0.8535534, 0.14644662)], + 11: [(0.96193975, 0.6913417, 0.038060233)], + 12: [(1, 0.5, 0)], + 13: [(0.96193975, 0.30865827, 0.038060233)], + 14: [(0.8535534, 0.14644662, 0.14644662)], + 15: [(0.6913417, 0.038060233, 0.30865827)], + 16: [(0.5, 0, 0.5)], + 17: [(0.30865827, 0.038060233, 0.6913417)], + 18: [(0.14644662, 0.14644662, 0.8535534)], + 19: [(0.038060233, 0.30865827, 0.96193975)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (180, 180, 180), + 1: (202.5, 202.5, 202.5), + 2: (225, 225, 225), + 3: (247.5, 247.5, 247.5), + 4: (270, 270, 270), + 5: (292.5, 292.5, 292.5), + 6: (315, 315, 315), + 7: (337.5, 337.5, 337.5), + 8: (360, 360, 360), + 9: (382.5, 382.5, 382.5), + 10: (405, 405, 405), + 11: (427.5, 427.5, 427.5), + 12: (450, 450, 450), + 13: (472.5, 472.5, 472.5), + 14: (495, 495, 495), + 15: (517.5, 517.5, 517.5), + 16: (540, 540, 540), + 17: (562.5, 562.5, 562.5), + 18: (585, 585, 585), + 19: (607.5, 607.5, 607.5), + } + double3 xformOp:translate = (6, 6, -12) + double3 xformOp:translate.timeSamples = { + 0: (6.000000000000001, 6.000000000000001, -12), + 1: (4.277924554357096, 4.277924554357096, -13.722075445642904), + 2: (2.818019484660536, 2.818019484660536, -15.181980515339465), + 3: (1.842542103699211, 1.842542103699211, -16.15745789630079), + 4: (1.5, 1.5, -16.5), + 5: (1.84254210369921, 1.84254210369921, -16.15745789630079), + 6: (2.8180194846605358, 2.8180194846605358, -15.181980515339465), + 7: (4.277924554357093, 4.277924554357093, -13.722075445642906), + 8: (6, 6, -12), + 9: (7.722075445642904, 7.722075445642904, -10.277924554357096), + 10: (9.181980515339465, 9.181980515339465, -8.818019484660535), + 11: (10.15745789630079, 10.15745789630079, -7.84254210369921), + 12: (10.5, 10.5, -7.5), + 13: (10.15745789630079, 10.15745789630079, -7.84254210369921), + 14: (9.181980515339465, 9.181980515339465, -8.818019484660535), + 15: (7.722075445642904, 7.722075445642904, -10.277924554357096), + 16: (6.000000000000001, 6.000000000000001, -12), + 17: (4.277924554357096, 4.277924554357096, -13.722075445642904), + 18: (2.818019484660536, 2.818019484660536, -15.181980515339465), + 19: (1.842542103699211, 1.842542103699211, -16.15745789630079), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_1" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.2545877, 0.07418902, 0.74541223)], + 1: [(0.11031782, 0.20051716, 0.8896822)], + 2: [(0.025373489, 0.37243885, 0.97462654)], + 3: [(0.012686744, 0.56378055, 0.9873133)], + 4: [(0.07418902, 0.74541223, 0.92581093)], + 5: [(0.20051716, 0.8896822, 0.7994828)], + 6: [(0.37243885, 0.97462654, 0.62756115)], + 7: [(0.56378055, 0.9873133, 0.43621942)], + 8: [(0.74541223, 0.92581093, 0.2545877)], + 9: [(0.8896822, 0.7994828, 0.11031782)], + 10: [(0.97462654, 0.62756115, 0.025373489)], + 11: [(0.9873133, 0.43621942, 0.012686744)], + 12: [(0.92581093, 0.2545877, 0.07418902)], + 13: [(0.7994828, 0.11031782, 0.20051716)], + 14: [(0.62756115, 0.025373489, 0.37243885)], + 15: [(0.43621942, 0.012686744, 0.56378055)], + 16: [(0.2545877, 0.07418902, 0.74541223)], + 17: [(0.11031782, 0.20051716, 0.8896822)], + 18: [(0.025373489, 0.37243885, 0.97462654)], + 19: [(0.012686744, 0.56378055, 0.9873133)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (210, 210, 210), + 1: (232.5, 232.5, 232.5), + 2: (255, 255, 255), + 3: (277.5, 277.5, 277.5), + 4: (300, 300, 300), + 5: (322.5, 322.5, 322.5), + 6: (345, 345, 345), + 7: (367.5, 367.5, 367.5), + 8: (390, 390, 390), + 9: (412.5, 412.5, 412.5), + 10: (435, 435, 435), + 11: (457.5, 457.5, 457.5), + 12: (480, 480, 480), + 13: (502.5, 502.5, 502.5), + 14: (525, 525, 525), + 15: (547.5, 547.5, 547.5), + 16: (570, 570, 570), + 17: (592.5, 592.5, 592.5), + 18: (615, 615, 615), + 19: (637.5, 637.5, 637.5), + } + double3 xformOp:translate = (6, 6, -6) + double3 xformOp:translate.timeSamples = { + 0: (3.791289531124911, 3.791289531124911, -8.20871046887509), + 1: (2.492860357673429, 2.492860357673429, -9.507139642326571), + 2: (1.728361402466141, 1.728361402466141, -10.271638597533858), + 3: (1.6141807012330691, 1.6141807012330691, -10.38581929876693), + 4: (2.1677012306863173, 2.1677012306863173, -9.832298769313683), + 5: (3.30465450789272, 3.30465450789272, -8.695345492107279), + 6: (4.851949702904727, 4.851949702904727, -7.148050297095273), + 7: (6.574025148547633, 6.574025148547633, -5.425974851452367), + 8: (8.20871046887509, 8.20871046887509, -3.791289531124911), + 9: (9.507139642326571, 9.507139642326571, -2.4928603576734285), + 10: (10.27163859753386, 10.27163859753386, -1.72836140246614), + 11: (10.38581929876693, 10.38581929876693, -1.6141807012330691), + 12: (9.832298769313683, 9.832298769313683, -2.1677012306863173), + 13: (8.695345492107279, 8.695345492107279, -3.304654507892721), + 14: (7.148050297095272, 7.148050297095272, -4.851949702904728), + 15: (5.425974851452368, 5.425974851452368, -6.574025148547632), + 16: (3.791289531124911, 3.791289531124911, -8.20871046887509), + 17: (2.492860357673429, 2.492860357673429, -9.507139642326571), + 18: (1.728361402466141, 1.728361402466141, -10.271638597533858), + 19: (1.6141807012330691, 1.6141807012330691, -10.38581929876693), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_2" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0.07418902, 0.2545877, 0.92581093)], + 1: [(0.012686744, 0.43621942, 0.9873133)], + 2: [(0.025373489, 0.62756115, 0.97462654)], + 3: [(0.11031782, 0.7994828, 0.8896822)], + 4: [(0.2545877, 0.92581093, 0.74541223)], + 5: [(0.43621942, 0.9873133, 0.56378055)], + 6: [(0.62756115, 0.97462654, 0.37243885)], + 7: [(0.7994828, 0.8896822, 0.20051716)], + 8: [(0.92581093, 0.74541223, 0.07418902)], + 9: [(0.9873133, 0.56378055, 0.012686744)], + 10: [(0.97462654, 0.37243885, 0.025373489)], + 11: [(0.8896822, 0.20051716, 0.11031782)], + 12: [(0.74541223, 0.07418902, 0.2545877)], + 13: [(0.56378055, 0.012686744, 0.43621942)], + 14: [(0.37243885, 0.025373489, 0.62756115)], + 15: [(0.20051716, 0.11031782, 0.7994828)], + 16: [(0.07418902, 0.2545877, 0.92581093)], + 17: [(0.012686744, 0.43621942, 0.9873133)], + 18: [(0.025373489, 0.62756115, 0.97462654)], + 19: [(0.11031782, 0.7994828, 0.8896822)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (240, 240, 240), + 1: (262.5, 262.5, 262.5), + 2: (285, 285, 285), + 3: (307.5, 307.5, 307.5), + 4: (330, 330, 330), + 5: (352.5, 352.5, 352.5), + 6: (375, 375, 375), + 7: (397.5, 397.5, 397.5), + 8: (420, 420, 420), + 9: (442.5, 442.5, 442.5), + 10: (465, 465, 465), + 11: (487.5, 487.5, 487.5), + 12: (510, 510, 510), + 13: (532.5, 532.5, 532.5), + 14: (555, 555, 555), + 15: (577.5, 577.5, 577.5), + 16: (600, 600, 600), + 17: (622.5, 622.5, 622.5), + 18: (645, 645, 645), + 19: (667.5, 667.5, 667.5), + } + double3 xformOp:translate = (6, 6, 0) + double3 xformOp:translate.timeSamples = { + 0: (2.16770123068632, 2.16770123068632, -3.83229876931368), + 1: (1.614180701233071, 1.614180701233071, -4.385819298766929), + 2: (1.72836140246614, 1.72836140246614, -4.27163859753386), + 3: (2.4928603576734263, 2.4928603576734263, -3.5071396423265737), + 4: (3.7912895311249066, 3.7912895311249066, -2.2087104688750934), + 5: (5.425974851452364, 5.425974851452364, -0.5740251485476365), + 6: (7.148050297095265, 7.148050297095265, 1.1480502970952653), + 7: (8.695345492107274, 8.695345492107274, 2.6953454921072737), + 8: (9.83229876931368, 9.83229876931368, 3.832298769313679), + 9: (10.385819298766929, 10.385819298766929, 4.385819298766929), + 10: (10.271638597533862, 10.271638597533862, 4.271638597533861), + 11: (9.507139642326575, 9.507139642326575, 3.507139642326575), + 12: (8.208710468875095, 8.208710468875095, 2.2087104688750947), + 13: (6.574025148547639, 6.574025148547639, 0.5740251485476393), + 14: (4.851949702904735, 4.851949702904735, -1.1480502970952648), + 15: (3.3046545078927263, 3.3046545078927263, -2.6953454921072737), + 16: (2.1677012306863217, 2.1677012306863217, -3.8322987693136783), + 17: (1.614180701233071, 1.614180701233071, -4.385819298766929), + 18: (1.7283614024661391, 1.7283614024661391, -4.271638597533861), + 19: (2.492860357673425, 2.492860357673425, -3.507139642326575), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + + def Cube "prim_3" + { + float3[] primvars:displayColor = [(1, 1, 1)] + float3[] primvars:displayColor.timeSamples = { + 0: [(0, 0.5, 1)], + 1: [(0.038060233, 0.6913417, 0.96193975)], + 2: [(0.14644662, 0.8535534, 0.8535534)], + 3: [(0.30865827, 0.96193975, 0.6913417)], + 4: [(0.5, 1, 0.5)], + 5: [(0.6913417, 0.96193975, 0.30865827)], + 6: [(0.8535534, 0.8535534, 0.14644662)], + 7: [(0.96193975, 0.6913417, 0.038060233)], + 8: [(1, 0.5, 0)], + 9: [(0.96193975, 0.30865827, 0.038060233)], + 10: [(0.8535534, 0.14644662, 0.14644662)], + 11: [(0.6913417, 0.038060233, 0.30865827)], + 12: [(0.5, 0, 0.5)], + 13: [(0.30865827, 0.038060233, 0.6913417)], + 14: [(0.14644662, 0.14644662, 0.8535534)], + 15: [(0.038060233, 0.30865827, 0.96193975)], + 16: [(0, 0.5, 1)], + 17: [(0.038060233, 0.6913417, 0.96193975)], + 18: [(0.14644662, 0.8535534, 0.8535534)], + 19: [(0.30865827, 0.96193975, 0.6913417)], + } + float3 xformOp:rotateXYZ = (0, 0, 0) + float3 xformOp:rotateXYZ.timeSamples = { + 0: (270, 270, 270), + 1: (292.5, 292.5, 292.5), + 2: (315, 315, 315), + 3: (337.5, 337.5, 337.5), + 4: (360, 360, 360), + 5: (382.5, 382.5, 382.5), + 6: (405, 405, 405), + 7: (427.5, 427.5, 427.5), + 8: (450, 450, 450), + 9: (472.5, 472.5, 472.5), + 10: (495, 495, 495), + 11: (517.5, 517.5, 517.5), + 12: (540, 540, 540), + 13: (562.5, 562.5, 562.5), + 14: (585, 585, 585), + 15: (607.5, 607.5, 607.5), + 16: (630, 630, 630), + 17: (652.5, 652.5, 652.5), + 18: (675, 675, 675), + 19: (697.5, 697.5, 697.5), + } + double3 xformOp:translate = (6, 6, 6) + double3 xformOp:translate.timeSamples = { + 0: (1.5, 1.5, 1.5), + 1: (1.84254210369921, 1.84254210369921, 1.84254210369921), + 2: (2.8180194846605358, 2.8180194846605358, 2.8180194846605358), + 3: (4.277924554357093, 4.277924554357093, 4.277924554357093), + 4: (6, 6, 6), + 5: (7.722075445642904, 7.722075445642904, 7.722075445642904), + 6: (9.181980515339465, 9.181980515339465, 9.181980515339465), + 7: (10.15745789630079, 10.15745789630079, 10.15745789630079), + 8: (10.5, 10.5, 10.5), + 9: (10.15745789630079, 10.15745789630079, 10.15745789630079), + 10: (9.181980515339465, 9.181980515339465, 9.181980515339465), + 11: (7.722075445642904, 7.722075445642904, 7.722075445642904), + 12: (6.000000000000001, 6.000000000000001, 6.000000000000001), + 13: (4.277924554357096, 4.277924554357096, 4.277924554357096), + 14: (2.818019484660536, 2.818019484660536, 2.818019484660536), + 15: (1.842542103699211, 1.842542103699211, 1.842542103699211), + 16: (1.5, 1.5, 1.5), + 17: (1.84254210369921, 1.84254210369921, 1.84254210369921), + 18: (2.8180194846605358, 2.8180194846605358, 2.8180194846605358), + 19: (4.277924554357093, 4.277924554357093, 4.277924554357093), + } + token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + } + } + } +} + diff --git a/extras/usd/tutorials/README.md b/extras/usd/tutorials/README.md index 571ed3bfab..79a1be9904 100644 --- a/extras/usd/tutorials/README.md +++ b/extras/usd/tutorials/README.md @@ -1,4 +1,4 @@ USD Tutorials ============ -This section contains files used in the provided [tutorial set](http://graphics.pixar.com/usd/docs/USD-Tutorials.html). +This section contains files used in the provided [tutorial set](https://openusd.org/release/tut_usd_tutorials.html). diff --git a/pxr/base/arch/attributes.h b/pxr/base/arch/attributes.h index ec2ea91f84..0df315f83e 100644 --- a/pxr/base/arch/attributes.h +++ b/pxr/base/arch/attributes.h @@ -161,6 +161,14 @@ PXR_NAMESPACE_OPEN_SCOPE /// \hideinitializer # define ARCH_DESTRUCTOR(_name, _priority, ...) +/// Macro to begin the definition of a class that is using private inheritance +/// to take advantage of the empty base optimization. Some compilers require +/// an explicit tag. +/// +/// In C++20, usage of private inheritance may be able to be retired with the +/// [[no_unique_address]] tag. +# define ARCH_EMPTY_BASES + #elif defined(ARCH_COMPILER_GCC) || defined(ARCH_COMPILER_CLANG) # define ARCH_PRINTF_FUNCTION(_fmt, _firstArg) \ @@ -171,6 +179,7 @@ PXR_NAMESPACE_OPEN_SCOPE # define ARCH_UNUSED_ARG __attribute__ ((unused)) # define ARCH_UNUSED_FUNCTION __attribute__((unused)) # define ARCH_USED_FUNCTION __attribute__((used)) +# define ARCH_EMPTY_BASES #elif defined(ARCH_COMPILER_MSVC) @@ -180,6 +189,7 @@ PXR_NAMESPACE_OPEN_SCOPE # define ARCH_UNUSED_ARG # define ARCH_UNUSED_FUNCTION # define ARCH_USED_FUNCTION +# define ARCH_EMPTY_BASES __declspec(empty_bases) #else diff --git a/pxr/base/arch/regex.h b/pxr/base/arch/regex.h index b5557aed8a..a43fb6c6df 100644 --- a/pxr/base/arch/regex.h +++ b/pxr/base/arch/regex.h @@ -34,8 +34,10 @@ PXR_NAMESPACE_OPEN_SCOPE class ArchRegex { public: - static constexpr unsigned int CASE_INSENSITIVE = 1u; - static constexpr unsigned int GLOB = 2u; + enum : unsigned int { + CASE_INSENSITIVE = 1u, + GLOB = 2u + }; /// Create an empty regex. ARCH_API ArchRegex(); diff --git a/pxr/base/gf/bbox3d.h b/pxr/base/gf/bbox3d.h index 8e42acbde3..cb9d14a805 100644 --- a/pxr/base/gf/bbox3d.h +++ b/pxr/base/gf/bbox3d.h @@ -95,15 +95,6 @@ class GfBBox3d { _hasZeroAreaPrimitives = false; } - /// Copy constructor - GfBBox3d(const GfBBox3d& rhs) : - _box(rhs._box) { - _matrix = rhs._matrix; - _inverse = rhs._inverse; - _isDegenerate = rhs._isDegenerate; - _hasZeroAreaPrimitives = rhs._hasZeroAreaPrimitives; - } - /// This constructor takes a box and sets the matrix to identity. GfBBox3d(const GfRange3d &box) : _box(box) { diff --git a/pxr/base/js/testenv/testJsConverter.cpp b/pxr/base/js/testenv/testJsConverter.cpp index 36c3a3b44f..b7d0865108 100644 --- a/pxr/base/js/testenv/testJsConverter.cpp +++ b/pxr/base/js/testenv/testJsConverter.cpp @@ -335,6 +335,20 @@ int main(int argc, char const *argv[]) indent << "checking null conversion" << std::endl; TF_AXIOM(object[p.first].IsNull()); TF_AXIOM(IsEmpty(p.second)); + } else if (p.first == "ArrayOfObjects") { + indent << "checking array of object conversion" << std::endl; + TF_AXIOM(object[p.first].IsArray()); + TF_AXIOM(object[p.first].Is()); + const auto arrayOfObjects = object[p.first].Get(); + TF_AXIOM(arrayOfObjects.size() == 2); + TF_AXIOM(arrayOfObjects[0].IsObject()); + TF_AXIOM(arrayOfObjects[1].IsObject()); + // Test coverage for equivalence of nested structures + const static JsArray EXPECTED = { + JsObject({{"String", JsValue{"value1"}}}), + JsObject({{"Real", JsValue{5.0}}}) + }; + TF_AXIOM(arrayOfObjects == EXPECTED); } } diff --git a/pxr/base/js/testenv/testJsConverter/values.json b/pxr/base/js/testenv/testJsConverter/values.json index f1b0d92ce8..f4cd2bec9d 100644 --- a/pxr/base/js/testenv/testJsConverter/values.json +++ b/pxr/base/js/testenv/testJsConverter/values.json @@ -12,6 +12,7 @@ "Real" : 42.0, "BoolTrue" : true, "BoolFalse" : false, - "Null" : null + "Null" : null, + "ArrayOfObjects" : [{"String" : "value1"}, {"Real" : 5.0}] } } diff --git a/pxr/base/js/value.cpp b/pxr/base/js/value.cpp index 57ce7a2749..950461fc7b 100644 --- a/pxr/base/js/value.cpp +++ b/pxr/base/js/value.cpp @@ -46,6 +46,48 @@ struct Js_Null } }; +// Wrapper around std::unique_ptr that should always be +// dereferencable and whose equality is determined by +// its held object. This is needed to make JsObject +// and JsArray (which hold JsValues) holdable by JsValue +template +class Js_Wrapper final { +public: + // Js_Wrapper should never by null, so disallow + // defualt construction + Js_Wrapper() = delete; + + // Copy semantics are not necessary as the _Holder + // type is not copyable + Js_Wrapper(const Js_Wrapper&) = delete; + Js_Wrapper& operator=(const Js_Wrapper&) = delete; + + Js_Wrapper(Js_Wrapper&&) = default; + Js_Wrapper& operator=(Js_Wrapper&&) = default; + ~Js_Wrapper() = default; + + explicit Js_Wrapper(const T& wrapped) : + _ptr(std::make_unique(wrapped)) {} + explicit Js_Wrapper(T&& wrapped) : + _ptr(std::make_unique(std::move(wrapped))) {} + + const T& Get() const { return *_ptr; } + + bool operator==(const Js_Wrapper& other) const { + return Get() == other.Get(); + } + + bool operator!=(const Js_Wrapper& other) const { + return Get() != other.Get(); + } + +private: + std::unique_ptr _ptr; +}; + +using Js_ObjectWrapper = Js_Wrapper; +using Js_ArrayWrapper = Js_Wrapper; + /// \struct JsValue::_Holder /// Private holder class used to abstract away how a value is stored /// internally in JsValue objects. @@ -54,21 +96,25 @@ struct JsValue::_Holder // The order these types are defined in the variant is important. See the // comments in the implementation of IsUInt64 for details. typedef boost::variant< - boost::recursive_wrapper, - boost::recursive_wrapper, + Js_ObjectWrapper, + Js_ArrayWrapper, std::string, bool, int64_t, double, Js_Null, uint64_t> Variant; _Holder() : value(Js_Null()), type(JsValue::NullType) { } _Holder(const JsObject& value) - : value(value), type(JsValue::ObjectType) { } + : value(Js_ObjectWrapper(value)), + type(JsValue::ObjectType) { } _Holder(JsObject&& value) - : value(std::move(value)), type(JsValue::ObjectType) { } + : value(Js_ObjectWrapper(std::move(value))), + type(JsValue::ObjectType) { } _Holder(const JsArray& value) - : value(value), type(JsValue::ArrayType) { } + : value(Js_ArrayWrapper(value)), + type(JsValue::ArrayType) { } _Holder(JsArray&& value) - : value(std::move(value)), type(JsValue::ArrayType) { } + : value(Js_ArrayWrapper(std::move(value))), + type(JsValue::ArrayType) { } _Holder(const char* value) : value(std::string(value)), type(JsValue::StringType) { } _Holder(const std::string& value) @@ -216,7 +262,7 @@ JsValue::GetJsObject() const return *_emptyObject; } - return *boost::get(&_holder->value); + return boost::get(_holder->value).Get(); } const JsArray& @@ -230,7 +276,7 @@ JsValue::GetJsArray() const return *_emptyArray; } - return *boost::get(&_holder->value); + return boost::get(_holder->value).Get(); } const std::string& diff --git a/pxr/base/plug/registry.cpp b/pxr/base/plug/registry.cpp index a25e47b553..cd53b184bd 100644 --- a/pxr/base/plug/registry.cpp +++ b/pxr/base/plug/registry.cpp @@ -36,6 +36,7 @@ #include "pxr/base/tf/getenv.h" #include "pxr/base/tf/instantiateSingleton.h" #include "pxr/base/tf/mallocTag.h" +#include "pxr/base/tf/pyLock.h" #include "pxr/base/tf/scopeDescription.h" #include "pxr/base/tf/stl.h" #include "pxr/base/tf/stringUtils.h" @@ -148,7 +149,19 @@ PlugRegistry::_RegisterPlugins(const std::vector& pathsToPlugInfo, &PlugRegistry::_RegisterPlugin, this, std::placeholders::_1, &newPlugins), &taskArena); - }); + }, /*dropPythonGIL=*/false); + // We explicitly do not drop the GIL here because of sad stories like + // the following. A shared library loads and during its initialization, + // it wants to look up information from plugins, and thus invokes this + // code to do first-time plugin registration. The dynamic loader holds + // its own lock while it loads the shared library. If this code holds + // the GIL (say the library is being loaded due to a python 'import') + // and was to drop it during the parallelism, then other Python-based + // threads can take the GIL and wind up calling, dlsym() for example. + // This will wait on the dynamic loader's lock, but this thread will + // never release it since it will wait to reacquire the GIL. This causes + // a deadlock between the dynamic loader's lock and the Python GIL. + // Retaining the GIL here prevents this scenario. } if (!newPlugins.empty()) { diff --git a/pxr/base/plug/wrapTestPlugBase.cpp b/pxr/base/plug/wrapTestPlugBase.cpp index 578ffa1afe..c66ef83218 100644 --- a/pxr/base/plug/wrapTestPlugBase.cpp +++ b/pxr/base/plug/wrapTestPlugBase.cpp @@ -63,8 +63,3 @@ void wrap_TestPlugBase() wrap_TestPlugBase<_TestPlugBase3>("_TestPlugBase3"); wrap_TestPlugBase<_TestPlugBase4>("_TestPlugBase4"); } - -TF_REFPTR_CONST_VOLATILE_GET(_TestPlugBase1) -TF_REFPTR_CONST_VOLATILE_GET(_TestPlugBase2) -TF_REFPTR_CONST_VOLATILE_GET(_TestPlugBase3) -TF_REFPTR_CONST_VOLATILE_GET(_TestPlugBase4) diff --git a/pxr/base/tf/CMakeLists.txt b/pxr/base/tf/CMakeLists.txt index 303a7f536e..c0e89f5373 100644 --- a/pxr/base/tf/CMakeLists.txt +++ b/pxr/base/tf/CMakeLists.txt @@ -124,13 +124,16 @@ pxr_library(tf cxxCast.h declarePtrs.h diagnosticLite.h + functionTraits.h functionRef.h hashmap.h hashset.h instantiateSingleton.h instantiateStacked.h instantiateType.h + meta.h pxrCLI11/CLI11.h + pxrPEGTL/pegtl.h pxrTslRobinMap/robin_growth_policy.h pxrTslRobinMap/robin_hash.h pxrTslRobinMap/robin_map.h @@ -353,6 +356,7 @@ pxr_build_test(testTf testenv/hash.cpp testenv/iterator.cpp testenv/mallocTag.cpp + testenv/meta.cpp testenv/notice.cpp testenv/pathUtils.cpp testenv/patternMatcher.cpp diff --git a/pxr/base/tf/anyWeakPtr.h b/pxr/base/tf/anyWeakPtr.h index 21fae512d4..9e6effdfc4 100644 --- a/pxr/base/tf/anyWeakPtr.h +++ b/pxr/base/tf/anyWeakPtr.h @@ -39,7 +39,6 @@ #endif // PXR_PYTHON_SUPPORT_ENABLED #include "pxr/base/tf/pyObjWrapper.h" -#include #include #include @@ -51,7 +50,7 @@ PXR_NAMESPACE_OPEN_SCOPE /// /// Provides the ability to hold an arbitrary TfWeakPtr in a non-type-specific /// manner in order to observe whether it has expired or not -class TfAnyWeakPtr : boost::totally_ordered +class TfAnyWeakPtr { struct _Data { void* space[4]; @@ -118,9 +117,29 @@ class TfAnyWeakPtr : boost::totally_ordered /// equality operator TF_API bool operator ==(const TfAnyWeakPtr &rhs) const; + /// inequality operator + bool operator !=(const TfAnyWeakPtr &rhs) const { + return !(*this == rhs); + } + /// comparison operator TF_API bool operator <(const TfAnyWeakPtr &rhs) const; + /// less than or equal operator + bool operator <=(const TfAnyWeakPtr& rhs) const { + return !(rhs < *this); + } + + /// greater than operator + bool operator >(const TfAnyWeakPtr& rhs) const { + return rhs < *this; + } + + /// greater than or equal operator + bool operator >=(const TfAnyWeakPtr& rhs) const { + return !(*this < rhs); + } + /// returns the type_info of the underlying WeakPtr TF_API const std::type_info & GetTypeInfo() const; diff --git a/pxr/base/tf/atomicOfstreamWrapper.h b/pxr/base/tf/atomicOfstreamWrapper.h index 4360f95142..1310cffca1 100644 --- a/pxr/base/tf/atomicOfstreamWrapper.h +++ b/pxr/base/tf/atomicOfstreamWrapper.h @@ -30,8 +30,6 @@ #include "pxr/pxr.h" #include "pxr/base/tf/api.h" -#include - #include #include @@ -76,8 +74,11 @@ PXR_NAMESPACE_OPEN_SCOPE /// // called, and the temporary file is removed. /// \endcode /// -class TfAtomicOfstreamWrapper : boost::noncopyable +class TfAtomicOfstreamWrapper { + TfAtomicOfstreamWrapper(const TfAtomicOfstreamWrapper&) = delete; + TfAtomicOfstreamWrapper& operator=( + const TfAtomicOfstreamWrapper&) = delete; public: /// Constructor. TF_API explicit TfAtomicOfstreamWrapper(const std::string& filePath); diff --git a/pxr/base/tf/denseHashMap.h b/pxr/base/tf/denseHashMap.h index fd907757eb..a42ee4b3e5 100644 --- a/pxr/base/tf/denseHashMap.h +++ b/pxr/base/tf/denseHashMap.h @@ -27,14 +27,13 @@ /// \file tf/denseHashMap.h #include "pxr/pxr.h" +#include "pxr/base/arch/attributes.h" #include "pxr/base/tf/hashmap.h" #include #include -#include #include -#include PXR_NAMESPACE_OPEN_SCOPE @@ -56,7 +55,13 @@ template < class EqualKey = std::equal_to, unsigned Threshold = 128 > -class TfDenseHashMap + +class ARCH_EMPTY_BASES TfDenseHashMap : + // Since sizeof(EqualKey) == 0 and sizeof(HashFn) == 0 in many cases + // we use the empty base optimization to not pay a size penalty. + // In C++20, explore using [[no_unique_address]] as an alternative + // way to get this optimization. + private HashFn, private EqualKey { public: @@ -219,11 +224,9 @@ class TfDenseHashMap /// explicit TfDenseHashMap( const HashFn &hashFn = HashFn(), - const EqualKey &equalKey = EqualKey()) - { - _hash() = hashFn; - _equ() = equalKey; - } + const EqualKey &equalKey = EqualKey()) : + HashFn(hashFn), + EqualKey(equalKey) {} /// Construct with range. /// @@ -241,11 +244,10 @@ class TfDenseHashMap /// Copy Ctor. /// TfDenseHashMap(const TfDenseHashMap &rhs) - : _vectorHashFnEqualFn(rhs._vectorHashFnEqualFn) { - if (rhs._h) { - _h.reset(new _HashMap(*rhs._h)); - } - } + : HashFn(rhs), + EqualKey(rhs), + _vector(rhs._vector), + _h(rhs._h ? std::make_unique<_HashMap>(*rhs._h) : nullptr) {} /// Move Ctor. /// @@ -308,7 +310,10 @@ class TfDenseHashMap /// Swaps the contents of two maps. /// void swap(TfDenseHashMap &rhs) { - _vectorHashFnEqualFn.swap(rhs._vectorHashFnEqualFn); + using std::swap; + swap(_hash(), rhs._hash()); + swap(_equ(), rhs._equ()); + _vector.swap(rhs._vector); _h.swap(rhs._h); } @@ -543,32 +548,32 @@ class TfDenseHashMap // Helper to access the storage vector. _Vector &_vec() { - return _vectorHashFnEqualFn.first().first(); + return _vector; } // Helper to access the hash functor. HashFn &_hash() { - return _vectorHashFnEqualFn.first().second(); + return *this; } // Helper to access the equality functor. EqualKey &_equ() { - return _vectorHashFnEqualFn.second(); + return *this; } // Helper to access the storage vector. const _Vector &_vec() const { - return _vectorHashFnEqualFn.first().first(); + return _vector; } // Helper to access the hash functor. const HashFn &_hash() const { - return _vectorHashFnEqualFn.first().second(); + return *this; } // Helper to access the equality functor. const EqualKey &_equ() const { - return _vectorHashFnEqualFn.second(); + return *this; } // Helper to linear-search the vector for a key. @@ -612,17 +617,8 @@ class TfDenseHashMap } } - // Vector holding all elements along with the EqualKey functor. Since - // sizeof(EqualKey) == 0 in many cases we use a compressed_pair to not - // pay a size penalty. - - typedef - boost::compressed_pair< - boost::compressed_pair<_Vector, HashFn>, - EqualKey> - _VectorHashFnEqualFn; - - _VectorHashFnEqualFn _vectorHashFnEqualFn; + // Vector holding all elements + _Vector _vector; // Optional hash map that maps from keys to vector indices. std::unique_ptr<_HashMap> _h; diff --git a/pxr/base/tf/denseHashSet.h b/pxr/base/tf/denseHashSet.h index 01e3c7a2bd..ffc03e1b8b 100644 --- a/pxr/base/tf/denseHashSet.h +++ b/pxr/base/tf/denseHashSet.h @@ -27,14 +27,13 @@ /// \file tf/denseHashSet.h #include "pxr/pxr.h" +#include "pxr/base/arch/attributes.h" #include "pxr/base/tf/hashmap.h" #include #include -#include #include -#include PXR_NAMESPACE_OPEN_SCOPE @@ -55,7 +54,12 @@ template < class EqualElement = std::equal_to, unsigned Threshold = 128 > -class TfDenseHashSet +class ARCH_EMPTY_BASES TfDenseHashSet : + // Since sizeof(EqualElement) == 0 and sizeof(HashFn) == 0 in many cases + // we use the empty base optimization to not pay a size penalty. + // In C++20, explore using [[no_unique_address]] as an alternative + // way to get this optimization. + private HashFn, private EqualElement { public: @@ -92,20 +96,17 @@ class TfDenseHashSet /// explicit TfDenseHashSet( const HashFn &hashFn = HashFn(), - const EqualElement &equalElement = EqualElement()) - { - _hash() = hashFn; - _equ() = equalElement; - } + const EqualElement &equalElement = EqualElement()) : + HashFn(hashFn), + EqualElement(equalElement) {} /// Copy Ctor. /// TfDenseHashSet(const TfDenseHashSet &rhs) - : _vectorHashFnEqualFn(rhs._vectorHashFnEqualFn) { - if (rhs._h) { - _h.reset(new _HashMap(*rhs._h)); - } - } + : HashFn(rhs), + EqualElement(rhs), + _vector(rhs._vector), + _h(rhs._h ? std::make_unique<_HashMap>(*rhs._h) : nullptr) {} /// Move Ctor. /// @@ -178,7 +179,10 @@ class TfDenseHashSet /// Swaps the contents of two sets. /// void swap(TfDenseHashSet &rhs) { - _vectorHashFnEqualFn.swap(rhs._vectorHashFnEqualFn); + using std::swap; + swap(_hash(), rhs._hash()); + swap(_equ(), rhs._equ()); + _vector.swap(rhs._vector); _h.swap(rhs._h); } @@ -389,32 +393,32 @@ class TfDenseHashSet // Helper to access the storage vector. _Vector &_vec() { - return _vectorHashFnEqualFn.first().first(); + return _vector; } // Helper to access the hash functor. HashFn &_hash() { - return _vectorHashFnEqualFn.first().second(); + return *this; } // Helper to access the equality functor. EqualElement &_equ() { - return _vectorHashFnEqualFn.second(); + return *this; } // Helper to access the storage vector. const _Vector &_vec() const { - return _vectorHashFnEqualFn.first().first(); + return _vector; } // Helper to access the hash functor. const HashFn &_hash() const { - return _vectorHashFnEqualFn.first().second(); + return *this; } // Helper to access the equality functor. const EqualElement &_equ() const { - return _vectorHashFnEqualFn.second(); + return *this; } // Helper to create the acceleration table if size dictates. @@ -434,17 +438,8 @@ class TfDenseHashSet } } - // Vector holding all elements along with the EqualElement functor. Since - // sizeof(EqualElement) == 0 in many cases we use a compressed_pair to not - // pay a size penalty. - - typedef - boost::compressed_pair< - boost::compressed_pair<_Vector, HashFn>, - EqualElement> - _VectorHashFnEqualFn; - - _VectorHashFnEqualFn _vectorHashFnEqualFn; + // Vector holding all elements + _Vector _vector; // Optional hash map that maps from keys to vector indices. std::unique_ptr<_HashMap> _h; diff --git a/pxr/base/tf/enum.cpp b/pxr/base/tf/enum.cpp index 41a70a4c90..dd204a26f0 100644 --- a/pxr/base/tf/enum.cpp +++ b/pxr/base/tf/enum.cpp @@ -37,7 +37,6 @@ #include "pxr/base/arch/demangle.h" -#include #include "pxr/base/tf/hashmap.h" #include @@ -62,7 +61,9 @@ typedef TfHashMap _NameToEnumTableType; typedef TfHashMap, TfHash> _TypeNameToNameVectorTableType; typedef TfHashMap _TypeNameToTypeTableType; -class Tf_EnumRegistry : boost::noncopyable { +class Tf_EnumRegistry { + Tf_EnumRegistry(const Tf_EnumRegistry&) = delete; + Tf_EnumRegistry& operator=(Tf_EnumRegistry&) = delete; private: static Tf_EnumRegistry& _GetInstance() { return TfSingleton::GetInstance(); diff --git a/pxr/base/tf/enum.h b/pxr/base/tf/enum.h index 4854918b92..5a573e5693 100644 --- a/pxr/base/tf/enum.h +++ b/pxr/base/tf/enum.h @@ -36,8 +36,6 @@ #include "pxr/base/tf/safeTypeCompare.h" #include "pxr/base/tf/api.h" -#include -#include #include #include @@ -136,7 +134,7 @@ PXR_NAMESPACE_OPEN_SCOPE /// // Returns 5, sets found to \c true /// \endcode /// -class TfEnum : boost::totally_ordered +class TfEnum { public: /// Default constructor assigns integer value zero. @@ -169,6 +167,12 @@ class TfEnum : boost::totally_ordered TfSafeTypeCompare(*t._typeInfo, *_typeInfo); } + /// Inequality operator + /// \sa TfEnum::operator==(const TfEnum&) + bool operator!=(const TfEnum& t) const { + return !(*this == t); + } + /// Less than comparison. Enum values belonging to the same type are /// ordered according to their numeric value. Enum values belonging to /// different types are ordered in a consistent but arbitrary way which @@ -178,6 +182,24 @@ class TfEnum : boost::totally_ordered (!t._typeInfo->before(*_typeInfo) && _value < t._value); } + /// Less than or equal operator + /// \sa TfEnum::operator<(const TfEnum&) + bool operator<=(const TfEnum& t) const { + return !(t < *this); + } + + /// Greater than operator + /// \sa TfEnum::operator<(const TfEnum&) + bool operator>(const TfEnum& t) const { + return t < *this; + } + + /// Greater than or equal operator + /// \sa TfEnum::operator<(const TfEnum&) + bool operator>=(const TfEnum& t) const { + return !(*this < t); + } + /// True if \c *this has been assigned with \c value. template std::enable_if_t::value, bool> @@ -447,10 +469,8 @@ TF_API std::ostream& operator<<(std::ostream& out, const TfEnum & e); /// \ingroup group_tf_RuntimeTyping /// \hideinitializer #define TF_ADD_ENUM_NAME(VAL, ...) \ - TfEnum::_AddName(VAL, \ - TF_PP_STRINGIZE(VAL) \ - BOOST_PP_COMMA_IF(TF_NUM_ARGS(__VA_ARGS__)) \ - __VA_ARGS__) + TfEnum::_AddName(VAL, TF_PP_STRINGIZE(VAL), \ + std::string{__VA_ARGS__}); PXR_NAMESPACE_CLOSE_SCOPE diff --git a/pxr/base/tf/errorMark.h b/pxr/base/tf/errorMark.h index 3eae613e67..4f377aa48b 100644 --- a/pxr/base/tf/errorMark.h +++ b/pxr/base/tf/errorMark.h @@ -31,8 +31,6 @@ #include "pxr/base/tf/errorTransport.h" #include "pxr/base/tf/api.h" -#include - PXR_NAMESPACE_OPEN_SCOPE /// \class TfErrorMark @@ -63,8 +61,10 @@ PXR_NAMESPACE_OPEN_SCOPE /// } /// \endcode /// -class TfErrorMark : boost::noncopyable +class TfErrorMark { + TfErrorMark(const TfErrorMark&) = delete; + TfErrorMark& operator=(const TfErrorMark&) = delete; public: typedef TfDiagnosticMgr::ErrorIterator Iterator; diff --git a/pxr/base/tf/fileUtils.cpp b/pxr/base/tf/fileUtils.cpp index c3799d038a..d9dff3a1a7 100644 --- a/pxr/base/tf/fileUtils.cpp +++ b/pxr/base/tf/fileUtils.cpp @@ -34,8 +34,6 @@ #include "pxr/base/arch/systemInfo.h" #include "pxr/base/arch/errno.h" -#include -#include #include "pxr/base/tf/hash.h" #include "pxr/base/tf/hashset.h" diff --git a/pxr/base/tf/functionTraits.h b/pxr/base/tf/functionTraits.h new file mode 100644 index 0000000000..a220208030 --- /dev/null +++ b/pxr/base/tf/functionTraits.h @@ -0,0 +1,117 @@ +// +// Copyright 2023 Pixar +// +// Licensed under the Apache License, Version 2.0 (the "Apache License") +// with the following modification; you may not use this file except in +// compliance with the Apache License and the following modification to it: +// Section 6. Trademarks. is deleted and replaced with: +// +// 6. Trademarks. This License does not grant permission to use the trade +// names, trademarks, service marks, or product names of the Licensor +// and its affiliates, except as required to comply with Section 4(c) of +// the License and to reproduce the content of the NOTICE file. +// +// You may obtain a copy of the Apache License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the Apache License with the above modification is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the Apache License for the specific +// language governing permissions and limitations under the Apache License. +// + +#ifndef PXR_BASE_TF_FUNCTION_TRAITS_H +#define PXR_BASE_TF_FUNCTION_TRAITS_H + +#include "pxr/pxr.h" + +#include "pxr/base/tf/meta.h" + +#include +#include +#include + +PXR_NAMESPACE_OPEN_SCOPE + +// Function signature representation. +template +struct Tf_FuncSig +{ + using ReturnType = Ret; + using ArgTypes = ArgTypeList; + using ArgsTuple = TfMetaApply; + static const size_t Arity = TfMetaApply::value; + + template + using NthArg = std::tuple_element_t; +}; + +// Produce a new Tf_FuncSig from FuncSig by removing the initial "this" +// argument. +template +using Tf_RemoveThisArg = Tf_FuncSig< + typename FuncSig::ReturnType, + TfMetaApply>; + +// For callable function objects, get signature from operator(), but remove the +// 'this' arg from that. +template +struct Tf_GetFuncSig +{ + using Type = Tf_RemoveThisArg< + typename Tf_GetFuncSig< + decltype(&std::remove_reference::type::operator()) + >::Type + >; +}; + +// Member function pointers, with optional 'const' and ref-qualifiers. +template +struct Tf_GetFuncSig +{ + using Type = Tf_FuncSig>; +}; +template +struct Tf_GetFuncSig +{ + using Type = Tf_FuncSig>; +}; +template +struct Tf_GetFuncSig +{ + using Type = Tf_FuncSig>; +}; + +template +struct Tf_GetFuncSig +{ + using Type = Tf_FuncSig>; +}; +template +struct Tf_GetFuncSig +{ + using Type = Tf_FuncSig>; +}; +template +struct Tf_GetFuncSig +{ + using Type = Tf_FuncSig>; +}; + +// Regular function pointers. +template +struct Tf_GetFuncSig +{ + using Type = Tf_FuncSig>; +}; + +// Function traits. +template +using TfFunctionTraits = typename Tf_GetFuncSig::Type; + +PXR_NAMESPACE_CLOSE_SCOPE + +#endif // PXR_BASE_TF_FUNCTION_TRAITS_H + diff --git a/pxr/base/tf/meta.h b/pxr/base/tf/meta.h new file mode 100644 index 0000000000..ca5454e40d --- /dev/null +++ b/pxr/base/tf/meta.h @@ -0,0 +1,75 @@ +// +// Copyright 2023 Pixar +// +// Licensed under the Apache License, Version 2.0 (the "Apache License") +// with the following modification; you may not use this file except in +// compliance with the Apache License and the following modification to it: +// Section 6. Trademarks. is deleted and replaced with: +// +// 6. Trademarks. This License does not grant permission to use the trade +// names, trademarks, service marks, or product names of the Licensor +// and its affiliates, except as required to comply with Section 4(c) of +// the License and to reproduce the content of the NOTICE file. +// +// You may obtain a copy of the Apache License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the Apache License with the above modification is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the Apache License for the specific +// language governing permissions and limitations under the Apache License. +// + +#ifndef PXR_BASE_TF_META_H +#define PXR_BASE_TF_META_H + +#include "pxr/pxr.h" + +#include +#include +#include + +// Some small metaprogramming utilities. + +PXR_NAMESPACE_OPEN_SCOPE + +// Simple compile-time type list. +template struct TfMetaList {}; + +// Helper for TfMetaApply. +template