From 6806f145492920916f17612deb14c569a3cc4436 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Thu, 24 Jul 2025 22:04:02 +0200 Subject: [PATCH 01/43] Added ubuntu build instructions and beginnings of snap packaging Signed-off-by: Ken VanDine --- CMakeLinuxPresets.json | 41 +++++++ building/Ubuntu24/CMakeLists.txt | 174 ++++++++++++++++++++++++++++ building/Ubuntu24/ubuntu24_build.md | 100 ++++++++++++++++ snap/snapcraft.yaml | 83 +++++++++++++ 4 files changed, 398 insertions(+) create mode 100644 building/Ubuntu24/CMakeLists.txt create mode 100644 building/Ubuntu24/ubuntu24_build.md create mode 100644 snap/snapcraft.yaml diff --git a/CMakeLinuxPresets.json b/CMakeLinuxPresets.json index 71ea650..487db12 100644 --- a/CMakeLinuxPresets.json +++ b/CMakeLinuxPresets.json @@ -1,6 +1,47 @@ { "version": 4, "configurePresets": [ + { + "name": "ubuntu24-environment", + "hidden": true, + "environment": { + "DEPS_ROOT" : "/opt/MoonRay/installs", + "BUILD_DIR" : "${sourceParentDir}/../build", + "Boost_ROOT" : "$env{DEPS_ROOT}", + "Libuuid_ROOT" : "$env{DEPS_ROOT}", + "CppUnit_ROOT" : "$env{DEPS_ROOT}", + "ISPC" : "$env{DEPS_ROOT}/bin/ispc", + "JsonCpp_ROOT" : "$env{DEPS_ROOT}", + "Libcurl_ROOT" : "$env{DEPS_ROOT}", + "Log4cplus_ROOT" : "$env{DEPS_ROOT}", + "LUA_DIR" : "$env{DEPS_ROOT}", + "OpenSubDiv_ROOT" : "$env{DEPS_ROOT}", + "OpenVDB_ROOT" : "$env{DEPS_ROOT}", + "OPTIX_ROOT" : "$env{DEPS_ROOT}/optix", + "PXR_USD_LOCATION" : "$env{DEPS_ROOT}", + "PXR_INCLUDE_DIRS" : "$env{DEPS_ROOT}/include", + "Random123_ROOT" : "$env{DEPS_ROOT}", + "ZLIB_ROOT" : "$env{DEPS_ROOT}", + "OIIO_PYTHON" : "$env{DEPS_ROOT}/lib/python3.12/dist-packages" + }, + "cacheVariables": { + "CMAKE_PREFIX_PATH": "$env{DEPS_ROOT}", + "PYTHON_EXECUTABLE": "python3", + "BOOST_PYTHON_COMPONENT_NAME": "python312", + "ABI_VERSION": "0" + } + }, + { + "name": "ubuntu24-release", + "displayName": "Ubuntu24 Release", + "inherits": "ubuntu24-environment", + "binaryDir": "$env{BUILD_DIR}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_INSTALL_PREFIX": "${sourceParentDir}/../installs/openmoonray" + }, + "generator": "Unix Makefiles" + }, { "name": "rocky9-environment", "hidden": true, diff --git a/building/Ubuntu24/CMakeLists.txt b/building/Ubuntu24/CMakeLists.txt new file mode 100644 index 0000000..ebc39dc --- /dev/null +++ b/building/Ubuntu24/CMakeLists.txt @@ -0,0 +1,174 @@ +# Copyright 2023-2024 DreamWorks Animation LLC +# SPDX-License-Identifier: Apache-2.0 + +# These ExternalProject targets can be used to download, build and +# install many of the Moonray dependencies. +# The targets are chained using dependencies so that they run +# serially. + +cmake_minimum_required (VERSION 3.23.1) +project(openmoonray_third_party) + +include(ExternalProject) + +set(InstallRoot /opt/MoonRay/installs CACHE FILEPATH "Install root for dependencies") + +ExternalProject_Add(JsonCpp + GIT_REPOSITORY https://github.com/open-source-parsers/jsoncpp.git + GIT_TAG 5defb4ed1a4293b8e2bf641e16b156fb9de498cc # 1.9.5 + INSTALL_DIR ${InstallRoot} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:PATH= + -DBUILD_SHARED_LIBS=1 + -DPYTHON_EXECUTABLE=/usr/bin/python3 + -DJSONCPP_LIB_BUILD_SHARED:BOOL=ON + -DJSONCPP_WITH_PKGCONFIG_SUPPORT=OFF +) +set(CHAIN JsonCpp) + +ExternalProject_Add(OpenSubdiv + GIT_REPOSITORY https://github.com/PixarAnimationStudios/OpenSubdiv + GIT_TAG 8ffa2b6566be10209529d7a0d1db02a0796b160c # v3_5_0 + INSTALL_DIR ${InstallRoot} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:PATH= + -DCMAKE_BUILD_TYPE=Release + -DPYTHON_EXECUTABLE=/usr/bin/python3 + -DNO_PTEX=1 -DNO_OMP=1 -DNO_TBB=1 -DNO_CUDA=1 -DNO_GLFW_X11=1 -DNO_DOC=1 + -DNO_OPENCL=1 -DNO_CLEW=1 -DNO_REGRESSION=1 -DNO_EXAMPLES=1 -DNO_TUTORIALS=1 -DNO_GLTESTS=1 + -DNO_MACOS_FRAMEWORK=1 -DNO_METAL=1 -DNO_TESTS=1 + DEPENDS ${CHAIN} +) +set(CHAIN OpenSubdiv) + +ExternalProject_Add(OpenEXR + GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/openexr + GIT_TAG 8bc3741131db146ad08a5b83af9e6e48f0e94a03 # v2.5.7 + PATCH_COMMAND patch IlmBase/Half/CMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR}/../Imath_include_paths.patch + INSTALL_DIR ${InstallRoot} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:PATH= + -DBUILD_SHARED_LIBS=OFF + DEPENDS ${CHAIN} +) +set(CHAIN OpenEXR) + +ExternalProject_Add(Random123 + GIT_REPOSITORY https://github.com/DEShawResearch/random123 + GIT_TAG 726a093cd9a73f3ec3c8d7a70ff10ed8efec8d13 # v1.14.0 + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND make install-include prefix=${InstallRoot} + DEPENDS ${CHAIN} +) +set(CHAIN Random123) + +ExternalProject_Add(ISPC + URL https://github.com/ispc/ispc/releases/download/v1.20.0/ispc-v1.20.0-linux.tar.gz + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND cp bin/ispc ${InstallRoot}/bin + DEPENDS ${CHAIN} +) +set(CHAIN ISPC) + +ExternalProject_Add(embree + GIT_REPOSITORY https://github.com/embree/embree + GIT_TAG 341ef8c45d1ae072ead1ab65cd76e88b03d9302c # v4.2.0 + INSTALL_DIR ${InstallRoot} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:PATH= + -DEMBREE_ISPC_EXECUTABLE=/bin/ispc + -DEMBREE_ISPC_SUPPORT=ON + -DEMBREE_IGNORE_INVALID_RAYS=ON + -DEMBREE_RAY_MASK=ON + -DEMBREE_MAX_ISA=AVX512 + -DEMBREE_TUTORIALS=OFF + -DBUILD_SHARED_LIBS=ON + DEPENDS ${CHAIN} +) +set(CHAIN embree) + +ExternalProject_Add(OpenColorIO + GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/OpenColorIO + GIT_TAG 056b7b0cb0d087961e9dba75104820e44faf52a1 # v2.0.2 + INSTALL_DIR ${InstallRoot} + CMAKE_ARGS + -DOCIO_BUILD_APPS=OFF + -DOCIO_BUILD_TESTS=OFF + -DOCIO_BUILD_GPU_TESTS=OFF + -DOCIO_USE_SSE=OFF + -DOCIO_BUILD_PYTHON=OFF + -DCMAKE_INSTALL_PREFIX:PATH= + -DBUILD_SHARED_LIBS=ON + -DOCIO_BUILD_STATIC=OFF + -DCMAKE_CXX_STANDARD=17 + DEPENDS ${CHAIN} +) +set(CHAIN OpenColorIO) + +#ExternalProject_Add(OpenImageIO +# URL https://github.com/AcademySoftwareFoundation/OpenImageIO/archive/refs/tags/v2.3.21.0.tar.gz + #GIT_REPOSITORY https://github.com/OpenImageIO/oiio + #GIT_TAG v2.3.21.0 +# INSTALL_DIR ${InstallRoot} +# CMAKE_ARGS +# -DOpenEXR_ROOT= +# -DCMAKE_INSTALL_PREFIX:PATH= +# -DUSE_QT=0 +# -DUSE_PYTHON=1 +# -DUSE_Ptex=OFF +# -DUSE_Nuke=OFF +# -DOIIO_BUILD_TESTS=0 +# -DOIIO_BUILD_TOOLS=0 +# DEPENDS ${CHAIN} +#) +#set(CHAIN OpenImageIO) + +ExternalProject_Add(OpenImageDenoise + URL https://github.com/OpenImageDenoise/oidn/releases/download/v2.0.1/oidn-2.0.1.src.tar.gz + INSTALL_DIR ${InstallRoot} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:PATH= + -DISPC_EXECUTABLE=/bin/ispc + -DTBB_ROOT= + -DOIDN_APPS=OFF + DEPENDS ${CHAIN} +) +set(CHAIN OpenImageDenoise) + +if(NOT NO_USD) + ExternalProject_Add(USD + GIT_REPOSITORY https://github.com/PixarAnimationStudios/USD + GIT_TAG 0c7b9a95f155c221ff7df9270a39a52e3b23af8b # v22.11 + INSTALL_DIR ${InstallRoot} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:PATH= + -DCMAKE_PREFIX_PATH= + -DPXR_ENABLE_PYTHON_SUPPORT=ON + -DPXR_USE_PYTHON_3=ON + -DPYTHON_LIBRARIES=/usr/python3/dist-packages + -DPYTHON_INCLUDE_DIRS=/usr/include + -DBoost_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu + -DBoost_INCLUDE_DIR=/usr/include + -DTBB_USE_DEBUG_BUILD=OFF + -DTBB_ROOT_DIR=/usr + -DTBB_LIBRARIES=/usr/lib/x86_64-linux-gnu + -DTBB_INCLUDE_DIRS=/usr/include .. + -DPXR_BUILD_TESTS=OFF + -DPXR_BUILD_EXAMPLES=OFF + -DPXR_BUILD_TUTORIALS=OFF + -DPXR_BUILD_USD_TOOLS=OFF + -DPXR_ENABLE_PTEX_SUPPORT=OFF + -DPXR_ENABLE_OPENVDB_SUPPORT=OFF + -DPXR_BUILD_USDVIEW=OFF + -DBoost_NO_BOOST_CMAKE=ON + -DBoost_NO_SYSTEM_PATHS=ON + -DTBB_SUPPRESS_DEPRECATED_MESSAGES=1 + DEPENDS ${CHAIN} + ) + set(CHAIN USD) +endif() + diff --git a/building/Ubuntu24/ubuntu24_build.md b/building/Ubuntu24/ubuntu24_build.md new file mode 100644 index 0000000..6a385b9 --- /dev/null +++ b/building/Ubuntu24/ubuntu24_build.md @@ -0,0 +1,100 @@ +# Building MoonRay on Ubuntu 24.04 + +Start with reading the [general build instructions](../general_build). + +--- +## Base Requirements +* CMake 3.23.1 (or greater) + +* If you want to include MoonRay GPU support (XPU mode), you will also need to download the NVIDIA Optix headers + (from [here](https://developer.nvidia.com/designworks/optix/downloads/legacy)), which require an EULA. + Be sure to download version 7.6, as MoonRay is not yet compatible with their more recent releases. + Once you have extracted the downloaded contents, note the location of the header files (under *include*): these will be copied to */usr/local/include* in step 3 below. + +--- +### Step 1. Create the folders +Create a clean root folder for moonray. Attempting to build atop a previous installation may cause issues. +The folders can be created in the location of your choosing, but these instruction, the provided CMake presets, +and several of the scripts mentioned below assume this location/structure. +```bash +mkdir -p /opt/MoonRay/{installs,build,build-deps,source} +mkdir -p /opt/MoonRay/installs/{bin,lib,include} +``` + +--- +### Step 2. Clone the OpenMoonRay source +```bash +sudo apt install -y git git-lfs +cd /opt/MoonRay/source +git clone --recurse-submodules https://github.com/dreamworksanimation/openmoonray.git +``` + +Note: If building for Houdini, you'll potentially need to make the following changes before proceeding: +* Edit source/openmoonray/CMakeLinuxPresets.json to update HOUDINI_INSTALL_DIR +* Edit source/openmoonray/scripts/Ubuntu24/setupHoudini.sh to update HOUDINI_PATH +* Edit source/openmoonray/building/Ubuntu24/pxr-houdini/pxrTargets.cmake to update HPYTHONLIB and HPYTHONINC if needed + +--- +### Step 3. Install some of the dependencies via script/package manager +```bash +sudo source openmoonray/building/Ubuntu24/install_packages.sh +sudo apt install nvidia-cuda-toolkit +``` +You can add arguments `--nocuda` and `--noqt` to skip GPU and GUI support respectively. +If you are building with GPU support, copy the Optix headers that you downloaded and extracted into */usr/local* + +```bash +cp -r /tmp/optix/include/* /usr/local/include +``` + +--- +### Step 4. Build the remaining dependencies from source +Note: If building for Houdini you'll need to build moonray against Houdini's USD libraries. +You'll want to skip building USD during this step by adding `-DNOUSD=1` to the first cmake +command below: `cmake -DNO_USD=1 ../source/openmoonray/building/Ubuntu24`. You should clean +the build-deps/ and installs/ directory if you have previously installed the dependencies +without passing -DNOUSD=1, to remove any USD related files or step 5 may fail to link to +Houdini's USD libs. +``` +cd /opt/MoonRay/build-deps +cmake ../source/openmoonray/building/Ubuntu24 +cmake --build . -- -j $(nproc) +``` + +--- +### Step 5. Build MoonRay +Note: If building for Houdini, replace ubuntu24-release presets below with ubuntu24-houdini-release +``` +cd /opt/MoonRay/source/openmoonray +cmake --preset ubuntu24-release +cmake --build --preset ubuntu24-release -- -j $(nproc) +``` + +--- +### Step 6. Run/Test +``` +source /opt/MoonRay/installs/openmoonray/scripts/setup.sh +cd /opt/MoonRay/source/openmoonray/testdata +moonray_gui -exec_mode xpu -info -in curves.rdla +``` + +HOUDINI: +Open a terminal and run: +``` +cd /opt/hfs20.0 # location of houdini install +source houdini_setup +source /opt/MoonRay/source/openmoonray/scripts/Ubuntu24/setupHoudini.sh +houdini +``` + +In the Main menu bar at top select Desktop->Solaris +In the Scene View tab on the main window, change from "obj" to "stage". +Click in the Solaris network editor, hit tab, type "sphere" and hit enter to place a sphere on the stage. +In the viewport menu, click on "Persp" and select "Moonray", this should trigger rendering. + +--- +### Step 8. Post-build/install Cleanup +``` +rm -rf /opt/MoonRay/{build,build-deps} +``` + diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 0000000..bd655fa --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,83 @@ +name: openmoonray +base: core24 +adopt-info: openmoonray +summary: openmoonray +description: | + openmoonray + +grade: stable +confinement: strict + +parts: + openmoonray: + plugin: cmake + source: . + build-packages: + - git + - git-lfs + - libopengl-dev + - libglx-dev + - libglvnd-dev + - pybind11-dev + - python3-dev + - bison + - flex + - wget + - libgif-dev + - libmng-dev + - libtiff-dev + - libjpeg-dev + - libatomic1 + - libuuid1 + - libssl-dev + - libcurl4-openssl-dev + - libfreetype-dev + - zlib1g-dev + - libcgroup-dev + - libblosc-dev + - libboost-chrono-dev + - libboost-date-time-dev + - libboost-filesystem-dev + - libboost-python-dev + - libboost-program-options-dev + - libboost-regex-dev + - libboost-thread-dev + - libboost-system-dev + - liblua5.4-dev + - liblog4cplus-dev + - libcppunit-dev + - libtbb-dev + - libopenvdb-dev + - python3-numpy + - gcc-9 + - g++-9 + - libsquish-dev + - libturbojpeg0-dev + - libdcmtk-dev + - libheif-dev + - libraw-dev + - libptexenc-dev + - libopencv-dev + - libopenjp2-7-dev + - qtbase5-dev + - libqt5opengl5-dev + - clang-format + - python3-jinja2 + - uuid-dev + build-environment: + - CC: /usr/bin/gcc-9 + - CXX: /usr/bin/g++-9 + - PYTHON_VERSION: 3.12 + override-pull: | + craftctl default + craftctl set version=$(git describe --abbrev=8 |sed -e 's/openmoonray-//g') + override-build: | + mkdir -p /opt/MoonRay/{installs,build,build-deps,source} + mkdir -p /opt/MoonRay/installs/{bin,lib,include} + cd /opt/MoonRay/build-deps + cmake -DCMAKE_INSTALL_PREFIX=$CRAFT_PART_INSTALL -DNO_USD=1 $CRAFT_PART_SRC/building/Ubuntu24/ + cmake --build . -- -j $(nproc) + cd $CRAFT_PART_SRC + cmake --preset ubuntu24-release + cmake --build --preset ubuntu24-release -- -j $(nproc) + cp -rp /opt/MoonRay/installs $CRAFT_PART_INSTALL/ From b88a4a68de8232e6e64da762f0c16bef6148effc Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Fri, 25 Jul 2025 18:13:59 +0200 Subject: [PATCH 02/43] iterating Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index bd655fa..14b6824 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -64,6 +64,8 @@ parts: - clang-format - python3-jinja2 - uuid-dev + - libmicrohttpd-dev + - qtscript5-dev build-environment: - CC: /usr/bin/gcc-9 - CXX: /usr/bin/g++-9 @@ -80,4 +82,18 @@ parts: cd $CRAFT_PART_SRC cmake --preset ubuntu24-release cmake --build --preset ubuntu24-release -- -j $(nproc) - cp -rp /opt/MoonRay/installs $CRAFT_PART_INSTALL/ + cp -rp /opt $CRAFT_PART_INSTALL/ + prime: + - opt + +apps: + openmoonray: + command: opt/MoonRay/installs/bin/moonray_gui + plugs: + - home + - network + - audio-playback + - audio-record + - desktop + - x11 + - wayland From d3b9b5d2dbae87ce25642064bffd231d6499db59 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 09:22:20 +0100 Subject: [PATCH 03/43] Added openimageio Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 14b6824..fae40f9 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -66,6 +66,7 @@ parts: - uuid-dev - libmicrohttpd-dev - qtscript5-dev + - libopenimageio-dev build-environment: - CC: /usr/bin/gcc-9 - CXX: /usr/bin/g++-9 From 55980e1c64b70d9277458efddd2899e40e4f8bd8 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 09:48:04 +0100 Subject: [PATCH 04/43] Merged some changes from Jeff Signed-off-by: Ken VanDine --- building/Ubuntu24/CMakeLists.txt | 36 ++++++++++++++------------------ snap/snapcraft.yaml | 1 - 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/building/Ubuntu24/CMakeLists.txt b/building/Ubuntu24/CMakeLists.txt index ebc39dc..eefecfc 100644 --- a/building/Ubuntu24/CMakeLists.txt +++ b/building/Ubuntu24/CMakeLists.txt @@ -43,8 +43,8 @@ set(CHAIN OpenSubdiv) ExternalProject_Add(OpenEXR GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/openexr - GIT_TAG 8bc3741131db146ad08a5b83af9e6e48f0e94a03 # v2.5.7 - PATCH_COMMAND patch IlmBase/Half/CMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR}/../Imath_include_paths.patch + GIT_TAG fad1d1a9dc188aceabbea1313580d73b7236b79b # v3.1.13 refplat 2023 + #PATCH_COMMAND patch IlmBase/Half/CMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR}/../Imath_include_paths.patch INSTALL_DIR ${InstallRoot} CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= @@ -93,7 +93,7 @@ set(CHAIN embree) ExternalProject_Add(OpenColorIO GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/OpenColorIO - GIT_TAG 056b7b0cb0d087961e9dba75104820e44faf52a1 # v2.0.2 + GIT_TAG d1ef24cbf8021f642e42f45f50c2cd4cc77141ce # v2.2.1 INSTALL_DIR ${InstallRoot} CMAKE_ARGS -DOCIO_BUILD_APPS=OFF @@ -109,23 +109,19 @@ ExternalProject_Add(OpenColorIO ) set(CHAIN OpenColorIO) -#ExternalProject_Add(OpenImageIO -# URL https://github.com/AcademySoftwareFoundation/OpenImageIO/archive/refs/tags/v2.3.21.0.tar.gz - #GIT_REPOSITORY https://github.com/OpenImageIO/oiio - #GIT_TAG v2.3.21.0 -# INSTALL_DIR ${InstallRoot} -# CMAKE_ARGS -# -DOpenEXR_ROOT= -# -DCMAKE_INSTALL_PREFIX:PATH= -# -DUSE_QT=0 -# -DUSE_PYTHON=1 -# -DUSE_Ptex=OFF -# -DUSE_Nuke=OFF -# -DOIIO_BUILD_TESTS=0 -# -DOIIO_BUILD_TOOLS=0 -# DEPENDS ${CHAIN} -#) -#set(CHAIN OpenImageIO) +ExternalProject_Add(OpenImageIO + GIT_REPOSITORY https://github.com/OpenImageIO/oiio + GIT_TAG f32bf6e6f8de38ab6d197a72fd72366b66fd30a3 # 2.5.19 + INSTALL_DIR ${InstallRoot} + CMAKE_ARGS + -DOpenEXR_ROOT= + -DCMAKE_INSTALL_PREFIX:PATH= + -DUSE_QT=0 + -DUSE_PYTHON=1 + -DCMAKE_CXX_STANDARD=17 # or the dicom build fails with C++17 issues + DEPENDS ${CHAIN} +) +set(CHAIN OpenImageIO) ExternalProject_Add(OpenImageDenoise URL https://github.com/OpenImageDenoise/oidn/releases/download/v2.0.1/oidn-2.0.1.src.tar.gz diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index fae40f9..14b6824 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -66,7 +66,6 @@ parts: - uuid-dev - libmicrohttpd-dev - qtscript5-dev - - libopenimageio-dev build-environment: - CC: /usr/bin/gcc-9 - CXX: /usr/bin/g++-9 From 502e66fe3edb50e22b786d6d26eb4a78c00f8b41 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 10:15:41 +0100 Subject: [PATCH 05/43] iterating Signed-off-by: Ken VanDine --- moonray/CMakeLists.txt | 4 ++-- snap/snapcraft.yaml | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/moonray/CMakeLists.txt b/moonray/CMakeLists.txt index 737f3c3..2087863 100644 --- a/moonray/CMakeLists.txt +++ b/moonray/CMakeLists.txt @@ -1,11 +1,11 @@ # Copyright 2023-2025 DreamWorks Animation LLC # SPDX-License-Identifier: Apache-2.0 -add_subdirectory(hydra) +#add_subdirectory(hydra) add_subdirectory(mcrt_denoise) add_subdirectory(moonray) add_subdirectory(moonray_arras) -add_subdirectory(moonray_dcc_plugins) +#add_subdirectory(moonray_dcc_plugins) add_subdirectory(moonshine) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/moonshine_dwa) add_subdirectory(moonshine_dwa) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 14b6824..b3cad46 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -66,6 +66,8 @@ parts: - uuid-dev - libmicrohttpd-dev - qtscript5-dev + - libnsl-dev + - nvidia-cuda-toolkit build-environment: - CC: /usr/bin/gcc-9 - CXX: /usr/bin/g++-9 From c2106233fe2d48e4679fdf9218ed5685e4ec57ef Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 10:30:09 +0100 Subject: [PATCH 06/43] Added nvidia package-repositories Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index b3cad46..3b3d928 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -8,6 +8,14 @@ description: | grade: stable confinement: strict +package-repositories: + - type: apt + formats: [deb] + architectures: [amd64] + path: / + key-id: EB693B3035CD5710E231E123A4B469963BF863CC + url: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 + parts: openmoonray: plugin: cmake @@ -68,6 +76,7 @@ parts: - qtscript5-dev - libnsl-dev - nvidia-cuda-toolkit + - nvidia-cuda-dev build-environment: - CC: /usr/bin/gcc-9 - CXX: /usr/bin/g++-9 From f244f1c9c1f27f9ccf30f4b955d8f4107ffdbf93 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 10:49:30 +0100 Subject: [PATCH 07/43] disable optix Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 3b3d928..d6074a8 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -88,7 +88,7 @@ parts: mkdir -p /opt/MoonRay/{installs,build,build-deps,source} mkdir -p /opt/MoonRay/installs/{bin,lib,include} cd /opt/MoonRay/build-deps - cmake -DCMAKE_INSTALL_PREFIX=$CRAFT_PART_INSTALL -DNO_USD=1 $CRAFT_PART_SRC/building/Ubuntu24/ + cmake -DCMAKE_INSTALL_PREFIX=$CRAFT_PART_INSTALL -DNO_USD=1 -DMOONRAY_USE_OPTIX=NO $CRAFT_PART_SRC/building/Ubuntu24/ cmake --build . -- -j $(nproc) cd $CRAFT_PART_SRC cmake --preset ubuntu24-release From 94d1b471edb1793c50768c4487e3ccec2ad95613 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 10:59:15 +0100 Subject: [PATCH 08/43] disable optix properly Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index d6074a8..23d6c3d 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -88,10 +88,10 @@ parts: mkdir -p /opt/MoonRay/{installs,build,build-deps,source} mkdir -p /opt/MoonRay/installs/{bin,lib,include} cd /opt/MoonRay/build-deps - cmake -DCMAKE_INSTALL_PREFIX=$CRAFT_PART_INSTALL -DNO_USD=1 -DMOONRAY_USE_OPTIX=NO $CRAFT_PART_SRC/building/Ubuntu24/ + cmake -DCMAKE_INSTALL_PREFIX=$CRAFT_PART_INSTALL -DNO_USD=1 $CRAFT_PART_SRC/building/Ubuntu24/ cmake --build . -- -j $(nproc) cd $CRAFT_PART_SRC - cmake --preset ubuntu24-release + cmake --preset ubuntu24-release -DMOONRAY_USE_OPTIX=NO cmake --build --preset ubuntu24-release -- -j $(nproc) cp -rp /opt $CRAFT_PART_INSTALL/ prime: From 7978c4f32e53070623ec15862b5705c3a381e0cd Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 11:12:54 +0100 Subject: [PATCH 09/43] Added ubuntu24 presets Signed-off-by: Ken VanDine --- CMakeLinuxPresets.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CMakeLinuxPresets.json b/CMakeLinuxPresets.json index 487db12..2f4996f 100644 --- a/CMakeLinuxPresets.json +++ b/CMakeLinuxPresets.json @@ -113,6 +113,13 @@ } ], "buildPresets": [ + { + "name": "ubuntu24-release", + "displayName": "Ubuntu24 Release", + "configurePreset": "ubuntu24-release", + "configuration": "Release", + "targets": ["install"] + }, { "name": "rocky9-release", "displayName": "Rocky9 Release", From d699849978b860f5b0ab22263f87b05a1a03ed41 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 11:17:48 +0100 Subject: [PATCH 10/43] added lua Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 23d6c3d..58326ea 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -51,6 +51,7 @@ parts: - libboost-regex-dev - libboost-thread-dev - libboost-system-dev + - lua5.4 - liblua5.4-dev - liblog4cplus-dev - libcppunit-dev From 6998eb9899b353ee1bab9d0dab8801b7e802d625 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 11:37:31 +0100 Subject: [PATCH 11/43] Added external TBB Signed-off-by: Ken VanDine --- building/Ubuntu24/CMakeLists.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/building/Ubuntu24/CMakeLists.txt b/building/Ubuntu24/CMakeLists.txt index eefecfc..1d9185a 100644 --- a/building/Ubuntu24/CMakeLists.txt +++ b/building/Ubuntu24/CMakeLists.txt @@ -135,6 +135,18 @@ ExternalProject_Add(OpenImageDenoise ) set(CHAIN OpenImageDenoise) +# NEW, make sure this isn't before OIIO or it breaks OIIO +ExternalProject_Add(TBB + URL https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2020.3.3.tar.gz + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND "" + BUILD_COMMAND make ${JOBS_ARG} arch=amd64 + INSTALL_COMMAND bash -c "cp build/*_release/libtbb*.* ${InstallRoot}/lib" + COMMAND bash -c "cp -r include/tbb ${InstallRoot}/include" + DEPENDS ${CHAIN} +) +set(CHAIN TBB) + if(NOT NO_USD) ExternalProject_Add(USD GIT_REPOSITORY https://github.com/PixarAnimationStudios/USD From 2a9b9c260dc9ecb7f5bcbc62495d363b40632d63 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 13:33:48 +0100 Subject: [PATCH 12/43] Added stage packages Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 192 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 190 insertions(+), 2 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 58326ea..c79a6a0 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -78,6 +78,193 @@ parts: - libnsl-dev - nvidia-cuda-toolkit - nvidia-cuda-dev + - ispc + stage-packages: + - libaec0 + - libaom3 + - libarmadillo12 + - libarpack2t64 + - libatomic1 + - libavcodec60 + - libavformat60 + - libavutil58 + - libblas3 + - libblosc1 + - libbluray2 + - libboost-filesystem1.83.0 + - libboost-iostreams1.83.0 + - libboost-program-options1.83.0 + - libboost-thread1.83.0 + - libcairo-gobject2 + - libcairo2 + - libcfitsio10t64 + - libcharls2 + - libchromaprint1 + - libcjson1 + - libcodec2-1.2 + - libcppunit-1.15-0 + - libcurl3t64-gnutls + - libcurl4t64 + - libdatrie1 + - libdav1d7 + - libdc1394-25 + - libdcmtk17t64 + - libdeflate0 + - libdouble-conversion3 + - libdw1t64 + - libexif12 + - libfontconfig1 + - libfreexl1 + - libfribidi0 + - libfyba0t64 + - libgdal34t64 + - libgdcm3.0t64 + - libgdk-pixbuf-2.0-0 + - libgeos-c1t64 + - libgeos3.12.1t64 + - libgeotiff5 + - libgfortran5 + - libgif7 + - libgl1 + - libglvnd0 + - libglx0 + - libgme0 + - libgomp1 + - libgphoto2-6t64 + - libgphoto2-port12t64 + - libgraphite2-3 + - libgsm1 + - libgstreamer-plugins-base1.0-0 + - libgstreamer1.0-0 + - libharfbuzz0b + - libhdf4-0-alt + - libhdf5-103-1t64 + - libhdf5-hl-100t64 + - libheif1 + - libhwy1t64 + - libicu74 + - libimath-3-1-29t64 + - libjbig0 + - libjpeg-turbo8 + - libjxl0.7 + - libkmlbase1t64 + - libkmldom1t64 + - libkmlengine1t64 + - liblapack3 + - liblcms2-2 + - libldap2 + - liblerc4 + - liblog4cplus-2.0.5t64 + - libltdl7 + - liblua5.4-0 + - libmbedcrypto7t64 + - libmd4c0 + - libmicrohttpd12t64 + - libminizip1t64 + - libmp3lame0 + - libmpg123-0t64 + - libmysqlclient21 + - libnetcdf19t64 + - libnghttp2-14 + - libnorm1t64 + - libnspr4 + - libnss3 + - libnuma1 + - libodbc2 + - libodbcinst2 + - libogdi4.1 + - libogg0 + - libopencv-core406t64 + - libopencv-imgcodecs406t64 + - libopencv-imgproc406t64 + - libopencv-videoio406t64 + - libopenexr-3-1-30 + - libopengl0 + - libopenjp2-7 + - libopenmpt0t64 + - libopenvdb10.0t64 + - libopus0 + - liborc-0.4-0t64 + - libpango-1.0-0 + - libpangocairo-1.0-0 + - libpangoft2-1.0-0 + - libpcre2-16-0 + - libpgm-5.3-0t64 + - libpixman-1-0 + - libpoppler134 + - libpq5 + - libproj25 + - libpsl5t64 + - libqhull-r8.0 + - libqt5core5t64 + - libqt5gui5t64 + - libqt5opengl5t64 + - libqt5script5 + - libqt5widgets5t64 + - librabbitmq4 + - librav1e0 + - libraw1394-11 + - libraw23t64 + - librist4 + - librsvg2-2 + - librtmp1 + - librttopo1 + - libsasl2-2 + - libsharpyuv0 + - libshine3 + - libsnappy1v5 + - libsodium23 + - libsoxr0 + - libspatialite8t64 + - libspeex1 + - libsrt1.5-gnutls + - libssh-4 + - libssh-gcrypt-4 + - libsuperlu6 + - libsvtav1enc1d1 + - libswresample4 + - libswscale7 + - libsz2 + - libtbb12 + - libthai0 + - libtheora0 + - libtiff6 + - libtwolame0 + - libudfread0 + - libunwind8 + - liburiparser1 + - libusb-1.0-0 + - libva-drm2 + - libva-x11-2 + - libva2 + - libvdpau1 + - libvorbis0a + - libvorbisenc2 + - libvorbisfile3 + - libvpl2 + - libvpx9 + - libwebp7 + - libwebpdemux2 + - libwebpmux3 + - libx11-6 + - libx11-xcb1 + - libx264-164 + - libx265-199 + - libxau6 + - libxcb-dri3-0 + - libxcb-render0 + - libxcb-shm0 + - libxcb1 + - libxdmcp6 + - libxerces-c3.2t64 + - libxext6 + - libxfixes3 + - libxml2 + - libxrender1 + - libxvidcore4 + - libzmq5 + - libzvbi0t64 + - ocl-icd-libopencl1 build-environment: - CC: /usr/bin/gcc-9 - CXX: /usr/bin/g++-9 @@ -92,15 +279,16 @@ parts: cmake -DCMAKE_INSTALL_PREFIX=$CRAFT_PART_INSTALL -DNO_USD=1 $CRAFT_PART_SRC/building/Ubuntu24/ cmake --build . -- -j $(nproc) cd $CRAFT_PART_SRC - cmake --preset ubuntu24-release -DMOONRAY_USE_OPTIX=NO + cmake --preset ubuntu24-release -DMOONRAY_USE_OPTIX=NO -DMOONRAY_BUILD_TESTING=NO cmake --build --preset ubuntu24-release -- -j $(nproc) + cp -rp $CRAFT_PART_SRC/../../installs/* /opt/MoonRay/installs/ cp -rp /opt $CRAFT_PART_INSTALL/ prime: - opt apps: openmoonray: - command: opt/MoonRay/installs/bin/moonray_gui + command: opt/MoonRay/installs/openmoonray/bin/moonray_gui plugs: - home - network From 27867e1a5ca68741688dc74ead11c396d19c85de Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 14:04:37 +0100 Subject: [PATCH 13/43] set LD_LIBRARY_PATH Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index c79a6a0..0344eaa 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -289,6 +289,8 @@ parts: apps: openmoonray: command: opt/MoonRay/installs/openmoonray/bin/moonray_gui + environment: + LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu plugs: - home - network From ff4d089eb0ec03d8e3e9637d280e73c3a619fdd0 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 14:20:33 +0100 Subject: [PATCH 14/43] prime the staged libs Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 0344eaa..14c6720 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -285,6 +285,7 @@ parts: cp -rp /opt $CRAFT_PART_INSTALL/ prime: - opt + - usr/lib apps: openmoonray: From 5215a08024406ff1be73cae7206d3370b6d3bf66 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 14:42:59 +0100 Subject: [PATCH 15/43] more deps Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 14c6720..158dc57 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -265,6 +265,9 @@ parts: - libzmq5 - libzvbi0t64 - ocl-icd-libopencl1 + - libpython3.12t64 + - libze1 + - libboost-python1.83.0 build-environment: - CC: /usr/bin/gcc-9 - CXX: /usr/bin/g++-9 @@ -291,7 +294,7 @@ apps: openmoonray: command: opt/MoonRay/installs/openmoonray/bin/moonray_gui environment: - LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu + LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas plugs: - home - network From 29fdf3744ae0c30a300dc643e52c40aaca18179c Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 16:33:00 +0100 Subject: [PATCH 16/43] Working version Signed-off-by: Ken VanDine --- snap/local/desktop-launch | 641 ++++++++++++++++++++++++++++++++++++++ snap/snapcraft.yaml | 41 ++- 2 files changed, 678 insertions(+), 4 deletions(-) create mode 100644 snap/local/desktop-launch diff --git a/snap/local/desktop-launch b/snap/local/desktop-launch new file mode 100644 index 0000000..71fdbe2 --- /dev/null +++ b/snap/local/desktop-launch @@ -0,0 +1,641 @@ +#!/bin/bash +#Copyright (c) 2017 Canonical +#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. + +export PATH=${SNAP}/usr/local/bin:${PATH} +export LD_LIBRARY_PATH=${SNAP}/usr/local/lib:${LD_LIBRARY_PATH} +export CLING_STANDARD_PCH=none +unset old_rootsys +unset DYLD_LIBRARY_PATH +unset SHLIB_PATH +unset LIBPATH +unset MANPATH +unset JUPYTER_PATH +unset JUPYTER_CONFIG_DIR +export ROOTSYS=${SNAP}/usr/local + +################# +# Launcher init # +################# + +START=$(date +%s.%N) + +declare -A PIDS +function async_exec() { + $@ & + PIDS[$!]=$@ +} +function wait_for_async_execs() { + for i in ${!PIDS[@]} + do + wait $i && continue || echo "ERROR: ${PIDS[$i]} exited abnormally with status $?" + done +} + +# ensure_dir_exists calls `mkdir -p` if the given path is not a directory. +# This speeds up execution time by avoiding unnecessary calls to mkdir. +# +# Usage: ensure_dir_exists []... +# +function ensure_dir_exists() { + [ -d "$1" ] || mkdir -p "$@" +} + +# On Fedora $SNAP is under /var and there is some magic to map it to /snap. +# # We need to handle that case and reset $SNAP +SNAP=`echo $SNAP | sed -e "s|/var/lib/snapd||g"` + +needs_update=true + +. $SNAP_USER_DATA/.last_revision 2>/dev/null || true +if [ "$SNAP_DESKTOP_LAST_REVISION" = "$SNAP_REVISION" ]; then + needs_update=false +fi + +# Set $REALHOME to the users real home directory +REALHOME=`getent passwd $UID | cut -d ':' -f 6` + +# Set config folder to local path +export XDG_CONFIG_HOME=$SNAP_USER_DATA/.config +ensure_dir_exists $XDG_CONFIG_HOME -m 700 + +# If the user has modified their user-dirs settings, force an update +if [[ -f "$XDG_CONFIG_HOME/user-dirs.dirs.md5sum" ]]; then + if [[ "$(md5sum < "$REALHOME/.config/user-dirs.dirs")" != "$(cat "$XDG_CONFIG_HOME/user-dirs.dirs.md5sum")" || + ( -f "$XDG_CONFIG_HOME/user-dirs.locale.md5sum" && + "$(md5sum < "$REALHOME/.config/user-dirs.locale")" != "$(cat "$XDG_CONFIG_HOME/user-dirs.locale.md5sum")" ) ]]; then + needs_update=true + fi +else + needs_update=true +fi + +if [ "$SNAP_ARCH" == "amd64" ]; then + ARCH="x86_64-linux-gnu" +elif [ "$SNAP_ARCH" == "armhf" ]; then + ARCH="arm-linux-gnueabihf" +elif [ "$SNAP_ARCH" == "arm64" ]; then + ARCH="aarch64-linux-gnu" +elif [ "$SNAP_ARCH" == "ppc64el" ]; then + ARCH="powerpc64le-linux-gnu" +else + ARCH="$SNAP_ARCH-linux-gnu" +fi + +export SNAP_LAUNCHER_ARCH_TRIPLET=$ARCH + +# Don't LD_PRELOAD bindtextdomain for classic snaps +if ! grep -qs "^\s*confinement:\s*classic\s*" $SNAP/meta/snap.yaml; then + if [ -f $SNAP/lib/bindtextdomain.so ]; then + export LD_PRELOAD=$LD_PRELOAD:$SNAP/lib/bindtextdomain.so + fi +fi + +############################################### +# Launcher common exports for any desktop app # +############################################### + +function prepend_dir() { + local var="$1" + local dir="$2" + if [ -d "$dir" ]; then + eval "export $var=\"\$dir\${$var:+:\$$var}\"" + fi +} + +function append_dir() { + local var="$1" + local dir="$2" + if [ -d "$dir" ]; then + eval "export $var=\"\${$var:+\$$var:}\$dir\"" + fi +} + +function can_open_file() { + return `head -c0 "$1" &> /dev/null`; +} + +function update_xdg_dirs_values() { + local save_initial_values=false + local XDG_DIRS="DOCUMENTS DESKTOP DOWNLOAD MUSIC PICTURES VIDEOS PUBLICSHARE TEMPLATES" + unset XDG_SPECIAL_DIRS_PATHS + + if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs" ]; then + source "${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs" + fi + + if [ -z ${XDG_SPECIAL_DIRS+x} ]; then + save_initial_values=true + fi + + for d in $XDG_DIRS; do + var="XDG_${d}_DIR" + value="$(eval echo $(echo \$${var}))" + + if [ "$save_initial_values" = true ]; then + XDG_SPECIAL_DIRS+=("$var") + XDG_SPECIAL_DIRS_INITIAL_PATHS+=("$value") + fi + + XDG_SPECIAL_DIRS_PATHS+=("$value") + done +} + +function is_subpath() { + dir=$(realpath $1) + parent=$(realpath $2) + [ "${dir##$parent/}" != "$dir" ] && return 0 || return 1 +} + +WITH_RUNTIME=no +if [ -z "$RUNTIME" ]; then + RUNTIME=$SNAP +else + # add general paths not added by snapcraft due to runtime snap + append_dir LD_LIBRARY_PATH $RUNTIME/lib/$ARCH + append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib + append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH + append_dir PATH $RUNTIME/usr/bin + WITH_RUNTIME=yes +fi + +# XKB config +export XKB_CONFIG_ROOT=$RUNTIME/usr/share/X11/xkb + +# Give XOpenIM a chance to locate locale data. +# This is required for text input to work in SDL2 games. +export XLOCALEDIR=$RUNTIME/usr/share/X11/locale + +# Set XCursors path +export XCURSOR_PATH=$RUNTIME/usr/share/icons +prepend_dir XCURSOR_PATH $SNAP/data-dir/icons + +# Mesa Libs for OpenGL support +append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/mesa +append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/mesa-egl + +# Tell libGL and libva where to find the drivers +export LIBGL_DRIVERS_PATH=$RUNTIME/usr/lib/$ARCH/dri +append_dir LD_LIBRARY_PATH $LIBGL_DRIVERS_PATH +export LIBVA_DRIVERS_PATH=$RUNTIME/usr/lib/$ARCH/dri + +# Set where the VDPAU drivers are located +export VDPAU_DRIVER_PATH="/usr/lib/$ARCH/vdpau/" +if [ -e "/var/lib/snapd/lib/gl/vdpau/libvdpau_nvidia.so" ]; then + export VDPAU_DRIVER_PATH="/var/lib/snapd/lib/gl/vdpau" + # Prevent picking VA-API (Intel/AMD) over NVIDIA VDPAU; on PRIME systems for example + unset LIBVA_DRIVERS_PATH +fi + +# Unity7 export (workaround for https://launchpad.net/bugs/1638405) +append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/libunity + +# Pulseaudio export +append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/pulseaudio + +# EGL vendor files on glvnd enabled systems +[ -d /var/lib/snapd/lib/glvnd/egl_vendor.d ] && \ + prepend_dir __EGL_VENDOR_LIBRARY_DIRS /var/lib/snapd/lib/glvnd/egl_vendor.d + +# EGL vendor files +append_dir __EGL_VENDOR_LIBRARY_DIRS $RUNTIME/etc/glvnd/egl_vendor.d +append_dir __EGL_VENDOR_LIBRARY_DIRS $RUNTIME/usr/share/glvnd/egl_vendor.d + +# Tell GStreamer where to find its plugins +export GST_PLUGIN_PATH=$SNAP/usr/lib/$ARCH/gstreamer-1.0 +export GST_PLUGIN_SYSTEM_PATH=$RUNTIME/usr/lib/$ARCH/gstreamer-1.0 +# gst plugin scanner doesn't install in the correct path: https://github.com/ubuntu/snapcraft-desktop-helpers/issues/43 +export GST_PLUGIN_SCANNER=$RUNTIME/usr/lib/$ARCH/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner + +# XDG Config +[ "$WITH_RUNTIME" = yes ] && prepend_dir XDG_CONFIG_DIRS $RUNTIME/etc/xdg +prepend_dir XDG_CONFIG_DIRS $SNAP/etc/xdg + +# Define snaps' own data dir +[ "$WITH_RUNTIME" = yes ] && prepend_dir XDG_DATA_DIRS $RUNTIME/usr/share +prepend_dir XDG_DATA_DIRS $SNAP/usr/share +prepend_dir XDG_DATA_DIRS $SNAP/share +prepend_dir XDG_DATA_DIRS $SNAP/data-dir +prepend_dir XDG_DATA_DIRS $SNAP_USER_DATA + +# Set XDG_DATA_HOME to local path +export XDG_DATA_HOME=$SNAP_USER_DATA/.local/share +ensure_dir_exists $XDG_DATA_HOME -m 700 + +# Workaround for GLib < 2.53.2 not searching for schemas in $XDG_DATA_HOME: +# https://bugzilla.gnome.org/show_bug.cgi?id=741335 +prepend_dir XDG_DATA_DIRS $XDG_DATA_HOME + +# Set cache folder to local path +export XDG_CACHE_HOME=$SNAP_USER_COMMON/.cache +if [[ -d $SNAP_USER_DATA/.cache && ! -e $XDG_CACHE_HOME ]]; then + # the .cache directory used to be stored under $SNAP_USER_DATA, migrate it + mv $SNAP_USER_DATA/.cache $SNAP_USER_COMMON/ +fi +ensure_dir_exists $XDG_CACHE_HOME -m 700 + +# Create $XDG_RUNTIME_DIR if not exists (to be removed when LP: #1656340 is fixed) +ensure_dir_exists $XDG_RUNTIME_DIR -m 700 + +# Ensure the app finds locale definitions (requires locales-all to be installed) +append_dir LOCPATH $RUNTIME/usr/lib/locale + +# If any, keep track of where XDG dirs were so we can potentially migrate the content later +update_xdg_dirs_values + +# Setup user-dirs.* or run xdg-user-dirs-update if needed +needs_xdg_update=false +needs_xdg_reload=false +needs_xdg_links=false + +if [ "$HOME" != "$SNAP_USER_DATA" ] && ! is_subpath "$XDG_CONFIG_HOME" "$HOME"; then + for f in user-dirs.dirs user-dirs.locale; do + if [ -f "$HOME/.config/$f" ]; then + mv "$HOME/.config/$f" "$XDG_CONFIG_HOME" + needs_xdg_reload=true + fi + done +fi + +if can_open_file "$REALHOME/.config/user-dirs.dirs"; then + # shellcheck disable=SC2154 + if [ "$needs_update" = true ] || [ "$needs_xdg_reload" = true ]; then + sed "/^#/!s#\$HOME#${REALHOME}#g" "$REALHOME/.config/user-dirs.dirs" > "$XDG_CONFIG_HOME/user-dirs.dirs" + md5sum < "$REALHOME/.config/user-dirs.dirs" > "$XDG_CONFIG_HOME/user-dirs.dirs.md5sum" + # It's possible user-dirs.dirs exists when user-dirs.locale doesn't. This + # simply means the user opted to never ask to translate their user dirs + if can_open_file "$REALHOME/.config/user-dirs.locale"; then + cp -a "$REALHOME/.config/user-dirs.locale" "$XDG_CONFIG_HOME" + md5sum < "$REALHOME/.config/user-dirs.locale" > "$XDG_CONFIG_HOME/user-dirs.locale.md5sum" + elif [ -f "$XDG_CONFIG_HOME/user-dirs.locale.md5sum" ]; then + rm "$XDG_CONFIG_HOME/user-dirs.locale.md5sum" + fi + needs_xdg_reload=true + fi +else + needs_xdg_update=true + needs_xdg_links=true +fi + +if [ $needs_xdg_reload = true ]; then + update_xdg_dirs_values + needs_xdg_reload=false +fi + +# Check if we can actually read the contents of each xdg dir +for ((i = 0; i < ${#XDG_SPECIAL_DIRS_PATHS[@]}; i++)); do + if ! can_open_file "${XDG_SPECIAL_DIRS_PATHS[$i]}"; then + needs_xdg_update=true + needs_xdg_links=true + break + fi +done + +# If needs XDG update and xdg-user-dirs-update exists in $PATH, run it +if [ $needs_xdg_update = true ] && command -v xdg-user-dirs-update >/dev/null; then + xdg-user-dirs-update + update_xdg_dirs_values +fi + +# Create links for user-dirs.dirs +if [ $needs_xdg_links = true ]; then + for ((i = 0; i < ${#XDG_SPECIAL_DIRS_PATHS[@]}; i++)); do + b=$"(realpath "${XDG_SPECIAL_DIRS_PATHS[$i]}" --relative-to="$HOME" 2>/dev/null)" + if [[ -n "$b" && "$b" != "." && -e $REALHOME/$b ]]; then + [ -d $HOME/$b ] && rmdir $HOME/$b 2> /dev/null + [ ! -e $HOME/$b ] && ln -s $REALHOME/$b $HOME/$b + fi + done +else + # If we aren't creating new links, check if we have content saved in old locations and move it + for ((i = 0; i < ${#XDG_SPECIAL_DIRS[@]}; i++)); do + old="${XDG_SPECIAL_DIRS_INITIAL_PATHS[$i]}" + new="${XDG_SPECIAL_DIRS_PATHS[$i]}" + if [ -L "$old" ] && [ -d "$new" ] && [ `readlink "$old" 2>/dev/null` != "$new" ] && + (is_subpath "$old" "$SNAP_USER_DATA" || is_subpath "$old" "$SNAP_USER_COMMON"); then + mv -vn "$old"/* "$new"/ 2>/dev/null + elif [ -d "$old" ] && [ -d "$new" ] && [ "$old" != "$new" ] && + (is_subpath "$old" "$SNAP_USER_DATA" || is_subpath "$old" "$SNAP_USER_COMMON"); then + mv -vn "$old"/* "$new"/ 2>/dev/null + fi + done +fi + +# If detect wayland server socket, then set environment so applications prefer +# wayland, and setup compat symlink (until we use user mounts. Remember, +# XDG_RUNTIME_DIR is /run/user//snap.$SNAP so look in the parent directory +# for the socket. For details: +# https://forum.snapcraft.io/t/wayland-dconf-and-xdg-runtime-dir/186/10 +# Applications that don't support wayland natively may define DISABLE_WAYLAND +# (to any non-empty value) to skip that logic entirely. +wayland_available=false +if [[ -n "$XDG_RUNTIME_DIR" && -z "$DISABLE_WAYLAND" ]]; then + wdisplay="wayland-0" + if [ -n "$WAYLAND_DISPLAY" ]; then + wdisplay="$WAYLAND_DISPLAY" + fi + wayland_sockpath="$XDG_RUNTIME_DIR/../$wdisplay" + wayland_snappath="$XDG_RUNTIME_DIR/$wdisplay" + if [ -S "$wayland_sockpath" ]; then + # if running under wayland, use it + #export WAYLAND_DEBUG=1 + wayland_available=true + # create the compat symlink for now + if [ ! -e "$wayland_snappath" ]; then + ln -s "$wayland_sockpath" "$wayland_snappath" + fi + fi +fi + +# Make PulseAudio socket available inside the snap-specific $XDG_RUNTIME_DIR +if [ -n "$XDG_RUNTIME_DIR" ]; then + pulsenative="pulse/native" + pulseaudio_sockpath="$XDG_RUNTIME_DIR/../$pulsenative" + if [ -S "$pulseaudio_sockpath" ]; then + export PULSE_SERVER="unix:${pulseaudio_sockpath}" + fi +fi + +# GI repository +[ "$WITH_RUNTIME" = yes ] && prepend_dir GI_TYPELIB_PATH $RUNTIME/usr/lib/$ARCH/girepository-1.0 +[ "$WITH_RUNTIME" = yes ] && prepend_dir GI_TYPELIB_PATH $RUNTIME/usr/lib/girepository-1.0 +prepend_dir GI_TYPELIB_PATH $SNAP/usr/lib/$ARCH/girepository-1.0 +prepend_dir GI_TYPELIB_PATH $SNAP/usr/lib/girepository-1.0 +prepend_dir GI_TYPELIB_PATH $SNAP/usr/lib/gjs/girepository-1.0 + +# Keep an array of data dirs, for looping through them +IFS=':' read -r -a data_dirs_array <<< "$XDG_DATA_DIRS" + +# Font Config and themes +export FONTCONFIG_PATH=$RUNTIME/etc/fonts +export FONTCONFIG_FILE=$RUNTIME/etc/fonts/fonts.conf + +function make_user_fontconfig { + echo "" + if [ -d $REALHOME/.local/share/fonts ]; then + echo " $REALHOME/.local/share/fonts" + fi + if [ -d $REALHOME/.fonts ]; then + echo " $REALHOME/.fonts" + fi + for ((i = 0; i < ${#data_dirs_array[@]}; i++)); do + if [ -d "${data_dirs_array[$i]}/fonts" ]; then + echo " ${data_dirs_array[$i]}/fonts" + fi + done + # fix font render for modified fonts, that discussed on Snapcraft Forum: + # https://forum.snapcraft.io/t/snap-package-cannot-read-fonts-conf/16657 + echo ' /etc/fonts/conf.d' + echo ' conf.d' + + # We need to include this default cachedir first so that caching + # works: without it, fontconfig will try to write to the real user home + # cachedir and be blocked by AppArmor. + echo ' fontconfig' + if [ -d $REALHOME/.cache/fontconfig ]; then + echo " $REALHOME/.cache/fontconfig" + fi + echo "" +} + +if [ $needs_update = true ]; then + rm -rf $XDG_DATA_HOME/{fontconfig,fonts,fonts-*,themes,.themes} + + # This fontconfig fragment is installed in a location that is + # included by the system fontconfig configuration: namely the + # etc/fonts/conf.d/50-user.conf file. + ensure_dir_exists $XDG_CONFIG_HOME/fontconfig + async_exec make_user_fontconfig > $XDG_CONFIG_HOME/fontconfig/fonts.conf + + # the themes symlink are needed for GTK 3.18 when the prefix isn't changed + # GTK 3.20 looks into XDG_DATA_DIR which has connected themes. + if [ -d $SNAP/data-dir/themes ]; then + ln -sf $SNAP/data-dir/themes $XDG_DATA_HOME + ln -sfn $SNAP/data-dir/themes $SNAP_USER_DATA/.themes + else + ln -sf $RUNTIME/usr/share/themes $XDG_DATA_HOME + ln -sfn $RUNTIME/usr/share/themes $SNAP_USER_DATA/.themes + fi +fi + +# Build mime.cache +# needed for gtk and qt icon +if [ $needs_update = true ]; then + rm -rf $XDG_DATA_HOME/mime + if [ ! -f $RUNTIME/usr/share/mime/mime.cache ]; then + if command -v update-mime-database >/dev/null; then + cp --preserve=timestamps -dR $RUNTIME/usr/share/mime $XDG_DATA_HOME + async_exec update-mime-database $XDG_DATA_HOME/mime + fi + fi +fi + +# Gio modules and cache (including gsettings module) +export GIO_MODULE_DIR=$XDG_CACHE_HOME/gio-modules +function compile_giomodules { + if [ -f $1/glib-2.0/gio-querymodules ]; then + rm -rf $GIO_MODULE_DIR + ensure_dir_exists $GIO_MODULE_DIR + ln -s $1/gio/modules/*.so $GIO_MODULE_DIR + $1/glib-2.0/gio-querymodules $GIO_MODULE_DIR + fi +} +if [ $needs_update = true ]; then + async_exec compile_giomodules $RUNTIME/usr/lib/$ARCH +fi + +# Setup compiled gsettings schema +GS_SCHEMA_DIR=$XDG_DATA_HOME/glib-2.0/schemas +function compile_schemas { + if [ -f "$1" ]; then + rm -rf $GS_SCHEMA_DIR + ensure_dir_exists $GS_SCHEMA_DIR + for ((i = 0; i < ${#data_dirs_array[@]}; i++)); do + schema_dir="${data_dirs_array[$i]}/glib-2.0/schemas" + if [ -f "$schema_dir/gschemas.compiled" ]; then + # This directory already has compiled schemas + continue + fi + if [ -n "$(ls -A $schema_dir/*.xml 2>/dev/null)" ]; then + ln -s $schema_dir/*.xml $GS_SCHEMA_DIR + fi + if [ -n "$(ls -A $schema_dir/*.override 2>/dev/null)" ]; then + ln -s $schema_dir/*.override $GS_SCHEMA_DIR + fi + done + # Only compile schemas if we copied anyting + if [ -n "$(ls -A $GS_SCHEMA_DIR/*.xml $GS_SCHEMA_DIR/*.override 2>/dev/null)" ]; then + "$1" $GS_SCHEMA_DIR + fi + fi +} +if [ $needs_update = true ]; then + async_exec compile_schemas $RUNTIME/usr/lib/$ARCH/glib-2.0/glib-compile-schemas +fi + +# Enable gsettings user changes +# symlink the dconf file if home plug is connected for read +DCONF_DEST_USER_DIR=$SNAP_USER_DATA/.config/dconf +if [ ! -f $DCONF_DEST_USER_DIR/user ]; then + if [ -f $REALHOME/.config/dconf/user ]; then + ensure_dir_exists $DCONF_DEST_USER_DIR + ln -s $REALHOME/.config/dconf/user $DCONF_DEST_USER_DIR + fi +fi +# symlink the runtime dconf file as well +if [ -r $XDG_RUNTIME_DIR/../dconf/user ]; then + ensure_dir_exists $XDG_RUNTIME_DIR/dconf + ln -sf ../../dconf/user $XDG_RUNTIME_DIR/dconf/user +fi + +# Testability support +append_dir LD_LIBRARY_PATH $SNAP/testability +append_dir LD_LIBRARY_PATH $SNAP/testability/$ARCH +append_dir LD_LIBRARY_PATH $SNAP/testability/$ARCH/mesa + +# Gdk-pixbuf loaders +export GDK_PIXBUF_MODULE_FILE=$XDG_CACHE_HOME/gdk-pixbuf-loaders.cache +export GDK_PIXBUF_MODULEDIR=$RUNTIME/usr/lib/$ARCH/gdk-pixbuf-2.0/2.10.0/loaders +if [ $needs_update = true ] || [ ! -f $GDK_PIXBUF_MODULE_FILE ]; then + rm -f $GDK_PIXBUF_MODULE_FILE + if [ -f $RUNTIME/usr/lib/$ARCH/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders ]; then + async_exec $RUNTIME/usr/lib/$ARCH/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders > $GDK_PIXBUF_MODULE_FILE + fi +fi + +# Icon themes cache +if [ $needs_update = true ]; then + rm -rf $XDG_DATA_HOME/icons + ensure_dir_exists $XDG_DATA_HOME/icons + for ((i = 0; i < ${#data_dirs_array[@]}; i++)); do + # The runtime and theme content snaps should already contain icon caches + # so we skip them to optimise app start time. + if [[ "${data_dirs_array[$i]}" == "$SNAP/data-dir" || "${data_dirs_array[$i]}" == "$RUNTIME/"* ]]; then + continue + fi + for theme in "${data_dirs_array[$i]}/icons/"*; do + if [ -f "$theme/index.theme" -a ! -f "$theme/icon-theme.cache" ]; then + theme_dir=$XDG_DATA_HOME/icons/$(basename "$theme") + if [ ! -d "$theme_dir" ]; then + ensure_dir_exists "$theme_dir" + ln -s $theme/* "$theme_dir" + if [ -f $RUNTIME/usr/sbin/update-icon-caches ]; then + async_exec $RUNTIME/usr/sbin/update-icon-caches "$theme_dir" + elif [ -f $RUNTIME/usr/sbin/update-icon-cache.gtk2 ]; then + async_exec $RUNTIME/usr/sbin/update-icon-cache.gtk2 "$theme_dir" + fi + fi + fi + done + done +fi + +# GTK theme and behavior modifier +# Those can impact the theme engine used by Qt as well +gtk_configs=(gtk-3.0/settings.ini gtk-3.0/bookmarks gtk-2.0/gtkfilechooser.ini) +for f in ${gtk_configs[@]}; do + dest="$XDG_CONFIG_HOME/$f" + if [ ! -L "$dest" ]; then + ensure_dir_exists `dirname $dest` + ln -s $REALHOME/.config/$f $dest + fi +done + +# create symbolic link to ibus socket path for ibus to look up its socket files +# (see comments #3 and #6 on https://launchpad.net/bugs/1580463) +IBUS_CONFIG_PATH=$XDG_CONFIG_HOME/ibus +ensure_dir_exists $IBUS_CONFIG_PATH +[ -d $IBUS_CONFIG_PATH/bus ] && rm -rf $IBUS_CONFIG_PATH/bus +ln -sfn $REALHOME/.config/ibus/bus $IBUS_CONFIG_PATH + +############################# +# QT launcher specific part # +############################# + +# select qt version +USE_qt5=true + +export QTCHOOSER_NO_GLOBAL_DIR=1 +if [ "$USE_qt5" = true ]; then + # QT_SELECT not exported by ubuntu app platform runtime + if [ -z "$QT_SELECT" ]; then + export QT_SELECT=snappy-qt5 + fi +else + export QT_SELECT=snappy-qt4 +fi + +# Removes Qt warning: Could not find a location +# of the system Compose files +export QTCOMPOSE=$RUNTIME/usr/share/X11/locale + +# Qt Libs, Modules and helpers +if [ "$USE_qt5" = true ]; then + prepend_dir QT_PLUGIN_PATH $RUNTIME/usr/lib/$ARCH/qt5/plugins + prepend_dir QML2_IMPORT_PATH $RUNTIME/usr/lib/$ARCH/qt5/qml + prepend_dir QML2_IMPORT_PATH $RUNTIME/lib/$ARCH + # Try to use qtubuntu-print plugin, if not found Qt will fallback to the first found (usually cups plugin) + export QT_PRINTER_MODULE=qtubuntu-print + if [ "$WITH_RUNTIME" = yes ]; then + prepend_dir QML2_IMPORT_PATH $SNAP/usr/lib/$ARCH/qt5/qml + prepend_dir QML2_IMPORT_PATH $SNAP/lib/$ARCH + fi + prepend_dir PATH $RUNTIME/usr/lib/$ARCH/qt5/bin + + if [ "$wayland_available" = true ]; then + export QT_QPA_PLATFORM=wayland-egl + # Does not hurt to specify these as well, just in case + export GDK_BACKEND="wayland" + export CLUTTER_BACKEND="wayland" + else + # Should check if a X11 $DISPLAY variable is set and accessible + export QT_QPA_PLATFORM=xcb + if ! [ -v QT_QPA_PLATFORMTHEME ] || [ -z "${QT_QPA_PLATFORMTHEME}" ]; then + export QT_QPA_PLATFORMTHEME=appmenu-qt5 + fi + fi + +else + [ "$wayland_available" = true ] && echo "Warning: Qt4 does not support Wayland!" + append_dir LD_LIBRARY_PATH $SNAP/usr/lib/$ARCH/qt4 + export QT_PLUGIN_PATH=$SNAP/usr/lib/$ARCH/qt4/plugins + prepend_dir QML_IMPORT_PATH $SNAP/usr/lib/$ARCH/qt4/qml:$SNAP/lib/$ARCH + prepend_dir PATH $SNAP/usr/lib/$ARCH/qt4/bin +fi + +# Use GTK styling for running under the GNOME desktop +append_dir GTK_PATH $RUNTIME/usr/lib/$ARCH/gtk-2.0 + +# Fix locating the QtWebEngineProcess executable +export QTWEBENGINEPROCESS_PATH=$RUNTIME/usr/lib/$ARCH/qt5/libexec/QtWebEngineProcess + +############################### +# Mark update and exec binary # +############################### + +[ $needs_update = true ] && echo "SNAP_DESKTOP_LAST_REVISION=$SNAP_REVISION" > $SNAP_USER_DATA/.last_revision + +wait_for_async_execs + +if [ -n "$SNAP_DESKTOP_DEBUG" ]; then + echo "desktop-launch elapsed time: " $(date +%s.%N --date="$START seconds ago") + echo "Now running: exec $@" +fi + +exec "$@" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 158dc57..88b3d8b 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -3,7 +3,8 @@ base: core24 adopt-info: openmoonray summary: openmoonray description: | - openmoonray + MoonRay is DreamWorks’ open-source, award-winning, state-of-the-art + production MCRT renderer. grade: stable confinement: strict @@ -16,6 +17,10 @@ package-repositories: key-id: EB693B3035CD5710E231E123A4B469963BF863CC url: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 +layout: + /usr/share/X11: + bind: $SNAP/usr/share/X11 + parts: openmoonray: plugin: cmake @@ -268,6 +273,8 @@ parts: - libpython3.12t64 - libze1 - libboost-python1.83.0 + - qtwayland5 + - xkb-data build-environment: - CC: /usr/bin/gcc-9 - CXX: /usr/bin/g++-9 @@ -286,15 +293,39 @@ parts: cmake --build --preset ubuntu24-release -- -j $(nproc) cp -rp $CRAFT_PART_SRC/../../installs/* /opt/MoonRay/installs/ cp -rp /opt $CRAFT_PART_INSTALL/ + cp $CRAFT_PROJECT_DIR/snap/local/desktop-launch $CRAFT_PART_INSTALL/ + chmod a+x $CRAFT_PART_INSTALL/desktop-launch prime: + - desktop-launch - opt - usr/lib + - usr/share/X11 + - -opt/MoonRay/build-deps + - -opt/MoonRay/installs/include + - -opt/MoonRay/installs/openmoonray/include + - -opt/MoonRay/installs/lib/cmake + - -opt/MoonRay/installs/openmoonray/lib/cmake apps: - openmoonray: - command: opt/MoonRay/installs/openmoonray/bin/moonray_gui + moonray: + command: opt/MoonRay/installs/openmoonray/bin/moonray -dso_path $SNAP/opt/MoonRay/installs/openmoonray/rdl2dso -auto_affinity off + environment: + LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas:$SNAP/opt/MoonRay/installs/openmoonray/rdl2dso + plugs: + - home + - network + - audio-playback + - audio-record + - desktop + - x11 + - wayland + - hardware-observe + - opengl + gui: + command: opt/MoonRay/installs/openmoonray/bin/moonray_gui -dso_path $SNAP/opt/MoonRay/installs/openmoonray/rdl2dso -auto_affinity off + command-chain: [ desktop-launch ] environment: - LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas + LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas:$SNAP/opt/MoonRay/installs/openmoonray/rdl2dso plugs: - home - network @@ -303,3 +334,5 @@ apps: - desktop - x11 - wayland + - hardware-observe + - opengl From 2ba178dffe7338d1ea15112ff8cba9ebb081a80b Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 16:46:36 +0100 Subject: [PATCH 17/43] clear execstack Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 88b3d8b..af18349 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -84,6 +84,7 @@ parts: - nvidia-cuda-toolkit - nvidia-cuda-dev - ispc + - execstack stage-packages: - libaec0 - libaom3 @@ -295,6 +296,8 @@ parts: cp -rp /opt $CRAFT_PART_INSTALL/ cp $CRAFT_PROJECT_DIR/snap/local/desktop-launch $CRAFT_PART_INSTALL/ chmod a+x $CRAFT_PART_INSTALL/desktop-launch + execstack --clear-execstack $CRAFT_PART_INSTALL/opt/MoonRay/installs/openmoonray/bin/moonray_gui + execstack --clear-execstack $CRAFT_PART_INSTALL/opt/MoonRay/installs/openmoonray/lib/librendering_pbr.so prime: - desktop-launch - opt From 994cfce4eaed7dfc6c3c2bf5070606d68aa5329e Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Thu, 23 Oct 2025 09:23:46 +0100 Subject: [PATCH 18/43] Dropped unused plugs Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index af18349..9d83848 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -317,8 +317,6 @@ apps: plugs: - home - network - - audio-playback - - audio-record - desktop - x11 - wayland @@ -332,8 +330,6 @@ apps: plugs: - home - network - - audio-playback - - audio-record - desktop - x11 - wayland From eac9ec061163ff556562fac8b19d6947faef24ee Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Thu, 23 Oct 2025 11:51:39 +0100 Subject: [PATCH 19/43] Updated snap metadata Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 9d83848..13e1b9d 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,10 +1,16 @@ name: openmoonray base: core24 adopt-info: openmoonray -summary: openmoonray +title: MoonRay +summary: MoonRay is DreamWorks’ open-source production MCRT renderer description: | MoonRay is DreamWorks’ open-source, award-winning, state-of-the-art - production MCRT renderer. + production MCRT renderer. +license: Apache-2.0 +source-code: https://github.com/dreamworksanimation/openmoonray +contact: https://github.com/dreamworksanimation/openmoonray/issues +issues: https://github.com/dreamworksanimation/openmoonray/issues +website: https://openmoonray.org/ grade: stable confinement: strict From 9d4f7be9b569c3f2d45d6c79046058e8330e26bc Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Fri, 24 Oct 2025 09:18:42 +0100 Subject: [PATCH 20/43] tweaked metadata Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 13e1b9d..8b15643 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -2,10 +2,10 @@ name: openmoonray base: core24 adopt-info: openmoonray title: MoonRay -summary: MoonRay is DreamWorks’ open-source production MCRT renderer +summary: MoonRay is DreamWorks’ open-source production path tracer description: | MoonRay is DreamWorks’ open-source, award-winning, state-of-the-art - production MCRT renderer. + production path tracer. license: Apache-2.0 source-code: https://github.com/dreamworksanimation/openmoonray contact: https://github.com/dreamworksanimation/openmoonray/issues From f7f8c2eb755b97bb24aa640310d88fee0266eb30 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Mon, 24 Nov 2025 12:30:32 -0500 Subject: [PATCH 21/43] Updated git submodule urls to be absolute rather than relative Signed-off-by: Ken VanDine --- .gitmodules | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/.gitmodules b/.gitmodules index 4d92b4a..2067c89 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,76 +1,76 @@ [submodule "arras/distributed/minicoord"] path = arras/distributed/minicoord - url = ../minicoord + url = https://github.com/dreamworksanimation/minicoord branch = main [submodule "arras/arras4_core"] path = arras/arras4_core - url = ../arras4_core + url = https://github.com/dreamworksanimation/arras4_core branch = main [submodule "moonray/scene_rdl2"] path = moonray/scene_rdl2 - url = ../scene_rdl2 + url = https://github.com/dreamworksanimation/scene_rdl2 branch = main [submodule "moonray/mcrt_denoise"] path = moonray/mcrt_denoise - url = ../mcrt_denoise + url = https://github.com/dreamworksanimation/mcrt_denoise branch = main [submodule "moonray/moonray"] path = moonray/moonray - url = ../moonray + url = https://github.com/dreamworksanimation/moonray branch = main [submodule "moonray/moonshine"] path = moonray/moonshine - url = ../moonshine + url = https://github.com/dreamworksanimation/moonshine branch = main [submodule "moonray/moonshine_usd"] path = moonray/moonshine_usd - url = ../moonshine_usd + url = https://github.com/dreamworksanimation/moonshine_usd branch = main [submodule "moonray/moonray_arras/mcrt_dataio"] path = moonray/moonray_arras/mcrt_dataio - url = ../mcrt_dataio + url = https://github.com/dreamworksanimation/mcrt_dataio branch = main [submodule "moonray/moonray_arras/mcrt_computation"] path = moonray/moonray_arras/mcrt_computation - url = ../mcrt_computation + url = https://github.com/dreamworksanimation/mcrt_computation branch = main [submodule "moonray/moonray_arras/mcrt_messages"] path = moonray/moonray_arras/mcrt_messages - url = ../mcrt_messages + url = https://github.com/dreamworksanimation/mcrt_messages branch = main [submodule "moonray/moonray_gui"] path = moonray/moonray_gui - url = ../moonray_gui + url = https://github.com/dreamworksanimation/moonray_gui branch = main [submodule "moonray/hydra/hdMoonray"] path = moonray/hydra/hdMoonray - url = ../hdMoonray + url = https://github.com/dreamworksanimation/hdMoonray branch = main [submodule "arras/arras_render"] path = arras/arras_render - url = ../arras_render + url = https://github.com/dreamworksanimation/arras_render branch = main [submodule "arras/distributed/arras4_node"] path = arras/distributed/arras4_node - url = ../arras4_node + url = https://github.com/dreamworksanimation/arras4_node branch = main [submodule "cmake_modules"] path = cmake_modules - url = ../cmake_modules + url = https://github.com/dreamworksanimation/cmake_modules branch = main [submodule "moonray/hydra/moonray_sdr_plugins"] path = moonray/hydra/moonray_sdr_plugins - url = ../moonray_sdr_plugins + url = https://github.com/dreamworksanimation/moonray_sdr_plugins branch = main [submodule "moonray/moonray_dcc_plugins"] path = moonray/moonray_dcc_plugins - url = ../moonray_dcc_plugins + url = https://github.com/dreamworksanimation/moonray_dcc_plugins branch = main [submodule "moonray/render_profile_viewer"] path = moonray/render_profile_viewer - url = ../render_profile_viewer.git + url = https://github.com/dreamworksanimation/render_profile_viewer.git branch = main [submodule "rats"] path = rats - url = ../rats + url = https://github.com/dreamworksanimation/rats branch = main From c8149cdaefddfff60489c506ced3905e2a027552 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Mon, 24 Nov 2025 12:52:50 -0500 Subject: [PATCH 22/43] Manually merged some build fixes from main Signed-off-by: Ken VanDine --- building/Ubuntu24/CMakeLists.txt | 34 +++++++++++++++----------------- moonray/CMakeLists.txt | 2 +- snap/snapcraft.yaml | 2 +- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/building/Ubuntu24/CMakeLists.txt b/building/Ubuntu24/CMakeLists.txt index 1d9185a..3787cff 100644 --- a/building/Ubuntu24/CMakeLists.txt +++ b/building/Ubuntu24/CMakeLists.txt @@ -43,8 +43,7 @@ set(CHAIN OpenSubdiv) ExternalProject_Add(OpenEXR GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/openexr - GIT_TAG fad1d1a9dc188aceabbea1313580d73b7236b79b # v3.1.13 refplat 2023 - #PATCH_COMMAND patch IlmBase/Half/CMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR}/../Imath_include_paths.patch + GIT_TAG 68d9e1e17620cef00e59b43fa42c97fbcf90e72b # v3.1.8 INSTALL_DIR ${InstallRoot} CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= @@ -55,7 +54,7 @@ set(CHAIN OpenEXR) ExternalProject_Add(Random123 GIT_REPOSITORY https://github.com/DEShawResearch/random123 - GIT_TAG 726a093cd9a73f3ec3c8d7a70ff10ed8efec8d13 # v1.14.0 + GIT_TAG 726a093cd9a73f3ec3c8d7a70ff10ed8efec8d13 # v1.14.0 (internally we use 1.08.3) BUILD_IN_SOURCE 1 CONFIGURE_COMMAND "" BUILD_COMMAND "" @@ -65,7 +64,7 @@ ExternalProject_Add(Random123 set(CHAIN Random123) ExternalProject_Add(ISPC - URL https://github.com/ispc/ispc/releases/download/v1.20.0/ispc-v1.20.0-linux.tar.gz + URL https://github.com/ispc/ispc/releases/download/v1.21.0/ispc-v1.21.0-linux.tar.gz BUILD_IN_SOURCE 1 CONFIGURE_COMMAND "" BUILD_COMMAND "" @@ -123,19 +122,6 @@ ExternalProject_Add(OpenImageIO ) set(CHAIN OpenImageIO) -ExternalProject_Add(OpenImageDenoise - URL https://github.com/OpenImageDenoise/oidn/releases/download/v2.0.1/oidn-2.0.1.src.tar.gz - INSTALL_DIR ${InstallRoot} - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX:PATH= - -DISPC_EXECUTABLE=/bin/ispc - -DTBB_ROOT= - -DOIDN_APPS=OFF - DEPENDS ${CHAIN} -) -set(CHAIN OpenImageDenoise) - -# NEW, make sure this isn't before OIIO or it breaks OIIO ExternalProject_Add(TBB URL https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2020.3.3.tar.gz BUILD_IN_SOURCE 1 @@ -147,10 +133,22 @@ ExternalProject_Add(TBB ) set(CHAIN TBB) +ExternalProject_Add(OpenImageDenoise + URL https://github.com/OpenImageDenoise/oidn/releases/download/v2.3.3/oidn-2.3.3.src.tar.gz + INSTALL_DIR ${InstallRoot} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:PATH= + -DISPC_EXECUTABLE=/bin/ispc + -DTBB_ROOT= + -DOIDN_APPS=OFF + DEPENDS ${CHAIN} +) +set(CHAIN OpenImageDenoise) + if(NOT NO_USD) ExternalProject_Add(USD GIT_REPOSITORY https://github.com/PixarAnimationStudios/USD - GIT_TAG 0c7b9a95f155c221ff7df9270a39a52e3b23af8b # v22.11 + GIT_TAG 10b62439e9242a55101cf8b200f2c7e02420e1b0 # v23.08 INSTALL_DIR ${InstallRoot} CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= diff --git a/moonray/CMakeLists.txt b/moonray/CMakeLists.txt index 2087863..cc42dc5 100644 --- a/moonray/CMakeLists.txt +++ b/moonray/CMakeLists.txt @@ -13,7 +13,7 @@ endif() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/moonray_tools) add_subdirectory(moonray_tools) endif() -add_subdirectory(moonshine_usd) +#add_subdirectory(moonshine_usd) add_subdirectory(render_profile_viewer) add_subdirectory(scene_rdl2) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 8b15643..348b0c2 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -45,7 +45,7 @@ parts: - libgif-dev - libmng-dev - libtiff-dev - - libjpeg-dev + - libjpeg-turbo8-dev - libatomic1 - libuuid1 - libssl-dev From e1979a411a5c2f0574d8c8a28cc4cf26ecd1475a Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Mon, 24 Nov 2025 21:56:38 -0500 Subject: [PATCH 23/43] Added workflow to build snap Signed-off-by: Ken VanDine --- .github/workflows/snap.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/snap.yaml diff --git a/.github/workflows/snap.yaml b/.github/workflows/snap.yaml new file mode 100644 index 0000000..c5150c0 --- /dev/null +++ b/.github/workflows/snap.yaml @@ -0,0 +1,19 @@ +name: Snap + +on: + push: + branches: [ubuntu24] + release: + types: [published] + workflow_dispatch: + +jobs: + build-amd64: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + submodules: recursive + - uses: snapcore/action-build@v1 From 96e135fe2c9bc94b6a035259804040ddcb2fbf5f Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Mon, 24 Nov 2025 22:56:26 -0500 Subject: [PATCH 24/43] Clean up space in the runner for the snap build Signed-off-by: Ken VanDine --- .github/workflows/snap.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/snap.yaml b/.github/workflows/snap.yaml index c5150c0..91ec55d 100644 --- a/.github/workflows/snap.yaml +++ b/.github/workflows/snap.yaml @@ -11,6 +11,9 @@ jobs: build-amd64: runs-on: ubuntu-24.04 steps: + - uses: jlumbroso/free-disk-space@3e0187054f9c4bc1f55a743792872df36b2d88e0 + with: + tool-cache: true - uses: actions/checkout@v4 with: fetch-depth: 0 From 2f558215cbd7fcc68186eadbea0e2bf5396eb749 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Tue, 25 Nov 2025 09:34:04 -0500 Subject: [PATCH 25/43] fix: Use checkout@v6 and quote recursive Signed-off-by: Ken VanDine --- .github/workflows/snap.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/snap.yaml b/.github/workflows/snap.yaml index 91ec55d..49cbbe6 100644 --- a/.github/workflows/snap.yaml +++ b/.github/workflows/snap.yaml @@ -14,9 +14,9 @@ jobs: - uses: jlumbroso/free-disk-space@3e0187054f9c4bc1f55a743792872df36b2d88e0 with: tool-cache: true - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 fetch-tags: true - submodules: recursive + submodules: "recursive" - uses: snapcore/action-build@v1 From 172b44a95818f92564ba4adde49f1849bb062d4b Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Tue, 25 Nov 2025 16:15:57 -0500 Subject: [PATCH 26/43] snap: Fall back to setting the version with what's in package.py if git describe fails Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 348b0c2..aaca60a 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -288,7 +288,12 @@ parts: - PYTHON_VERSION: 3.12 override-pull: | craftctl default - craftctl set version=$(git describe --abbrev=8 |sed -e 's/openmoonray-//g') + VERSION=$(git describe --abbrev=8 2>/dev/null | sed -e 's/openmoonray-//g') + if [ -z "$VERSION" ]; then + VERSION=$(grep '^\s*_version' package.py | awk -F "'" '{print $2}') + fi + echo $VERSION + craftctl set version=$(echo $VERSION) override-build: | mkdir -p /opt/MoonRay/{installs,build,build-deps,source} mkdir -p /opt/MoonRay/installs/{bin,lib,include} From 5387af3917863df2577b452f0f84224d610e1260 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Tue, 25 Nov 2025 16:50:39 -0500 Subject: [PATCH 27/43] snap: simplified setting snap version, the github action doesn't seem to get the tag information needed Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index aaca60a..649a84b 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -288,10 +288,7 @@ parts: - PYTHON_VERSION: 3.12 override-pull: | craftctl default - VERSION=$(git describe --abbrev=8 2>/dev/null | sed -e 's/openmoonray-//g') - if [ -z "$VERSION" ]; then - VERSION=$(grep '^\s*_version' package.py | awk -F "'" '{print $2}') - fi + VERSION=$(grep '^\s*_version' package.py | awk -F "'" '{print $2}') echo $VERSION craftctl set version=$(echo $VERSION) override-build: | From 20e4a7d3e271f3bcfa2546f171e083dc6f8c04ef Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Tue, 25 Nov 2025 21:38:14 -0500 Subject: [PATCH 28/43] Save built snap artifact Signed-off-by: Ken VanDine --- .github/workflows/snap.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/snap.yaml b/.github/workflows/snap.yaml index 49cbbe6..ab5723c 100644 --- a/.github/workflows/snap.yaml +++ b/.github/workflows/snap.yaml @@ -20,3 +20,8 @@ jobs: fetch-tags: true submodules: "recursive" - uses: snapcore/action-build@v1 + - uses: actions/upload-artifact@v4 + with: + name: snap + path: ${{ github.workspace }}/*.snap + retention-days: 5 From 9dd085c710dc00152327c55d8ba436ba911ff3c5 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 3 Dec 2025 09:25:56 -0600 Subject: [PATCH 29/43] Only build for amd64 Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 649a84b..e81e13b 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -14,6 +14,8 @@ website: https://openmoonray.org/ grade: stable confinement: strict +platforms: + amd64: package-repositories: - type: apt From 4845b59b18a1d525339e33fb9a3f3b975d1b07f9 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Tue, 9 Dec 2025 22:19:16 -0500 Subject: [PATCH 30/43] feat: Enable USD and build hydra plugin Signed-off-by: Ken VanDine --- building/Ubuntu24/CMakeLists.txt | 2 +- moonray/CMakeLists.txt | 6 +++--- snap/snapcraft.yaml | 37 +++++++++++++++++++++++++++++++- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/building/Ubuntu24/CMakeLists.txt b/building/Ubuntu24/CMakeLists.txt index 3787cff..3d30d3b 100644 --- a/building/Ubuntu24/CMakeLists.txt +++ b/building/Ubuntu24/CMakeLists.txt @@ -162,7 +162,7 @@ if(NOT NO_USD) -DTBB_USE_DEBUG_BUILD=OFF -DTBB_ROOT_DIR=/usr -DTBB_LIBRARIES=/usr/lib/x86_64-linux-gnu - -DTBB_INCLUDE_DIRS=/usr/include .. + -DTBB_INCLUDE_DIRS=${InstallRoot}/include .. -DPXR_BUILD_TESTS=OFF -DPXR_BUILD_EXAMPLES=OFF -DPXR_BUILD_TUTORIALS=OFF diff --git a/moonray/CMakeLists.txt b/moonray/CMakeLists.txt index cc42dc5..737f3c3 100644 --- a/moonray/CMakeLists.txt +++ b/moonray/CMakeLists.txt @@ -1,11 +1,11 @@ # Copyright 2023-2025 DreamWorks Animation LLC # SPDX-License-Identifier: Apache-2.0 -#add_subdirectory(hydra) +add_subdirectory(hydra) add_subdirectory(mcrt_denoise) add_subdirectory(moonray) add_subdirectory(moonray_arras) -#add_subdirectory(moonray_dcc_plugins) +add_subdirectory(moonray_dcc_plugins) add_subdirectory(moonshine) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/moonshine_dwa) add_subdirectory(moonshine_dwa) @@ -13,7 +13,7 @@ endif() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/moonray_tools) add_subdirectory(moonray_tools) endif() -#add_subdirectory(moonshine_usd) +add_subdirectory(moonshine_usd) add_subdirectory(render_profile_viewer) add_subdirectory(scene_rdl2) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index e81e13b..d41606f 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -297,7 +297,7 @@ parts: mkdir -p /opt/MoonRay/{installs,build,build-deps,source} mkdir -p /opt/MoonRay/installs/{bin,lib,include} cd /opt/MoonRay/build-deps - cmake -DCMAKE_INSTALL_PREFIX=$CRAFT_PART_INSTALL -DNO_USD=1 $CRAFT_PART_SRC/building/Ubuntu24/ + cmake -DCMAKE_INSTALL_PREFIX=$CRAFT_PART_INSTALL $CRAFT_PART_SRC/building/Ubuntu24/ cmake --build . -- -j $(nproc) cd $CRAFT_PART_SRC cmake --preset ubuntu24-release -DMOONRAY_USE_OPTIX=NO -DMOONRAY_BUILD_TESTING=NO @@ -345,3 +345,38 @@ apps: - wayland - hardware-observe - opengl + hd-render: + command: opt/MoonRay/installs/openmoonray/bin/hd_render + command-chain: [ desktop-launch ] + environment: + LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas:$SNAP/opt/MoonRay/installs/openmoonray/rdl2dso + PYTHONPATH: $SNAP/opt/MoonRay/installs/lib/python:$SNAP/opt/MoonRay/installs/lib/python3.12/site-packages + PXR_PLUGINPATH_NAME: $SNAP/opt/MoonRay/installs/lib/usd:$SNAP/opt/MoonRay/installs/openmoonray/plugin/pxr/hd_moonray:$SNAP/opt/MoonRay/installs/openmoonray/plugin/pxr:$SNAP/opt/MoonRay/installs/plugin/usd + ARRAS_SESSION_PATH: $SNAP/opt/MoonRay/installs/openmoonray/sessions + RDL2_DSO_PATH: $SNAP/opt/MoonRay/installs/openmoonray/rdl2dso + + plugs: + - home + - network + - desktop + - x11 + - wayland + - hardware-observe + - opengl + hd-usd2rdl: + command: opt/MoonRay/installs/openmoonray/bin/hd_usd2rdl + command-chain: [ desktop-launch ] + environment: + LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas:$SNAP/opt/MoonRay/installs/openmoonray/rdl2dso + PYTHONPATH: $SNAP/opt/MoonRay/installs/lib/python:$SNAP/opt/MoonRay/installs/lib/python3.12/site-packages + PXR_PLUGINPATH_NAME: $SNAP/opt/MoonRay/installs/lib/usd:$SNAP/opt/MoonRay/installs/openmoonray/plugin/pxr/hd_moonray:$SNAP/opt/MoonRay/installs/openmoonray/plugin/pxr:$SNAP/opt/MoonRay/installs/plugin/usd + ARRAS_SESSION_PATH: $SNAP/opt/MoonRay/installs/openmoonray/sessions + RDL2_DSO_PATH: $SNAP/opt/MoonRay/installs/openmoonray/rdl2dso + plugs: + - home + - network + - desktop + - x11 + - wayland + - hardware-observe + - opengl From dc335d430382cba60320394b7bb1c3226918ceee Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Mon, 15 Dec 2025 11:20:22 -0500 Subject: [PATCH 31/43] Create shader_json Signed-off-by: Ken VanDine --- snap/local/desktop-launch | 3 +++ snap/snapcraft.yaml | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/snap/local/desktop-launch b/snap/local/desktop-launch index 71fdbe2..412c58a 100644 --- a/snap/local/desktop-launch +++ b/snap/local/desktop-launch @@ -638,4 +638,7 @@ if [ -n "$SNAP_DESKTOP_DEBUG" ]; then echo "Now running: exec $@" fi +$SNAP/opt/MoonRay/installs/openmoonray/bin/rdl2_json_exporter --out $SNAP_USER_COMMON/shader_json/ --sparse +export MOONRAY_CLASS_PATH=$SNAP_USER_COMMON/shader_json + exec "$@" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index d41606f..3325bfb 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -354,7 +354,6 @@ apps: PXR_PLUGINPATH_NAME: $SNAP/opt/MoonRay/installs/lib/usd:$SNAP/opt/MoonRay/installs/openmoonray/plugin/pxr/hd_moonray:$SNAP/opt/MoonRay/installs/openmoonray/plugin/pxr:$SNAP/opt/MoonRay/installs/plugin/usd ARRAS_SESSION_PATH: $SNAP/opt/MoonRay/installs/openmoonray/sessions RDL2_DSO_PATH: $SNAP/opt/MoonRay/installs/openmoonray/rdl2dso - plugs: - home - network From f7c71b1061325beb71c7b7c5577aa10308936f22 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 11 Feb 2026 10:09:41 -0500 Subject: [PATCH 32/43] Merged latest upstream (2.40) Signed-off-by: Ken VanDine --- building/Ubuntu24/CMakeLists.txt | 28 ++++++++++++++++++++++++++++ snap/snapcraft.yaml | 19 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/building/Ubuntu24/CMakeLists.txt b/building/Ubuntu24/CMakeLists.txt index 3d30d3b..e3d3670 100644 --- a/building/Ubuntu24/CMakeLists.txt +++ b/building/Ubuntu24/CMakeLists.txt @@ -178,3 +178,31 @@ if(NOT NO_USD) set(CHAIN USD) endif() +ExternalProject_Add(GLFW + GIT_REPOSITORY https://github.com/glfw/glfw + GIT_TAG 3.4 + BUILD_COMMAND make ${JOBS_ARG} + CMAKE_ARGS + -DCMAKE_PREFIX_PATH:PATH=${InstallRoot} + -DCMAKE_INSTALL_PREFIX:PATH=${InstallRoot} + -DGLFW_BUILD_EXAMPLES=OFF + -DGLFW_BUILD_TESTS=OFF + -DGLFW_BUILD_DOCS=OFF + -DGLFW_INSTALL=ON + -DBUILD_SHARED_LIBS=ON + DEPENDS ${CHAIN} +) +set(CHAIN GLFW) + +ExternalProject_Add(OptiXHeaders + GIT_REPOSITORY https://github.com/NVIDIA/optix-dev + GIT_TAG v7.6.0 + INSTALL_DIR ${InstallRoot} + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory + /include + /include + DEPENDS ${CHAIN} +) +set(CHAIN OptiXHeaders) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 3325bfb..5c987ea 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -93,6 +93,12 @@ parts: - nvidia-cuda-dev - ispc - execstack + - libwayland-dev # Needed for GLFW + - libxkbcommon-dev # Needed for GLFW + - libxrandr-dev # Needed for GLFW + - libxinerama-dev # Needed for GLFW + - libxcursor-dev # Needed for GLFW + - libxi-dev # Needed for GLFW stage-packages: - libaec0 - libaom3 @@ -345,6 +351,19 @@ apps: - wayland - hardware-observe - opengl + gui-v2: + command: opt/MoonRay/installs/openmoonray/bin/moonray_gui_v2 -dso_path $SNAP/opt/MoonRay/installs/openmoonray/rdl2dso -auto_affinity off + command-chain: [ desktop-launch ] + environment: + LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas:$SNAP/opt/MoonRay/installs/openmoonray/rdl2dso + plugs: + - home + - network + - desktop + - x11 + - wayland + - hardware-observe + - opengl hd-render: command: opt/MoonRay/installs/openmoonray/bin/hd_render command-chain: [ desktop-launch ] From 3bed6b3af00b85e90856ec5ff3902031ddd4bcb9 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 4 Mar 2026 16:46:06 -0800 Subject: [PATCH 33/43] Fix Permission denied error from directory iteration of /usr/sbin in strict confinement Moonray binaries use std::filesystem::directory_iterator to scan PATH directories, which fails on /usr/sbin under snap strict confinement. Set PATH explicitly on all apps to exclude /usr/sbin and /sbin, and scope PATH for rdl2_json_exporter in desktop-launch with a fallback. Signed-off-by: Ken VanDine --- snap/local/desktop-launch | 2 +- snap/snapcraft.yaml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/snap/local/desktop-launch b/snap/local/desktop-launch index 412c58a..1c6390f 100644 --- a/snap/local/desktop-launch +++ b/snap/local/desktop-launch @@ -638,7 +638,7 @@ if [ -n "$SNAP_DESKTOP_DEBUG" ]; then echo "Now running: exec $@" fi -$SNAP/opt/MoonRay/installs/openmoonray/bin/rdl2_json_exporter --out $SNAP_USER_COMMON/shader_json/ --sparse +PATH=$SNAP/usr/bin:$SNAP/bin:/usr/bin:/bin $SNAP/opt/MoonRay/installs/openmoonray/bin/rdl2_json_exporter --out $SNAP_USER_COMMON/shader_json/ --sparse || true export MOONRAY_CLASS_PATH=$SNAP_USER_COMMON/shader_json exec "$@" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 5c987ea..b5995a1 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -329,6 +329,7 @@ apps: moonray: command: opt/MoonRay/installs/openmoonray/bin/moonray -dso_path $SNAP/opt/MoonRay/installs/openmoonray/rdl2dso -auto_affinity off environment: + PATH: $SNAP/usr/bin:$SNAP/bin:/usr/bin:/bin LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas:$SNAP/opt/MoonRay/installs/openmoonray/rdl2dso plugs: - home @@ -342,6 +343,7 @@ apps: command: opt/MoonRay/installs/openmoonray/bin/moonray_gui -dso_path $SNAP/opt/MoonRay/installs/openmoonray/rdl2dso -auto_affinity off command-chain: [ desktop-launch ] environment: + PATH: $SNAP/usr/bin:$SNAP/bin:/usr/bin:/bin LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas:$SNAP/opt/MoonRay/installs/openmoonray/rdl2dso plugs: - home @@ -355,6 +357,7 @@ apps: command: opt/MoonRay/installs/openmoonray/bin/moonray_gui_v2 -dso_path $SNAP/opt/MoonRay/installs/openmoonray/rdl2dso -auto_affinity off command-chain: [ desktop-launch ] environment: + PATH: $SNAP/usr/bin:$SNAP/bin:/usr/bin:/bin LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas:$SNAP/opt/MoonRay/installs/openmoonray/rdl2dso plugs: - home @@ -368,6 +371,7 @@ apps: command: opt/MoonRay/installs/openmoonray/bin/hd_render command-chain: [ desktop-launch ] environment: + PATH: $SNAP/usr/bin:$SNAP/bin:/usr/bin:/bin LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas:$SNAP/opt/MoonRay/installs/openmoonray/rdl2dso PYTHONPATH: $SNAP/opt/MoonRay/installs/lib/python:$SNAP/opt/MoonRay/installs/lib/python3.12/site-packages PXR_PLUGINPATH_NAME: $SNAP/opt/MoonRay/installs/lib/usd:$SNAP/opt/MoonRay/installs/openmoonray/plugin/pxr/hd_moonray:$SNAP/opt/MoonRay/installs/openmoonray/plugin/pxr:$SNAP/opt/MoonRay/installs/plugin/usd @@ -385,6 +389,7 @@ apps: command: opt/MoonRay/installs/openmoonray/bin/hd_usd2rdl command-chain: [ desktop-launch ] environment: + PATH: $SNAP/usr/bin:$SNAP/bin:/usr/bin:/bin LD_LIBRARY_PATH: $SNAP/opt/MoonRay/installs/openmoonray/lib:$SNAP/opt/MoonRay/installs/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu/lapack:$SNAP/usr/lib/x86_64-linux-gnu/blas:$SNAP/opt/MoonRay/installs/openmoonray/rdl2dso PYTHONPATH: $SNAP/opt/MoonRay/installs/lib/python:$SNAP/opt/MoonRay/installs/lib/python3.12/site-packages PXR_PLUGINPATH_NAME: $SNAP/opt/MoonRay/installs/lib/usd:$SNAP/opt/MoonRay/installs/openmoonray/plugin/pxr/hd_moonray:$SNAP/opt/MoonRay/installs/openmoonray/plugin/pxr:$SNAP/opt/MoonRay/installs/plugin/usd From 9fc38b83c7ae114f8b958d542d2aa037ef171f8c Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 4 Mar 2026 17:27:49 -0800 Subject: [PATCH 34/43] fix: GLFW fixes for gui-v2 Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index b5995a1..fc4dc55 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -199,6 +199,7 @@ parts: - libopencv-imgproc406t64 - libopencv-videoio406t64 - libopenexr-3-1-30 + - libegl1 - libopengl0 - libopenjp2-7 - libopenmpt0t64 @@ -319,6 +320,8 @@ parts: - opt - usr/lib - usr/share/X11 + - usr/share/glvnd + - etc/glvnd - -opt/MoonRay/build-deps - -opt/MoonRay/installs/include - -opt/MoonRay/installs/openmoonray/include From 0a446ddc17f181e56244eaa587a1c94b94647b7e Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 10:15:41 +0100 Subject: [PATCH 35/43] iterating Signed-off-by: Ken VanDine --- moonray/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/moonray/CMakeLists.txt b/moonray/CMakeLists.txt index 737f3c3..2087863 100644 --- a/moonray/CMakeLists.txt +++ b/moonray/CMakeLists.txt @@ -1,11 +1,11 @@ # Copyright 2023-2025 DreamWorks Animation LLC # SPDX-License-Identifier: Apache-2.0 -add_subdirectory(hydra) +#add_subdirectory(hydra) add_subdirectory(mcrt_denoise) add_subdirectory(moonray) add_subdirectory(moonray_arras) -add_subdirectory(moonray_dcc_plugins) +#add_subdirectory(moonray_dcc_plugins) add_subdirectory(moonshine) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/moonshine_dwa) add_subdirectory(moonshine_dwa) From 2e6526fe9d2f296e5383545883d26a2301b7f13e Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 10:30:09 +0100 Subject: [PATCH 36/43] Added nvidia package-repositories Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index fc4dc55..40c92bd 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -29,6 +29,14 @@ layout: /usr/share/X11: bind: $SNAP/usr/share/X11 +package-repositories: + - type: apt + formats: [deb] + architectures: [amd64] + path: / + key-id: EB693B3035CD5710E231E123A4B469963BF863CC + url: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 + parts: openmoonray: plugin: cmake From c641ecf4263e9e99faaa39a3316e10f2ad13a168 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 11:37:31 +0100 Subject: [PATCH 37/43] Added external TBB Signed-off-by: Ken VanDine --- building/Ubuntu24/CMakeLists.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/building/Ubuntu24/CMakeLists.txt b/building/Ubuntu24/CMakeLists.txt index e3d3670..953f1f3 100644 --- a/building/Ubuntu24/CMakeLists.txt +++ b/building/Ubuntu24/CMakeLists.txt @@ -145,6 +145,18 @@ ExternalProject_Add(OpenImageDenoise ) set(CHAIN OpenImageDenoise) +# NEW, make sure this isn't before OIIO or it breaks OIIO +ExternalProject_Add(TBB + URL https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2020.3.3.tar.gz + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND "" + BUILD_COMMAND make ${JOBS_ARG} arch=amd64 + INSTALL_COMMAND bash -c "cp build/*_release/libtbb*.* ${InstallRoot}/lib" + COMMAND bash -c "cp -r include/tbb ${InstallRoot}/include" + DEPENDS ${CHAIN} +) +set(CHAIN TBB) + if(NOT NO_USD) ExternalProject_Add(USD GIT_REPOSITORY https://github.com/PixarAnimationStudios/USD From 1d476da2f80ce64c9b099d9c4a9014ee2760ce40 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 22 Oct 2025 16:33:00 +0100 Subject: [PATCH 38/43] Working version Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 40c92bd..2df360c 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -37,6 +37,10 @@ package-repositories: key-id: EB693B3035CD5710E231E123A4B469963BF863CC url: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 +layout: + /usr/share/X11: + bind: $SNAP/usr/share/X11 + parts: openmoonray: plugin: cmake From 7be0067e6c00b677ed8f906c73a157c3ef493ad3 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Mon, 24 Nov 2025 12:52:50 -0500 Subject: [PATCH 39/43] Manually merged some build fixes from main Signed-off-by: Ken VanDine --- building/Ubuntu24/CMakeLists.txt | 12 ++++++++++++ moonray/CMakeLists.txt | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/building/Ubuntu24/CMakeLists.txt b/building/Ubuntu24/CMakeLists.txt index 953f1f3..2c0259c 100644 --- a/building/Ubuntu24/CMakeLists.txt +++ b/building/Ubuntu24/CMakeLists.txt @@ -157,6 +157,18 @@ ExternalProject_Add(TBB ) set(CHAIN TBB) +ExternalProject_Add(OpenImageDenoise + URL https://github.com/OpenImageDenoise/oidn/releases/download/v2.3.3/oidn-2.3.3.src.tar.gz + INSTALL_DIR ${InstallRoot} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:PATH= + -DISPC_EXECUTABLE=/bin/ispc + -DTBB_ROOT= + -DOIDN_APPS=OFF + DEPENDS ${CHAIN} +) +set(CHAIN OpenImageDenoise) + if(NOT NO_USD) ExternalProject_Add(USD GIT_REPOSITORY https://github.com/PixarAnimationStudios/USD diff --git a/moonray/CMakeLists.txt b/moonray/CMakeLists.txt index 2087863..cc42dc5 100644 --- a/moonray/CMakeLists.txt +++ b/moonray/CMakeLists.txt @@ -13,7 +13,7 @@ endif() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/moonray_tools) add_subdirectory(moonray_tools) endif() -add_subdirectory(moonshine_usd) +#add_subdirectory(moonshine_usd) add_subdirectory(render_profile_viewer) add_subdirectory(scene_rdl2) From a3928f94576ad88b046c3f0a3aebbcc7618ebd58 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Tue, 9 Dec 2025 22:19:16 -0500 Subject: [PATCH 40/43] feat: Enable USD and build hydra plugin Signed-off-by: Ken VanDine --- moonray/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/moonray/CMakeLists.txt b/moonray/CMakeLists.txt index cc42dc5..737f3c3 100644 --- a/moonray/CMakeLists.txt +++ b/moonray/CMakeLists.txt @@ -1,11 +1,11 @@ # Copyright 2023-2025 DreamWorks Animation LLC # SPDX-License-Identifier: Apache-2.0 -#add_subdirectory(hydra) +add_subdirectory(hydra) add_subdirectory(mcrt_denoise) add_subdirectory(moonray) add_subdirectory(moonray_arras) -#add_subdirectory(moonray_dcc_plugins) +add_subdirectory(moonray_dcc_plugins) add_subdirectory(moonshine) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/moonshine_dwa) add_subdirectory(moonshine_dwa) @@ -13,7 +13,7 @@ endif() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/moonray_tools) add_subdirectory(moonray_tools) endif() -#add_subdirectory(moonshine_usd) +add_subdirectory(moonshine_usd) add_subdirectory(render_profile_viewer) add_subdirectory(scene_rdl2) From 70c4e569ff72701bd8da9c16319761faae336a10 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Mon, 15 Jun 2026 11:23:30 -0400 Subject: [PATCH 41/43] Fixed bad merge in snapcraft.yaml Signed-off-by: Ken VanDine --- snap/snapcraft.yaml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 2df360c..fc4dc55 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -29,18 +29,6 @@ layout: /usr/share/X11: bind: $SNAP/usr/share/X11 -package-repositories: - - type: apt - formats: [deb] - architectures: [amd64] - path: / - key-id: EB693B3035CD5710E231E123A4B469963BF863CC - url: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 - -layout: - /usr/share/X11: - bind: $SNAP/usr/share/X11 - parts: openmoonray: plugin: cmake From 162bac48171ef01bc13ace44733a2bdced8ed99e Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Mon, 15 Jun 2026 11:57:49 -0400 Subject: [PATCH 42/43] Fixed another bad merge, duplication Signed-off-by: Ken VanDine --- building/Ubuntu24/CMakeLists.txt | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/building/Ubuntu24/CMakeLists.txt b/building/Ubuntu24/CMakeLists.txt index 2c0259c..e3d3670 100644 --- a/building/Ubuntu24/CMakeLists.txt +++ b/building/Ubuntu24/CMakeLists.txt @@ -145,30 +145,6 @@ ExternalProject_Add(OpenImageDenoise ) set(CHAIN OpenImageDenoise) -# NEW, make sure this isn't before OIIO or it breaks OIIO -ExternalProject_Add(TBB - URL https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2020.3.3.tar.gz - BUILD_IN_SOURCE 1 - CONFIGURE_COMMAND "" - BUILD_COMMAND make ${JOBS_ARG} arch=amd64 - INSTALL_COMMAND bash -c "cp build/*_release/libtbb*.* ${InstallRoot}/lib" - COMMAND bash -c "cp -r include/tbb ${InstallRoot}/include" - DEPENDS ${CHAIN} -) -set(CHAIN TBB) - -ExternalProject_Add(OpenImageDenoise - URL https://github.com/OpenImageDenoise/oidn/releases/download/v2.3.3/oidn-2.3.3.src.tar.gz - INSTALL_DIR ${InstallRoot} - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX:PATH= - -DISPC_EXECUTABLE=/bin/ispc - -DTBB_ROOT= - -DOIDN_APPS=OFF - DEPENDS ${CHAIN} -) -set(CHAIN OpenImageDenoise) - if(NOT NO_USD) ExternalProject_Add(USD GIT_REPOSITORY https://github.com/PixarAnimationStudios/USD From 18093fcbcdd82f44a2d6256798c70a67230d0d8e Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Mon, 15 Jun 2026 13:02:16 -0400 Subject: [PATCH 43/43] snap: Update snap metadata Signed-off-by: Ken VanDine --- snap/gui/logo.png | Bin 0 -> 56706 bytes snap/snapcraft.yaml | 22 ++++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 snap/gui/logo.png diff --git a/snap/gui/logo.png b/snap/gui/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3278ef191b8153ca68899a4ac360727b3e5dbd GIT binary patch literal 56706 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 literal 0 HcmV?d00001 diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index fc4dc55..9048706 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -2,15 +2,25 @@ name: openmoonray base: core24 adopt-info: openmoonray title: MoonRay -summary: MoonRay is DreamWorks’ open-source production path tracer +summary: MoonRay is an open-source state-of-the-art production path tracer description: | - MoonRay is DreamWorks’ open-source, award-winning, state-of-the-art - production path tracer. + MoonRay is an Academy Software Foundation project, originally developed at + DreamWorks Animation. This multi-award-winning, state-of-the-art production + MCRT renderer has been used on feature films such as How to Train Your + Dragon: The Hidden World, The Bad Guys, Puss In Boots: The Last Wish, + Kung Fu Panda 4, The Wild Robot, The Bad Guys 2, and future titles. + + MoonRay continues in active development and includes an extensive library of + production-tested, physically based materials, a USD Hydra render delegate, + multi-machine and cloud rendering via the Arras distributed computation + framework. + license: Apache-2.0 -source-code: https://github.com/dreamworksanimation/openmoonray -contact: https://github.com/dreamworksanimation/openmoonray/issues -issues: https://github.com/dreamworksanimation/openmoonray/issues +source-code: https://github.com/OpenMoonRay/openmoonray +contact: https://github.com/OpenMoonRay/openmoonray/issues +issues: https://github.com/OpenMoonRay/openmoonray/issues website: https://openmoonray.org/ +icon: snap/gui/logo.png grade: stable confinement: strict