@@ -1186,3 +1186,183 @@ function(mayaHydra_add_cmd_line_render_test SCENE_FILE_LABELED)
11861186 apply_labels_to_test ("${ALL_LABELS} " ${test_name} )
11871187
11881188endfunction ()
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 ()
0 commit comments