Skip to content

Commit a7afd85

Browse files
committed
hydraRender -cf implemented and tested.
1 parent 173a388 commit a7afd85

16 files changed

Lines changed: 1249 additions & 3 deletions

cmake/test.cmake

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,3 +1186,183 @@ function(mayaHydra_add_cmd_line_render_test SCENE_FILE_LABELED)
11861186
apply_labels_to_test("${ALL_LABELS}" ${test_name})
11871187

11881188
endfunction()
1189+
1190+
# Discover the mayabatch executable (Windows only; macOS/Linux use maya -batch).
1191+
if(IS_WINDOWS)
1192+
find_program(MAYA_BATCH_EXECUTABLE mayabatch
1193+
HINTS "${MAYA_LOCATION}" "$ENV{MAYA_LOCATION}" "${MAYA_BASE_DIR}"
1194+
PATH_SUFFIXES bin/
1195+
DOC "Maya batch executable")
1196+
if(NOT MAYA_BATCH_EXECUTABLE)
1197+
message(FATAL_ERROR "mayabatch not found. Set MAYA_LOCATION.")
1198+
endif()
1199+
endif()
1200+
1201+
#
1202+
# mayaHydra_add_mayabatch_render_test( <scene_file_labeled>
1203+
# [IMAGE_EXTENSION <extension>]
1204+
# [FAIL <idiff fail value>]
1205+
# [FAILPERCENT <idiff failpercent value>]
1206+
# [WORKING_DIRECTORY <dir>]
1207+
# [TEST_NAME_SUFFIX <suffix>]
1208+
# [COPY_SCENE]
1209+
# [ENV <varname>=<varvalue> ...])
1210+
#
1211+
# Similar to mayaHydra_add_cmd_line_render_test but uses mayabatch (Windows) or
1212+
# maya -batch (macOS/Linux) with a MEL script instead of the Render executable.
1213+
# The MEL script is assumed to have the same base name as the Maya scene file
1214+
# (with a .mel extension) and to be co-located with it in the scenes directory.
1215+
#
1216+
# The MEL script is responsible for opening the scene and invoking a rendering
1217+
# command, e.g. hydraRender. The rendered image is then compared to a
1218+
# reference image using idiff, exactly as for
1219+
# mayaHydra_add_cmd_line_render_test.
1220+
#
1221+
function(mayaHydra_add_mayabatch_render_test SCENE_FILE_LABELED)
1222+
# -----------------
1223+
# 1) Arg processing
1224+
# -----------------
1225+
1226+
cmake_parse_arguments(ARG
1227+
"COPY_SCENE" # Boolean options.
1228+
"WORKING_DIRECTORY;IMAGE_EXTENSION;FAIL;FAILPERCENT;TEST_NAME_SUFFIX" # one_value keywords
1229+
"ENV" # multi_value keywords
1230+
${ARGN}
1231+
)
1232+
1233+
if(ARG_WORKING_DIRECTORY)
1234+
set(WORKING_DIR ${ARG_WORKING_DIRECTORY})
1235+
else()
1236+
set(WORKING_DIR ${CMAKE_CURRENT_BINARY_DIR})
1237+
endif()
1238+
1239+
# --------------
1240+
# 2) Create test
1241+
# --------------
1242+
1243+
if(ARG_SCENE_FILE_LABELED)
1244+
set(SCENE_FILE_LABELED "${ARG_SCENE_FILE_LABELED}")
1245+
endif()
1246+
1247+
get_testfile_and_labels(ALL_LABELS SCENE_FILE ${SCENE_FILE_LABELED})
1248+
mayaUsd_get_unittest_target(test_name ${SCENE_FILE})
1249+
if(ARG_TEST_NAME_SUFFIX)
1250+
set(test_name "${test_name}_${ARG_TEST_NAME_SUFFIX}")
1251+
endif()
1252+
1253+
set(IMAGE_EXTENSION "png")
1254+
if(ARG_IMAGE_EXTENSION)
1255+
set(IMAGE_EXTENSION "${ARG_IMAGE_EXTENSION}")
1256+
endif()
1257+
1258+
set(FAIL "0.01")
1259+
if(ARG_FAIL)
1260+
set(FAIL "${ARG_FAIL}")
1261+
endif()
1262+
1263+
set(FAILPERCENT "1.0")
1264+
if(ARG_FAILPERCENT)
1265+
set(FAILPERCENT "${ARG_FAILPERCENT}")
1266+
endif()
1267+
1268+
set(SRC_SCENE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/scenes/${SCENE_FILE})
1269+
1270+
# Derive the MEL script path from the scene file path.
1271+
cmake_path(REPLACE_EXTENSION SRC_SCENE_PATH ".mel" OUTPUT_VARIABLE SRC_MEL_SCRIPT_PATH)
1272+
1273+
if(ARG_COPY_SCENE)
1274+
string(REGEX REPLACE "[:<>\|]" "_" SANITIZED_TEST_NAME ${test_name})
1275+
cmake_path(GET SCENE_FILE FILENAME SCENE_FILE_NAME)
1276+
set(SCENE_PATH "${CMAKE_BINARY_DIR}/test/Temporary/${SANITIZED_TEST_NAME}/projects/default/scenes/${SCENE_FILE_NAME}")
1277+
cmake_path(REPLACE_EXTENSION SCENE_PATH ".mel" OUTPUT_VARIABLE MEL_SCRIPT_PATH)
1278+
else()
1279+
set(SCENE_PATH ${SRC_SCENE_PATH})
1280+
set(MEL_SCRIPT_PATH ${SRC_MEL_SCRIPT_PATH})
1281+
endif()
1282+
1283+
string(REGEX REPLACE "[:<>\|]" "_" SANITIZED_TEST_NAME ${test_name})
1284+
set(MAYA_APP_TEMP_DIR "${CMAKE_BINARY_DIR}/test/Temporary/${SANITIZED_TEST_NAME}")
1285+
1286+
set(RENDERED_IMAGE_SUBDIR "projects/default/images")
1287+
set(RENDERED_IMAGE_NAME "${SANITIZED_TEST_NAME}")
1288+
set(RENDERED_IMAGE_DIR "${MAYA_APP_TEMP_DIR}/${RENDERED_IMAGE_SUBDIR}")
1289+
set(RENDERED_IMAGE_PATH "${RENDERED_IMAGE_DIR}/${RENDERED_IMAGE_NAME}.${IMAGE_EXTENSION}")
1290+
cmake_path(REPLACE_EXTENSION SRC_SCENE_PATH ".${IMAGE_EXTENSION}" OUTPUT_VARIABLE EXPECTED_IMAGE_PATH)
1291+
if(ARG_TEST_NAME_SUFFIX)
1292+
cmake_path(GET EXPECTED_IMAGE_PATH STEM LAST_ONLY _expected_stem)
1293+
cmake_path(GET EXPECTED_IMAGE_PATH PARENT_PATH _expected_dir)
1294+
set(EXPECTED_IMAGE_PATH "${_expected_dir}/${_expected_stem}_${ARG_TEST_NAME_SUFFIX}.${IMAGE_EXTENSION}")
1295+
endif()
1296+
1297+
if (IMAGE_DIFF_TOOL)
1298+
set(IDIFF_CMD "${IMAGE_DIFF_TOOL}")
1299+
else()
1300+
message(FATAL_ERROR "idiff binary not discovered. Set IMAGE_DIFF_TOOL (e.g. via OIIO_idiff_BINARY).")
1301+
endif()
1302+
1303+
if (WIN32)
1304+
set(CMD PowerShell)
1305+
set(RENDER_ARGS "& \"${MAYA_BATCH_EXECUTABLE}\" -script \"${MEL_SCRIPT_PATH}\"")
1306+
set(IDIFF_ARGS "& \"${IDIFF_CMD}\" -fail ${FAIL} -failpercent ${FAILPERCENT} -warn ${FAIL} -warnpercent ${FAILPERCENT} \"${RENDERED_IMAGE_PATH}\" \"${EXPECTED_IMAGE_PATH}\"")
1307+
set(RM_ARGS "Remove-Item \"${RENDERED_IMAGE_DIR}/*\" -Recurse -Force -ErrorAction SilentlyContinue")
1308+
set(CMD_ARGS -Command "${RM_ARGS} \; ${RENDER_ARGS} \; if (\$LASTEXITCODE -eq 0) { ${IDIFF_ARGS} } \; exit \$LASTEXITCODE")
1309+
else()
1310+
set(CMD /bin/sh)
1311+
set(RENDER_ARGS "\"${MAYA_EXECUTABLE}\" -batch -script \"${MEL_SCRIPT_PATH}\"")
1312+
set(IDIFF_ARGS "${IDIFF_CMD} -fail ${FAIL} -failpercent ${FAILPERCENT} -warn ${FAIL} -warnpercent ${FAILPERCENT} \"${RENDERED_IMAGE_PATH}\" \"${EXPECTED_IMAGE_PATH}\"")
1313+
set(CMD_ARGS -c "rm -rf ${RENDERED_IMAGE_DIR}/*; ${RENDER_ARGS} && ${IDIFF_ARGS}")
1314+
endif()
1315+
1316+
add_test(
1317+
NAME "${test_name}"
1318+
WORKING_DIRECTORY ${WORKING_DIR}
1319+
COMMAND ${CMD} ${CMD_ARGS}
1320+
)
1321+
1322+
# -----------------
1323+
# 3) Set up environ
1324+
# -----------------
1325+
1326+
_mayaHydra_setup_test_common_path_vars()
1327+
list(APPEND ALL_PATH_VARS MAYA_RENDER_DESC_PATH)
1328+
1329+
_mayaHydra_setup_test_common_defaults("${test_name}")
1330+
set_property(TEST "${test_name}" APPEND PROPERTY ENVIRONMENT
1331+
"MAYA_DEFAULT_SURFACE_SHADER=standardSurface")
1332+
1333+
_mayaHydra_setup_test_plugins()
1334+
list(APPEND MAYAHYDRA_VARNAME_MAYA_RENDER_DESC_PATH
1335+
"${CMAKE_INSTALL_PREFIX}/renderDesc")
1336+
1337+
list(APPEND MAYAHYDRA_VARNAME_PYTHONPATH "${MAYA_HYDRA_DIR}/scripts")
1338+
1339+
_mayaHydra_setup_test_USD_paths()
1340+
1341+
_mayaHydra_setup_test_finalize_env("${test_name}")
1342+
1343+
if(ARG_COPY_SCENE)
1344+
configure_file(${SRC_SCENE_PATH} ${SCENE_PATH} COPYONLY)
1345+
configure_file(${SRC_MEL_SCRIPT_PATH} ${MEL_SCRIPT_PATH} COPYONLY)
1346+
cmake_path(REMOVE_EXTENSION SRC_SCENE_PATH OUTPUT_VARIABLE SRC_SCENE_PATH_NO_EXT)
1347+
cmake_path(REMOVE_EXTENSION SCENE_PATH OUTPUT_VARIABLE SCENE_PATH_NO_EXT)
1348+
if(EXISTS "${SRC_SCENE_PATH_NO_EXT}.usda")
1349+
configure_file("${SRC_SCENE_PATH_NO_EXT}.usda" "${SCENE_PATH_NO_EXT}.usda" COPYONLY)
1350+
endif()
1351+
if(EXISTS "${SRC_SCENE_PATH_NO_EXT}.mtlx")
1352+
configure_file("${SRC_SCENE_PATH_NO_EXT}.mtlx" "${SCENE_PATH_NO_EXT}.mtlx" COPYONLY)
1353+
endif()
1354+
cmake_path(GET SRC_SCENE_PATH PARENT_PATH SRC_SCENE_DIR)
1355+
cmake_path(GET SCENE_PATH PARENT_PATH SCENE_DIR)
1356+
if(EXISTS "${SRC_SCENE_DIR}/UVChecker.png")
1357+
configure_file("${SRC_SCENE_DIR}/UVChecker.png" "${SCENE_DIR}/UVChecker.png" COPYONLY)
1358+
endif()
1359+
endif()
1360+
1361+
set_property(TEST "${test_name}" APPEND PROPERTY ENVIRONMENT
1362+
"MAYA_IGNORE_DIALOGS=1")
1363+
1364+
set_property(TEST "${test_name}" APPEND PROPERTY LABELS cmdLineRender)
1365+
1366+
apply_labels_to_test("${ALL_LABELS}" ${test_name})
1367+
1368+
endfunction()

lib/mayaHydra/mayaPlugin/batchRendering/batchRenderer.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,4 +647,20 @@ void BatchRenderer::_SetActiveRenderSettingsPrimFromScene()
647647
_sceneGlobalsSceneIndex->SetActiveRenderSettingsPrimPath(hydraRsPath);
648648
}
649649

650+
void BatchRenderer::SetRenderTimes(const RenderTimes& renderTimes)
651+
{
652+
// Cannot assign, as all RenderTimes data members are const.
653+
_renderTimes.emplace(
654+
renderTimes.isAnimated,
655+
renderTimes.startTime,
656+
renderTimes.endTime,
657+
renderTimes.timeIncr
658+
);
659+
}
660+
661+
RenderTimes BatchRenderer::GetRenderTimes() const
662+
{
663+
return _renderTimes.has_value() ? *_renderTimes : ::GetRenderTimes();
664+
}
665+
650666
}

lib/mayaHydra/mayaPlugin/batchRendering/batchRenderer.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
#include "batchRenderTypes.h"
3434
#include "renderGlobals.h"
35+
#include "renderSettingsUtils.h"
3536
#include "pluginUtils.h"
3637

3738
#include <mayaHydraLib/api.h>
@@ -108,6 +109,9 @@ class BatchRenderer
108109

109110
PXR_NS::HdRenderIndex* renderIndex() const;
110111

112+
RenderTimes GetRenderTimes() const;
113+
void SetRenderTimes(const RenderTimes& renderTimes);
114+
111115
private:
112116

113117
friend class BatchRendererMayaRenderSettings;
@@ -183,6 +187,8 @@ class BatchRenderer
183187
const bool _isUsingHdSt = false;
184188
bool _initializationAttempted = false;
185189
bool _initializationSucceeded = false;
190+
191+
std::optional<RenderTimes> _renderTimes;
186192
};
187193

188194
}

lib/mayaHydra/mayaPlugin/batchRendering/hydraRenderCmd.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include <maya/MRenderUtil.h>
3535
#include <maya/MFnRenderLayer.h>
3636
#include <maya/MFileIO.h>
37+
#include <maya/MTime.h>
3738

3839
#include <pxr/pxr.h>
3940
#include <pxr/base/tf/diagnostic.h>
@@ -256,6 +257,20 @@ MStatus HydraRenderCmd::doIt(const MArgList& args)
256257
_batchRenderer = std::make_unique<BatchRenderer>(
257258
MtohRendererDescription(rendererName, {}, {}));
258259

260+
if (db.isFlagSet(_currentFrame)) {
261+
const auto currentTime = MAnimControl::currentTime();
262+
_batchRenderer->SetRenderTimes(
263+
RenderTimes(false, currentTime, currentTime, 1.0f));
264+
}
265+
266+
if (db.isFlagSet(_frameShort)) {
267+
double frameValue = 0.0;
268+
CHECK_MSTATUS_AND_RETURN_IT(db.getFlagArgument(_frameShort, 0, frameValue));
269+
const MTime frameTime(frameValue, MTime::uiUnit());
270+
_batchRenderer->SetRenderTimes(
271+
RenderTimes(false, frameTime, frameTime, 1.0f));
272+
}
273+
259274
// Initialize Hydra renderer.
260275
if (initialize()) {
261276
if (render()) {

lib/mayaHydra/mayaPlugin/batchRendering/hydraRenderCmdHydraV1RenderSettings.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ bool HydraRenderCmd::hydraRenderFromHydraV1RenderSettings()
463463
"Render delegate unavailable; cannot apply USD render settings.\n");
464464
}
465465

466-
const auto renderTimes = GetRenderTimes();
466+
const auto renderTimes = _batchRenderer->GetRenderTimes();
467467
TF_DEBUG_MSG(
468468
MAYAHYDRAPLUGIN_BATCHRENDER_CMD,
469469
"Render time range: start=%.3f end=%.3f by=%.3f animated=%d\n",

lib/mayaHydra/mayaPlugin/batchRendering/hydraRenderCmdHydraV2RenderSettings.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ bool HydraRenderCmd::hydraRenderFromHydraV2RenderSettings()
3636
return false;
3737
}
3838

39-
const auto renderTimes = GetRenderTimes();
39+
const auto renderTimes = _batchRenderer->GetRenderTimes();
4040
TF_DEBUG_MSG(
4141
MAYAHYDRAPLUGIN_BATCHRENDER_CMD,
4242
"Render time range: start=%.3f end=%.3f by=%.3f animated=%d\n",

lib/mayaHydra/mayaPlugin/batchRendering/hydraRenderCmdMayaRenderSettings.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ bool HydraRenderCmd::hydraRenderFromMayaRenderSettings()
137137
"Renderable camera count (listCameras): %u\n",
138138
cameras.length());
139139

140-
const auto renderTimes = GetRenderTimes();
140+
const auto renderTimes = _batchRenderer->GetRenderTimes();
141141
TF_DEBUG_MSG(
142142
MAYAHYDRAPLUGIN_BATCHRENDER_CMD,
143143
"Render time range: start=%.3f end=%.3f by=%.3f animated=%d\n",

test/lib/cmdLineRender/CMakeLists.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,17 @@ foreach(scene ${ARNOLD_RENDER_SCENES})
9191
)
9292
endforeach()
9393

94+
set(ARNOLD_MAYABATCH_RENDER_SCENES
95+
basic/renderCurrentFrame.ma
96+
basic/renderFrame.ma
97+
)
98+
99+
foreach(scene ${ARNOLD_MAYABATCH_RENDER_SCENES})
100+
mayaHydra_add_mayabatch_render_test(${scene}
101+
COPY_SCENE
102+
)
103+
endforeach()
104+
94105
mayaHydra_add_cmd_line_render_test(renderSettings/stormResolution.ma
95106
COPY_SCENE
96107
RENDERER HdStormRendererPlugin

0 commit comments

Comments
 (0)