You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Tools/maya/script/cryAnim.mel

1082 lines
29 KiB
Plaintext

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
////////////////////////////////////////////////////////////////////
//
// CryAnim.mel
//
// Libraries for exporting animation for the cry exporter
//
//////////////////////////////////////////////////////////////////////
python( "import mayaAnimUtilities as mau" );
// keeping track of the last folder
global string $cryAnimArrangeLastPath = "";
//obsolete
global proc cryAnimZeroJointRotation()
{
string $response = `confirmDialog -title "Lumberyard Animation" -message ("This will try to remove any rotation and set the joint-orientation to\nzero on the selected joints by pushing it down to the joints children.") -button "OK" -button "Cancel"`;
if( $response != "OK" )
{
return;
}
string $selected[] = `ls -sl`;
if( size($selected) == 0 )
{
confirmDialog -title "Lumberyard Animation" -message ("No nodes are selected.") -button "OK";
return;
}
string $tempGroup = `group -empty -name "cryAnimTempGroup"`;
for( $node in $selected )
{
if( `objectType $node` == "joint" )
{
string $children[];
// Unparent all children
$children = `listRelatives -children -fullPath $node`;
for ($child in $children)
{
parent $child $tempGroup;
}
// Make sure the attributes are unlocked and set the rotation and joint orientation to 0
setAttr -lock off ($node+".rotateX");
setAttr -lock off ($node+".rotateY");
setAttr -lock off ($node+".rotateZ");
setAttr -lock off ($node+".jointOrientX");
setAttr -lock off ($node+".jointOrientY");
setAttr -lock off ($node+".jointOrientZ");
setAttr ($node+".rotateX") 0;
setAttr ($node+".rotateY") 0;
setAttr ($node+".rotateZ") 0;
setAttr ($node+".jointOrientX") 0;
setAttr ($node+".jointOrientY") 0;
setAttr ($node+".jointOrientZ") 0;
// Re-parent the children
$children = `listRelatives -children -fullPath $tempGroup`;
for ($child in $children)
{
parent $child $node;
}
}
else
{
confirmDialog -title "Lumberyard Animation" -message ("Node `"+$node+"` is not a joint.") -button "OK";
}
}
delete $tempGroup;
select $selected;
}
/////////////////////////////////////////////////////////////////////////
// These save and load functions need to be merged into a setting system
// of some sort thats sharded with the export window etc.
/////////////////////////////////////////////////////////////////////////
// Load from the AnimRanges field in the settings node
global proc cryAnimManagerLoadSettings()
{
if( `control -exists CRYANIMMANAGER_ANIMRANGES` )
{
textScrollList -e -removeAll CRYANIMMANAGER_ANIMRANGES;
string $rangesString = `cryAnimLoadRangesString`;
string $tokens[];
$numTokens = `tokenize $rangesString "," $tokens`;
if( $numTokens != 0 )
{
for( $i = 0;$i<$numTokens;$i++ )
{
if( size($tokens[$i]) > 0 )
{
textScrollList -e -append $tokens[$i] CRYANIMMANAGER_ANIMRANGES;
}
}
}
}
}
// Save to the AnimRanges field in the settings node
global proc cryAnimManagerSaveSettings()
{
string $rangesString = "";
string $animRanges[];
$animRanges = `textScrollList -q -allItems CRYANIMMANAGER_ANIMRANGES`;
for( $i = 0;$i<size($animRanges);$i++ )
{
if( $i > 0 ) $rangesString += ",";
$rangesString += $animRanges[$i];
}
cryAnimSaveRangesString $rangesString;
}
global proc animManagerAddAnimRangeCloseWindow()
{
deleteUI -window CRYANIMMANAGER_ADDRANGEWINDOW;
}
proc int animManagerAnimRangeValidate( int $editEntry, string $name, int $start, int $end, string $rootNode, string $path )
{
int $editIndex = $editEntry;
int $rangeCount = `cryAnimGetNumRanges`;
string $animRanges[] = `cryAnimGetRanges`;
// Make sure there is not a range with the same name already in the list
for( $i = 0;$i<$rangeCount;$i++ )
{
string $decode[];
//bypassing c++ code
//$decode = `cryExportDecodeRangeString $animRanges[$i]`;
$decode = python("mau.AMZN_DecodeAnimRangeString(\"" + $animRanges[$i] + "\")");
if( size($decode) >= 5 )
{
if(( `strcmp $decode[2] $name` == 0 )&&(`strcmp $decode[4] $path` == 0))
{
if( $i != $editIndex )
{
confirmDialog -title "Anim Range" -message "A range with that name already exists." -button "Ok";
return 0;
}
}
}
}
// Make sure the root node is valid
if( `size($rootNode)` != 0 )
{
string $rootNodes[];
$numRoots = `tokenize $rootNode ";" $rootNodes`;
for( $root in $rootNodes )
{
$foundRoots = `ls $root`;
if( `size($foundRoots)` == 0 )
{
confirmDialog -title "Anim Range" -message "The root node could not be found." -button "Ok";
return 0;
}
else if( `size($foundRoots)` > 1 )
{
confirmDialog -title "Anim Range" -message "Root node name matches more than one node." -button "Ok";
return 0;
}
else
{
string $tokens[];
$numTokens = `tokenize $root "|" $tokens`;
string $nodeNameLC = `tolower $tokens[$numTokens-1]`;
string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix();
if( `objectType -isType "joint" $root` == 0 && `startsWith $nodeNameLC $lumberyardExportNodePrefix` == 0 )
{
confirmDialog -title "Anim Range" -message "The root node needs to be a joint or a `LumberyardExportNode`." -button "Ok";
return 0;
}
}
}
}
return 1;
}
global proc addAnimRangeUseCurrent()
{
setMinMaxPlayback ADDRANGE_START ADDRANGE_END;
string $lumberyardExportNodes[];
$lumberyardExportNodes = `cryMayaSupportPlugin gatherExportNodes selectedOnly`;
if ( size($lumberyardExportNodes) == 1 )
{
string $tokens[];
$numTokens = `tokenize $lumberyardExportNodes[0] "_" $tokens`;
if ( $numTokens > 1 )
{
textField -e -text $tokens[1] ADDRANGE_NAME;
}
}
}
global proc string GetRootJointForSelection(string $defaultRootJoint)
{
string $rootJointString = $defaultRootJoint;
string $selected[];
$selected = `ls -sl -l`;
if( `size($selected)` > 0 )
{
int $selectedCount = size($selected);
$rootJointString = "";
for( $i = 0; $i < $selectedCount; $i++ )
{
string $rootJoint = $selected[$i];
string $tokens[];
$numTokens = `tokenize $rootJoint "|" $tokens`;
string $nodeNameLC = `tolower $tokens[$numTokens-1]`;
string $rootJointStrip = $rootJoint;
if( `startsWith $rootJoint "|"` ) // Remove the leading `|`
{
$length = size($rootJoint);
$rootJointStrip = `substring $rootJoint 2 $length`;
}
string $lumberyardExportNodePrefix = LumberyardGetExportNodeNamePrefix();
if( `objectType -isType "joint" $rootJoint` || `startsWith $nodeNameLC $lumberyardExportNodePrefix`)
{
if( $i > 0 )
{
$rootJointString += (";");
}
$rootJointString += $rootJointStrip;
}
}
}
return $rootJointString;
}
global proc selectAnimRangeRoot()
{
string $rootNodeString = `textField -query -text ADDRANGE_ROOTNODE`;
$rootNodeString = `GetRootJointForSelection $rootNodeString`;
textField -e -text $rootNodeString ADDRANGE_ROOTNODE;
}
//////////////////////////////
//
// ui function
//
//////////////////////////////
global proc animManagerAddAnimRangeAdd( int $editEntry )
{
string $name = strip(`textField -q -text ADDRANGE_NAME`);
int $start = `floatField -q -value ADDRANGE_START`;
int $end = `floatField -q -value ADDRANGE_END`;
string $root = `textField -q -text ADDRANGE_ROOTNODE`;
string $path = `textField -q -text ADDRANGE_PATH`;
if( size($name) == 0 )
$name = "noName";
string $currentLayerSettings = `textField -q -text ADDRANGE_ADDLAYERINFO`;
if( `animManagerAnimRangeValidate $editEntry $name $start $end $root $path` )
{
string $rangeString = `cryAnimFormatRangeString $start $end $name $root $path $currentLayerSettings`;
if( $editEntry >= 0 )
{
cryAnimReplaceRange $editEntry $rangeString;
}
else
{
cryAnimAddRange $rangeString;
}
animManagerAddAnimRangeCloseWindow;
cryAnimManagerLoadSettings;
cryAnimPopulateRangeList;
cryExportUpdateExportLists;
}
}
global proc cryAnimManagerSetAnimLayerInfo()
{
string $layers = cryReturnActiveAnimLayers();
textField -e -text $layers ADDRANGE_ADDLAYERINFO;
}
global proc cryAnimManagerClearAnimLayerInfo()
{
textField -e -text "" ADDRANGE_ADDLAYERINFO;
}
//////////////////////////////
//
// ui function
//
//////////////////////////////
global proc cryAnimManagerSetPathText()
{
global string $cryAnimArrangeLastPath;
string $folderPath = `textField -q -text ADDRANGE_PATH`;
$folderPath = `cryExportFixupPath $folderPath`;
// do not save empty paths e.g. if the user cancels
$cryAnimArrangeLastPath = $folderPath;
textField -e -text $folderPath ADDRANGE_PATH;
}
// parameter name: $editEntry
// value range: >= -1
// -1: when the function is called for "New" an animation range item;
// >= 0: when the function is called for "Edit" an existed animation range item,
// the value is the id of the item in the list.
// It is used for retrieving the animation range item from the list for editing
// its folder path.
global proc cryAnimManagerBrowseForFolder( int $editEntry )
{
global string $cryAnimArrangeLastPath;
// if this is the first time we browse for folder,
// start at the path that the scene file is located
if ($cryAnimArrangeLastPath == "")
{
$cryAnimArrangeLastPath = `file -q -sceneName`;
$cryAnimArrangeLastPath = `dirname $cryAnimArrangeLastPath`;
}
string $startingFolder = $cryAnimArrangeLastPath;
int $numRanges = `cryAnimGetNumRanges`;
string $ranges[] = `cryAnimGetRanges`;
// get the previously assigned path of a specific animation item,
// if it's not in "NEW" mode (which will take -1 as $editEntry)
if( $editEntry != -1 && $numRanges > 0 )
{
string $editText = $ranges[$editEntry];
string $decode[];
//bypassing C++ code
//$decode = `cryExportDecodeRangeString $editText`;
$decode = python("mau.AMZN_DecodeAnimRangeString(\"" + $editText + "\")");
if( size($decode) >= 5 )
{
string $animPath = $decode[4];
$startingFolder = `cryExportFixupPath $animPath`;
$cryAnimArrangeLastPath = $startingFolder;
}
}
string $absPath = `cryExportRelativeToAbsolutePath $startingFolder`;
string $result[] = `fileDialog2 -fileMode 3 -startingDirectory $absPath -fileFilter ("Directories only (*)")`;
if( size($result) == 1 )
{
textField -e -text $result[0] ADDRANGE_PATH;
cryAnimManagerSetPathText();
}
}
//////////////////////////////
//
// ui function
//
//////////////////////////////
global proc cryAnimManagerEditAnimRangeWin( int $mode, int $editEntry )
{
if( $mode == 0 || $mode == 1 )
{
if(!`window -ex CRYANIMMANAGER_ADDRANGEWINDOW`)
{
if(`windowPref -exists CRYANIMMANAGER_ADDRANGEWINDOW`)
{
windowPref -wh 473 210 -tlc `windowPref -q -topEdge CRYANIMMANAGER_ADDRANGEWINDOW` `windowPref -q -leftEdge CRYANIMMANAGER_ADDRANGEWINDOW` CRYANIMMANAGER_ADDRANGEWINDOW;
}
window -titleBar true -title "Add Anim Range" -widthHeight 460 210 -sizeable false -mnb false -mxb false CRYANIMMANAGER_ADDRANGEWINDOW;
$layout1 = `formLayout -numberOfDivisions 100`;
$collayout = `columnLayout -rowSpacing 5 -adjustableColumn true`;
button -label "Use Range From Time Slider" -command ("addAnimRangeUseCurrent");
$rcLayout = `rowColumnLayout -numberOfColumns 4 -columnAttach 1 "right" 0 -columnWidth 1 110 -columnWidth 2 200 -columnWidth 3 70 -columnWidth 4 70
-columnSpacing 2 5 -columnSpacing 3 5`;
{
text -label "Name";
textField -text "New" ADDRANGE_NAME;
text -label "";
text -label "";
text -label "Start Frame";
float $animStartTime = `playbackOptions -q -ast`;
floatField -precision 0 -step 1 -value $animStartTime ADDRANGE_START;
text -label "";
text -label "";
text -label "End Frame";
float $animEndTime = `playbackOptions -q -aet`;
floatField -precision 0 -step 1 -value $animEndTime ADDRANGE_END;
text -label "";
text -label "";
text -label "Root";
textField -text "" ADDRANGE_ROOTNODE;
$rootButton = `button -label "Select" -command ("selectAnimRangeRoot")`;
text -label "";
text -label "Path";
global string $cryAnimArrangeLastPath;
textField -text $cryAnimArrangeLastPath -changeCommand("cryAnimManagerSetPathText ") ADDRANGE_PATH; // use the last browsed path as the default path for a new animation range item
button -label "Browse" -command ("cryAnimManagerBrowseForFolder "+$editEntry);
text -label "";
text -label "Anim Layer Commands";
textField -text "" ADDRANGE_ADDLAYERINFO;
button -label "Set" -command ("cryAnimManagerSetAnimLayerInfo");
button -label "Clear" -command ("cryAnimManagerClearAnimLayerInfo");
}
setParent ..;
setParent ..;
string $addText = "Add";
if( $mode == 1 ) $addText = "Edit";
$addbutton = `button -label $addText -command ("animManagerAddAnimRangeAdd "+$editEntry)`;
$cancelbutton = `button -label "Cancel" -command ("animManagerAddAnimRangeCloseWindow")`;
setParent ..;
formLayout -edit
-attachForm $collayout "top" 5
-attachForm $collayout "left" 5
-attachForm $collayout "right" 5
-attachNone $collayout "bottom"
-attachForm $addbutton "bottom" 5
-attachForm $addbutton "left" 5
-attachPosition $addbutton "right" 5 50
-attachNone $addbutton "top"
-attachForm $cancelbutton "bottom" 5
-attachPosition $cancelbutton "left" 5 50
-attachForm $cancelbutton "right" 5
-attachNone $cancelbutton "top"
$layout1;
if( $mode == 1 )
{
// Fill out the window with the selected entry
int $numRanges = `cryAnimGetNumRanges`;
string $ranges[] = `cryAnimGetRanges`;
if( $editEntry >= 0 && $editEntry < $numRanges )
{
string $editText = $ranges[$editEntry];
string $decode[];
//bypassing c++ code
//$decode = `cryExportDecodeRangeString $editText`;
$decode = python("mau.AMZN_DecodeAnimRangeString(\"" + $editText + "\")");
if( size($decode) >= 5 )
{
int $animStart = $decode[0];
int $animEnd = $decode[1];
string $animName = $decode[2];
string $animRoot = $decode[3];
string $animPath = $decode[4];
string $animLayers = $decode[5];
textField -e -text $animName ADDRANGE_NAME;
floatField -e -value $animStart ADDRANGE_START;
floatField -e -value $animEnd ADDRANGE_END;
textField -e -text $animRoot ADDRANGE_ROOTNODE;
textField -e -text $animPath ADDRANGE_PATH;
textField -e -text $animLayers ADDRANGE_ADDLAYERINFO;
}
}
}
showWindow CRYANIMMANAGER_ADDRANGEWINDOW;
}
}
else if( $mode == 2 )
{
// Remove indexed item
cryAnimRemoveAnimRange $editEntry;
cryAnimManagerLoadSettings;
cryAnimPopulateRangeList;
cryExportUpdateExportLists;
}
else if( $mode == 3 )
{
// Remove all items
string $response = `confirmDialog -title "Lumberyard Animation" -message ("Delete all animations?") -button "Yes" -button "No"`;
if( $response == "Yes" )
{
cryAnimRemoveAllAnimRanges;
cryAnimManagerLoadSettings;
cryAnimPopulateRangeList;
cryExportUpdateExportLists;
}
}
}
global proc cryAnimManagerSelectRoots( string $rootNodes )
{
string $rootTokens[];
$numTokens = `tokenize $rootNodes ";" $rootTokens`;
select -clear;
for( $root in $rootTokens )
{
select -add $root;
}
}
global proc cryAnimManagerCopyRangeText( string $rangeText )
{
cryMayaSupportPlugin copyToClipboard $rangeText;
}
global proc cryAnimManagerEditAnimRange( int $mode )
{
int $editEntry = -1;
if( $mode == 1 || $mode == 2 )
{
int $selectedArray[];
$selectedArray = `textScrollList -q -selectIndexedItem CRYANIMMANAGER_ANIMRANGES`;
if( size($selectedArray) == 1 )
{
// Subtract 1 as the list is 1 based but the array is 0 based
$editEntry = ($selectedArray[0] - 1);
}
else
{
confirmDialog -title "Error" -message "No anim range is selected." -button "Ok" -defaultButton "Ok";
return;
}
}
cryAnimManagerEditAnimRangeWin $mode $editEntry;
}
//////////////////////////////
//
// ui function
//
//////////////////////////////
global proc cryAnimManagerAnimRangesDClick( int $inIndex )
{
int $index = $inIndex;
if( `control -q -exists CRYANIMMANAGER_ANIMRANGES` )
{
int $selectedArray[];
$selectedArray = `textScrollList -q -selectIndexedItem CRYANIMMANAGER_ANIMRANGES`;
if( size($selectedArray) == 1 )
$index = $selectedArray[0] - 1;
}
int $numRanges = `cryAnimGetNumRanges`;
string $ranges[] = `cryAnimGetRanges`;
if( $index >= 0 && $index < $numRanges )
{
string $decode[];
//bypassing c++ function
//$decode = cryExportDecodeRangeString( $ranges[$index] );
$decode = `python("mau.AMZN_DecodeAnimRangeString(\"" + $ranges[$index] + "\")")`;
string $animStart = $decode[0];
string $animEnd = $decode[1];
playbackOptions -min $animStart -max $animEnd;
currentTime $animStart;
}
}
//////////////////////////////
//
// ui function
//
//////////////////////////////
global proc cryAnimManagerUICloseWindow()
{
//cryAnimManagerSaveSettings; // Removed as we should only save when something changes.
deleteUI -window CRYANIMMANAGER_WINDOW;
}
//////////////////////////////
//
// ui function
//
//////////////////////////////
proc string cryAnimCreateParentRowLayout()
{
$rowname = `rowLayout -numberOfColumns 4 -columnWidth4 20 100 65 65 -adjustableColumn 2
-columnAlign 2 "left" -columnAlign 3 "center" -columnAlign 4 "center"
-columnAttach 3 "both" 0 -columnAttach 4 "both" 0 -bgc .4 .4 .4`;
return $rowname;
}
//////////////////////////////
//
// ui function
//
//////////////////////////////
proc string cryAnimCreateChildRowLoyout()
{
$rowname = `rowLayout -numberOfColumns 6 -columnWidth6 35 35 150 150 250 85 -adjustableColumn 5 -bgc .4 .4 .4
-columnAlign 1 "center" -columnAttach 1 "both" 0
-columnAlign 2 "center" -columnAttach 2 "both" 0
-columnAlign 3 "center" -columnAttach 3 "both" 0
-columnAlign 4 "center" -columnAttach 4 "both" 0
-columnAlign 5 "center" -columnAttach 5 "both" 0
-columnAlign 6 "center" -columnAttach 6 "both" 0`;
return $rowname;
}
//////////////////////////////
//
// ui function
//
//////////////////////////////
proc cryAnimAddRangeToList( string $range, int $rangeNum )
{
if( !`control -q -exists CRYANIM_COLUMNLAYOUT` )
return;
setParent CRYANIM_COLUMNLAYOUT;
$rowName = `cryAnimCreateParentRowLayout`;
{
button -label "#" -command ("cryAnimManagerAnimRangesDClick "+$rangeNum);
string $rootNodes = "";
cryAnimCreateChildRowLoyout;
{
string $decode[];
//bypassing c++ code
//$decode = `cryExportDecodeRangeString $range`;
$decode = `python("mau.AMZN_DecodeAnimRangeString(\"" + $range + "\")")`;
if( size($decode) >= 5 )
{
text -h 22 -label ($decode[0]) -bgc .5 .55 .5;
text -h 22 -label ($decode[1]) -bgc .5 .5 .55;
text -h 22 -label ($decode[2]) -bgc .5 .55 .5;
text -h 22 -label ($decode[3]) -bgc .5 .5 .55;
text -h 22 -label ($decode[4]) -bgc .5 .55 .5;
if ($decode[5] != "")
text -h 22 -label "Set" -bgc .5 .55 .55;
else
text -h 22 -label "Not Set" -bgc .5 .55 .55;
$rootNodes = $decode[3];
}
//$messageText = `text -h 22 -label (" "+$range)`;
}
setParent ..;
button -align "center" -label "Edit" -command ( "cryAnimManagerEditAnimRangeWin 1 "+$rangeNum );
button -align "center" -label "Delete" -command ( "cryAnimManagerEditAnimRangeWin 2 "+$rangeNum );
popupMenu -parent $rowName -button 3;
{
menuItem -label "Select root nodes" -command ( "cryAnimManagerSelectRoots \""+$rootNodes+"\"" );
menuItem -divider true;
menuItem -label "Copy range text" -command ( "cryAnimManagerCopyRangeText \""+$range+"\"" );
menuItem -divider true;
menuItem -label "Show in Explorer" -command ( "cryExportAnimIndexShowInExplorer "+$rangeNum );
menuItem -divider true;
menuItem -label "Find Anims" -command ("cryAnimManagerFindAnims");
}
}
setParent ..;
}
//////////////////////////////
//
// ui function
//
//////////////////////////////
global proc cryAnimPopulateRangeList()
{
if( !`control -q -exists CRYANIM_COLUMNLAYOUT` )
return;
setParent CRYANIM_COLUMNLAYOUT;
string $childControls[];
$childControls = `layout -q -childArray CRYANIM_COLUMNLAYOUT`;
for( $child in $childControls )
{
deleteUI $child;
}
int $numRanges = `cryAnimGetNumRanges`;
string $ranges[] = `cryAnimGetRanges`;
cryAnimCreateParentRowLayout;
{
text -h 10 -label "";
cryAnimCreateChildRowLoyout;
{
text -h 10 -label "Start";
text -h 10 -label "End";
text -h 10 -label "Name";
text -h 10 -label "Root Node";
text -h 10 -label "Export Path";
text -h 10 -label "Layers";
}
setParent ..;
text -h 10 -label "";
text -h 10 -label "";
}
setParent ..;
separator -height 2 -style "in";
if( $numRanges > 0 )
{
int $rangeNum = 0;
for( $range in $ranges )
{
cryAnimAddRangeToList $range $rangeNum;
$rangeNum++;
}
}
}
// This function is currently not being called from anywhere. It is related to the old system of storing animations.
global proc cryAnimManagerFindAnims()
{
string $namespaces[] = `namespaceInfo -listOnlyNamespaces`;
int $foundNode = 0;
for($namespace in $namespaces )
{
string $settingsName = $namespace + ":" + LumberyardGetExportSettingNodeName();
if( `objExists $settingsName` )
{
if( `attributeExists "AnimRanges" $settingsName` )
{
string $rangesString = `getAttr ($settingsName+".AnimRanges")`;
print("Ranges String `"+$rangesString+"`\n");
string $rangeTokens[];
$numTokens = `tokenize $rangesString "," $rangeTokens`;
$foundNode = 1;
string $response = `confirmDialog -title "Lumberyard Animation" -message ("Found "+$numTokens+" animations on node "+$settingsName+". Merge them with the animations from this scene?") -button "Yes" -button "No"`;
if( $response == "Yes" )
{
for( $range in $rangeTokens )
{
cryAnimAddRange $range;
}
}
}
}
}
if( $foundNode == 0 )
{
confirmDialog -title "Lumberyard Animation" -message ("No referanced settings nodes were found that contain animation ranges.") -button "OK";
}
else
{
cryAnimPopulateRangeList;
}
}
//////////////////////////////
//
// ui function
//
//////////////////////////////
proc createCryAnimManagerWindow()
{
if(!`window -ex CRYANIMMANAGER_WINDOW`)
{
if(`windowPref -exists CRYANIMMANAGER_WINDOW`)
{
windowPref -wh 1100 600 -tlc `windowPref -q -topEdge CRYANIMMANAGER_WINDOW` `windowPref -q -leftEdge CRYANIMMANAGER_WINDOW` CRYANIMMANAGER_WINDOW;
//windowPref -remove CRYANIMMANAGER_WINDOW;
}
window -titleBar true -title "Lumberyard Animation Manager" -widthHeight 1100 600 -sizeable true -mnb false -mxb false CRYANIMMANAGER_WINDOW;
formLayout -numberOfDivisions 100 -visible false CRYANIM_FORMLAYOUT;
{
scrollLayout -childResizable true -hst 0 -vst 15 -height 1 -bgc .4 .4 .4 CRYANIM_SCROLLLAYOUT;
{
popupMenu CRYANIMMANAGER_FORMIDMENU;
{
menuItem -label "Find Anims" -command ("cryAnimManagerFindAnims");
}
columnLayout -adjustableColumn true -columnOffset "both" 5 -rowSpacing 5 -bgc .4 .4 .4 CRYANIM_COLUMNLAYOUT;
{
}
setParent ..;
}
setParent ..;
button -label "New" -command("cryAnimManagerEditAnimRangeWin 0 -1") CRYANIM_NEW;
button -label "Delete All" -command("cryAnimManagerEditAnimRangeWin 3 -1") CRYANIM_DELETEALL;
button -label "Close" -command ("cryAnimManagerUICloseWindow") CRYANIM_CLOSE;
}
formLayout -edit
-attachForm CRYANIM_NEW "top" 5
-attachForm CRYANIM_NEW "left" 5
-attachPosition CRYANIM_NEW "right" 5 50
-attachNone CRYANIM_NEW "bottom"
-attachForm CRYANIM_DELETEALL "top" 5
-attachPosition CRYANIM_DELETEALL "left" 5 50
-attachForm CRYANIM_DELETEALL "right" 5
-attachNone CRYANIM_DELETEALL "bottom"
-attachControl CRYANIM_SCROLLLAYOUT "top" 5 CRYANIM_NEW
-attachForm CRYANIM_SCROLLLAYOUT "left" 5
-attachForm CRYANIM_SCROLLLAYOUT "right" 5
-attachControl CRYANIM_SCROLLLAYOUT "bottom" 5 CRYANIM_CLOSE
-attachForm CRYANIM_CLOSE "bottom" 5
-attachForm CRYANIM_CLOSE "left" 5
-attachForm CRYANIM_CLOSE "right" 5
-attachNone CRYANIM_CLOSE "top"
CRYANIM_FORMLAYOUT;
}
cryAnimPopulateRangeList;
formLayout -e -visible true CRYANIM_FORMLAYOUT;
scriptJob -event "NewSceneOpened" "cryAnimPopulateRangeList" -p "CRYANIMMANAGER_WINDOW";
scriptJob -event "PostSceneRead" "cryAnimPopulateRangeList" -p "CRYANIMMANAGER_WINDOW";
showWindow CRYANIMMANAGER_WINDOW;
}
proc cryAnimSourceDependencies()
{
eval("source cryExport.mel");
eval("source LumberyardUtilities.mel");
}
global proc cryAnimManagerWin()
{
//cryAnimManagerUpgradeSettingsString;
cryAnimSourceDependencies;
createCryAnimManagerWindow;
}
/////////////////////////////////////////////////////////////////////////
// Generic anim access functions
/////////////////////////////////////////////////////////////////////////
global proc string cryAnimLoadRangesString()
{
string $rangesString = "";
string $exportSettingsNode = LumberyardGetExportSettingNodeName();
if( `objExists $exportSettingsNode` )
{
if( `attributeExists "AnimRanges" $exportSettingsNode` )
{
$rangesString = `getAttr ($exportSettingsNode+".AnimRanges")`;
}
}
return $rangesString;
}
global proc cryAnimSaveRangesString( string $rangesString )
{
string $exportSettingsNode = LumberyardGetExportSettingNodeName();
// Create the node if it dosen't exist
if( !`objExists $exportSettingsNode` )
{
select -clear;
string $settingsNode = `group -empty`;
rename $settingsNode $exportSettingsNode;
select -clear;
}
if( `objExists $exportSettingsNode` )
{
if( !`attributeExists "AnimRanges" $exportSettingsNode` )
{
addAttr -ln "AnimRanges" -dt "string" $exportSettingsNode;
}
setAttr ($exportSettingsNode+".AnimRanges") -type "string" $rangesString;
}
}
global proc cryAnimSaveRangesStringArray( string $ranges[] )
{
string $rangesString = "";
int $count = 0;
for( $range in $ranges )
{
if( $count > 0 ) $rangesString += ",";
$rangesString += $range;
$count++;
}
cryAnimSaveRangesString $rangesString;
}
global proc int cryAnimGetNumRanges()
{
string $rangesString = `cryAnimLoadRangesString`;
string $tokens[];
$numTokens = `tokenize $rangesString "," $tokens`;
// We still get 1 token even if the string is empty, so test for that and make sure we return 0 as the range count
if( $numTokens == 1 && size($tokens[0]) == 0 )
$numTokens = 0;
return $numTokens;
}
global proc string[] cryAnimGetRanges()
{
string $rangesString = `cryAnimLoadRangesString`;
string $tokens[];
$numTokens = `tokenize $rangesString "," $tokens`;
return $tokens;
}
global proc string[] cryAnimGetRangeNames()
{
string $animRanges[];
$animRanges = `cryAnimGetRanges`;
int $rangeCount = `cryAnimGetNumRanges`;
string $animNames[];
for( $i = 0;$i<$rangeCount;$i++ )
{
string $decode[];
//bypassing plug-in command for python script
//$decode = `cryExportDecodeRangeString $animRanges[$i]`;
$decode = python("mau.AMZN_DecodeAnimRangeString(\"" + $animRanges[$i] + "\")");
if( size($decode) >= 5 )
{
$animNames[$i] = $decode[2];
}
}
return $animNames;
}
global proc cryAnimRemoveAnimRange( int $index )
{
int $numRanges = `cryAnimGetNumRanges`;
if( $index >= 0 && $index < $numRanges )
{
string $ranges[] = `cryAnimGetRanges`;
stringArrayRemoveAtIndex $index $ranges;
cryAnimSaveRangesStringArray $ranges;
}
}
global proc cryAnimRemoveAllAnimRanges()
{
int $numRanges = `cryAnimGetNumRanges`;
if( $numRanges > 0 )
{
cryAnimSaveRangesString "";
}
}
global proc cryAnimReplaceRange( int $index, string $rangeString )
{
int $numRanges = `cryAnimGetNumRanges`;
if( $index >= 0 && $index < $numRanges )
{
string $ranges[] = `cryAnimGetRanges`;
$ranges[$index] = $rangeString;
cryAnimSaveRangesStringArray $ranges;
}
}
//modified 12/15/2014 to include layers
global proc string cryAnimFormatRangeString( string $start, string $end, string $name, string $root, string $path, string $layers )
{
string $rangeString = ("[" + $start + "-" + $end + "] - " + $name + " - " + $root + " - " + $path );
if($layers != "")
$rangeString = ($rangeString + " - " + $layers);
return $rangeString;
}
global proc cryAnimAddRange( string $rangeString )
{
int $numRanges = `cryAnimGetNumRanges`;
string $ranges[] = `cryAnimGetRanges`;
for( $range in $ranges )
{
if( `strcmp $range $rangeString` == 0 ) // An identical range is already in the ranges list.
{
return;
}
}
$ranges[$numRanges] = $rangeString;
cryAnimSaveRangesStringArray $ranges;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// returns the current status of the anim layers
// returns name of anim layer, whether layer is set to mute or solo
// returns data as a mel command that can be executed to restore the settings
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
global proc string cryReturnActiveAnimLayers()
{
string $sel[] = `ls -type "animLayer"`;
string $returnString = "";
for($cur in $sel)
{
int $mute = `getAttr ($cur + ".mute")`;
int $solo = `getAttr ($cur + ".solo")`;
string $layer = ("setAttr " + $cur + ".mute " + $mute + ";setAttr " + $cur + ".solo " + $solo + ";");
$returnString = $returnString+$layer;
}
return $returnString;
}