// =========================================================================== // Copyright 2018 Autodesk, Inc. All rights reserved. // // Use of this software is subject to the terms of the Autodesk license // agreement provided at the time of installation or download, or which // otherwise accompanies this software in either electronic or hard copy form. // =========================================================================== // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Functions defined in this file (gameFbxExporterModel.mel): // // global proc gameExp_ModelLayoutOrder(string $formLayout) // global proc string gameExp_CreateGeometryUIComponents() // global proc string gameExp_CreateModelSettings() // global proc gameExp_ModelFileModeChanged(int $index) // global proc gameExp_RememberSceneState() // global proc gameExp_RestoreSceneState() // global proc gameExp_MoveToOriginOneRoot(float $originalT[], float $originalR[], string $root) // global proc gameExp_MoveBackFromOriginOneRoot(float $origT[], float $origR[], string $root) // global proc gameExp_MoveToOrigin(float $originalT[], float $originalR[], string $roots[]) // global proc gameExp_MoveBackFromOrigin(float $originalT[], float $originalR[], string $roots[]) // global proc gameExp_isTranslationRotationLocked(string $obj) // // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Attach in a specific order the model sub form layout // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- global proc gameExp_ModelLayoutOrder(string $formLayout) { string $geometryForm = gameExp_CreateGeometryUIComponents(); string $settingsForm = gameExp_CreateModelSettings(); string $pathForm = gameExp_CreatePathUIComponents(); formLayout -edit -attachForm $geometryForm "top" 0 -attachForm $geometryForm "left" 0 -attachForm $geometryForm "right" 0 -attachControl $settingsForm "top" 0 $geometryForm -attachForm $settingsForm "left" 0 -attachForm $settingsForm "right" 0 -attachForm $pathForm "left" 0 -attachForm $pathForm "right" 0 -attachForm $pathForm "bottom" 0 $formLayout; setParent ..; } // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Create the Model Geometry UI Components // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- global proc string gameExp_CreateGeometryUIComponents() { global string $gGameFbxExporterCurrentNode; string $form = `formLayout`; frameLayout -label (getPluginResource( "gameFbxExporter", "kGameExporterGeometryLayout" )) -collapse 0 -collapsable 1 gameFbxExporterGeometryFrameLayout; string $subForm = `formLayout`; checkBoxGrp -label (getPluginResource( "gameFbxExporter", "kGameExporterSmoothingGroup" )) -annotation (getPluginResource( "gameFbxExporter","kGameExporterAnnSmoothingGroups")) gameFbxExporterSmoothingGroups; checkBoxGrp -label (getPluginResource( "gameFbxExporter", "kGameExporterSmoothMesh" )) -annotation (getPluginResource( "gameFbxExporter","kGameExporterAnnSmoothMesh")) gameFbxExporterSmoothMesh; checkBoxGrp -label (getPluginResource( "gameFbxExporter", "kGameExporterSplitVertexNormals" )) -annotation (getPluginResource( "gameFbxExporter", "kGameExporterAnnSplitVertexNormals" )) gameFbxExporterSplitVertexNormals; checkBoxGrp -columnWidth 1 75 -label (getPluginResource( "gameFbxExporter", "kGameExporterTriangulate" )) -annotation (getPluginResource( "gameFbxExporter", "kGameExporterAnnTriangulate" )) gameFbxExporterTriangulate; checkBoxGrp -columnWidth 1 75 -columnAttach 1 "right" 4 -label (getPluginResource( "gameFbxExporter", "kGameExporterTangentBiNormals" )) -annotation (getPluginResource( "gameFbxExporter", "kGameExporterAnnTangentBiNormals" )) gameFbxExporterTangentsBinormals; separator sep_1; checkBoxGrp -label (getPluginResource( "gameFbxExporter", "kGameExporterSkinning" )) -annotation (getPluginResource( "gameFbxExporter", "kGameExporterAnnSkinning" )) gameFbxExporterSkinning; checkBoxGrp -columnWidth 1 70 -label (getPluginResource( "gameFbxExporter", "kGameExporterBlendshapes" )) -annotation (getPluginResource( "gameFbxExporter", "kGameExporterAnnBlendshapes" )) gameFbxExporterBlendshapes; setParent ..; if( size($gGameFbxExporterCurrentNode) ) { connectControl -preventContextualMenu true -index 2 gameFbxExporterSmoothingGroups ($gGameFbxExporterCurrentNode + ".smoothingGroups"); connectControl -preventContextualMenu true -index 2 gameFbxExporterSmoothMesh ($gGameFbxExporterCurrentNode + ".smoothMesh"); connectControl -preventContextualMenu true -index 2 gameFbxExporterSplitVertexNormals ($gGameFbxExporterCurrentNode + ".splitVertexNormals"); connectControl -preventContextualMenu true -index 2 gameFbxExporterTriangulate ($gGameFbxExporterCurrentNode + ".triangulate"); connectControl -preventContextualMenu true -index 2 gameFbxExporterTangentsBinormals ($gGameFbxExporterCurrentNode + ".tangentsBinormals"); connectControl -preventContextualMenu true -index 2 gameFbxExporterSkinning ($gGameFbxExporterCurrentNode + ".skinning"); connectControl -preventContextualMenu true -index 2 gameFbxExporterBlendshapes ($gGameFbxExporterCurrentNode + ".blendshapes"); } formLayout -edit -attachForm gameFbxExporterSmoothingGroups "top" 8 -attachForm gameFbxExporterSmoothingGroups "left" -20 -attachForm gameFbxExporterTriangulate "top" 8 -attachForm gameFbxExporterTriangulate "right" 10 -attachControl gameFbxExporterSmoothMesh "top" 0 gameFbxExporterTriangulate -attachForm gameFbxExporterSmoothMesh "left" -20 -attachControl gameFbxExporterTangentsBinormals "top" 3 gameFbxExporterTriangulate -attachForm gameFbxExporterTangentsBinormals "right" 10 -attachControl gameFbxExporterSplitVertexNormals "top" 0 gameFbxExporterSmoothMesh -attachForm gameFbxExporterSplitVertexNormals "left" -20 -attachControl sep_1 "top" 1 gameFbxExporterSplitVertexNormals -attachForm sep_1 "left" 0 -attachForm sep_1 "right" 0 -attachControl gameFbxExporterSkinning "top" 1 sep_1 -attachForm gameFbxExporterSkinning "left" -20 -attachForm gameFbxExporterSkinning "bottom" 5 -attachControl gameFbxExporterBlendshapes "top" 1 sep_1 -attachForm gameFbxExporterBlendshapes "right" 10 -attachForm gameFbxExporterBlendshapes "bottom" 5 $subForm; setParent ..; formLayout -edit -attachForm gameFbxExporterGeometryFrameLayout "top" 0 -attachForm gameFbxExporterGeometryFrameLayout "left" 0 -attachForm gameFbxExporterGeometryFrameLayout "right" 0 -attachForm gameFbxExporterGeometryFrameLayout "bottom" 0 $form; setParent ..; return $form; } // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Create the Settings // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- global proc string gameExp_CreateModelSettings() { global string $gGameFbxExporterCurrentNode; global int $gGameExporterSettingsCollapse; string $form = `formLayout`; frameLayout -label (getPluginResource( "gameFbxExporter", "kGameExporterSettings" )) -collapse $gGameExporterSettingsCollapse -collapsable 1 -collapseCommand "$gGameExporterSettingsCollapse = 1" -expandCommand "$gGameExporterSettingsCollapse = 0" gameExporterSettings; string $subForm = `formLayout`; string $gameExporterAnimation = gameExp_GetPrefixedName("gameExporterAnimation"); checkBoxGrp -label (getPluginResource( "gameFbxExporter", "kGameExporterAnimation" )) -columnWidth 1 75 -annotation (getPluginResource( "gameFbxExporter","kGameExporterAnnAnimation")) $gameExporterAnimation; string $gameExporterInputConnections = gameExp_GetPrefixedName("gameExporterInputConnections"); checkBoxGrp -label (getPluginResource( "gameFbxExporter", "kGameExporterInputConnections" )) -annotation (getPluginResource( "gameFbxExporter","kGameExporterAnnInputConnections")) $gameExporterInputConnections; checkBoxGrp -e -columnWidth 1 100 $gameExporterInputConnections; string $sep_1 = `separator -height 10`; text -label (getPluginResource( "gameFbxExporter", "kGameExporterUpAxis" )) -annotation (getPluginResource( "gameFbxExporter", "kGameExporterAnnUpAxis" )) gameExporterUpAxisLabel; string $gameExporterUpAxis = gameExp_GetPrefixedName("gameExporterUpAxis"); optionMenu $gameExporterUpAxis; menuItem -label (getPluginResource( "gameFbxExporter", "kGameExporterUpAxisY" )); menuItem -label (getPluginResource( "gameFbxExporter", "kGameExporterUpAxisZ" )); string $gameExporterEmbedMedia = gameExp_GetPrefixedName("gameExporterEmbedMedia"); checkBoxGrp -columnWidth 1 90 -label (getPluginResource( "gameFbxExporter", "kGameExporterEmbedMedia" )) -annotation (getPluginResource( "gameFbxExporter","kGameExporterAnnEmbedMedia")) $gameExporterEmbedMedia; separator -height 10 sep_3; gameExp_CreateFileFormatComponents(); string $gameExporterFileTypeLabel = gameExp_GetPrefixedName("gameExporterFileTypeLabel"); string $gameExporterFileType = gameExp_GetPrefixedName("gameExporterFileType"); string $gameExporterFBXVersionLabel = gameExp_GetPrefixedName("gameExporterFBXVersionLabel"); string $gameExporterFBXVersion = gameExp_GetPrefixedName("gameExporterFBXVersion"); separator -height 2 -visible false sep_4; gameExp_CreateAdvanceSettingsGearButton(); string $gameExporterAdvanceSettings = gameExp_GetPrefixedName("gameExporterAdvanceSettings"); string $sep_2 = `separator -height 10`; string $gameExporterModelFileMode = gameExp_GetPrefixedName("gameExporterModelFileMode"); optionMenu -width 10 -annotation (getPluginResource( "gameFbxExporter", "kGameExporterAnnModelFileMode")) $gameExporterModelFileMode; menuItem -label (getPluginResource( "gameFbxExporter", "kGameExporterSingleFile" )) -annotation (getPluginResource( "gameFbxExporter", "kGameExporterAnnSingleFile")); menuItem -label (getPluginResource( "gameFbxExporter", "kGameExporterObjectsToMultipleFiles" )) -annotation (getPluginResource( "gameFbxExporter", "kGameExporterAnnObjectsToMultipleFiles")); string $gameExporterMoveToOrigin = gameExp_GetPrefixedName("gameExporterMoveToOrigin"); checkBoxGrp -columnWidth 1 85 -label (getPluginResource( "gameFbxExporter", "kGameExporterMoveToOrigin" )) -annotation (getPluginResource( "gameFbxExporter","kGameExporterAnnMoveToOrigin")) $gameExporterMoveToOrigin; if( size($gGameFbxExporterCurrentNode) ) { connectControl -preventContextualMenu true -index 2 $gameExporterAnimation ($gGameFbxExporterCurrentNode + ".exportAnimation"); connectControl -preventContextualMenu true -index 2 $gameExporterInputConnections ($gGameFbxExporterCurrentNode + ".inputConnections"); // Disable Input Connection when Export All. int $enableInputConn = (getAttr($gGameFbxExporterCurrentNode + ".exportSetIndex") != 1); checkBoxGrp -edit -enable $enableInputConn $gameExporterInputConnections; // Set UI Components value with node attributes optionMenu -edit -select `getAttr($gGameFbxExporterCurrentNode + ".upAxis")` -changeCommand ("setAttr(\"" + $gGameFbxExporterCurrentNode + ".upAxis\") `optionMenu -q -select " + $gameExporterUpAxis + "`") $gameExporterUpAxis; connectControl -preventContextualMenu true -index 2 $gameExporterEmbedMedia ($gGameFbxExporterCurrentNode + ".embedMedia"); optionMenu -edit -select `getAttr($gGameFbxExporterCurrentNode + ".modelFileMode")` -changeCommand ("gameExp_ModelFileModeChanged `optionMenu -q -select " + $gameExporterModelFileMode + "`") $gameExporterModelFileMode; connectControl -preventContextualMenu true -index 2 $gameExporterMoveToOrigin ($gGameFbxExporterCurrentNode + ".moveToOrigin"); } string $sep_over_upaxis = $sep_1; formLayout -edit -attachForm $gameExporterModelFileMode "top" 5 -attachForm $gameExporterModelFileMode "left" 10 -attachForm $gameExporterModelFileMode "right" 15 -attachControl $gameExporterMoveToOrigin "top" 5 $gameExporterModelFileMode -attachForm $gameExporterMoveToOrigin "left" 10 -attachControl $sep_1 "top" 0 $gameExporterMoveToOrigin -attachForm $sep_1 "left" 0 -attachForm $sep_1 "right" 0 -attachControl $gameExporterAnimation "top" 0 $sep_1 -attachForm $gameExporterAnimation "left" 20 -attachControl $gameExporterInputConnections "top" 0 $sep_1 -attachForm $gameExporterInputConnections "right" 10 -attachControl $sep_2 "top" 0 $gameExporterAnimation -attachForm $sep_2 "left" 0 -attachForm $sep_2 "right" 0 $subForm; $sep_over_upaxis = $sep_2; formLayout -edit -attachControl gameExporterUpAxisLabel "top" 0 $sep_over_upaxis -attachForm gameExporterUpAxisLabel "left" 44 -attachControl $gameExporterUpAxis "top" 0 $sep_over_upaxis -attachControl $gameExporterUpAxis "left" 3 gameExporterUpAxisLabel -attachControl $gameExporterEmbedMedia "top" 0 $sep_over_upaxis -attachForm $gameExporterEmbedMedia "right" 10 -attachControl sep_3 "top" 0 $gameExporterUpAxis -attachForm sep_3 "left" 0 -attachForm sep_3 "right" 0 -attachControl $gameExporterAdvanceSettings "top" 1 sep_3 -attachForm $gameExporterAdvanceSettings "right" 6 -attachControl $gameExporterFileTypeLabel "top" 1 sep_3 -attachForm $gameExporterFileTypeLabel "left" 10 -attachControl $gameExporterFileType "top" 0 sep_3 -attachControl $gameExporterFileType "left" 3 $gameExporterFileTypeLabel -attachControl $gameExporterFileType "right" 50 $gameExporterAdvanceSettings -attachControl sep_4 "top" 1 $gameExporterFileType -attachForm sep_4 "left" 0 -attachForm sep_4 "right" 0 -attachControl $gameExporterFBXVersionLabel "top" 1 sep_4 -attachForm $gameExporterFBXVersionLabel "left" 10 -attachControl $gameExporterFBXVersion "top" 0 sep_4 -attachControl $gameExporterFBXVersion "left" 3 $gameExporterFBXVersionLabel -attachControl $gameExporterFBXVersion "right" 50 $gameExporterAdvanceSettings $subForm; setParent ..; setParent ..; formLayout -edit -attachForm gameExporterSettings "top" 0 -attachForm gameExporterSettings "left" 0 -attachForm gameExporterSettings "right" 0 -attachForm gameExporterSettings "bottom" 0 $form; setParent ..; return $form; } // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Model File Mode changed, update corresponding components. // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- global proc gameExp_ModelFileModeChanged(int $index) { global string $gGameFbxExporterCurrentNode; setAttr($gGameFbxExporterCurrentNode + ".modelFileMode") $index; string $gameExporterExportFilename = gameExp_GetPrefixedName("gameExporterExportFilename"); string $placeholder = $index == 2 ? (getPluginResource( "gameFbxExporter", "kGameExporterPlaceholderModelFilePrefix" )) : (getPluginResource( "gameFbxExporter", "kGameExporterPlaceholderFileName" )); textField -e -placeholderText $placeholder $gameExporterExportFilename; // generate the filename preview from the prefix/filename stored in the // gGameFbxExporterCurrentNode gameExp_CreateFilenamePreview(); } // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Remember current "modified" state of the scene // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- global proc gameExp_RememberSceneState() { global int $gSceneModifiedState; // if we have not queried the scene state yet, let's do it now if ($gSceneModifiedState == -1) { $gSceneModifiedState = `file -q -modified`; } } // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Restore the scene to the remembered "modified" state // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- global proc gameExp_RestoreSceneState() { global int $gSceneModifiedState; // the scene state before we moved to origin was unmodified // let's force it back now if ($gSceneModifiedState == 0) { file -modified false; } // set the global variable to its unset state for next export call $gSceneModifiedState = -1; } global proc gameExp_MoveToOriginOneRoot(float $originalT[], float $originalR[], string $root) { // remember the current scene modified state gameExp_RememberSceneState(); // Move one root to origin. Actually, move the pivot to origin. And set the rotation to 0. string $attr_t = $root+".t"; string $attr_r = $root+".r"; string $attr_pivot = $root+".rotatePivot"; float $origT[] = `getAttr $attr_t`; float $origR[] = `getAttr $attr_r`; float $origPivot[] = `getAttr $attr_pivot`; // Remember the original positions int $i; for ($i = 0; $i < 3; $i++) { $originalT[size($originalT)] = $origT[$i]; $originalR[size($originalR)] = $origR[$i]; } // Translate pivot to origin; Reset rotation to 0. float $newTX = 0.0 - $origPivot[0]; float $newTY = 0.0 - $origPivot[1]; float $newTZ = 0.0 - $origPivot[2]; setAttr $attr_t $newTX $newTY $newTZ; setAttr $attr_r 0.0 0.0 0.0; } global proc gameExp_MoveBackFromOriginOneRoot(float $origT[], float $origR[], string $root) { // Move back one root after export. Move the root back to its original translation, and move the rotation back to its initial value. string $attr_t = $root+".t"; string $attr_r = $root+".r"; setAttr $attr_t $origT[0] $origT[1] $origT[2]; setAttr $attr_r $origR[0] $origR[1] $origR[2]; // Restore the scene to the remembered "modified" state gameExp_RestoreSceneState(); } global proc gameExp_MoveToOrigin(float $originalT[], float $originalR[], string $roots[]) { // Move multiple roots to origin. clear $originalT; clear $originalR; int $i; for ($i = 0; $i < size($roots); $i++) { string $root = $roots[$i]; gameExp_MoveToOriginOneRoot($originalT, $originalR, $root); } } global proc gameExp_MoveBackFromOrigin(float $originalT[], float $originalR[], string $roots[]) { // Move back multiple roots from origin after export. int $i; for ($i = 0; $i < size($roots); $i++) { float $origT[] = { $originalT[3*$i], $originalT[3*$i+1], $originalT[3*$i+2] }; float $origR[] = { $originalR[3*$i], $originalR[3*$i+1], $originalR[3*$i+2] }; gameExp_MoveBackFromOriginOneRoot($origT, $origR, $roots[$i]); } } // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Validate if the translation and rotation is locked. // If locked, trigger an error // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- global proc gameExp_isTranslationRotationLocked(string $obj) { string $lockedAttr = getPluginResource( "gameFbxExporter", "kGameExporterTranslationRotationLocked" ); // Cannot use Mote To Origin on locked transform and/or rotation attribute int $translateXLocked = size(`listAttr -locked ($obj + ".translateX")`); int $translateYLocked = size(`listAttr -locked ($obj + ".translateY")`); int $translateZLocked = size(`listAttr -locked ($obj + ".translateZ")`); int $rotateXLocked = size(`listAttr -locked ($obj + ".rotateX")`); int $rotateYLocked = size(`listAttr -locked ($obj + ".rotateY")`); int $rotateZLocked = size(`listAttr -locked ($obj + ".rotateZ")`); if($translateXLocked || $translateYLocked || $translateZLocked || $rotateXLocked || $rotateYLocked || $rotateZLocked) { string $error = `format -s $obj $lockedAttr`; gameExp_ShowMessage($error, 3); error -noContext $error; } }