diff --git a/3ds Max/Max2Babylon.sln b/3ds Max/Max2Babylon.sln
index 303eb96a..1a632daf 100644
--- a/3ds Max/Max2Babylon.sln
+++ b/3ds Max/Max2Babylon.sln
@@ -35,54 +35,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Max2Babylon2022", "Max2Baby
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Max2Babylon2023", "Max2Babylon\2023\Max2Babylon2023.csproj", "{ED7E1CE3-156D-40A9-888E-ACEC3E93B0FB}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Max2Babylon2024", "Max2Babylon\2024\Max2Babylon2024.csproj", "{2A1918B0-EB6C-4903-91FD-6ACAE5459B54}"
+EndProject
Global
- GlobalSection(SharedMSBuildProjectFiles) = preSolution
- ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{00356433-4277-48bb-ac33-92d3c47fe28b}*SharedItemsImports = 13
- ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{23892b0b-d8d2-4bcd-96da-d590dd0d5c76}*SharedItemsImports = 4
- ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{23892b0b-d8d2-4bcd-96da-d590dd0d5c76}*SharedItemsImports = 4
- ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{23892b0b-d8d2-4bcd-96da-d590dd0d5c76}*SharedItemsImports = 4
- ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{23892b0b-d8d2-4bcd-96da-d590dd0d5c76}*SharedItemsImports = 4
- ..\SharedProjects\Utilities\Extensions.projitems*{23892b0b-d8d2-4bcd-96da-d590dd0d5c76}*SharedItemsImports = 4
- ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{2a678a75-f8c2-41ba-814a-53e611f5eb96}*SharedItemsImports = 13
- ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{2f49c726-a1f8-40d4-859f-1355949608dc}*SharedItemsImports = 4
- ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-1355949608dc}*SharedItemsImports = 4
- ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{2f49c726-a1f8-40d4-859f-1355949608dc}*SharedItemsImports = 4
- ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-1355949608dc}*SharedItemsImports = 4
- ..\SharedProjects\Utilities\Extensions.projitems*{2f49c726-a1f8-40d4-859f-1355949608dc}*SharedItemsImports = 4
- ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{2f49c726-a1f8-40d4-859f-135594960ddc}*SharedItemsImports = 4
- ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-135594960ddc}*SharedItemsImports = 4
- ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{2f49c726-a1f8-40d4-859f-135594960ddc}*SharedItemsImports = 4
- ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-135594960ddc}*SharedItemsImports = 4
- ..\SharedProjects\Utilities\Extensions.projitems*{2f49c726-a1f8-40d4-859f-135594960ddc}*SharedItemsImports = 4
- ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{2f49c726-a1f8-40d4-859f-1355949612dc}*SharedItemsImports = 4
- ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-1355949612dc}*SharedItemsImports = 4
- ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{2f49c726-a1f8-40d4-859f-1355949612dc}*SharedItemsImports = 4
- ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-1355949612dc}*SharedItemsImports = 4
- ..\SharedProjects\Utilities\Extensions.projitems*{2f49c726-a1f8-40d4-859f-1355949612dc}*SharedItemsImports = 4
- ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{310270a9-e0bc-4795-948a-750af82f31a6}*SharedItemsImports = 4
- ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{310270a9-e0bc-4795-948a-750af82f31a6}*SharedItemsImports = 4
- ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{310270a9-e0bc-4795-948a-750af82f31a6}*SharedItemsImports = 4
- ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{310270a9-e0bc-4795-948a-750af82f31a6}*SharedItemsImports = 4
- ..\SharedProjects\Utilities\Extensions.projitems*{310270a9-e0bc-4795-948a-750af82f31a6}*SharedItemsImports = 4
- ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{cc8bfa12-aff1-4f9f-9ee4-c4a3a5d86237}*SharedItemsImports = 13
- ..\SharedProjects\Utilities\Extensions.projitems*{daed1281-4757-4a4e-b252-b879b43193a3}*SharedItemsImports = 13
- ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{dd7c931a-8faf-4318-bb74-71dc858cc400}*SharedItemsImports = 4
- ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{dd7c931a-8faf-4318-bb74-71dc858cc400}*SharedItemsImports = 4
- ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{dd7c931a-8faf-4318-bb74-71dc858cc400}*SharedItemsImports = 4
- ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{dd7c931a-8faf-4318-bb74-71dc858cc400}*SharedItemsImports = 4
- ..\SharedProjects\Utilities\Extensions.projitems*{dd7c931a-8faf-4318-bb74-71dc858cc400}*SharedItemsImports = 4
- ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{ed7e1ce3-156d-40a9-888e-acec3e93b0fb}*SharedItemsImports = 4
- ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{ed7e1ce3-156d-40a9-888e-acec3e93b0fb}*SharedItemsImports = 4
- ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{ed7e1ce3-156d-40a9-888e-acec3e93b0fb}*SharedItemsImports = 4
- ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{ed7e1ce3-156d-40a9-888e-acec3e93b0fb}*SharedItemsImports = 4
- ..\SharedProjects\Utilities\Extensions.projitems*{ed7e1ce3-156d-40a9-888e-acec3e93b0fb}*SharedItemsImports = 4
- ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{ee8131f8-59ac-45c2-9e79-f07a4ebe45cb}*SharedItemsImports = 4
- ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{ee8131f8-59ac-45c2-9e79-f07a4ebe45cb}*SharedItemsImports = 4
- ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{ee8131f8-59ac-45c2-9e79-f07a4ebe45cb}*SharedItemsImports = 4
- ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{ee8131f8-59ac-45c2-9e79-f07a4ebe45cb}*SharedItemsImports = 4
- ..\SharedProjects\Utilities\Extensions.projitems*{ee8131f8-59ac-45c2-9e79-f07a4ebe45cb}*SharedItemsImports = 4
- ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{fc25673f-b984-4261-b266-9bc8b874079f}*SharedItemsImports = 13
- EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|ARM = Debug|ARM
@@ -392,6 +347,42 @@ Global
{ED7E1CE3-156D-40A9-888E-ACEC3E93B0FB}.Release|x64.Build.0 = Release|x64
{ED7E1CE3-156D-40A9-888E-ACEC3E93B0FB}.Release|x86.ActiveCfg = Release|Any CPU
{ED7E1CE3-156D-40A9-888E-ACEC3E93B0FB}.Release|x86.Build.0 = Release|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|ARM.Build.0 = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|Mixed Platforms.Build.0 = Debug|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|Win32.Build.0 = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|x64.ActiveCfg = Debug|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|x64.Build.0 = Debug|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Debug|x86.Build.0 = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|Any CPU.ActiveCfg = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|Any CPU.Build.0 = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|ARM.ActiveCfg = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|ARM.Build.0 = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|Mixed Platforms.ActiveCfg = Debug|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|Mixed Platforms.Build.0 = Debug|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|Win32.ActiveCfg = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|Win32.Build.0 = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|x64.ActiveCfg = Debug|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|x64.Build.0 = Debug|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|x86.ActiveCfg = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Profile|x86.Build.0 = Debug|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|ARM.ActiveCfg = Release|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|ARM.Build.0 = Release|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|Mixed Platforms.ActiveCfg = Release|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|Mixed Platforms.Build.0 = Release|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|Win32.ActiveCfg = Release|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|Win32.Build.0 = Release|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|x64.ActiveCfg = Release|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|x64.Build.0 = Release|x64
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|x86.ActiveCfg = Release|Any CPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -405,8 +396,61 @@ Global
{23892B0B-D8D2-4BCD-96DA-D590DD0D5C76} = {2139CC27-1C89-49C8-95AC-7715ACBADC1F}
{EE8131F8-59AC-45C2-9E79-F07A4EBE45CB} = {2139CC27-1C89-49C8-95AC-7715ACBADC1F}
{ED7E1CE3-156D-40A9-888E-ACEC3E93B0FB} = {2139CC27-1C89-49C8-95AC-7715ACBADC1F}
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54} = {2139CC27-1C89-49C8-95AC-7715ACBADC1F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B1C70ED2-1F05-433C-A16C-59F6C5BC9A0F}
EndGlobalSection
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{00356433-4277-48bb-ac33-92d3c47fe28b}*SharedItemsImports = 13
+ ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{23892b0b-d8d2-4bcd-96da-d590dd0d5c76}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{23892b0b-d8d2-4bcd-96da-d590dd0d5c76}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{23892b0b-d8d2-4bcd-96da-d590dd0d5c76}*SharedItemsImports = 4
+ ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{23892b0b-d8d2-4bcd-96da-d590dd0d5c76}*SharedItemsImports = 4
+ ..\SharedProjects\Utilities\Extensions.projitems*{23892b0b-d8d2-4bcd-96da-d590dd0d5c76}*SharedItemsImports = 4
+ ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{2a1918b0-eb6c-4903-91fd-6acae5459b54}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{2a1918b0-eb6c-4903-91fd-6acae5459b54}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{2a1918b0-eb6c-4903-91fd-6acae5459b54}*SharedItemsImports = 4
+ ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{2a1918b0-eb6c-4903-91fd-6acae5459b54}*SharedItemsImports = 4
+ ..\SharedProjects\Utilities\Extensions.projitems*{2a1918b0-eb6c-4903-91fd-6acae5459b54}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{2a678a75-f8c2-41ba-814a-53e611f5eb96}*SharedItemsImports = 13
+ ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{2f49c726-a1f8-40d4-859f-1355949608dc}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-1355949608dc}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{2f49c726-a1f8-40d4-859f-1355949608dc}*SharedItemsImports = 4
+ ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-1355949608dc}*SharedItemsImports = 4
+ ..\SharedProjects\Utilities\Extensions.projitems*{2f49c726-a1f8-40d4-859f-1355949608dc}*SharedItemsImports = 4
+ ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{2f49c726-a1f8-40d4-859f-135594960ddc}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-135594960ddc}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{2f49c726-a1f8-40d4-859f-135594960ddc}*SharedItemsImports = 4
+ ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-135594960ddc}*SharedItemsImports = 4
+ ..\SharedProjects\Utilities\Extensions.projitems*{2f49c726-a1f8-40d4-859f-135594960ddc}*SharedItemsImports = 4
+ ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{2f49c726-a1f8-40d4-859f-1355949612dc}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-1355949612dc}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{2f49c726-a1f8-40d4-859f-1355949612dc}*SharedItemsImports = 4
+ ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{2f49c726-a1f8-40d4-859f-1355949612dc}*SharedItemsImports = 4
+ ..\SharedProjects\Utilities\Extensions.projitems*{2f49c726-a1f8-40d4-859f-1355949612dc}*SharedItemsImports = 4
+ ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{310270a9-e0bc-4795-948a-750af82f31a6}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{310270a9-e0bc-4795-948a-750af82f31a6}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{310270a9-e0bc-4795-948a-750af82f31a6}*SharedItemsImports = 4
+ ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{310270a9-e0bc-4795-948a-750af82f31a6}*SharedItemsImports = 4
+ ..\SharedProjects\Utilities\Extensions.projitems*{310270a9-e0bc-4795-948a-750af82f31a6}*SharedItemsImports = 4
+ ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{cc8bfa12-aff1-4f9f-9ee4-c4a3a5d86237}*SharedItemsImports = 13
+ ..\SharedProjects\Utilities\Extensions.projitems*{daed1281-4757-4a4e-b252-b879b43193a3}*SharedItemsImports = 13
+ ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{dd7c931a-8faf-4318-bb74-71dc858cc400}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{dd7c931a-8faf-4318-bb74-71dc858cc400}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{dd7c931a-8faf-4318-bb74-71dc858cc400}*SharedItemsImports = 4
+ ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{dd7c931a-8faf-4318-bb74-71dc858cc400}*SharedItemsImports = 4
+ ..\SharedProjects\Utilities\Extensions.projitems*{dd7c931a-8faf-4318-bb74-71dc858cc400}*SharedItemsImports = 4
+ ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{ed7e1ce3-156d-40a9-888e-acec3e93b0fb}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{ed7e1ce3-156d-40a9-888e-acec3e93b0fb}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{ed7e1ce3-156d-40a9-888e-acec3e93b0fb}*SharedItemsImports = 4
+ ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{ed7e1ce3-156d-40a9-888e-acec3e93b0fb}*SharedItemsImports = 4
+ ..\SharedProjects\Utilities\Extensions.projitems*{ed7e1ce3-156d-40a9-888e-acec3e93b0fb}*SharedItemsImports = 4
+ ..\SharedProjects\Babylon2GLTF\Babylon2GLTF.projitems*{ee8131f8-59ac-45c2-9e79-f07a4ebe45cb}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonExport.Entities\BabylonExport.Entities.projitems*{ee8131f8-59ac-45c2-9e79-f07a4ebe45cb}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{ee8131f8-59ac-45c2-9e79-f07a4ebe45cb}*SharedItemsImports = 4
+ ..\SharedProjects\GltfExport.Entities\GltfExport.Entities.projitems*{ee8131f8-59ac-45c2-9e79-f07a4ebe45cb}*SharedItemsImports = 4
+ ..\SharedProjects\Utilities\Extensions.projitems*{ee8131f8-59ac-45c2-9e79-f07a4ebe45cb}*SharedItemsImports = 4
+ ..\SharedProjects\BabylonFileConverter\BabylonFileConverter.projitems*{fc25673f-b984-4261-b266-9bc8b874079f}*SharedItemsImports = 13
+ EndGlobalSection
EndGlobal
diff --git a/3ds Max/Max2Babylon/2024/Max2Babylon2024.csproj b/3ds Max/Max2Babylon/2024/Max2Babylon2024.csproj
new file mode 100644
index 00000000..f21ffb37
--- /dev/null
+++ b/3ds Max/Max2Babylon/2024/Max2Babylon2024.csproj
@@ -0,0 +1,435 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {2A1918B0-EB6C-4903-91FD-6ACAE5459B54}
+ Library
+ Properties
+ Max2Babylon
+ Max2Babylon
+ v4.8
+ 512
+
+ SAK
+ SAK
+ SAK
+ SAK
+ ..\
+ true
+
+
+ true
+ full
+ false
+ bin\Debug\
+ TRACE;DEBUG;MAX2024
+ prompt
+ 4
+ false
+ true
+ AnyCPU
+
+
+ pdbonly
+ true
+ bin\Release\
+ DEBUG;TRACE;MAX2024
+ prompt
+ 4
+ false
+ true
+
+
+ true
+ bin\Debug\
+ TRACE;DEBUG;MAX2024
+ true
+ full
+ x64
+ prompt
+ MinimumRecommendedRules.ruleset
+
+
+ bin\Release\
+ TRACE;MAX2024
+ true
+ pdbonly
+ x64
+ prompt
+ MinimumRecommendedRules.ruleset
+ true
+
+
+
+ False
+ Refs\Autodesk.Max.dll
+ False
+
+
+ Refs\ExplorerFramework.dll
+ False
+
+
+ ..\..\Refs\GDImageLibrary.dll
+
+
+ False
+ Refs\ManagedServices.dll
+ False
+
+
+ Refs\MaxCustomControls.dll
+ False
+
+
+ False
+ ..\..\packages\Microsoft.WindowsAPICodePack-Core.1.1.0.0\lib\Microsoft.WindowsAPICodePack.dll
+
+
+ False
+ ..\..\packages\Microsoft.WindowsAPICodePack-Shell.1.1.0.0\lib\Microsoft.WindowsAPICodePack.Shell.dll
+
+
+ False
+ ..\..\packages\Microsoft.WindowsAPICodePack-Shell.1.1.0.0\lib\Microsoft.WindowsAPICodePack.ShellExtensions.dll
+
+
+ ..\..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll
+
+
+ Refs\SceneExplorer.dll
+ False
+
+
+ ..\..\packages\SharpDX.3.1.1\lib\net45\SharpDX.dll
+ True
+
+
+ ..\..\packages\SharpDX.Mathematics.3.1.1\lib\net45\SharpDX.Mathematics.dll
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\..\Refs\TargaImage.dll
+
+
+ ..\..\Refs\TQ.Texture.dll
+
+
+
+
+ BabylonActionCallback.cs
+
+
+ BabylonAnimationActionItem.cs
+
+
+ BabylonExportActionItem.cs
+
+
+ BabylonLoadAnimations.cs
+
+
+ BabylonPropertiesActionItem.cs
+
+
+ BabylonSkipFlatten.cs
+
+
+ BabylonStoreAnimations.cs
+
+
+ Descriptor.cs
+
+
+ Exporter\AnimationGroup.cs
+
+
+ Exporter\BabylonExporter.Animation.cs
+
+
+ Exporter\BabylonExporter.Camera.cs
+
+
+ Exporter\BabylonExporter.CustomAttributes.cs
+
+
+ Exporter\BabylonExporter.cs
+
+
+ Exporter\BabylonExporter.IMaterialExporter.cs
+
+
+ Exporter\BabylonExporter.Light.cs
+
+
+ Exporter\BabylonExporter.Logger.cs
+
+
+ Exporter\BabylonExporter.Material.cs
+
+
+ Exporter\BabylonExporter.Material.GLTF.cs
+
+
+ Exporter\BabylonExporter.Material.Pbr.cs
+
+
+ Exporter\BabylonExporter.Mesh.cs
+
+
+ Exporter\BabylonExporter.ShadowGenerator.cs
+
+
+ Exporter\BabylonExporter.Skeleton.cs
+
+
+ Exporter\BabylonExporter.Texture.cs
+
+
+ Exporter\GlobalVertex.cs
+
+
+ Exporter\MaxExportParameters.cs
+
+
+ Exporter\MaxGLTFMaterialExporter.cs
+
+
+ Extensions\ScaleSystem.cs
+
+
+ Forms\AnimationForm.cs
+ Form
+
+
+ Forms\AnimationForm.designer.cs
+ AnimationForm.cs
+
+
+ Forms\AnimationGroupControl.cs
+ UserControl
+
+
+ Forms\AnimationGroupControl.designer.cs
+ AnimationGroupControl.cs
+
+
+ Forms\CameraPropertiesForm.cs
+ Form
+
+
+ Forms\CameraPropertiesForm.Designer.cs
+ CameraPropertiesForm.cs
+
+
+ Forms\ExporterForm.cs
+ Form
+
+
+ Forms\ExporterForm.Designer.cs
+ ExporterForm.cs
+
+
+ Forms\LayerSelector.cs
+ Form
+
+
+ Forms\LayerSelector.designer.cs
+ LayerSelector.cs
+
+
+ Forms\LightPropertiesForm.cs
+ Form
+
+
+ Forms\LightPropertiesForm.Designer.cs
+ LightPropertiesForm.cs
+
+
+ Forms\MaxNodeTreeView.cs
+ Component
+
+
+ Forms\MaxNodeTreeView.designer.cs
+ MaxNodeTreeView.cs
+
+
+ Forms\MultiExportForm.cs
+ Form
+
+
+ Forms\MultiExportForm.designer.cs
+ MultiExportForm.cs
+
+
+ Forms\ObjectPropertiesForm.cs
+ Form
+
+
+ Forms\ObjectPropertiesForm.Designer.cs
+ ObjectPropertiesForm.cs
+
+
+ Forms\ScenePropertiesForm.cs
+ Form
+
+
+ Forms\ScenePropertiesForm.Designer.cs
+ ScenePropertiesForm.cs
+
+
+ Forms\Vector3Control.cs
+ UserControl
+
+
+ Forms\Vector3Control.Designer.cs
+ Vector3Control.cs
+
+
+ GlobalUtility.cs
+
+
+ Loader.cs
+
+
+ MaxScriptManager.cs
+
+
+ MaterialScripts.cs
+
+
+ Tools\LayerUtilities.cs
+
+
+ Tools\MeshUtlities.cs
+
+
+ Tools\ScriptsUtilities.cs
+
+
+ Tools\Tools.cs
+
+
+ Tools\VNormal.cs
+
+
+ Tools\WebServer.cs
+
+
+ Exporter\BabylonExporter.ExportItem.cs
+
+
+ Exporter\BabylonExporter.WorldModifiers.Skin.cs
+
+
+
+ True
+ True
+ Resources.resx
+
+
+
+
+ Forms\AnimationForm.resx
+ AnimationForm.cs
+
+
+ Forms\AnimationGroupControl.resx
+ AnimationGroupControl.cs
+
+
+ Forms\CameraPropertiesForm.resx
+ CameraPropertiesForm.cs
+
+
+ Forms\ExporterForm.resx
+ ExporterForm.cs
+
+
+ Forms\LayerSelector.resx
+ LayerSelector.cs
+
+
+ Forms\LightPropertiesForm.resx
+ LightPropertiesForm.cs
+
+
+ Forms\MultiExportForm.resx
+ MultiExportForm.cs
+
+
+ Forms\ObjectPropertiesForm.resx
+ ObjectPropertiesForm.cs
+
+
+ Forms\ScenePropertiesForm.resx
+ ScenePropertiesForm.cs
+
+
+ Forms\Vector3Control.resx
+ Vector3Control.cs
+
+
+ Forms\MaxNodeTreeView.resx
+ MaxNodeTreeView.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
+
+
+
+ Scripts\ARNOLD_MATERIAL_CAT_DEF.ms
+
+
+ Scripts\BUMP_MAP_CAT_DEF.ms
+
+
+ Scripts\PHYSICAL_MATERIAL_CAT_DEF.ms
+
+
+ Scripts\STANDARD_MATERIAL_CAT_DEF.ms
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ call "$(SolutionDir)Max2Babylon\OnPostBuild.bat" "$(ConfigurationName)" 2024
+
+
+ call "$(SolutionDir)Max2Babylon\OnPreBuild.bat" "$(ConfigurationName)"
+
+
+
\ No newline at end of file
diff --git a/3ds Max/Max2Babylon/2024/Properties/AssemblyInfo.cs b/3ds Max/Max2Babylon/2024/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..db1e723e
--- /dev/null
+++ b/3ds Max/Max2Babylon/2024/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Max2Babylon")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Max2Babylon")]
+[assembly: AssemblyCopyright("Copyright © 2022")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("2d621b1c-3661-49bd-8dd3-4c5de51fce94")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/3ds Max/Max2Babylon/2024/Properties/Resources.Designer.cs b/3ds Max/Max2Babylon/2024/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..69d702e1
--- /dev/null
+++ b/3ds Max/Max2Babylon/2024/Properties/Resources.Designer.cs
@@ -0,0 +1,113 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Max2Babylon.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Max2Babylon.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ internal static byte[] ARNOLD_MATERIAL_CAT_DEF {
+ get {
+ object obj = ResourceManager.GetObject("ARNOLD_MATERIAL_CAT_DEF", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ internal static byte[] BUMP_MAP_CAT_DEF {
+ get {
+ object obj = ResourceManager.GetObject("BUMP_MAP_CAT_DEF", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap MaxExporter {
+ get {
+ object obj = ResourceManager.GetObject("MaxExporter", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ internal static byte[] PHYSICAL_MATERIAL_CAT_DEF {
+ get {
+ object obj = ResourceManager.GetObject("PHYSICAL_MATERIAL_CAT_DEF", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ internal static byte[] STANDARD_MATERIAL_CAT_DEF {
+ get {
+ object obj = ResourceManager.GetObject("STANDARD_MATERIAL_CAT_DEF", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+ }
+}
diff --git a/3ds Max/Max2Babylon/2024/Properties/Resources.resx b/3ds Max/Max2Babylon/2024/Properties/Resources.resx
new file mode 100644
index 00000000..6ad42aa7
--- /dev/null
+++ b/3ds Max/Max2Babylon/2024/Properties/Resources.resx
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\..\Scripts\ARNOLD_MATERIAL_CAT_DEF.ms;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\..\Scripts\BUMP_MAP_CAT_DEF.ms;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\Resources\MaxExporter.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\..\Scripts\PHYSICAL_MATERIAL_CAT_DEF.ms;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\..\Scripts\STANDARD_MATERIAL_CAT_DEF.ms;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/3ds Max/Max2Babylon/2024/Refs/Autodesk.Max.dll b/3ds Max/Max2Babylon/2024/Refs/Autodesk.Max.dll
new file mode 100644
index 00000000..4e63d4e9
Binary files /dev/null and b/3ds Max/Max2Babylon/2024/Refs/Autodesk.Max.dll differ
diff --git a/3ds Max/Max2Babylon/2024/Refs/ExplorerFramework.dll b/3ds Max/Max2Babylon/2024/Refs/ExplorerFramework.dll
new file mode 100644
index 00000000..683901f7
Binary files /dev/null and b/3ds Max/Max2Babylon/2024/Refs/ExplorerFramework.dll differ
diff --git a/3ds Max/Max2Babylon/2024/Refs/ManagedServices.dll b/3ds Max/Max2Babylon/2024/Refs/ManagedServices.dll
new file mode 100644
index 00000000..61738afc
Binary files /dev/null and b/3ds Max/Max2Babylon/2024/Refs/ManagedServices.dll differ
diff --git a/3ds Max/Max2Babylon/2024/Refs/MaxCustomControls.dll b/3ds Max/Max2Babylon/2024/Refs/MaxCustomControls.dll
new file mode 100644
index 00000000..e967afad
Binary files /dev/null and b/3ds Max/Max2Babylon/2024/Refs/MaxCustomControls.dll differ
diff --git a/3ds Max/Max2Babylon/2024/Refs/SceneExplorer.dll b/3ds Max/Max2Babylon/2024/Refs/SceneExplorer.dll
new file mode 100644
index 00000000..351b1ca5
Binary files /dev/null and b/3ds Max/Max2Babylon/2024/Refs/SceneExplorer.dll differ
diff --git a/3ds Max/Max2Babylon/2024/Resources/MaxExporter.png b/3ds Max/Max2Babylon/2024/Resources/MaxExporter.png
new file mode 100644
index 00000000..89b5610a
Binary files /dev/null and b/3ds Max/Max2Babylon/2024/Resources/MaxExporter.png differ
diff --git a/3ds Max/Max2Babylon/2024/packages.config b/3ds Max/Max2Babylon/2024/packages.config
new file mode 100644
index 00000000..25a13046
--- /dev/null
+++ b/3ds Max/Max2Babylon/2024/packages.config
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/3ds Max/Max2Babylon/Descriptor.cs b/3ds Max/Max2Babylon/Descriptor.cs
index 07ccc645..054d3170 100644
--- a/3ds Max/Max2Babylon/Descriptor.cs
+++ b/3ds Max/Max2Babylon/Descriptor.cs
@@ -49,7 +49,7 @@ public override string Category
}
}
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
public override string NonLocalizedClassName => "Babylon File Exporter";
#endif
}
diff --git a/3ds Max/Max2Babylon/Exporter/BabylonExporter.Animation.cs b/3ds Max/Max2Babylon/Exporter/BabylonExporter.Animation.cs
index 3679be27..fdad085a 100644
--- a/3ds Max/Max2Babylon/Exporter/BabylonExporter.Animation.cs
+++ b/3ds Max/Max2Babylon/Exporter/BabylonExporter.Animation.cs
@@ -299,7 +299,7 @@ private List ExportBabylonKeysFromGameController(IIGameCont
var keys = new List();
for (int indexKey = 0; indexKey < gameKeyTab.Count; indexKey++)
{
-#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021|| MAX2022 || MAX2023
+#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021|| MAX2022 || MAX2023 || MAX2024
var gameKey = gameKeyTab[indexKey];
#else
var gameKey = gameKeyTab[new IntPtr(indexKey)];
diff --git a/3ds Max/Max2Babylon/Exporter/BabylonExporter.CustomAttributes.cs b/3ds Max/Max2Babylon/Exporter/BabylonExporter.CustomAttributes.cs
index d66ec6ba..dd00e0be 100644
--- a/3ds Max/Max2Babylon/Exporter/BabylonExporter.CustomAttributes.cs
+++ b/3ds Max/Max2Babylon/Exporter/BabylonExporter.CustomAttributes.cs
@@ -16,7 +16,7 @@ partial class BabylonExporter
public Dictionary ExportExtraAttributes(IIGameMaterial gameMaterial, BabylonScene babylonScene, List excludeAttributes = null)
{
// Retreive the max object
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
ManagedServices.MaxscriptSDK.ExecuteMaxscriptCommand("obj = sceneMaterials[\"" + gameMaterial.MaterialName + "\"];", ManagedServices.MaxscriptSDK.ScriptSource.NotSpecified);
#else
ManagedServices.MaxscriptSDK.ExecuteMaxscriptCommand("obj = sceneMaterials[\"" + gameMaterial.MaterialName + "\"];");
@@ -34,12 +34,11 @@ public Dictionary ExportExtraAttributes(IIGameMaterial gameMater
public Dictionary ExportExtraAttributes(IIGameNode gameNode, BabylonScene babylonScene, List excludeAttributes = null)
{
// Retreive the max object
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
ManagedServices.MaxscriptSDK.ExecuteMaxscriptCommand("obj = maxOps.getNodeByHandle " + gameNode.MaxNode.Handle + ";", ManagedServices.MaxscriptSDK.ScriptSource.NotSpecified);
#else
ManagedServices.MaxscriptSDK.ExecuteMaxscriptCommand("obj = maxOps.getNodeByHandle " + gameNode.MaxNode.Handle + ";");
#endif
-
return _ExportExtraAttributes(gameNode.IGameObject.IPropertyContainer, babylonScene, excludeAttributes);
}
@@ -79,7 +78,7 @@ private Dictionary _ExportExtraAttributes(IIPropertyContainer pr
+ "\r\n" + ")"
+ "\r\n" + ")"
+ "\r\n" + "s";
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
string result = ManagedServices.MaxscriptSDK.ExecuteStringMaxscriptQuery(cmd, ManagedServices.MaxscriptSDK.ScriptSource.NotSpecified);
#else
string result = ManagedServices.MaxscriptSDK.ExecuteStringMaxscriptQuery(cmd);
diff --git a/3ds Max/Max2Babylon/Exporter/BabylonExporter.Light.cs b/3ds Max/Max2Babylon/Exporter/BabylonExporter.Light.cs
index 3cd0fd61..2c482745 100644
--- a/3ds Max/Max2Babylon/Exporter/BabylonExporter.Light.cs
+++ b/3ds Max/Max2Babylon/Exporter/BabylonExporter.Light.cs
@@ -185,8 +185,8 @@ private BabylonNode ExportLight(IIGameScene scene, IIGameNode lightNode, Babylon
foreach (var meshNode in maxScene.NodesListBySuperClass(SClass_ID.Geomobject))
{
-#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021 || MAX2022 || MAX2023
- if (meshNode.CastShadows)
+#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
+ if(meshNode.CastShadows)
#else
if (meshNode.CastShadows == 1)
#endif
diff --git a/3ds Max/Max2Babylon/Exporter/BabylonExporter.Logger.cs b/3ds Max/Max2Babylon/Exporter/BabylonExporter.Logger.cs
index 90ee239d..6467dc2e 100644
--- a/3ds Max/Max2Babylon/Exporter/BabylonExporter.Logger.cs
+++ b/3ds Max/Max2Babylon/Exporter/BabylonExporter.Logger.cs
@@ -88,7 +88,7 @@ public void Print(IIParamBlock2 paramBlock, int logRank)
{
ParamType2 paramType = paramBlock.GetParameterType(i);
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
RaiseVerbose("paramBlock.GetLocalName(" + i + ")=" + paramBlock.GetLocalName(i, 0, false) + ", type=" + paramType, logRank + 1);
#else
RaiseVerbose("paramBlock.GetLocalName(" + i + ")=" + paramBlock.GetLocalName(i, 0) + ", type=" + paramType, logRank + 1);
diff --git a/3ds Max/Max2Babylon/Exporter/BabylonExporter.Material.cs b/3ds Max/Max2Babylon/Exporter/BabylonExporter.Material.cs
index 3db91fb8..06a747d9 100644
--- a/3ds Max/Max2Babylon/Exporter/BabylonExporter.Material.cs
+++ b/3ds Max/Max2Babylon/Exporter/BabylonExporter.Material.cs
@@ -45,7 +45,7 @@ protected ITexmap _getTexMapWithCache(IIGameMaterial materialNode, string name)
for (int i = 0; i < materialNode.MaxMaterial.NumSubTexmaps; i++)
{
// according to https://help.autodesk.com/view/MAXDEV/2022/ENU/?guid=Max_Developer_Help_what_s_new_whats_new_3dsmax_2022_sdk_localization_html
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 ||MAX2024
var mn = materialNode.MaxMaterial.GetSubTexmapSlotName(i, false); // Non localized, then en-US
#else
var mn = materialNode.MaxMaterial.GetSubTexmapSlotName(i); // en-US
@@ -83,7 +83,13 @@ protected ITexmap _getTexMap(IIGameMaterial materialNode, string name, bool cach
{
for (int i = 0; i < materialNode.MaxMaterial.NumSubTexmaps; i++)
{
+#if MAX2024
+ // 3dsMax2024+ introduced new localized flag
+ var slotName = materialNode.MaxMaterial.GetSubTexmapSlotName(i, false);
+#else
var slotName = materialNode.MaxMaterial.GetSubTexmapSlotName(i);
+#endif
+
// sometime the name of the material changed - plugin side effect with script material
// so give a second chance with lowercase to be more resilient
if (slotName == name || slotName == name.ToLower())
@@ -185,7 +191,12 @@ private void ExportMaterial(IIGameMaterial materialNode, BabylonScene babylonSce
Print(materialNode.IPropertyContainer, 2);
for (int i = 0; i < materialNode.MaxMaterial.NumSubTexmaps; i++)
{
+#if MAX2024
+ // 3dsMax2024+ introduced new localized flag
+ RaiseVerbose("Texture[" + i + "] is named '" + materialNode.MaxMaterial.GetSubTexmapSlotName(i, false) + "'", 2);
+#else
RaiseVerbose("Texture[" + i + "] is named '" + materialNode.MaxMaterial.GetSubTexmapSlotName(i) + "'", 2);
+#endif
}
}
#endregion
@@ -299,7 +310,7 @@ private void ExportMaterial(IIGameMaterial materialNode, BabylonScene babylonSce
{
ExportPbrSpecGlossMaterial(materialNode, babylonScene);
}
-#if MAX2023
+#if MAX2023 || MAX2024
else if (isGLTFMaterial(materialNode))
{
ExportGLTFMaterial(materialNode, babylonScene);
@@ -706,7 +717,7 @@ private void ExportPhysicalMaterial(IIGameMaterial materialNode, IIPropertyConta
babylonMaterial.occlusionTexture = ExportTexture(ambientOcclusionTexmap, babylonScene);
}
-#if MAX2023
+#if MAX2023 || MAX2024
var normalMapAmount = propertyContainer.GetFloatProperty("bump_map_amt");
#else
var normalMapAmount = propertyContainer.GetFloatProperty(91);
@@ -958,12 +969,24 @@ private void ExportArnoldMaterial(IIGameMaterial materialNode, IIPropertyContain
for (int i = 0; i < numOfTexMapSlots; i++)
{
- if (materialNode.MaxMaterial.GetSubTexmapSlotName(i) == "normal")
+
+#if MAX2024
+ // 3dsMax2024+ introduced new localized flag
+ if(materialNode.MaxMaterial.GetSubTexmapSlotName(i,false) == "normal")
+#else
+ if(materialNode.MaxMaterial.GetSubTexmapSlotName(i) == "normal")
+#endif
+
{
babylonMaterial.normalTexture = ExportPBRTexture(materialNode, i, babylonScene);
}
+#if MAX2024
+ // 3dsMax2024+ introduced new localized flag
+ else if (materialNode.MaxMaterial.GetSubTexmapSlotName(i,false) == "emission")
+#else
else if (materialNode.MaxMaterial.GetSubTexmapSlotName(i) == "emission")
+#endif
{
babylonMaterial.emissiveTexture = ExportPBRTexture(materialNode, i, babylonScene);
}
@@ -1149,7 +1172,7 @@ public IIGameMaterial isMaterialSupported(IIGameMaterial materialNode)
// Physical materials
if (isPhysicalMaterial(materialNode) || isPbrMetalRoughMaterial(materialNode) || isPbrSpecGlossMaterial(materialNode)
-#if MAX2023
+#if MAX2023 || MAX2024
|| isGLTFMaterial(materialNode)
#endif
)
@@ -1242,7 +1265,7 @@ private IIGameMaterial GetBakedMaterialFromShellMaterial(IIGameMaterial material
private void AddAiStandardSurfaceBabylonAttributes(string attributesContainer, BabylonPBRMetallicRoughnessMaterial babylonMaterial = null) => AddCustomAttributes(attributesContainer, MaterialScripts.AIBabylonCAtDef, "ARNOLD_MATERIAL_CAT_DEF");
private void AddCustomAttributes(string attributesContainer, string cmdCreateBabylonAttributes, string def) =>
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
ManagedServices.MaxscriptSDK.ExecuteMaxscriptCommand(MaterialScripts.AddCustomAttribute(cmdCreateBabylonAttributes, attributesContainer, def), ManagedServices.MaxscriptSDK.ScriptSource.NotSpecified);
#else
ManagedServices.MaxscriptSDK.ExecuteMaxscriptCommand(MaterialScripts.AddCustomAttribute(cmdCreateBabylonAttributes, attributesContainer, def));
diff --git a/3ds Max/Max2Babylon/Exporter/BabylonExporter.Mesh.cs b/3ds Max/Max2Babylon/Exporter/BabylonExporter.Mesh.cs
index 513cbcf7..410afcd1 100644
--- a/3ds Max/Max2Babylon/Exporter/BabylonExporter.Mesh.cs
+++ b/3ds Max/Max2Babylon/Exporter/BabylonExporter.Mesh.cs
@@ -96,7 +96,7 @@ private BabylonNode ExportMesh(IIGameScene scene, IIGameNode meshNode, BabylonSc
RaiseMessage(meshNode.Name, 1);
// Instances
-#if MAX2020 || MAX2021 || MAX2022 || MAX2023
+#if MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
var tabs = Loader.Global.INodeTab.Create();
#else
var tabs = Loader.Global.NodeTab.Create();
@@ -112,7 +112,7 @@ private BabylonNode ExportMesh(IIGameScene scene, IIGameNode meshNode, BabylonSc
// Check if this mesh has already been exported
for (int index = 0; index < tabs.Count; index++)
{
-#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021 || MAX2022 || MAX2023
+#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
var tab = tabs[index];
#else
var tab = tabs[new IntPtr(index)];
@@ -212,7 +212,7 @@ private BabylonNode ExportMasterMesh(IIGameScene scene, IIGameNode meshNode, Bab
}
// Misc.
-#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021 || MAX2022 || MAX2023
+#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
babylonMesh.isVisible = meshNode.MaxNode.Renderable;
babylonMesh.receiveShadows = meshNode.MaxNode.RcvShadows;
babylonMesh.applyFog = meshNode.MaxNode.ApplyAtmospherics;
@@ -373,7 +373,7 @@ private BabylonNode ExportMasterMesh(IIGameScene scene, IIGameNode meshNode, Bab
bool hasUV2 = false;
for (int i = 0; i < mappingChannels.Count; ++i)
{
-#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021 || MAX2022 || MAX2023
+#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
var channelNum = mappingChannels[i];
#else
var channelNum = mappingChannels[new IntPtr(i)];
@@ -655,7 +655,7 @@ private IEnumerable ExtractMorphTargetPoints(BabylonAbstractMesh babylo
// the needed function is not available on the .net SDK, then we have to use Max Script.
// TODO : use direct instance instead of manipulate string
var script = $"with printAllElements on (for k in 0 to (WM3_MC_NumMPts ${babylonAbstractMesh.name}.Morpher {morphIndex}) collect (WM3_MC_GetMorphPoint ${babylonAbstractMesh.name}.morpher {morphIndex} k)) as string";
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
var str = ManagedServices.MaxscriptSDK.ExecuteStringMaxscriptQuery(script, ManagedServices.MaxscriptSDK.ScriptSource.NotSpecified);
#else
var str = ManagedServices.MaxscriptSDK.ExecuteStringMaxscriptQuery(script);
@@ -949,7 +949,7 @@ private void ExtractGeometry(BabylonAbstractMesh babylonAbstractMesh, List GetNormalBump3DSMaxOperations(ITexmap texM
for (int i = 0; i != n; i++)
{
var tmp = custAtt.GetCustAttrib(i);
-#if MAX2022 || MAX2023
- if (tmp.ClassName(false) == MaterialCustomBabylonAttributeName)
+#if MAX2022 || MAX2023 || MAX2024
+ if(tmp.ClassName(false) == MaterialCustomBabylonAttributeName)
#else
if (tmp.ClassName == MaterialCustomBabylonAttributeName)
#endif
@@ -1119,8 +1119,8 @@ private ITexmap _exportFresnelParameters(ITexmap texMap, out BabylonFresnelParam
fresnelParameters = null;
// Fallout
-#if MAX2022 || MAX2023
- if (texMap.ClassName(false) == "Falloff") // This is the only way I found to detect it. This is crappy but it works
+#if MAX2022 || MAX2023 || MAX2024
+ if(texMap.ClassName(false) == "Falloff") // This is the only way I found to detect it. This is crappy but it works
#else
if (texMap.ClassName == "Falloff") // This is the only way I found to detect it. This is crappy but it works
#endif
@@ -1430,8 +1430,8 @@ private IBitmapTex _getMultiplyTexmap(ITexmap texMap, out float[] multiplyColor)
return null;
}
-#if MAX2022 || MAX2023
- if (texMap.ClassName(false) == "RGB Multiply")
+#if MAX2022 || MAX2023 || MAX2024
+ if(texMap.ClassName(false) == "RGB Multiply")
#else
if (texMap.ClassName == "RGB Multiply")
#endif
@@ -1528,7 +1528,11 @@ private ITexmap _getTexMap(IIGameMaterial materialNode, string name)
{
for (int i = 0; i < materialNode.MaxMaterial.NumSubTexmaps; i++)
{
- if (materialNode.MaxMaterial.GetSubTexmapSlotName(i) == name)
+#if MAX2024
+ if (materialNode.MaxMaterial.GetSubTexmapSlotName(i,false) == name)
+#else
+ if (materialNode.MaxMaterial.GetSubTexmapSlotName(i) == name)
+#endif
{
return _getTexMap(materialNode, i);
}
diff --git a/3ds Max/Max2Babylon/Exporter/BabylonExporter.WorldModifiers.cs b/3ds Max/Max2Babylon/Exporter/BabylonExporter.WorldModifiers.cs
index ffc34855..660f2a7e 100644
--- a/3ds Max/Max2Babylon/Exporter/BabylonExporter.WorldModifiers.cs
+++ b/3ds Max/Max2Babylon/Exporter/BabylonExporter.WorldModifiers.cs
@@ -20,9 +20,15 @@ private void ExportWorldModifiers(IIGameNode meshNode, BabylonScene babylonScene
foreach (var modifier in derivedObject.Modifiers)
{
// TODO - Find another way to detect if modifier is a HairAndFur
- if (modifier.Name == "Hair and Fur" || // English
- modifier.Name == "Haar und Fell" || // German
- modifier.Name == "Chevelure et Pelage") // French
+
+#if MAX2024
+ var modifierName = modifier.GetName(false);
+#else
+ var modifierName = modifier.Name;
+#endif
+ if (modifierName == "Hair and Fur" || // English
+ modifierName == "Haar und Fell" || // German
+ modifierName == "Chevelure et Pelage") // French
{
var babylonFurMaterial = ExportFurModifier(modifier, babylonMesh.name, babylonScene);
babylonScene.MaterialsList.Add(babylonFurMaterial);
@@ -30,7 +36,7 @@ private void ExportWorldModifiers(IIGameNode meshNode, BabylonScene babylonScene
}
else
{
- RaiseWarning("Modifier or Language '" + modifier.Name + "' is not supported", 2);
+ RaiseWarning("Modifier or Language '" + modifierName + "' is not supported", 2);
}
}
}
diff --git a/3ds Max/Max2Babylon/Exporter/BabylonExporter.cs b/3ds Max/Max2Babylon/Exporter/BabylonExporter.cs
index 79067879..ddd03576 100644
--- a/3ds Max/Max2Babylon/Exporter/BabylonExporter.cs
+++ b/3ds Max/Max2Babylon/Exporter/BabylonExporter.cs
@@ -137,7 +137,7 @@ public void BakeAnimationsFrame(IINode node,BakeAnimationType bakeAnimationType)
IINode hierachyRoot = (node != null) ? node : Loader.Core.RootNode;
-#if MAX2020 || MAX2021 || MAX2022 || MAX2023
+#if MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
var tobake = Loader.Global.INodeTab.Create();
#else
var tobake = Loader.Global.NodeTab.Create();
@@ -350,7 +350,9 @@ public void Export(MaxExportParameters exportParameters)
babylonScene.producer = new BabylonProducer
{
name = "3dsmax",
-#if MAX2023
+#if MAX2024
+ version = "2024",
+#elif MAX2023
version = "2023",
#elif MAX2022
version = "2022",
@@ -641,8 +643,8 @@ public void Export(MaxExportParameters exportParameters)
for (var index = 0; index < Loader.Core.NumAtmospheric; index++)
{
var atmospheric = Loader.Core.GetAtmospheric(index);
-#if MAX2022 || MAX2023
- if (atmospheric != null && atmospheric.Active(0) && atmospheric.ClassName(false) == "Fog")
+#if MAX2022 || MAX2023 || MAX2024
+ if(atmospheric != null && atmospheric.Active(0) && atmospheric.ClassName(false) == "Fog")
#else
if (atmospheric != null && atmospheric.Active(0) && atmospheric.ClassName == "Fog")
#endif
@@ -1099,10 +1101,10 @@ private static List TabToList(ITab tab)
List list = new List();
for (int i = 0; i < tab.Count; i++)
{
-#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021 || MAX2022 || MAX2023
+#if MAX2017 || MAX2018 || MAX2019 || MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
var item = tab[i];
#else
- var item = tab[new IntPtr(i)];
+ var item = tab[new IntPtr(i)];
#endif
list.Add(item);
}
diff --git a/3ds Max/Max2Babylon/GlobalUtility.cs b/3ds Max/Max2Babylon/GlobalUtility.cs
index 7af4f13d..ca624224 100644
--- a/3ds Max/Max2Babylon/GlobalUtility.cs
+++ b/3ds Max/Max2Babylon/GlobalUtility.cs
@@ -181,7 +181,7 @@ public override uint Start
idActionTable = (uint)actionManager.NumActionTables;
string actionTableName = "Babylon Actions";
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
actionTable = Loader.Global.ActionTable.Create(idActionTable, 0, actionTableName);
#else
actionTable = Loader.Global.ActionTable.Create(idActionTable, 0, ref actionTableName);
@@ -356,7 +356,7 @@ private void InstallMenus()
private void AddCallbacks()
{
foreach (var s in MaterialScripts.AddCallbacks())
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
ManagedServices.MaxscriptSDK.ExecuteMaxscriptCommand(s,ManagedServices.MaxscriptSDK.ScriptSource.NotSpecified);
#else
ManagedServices.MaxscriptSDK.ExecuteMaxscriptCommand(s);
diff --git a/3ds Max/Max2Babylon/Tools/LayerUtilities.cs b/3ds Max/Max2Babylon/Tools/LayerUtilities.cs
index 536ae726..4f5f0fa8 100644
--- a/3ds Max/Max2Babylon/Tools/LayerUtilities.cs
+++ b/3ds Max/Max2Babylon/Tools/LayerUtilities.cs
@@ -39,7 +39,7 @@ public static bool HaveNode(this List layers, IINode node)
public static bool HasNode(this IILayer layer,IINode node,bool checkInChild = true)
{
-#if MAX2020 || MAX2021 || MAX2022 || MAX2023
+#if MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
ITab nodes = Loader.Global.INodeTab.Create();
#else
ITab nodes = Loader.Global.INodeTabNS.Create();
@@ -106,7 +106,7 @@ public static IEnumerable LayerTree(this IILayer layer)
public static IEnumerable LayerNodes(this IILayer layer)
{
IILayerProperties layerProp = Loader.IIFPLayerManager.GetLayer(layer.Name);
-#if MAX2020 || MAX2021 || MAX2022 || MAX2023
+#if MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
ITab nodes = Loader.Global.INodeTab.Create();
#else
ITab nodes = Loader.Global.INodeTabNS.Create();
diff --git a/3ds Max/Max2Babylon/Tools/ScriptsUtilities.cs b/3ds Max/Max2Babylon/Tools/ScriptsUtilities.cs
index 75c3b216..adbab5f3 100644
--- a/3ds Max/Max2Babylon/Tools/ScriptsUtilities.cs
+++ b/3ds Max/Max2Babylon/Tools/ScriptsUtilities.cs
@@ -25,7 +25,7 @@ public static void ExecuteMaxScriptCommand(string maxScriptCmd)
{
if (!string.IsNullOrEmpty(maxScriptCmd))
{
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
ManagedServices.MaxscriptSDK.ExecuteMaxscriptCommand(maxScriptCmd, ManagedServices.MaxscriptSDK.ScriptSource.NotSpecified);
#else
ManagedServices.MaxscriptSDK.ExecuteMaxscriptCommand(maxScriptCmd);
diff --git a/3ds Max/Max2Babylon/Tools/Tools.cs b/3ds Max/Max2Babylon/Tools/Tools.cs
index 2ad36e1c..d3be74e9 100644
--- a/3ds Max/Max2Babylon/Tools/Tools.cs
+++ b/3ds Max/Max2Babylon/Tools/Tools.cs
@@ -190,7 +190,7 @@ public struct VersionNumber
public static VersionNumber GetMaxVersion()
{
// https://getcoreinterface.typepad.com/blog/2017/02/querying-the-3ds-max-version.html
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
var versionString = ManagedServices.MaxscriptSDK.ExecuteStringMaxscriptQuery("getFileVersion \"$max/3dsmax.exe\"", ManagedServices.MaxscriptSDK.ScriptSource.NotSpecified);
#else
var versionString = ManagedServices.MaxscriptSDK.ExecuteStringMaxscriptQuery("getFileVersion \"$max/3dsmax.exe\"");
@@ -317,7 +317,7 @@ public static float GetScaleFactorToMeters()
//public abstract void GetSystemUnitInfo(IntPtr type, IntPtr scale);
//public abstract double GetSystemUnitScale(int type);
-#if MAX2022 || MAX2023
+#if MAX2022 || MAX2023 || MAX2024
GlobalInterface.Instance.GetSystemUnitInfo(pType, pScale);
}
float masterScale = (float)Loader.Global.GetSystemUnitScale(unitType);
@@ -408,10 +408,18 @@ public static VNormal[] ComputeNormals(IMesh mesh, bool optimize)
for (var index = 0; index < mesh.NumFaces; index++)
{
+#if MAX2024
+ var face = mesh.GetFace(index);
+ Vector3 v0 = mesh.GetVert((int)face.V[0]).ToVector3();
+ Vector3 v1 = mesh.GetVert((int)face.V[1]).ToVector3();
+ Vector3 v2 = mesh.GetVert((int)face.V[2]).ToVector3();
+
+#else
var face = mesh.Faces[index];
Vector3 v0 = mesh.Verts[(int)face.V[0]].ToVector3();
Vector3 v1 = mesh.Verts[(int)face.V[1]].ToVector3();
Vector3 v2 = mesh.Verts[(int)face.V[2]].ToVector3();
+# endif
fnorms[index] = Vector3.Cross((v1 - v0), (v2 - v1));
@@ -854,7 +862,7 @@ public static IINode FlattenHierarchy(this IINode node)
IPolyObject polyObject = result.GetPolyObjectFromNode();
IEPoly nodeEPoly = (IEPoly)polyObject.GetInterface(Loader.EditablePoly);
-#if MAX2020 || MAX2021 || MAX2022 || MAX2023
+#if MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
IINodeTab toflatten = Loader.Global.INodeTab.Create();
IINodeTab resultTarget = Loader.Global.INodeTab.Create();
#else
@@ -926,7 +934,7 @@ public static void UnloadAllContainers()
public static bool IsNodeSelected(this IINode node)
{
-#if MAX2020 || MAX2021 || MAX2022 || MAX2023
+#if MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
IINodeTab selection = Loader.Global.INodeTab.Create();
#else
IINodeTab selection = Loader.Global.INodeTabNS.Create();
@@ -976,7 +984,7 @@ public static IIContainerObject GetContainer(this IList handles)
public static List GetContainerInSelection()
{
-#if MAX2020 || MAX2021 || MAX2022 || MAX2023
+#if MAX2020 || MAX2021 || MAX2022 || MAX2023 || MAX2024
IINodeTab selection = Loader.Global.INodeTab.Create();
#else
IINodeTab selection = Loader.Global.INodeTabNS.Create();