Skip to content
Merged
Show file tree
Hide file tree
Changes from 60 commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
4e7fa0a
HYDRA-2096 : Support Hydra PRMan in our viewport unit tests
lanierd-adsk Feb 27, 2026
81984f1
Add PRMan texture search path
lanierd-adsk Feb 27, 2026
259953a
Apply fixes from copilot suggestions
lanierd-adsk Mar 2, 2026
68571c5
Implement fixes suggested by copilot and add more logging for debuggi…
lanierd-adsk Mar 2, 2026
f62424b
Apply Copilot suggestions
lanierd-adsk Mar 3, 2026
37833ff
Attempt in fixing missing textures with PRMan and apply copilot sugge…
lanierd-adsk Mar 3, 2026
6cefbba
Fix indentation
lanierd-adsk Mar 3, 2026
099ed0c
Fix a comment
lanierd-adsk Mar 3, 2026
e3dc31d
PRMan never reports convergence when used in interactive mode so cons…
lanierd-adsk Mar 4, 2026
0b81616
Fix PRMan images not being rendered in the right folder
lanierd-adsk Mar 4, 2026
6c3a93f
Attempt in getting textures with PRMan and preparing log to from pref…
lanierd-adsk Mar 5, 2026
83f764c
Fix indentation
lanierd-adsk Mar 5, 2026
aff261c
Remove assert when no convergence is reached.
lanierd-adsk Mar 6, 2026
c5d61bb
another attempt at fixing PRMan textures not showing up
lanierd-adsk Mar 6, 2026
947a1c8
More logging
lanierd-adsk Mar 6, 2026
cf18e59
Fix missing function in test.
lanierd-adsk Mar 9, 2026
bc79935
Fix printing to log file.
lanierd-adsk Mar 9, 2026
84b09cc
Try to redirect PRMan log to get information about why textures are n…
lanierd-adsk Mar 9, 2026
3d1cd40
Fixes for shaders not being present, remove textures debugging, add t…
lanierd-adsk Mar 10, 2026
564ab28
Fix for OSX and print RMAN_SHADERPATH
lanierd-adsk Mar 10, 2026
2a68434
Fix image diff and print more info for missing PRMan shaders
lanierd-adsk Mar 10, 2026
b34fda5
Another attempt at fixing shaders for PRMan
lanierd-adsk Mar 11, 2026
c78cbfa
Attempt fixing shaders missing in PRMan render delegate in unit tests
lanierd-adsk Mar 17, 2026
9832dd7
PRMan images were not save in the right folder and lower timeout for …
lanierd-adsk Mar 17, 2026
5f3c9c2
Create baseline from CI machines, fix OSX tests
lanierd-adsk Mar 18, 2026
695e467
Update baseline for PRMan, attempt in fixing OSX issues with PRMan re…
lanierd-adsk Mar 19, 2026
dce4982
Attempt in fixing OSX failures
lanierd-adsk Mar 19, 2026
9a5f384
Add more logging to debug OSX failures
lanierd-adsk Mar 20, 2026
a2130bb
More logging
lanierd-adsk Mar 20, 2026
44465de
Fix last commit
lanierd-adsk Mar 20, 2026
b364992
Another attempt in fixing OSX errors.
lanierd-adsk Mar 30, 2026
b203786
Fix OSX builds hopefully
lanierd-adsk Mar 30, 2026
5ed45ea
More OSX fix attempt
lanierd-adsk Mar 30, 2026
3c34109
Fix Adsk resolver issues
lanierd-adsk Mar 31, 2026
0d21332
Another attempt
lanierd-adsk Mar 31, 2026
502c632
another attempt
lanierd-adsk Mar 31, 2026
3fff628
Fix OSX and coverage builds
lanierd-adsk Apr 1, 2026
9b3a314
Revert "Fix OSX and coverage builds"
lanierd-adsk Apr 1, 2026
f07f04c
Attempt in fixing OSX and coverage builds
lanierd-adsk Apr 1, 2026
7e84a36
Add more logging
lanierd-adsk Apr 1, 2026
e35dca9
Increase unit tests timeout for coverage builds, and add logging to s…
lanierd-adsk Apr 2, 2026
6cfae4a
Skip render delegate tests on OSx (logged) and add diagnostics for co…
lanierd-adsk Apr 2, 2026
3c9bd41
Disable another failing test under OSX (logged as well) and exit the …
lanierd-adsk Apr 2, 2026
2dca328
Attempt in fixing coverage builds
lanierd-adsk Apr 7, 2026
5969209
Another attempt for fixing code coverage
lanierd-adsk Apr 7, 2026
c74ee03
Fix coverage build for render delegate test
lanierd-adsk Apr 10, 2026
795bc01
Implement copilot suggestions
lanierd-adsk Apr 14, 2026
cf99ee2
Fix unit tests missing param
lanierd-adsk Apr 15, 2026
cc301b0
Merge branch 'dev' into lanierd/HYDRA-2096
lanierd-adsk Apr 24, 2026
f3f1b70
Fix cmake/test.cmake: remove duplicate incomplete function, fix varia…
Copilot Apr 24, 2026
113046c
Increase image failure percentage for PRMan image comparisons
lanierd-adsk May 4, 2026
873827e
Increase failure percentage for PRMan
lanierd-adsk May 5, 2026
8517b4b
Remove printing every 5 seconds for the testLightingByRenderDelegate …
lanierd-adsk May 7, 2026
1f2268d
Attempt in fixing unit tests
lanierd-adsk May 12, 2026
9db6764
Merge branch 'dev' into lanierd/HYDRA-2096
lanierd-adsk May 20, 2026
5077a19
Merge origin/dev: resolve IsSupported API conflict in pluginUtils.cpp
Copilot May 21, 2026
2b4658f
Fix problems on OSX.
lanierd-adsk May 21, 2026
4d34b42
Fix OSX errors
lanierd-adsk May 22, 2026
dba2751
Partial fix on OSX. Not sure if that's good enough
vlasovi Jun 9, 2026
1fe53ed
Address comments from code review.
lanierd-adsk Jun 12, 2026
73584e9
HYDRA-2096 : Fix error with python module and fix OSX 2026 problems w…
lanierd-adsk Jun 12, 2026
5ca9d73
Attempt in fixing OSX and Linux issues
lanierd-adsk Jun 12, 2026
259f82f
Add a missing file.
lanierd-adsk Jun 12, 2026
64f069e
Merge origin/dev and resolve cmake/test.cmake conflict
Copilot Jul 27, 2026
643c528
Attempt in fixing unit tests on OSX.
lanierd-adsk Jul 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions cmake/modules/FindUSD.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -158,5 +158,16 @@ find_program(OIIO_idiff_BINARY
PATH_SUFFIXES
bin/
DOC
"OIIO's idiff binary"
)
"OIIO's idiff binary"
)

find_program(OIIO_oiiotool_BINARY
oiiotool
HINTS
${PXR_USD_LOCATION}
$ENV{PXR_USD_LOCATION}
PATH_SUFFIXES
bin/
DOC
"OIIO's oiiotool binary (for diff images)"
)
223 changes: 212 additions & 11 deletions cmake/test.cmake

Large diffs are not rendered by default.

14 changes: 13 additions & 1 deletion doc/build.md
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,19 @@ CMAKE_SKIP_RPATH=TRUE
```
To allow your tests to run, you can inject LD_LIBRARY_PATH into any of the mayaHydra_add_test calls by setting the ADDITIONAL_LD_LIBRARY_PATH cmake variable to $ENV{LD_LIBRARY_PATH} or similar.

There is a related ADDITIONAL_PXR_PLUGINPATH_NAME cmake var which can be used if schemas are installed in a non-standard location
There is a related `ADDITIONAL_PXR_PLUGINPATH_NAME` CMake variable which appends paths to `PXR_PLUGINPATH_NAME` for tests. Use it when Hydra render delegate plugins (e.g. HdArnold) are installed in a non-standard location:

```
cmake -DADDITIONAL_PXR_PLUGINPATH_NAME="C:/path/to/arnold-usd/install/plugin" ...
```

The same variable can be set in the environment before running CMake (e.g. from a build pipeline) so the path is picked up automatically.

**Arnold (MtoA):** When `MTOA_LOCATION` and `USD_VERSION` are defined, the HdArnold plugin path is added only if `plugInfo.json` is found: `${MTOA_LOCATION}/usd/bundle/<version>` (newer Arnold) is tried first, then `${MTOA_LOCATION}/usd/hydra/<version>` (older).

**RenderMan (PRMan):** For HdPrman tests, provide the RenderMan locations via CMake cache variables (`-DRMANTREE=...`, `-DRENDERMAN_LOCATION=...` (optional), `-DPIXAR_LICENSE_FILE=...` (license server, format: `port@hostname`), `-DPRMAN_DELEGATE_PLUGIN_PATH=...` (path containing HdPrman `plugInfo.json`)) or via environment variables of the same names. CMake variables take precedence. On Windows, the test harness adds `${RMANTREE}/bin` and `${RMANTREE}/lib` to `PATH` when `RMANTREE` is set.

**Local development:** If `PXR_PLUGINPATH_NAME` or `MAYA_PXR_PLUGINPATH_NAME` is set in your environment when you run CMake, those paths are automatically appended to the test environment. This allows locally-installed Hydra plugins (e.g. HdArnold, HdPrman) to be discovered when running tests. On Windows, use forward slashes or escaped backslashes in the path.

### Using Visual Studio as the generator

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,21 +63,21 @@ target_link_libraries(${TARGET_NAME}
# -----------------------------------------------------------------------------
# run-time search paths
# -----------------------------------------------------------------------------
if(IS_MACOSX OR IS_LINUX)
mayaUsd_init_rpath(rpath "lib/maya")
if(DEFINED MAYAUSD_TO_USD_RELATIVE_PATH)
mayaUsd_add_rpath(rpath "../../${MAYAUSD_TO_USD_RELATIVE_PATH}/lib")
if(IS_MACOSX OR IS_LINUX)
# This plugin is installed to lib/usd/customNodeTranslationSceneIndex/, so
# the rpath origin must match that install path (not lib/maya/).
mayaUsd_init_rpath(rpath "lib/usd/customNodeTranslationSceneIndex")
if(DEFINED MAYAHYDRA_TO_USD_RELATIVE_PATH)
mayaUsd_add_rpath(rpath "../../../${MAYAHYDRA_TO_USD_RELATIVE_PATH}/lib")
if (IS_LINUX)
mayaUsd_add_rpath(rpath "../../${MAYAUSD_TO_USD_RELATIVE_PATH}/lib64")
mayaUsd_add_rpath(rpath "../../../${MAYAHYDRA_TO_USD_RELATIVE_PATH}/lib64")
endif()
if(IS_MACOSX)
mayaUsd_add_rpath(rpath "../../../../Maya.app/Contents/MacOS")
mayaUsd_add_rpath(rpath "../../../../../Maya.app/Contents/MacOS")
endif()
elseif(DEFINED PXR_USD_LOCATION)
mayaUsd_add_rpath(rpath "${PXR_USD_LOCATION}/lib")
endif()

mayaUsd_add_rpath(rpath "../")
mayaUsd_install_rpath(rpath ${TARGET_NAME})
endif()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,21 +66,21 @@ target_link_libraries(${TARGET_NAME}
# -----------------------------------------------------------------------------
# run-time search paths
# -----------------------------------------------------------------------------
if(IS_MACOSX OR IS_LINUX)
mayaUsd_init_rpath(rpath "lib/maya")
if(DEFINED MAYAUSD_TO_USD_RELATIVE_PATH)
mayaUsd_add_rpath(rpath "../../${MAYAUSD_TO_USD_RELATIVE_PATH}/lib")
if(IS_MACOSX OR IS_LINUX)
# This plugin is installed to lib/usd/simpleHydraGenerativeProcedural/, so
# the rpath origin must match that install path (not lib/maya/).
mayaUsd_init_rpath(rpath "lib/usd/simpleHydraGenerativeProcedural")
if(DEFINED MAYAHYDRA_TO_USD_RELATIVE_PATH)
mayaUsd_add_rpath(rpath "../../../${MAYAHYDRA_TO_USD_RELATIVE_PATH}/lib")
if (IS_LINUX)
mayaUsd_add_rpath(rpath "../../${MAYAUSD_TO_USD_RELATIVE_PATH}/lib64")
mayaUsd_add_rpath(rpath "../../../${MAYAHYDRA_TO_USD_RELATIVE_PATH}/lib64")
endif()
if(IS_MACOSX)
mayaUsd_add_rpath(rpath "../../../../Maya.app/Contents/MacOS")
mayaUsd_add_rpath(rpath "../../../../../Maya.app/Contents/MacOS")
endif()
elseif(DEFINED PXR_USD_LOCATION)
mayaUsd_add_rpath(rpath "${PXR_USD_LOCATION}/lib")
endif()

mayaUsd_add_rpath(rpath "../")
mayaUsd_install_rpath(rpath ${TARGET_NAME})
endif()

Expand Down
11 changes: 6 additions & 5 deletions lib/mayaHydra/hydraExtensions/adapters/cameraAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,12 @@ VtValue MayaHydraCameraAdapter::GetCameraParamValue(const TfToken& paramName)
return {};
}

// clippingRange is required for all cameras (ortho and perspective)
if (paramName == HdCameraTokens->clippingRange) {
const double cameraNear = camera.nearClippingPlane();
const double cameraFar = camera.farClippingPlane();
return VtValue(GfRange1f(float(cameraNear), float(cameraFar)));
}
if (paramName == HdCameraTokens->shutterOpen) {
// No motion samples, instantaneous shutter
if (!GetMayaHydraSceneIndex()->GetParams().motionSamplesEnabled())
Expand Down Expand Up @@ -274,11 +280,6 @@ VtValue MayaHydraCameraAdapter::GetCameraParamValue(const TfToken& paramName)
return {};
return VtValue(float(focalLength)); /// focalLength is in mm, so no conversion needed
}
if (paramName == HdCameraTokens->clippingRange) {
const double cameraNear = camera.nearClippingPlane();
const double cameraFar = camera.farClippingPlane();
return VtValue(GfRange1f(cameraNear, cameraFar));
}
if (paramName == HdCameraTokens->fStop) {
// For USD/Hydra fStop=0 should disable depthOfField
if (!camera.isDepthOfField())
Expand Down
33 changes: 16 additions & 17 deletions lib/mayaHydra/mayaPlugin/pluginUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,27 +88,26 @@ MtohInitializeRenderPlugins()
}

#if HD_API_VERSION >= 98 // PXR_VERSION > 2605
HdRenderDelegate* delegate
= plugin->IsSupported(HdRendererCreateArgsSchema(nullptr)) ?
plugin->CreateRenderDelegate() : nullptr;
if (!plugin->IsSupported(HdRendererCreateArgsSchema(nullptr))) {
continue;
}
#else
HdRenderDelegate* delegate
= plugin->IsSupported() ? plugin->CreateRenderDelegate() : nullptr;
#endif

// No 'delete plugin', should plugin be cached as well?
if (!delegate) {
if (!plugin->IsSupported()) {
continue;
}
#endif

auto& rendererSettingDescriptors
= store.second.emplace(renderer, delegate->GetRenderSettingDescriptors())
.first->second;
// CreateRenderDelegate may fail without GPU context (e.g. Arnold from
// PXR_PLUGINPATH_NAME). Still register the override; delegate is created
// at render time. Use empty settings when delegate creation fails.
HdRenderDelegate* delegate = plugin->CreateRenderDelegate();
HdRenderSettingDescriptorList rendererSettingDescriptors;
if (delegate) {
rendererSettingDescriptors = delegate->GetRenderSettingDescriptors();
plugin->DeleteRenderDelegate(delegate);
}

// We only needed the delegate for the settings, so release
plugin->DeleteRenderDelegate(delegate);
// Null it out to make any possible usage later obv, wrong!
delegate = nullptr;
auto& settingDescriptors = store.second.emplace(renderer, std::move(rendererSettingDescriptors)).first->second;

store.first.emplace_back(
renderer,
Expand All @@ -118,7 +117,7 @@ MtohInitializeRenderPlugins()
"%sHydra %s",
TECHNOLOGY_PREVIEW_PREFIX,
PXR_NS::UsdImagingGLEngine::GetRendererDisplayName(pluginDesc.id).c_str())));
MtohRenderGlobals::BuildOptionsMenu(store.first.back(), rendererSettingDescriptors);
MtohRenderGlobals::BuildOptionsMenu(store.first.back(), settingDescriptors);
}

// Make sure the static's size doesn't have any extra overhead
Expand Down
57 changes: 53 additions & 4 deletions lib/mayaHydra/mayaPlugin/renderOverride.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
#include <pxr/imaging/glf/contextCaps.h>
#include <pxr/imaging/hd/camera.h>
#include <pxr/imaging/hd/rendererPluginRegistry.h>
#include <pxr/imaging/hd/renderBuffer.h>
#include <pxr/imaging/hd/rprim.h>
#include <pxr/imaging/hd/sceneIndexPluginRegistry.h>
#include <pxr/imaging/hd/dataSource.h>
Expand Down Expand Up @@ -990,10 +991,9 @@ MStatus MtohRenderOverride::Render(
fileName.c_str());
}
}

// Check if all passes are converged
// Only iterate over visible passes
_isConverged = true;

// Check convergence from the tasks first
_isConverged = true;
for (int visibleIdx = 0; visibleIdx < numVisibleFramePasses; ++visibleIdx) {
const int i = framePassesVisible[visibleIdx]; // Get the actual pass index
const hvt::FramePassPtr& currentPass = _GetFramePass(i);
Expand All @@ -1007,6 +1007,55 @@ MStatus MtohRenderOverride::Render(
}
}

if (!_isConverged) {
// Check with AOVs as a second step, as some renderers may not properly set convergence
// on the tasks
// Check if all AOVs are converged for each visible pass.
// Get the AOVs and check each render buffer's IsConverged().
// Note: For Arnold, _taskController->IsConverged() always returns false; we must check
// each AOV buffer directly.
auto isConverged = [this, &framePassesVisible, numVisibleFramePasses]() {
for (int visibleIdx = 0; visibleIdx < numVisibleFramePasses; ++visibleIdx) {
const int i = framePassesVisible[visibleIdx];
const hvt::FramePassPtr& currentPass = _GetFramePass(i);
if (!currentPass) {
continue;
}

const auto* bufferManager = currentPass->GetRenderBufferManager().get();
if (!bufferManager) {
return false;
}

TfTokenVector renderOutputs = bufferManager->GetRenderOutputs();
if (renderOutputs.empty()) {
renderOutputs = GetAvailableFramePassAovs(i);
}
if (renderOutputs.empty()) {
TF_DEBUG(MAYAHYDRALIB_RENDEROVERRIDE_RENDER)
.Msg("RenderOutputs list is empty; assuming not converged.\n");
return false;
}

for (const TfToken& aovToken : renderOutputs) {
HdRenderBuffer* buffer = currentPass->GetRenderBuffer(aovToken);
if (!buffer) {
TF_DEBUG(MAYAHYDRALIB_RENDEROVERRIDE_RENDER)
.Msg("Render output '%s' not found; assuming not converged.\n",
aovToken.GetText());
return false;
}
if (!buffer->IsConverged()) {
return false;
}
}
}
return true;
};

_isConverged = isConverged();
}

if (markTime) {
std::lock_guard<std::mutex> lock(_lastRenderTimeMutex);
_lastRenderTime = std::chrono::system_clock::now();
Expand Down
3 changes: 3 additions & 0 deletions test/lib/cmdLineRender/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,8 @@ if(NOT IS_MACOSX)
)
endif()

# Arnold cmdLine render does not produce output images on macOS. Tracked as HYDRA-2262.
if(NOT IS_MACOSX)
mayaHydra_add_cmd_line_render_multi_image_test(renderSettings/AnimCubeRenderSettings.ma
RENDERER HdArnoldRendererPlugin
EXPECTED_IMAGES_DIR renderSettings/images/arnold
Expand All @@ -171,6 +173,7 @@ mayaHydra_add_cmd_line_render_multi_image_test(renderSettings/AnimCubeRenderSett
FAIL 0.05
FAILPERCENT 1.0
)
endif()

# Stage UVChecker.png within this test’s temporary Maya project so it can be
# resolved via the workspace root when using `-proj`.
Expand Down
21 changes: 18 additions & 3 deletions test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@ set(INTERACTIVE_TEST_SCRIPT_FILES
testMaterialXOnNative.py|depOnPlugins:lookdevx
testArnoldLights.py|depOnPlugins:mtoa
testMayaLightingModes.py|depOnPlugins:mtoa
# Failing, HYDRA-2031.
# testLightingByRenderDelegate.py|depOnPlugins:mtoa
testLightingRenderDelegates.py|depOnPlugins:prman|skipOnPlatform:osx # HYDRA-2209: re-enable on OSX
testBifrostGraphUpdate.py|depOnPlugins:bifrost
#End of tests that have a dependency on other plugins
testLookThrough.py
Expand Down Expand Up @@ -164,7 +163,7 @@ set(INTERACTIVE_TEST_SCRIPT_FILES_MESH_ADAPTER
# on computations made by VP2 for its use. Entered as HYDRA-1961.
set(INTERACTIVE_TEST_SCRIPT_FILES_ENABLE_VP2_RENDER_DELEGATE
testViewportFilters.py|depOnPlugins:mtoa
testFlowPluginsHierarchicalProperties.py
testFlowPluginsHierarchicalProperties.py|skipOnPlatform:osx # HYDRA-2209: BasisCurvesLinearDomain fragment errors on OSX
testBoundingBox.py
#Disabled tests on OSX
testDataProducerSelHighlight.py|skipOnPlatform:osx # HYDRA-1127 : refinedWire not working on OSX
Expand Down Expand Up @@ -242,5 +241,21 @@ foreach(script ${INTERACTIVE_TEST_SCRIPT_FILES})

endforeach()

# Standalone Python unit tests for pure test utilities. These exercise logic
# that does not need Maya (e.g. renderManUtils env/platform gating), so they run
# under mayapy via unittest without initializing a standalone Maya session.
set(PYTHON_UNIT_TEST_MODULES
testRenderManUtils.py
)
Comment on lines +258 to +260
foreach(script ${PYTHON_UNIT_TEST_MODULES})
get_testfile_and_labels(all_labels test_filename ${script})
mayaUsd_get_unittest_target(target ${test_filename})
mayaUsd_add_test(${target}
PYTHON_MODULE ${target}
NO_STANDALONE_INIT
)
apply_labels_to_test("${all_labels}" ${target})
endforeach()

# C++ unit tests
add_subdirectory(cpp)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
# limitations under the License.
#

import platform
import maya.cmds as cmds
import fixturesUtils
import mtohUtils
Expand All @@ -27,6 +28,14 @@ class TestFlowPluginsHierarchicalProperties(mtohUtils.MayaHydraBaseTestCase):

IMAGE_DIFF_FAIL_THRESHOLD = 0.05
IMAGE_DIFF_FAIL_PERCENT = 1
IMAGE_DIFF_FAIL_PERCENT_OSX = 3.0

@classmethod
def setUpClass(cls):
super(TestFlowPluginsHierarchicalProperties, cls).setUpClass()
if platform.system() == "Darwin":
# Metal produces slightly different silhouettes on macOS.
cls.IMAGE_DIFF_FAIL_PERCENT = cls.IMAGE_DIFF_FAIL_PERCENT_OSX

def keyframeAttribute(self, object, attr, value):
cmds.setAttr(object + "." + attr, value)
Expand Down
Loading
Loading