Update
This commit is contained in:
51
plug-ins/MetaHumanForMaya/env/linux-2023.json
vendored
Normal file
51
plug-ins/MetaHumanForMaya/env/linux-2023.json
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"PATH": [
|
||||
"QtPy/2.4.1/python-3/bin",
|
||||
"packaging/24.0/python-3/bin",
|
||||
"PolyAlloc/1.3.18/platform-linux/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-linux/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-linux/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-linux/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-linux/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-linux/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-linux/.sanitizers-off/.json-0/python-3.9/lib",
|
||||
"PyRDF/6.4.1/platform-linux/.sanitizers-off/python-3.9/lib",
|
||||
"PyDNACalib2/3.2.4/platform-linux/.sanitizers-off/python-3.9/lib"
|
||||
],
|
||||
"PYTHONPATH": [
|
||||
"QtPy/2.4.1/python-3/python",
|
||||
"packaging/24.0/python-3/python",
|
||||
"PolyAlloc/1.3.18/platform-linux/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-linux/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-linux/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-linux/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-linux/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-linux/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-linux/.sanitizers-off/.json-0/python-3.9/lib",
|
||||
"PyRDF/6.4.1/platform-linux/.sanitizers-off/python-3.9/lib",
|
||||
"PyDNACalib2/3.2.4/platform-linux/.sanitizers-off/python-3.9/lib",
|
||||
"nls/8.0.14.1/platform-linux/python-3.9",
|
||||
"rdf_model/0.24.6",
|
||||
"frt_api/2.4.0",
|
||||
"mh_assemble_lib/0.9.2",
|
||||
"qstyle/1.7.1",
|
||||
"mh_character_assembler/1.3.8",
|
||||
"mh_expression_editor/1.12.7",
|
||||
"mh_groom_exporter/1.4.5",
|
||||
"mh_pose_editor/1.3.3"
|
||||
],
|
||||
"MAYA_PLUG_IN_PATH": [
|
||||
"cbsnode_maya/1.7.6/platform-linux/maya-2023/lib",
|
||||
"riglogic4_maya/2.10.3.12/platform-linux/maya-2023/lib",
|
||||
"DNACalibMayaPlugin/2.7.3/platform-linux/maya-2023/lib",
|
||||
"MayaUERBFPlugin/2.0.4/platform-linux/maya-2023/lib",
|
||||
"PreviewRigLogic/2.3.3/platform-linux/maya-2023/lib",
|
||||
"SwingTwistEvaluatorPlugin/1.3.2/platform-linux/maya-2023/lib"
|
||||
],
|
||||
"ML_MODEL_ROOT": [
|
||||
"ml_jm_model/1.2.2"
|
||||
],
|
||||
"LOD_GENERATION_ROOT": [
|
||||
"lod_generation_model/1.0.0"
|
||||
]
|
||||
}
|
||||
51
plug-ins/MetaHumanForMaya/env/linux-2024.json
vendored
Normal file
51
plug-ins/MetaHumanForMaya/env/linux-2024.json
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"PATH": [
|
||||
"QtPy/2.4.1/python-3/bin",
|
||||
"packaging/24.0/python-3/bin",
|
||||
"PolyAlloc/1.3.18/platform-linux/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-linux/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-linux/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-linux/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-linux/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-linux/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-linux/.sanitizers-off/.json-0/python-3.10/lib",
|
||||
"PyRDF/6.4.1/platform-linux/.sanitizers-off/python-3.10/lib",
|
||||
"PyDNACalib2/3.2.4/platform-linux/.sanitizers-off/python-3.10/lib"
|
||||
],
|
||||
"PYTHONPATH": [
|
||||
"QtPy/2.4.1/python-3/python",
|
||||
"packaging/24.0/python-3/python",
|
||||
"PolyAlloc/1.3.18/platform-linux/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-linux/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-linux/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-linux/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-linux/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-linux/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-linux/.sanitizers-off/.json-0/python-3.10/lib",
|
||||
"PyRDF/6.4.1/platform-linux/.sanitizers-off/python-3.10/lib",
|
||||
"PyDNACalib2/3.2.4/platform-linux/.sanitizers-off/python-3.10/lib",
|
||||
"nls/8.0.14.1/platform-linux/python-3.10",
|
||||
"rdf_model/0.24.6",
|
||||
"frt_api/2.4.0",
|
||||
"mh_assemble_lib/0.9.2",
|
||||
"qstyle/1.7.1",
|
||||
"mh_character_assembler/1.3.8",
|
||||
"mh_expression_editor/1.12.7",
|
||||
"mh_groom_exporter/1.4.5",
|
||||
"mh_pose_editor/1.3.3"
|
||||
],
|
||||
"MAYA_PLUG_IN_PATH": [
|
||||
"cbsnode_maya/1.7.6/platform-linux/maya-2024/lib",
|
||||
"riglogic4_maya/2.10.3.12/platform-linux/maya-2024/lib",
|
||||
"DNACalibMayaPlugin/2.7.3/platform-linux/maya-2024/lib",
|
||||
"MayaUERBFPlugin/2.0.4/platform-linux/maya-2024/lib",
|
||||
"PreviewRigLogic/2.3.3/platform-linux/maya-2024/lib",
|
||||
"SwingTwistEvaluatorPlugin/1.3.2/platform-linux/maya-2024/lib"
|
||||
],
|
||||
"ML_MODEL_ROOT": [
|
||||
"ml_jm_model/1.2.2"
|
||||
],
|
||||
"LOD_GENERATION_ROOT": [
|
||||
"lod_generation_model/1.0.0"
|
||||
]
|
||||
}
|
||||
51
plug-ins/MetaHumanForMaya/env/linux-2025.json
vendored
Normal file
51
plug-ins/MetaHumanForMaya/env/linux-2025.json
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"PATH": [
|
||||
"QtPy/2.4.1/python-3/bin",
|
||||
"packaging/24.0/python-3/bin",
|
||||
"PolyAlloc/1.3.18/platform-linux/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-linux/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-linux/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-linux/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-linux/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-linux/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-linux/.sanitizers-off/.json-0/python-3.11/lib",
|
||||
"PyRDF/6.4.1/platform-linux/.sanitizers-off/python-3.11/lib",
|
||||
"PyDNACalib2/3.2.4/platform-linux/.sanitizers-off/python-3.11/lib"
|
||||
],
|
||||
"PYTHONPATH": [
|
||||
"QtPy/2.4.1/python-3/python",
|
||||
"packaging/24.0/python-3/python",
|
||||
"PolyAlloc/1.3.18/platform-linux/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-linux/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-linux/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-linux/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-linux/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-linux/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-linux/.sanitizers-off/.json-0/python-3.11/lib",
|
||||
"PyRDF/6.4.1/platform-linux/.sanitizers-off/python-3.11/lib",
|
||||
"PyDNACalib2/3.2.4/platform-linux/.sanitizers-off/python-3.11/lib",
|
||||
"nls/8.0.14.1/platform-linux/python-3.11",
|
||||
"rdf_model/0.24.6",
|
||||
"frt_api/2.4.0",
|
||||
"mh_assemble_lib/0.9.2",
|
||||
"qstyle/1.7.1",
|
||||
"mh_character_assembler/1.3.8",
|
||||
"mh_expression_editor/1.12.7",
|
||||
"mh_groom_exporter/1.4.5",
|
||||
"mh_pose_editor/1.3.3"
|
||||
],
|
||||
"MAYA_PLUG_IN_PATH": [
|
||||
"cbsnode_maya/1.7.6/platform-linux/maya-2025/lib",
|
||||
"riglogic4_maya/2.10.3.12/platform-linux/maya-2025/lib",
|
||||
"DNACalibMayaPlugin/2.7.3/platform-linux/maya-2025/lib",
|
||||
"MayaUERBFPlugin/2.0.4/platform-linux/maya-2025/lib",
|
||||
"PreviewRigLogic/2.3.3/platform-linux/maya-2025/lib",
|
||||
"SwingTwistEvaluatorPlugin/1.3.2/platform-linux/maya-2025/lib"
|
||||
],
|
||||
"ML_MODEL_ROOT": [
|
||||
"ml_jm_model/1.2.2"
|
||||
],
|
||||
"LOD_GENERATION_ROOT": [
|
||||
"lod_generation_model/1.0.0"
|
||||
]
|
||||
}
|
||||
51
plug-ins/MetaHumanForMaya/env/linux-2026.json
vendored
Normal file
51
plug-ins/MetaHumanForMaya/env/linux-2026.json
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"PATH": [
|
||||
"QtPy/2.4.1/python-3/bin",
|
||||
"packaging/24.0/python-3/bin",
|
||||
"PolyAlloc/1.3.18/platform-linux/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-linux/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-linux/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-linux/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-linux/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-linux/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-linux/.sanitizers-off/.json-0/python-3.11/lib",
|
||||
"PyRDF/6.4.1/platform-linux/.sanitizers-off/python-3.11/lib",
|
||||
"PyDNACalib2/3.2.4/platform-linux/.sanitizers-off/python-3.11/lib"
|
||||
],
|
||||
"PYTHONPATH": [
|
||||
"QtPy/2.4.1/python-3/python",
|
||||
"packaging/24.0/python-3/python",
|
||||
"PolyAlloc/1.3.18/platform-linux/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-linux/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-linux/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-linux/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-linux/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-linux/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-linux/.sanitizers-off/.json-0/python-3.11/lib",
|
||||
"PyRDF/6.4.1/platform-linux/.sanitizers-off/python-3.11/lib",
|
||||
"PyDNACalib2/3.2.4/platform-linux/.sanitizers-off/python-3.11/lib",
|
||||
"nls/8.0.14.1/platform-linux/python-3.11",
|
||||
"rdf_model/0.24.6",
|
||||
"frt_api/2.4.0",
|
||||
"mh_assemble_lib/0.9.2",
|
||||
"qstyle/1.7.1",
|
||||
"mh_character_assembler/1.3.8",
|
||||
"mh_expression_editor/1.12.7",
|
||||
"mh_groom_exporter/1.4.5",
|
||||
"mh_pose_editor/1.3.3"
|
||||
],
|
||||
"MAYA_PLUG_IN_PATH": [
|
||||
"cbsnode_maya/1.7.6/platform-linux/maya-2026/lib",
|
||||
"riglogic4_maya/2.10.3.12/platform-linux/maya-2026/lib",
|
||||
"DNACalibMayaPlugin/2.7.3/platform-linux/maya-2026/lib",
|
||||
"MayaUERBFPlugin/2.0.4/platform-linux/maya-2026/lib",
|
||||
"PreviewRigLogic/2.3.3/platform-linux/maya-2026/lib",
|
||||
"SwingTwistEvaluatorPlugin/1.3.2/platform-linux/maya-2026/lib"
|
||||
],
|
||||
"ML_MODEL_ROOT": [
|
||||
"ml_jm_model/1.2.2"
|
||||
],
|
||||
"LOD_GENERATION_ROOT": [
|
||||
"lod_generation_model/1.0.0"
|
||||
]
|
||||
}
|
||||
51
plug-ins/MetaHumanForMaya/env/win64-2023.json
vendored
Normal file
51
plug-ins/MetaHumanForMaya/env/win64-2023.json
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"PATH": [
|
||||
"QtPy/2.4.1/python-3/bin",
|
||||
"packaging/24.0/python-3/bin",
|
||||
"PolyAlloc/1.3.18/platform-windows/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-windows/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-windows/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-windows/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-windows/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-windows/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-windows/.sanitizers-off/.json-0/python-3.9/lib",
|
||||
"PyRDF/6.4.1/platform-windows/.sanitizers-off/python-3.9/lib",
|
||||
"PyDNACalib2/3.2.4/platform-windows/.sanitizers-off/python-3.9/lib"
|
||||
],
|
||||
"PYTHONPATH": [
|
||||
"QtPy/2.4.1/python-3/python",
|
||||
"packaging/24.0/python-3/python",
|
||||
"PolyAlloc/1.3.18/platform-windows/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-windows/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-windows/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-windows/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-windows/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-windows/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-windows/.sanitizers-off/.json-0/python-3.9/lib",
|
||||
"PyRDF/6.4.1/platform-windows/.sanitizers-off/python-3.9/lib",
|
||||
"PyDNACalib2/3.2.4/platform-windows/.sanitizers-off/python-3.9/lib",
|
||||
"nls/8.0.14.1/platform-windows/python-3.9",
|
||||
"rdf_model/0.24.6",
|
||||
"frt_api/2.4.0",
|
||||
"mh_assemble_lib/0.9.2",
|
||||
"qstyle/1.7.1",
|
||||
"mh_character_assembler/1.3.8",
|
||||
"mh_expression_editor/1.12.7",
|
||||
"mh_groom_exporter/1.4.5",
|
||||
"mh_pose_editor/1.3.3"
|
||||
],
|
||||
"MAYA_PLUG_IN_PATH": [
|
||||
"cbsnode_maya/1.7.6/platform-windows/maya-2023/lib",
|
||||
"riglogic4_maya/2.10.3.12/platform-windows/maya-2023/lib",
|
||||
"DNACalibMayaPlugin/2.7.3/platform-windows/maya-2023/lib",
|
||||
"MayaUERBFPlugin/2.0.4/platform-windows/maya-2023/lib",
|
||||
"PreviewRigLogic/2.3.3/platform-windows/maya-2023/lib",
|
||||
"SwingTwistEvaluatorPlugin/1.3.2/platform-windows/maya-2023/lib"
|
||||
],
|
||||
"ML_MODEL_ROOT": [
|
||||
"ml_jm_model/1.2.2"
|
||||
],
|
||||
"LOD_GENERATION_ROOT": [
|
||||
"lod_generation_model/1.0.0"
|
||||
]
|
||||
}
|
||||
51
plug-ins/MetaHumanForMaya/env/win64-2024.json
vendored
Normal file
51
plug-ins/MetaHumanForMaya/env/win64-2024.json
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"PATH": [
|
||||
"QtPy/2.4.1/python-3/bin",
|
||||
"packaging/24.0/python-3/bin",
|
||||
"PolyAlloc/1.3.18/platform-windows/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-windows/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-windows/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-windows/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-windows/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-windows/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-windows/.sanitizers-off/.json-0/python-3.10/lib",
|
||||
"PyRDF/6.4.1/platform-windows/.sanitizers-off/python-3.10/lib",
|
||||
"PyDNACalib2/3.2.4/platform-windows/.sanitizers-off/python-3.10/lib"
|
||||
],
|
||||
"PYTHONPATH": [
|
||||
"QtPy/2.4.1/python-3/python",
|
||||
"packaging/24.0/python-3/python",
|
||||
"PolyAlloc/1.3.18/platform-windows/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-windows/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-windows/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-windows/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-windows/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-windows/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-windows/.sanitizers-off/.json-0/python-3.10/lib",
|
||||
"PyRDF/6.4.1/platform-windows/.sanitizers-off/python-3.10/lib",
|
||||
"PyDNACalib2/3.2.4/platform-windows/.sanitizers-off/python-3.10/lib",
|
||||
"nls/8.0.14.1/platform-windows/python-3.10",
|
||||
"rdf_model/0.24.6",
|
||||
"frt_api/2.4.0",
|
||||
"mh_assemble_lib/0.9.2",
|
||||
"qstyle/1.7.1",
|
||||
"mh_character_assembler/1.3.8",
|
||||
"mh_expression_editor/1.12.7",
|
||||
"mh_groom_exporter/1.4.5",
|
||||
"mh_pose_editor/1.3.3"
|
||||
],
|
||||
"MAYA_PLUG_IN_PATH": [
|
||||
"cbsnode_maya/1.7.6/platform-windows/maya-2024/lib",
|
||||
"riglogic4_maya/2.10.3.12/platform-windows/maya-2024/lib",
|
||||
"DNACalibMayaPlugin/2.7.3/platform-windows/maya-2024/lib",
|
||||
"MayaUERBFPlugin/2.0.4/platform-windows/maya-2024/lib",
|
||||
"PreviewRigLogic/2.3.3/platform-windows/maya-2024/lib",
|
||||
"SwingTwistEvaluatorPlugin/1.3.2/platform-windows/maya-2024/lib"
|
||||
],
|
||||
"ML_MODEL_ROOT": [
|
||||
"ml_jm_model/1.2.2"
|
||||
],
|
||||
"LOD_GENERATION_ROOT": [
|
||||
"lod_generation_model/1.0.0"
|
||||
]
|
||||
}
|
||||
51
plug-ins/MetaHumanForMaya/env/win64-2025.json
vendored
Normal file
51
plug-ins/MetaHumanForMaya/env/win64-2025.json
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"PATH": [
|
||||
"QtPy/2.4.1/python-3/bin",
|
||||
"packaging/24.0/python-3/bin",
|
||||
"PolyAlloc/1.3.18/platform-windows/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-windows/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-windows/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-windows/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-windows/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-windows/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-windows/.sanitizers-off/.json-0/python-3.11/lib",
|
||||
"PyRDF/6.4.1/platform-windows/.sanitizers-off/python-3.11/lib",
|
||||
"PyDNACalib2/3.2.4/platform-windows/.sanitizers-off/python-3.11/lib"
|
||||
],
|
||||
"PYTHONPATH": [
|
||||
"QtPy/2.4.1/python-3/python",
|
||||
"packaging/24.0/python-3/python",
|
||||
"PolyAlloc/1.3.18/platform-windows/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-windows/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-windows/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-windows/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-windows/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-windows/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-windows/.sanitizers-off/.json-0/python-3.11/lib",
|
||||
"PyRDF/6.4.1/platform-windows/.sanitizers-off/python-3.11/lib",
|
||||
"PyDNACalib2/3.2.4/platform-windows/.sanitizers-off/python-3.11/lib",
|
||||
"nls/8.0.14.1/platform-windows/python-3.11",
|
||||
"rdf_model/0.24.6",
|
||||
"frt_api/2.4.0",
|
||||
"mh_assemble_lib/0.9.2",
|
||||
"qstyle/1.7.1",
|
||||
"mh_character_assembler/1.3.8",
|
||||
"mh_expression_editor/1.12.7",
|
||||
"mh_groom_exporter/1.4.5",
|
||||
"mh_pose_editor/1.3.3"
|
||||
],
|
||||
"MAYA_PLUG_IN_PATH": [
|
||||
"cbsnode_maya/1.7.6/platform-windows/maya-2025/lib",
|
||||
"riglogic4_maya/2.10.3.12/platform-windows/maya-2025/lib",
|
||||
"DNACalibMayaPlugin/2.7.3/platform-windows/maya-2025/lib",
|
||||
"MayaUERBFPlugin/2.0.4/platform-windows/maya-2025/lib",
|
||||
"PreviewRigLogic/2.3.3/platform-windows/maya-2025/lib",
|
||||
"SwingTwistEvaluatorPlugin/1.3.2/platform-windows/maya-2025/lib"
|
||||
],
|
||||
"ML_MODEL_ROOT": [
|
||||
"ml_jm_model/1.2.2"
|
||||
],
|
||||
"LOD_GENERATION_ROOT": [
|
||||
"lod_generation_model/1.0.0"
|
||||
]
|
||||
}
|
||||
51
plug-ins/MetaHumanForMaya/env/win64-2026.json
vendored
Normal file
51
plug-ins/MetaHumanForMaya/env/win64-2026.json
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"PATH": [
|
||||
"QtPy/2.4.1/python-3/bin",
|
||||
"packaging/24.0/python-3/bin",
|
||||
"PolyAlloc/1.3.18/platform-windows/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-windows/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-windows/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-windows/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-windows/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-windows/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-windows/.sanitizers-off/.json-0/python-3.11/lib",
|
||||
"PyRDF/6.4.1/platform-windows/.sanitizers-off/python-3.11/lib",
|
||||
"PyDNACalib2/3.2.4/platform-windows/.sanitizers-off/python-3.11/lib"
|
||||
],
|
||||
"PYTHONPATH": [
|
||||
"QtPy/2.4.1/python-3/python",
|
||||
"packaging/24.0/python-3/python",
|
||||
"PolyAlloc/1.3.18/platform-windows/.sanitizers-off/lib",
|
||||
"StatusCode/1.2.12/platform-windows/.sanitizers-off/lib",
|
||||
"TRiO/4.0.21/platform-windows/.sanitizers-off/lib",
|
||||
"DNA/9.4.7/platform-windows/.sanitizers-off/.json-0/lib",
|
||||
"RDF/6.4.1/platform-windows/.sanitizers-off/lib",
|
||||
"DNACalib2/3.2.4/platform-windows/.sanitizers-off/lib",
|
||||
"PyDNA/9.4.7/platform-windows/.sanitizers-off/.json-0/python-3.11/lib",
|
||||
"PyRDF/6.4.1/platform-windows/.sanitizers-off/python-3.11/lib",
|
||||
"PyDNACalib2/3.2.4/platform-windows/.sanitizers-off/python-3.11/lib",
|
||||
"nls/8.0.14.1/platform-windows/python-3.11",
|
||||
"rdf_model/0.24.6",
|
||||
"frt_api/2.4.0",
|
||||
"mh_assemble_lib/0.9.2",
|
||||
"qstyle/1.7.1",
|
||||
"mh_character_assembler/1.3.8",
|
||||
"mh_expression_editor/1.12.7",
|
||||
"mh_groom_exporter/1.4.5",
|
||||
"mh_pose_editor/1.3.3"
|
||||
],
|
||||
"MAYA_PLUG_IN_PATH": [
|
||||
"cbsnode_maya/1.7.6/platform-windows/maya-2026/lib",
|
||||
"riglogic4_maya/2.10.3.12/platform-windows/maya-2026/lib",
|
||||
"DNACalibMayaPlugin/2.7.3/platform-windows/maya-2026/lib",
|
||||
"MayaUERBFPlugin/2.0.4/platform-windows/maya-2026/lib",
|
||||
"PreviewRigLogic/2.3.3/platform-windows/maya-2026/lib",
|
||||
"SwingTwistEvaluatorPlugin/1.3.2/platform-windows/maya-2026/lib"
|
||||
],
|
||||
"ML_MODEL_ROOT": [
|
||||
"ml_jm_model/1.2.2"
|
||||
],
|
||||
"LOD_GENERATION_ROOT": [
|
||||
"lod_generation_model/1.0.0"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
88
plug-ins/MetaHumanForMaya/licenses/LICENSE-OpenSansFont
Normal file
88
plug-ins/MetaHumanForMaya/licenses/LICENSE-OpenSansFont
Normal file
@@ -0,0 +1,88 @@
|
||||
Copyright 2020 The Open Sans Project Authors (https://github.com/googlefonts/opensans)
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font
|
||||
creation efforts of academic and linguistic communities, and to
|
||||
provide a free and open framework in which fonts may be shared and
|
||||
improved in partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply to
|
||||
any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software
|
||||
components as distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to,
|
||||
deleting, or substituting -- in part or in whole -- any of the
|
||||
components of the Original Version, by changing formats or by porting
|
||||
the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed,
|
||||
modify, redistribute, and sell modified and unmodified copies of the
|
||||
Font Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components, in
|
||||
Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the
|
||||
corresponding Copyright Holder. This restriction only applies to the
|
||||
primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created using
|
||||
the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
177
plug-ins/MetaHumanForMaya/licenses/LICENSE-Packaging_python
Normal file
177
plug-ins/MetaHumanForMaya/licenses/LICENSE-Packaging_python
Normal file
@@ -0,0 +1,177 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
21
plug-ins/MetaHumanForMaya/licenses/LICENSE-onnxruntime
Normal file
21
plug-ins/MetaHumanForMaya/licenses/LICENSE-onnxruntime
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Microsoft Corporation
|
||||
|
||||
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.
|
||||
1
plug-ins/MetaHumanForMaya/licenses/README.md
Normal file
1
plug-ins/MetaHumanForMaya/licenses/README.md
Normal file
@@ -0,0 +1 @@
|
||||
This folder contains third party notices.
|
||||
827
plug-ins/MetaHumanForMaya/plugin/MetaHumanForMaya.py
Normal file
827
plug-ins/MetaHumanForMaya/plugin/MetaHumanForMaya.py
Normal file
@@ -0,0 +1,827 @@
|
||||
# Copyright Epic Games, Inc. All Rights Reserved.
|
||||
import os
|
||||
import re
|
||||
import json
|
||||
import time
|
||||
import logging
|
||||
import platform
|
||||
import importlib
|
||||
import subprocess
|
||||
import webbrowser
|
||||
import http.client
|
||||
from pathlib import Path
|
||||
from datetime import datetime, timedelta
|
||||
from urllib.parse import urlparse
|
||||
|
||||
import maya.OpenMayaUI as omui
|
||||
import maya.api.OpenMaya as om
|
||||
from maya import cmds
|
||||
|
||||
try:
|
||||
import shiboken6 as shiboken
|
||||
from PySide6 import QtGui, QtCore, QtWidgets
|
||||
except ImportError:
|
||||
try:
|
||||
import shiboken2 as shiboken
|
||||
from PySide2 import QtGui, QtCore, QtWidgets
|
||||
except ImportError:
|
||||
raise ImportError("No compatible Qt bindings found (PySide6 or PySide2)")
|
||||
|
||||
DOCUMENTATION_URL = "https://dev.epicgames.com/documentation/en-us/metahuman/metahuman-for-maya"
|
||||
EULA_URL = "https://www.fab.com/eula"
|
||||
DOWNLOAD_URL = "https://www.fab.com/listings/9e3bf55e-d4c3-44fc-a3d4-ec4cb772ec29"
|
||||
LATEST_VERSION_URL = "https://metahuman-versioning.ucs.on.epicgames.com/api/v1/mayaversions"
|
||||
|
||||
LIBS = {
|
||||
"PyDNA": "dna",
|
||||
"PyDNACalib2": "dnacalib2",
|
||||
"PyRDF": "rdf",
|
||||
}
|
||||
|
||||
PLUGINS = {
|
||||
"cbsnode_maya": "cbsNode",
|
||||
"DNACalibMayaPlugin": "DNACalibMayaPlugin",
|
||||
"riglogic4_maya": "embeddedRL4",
|
||||
"MayaUERBFPlugin": "MayaUERBFPlugin",
|
||||
"PreviewRigLogic": "PreviewRigLogic",
|
||||
"SwingTwistEvaluatorPlugin": "SwingTwistEvaluatorPlugin",
|
||||
}
|
||||
|
||||
CHECK_INTERVAL_DAYS = 1
|
||||
WINDOW_TITLE = "MetaHuman for Maya"
|
||||
|
||||
|
||||
def maya_useNewAPI():
|
||||
"""
|
||||
The presence of this function tells Maya that the plugin produces, and
|
||||
expects to be passed, objects created using the Maya Python API 2.0.
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
def is_batch_mode():
|
||||
if not hasattr(cmds, "about"):
|
||||
return False
|
||||
else:
|
||||
return cmds.about(batch=True)
|
||||
|
||||
|
||||
def current_dir():
|
||||
return Path(os.path.dirname(current_dir.__code__.co_filename))
|
||||
|
||||
|
||||
def get_version():
|
||||
version_file = os.path.abspath(os.path.join(current_dir(), "version.txt"))
|
||||
with open(version_file, encoding="utf-8") as f:
|
||||
version = f.read().replace("\n", "").replace("\r", "").replace("\t", "").strip()
|
||||
return version
|
||||
|
||||
|
||||
MENU_NAME = "MetaHuman"
|
||||
VERSION = get_version()
|
||||
|
||||
QSETTINGS = QtCore.QSettings(
|
||||
QtCore.QSettings.Format.IniFormat,
|
||||
QtCore.QSettings.Scope.UserScope,
|
||||
"Epic Games",
|
||||
"MetaHumanForMaya/MetaHumanForMaya",
|
||||
)
|
||||
SETTINGS_PATH = Path(QSETTINGS.fileName()).parent.as_posix()
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
logger = logging.getLogger("MetaHumanForMaya")
|
||||
log_level_name = os.getenv("MH4M_LOGLEVEL", "INFO").upper()
|
||||
log_level = getattr(logging, log_level_name, logging.INFO)
|
||||
logger.setLevel(log_level)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
def get_maya_main_window():
|
||||
"""Get the main Maya window as a QtWidgets.QMainWindow instance."""
|
||||
ptr = omui.MQtUtil.mainWindow()
|
||||
if ptr is not None:
|
||||
return shiboken.wrapInstance(int(ptr), QtWidgets.QMainWindow)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
def load_plugin_info():
|
||||
json_path = current_dir() / "plugin_info.json"
|
||||
with json_path.open("r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
def get_package_version(package_name):
|
||||
data = load_plugin_info()
|
||||
for entry in data.get("Packages", []):
|
||||
if entry.startswith(f"{package_name}-"):
|
||||
return entry.split("-", maxsplit=1)[1]
|
||||
return None
|
||||
|
||||
|
||||
def _apply_used_resolve(packages):
|
||||
rez_env = os.getenv("REZ_USED_RESOLVE")
|
||||
if not rez_env:
|
||||
return packages
|
||||
used_resolve = {}
|
||||
for entry in rez_env.split(" "):
|
||||
if "-" not in entry or not entry:
|
||||
continue
|
||||
name = entry.split("-", 1)[0]
|
||||
used_resolve[name] = entry
|
||||
merged = []
|
||||
for pkg in packages:
|
||||
if "-" not in pkg:
|
||||
merged.append(pkg)
|
||||
continue
|
||||
name = pkg.split("-", 1)[0]
|
||||
merged.append(used_resolve.get(name, pkg))
|
||||
return merged
|
||||
|
||||
|
||||
def _deduplicate_packages(packages):
|
||||
seen = set()
|
||||
unique = []
|
||||
for pkg in packages:
|
||||
if pkg not in seen:
|
||||
unique.append(pkg)
|
||||
seen.add(pkg)
|
||||
return unique
|
||||
|
||||
|
||||
def _filter_packages(packages):
|
||||
filtered_prefixes = ("maya", "python", "platform", "os", "arch")
|
||||
result = []
|
||||
for pkg in packages:
|
||||
name = pkg.split("-", 1)[0]
|
||||
if name in filtered_prefixes:
|
||||
continue
|
||||
result.append(pkg)
|
||||
return result
|
||||
|
||||
|
||||
def format_info_text(info):
|
||||
lines = [
|
||||
f"Name: {info.get('Name')}",
|
||||
f"Version: {get_version()}",
|
||||
f"System: {platform.system()}",
|
||||
f"Host: {cmds.about(installedVersion=True)}",
|
||||
f"Settings: {SETTINGS_PATH}",
|
||||
]
|
||||
|
||||
packages = info.get("Packages", [])
|
||||
packages = _apply_used_resolve(packages)
|
||||
packages = _deduplicate_packages(packages)
|
||||
packages = _filter_packages(packages)
|
||||
|
||||
lines.append("Packages:")
|
||||
for package in packages:
|
||||
lines.append(f" • {package}")
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
class AboutDialog(QtWidgets.QDialog):
|
||||
def __init__(self, plugin_info, parent=None):
|
||||
super().__init__(parent)
|
||||
self.setWindowTitle(WINDOW_TITLE)
|
||||
self.setMinimumSize(400, 400)
|
||||
|
||||
self.info_text = format_info_text(plugin_info)
|
||||
|
||||
main_layout = QtWidgets.QVBoxLayout(self)
|
||||
|
||||
self.text_edit = QtWidgets.QPlainTextEdit()
|
||||
self.text_edit.setReadOnly(True)
|
||||
self.text_edit.setPlainText(self.info_text)
|
||||
self.text_edit.setStyleSheet(
|
||||
"""
|
||||
QPlainTextEdit {
|
||||
font-family: Consolas, monospace;
|
||||
font-size: 10pt;
|
||||
}
|
||||
"""
|
||||
)
|
||||
|
||||
button_row = QtWidgets.QHBoxLayout()
|
||||
button_row.setContentsMargins(0, 0, 0, 0)
|
||||
|
||||
copy_button = QtWidgets.QPushButton("Copy to Clipboard")
|
||||
copy_button.clicked.connect(self.copy_to_clipboard)
|
||||
|
||||
ok_button = QtWidgets.QPushButton("OK")
|
||||
ok_button.clicked.connect(self.accept)
|
||||
|
||||
button_row.addWidget(copy_button, 0, QtCore.Qt.AlignmentFlag.AlignLeft)
|
||||
button_row.addStretch(1)
|
||||
button_row.addWidget(ok_button, 0, QtCore.Qt.AlignmentFlag.AlignRight)
|
||||
|
||||
main_layout.addWidget(self.text_edit)
|
||||
main_layout.addLayout(button_row)
|
||||
|
||||
self.resize(400, 600)
|
||||
|
||||
def copy_to_clipboard(self):
|
||||
QtGui.QGuiApplication.clipboard().setText(self.info_text)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
def _safe_ssl_context():
|
||||
try:
|
||||
import ssl # imported here on purpose
|
||||
except Exception as e:
|
||||
logger.error("ssl module import failed: %s", e)
|
||||
return None
|
||||
|
||||
def _pick_ca_locations():
|
||||
# env overrides
|
||||
env_file = os.environ.get("SSL_CERT_FILE")
|
||||
if env_file and os.path.isfile(env_file):
|
||||
return env_file, None
|
||||
env_dir = os.environ.get("SSL_CERT_DIR")
|
||||
if env_dir and os.path.isdir(env_dir):
|
||||
return None, env_dir
|
||||
|
||||
# defaults from this openssl build
|
||||
try:
|
||||
dvp = ssl.get_default_verify_paths()
|
||||
if getattr(dvp, "cafile", None) and os.path.isfile(dvp.cafile):
|
||||
return dvp.cafile, None
|
||||
if getattr(dvp, "capath", None) and os.path.isdir(dvp.capath):
|
||||
return None, dvp.capath
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# common unix locations
|
||||
if os.name == "posix":
|
||||
common = [
|
||||
"/etc/ssl/certs/ca-certificates.crt", # debian, ubuntu
|
||||
"/etc/pki/tls/certs/ca-bundle.crt", # rhel, centos, fedora
|
||||
"/etc/ssl/ca-bundle.pem", # suse
|
||||
"/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem",
|
||||
"/etc/ssl/cert.pem", # macos
|
||||
"/usr/local/etc/openssl@1.1/cert.pem", # homebrew old
|
||||
"/usr/local/etc/openssl/cert.pem", # homebrew current
|
||||
]
|
||||
for p in common:
|
||||
if os.path.isfile(p):
|
||||
return p, None
|
||||
|
||||
return None, None
|
||||
|
||||
try:
|
||||
ctx = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH)
|
||||
ctx.check_hostname = True
|
||||
ctx.verify_mode = ssl.CERT_REQUIRED
|
||||
if hasattr(ssl, "TLSVersion"):
|
||||
ctx.minimum_version = ssl.TLSVersion.TLSv1_2
|
||||
|
||||
cafile, capath = _pick_ca_locations()
|
||||
if cafile or capath:
|
||||
ctx.load_verify_locations(cafile=cafile, capath=capath)
|
||||
else:
|
||||
logger.debug("No system CA bundle: relying on OpenSSL defaults")
|
||||
|
||||
return ctx
|
||||
except Exception as e:
|
||||
logger.error("failed building SSL context: %s", e)
|
||||
return None
|
||||
|
||||
|
||||
def https_get(url, timeout=10):
|
||||
try:
|
||||
parsed = urlparse(url)
|
||||
if parsed.scheme != "https":
|
||||
logger.error(f"Only HTTPS URLs are supported, got: {parsed.scheme}")
|
||||
return None, None
|
||||
|
||||
path = parsed.path or "/"
|
||||
if parsed.query:
|
||||
path = f"{path}?{parsed.query}"
|
||||
|
||||
ctx = _safe_ssl_context()
|
||||
if ctx is None:
|
||||
logger.error("cannot create SSL context, HTTPS is unavailable in this runtime")
|
||||
return None, None
|
||||
|
||||
conn = http.client.HTTPSConnection(parsed.hostname, parsed.port or 443, timeout=timeout, context=ctx)
|
||||
|
||||
try:
|
||||
conn.request("GET", path, headers={"User-Agent": "MetaHumanForMaya"})
|
||||
resp = conn.getresponse()
|
||||
body = resp.read()
|
||||
body_str = body.decode("utf-8", errors="replace")
|
||||
try:
|
||||
return resp.status, json.loads(body_str)
|
||||
except json.JSONDecodeError:
|
||||
return resp.status, body_str
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
except (http.client.HTTPException, OSError, TimeoutError) as e:
|
||||
logger.error(f"Network error fetching {url}: {e}")
|
||||
return None, None
|
||||
except Exception as e:
|
||||
logger.error(f"Unexpected error fetching {url}: {e}")
|
||||
return None, None
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
def get_latest_version():
|
||||
try:
|
||||
status, content = https_get(LATEST_VERSION_URL, timeout=15)
|
||||
|
||||
# Check if request failed
|
||||
if status is None or content is None:
|
||||
logger.error("Failed to fetch latest version (network error)")
|
||||
return None
|
||||
|
||||
if status != 200:
|
||||
logger.error(f"Error checking for updates, request returned: {status}")
|
||||
return None
|
||||
|
||||
# Ensure content is a dict
|
||||
if not isinstance(content, dict):
|
||||
logger.error(f"Unexpected response type: {type(content)}")
|
||||
return None
|
||||
|
||||
# Get platform-specific data
|
||||
system = platform.system()
|
||||
data = content.get(system, {})
|
||||
|
||||
if not data:
|
||||
logger.warning(f"No version data available for platform: {system}")
|
||||
return None
|
||||
|
||||
version = data.get("version")
|
||||
if not version:
|
||||
logger.warning(f"Version field missing in response for platform: {system}")
|
||||
return None
|
||||
|
||||
return version
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Unexpected error getting latest version: {e}")
|
||||
return None
|
||||
|
||||
|
||||
def is_update_available():
|
||||
try:
|
||||
if is_batch_mode():
|
||||
return (False, VERSION)
|
||||
|
||||
latest = get_latest_version()
|
||||
if latest is None:
|
||||
return (None, None)
|
||||
|
||||
logger.debug(f"Latest version: {latest}, current version: {VERSION}")
|
||||
try:
|
||||
current_is_smaller = compare_semver_versions(VERSION, latest) == -1
|
||||
except (ValueError, AttributeError) as e:
|
||||
logger.error(f"Error comparing versions '{VERSION}' vs '{latest}': {e}")
|
||||
return (None, None)
|
||||
|
||||
if current_is_smaller:
|
||||
return (True, latest)
|
||||
|
||||
return (False, VERSION)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Unexpected error checking for updates: {e}")
|
||||
return (None, None)
|
||||
|
||||
|
||||
class UpdatePrompt(QtWidgets.QDialog):
|
||||
def __init__(self, message, update_available=False, parent=None):
|
||||
super().__init__(parent)
|
||||
self.setWindowTitle(WINDOW_TITLE)
|
||||
self.setMinimumWidth(400)
|
||||
|
||||
layout = QtWidgets.QVBoxLayout(self)
|
||||
|
||||
label = QtWidgets.QLabel(message, self)
|
||||
label.setWordWrap(True)
|
||||
|
||||
button_box = QtWidgets.QDialogButtonBox(self)
|
||||
|
||||
if update_available:
|
||||
label.setText(label.text() + "\n" + "Would you like to go to download page?")
|
||||
button_box.setStandardButtons(QtWidgets.QDialogButtonBox.Yes | QtWidgets.QDialogButtonBox.No)
|
||||
else:
|
||||
button_box.setStandardButtons(QtWidgets.QDialogButtonBox.Ok)
|
||||
|
||||
layout.addWidget(label)
|
||||
layout.addWidget(button_box)
|
||||
button_box.accepted.connect(self.accept)
|
||||
button_box.rejected.connect(self.reject)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
class WarningDialog(QtWidgets.QDialog):
|
||||
def __init__(self, message, parent=None):
|
||||
super().__init__(parent)
|
||||
self.setWindowTitle(WINDOW_TITLE + " | Warning")
|
||||
self.setMinimumWidth(400)
|
||||
self.message = message
|
||||
|
||||
main_layout = QtWidgets.QVBoxLayout(self)
|
||||
content_layout = QtWidgets.QVBoxLayout()
|
||||
content_layout.setSpacing(10)
|
||||
|
||||
icon = self.style().standardIcon(QtWidgets.QStyle.SP_MessageBoxWarning)
|
||||
icon_label = QtWidgets.QLabel(self)
|
||||
icon_label.setPixmap(icon.pixmap(32, 32))
|
||||
icon_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignHCenter)
|
||||
|
||||
self.text_edit = QtWidgets.QPlainTextEdit(self)
|
||||
self.text_edit.setReadOnly(True)
|
||||
self.text_edit.setPlainText(message)
|
||||
self.text_edit.setStyleSheet(
|
||||
"""
|
||||
QPlainTextEdit {
|
||||
font-family: Consolas, monospace;
|
||||
font-size: 10pt;
|
||||
}
|
||||
"""
|
||||
)
|
||||
|
||||
content_layout.addWidget(icon_label)
|
||||
content_layout.addWidget(self.text_edit)
|
||||
|
||||
button_row = QtWidgets.QHBoxLayout()
|
||||
|
||||
copy_btn = QtWidgets.QPushButton("Copy to Clipboard")
|
||||
copy_btn.clicked.connect(self.copy_to_clipboard)
|
||||
|
||||
ignore_btn = QtWidgets.QPushButton("Ignore and continue")
|
||||
ignore_btn.clicked.connect(self.accept)
|
||||
|
||||
cancel_btn = QtWidgets.QPushButton("Cancel")
|
||||
cancel_btn.clicked.connect(self.reject)
|
||||
|
||||
button_row.addWidget(copy_btn, 0, QtCore.Qt.AlignmentFlag.AlignLeft)
|
||||
button_row.addStretch(1)
|
||||
button_row.addWidget(ignore_btn, 0, QtCore.Qt.AlignmentFlag.AlignRight)
|
||||
button_row.addWidget(cancel_btn, 0, QtCore.Qt.AlignmentFlag.AlignRight)
|
||||
|
||||
main_layout.addLayout(content_layout)
|
||||
main_layout.addLayout(button_row)
|
||||
|
||||
def copy_to_clipboard(self):
|
||||
QtGui.QGuiApplication.clipboard().setText(self.message)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
def should_check_for_updates():
|
||||
if is_batch_mode():
|
||||
return False
|
||||
|
||||
disable_updates = QSETTINGS.value("disable_updates", type=int)
|
||||
if disable_updates == 1:
|
||||
return False
|
||||
|
||||
timestamp = QSETTINGS.value("last_update_check", type=int)
|
||||
if timestamp:
|
||||
last_check = datetime.fromtimestamp(timestamp)
|
||||
if datetime.now() - last_check < timedelta(days=CHECK_INTERVAL_DAYS):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def parse_semver_version(version_string):
|
||||
match = re.search(r"(?:v)?(\d+)(?:\.(\d+))?(?:\.(\d+))?$", version_string)
|
||||
if not match:
|
||||
raise ValueError(f"Could not extract version from string: '{version_string}'")
|
||||
major = match.group(1)
|
||||
minor = match.group(2)
|
||||
patch = match.group(3)
|
||||
return f"{major}.{minor}.{patch}"
|
||||
|
||||
|
||||
def compare_semver_versions(v1, v2):
|
||||
def normalize(v):
|
||||
parts = parse_semver_version(v).split(".")
|
||||
return [int(p) if p is not None and p != "None" else 0 for p in parts]
|
||||
|
||||
v1_parts = normalize(v1)
|
||||
v2_parts = normalize(v2)
|
||||
|
||||
for a, b in zip(v1_parts, v2_parts):
|
||||
if a < b:
|
||||
return -1 # v1 < v2
|
||||
elif a > b:
|
||||
return 1 # v1 > v2
|
||||
return 0 # equal
|
||||
|
||||
|
||||
def check_lib_version(name, expected_version):
|
||||
try:
|
||||
lib = importlib.import_module(name)
|
||||
except ImportError:
|
||||
logger.error(f"Library '{name}' could not be imported.")
|
||||
return False, "N/A"
|
||||
|
||||
actual_version = "0.0.0"
|
||||
|
||||
if hasattr(lib, "VersionInfo_getVersionString"):
|
||||
actual_version = lib.VersionInfo_getVersionString()
|
||||
elif hasattr(lib, "__version__"):
|
||||
actual_version = lib.__version__
|
||||
else:
|
||||
raise AttributeError(
|
||||
f"Cannot determine the major version of library '{name}'. "
|
||||
"Expected a 'VersionInfo_getVersionString' method or '__version__' attribute."
|
||||
)
|
||||
|
||||
actual_version = parse_semver_version(actual_version)
|
||||
|
||||
return (actual_version == expected_version), actual_version
|
||||
|
||||
|
||||
def user_warning(message):
|
||||
logger.warning(message)
|
||||
if is_batch_mode():
|
||||
return
|
||||
|
||||
QtWidgets.QApplication.restoreOverrideCursor()
|
||||
dialog = WarningDialog(message, get_maya_main_window())
|
||||
dialog.resize(920, 360)
|
||||
result = dialog.exec()
|
||||
|
||||
return result == QtWidgets.QDialog.Rejected
|
||||
|
||||
|
||||
def get_user_plugin_path():
|
||||
version = cmds.about(version=True)
|
||||
doc_root = os.path.join(os.environ["USERPROFILE"], "Documents", "maya")
|
||||
return os.path.join(doc_root, version, "plug-ins").replace("\\", "/")
|
||||
|
||||
|
||||
def get_maya_plugin_search_paths():
|
||||
paths = set()
|
||||
for path in os.environ.get("MAYA_PLUG_IN_PATH", "").split(os.pathsep):
|
||||
if path:
|
||||
paths.add(os.path.normpath(path).replace("\\", "/"))
|
||||
paths.add(get_user_plugin_path())
|
||||
return list(paths)
|
||||
|
||||
|
||||
def dependency_checks():
|
||||
issues = []
|
||||
|
||||
# libs
|
||||
for package, lib in LIBS.items():
|
||||
expected = get_package_version(package)
|
||||
check, actual = check_lib_version(lib, expected)
|
||||
if not check:
|
||||
issues.append(
|
||||
{
|
||||
"kind": "lib",
|
||||
"name": lib,
|
||||
"expected": expected,
|
||||
"actual": actual,
|
||||
"detail": (
|
||||
"A plugin that uses an incompatible version of the specified "
|
||||
"library is already loaded. If you've used a related external tool, "
|
||||
"the issue may be caused by a plugin associated with it."
|
||||
),
|
||||
}
|
||||
)
|
||||
|
||||
# plugins
|
||||
for package, plugin in PLUGINS.items():
|
||||
expected = get_package_version(package)
|
||||
|
||||
if not cmds.pluginInfo(plugin, query=True, loaded=True):
|
||||
cmds.loadPlugin(plugin, quiet=True)
|
||||
|
||||
actual = cmds.pluginInfo(plugin, query=True, version=True)
|
||||
if actual != expected:
|
||||
filepath = cmds.pluginInfo(plugin, query=True, path=True)
|
||||
issues.append(
|
||||
{
|
||||
"kind": "plugin",
|
||||
"name": plugin,
|
||||
"expected": expected,
|
||||
"actual": actual,
|
||||
"detail": (
|
||||
"Specified plugin is already loaded and incompatible with the "
|
||||
"current application. Remove the plugin and try again."
|
||||
),
|
||||
"path": filepath,
|
||||
}
|
||||
)
|
||||
|
||||
# nothing to report
|
||||
if not issues:
|
||||
return
|
||||
|
||||
# format a single combined warning dialog
|
||||
lines = []
|
||||
lines.append("Dependency mismatch summary\n")
|
||||
for i, item in enumerate(issues, 1):
|
||||
lines.append(f"{i}. {item['kind']}: {item['name']}")
|
||||
lines.append(f" expected: {item['expected']}")
|
||||
lines.append(f" found: {item['actual']}")
|
||||
if "path" in item and item["path"]:
|
||||
lines.append(f" path: {item['path']}")
|
||||
lines.append(f" note: {item['detail']}\n")
|
||||
|
||||
message = "\n".join(lines)
|
||||
rejected = user_warning(message)
|
||||
|
||||
if rejected:
|
||||
logger.error("dependency checks failed")
|
||||
raise Exception("Incompatible or incomplete environment, please refer to full error log for more info.")
|
||||
|
||||
logger.warning("dependency mismatches present; continuing on user request")
|
||||
|
||||
|
||||
def perform_check_for_updates(shy_dialog=False):
|
||||
update_available, ver = is_update_available()
|
||||
QSETTINGS.setValue("last_update_check", int(time.time()))
|
||||
|
||||
message = ""
|
||||
if update_available is None:
|
||||
message = (
|
||||
"Error: Could not fetch version data from server. Please check if theres an update using Epic Launcher."
|
||||
)
|
||||
|
||||
elif isinstance(update_available, bool):
|
||||
if update_available:
|
||||
message = f"A new version of {WINDOW_TITLE} is available: v{ver}"
|
||||
else:
|
||||
message = f"You have the latest version of {WINDOW_TITLE}: v{ver}"
|
||||
|
||||
logger.info(message)
|
||||
if is_batch_mode():
|
||||
return message
|
||||
|
||||
if shy_dialog and not update_available:
|
||||
return message
|
||||
|
||||
dialog = UpdatePrompt(message, update_available, get_maya_main_window())
|
||||
result = dialog.exec()
|
||||
if update_available and result == QtWidgets.QDialog.Accepted:
|
||||
webbrowser.open(DOWNLOAD_URL)
|
||||
|
||||
return message
|
||||
|
||||
|
||||
def updates_check():
|
||||
try:
|
||||
logger.info("Checking for updates...")
|
||||
if should_check_for_updates():
|
||||
perform_check_for_updates(shy_dialog=True)
|
||||
else:
|
||||
logger.info("Check skipped.")
|
||||
except Exception as e:
|
||||
logger.error(f"Error during updates check: {e}")
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
def command_open_EULA(*args):
|
||||
webbrowser.open(EULA_URL)
|
||||
|
||||
|
||||
def command_open_licenses_folder(*args):
|
||||
licenses_dir = current_dir().parent / "licenses"
|
||||
system = platform.system()
|
||||
if system == "Windows":
|
||||
os.startfile(licenses_dir)
|
||||
elif system == "Darwin": # macOS
|
||||
subprocess.run(["open", str(licenses_dir)])
|
||||
else: # Linux and other UNIX-like
|
||||
subprocess.run(["xdg-open", str(licenses_dir)])
|
||||
|
||||
|
||||
def command_check_for_updates(*args):
|
||||
perform_check_for_updates(shy_dialog=False)
|
||||
|
||||
|
||||
def command_open_documentation(*args):
|
||||
webbrowser.open(DOCUMENTATION_URL)
|
||||
|
||||
|
||||
def command_show_about(*args):
|
||||
plugin_info = load_plugin_info()
|
||||
logger.info(plugin_info)
|
||||
if is_batch_mode():
|
||||
return
|
||||
dialog = AboutDialog(plugin_info, get_maya_main_window())
|
||||
dialog.exec()
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
def install_menu():
|
||||
# check if the menu already exists; if so, delete it
|
||||
uninstall_menu()
|
||||
|
||||
# create a new menu in the Maya main menu bar
|
||||
menu = cmds.menu(MENU_NAME, label=MENU_NAME, to=True, parent="MayaWindow")
|
||||
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
label="Character Assembler",
|
||||
command="import mh_character_assembler;mh_character_assembler.show()",
|
||||
)
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
label="Expression Editor",
|
||||
command="import mh_expression_editor;mh_expression_editor.show()",
|
||||
)
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
label="Pose Editor",
|
||||
command="import mh_pose_editor;mh_pose_editor.show()",
|
||||
)
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
label="Groom Exporter",
|
||||
command="import mh_groom_exporter;mh_groom_exporter.show()",
|
||||
)
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
divider=True,
|
||||
)
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
label="View EULA",
|
||||
command=command_open_EULA,
|
||||
)
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
label="Third party notices",
|
||||
command=command_open_licenses_folder,
|
||||
)
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
label="Check for updates",
|
||||
command=command_check_for_updates,
|
||||
)
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
label="Documentation",
|
||||
command=command_open_documentation,
|
||||
)
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
label="About",
|
||||
command=command_show_about,
|
||||
)
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
divider=True,
|
||||
)
|
||||
cmds.menuItem(
|
||||
parent=menu,
|
||||
label=VERSION,
|
||||
enable=False,
|
||||
)
|
||||
|
||||
|
||||
def uninstall_menu():
|
||||
if cmds.menu(MENU_NAME, exists=True):
|
||||
cmds.deleteUI(MENU_NAME, menu=True)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
# initialize the plug-in
|
||||
def initializePlugin(plugin):
|
||||
om.MFnPlugin(plugin, "MetaHumanForMaya", VERSION, "Any")
|
||||
|
||||
# check dependencies
|
||||
dependency_checks()
|
||||
|
||||
# check for updates
|
||||
updates_check()
|
||||
|
||||
# add menu items to the custom menu
|
||||
install_menu()
|
||||
|
||||
|
||||
# uninitialize the plug-in
|
||||
def uninitializePlugin(plugin):
|
||||
om.MFnPlugin(plugin)
|
||||
uninstall_menu()
|
||||
43
plug-ins/MetaHumanForMaya/plugin/plugin_info.json
Normal file
43
plug-ins/MetaHumanForMaya/plugin/plugin_info.json
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"Name": "MetaHumanForMaya",
|
||||
"Version": "1.2.50",
|
||||
"Supported": [
|
||||
"maya-2023",
|
||||
"maya-2024",
|
||||
"maya-2025",
|
||||
"maya-2026",
|
||||
"python-3.9.11",
|
||||
"python-3.10.11",
|
||||
"python-3.11.9"
|
||||
],
|
||||
"Packages": [
|
||||
"DNA-9.4.7",
|
||||
"DNACalib2-3.2.4",
|
||||
"DNACalibMayaPlugin-2.7.3",
|
||||
"MayaUERBFPlugin-2.0.4",
|
||||
"PolyAlloc-1.3.18",
|
||||
"PreviewRigLogic-2.3.3",
|
||||
"PyDNA-9.4.7",
|
||||
"PyDNACalib2-3.2.4",
|
||||
"PyRDF-6.4.1",
|
||||
"QtPy-2.4.1",
|
||||
"RDF-6.4.1",
|
||||
"StatusCode-1.2.12",
|
||||
"SwingTwistEvaluatorPlugin-1.3.2",
|
||||
"TRiO-4.0.21",
|
||||
"cbsnode_maya-1.7.6",
|
||||
"frt_api-2.4.0",
|
||||
"lod_generation_model-1.0.0",
|
||||
"mh_assemble_lib-0.9.2",
|
||||
"mh_character_assembler-1.3.8",
|
||||
"mh_expression_editor-1.12.7",
|
||||
"mh_groom_exporter-1.4.5",
|
||||
"mh_pose_editor-1.3.3",
|
||||
"ml_jm_model-1.2.2",
|
||||
"nls-8.0.14.1",
|
||||
"packaging-24.0",
|
||||
"qstyle-1.7.1",
|
||||
"rdf_model-0.24.6",
|
||||
"riglogic4_maya-2.10.3.12"
|
||||
]
|
||||
}
|
||||
1
plug-ins/MetaHumanForMaya/plugin/version.txt
Normal file
1
plug-ins/MetaHumanForMaya/plugin/version.txt
Normal file
@@ -0,0 +1 @@
|
||||
1.2.50
|
||||
Reference in New Issue
Block a user