Hello! I’m new-ish to Omniverse and USD.
My goal is to build a custom kit app/extension to do process gaussian splat data.
Gaussian Splats are point clouds with many parameters per vertex, and my step #1 is to create a USD schema to represent them, so USD workflows can manipulate their values.
My research led me to follow this older forum post: How to introduce a new usd schema that built in C++ dll into omniverse and some extension/schema code samples to the point I got the following structure in my project:
- src/schema/gaussianSplatSchema contains schema.usda that inherits PointsBased from usdGeom and adds a whole bunch of arrays for my parameters
- src/extension/mycompany.gaussianSplatSchema contains a very basic config/extension.toml, a pretty hello-world-ish python script, and the basic files needed for the extension metadata
- deps/ and the root folder scripts follow the template set by the nvidia sample for usd plugins: GitHub - NVIDIA-Omniverse/usd-plugin-samples: USD schema extension samples, build tools, and sample kit extensions that use those schema extensions
So far so good, (I’m working on Windows btw), executing
.\link_app.bat
creates the _app shortcut successfully, pulling it from my Omniverse Code 2023.1.1 install
.\build.bat
builds the extension into _install successfully, generating the files for the usd schema as well as compiling gaussianSplatSchema.dll and gaussianSplatSchema.lib successfully, and putting them in an extension folder structure for “mycompany.gaussianSplatSchema”
However, here’s where I hit a roadbump: trying to test my extension with the following:
_app\omni.code.bat --ext-folder _install/windows-x86_64/release --enable mycompany.gaussianSplatSchema
brings up the following error:
2023-12-23 01:15:17 [1,301ms] [Error] [omni.ext.plugin] Could not load the dynamic library from c:/.../_install/windows-x86_64/release/mycompany.gaussianSplatSchema/GaussianSplatSchema/lib/gaussianSplatSchema.dll.
Error: The specified module could not be found.
(note that this may be caused by a dependent library)
[mycompany.gaussianSplatSchema] (python printing a startup hello world)
2023-12-23 01:15:17 [1,308ms] [Error] [omni.ext._impl.custom_importer] Failed to import python module GaussianSplatSchema. Error: DLL load failed while importing _gaussianSplatSchema: The specified module could not be found.. Traceback: (etc...)
So I picked up the very useful utility Dependencies from GitHub - lucasg/Dependencies: A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues. to investigate the DLL dependencies of my gaussianSplatSchema.dll file which clearly exists at the specified path.
I found that there are multiple missing ones: all the usd_*.dll and boost_python310-vc142-mt-x64-1_78.dll.
I expect the USD dlls should be linked properly when importing the extension into an omniverse app, so it’s probably NBD. However I did a search for the boost DLL on my drive to see what uses it, and I only found:
C:\packman-repo\chk\usd.py310.windows-x86_64.usdview.release\0.23.05-tc.47+v23.05.b53573ea\lib
C:\Omniverse\Library\usdview-0.23.11\lib\boost_python310-vc142-mt-x64-1_78.dll
Widening my search for boost_python3*.dll pulled up a lot more versions of the boost DLL, the most common one having the same name but ending with 1_76
instead of 1_78
. All my apps downloaded from Omniverse Launcher in particular have 1_76
(code, kit, create, etc.) with the exception of usdview.
At this point I suspect what I need is to build my extension against a version of NV-USD that includes the boost 1_76 DLL. Going back to my repo, the NV-USD it uses is usd.py310.windows-x86_64.usdview.release
version 0.23.05-tc.47+v23.05.b53573ea
as indicated by deps/usd-deps.packman.xml:
<project toolsVersion="5.6">
<dependency name="nv-usd" linkPath="../_build/usd-deps/nv-usd/${config}">
<package name="usd.py310.${platform}.usdview.${config}" version="0.23.05-tc.47+v23.05.b53573ea" />
</dependency>
<dependency name="python" linkPath="../_build/usd-deps/python">
<package name="python" version="3.10.13+nv1-${platform}" />
</dependency>
</project>
Note that the above is identical (because copied from) the configuration found in usd-plugin-samples: usd-plugin-samples/deps/usd-deps.packman.xml at main · NVIDIA-Omniverse/usd-plugin-samples · GitHub
So here’s my questions:
- It looks like I’m using the wrong nv-usd package, but how can I find what package name and version I need for the 1_76 version of the boost DLL that would be compatible with my Omniverse apps?
- This seems very fragile as the boost DLL file contains multiple version numbers and seems likely to break with future Omniverse app updates. How can I future proof things?
- This all seems really, really involved just to obtain API support for extra fields for a custom data structure in USD. Is that what typical USD development looks like, or did I overlook a simpler workflow?
[edit: I should mention that I run into the very same problem trying to load the usd schema extension built from the sample: GitHub - NVIDIA-Omniverse/usd-plugin-samples: USD schema extension samples, build tools, and sample kit extensions that use those schema extensions]
Thank you!
-Anthony