diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 73379dcb..ceaba7b4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ -name: OSPRay Studio Main CI +name: (Internal) OSPRay Studio Main CI # XXX This uses FetchContent on the other components' release packages # XXX not their devel branches. @@ -33,15 +33,6 @@ jobs: artifact-out: build-centos8 artifact-path: build - build-ubuntu18-04: - secrets: inherit - uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/docker.yml@main - with: - image: ubuntu:18.04 - cmd: gitlab/build.sh - artifact-out: build-ubuntu18-04 - artifact-path: build - build-ubuntu20-04: secrets: inherit uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/docker.yml@main @@ -118,12 +109,12 @@ jobs: needs: build-rocky8-7 uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/docker.yml@main with: - # Run the rocky8-7 build on the ubuntu 18.04 image as a test, and because it has vncserver installed - image: rockylinux:8.7-tgt-rebuild + image: rockylinux:8.7 pre-cmd: yum -y install tigervnc-server mesa-libGLU cmd: | module load intel/2023.0 build/ospStudio --verify_install + mkdir build/model-results # in case run-dev tests fail artifacts will still upload gitlab/run-dev.sh gitlab/run-dev-img-cmp.sh artifact-in: build-rocky8-7 @@ -134,8 +125,7 @@ jobs: ### Devel Coverity Job ### static-analysis: secrets: inherit - #uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/static_analysis.yml@main - uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/static_analysis.yml@tgt/coverity_env + uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/static_analysis.yml@main with: project: OSPRay Studio prebuild: > diff --git a/.github/workflows/external.ci.yml b/.github/workflows/external.ci.yml new file mode 100644 index 00000000..b44d0757 --- /dev/null +++ b/.github/workflows/external.ci.yml @@ -0,0 +1,133 @@ +## Copyright 2024 Intel Corporation +## SPDX-License-Identifier: Apache-2.0 + +name: OSPRay Studio CI + +on: + push: + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + + build-rocky-8: + runs-on: ubuntu-latest + container: + image: rockylinux:8 + + steps: + - name: Install packages + run: | + echo "Installing build dependencies..." + dnf update -y + dnf install -y git cmake mesa-libGL-devel libXrandr-devel libXinerama-devel libXcursor-devel libXi-devel python3.11-devel + dnf group install -y "Development Tools" + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Build + run: | + mkdir build + cd build + cmake .. + make -j$(nproc) install + - name: Upload build + uses: actions/upload-artifact@v4 + with: + name: build-rocky-8 + path: build/install + + test-rocky-8: + needs: build-rocky-8 + runs-on: ubuntu-latest + container: + image: rockylinux:8 + + steps: + - name: Install packages + run: | + dnf update -y + dnf install -y mesa-libGL mesa-dri-drivers xorg-x11-server-Xvfb + - name: Download build + uses: actions/download-artifact@v4 + with: + name: build-rocky-8 + + - name: Run tests + run: | + chmod +x ./bin/* + set +e + timeout --preserve-status 10s xvfb-run ./bin/ospStudio + exitCode=$? + set -e + if [ "${exitCode}" -eq 143 ]; then + echo "code 143 is SIGTERM, which we expect from terminating the studio GUI" + exitCode=0 + fi + echo "Exit code: ${exitCode}" + exit $exitCode + build-ubuntu-2204: + runs-on: ubuntu-latest + container: + image: ubuntu:22.04 + + steps: + - name: Install packages + run: | + echo "Installing build dependencies..." + apt update + apt upgrade -y + apt install -y build-essential cmake ninja-build libglfw3-dev libgl1-mesa-dev libxinerama-dev libxcursor-dev libxi-dev git python3-dev + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Build + run: | + mkdir build + cd build + cmake .. + make -j$(nproc) install + - name: Upload build + uses: actions/upload-artifact@v4 + with: + name: build-ubuntu-2204 + path: build/install + + test-ubuntu-2204: + needs: build-ubuntu-2204 + runs-on: ubuntu-latest + container: + image: ubuntu:22.04 + + steps: + - name: Install packages + run: | + echo "Installing build dependencies..." + apt update + apt upgrade -y + apt install -y libglfw3 xvfb + - name: Download build + uses: actions/download-artifact@v4 + with: + name: build-ubuntu-2204 + + - name: Run tests + run: | + chmod +x ./bin/* + set +e + timeout --preserve-status 10s xvfb-run ./bin/ospStudio + exitCode=$? + set -e + if [ "${exitCode}" -eq 143 ]; then + echo "code 143 is SIGTERM, which we expect from terminating the studio GUI" + exitCode=0 + fi + echo "Exit code: ${exitCode}" + exit $exitCode \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5d0a0056..7fcc7a62 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,5 +1,5 @@ -name: OSPRay Studio Release +name: (Internal) OSPRay Studio Release # XXX This uses FetchContent on the other components' release packages # XXX not their devel branches. @@ -28,8 +28,7 @@ jobs: uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/docker.yml@main with: force-delete: true # guarantees .gitattributes are respected in working dir -# image: rockylinux:8.7 - image: ubuntu:22.04 # temp, to use OSPRay v3.0.0 SYCL build + image: ubuntu:22.04 cmd: | module load cmake/3.25.3 module load intel/2023.0 @@ -58,7 +57,7 @@ jobs: secrets: inherit uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/macos.yml@main with: - runs-on: '[ "macOS", "sign", "x86_64" ]' + runs-on: '[ "sign", "x86_64" ]' cmd: | gitlab/macos.sh package artifact-out: release-macos @@ -70,10 +69,7 @@ jobs: needs: release-linux uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/docker.yml@main with: - # Run the rockylinux 8.7 build on the ubuntu 18.04 image as a test, and because it has vncserver installed - #image: ubuntu:18.04 - #image: rockylinux:8.7-tgt-rebuild - image: ubuntu:22.04 # temp, to use OSPRay v3.0.0 SYCL build + image: ubuntu:22.04 #pre-cmd: yum -y install tigervnc-server mesa-libGLU cmd: | module load intel/2023.0 @@ -125,10 +121,10 @@ jobs: needs: release-macos uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/macos.yml@main with: - runs-on: '[ "macOS", "sign", "x86_64" ]' + runs-on: '[ "sign", "x86_64" ]' cmd: | unzip $GITHUB_WORKSPACE/build-macos/package/*.zip - $SIGN_FILE_MAC -t $GITHUB_WORKSPACE/ospray_studio-*/bin/* $GITHUB_WORKSPACE/ospray_studio-*/lib/*.dylib $GITHUB_WORKSPACE/build-macos/package/*.pkg + sign-path-verify: ospray_studio-*/bin/* ospray_studio-*/lib/*.dylib build-macos/package/*.pkg artifact-in: release-macos ### Scan Jobs ### @@ -139,8 +135,7 @@ jobs: static-analysis: secrets: inherit - #uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/static_analysis.yml@main - uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/static_analysis.yml@tgt/coverity_env + uses: intel-innersource/libraries.devops.renderkit.workflows/.github/workflows/static_analysis.yml@main with: coverity: true image: rockylinux:8.7 diff --git a/CHANGELOG.md b/CHANGELOG.md index c927765f..50aa3f4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,37 @@ Version History --------------- +### Changes in OSPRay Studio v1.1.0 + +- Compatible with OSPRay release v3.2.0 + +- Features and Improvements + - Add support for new OSPRay functionality:
+ - Blue noise sampling enabled through setting `accumLimit` + - Tonemapper post-process adjustments without re-rendering + - OpenImageDenoise quality settings and denoise alpha channel through UI and + new command line parameters: + - "--denoiseQuality" {low, medium, high} sets the final frame quality + - "--denoiseAlpha" enables denoising the alpha channel + - Half-float texture format supported for EXR textures + - Support for new OSPRay param `limitIndirectLightSamples` optimization + which limits the number of light samples after the first non-specular + (i.e., diffuse and glossy) bounce to at most one. + - Added glTF importer support for EXT_mesh_gpu_instancing to allow loading of + highly instanced scenes. +

+ +- Cleanup and bug fixes: + - Fixes for glTF PBR materials:
+ - normal channel, previously used default normal + that affects all layers, including coat. Now baseNormal and coatNormal + are considered separately. + - `sheenColorTexture` parameter was not applied correctly + - Removed `thicknessTexture` from KHR_materials_volume to allow ray-depth + to determine thickness. + - Fix verify install condition to report ospInit errors correctly + - Update 3rd party dependencies + ### Changes in OSPRay Studio v1.0.0 - Compatible with OSPRay release v3.1.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index cca5a1e4..1c559000 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.15) -project(ospray_studio VERSION 1.0.0 LANGUAGES CXX C) +project(ospray_studio VERSION 1.1.0 LANGUAGES CXX C) include(GNUInstallDirs) include(ProcessorCount) diff --git a/README.md b/README.md index 1a8b110b..3c647d0a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # OSPRay Studio -This is release v1.0.0 of IntelĀ® OSPRay Studio. It is released under the +This is release v1.1.0 of IntelĀ® OSPRay Studio. It is released under the Apache 2.0 license. Visit [**OSPRay Studio**](http://www.ospray.org/ospray_studio) @@ -72,21 +72,21 @@ listed in OS-specific building process below. ### Required dependencies - [CMake](https://www.cmake.org) (v3.15+) and any C++14 compiler -- Intel [OSPRay](https://www.github.com/ospray/ospray) (v3.1.0) and its +- Intel [OSPRay](https://www.github.com/ospray/ospray) (v3.2.0) and its dependencies - OSPRay Studio builds on top of OSPRay. Instructions on building OSPRay are provided [here](http://www.ospray.org/downloads.html#building-and-finding-ospray). OSPRay and OSPRay Studio have the following common dependencies which Studio can hence leverage from an OSPRay build. - - Intel oneAPI Rendering Toolkit common library - [rkcommon](https://www.github.com/ospray/rkcommon) (v1.13.0) + - Intel Rendering Toolkit common library + [rkcommon](https://www.github.com/ospray/rkcommon) (v1.14.0) - Intel [Threading Building Blocks](https://www.threadingbuildingblocks.org/) -- OpenGL and [GLFW](https://www.glfw.org) (v3.3.9) - for the windowing environment +- OpenGL and [GLFW](https://www.glfw.org) (v3.3.10) - for the windowing environment ### Optional Dependencies -- Intel [Open Image Denoise](https://openimagedenoise.github.io) - (v2.2.0 or +- Intel [Open Image Denoise](https://openimagedenoise.github.io) - (v2.3.0 or newer) for denoising frames. To use with OSPRay Studio, OSPRay must be built with `-DBUILD_OIDN=ON` in CMake. - [OpenVDB](https://www.openvdb.org/) to support loading VDB formatted volume files. diff --git a/app/Batch.cpp b/app/Batch.cpp index f6dbf417..5b47863b 100644 --- a/app/Batch.cpp +++ b/app/Batch.cpp @@ -370,17 +370,23 @@ void BatchContext::render() void BatchContext::renderFrame() { + auto &fb = frame->childAs("framebuffer"); + auto &v = frame->childAs("renderer")["varianceThreshold"]; + auto varianceThreshold = v.valueAs(); + float fbVariance{inf}; + if (studioCommon.denoiserAvailable && optDenoiser) { frame->denoiseFB = true; frame->denoiseFBFinalFrame = true; + // Set denoiser final frame quality and denoiseAlpha command line options + auto denoiser = fb.getDenoiser(); + if (denoiser) { + denoiser->child("final") = optDenoiseQuality; + denoiser->child("denoiseAlpha") = optDenoiseAlpha; + } } frame->immediatelyWait = true; - auto &fb = frame->childAs("framebuffer"); - auto &v = frame->childAs("renderer")["varianceThreshold"]; - auto varianceThreshold = v.valueAs(); - float fbVariance{inf}; - // continue accumulation till variance threshold or accumulation limit is // reached do { diff --git a/app/GUIContext.cpp b/app/GUIContext.cpp index 36b28676..95198c64 100644 --- a/app/GUIContext.cpp +++ b/app/GUIContext.cpp @@ -86,6 +86,12 @@ void GUIContext::start() frame->denoiseFB = true; frame->denoiseFBFinalFrame = optDenoiseFinalFrame; framebuffer->child("floatFormat") = true; + // Set denoiser final frame quality and denoiseAlpha command line options + auto denoiser = framebuffer->getDenoiser(); + if (denoiser) { + denoiser->child("final") = optDenoiseQuality; + denoiser->child("denoiseAlpha") = optDenoiseAlpha; + } framebuffer->commit(); } refreshRenderer(); diff --git a/app/MainMenuBuilder.h b/app/MainMenuBuilder.h index aca3ec44..01cac378 100644 --- a/app/MainMenuBuilder.h +++ b/app/MainMenuBuilder.h @@ -308,6 +308,10 @@ void MainMenuBuilder::buildMainMenuView() GenerateWidget(renderer["varianceThreshold"]); GenerateWidget(renderer["backgroundColor"]); + // Backplate can also be changed directly by changing the renderer + // parameter. Keep them in sync. + ctx->backPlateTexture = renderer["backplate_filename"].valueAs(); + if (ImGui::MenuItem("Set background texture...")) showFileBrowser = true; if (!ctx->backPlateTexture.str().empty()) { @@ -443,6 +447,8 @@ void MainMenuBuilder::buildMainMenuView() if (!fileList.empty()) { ctx->backPlateTexture = fileList[0]; + auto &renderer = ctx->frame->childAs("renderer"); + renderer["backplate_filename"] = ctx->backPlateTexture; ctx->refreshRenderer(); } } diff --git a/app/Plugin.h b/app/Plugin.h index a5286797..113593b6 100644 --- a/app/Plugin.h +++ b/app/Plugin.h @@ -18,6 +18,8 @@ #endif #endif +using json = nlohmann::json; + namespace ospray { struct Plugin @@ -29,9 +31,11 @@ struct Plugin PanelList panels; std::string name() const; + virtual void sendToPlugin(json &data); + bool supportsSendToPlugin{false}; protected: - Plugin(const std::string &pluginName); + Plugin(const std::string &pluginName, const bool &supportsSendToPlugin); private: std::string pluginName; @@ -44,6 +48,11 @@ inline std::string Plugin::name() const return pluginName; } -inline Plugin::Plugin(const std::string &_name) : pluginName(_name) {} +inline Plugin::Plugin( + const std::string &_name, const bool &sendToPlugin = false) + : pluginName(_name), supportsSendToPlugin(sendToPlugin) +{} + +inline void Plugin::sendToPlugin(json &data) {} } // namespace ospray diff --git a/app/WindowsBuilder.h b/app/WindowsBuilder.h index 7b8f063c..4f3af932 100644 --- a/app/WindowsBuilder.h +++ b/app/WindowsBuilder.h @@ -322,35 +322,43 @@ void WindowsBuilder::buildWindowFrameBufferEditor() ImVec4(.5f, .5f, .5f, 1.f), "Enable float format for more buffers"); } - // Only float buffers will be inverted - ImGui::SameLine(); - ImGui::NewLine(); - if (fb.isFloatFormat()) - ImGui::Checkbox("Invert values##displayInverted", &invertBuffer); + // Only float buffers will be inverted + ImGui::SameLine(); + ImGui::NewLine(); + if (fb.isFloatFormat()) + ImGui::Checkbox("Invert values##displayInverted", &invertBuffer); - ctx->selectBuffer(whichBuffer, invertBuffer); + ctx->selectBuffer(whichBuffer, invertBuffer); ImGui::Separator(); ImGui::Text("Post-processing"); - ImGui::Checkbox("Tonemap", &ctx->frame->toneMapFB); - ImGui::SameLine(); - ImGui::Checkbox("Tonemap nav", &ctx->frame->toneMapNavFB); - - if (ctx->studioCommon.denoiserAvailable) { - ImGui::Checkbox("Denoise", &ctx->frame->denoiseFB); - ImGui::SameLine(); - ImGui::Checkbox("Denoise nav", &ctx->frame->denoiseNavFB); - } - if (ctx->frame->denoiseFB || ctx->frame->denoiseNavFB) { - ImGui::Checkbox("Denoise only PathTracer", &ctx->frame->denoiseOnlyPathTracer); - ImGui::Checkbox("Denoise on final frame", &ctx->frame->denoiseFBFinalFrame); - ImGui::SameLine(); - // Add accum here for convenience with final-frame denoising - ImGui::SetNextItemWidth(5 * ImGui::GetFontSize()); - ImGui::DragInt( - "Limit accumulation", &ctx->frame->accumLimit, 1, 0, INT_MAX, "%d frames"); - } + ImGui::Checkbox("Tonemap", &ctx->frame->toneMapFB); + if (ctx->frame->toneMapFB && fb.getToneMapper()) + fb.getToneMapper()->traverse( + sg::TreeState::ALLOPEN); + + if (ctx->studioCommon.denoiserAvailable) { + ImGui::Checkbox("Denoise", &ctx->frame->denoiseFB); + ImGui::SameLine(); + ImGui::Checkbox("Denoise nav", &ctx->frame->denoiseNavFB); + } + if (ctx->frame->denoiseFB || ctx->frame->denoiseNavFB) { + if (fb.getDenoiser()) + fb.getDenoiser()->traverse( + sg::TreeState::ALLOPEN); + ImGui::Checkbox("Denoise only PathTracer", &ctx->frame->denoiseOnlyPathTracer); + ImGui::Checkbox("Denoise on final frame", &ctx->frame->denoiseFBFinalFrame); + ImGui::SameLine(); + // Add accum here for convenience with final-frame denoising + ImGui::SetNextItemWidth(5 * ImGui::GetFontSize()); + ImGui::DragInt("Limit accumulation", + &ctx->frame->accumLimit, + 1, + 0, + INT_MAX, + "%d frames"); + } ImGui::Separator(); diff --git a/app/ospStudio.cpp b/app/ospStudio.cpp index fb98e4ee..9cf62e8d 100644 --- a/app/ospStudio.cpp +++ b/app/ospStudio.cpp @@ -245,6 +245,26 @@ void StudioContext::addToCommandLine(std::shared_ptr app) optDenoiseFinalFrame, "Denoise only when accum limit is reached" )->check(CLI::IsMember({true, false})); + app->add_option( + "--denoiseQuality", + [&](const std::vector val) { + std::map quality = + {{"low", OSP_DENOISER_QUALITY_LOW}, + {"medium", OSP_DENOISER_QUALITY_MEDIUM}, + {"high", OSP_DENOISER_QUALITY_HIGH}}; + if (quality.count(val[0]) == 0) + return false; + else + optDenoiseQuality = quality[val[0]]; + return true; + }, + "Denoiser final frame quality" + )->check(CLI::IsMember({"low", "medium", "high"})); + app->add_flag( + "--denoiseAlpha", + optDenoiseAlpha, + "Denoise the alpha channel as well" + )->check(CLI::IsMember({true, false})); app->add_option( "--camera", optCameraRange, @@ -366,10 +386,6 @@ int main(int argc, const char *argv[]) // Initialize OSPRay OSPError error = initializeOSPRay(argc, argv, use_mpi); - if (error != OSP_NO_ERROR) { - std::cerr << " OSPRay Initialization Error: " << error << std::endl; - return error; - } // Verify install then exit if (verify_install) { @@ -378,6 +394,9 @@ int main(int argc, const char *argv[]) std::cout << " OSPRay Studio install " << (fail ? "failed" : "verified") << std::endl; return fail; + } else if (error != OSP_NO_ERROR) { + std::cerr << " OSPRay Initialization Error: " << error << std::endl; + return error; } // Check for module denoiser support after iniaitlizing OSPRay diff --git a/app/ospStudio.h b/app/ospStudio.h index 435e18bb..f2daa47c 100644 --- a/app/ospStudio.h +++ b/app/ospStudio.h @@ -172,6 +172,8 @@ class StudioContext : public std::enable_shared_from_this OSPPixelFilterType optPF{OSP_PIXELFILTER_GAUSS}; bool optDenoiser{false}; bool optDenoiseFinalFrame{false}; + OSPDenoiserQuality optDenoiseQuality{OSP_DENOISER_QUALITY_MEDIUM}; + bool optDenoiseAlpha{false}; bool optGridEnable{false}; vec3i optGridSize{1, 1, 1}; OSPStereoMode optStereoMode{OSP_STEREO_NONE}; diff --git a/app/widgets/GenerateImGuiWidgets.h b/app/widgets/GenerateImGuiWidgets.h index 8b74b6ad..6ae4e943 100644 --- a/app/widgets/GenerateImGuiWidgets.h +++ b/app/widgets/GenerateImGuiWidgets.h @@ -588,6 +588,7 @@ static std::map widgetGenerators = { {"OSPCurveBasis", generateWidget_int}, {"OSPCurveType", generateWidget_int}, {"OSPDataType", generateWidget_int}, + {"OSPDenoiserQuality", generateWidget_int}, {"OSPDeviceProperty", generateWidget_int}, {"OSPError", generateWidget_int}, {"OSPFrameBufferChannel", generateWidget_int}, diff --git a/cmake/benchmark.cmake b/cmake/benchmark.cmake index 38714254..5da22663 100644 --- a/cmake/benchmark.cmake +++ b/cmake/benchmark.cmake @@ -6,7 +6,7 @@ ## if(NOT DEFINED BENCHMARK_VERSION) - set(BENCHMARK_VERSION 1.8.3) + set(BENCHMARK_VERSION 1.8.5) endif() ## diff --git a/cmake/glfw.cmake b/cmake/glfw.cmake index 0dbc76e1..a8d1c3ed 100644 --- a/cmake/glfw.cmake +++ b/cmake/glfw.cmake @@ -6,7 +6,7 @@ if(glfw3_FOUND) endif() if(NOT DEFINED GLFW_VERSION) - set(GLFW_VERSION 3.3.9) + set(GLFW_VERSION 3.3.10) endif() ## Look for any available version diff --git a/cmake/glfw.patch b/cmake/glfw.patch index 929fd816..742b663d 100644 --- a/cmake/glfw.patch +++ b/cmake/glfw.patch @@ -12,10 +12,10 @@ index 708975d1..d916b922 100644 #define _glfw_dlsym(handle, name) GetProcAddress((HMODULE) handle, name) #else diff --git a/src/wgl_context.c b/src/wgl_context.c -index eebf6cd5..8a72d676 100644 +index b245b292..042e0f25 100644 --- a/src/wgl_context.c +++ b/src/wgl_context.c -@@ -405,7 +405,7 @@ GLFWbool _glfwInitWGL(void) +@@ -422,7 +422,7 @@ GLFWbool _glfwInitWGL(void) if (_glfw.wgl.instance) return GLFW_TRUE; diff --git a/cmake/ospray.cmake b/cmake/ospray.cmake index e625e9fd..82b29efe 100644 --- a/cmake/ospray.cmake +++ b/cmake/ospray.cmake @@ -10,7 +10,7 @@ message(STATUS "Looking for OSPRay...") find_package(ospray QUIET) if(NOT DEFINED OSPRAY_VERSION) - set(OSPRAY_VERSION 3.1.0) + set(OSPRAY_VERSION 3.2.0) endif() if(ospray_FOUND) diff --git a/cmake/pybind11.cmake b/cmake/pybind11.cmake index 68b4ff9f..07c3367f 100644 --- a/cmake/pybind11.cmake +++ b/cmake/pybind11.cmake @@ -6,7 +6,7 @@ ## if(NOT DEFINED PYBIND11_VERSION) - set(PYBIND11_VERSION 2.11.1) + set(PYBIND11_VERSION 2.13.1) endif() ## diff --git a/cmake/rkcommon.cmake b/cmake/rkcommon.cmake index 1589f407..c6b7a61a 100644 --- a/cmake/rkcommon.cmake +++ b/cmake/rkcommon.cmake @@ -13,7 +13,7 @@ message(STATUS "Looking for rkcommon...") find_package(rkcommon QUIET) if(NOT DEFINED RKCOMMON_VERSION) - set(RKCOMMON_VERSION 1.13.0) + set(RKCOMMON_VERSION 1.14.0) endif() if(rkcommon_FOUND) diff --git a/cmake/tbb.cmake b/cmake/tbb.cmake index bd6d063e..9cbbea9a 100644 --- a/cmake/tbb.cmake +++ b/cmake/tbb.cmake @@ -6,7 +6,7 @@ if(TBB_FOUND) endif() if(NOT DEFINED TBB_VERSION) - set(TBB_VERSION 2021.11.0) + set(TBB_VERSION 2021.13.0) endif() option(FORCE_TBB_VERSION "Force CMake to find ${TBB_VERSION} (typically for compatibility with pre-built OSPRay)" OFF) diff --git a/docs/components/download.markdown b/docs/components/download.markdown index 97ae9caa..74147c32 100644 --- a/docs/components/download.markdown +++ b/docs/components/download.markdown @@ -3,7 +3,7 @@ OSPRay Studio is available for Linux, macOS, and Windows. Binary packages of the latest release of OSPRay Studio can be downloaded as a -part of [Intel oneAPI Rendering +part of [Intel Rendering Toolkit](https://software.intel.com/content/www/us/en/develop/tools/oneapi/download.html#renderkit). OSPRay Studio sources can be downloaded from the default `master` branch of diff --git a/docs/quickstart.md b/docs/quickstart.md index f6002fbe..bb193a23 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -10,8 +10,7 @@ OSPRay Studio is available for Linux, macOS, and Windows. Binary packages of the latest release of OSPRay Studio can be downloaded -as a part of [Intel oneAPI Rendering -Toolkit](https://software.intel.com/content/www/us/en/develop/tools/oneapi/download.html#renderkit). +from [GitHub Releases](https://github.com/RenderKit/ospray-studio/releases). OSPRay Studio sources can be downloaded from the default `master` branch of [OSPRay Studio Github @@ -31,7 +30,7 @@ OSPRay Studio has the following required and optional dependencies. - Intel [Open VKL](https://www.github.com/openvkl/openvkl) (v0.12.0) - Intel [Embree](https://www.github.com/embree/embree) (v3.12.0) - - Intel oneAPI Rendering Toolkit common library + - Intel Rendering Toolkit common library [rkcommon](https://www.github.com/ospray/rkcommon) (v1.6.0) - Intel [Threading Building Blocks](https://www.threadingbuildingblocks.org/) diff --git a/external/cli11/CLI11.hpp b/external/cli11/CLI11.hpp index 02b9e0b6..8a5b4c54 100644 --- a/external/cli11/CLI11.hpp +++ b/external/cli11/CLI11.hpp @@ -1,11 +1,11 @@ -// CLI11: Version 2.4.0 +// CLI11: Version 2.4.2 // Originally designed by Henry Schreiner // https://github.com/CLIUtils/CLI11 // // This is a standalone header file generated by MakeSingleHeader.py in CLI11/scripts -// from: v2.4.0 +// from: v2.4.2 // -// CLI11 2.4.0 Copyright (c) 2017-2024 University of Cincinnati, developed by Henry +// CLI11 2.4.2 Copyright (c) 2017-2024 University of Cincinnati, developed by Henry // Schreiner under NSF AWARD 1414736. All rights reserved. // // Redistribution and use in source and binary forms of CLI11, with or without @@ -66,8 +66,8 @@ #define CLI11_VERSION_MAJOR 2 #define CLI11_VERSION_MINOR 4 -#define CLI11_VERSION_PATCH 0 -#define CLI11_VERSION "2.4.0" +#define CLI11_VERSION_PATCH 2 +#define CLI11_VERSION "2.4.2" @@ -1451,22 +1451,22 @@ class RequiredError : public ParseError { if((min_option == 1) && (max_option == 1) && (used == 0)) return RequiredError("Exactly 1 option from [" + option_list + "]"); if((min_option == 1) && (max_option == 1) && (used > 1)) { - return {"Exactly 1 option from [" + option_list + "] is required and " + std::to_string(used) + + return {"Exactly 1 option from [" + option_list + "] is required but " + std::to_string(used) + " were given", ExitCodes::RequiredError}; } if((min_option == 1) && (used == 0)) return RequiredError("At least 1 option from [" + option_list + "]"); if(used < min_option) { - return {"Requires at least " + std::to_string(min_option) + " options used and only " + - std::to_string(used) + "were given from [" + option_list + "]", + return {"Requires at least " + std::to_string(min_option) + " options used but only " + + std::to_string(used) + " were given from [" + option_list + "]", ExitCodes::RequiredError}; } if(max_option == 1) return {"Requires at most 1 options be given from [" + option_list + "]", ExitCodes::RequiredError}; - return {"Requires at most " + std::to_string(max_option) + " options be used and " + std::to_string(used) + - "were given from [" + option_list + "]", + return {"Requires at most " + std::to_string(max_option) + " options be used but " + std::to_string(used) + + " were given from [" + option_list + "]", ExitCodes::RequiredError}; } }; @@ -1633,6 +1633,23 @@ template <> struct IsMemberType { using type = std::string; }; +namespace adl_detail { +/// Check for existence of user-supplied lexical_cast. +/// +/// This struct has to be in a separate namespace so that it doesn't see our lexical_cast overloads in CLI::detail. +/// Standard says it shouldn't see them if it's defined before the corresponding lexical_cast declarations, but this +/// requires a working implementation of two-phase lookup, and not all compilers can boast that (msvc, ahem). +template class is_lexical_castable { + template + static auto test(int) -> decltype(lexical_cast(std::declval(), std::declval()), std::true_type()); + + template static auto test(...) -> std::false_type; + + public: + static constexpr bool value = decltype(test(0))::value; +}; +} // namespace adl_detail + namespace detail { // These are utilities for IsMember and other transforming objects @@ -1714,7 +1731,7 @@ template class is_direct_constructible { #pragma diag_suppress 2361 #endif #endif - TT{std::declval()} + TT{std::declval()} #ifdef __CUDACC__ #ifdef __NVCC_DIAG_PRAGMA_SUPPORT__ #pragma nv_diag_default 2361 @@ -1722,8 +1739,8 @@ template class is_direct_constructible { #pragma diag_default 2361 #endif #endif - , - std::is_move_assignable()); + , + std::is_move_assignable()); template static auto test(int, std::false_type) -> std::false_type; @@ -2793,13 +2810,24 @@ bool lexical_cast(const std::string &input, T &output) { /// Non-string parsable by a stream template ::value == object_category::other && !std::is_assignable::value, + enable_if_t::value == object_category::other && !std::is_assignable::value && + is_istreamable::value, detail::enabler> = detail::dummy> bool lexical_cast(const std::string &input, T &output) { - static_assert(is_istreamable::value, + return from_stream(input, output); +} + +/// Fallback overload that prints a human-readable error for types that we don't recognize and that don't have a +/// user-supplied lexical_cast overload. +template ::value == object_category::other && !std::is_assignable::value && + !is_istreamable::value && !adl_detail::is_lexical_castable::value, + detail::enabler> = detail::dummy> +bool lexical_cast(const std::string & /*input*/, T & /*output*/) { + static_assert(!std::is_same::value, // Can't just write false here. "option object type must have a lexical cast overload or streaming input operator(>>) defined, if it " "is convertible from another type use the add_option(...) with XC being the known type"); - return from_stream(input, output); + return false; } /// Assign a value through lexical cast operations @@ -7097,6 +7125,10 @@ class App { /// Check to see if a subcommand is part of this command (text version) CLI11_NODISCARD App *get_subcommand(std::string subcom) const; + /// Get a subcommand by name (noexcept non-const version) + /// returns null if subcommand doesn't exist + CLI11_NODISCARD App *get_subcommand_no_throw(std::string subcom) const noexcept; + /// Get a pointer to subcommand by index CLI11_NODISCARD App *get_subcommand(int index = 0) const; @@ -7271,8 +7303,9 @@ class App { } /// Check with name instead of pointer to see if subcommand was selected - CLI11_NODISCARD bool got_subcommand(std::string subcommand_name) const { - return get_subcommand(subcommand_name)->parsed_ > 0; + CLI11_NODISCARD bool got_subcommand(std::string subcommand_name) const noexcept { + App *sub = get_subcommand_no_throw(subcommand_name); + return (sub != nullptr) ? (sub->parsed_ > 0) : false; } /// Sets excluded options for the subcommand @@ -7402,7 +7435,7 @@ class App { std::vector