1/****************************************************************************** 2 NintendoWare for CTR Maya Plugin 3 4 File: NW4C_SetAnimRange.mel 5 Description: set animation range 6 Date: 2010/08/30 7 Author: Takashi Endo 8 9 Copyright 2010 Nintendo Co., Ltd. All rights reserved. 10*****************************************************************************/ 11 12// GetDagList GetAnimRangeList UpdateView SetEditorCurrent 13// CreateAnimRangeNode AddAnimRangeAttr 14// ImportAnimRange ExportAnimRange 15// DropAnimRange 16 17/****************************************************************************** 18 confirm dialog check window 19******************************************************************************/ 20proc int ConfirmDialogCheckWin(string $parent, string $msg) 21{ 22 $msg += "Are you sure ?"; 23 string $ret; 24 if (`window -q -ex $parent`) 25 { 26 $ret = `confirmDialog -t "Confirm" -p $parent 27 -m $msg -ma "center" 28 -b "Yes" -b "No" -db "No" -ds "No"`; 29 } 30 else 31 { 32 $ret = `confirmDialog -t "Confirm" 33 -m $msg -ma "center" 34 -b "Yes" -b "No" -db "No" -ds "No"`; 35 } 36 return ($ret == "Yes"); 37} 38 39/****************************************************************************** 40 get window name string 41******************************************************************************/ 42proc string GetWindowNameString() 43{ 44 return "nw4cSetAnimRange_Win"; 45} 46 47/****************************************************************************** 48 do error 49******************************************************************************/ 50proc DoError(string $msg) 51{ 52 catch(`error $msg`); 53} 54 55/****************************************************************************** 56 get number of clip 57******************************************************************************/ 58proc int GetNumberOfClip() 59{ 60 return 50; 61} 62 63/****************************************************************************** 64 string array found 65******************************************************************************/ 66proc int IsStringInArray(string $item, string $list[]) 67{ 68 string $listItem; 69 for ($listItem in $list) 70 { 71 if ($item == $listItem) 72 { 73 return true; 74 } 75 } 76 return false; 77} 78 79/****************************************************************************** 80 float to int 81******************************************************************************/ 82proc int FloatToInt(float $f) 83{ 84 int $n = (int)$f; 85 float $m = $f - $n; 86 if ($m <= -0.5) 87 { 88 $n--; 89 } 90 else if ($m >= 0.5) 91 { 92 $n++; 93 } 94 return $n; 95} 96 97/****************************************************************************** 98 get attr title list 99******************************************************************************/ 100proc string[] GetAttrTitleList(string $animRange) 101{ 102 int $i; 103 int $no = GetNumberOfClip(); 104 string $list[]; 105 for ($i = 0; $i < $no; ++$i) 106 { 107 $list[$i] = `getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")`; 108 } 109 return $list; 110} 111 112/****************************************************************************** 113 get default animation range title 114******************************************************************************/ 115proc string GetDefaultAnimRangeTitle(int $i) 116{ 117 //return ""; 118 string $str = $i; 119 while (size($str) < 2) 120 { 121 $str = "0" + $str; 122 } 123 return ("default" + $str); 124} 125 126/****************************************************************************** 127 get unique animation range title 128******************************************************************************/ 129proc string GetUniqueAnimRangeTitle(string $animRange, int $i) 130{ 131 string $list[] = GetAttrTitleList($animRange); 132 string $str = GetDefaultAnimRangeTitle($i); 133 if ($str == $list[$i]) 134 { 135 return $str; 136 } 137 if (!IsStringInArray($str, $list)) 138 { 139 return $str; 140 } 141 142 int $idx, $j; 143 int $no = GetNumberOfClip(); 144 for ($idx = 0; $idx < $no; ++$idx) 145 { 146 $str = GetDefaultAnimRangeTitle($idx); 147 for ($j = 0; $j < $no; ++$j) 148 { 149 if ($i == $j) 150 { 151 continue; 152 } 153 if ($str == $list[$j]) 154 { 155 break; 156 } 157 } 158 if ($j >= $no) 159 { 160 break; 161 } 162 } 163 return $str; 164} 165 166/****************************************************************************** 167 add animation range attr 168******************************************************************************/ 169global proc nw4cSetAnimRange_AddAnimRangeAttr(string $animRange) 170{ 171 int $i; 172 int $no = GetNumberOfClip(); 173 174 // merge cmdl 175 if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeMergeCmdlFlag"`) 176 { 177 addAttr -at "bool" -k 0 -ln "nw4c_AnimRangeMergeCmdlFlag" -h 1 -dv 0 $animRange; 178 } 179 if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeMergeCmdlPath"`) 180 { 181 addAttr -dt "string" -k 0 -ln "nw4c_AnimRangeMergeCmdlPath" -h 1 $animRange; 182 } 183 184 // custom opts 185 if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeEnableCustomOpts"`) 186 { 187 addAttr -at "bool" -k 0 -ln "nw4c_AnimRangeEnableCustomOpts" -h 1 -dv 0 $animRange; 188 } 189 if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeCompressNode"`) 190 { 191 addAttr -at "enum" -k 0 -ln "nw4c_AnimRangeCompressNode" 192 -en "None=0:CullUseless=1:CullUninfluential=2:UniteCompressible=3:UniteAll=4:UniteBelow=5" -h 1 -dv 0 $animRange; 193 } 194 if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeCompressMaterial"`) 195 { 196 addAttr -at "bool" -k 0 -ln "nw4c_AnimRangeCompressMaterial" -h 1 -dv 0 $animRange; 197 } 198 if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeOptimizePrimitive"`) 199 { 200 addAttr -at "bool" -k 0 -ln "nw4c_AnimRangeOptimizePrimitive" -h 1 -dv 0 $animRange; 201 } 202 if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeDisableSkeletalModelSimplification"`) 203 { 204 addAttr -at "bool" -k 0 -ln "nw4c_AnimRangeDisableSkeletalModelSimplification" -h 1 -dv 0 $animRange; 205 } 206 207 // animation range 208 if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeEnable"`) 209 { 210 addAttr -at "bool" -k false -ln "nw4c_AnimRangeEnable" -h 1 -dv false -m $animRange; 211 setAttr -s $no ($animRange + "." + "nw4c_AnimRangeEnable"); 212 for ($i = 0; $i < $no; ++$i) 213 { 214 setAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]") false; 215 } 216 } 217 if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeLoop"`) 218 { 219 addAttr -at "bool" -k false -ln "nw4c_AnimRangeLoop" -h 1 -dv false -m $animRange; 220 setAttr -s $no ($animRange + "." + "nw4c_AnimRangeLoop"); 221 for ($i = 0; $i < $no; ++$i) 222 { 223 setAttr ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]") false; 224 } 225 } 226 if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeName"`) 227 { 228 addAttr -dt "string" -k false -ln "nw4c_AnimRangeName" -h 1 -m $animRange; 229 setAttr -s $no ($animRange + "." + "nw4c_AnimRangeName"); 230 for ($i = 0; $i < $no; ++$i) 231 { 232 setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]") 233 `GetDefaultAnimRangeTitle $i`; 234 } 235 } 236 else // for old version 237 { 238 for ($i = 0; $i < $no; ++$i) 239 { 240 if (`getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")` == "") 241 { 242 setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]") 243 `GetUniqueAnimRangeTitle $animRange $i`; 244 } 245 } 246 } 247 for ($i = 0; $i < $no; ++$i) 248 { 249 if (!`attributeQuery -n $animRange -ex ("nw4c_AnimRange" + $i)`) 250 { 251 addAttr -at "short" -k true -ln ("nw4c_AnimRange" + $i) -h 1 252 -dv ($i * (-1)) -min ($i * (-1)) -max ($i * (-1)) $animRange; 253 } 254 } 255} 256 257/****************************************************************************** 258 parent animation range 259******************************************************************************/ 260proc string ParentAnimRange(string $wName, string $animRange, string $dag) 261{ 262 string $list[] = `ls $animRange`; 263 264 string $sel[] = `ls -sl`; 265 int $i, $j = -1; 266 for ($i = 0; $i < size($sel); ++$i) 267 { 268 if ($list[0] == $sel[$i]) 269 { 270 $j = $i; 271 break; 272 } 273 } 274 275 nameField -e -o $list[0] ($wName + "AnimRangeNameWork"); 276 if ($dag != "") 277 { 278 catch(`parent $list[0] $dag`); 279 } 280 else 281 { 282 catch(`parent -w $list[0]`); 283 } 284 $list[0] = `nameField -q -o ($wName + "AnimRangeNameWork")`; 285 $list = `ls $list[0]`; 286 287 if ($j >= 0) 288 { 289 $sel[$j] = $list[0]; 290 } 291 if (size($sel)) 292 { 293 select -r $sel; 294 } 295 else 296 { 297 select -cl; 298 } 299 return $list[0]; 300} 301 302/****************************************************************************** 303 create animation range node 304******************************************************************************/ 305proc string CreateAnimRangeNode(string $wName, string $dag) 306{ 307 string $animRange = ""; 308 string $sel[] = `ls -l -sl`; 309 $animRange = `createNode "transform" -n "nw4c_AnimRangeCtrl"`; 310 toggle -te -st true $animRange; // template = true (same as next line ?) 311 setAttr -l true ($animRange + ".template"); 312 string $keyAttrList[] = `listAnimatable $animRange`; 313 string $keyAttr; 314 for ($keyAttr in $keyAttrList) 315 { 316 setAttr -k false $keyAttr; 317 } 318 nw4cSetAnimRange_AddAnimRangeAttr($animRange); 319 320 if (size($sel)) 321 { 322 select -r $sel; 323 } 324 else 325 { 326 select -cl; 327 } 328 329 if ($dag != "") 330 { 331 if (`objExists $dag`) 332 { 333 $animRange = ParentAnimRange($wName, $animRange, $dag); 334 } 335 } 336 return $animRange; 337} 338 339/****************************************************************************** 340 is animation range 341******************************************************************************/ 342proc int IsAnimRange(string $animRange) 343{ 344 if (`objExists $animRange`) 345 { 346 if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeEnable"`) 347 { 348 return false; 349 } 350// int $i = 0; 351// int $no = GetNumberOfClip(); 352//// for ($i = 0; $i < $no; ++$i) 353// for ($i = 0; $i < 1; ++$i) 354// if (!`attributeQuery -n $animRange -ex ("nw4c_AnimRange" + $i)`) 355// break; 356//// if ($i < $no) 357// if ($i < 1) 358// return false; 359// 360// if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeLoop"`) 361// return false; 362// if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeName"`) 363// return false; 364 return true; 365 } 366 return false; 367} 368 369/****************************************************************************** 370 delete animation range node 371******************************************************************************/ 372proc DeleteAnimRangeNode(string $node) 373{ 374 catch(`delete $node`); 375} 376 377/****************************************************************************** 378 enable key change script 379******************************************************************************/ 380proc EnableKeyChangeScript(string $wName, string $animRange, int $i, int $en) 381{ 382 if ($en) 383 { 384 scriptJob -p ($wName + "ClipStart" + $i) -rp 385 -ac ($animRange + "." + "nw4c_AnimRange" + $i) 386 ("nw4cSetAnimRange_OnKeyChange " + $wName + " " + $i); 387 scriptJob -p ($wName + "ClipEnable" + $i) -rp 388 -ac ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]") 389 ("nw4cSetAnimRange_OnEnableChange " + $wName + " " + $i); 390 } 391 else 392 { 393 scriptJob -p ($wName + "ClipStart" + $i) -rp 394 -ac ($animRange + "." + "nw4c_AnimRange" + $i) ""; 395 scriptJob -p ($wName + "ClipEnable" + $i) -rp 396 -ac ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]") ""; 397 scriptJob -p ($wName + "ClipLoop" + $i) -rp 398 -ac ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]") ""; // added (2006/04/10) 399 } 400} 401 402/****************************************************************************** 403 get time range from key 404******************************************************************************/ 405proc float[] GetTimeRangeFromKey(string $animRange, int $i) 406{ 407 float $ret[], $f[]; 408 int $n = `keyframe -q -kc ($animRange + "." + "nw4c_AnimRange" + $i)`; 409 if ($n) 410 { 411 $ret[0] = `findKeyframe -w "first" ($animRange + "." + "nw4c_AnimRange" + $i)`; 412 $ret[1] = `findKeyframe -w "last" ($animRange + "." + "nw4c_AnimRange" + $i)`; 413 } 414 else 415 { 416 $ret[0] = 0; 417 $ret[1] = 0; 418 } 419 return $ret; 420} 421 422/****************************************************************************** 423 set time range to key 424******************************************************************************/ 425proc SetTimeRangeToKey(string $wName, string $animRange, int $i, float $s, float $e) 426{ 427 EnableKeyChangeScript($wName, $animRange, $i, false); 428 string $attr = "nw4c_AnimRange" + $i; 429 cutKey -cl -at $attr $animRange; 430 if ($s != $e) 431 { 432 setKeyframe -bd false -hi none -cp false -s false -at $attr 433 -t $s -v (-$i) -itt "flat" -ott "step" $animRange; // start 434 } 435 setKeyframe -bd false -hi none -cp false -s false -at $attr 436 -t $e -v (-$i) -itt "flat" -ott "step" $animRange; // end 437 EnableKeyChangeScript($wName, $animRange, $i, true); 438} 439 440/****************************************************************************** 441 display time range 442******************************************************************************/ 443proc DisplayTimeRange(string $wName, int $i, float $s, float $e) 444{ 445 floatField -e -v $s ($wName + "ClipStart" + $i); 446 floatField -e -v $e ($wName + "ClipEnd" + $i); 447 // changed from original (2006/04/10) 448 //text -e -l (`FloatToInt $e` - `FloatToInt $s`) ($wName + "ClipSpan" + $i); 449 int $frameSize = `FloatToInt $e` - `FloatToInt $s`; 450 if (!`checkBox -q -v ($wName + "ClipLoop" + $i)` || $frameSize == 0) 451 { 452 ++$frameSize; 453 } 454 text -e -l $frameSize ($wName + "ClipSpan" + $i); 455} 456 457/****************************************************************************** 458 connect animation range control 459******************************************************************************/ 460proc ConnectAnimRangeControl(string $wName, string $animRange) 461{ 462 //trace "connect"; 463 connectControl ($wName + "MergeCmdlFlag") ($animRange + "." + "nw4c_AnimRangeMergeCmdlFlag"); 464 connectControl ($wName + "MergeCmdlPath") ($animRange + "." + "nw4c_AnimRangeMergeCmdlPath"); 465 466 connectControl -in 2 ($wName + "EnableCustomOpts") ($animRange + "." + "nw4c_AnimRangeEnableCustomOpts"); 467 connectControl -in 2 ($wName + "CompressNode") ($animRange + "." + "nw4c_AnimRangeCompressNode"); 468 connectControl -in 2 ($wName + "CompressMaterial") ($animRange + "." + "nw4c_AnimRangeCompressMaterial"); 469 connectControl -in 2 ($wName + "OptimizePrimitive") ($animRange + "." + "nw4c_AnimRangeOptimizePrimitive"); 470 connectControl -in 2 ($wName + "DisableSkeletalModelSimplification") ($animRange + "." + "nw4c_AnimRangeDisableSkeletalModelSimplification"); 471 472 float $f[]; 473 int $no = GetNumberOfClip(); 474 int $i; 475 for ($i = 0; $i < $no; ++$i) 476 { 477 connectControl ($wName + "ClipEnable" + $i) ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]"); 478 connectControl ($wName + "ClipLoop" + $i) ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]"); 479 connectControl ($wName + "ClipName" + $i) ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]"); 480 481 // no attr-change-event from anim-editor (Maya bugfix) 482 connectControl ($wName + "ClipAttr" + $i) ($animRange + "." + "nw4c_AnimRange" + $i); 483 484 $f = GetTimeRangeFromKey($animRange, $i); 485 DisplayTimeRange($wName, $i, $f[0], $f[1]); 486 nw4cSetAnimRange_OnEnableChange($wName, $i); 487 488 // link script 489 EnableKeyChangeScript($wName, $animRange, $i, true); 490 floatField -e -cc ("nw4cSetAnimRange_OnKeyChangeUI " + $wName + " " + $i + " s") ($wName + "ClipStart" + $i); 491 floatField -e -cc ("nw4cSetAnimRange_OnKeyChangeUI " + $wName + " " + $i + " e") ($wName + "ClipEnd" + $i); 492 } 493} 494 495/****************************************************************************** 496 get current dag 497******************************************************************************/ 498proc string GetCurrentDag(string $wName) 499{ 500 if (`window -ex $wName`) 501 { 502 if (`nameField -q -en ($wName + "DagName")`) 503 { 504 string $dag = `nameField -q -o ($wName + "DagName")`; 505 if ($dag != "") 506 { 507 if (`objExists $dag`) 508 { 509 return $dag; 510 } 511 } 512 } 513 } 514 return ""; 515} 516 517/****************************************************************************** 518 get current animation range 519******************************************************************************/ 520proc string GetCurrentAnimRange(string $wName) 521{ 522 if (`window -ex $wName`) 523 { 524 //if (`nameField -q -en ($wName + "AnimRangeName")`) 525 if (`nameField -q -en ($wName + "AnimRangeNameMaster")`) 526 { 527 string $animRange = `nameField -q -o ($wName + "AnimRangeName")`; 528 if ($animRange != "") 529 { 530 if (`objExists $animRange`) 531 { 532 return $animRange; 533 } 534 } 535 } 536 } 537 return ""; 538} 539 540/****************************************************************************** 541 save title list 542******************************************************************************/ 543proc SaveTitleList(string $wName, string $animRange) 544{ 545 int $i; 546 int $no = GetNumberOfClip(); 547 string $list[] = GetAttrTitleList($animRange); 548 textScrollList -e -ra ($wName + "_ClipNameList"); 549 for ($i = 0; $i < $no; ++$i) 550 { 551 textScrollList -e -a (" " + $list[$i]) ($wName + "_ClipNameList"); // add header space for null string 552 } 553} 554 555/****************************************************************************** 556 restore title list 557******************************************************************************/ 558proc RestoreTitleList(string $wName, string $animRange, int $i) 559{ 560 string $org[] = `textScrollList -q -ai ($wName + "_ClipNameList")`; 561 string $str = ""; 562 if (size($org[$i]) > 1) 563 { 564 $str = substring($org[$i], 2, size($org[$i])); // remove header space for null string 565 } 566 setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]") $str; 567} 568 569/****************************************************************************** 570 merge cmdl flag CB 571******************************************************************************/ 572global proc nw4cSetAnimRange_MergeCmdlFlagCB(string $wName) 573{ 574 string $flagCtrl = $wName + "MergeCmdlFlag"; 575 int $enable = false; 576 if (`control -q -en $flagCtrl`) 577 { 578 $enable = `checkBox -q -v $flagCtrl`; 579 } 580 control -e -en $enable ($wName + "MergeCmdlPath"); 581 control -e -en $enable ($wName + "MergeCmdlBrowser"); 582} 583 584/****************************************************************************** 585 merge cmdl browser CB 586******************************************************************************/ 587global proc nw4cSetAnimRange_MergeCmdlBrowserCB(string $wName) 588{ 589 string $pathCtrl = $wName + "MergeCmdlPath"; 590 string $curPath = `textField -q -tx $pathCtrl`; 591 if (size($curPath) > 0) 592 { 593 $curPath = dirname($curPath); 594 $curPath = (`filetest -d $curPath`) ? ($curPath + "/") : ""; 595 //NW4C_SetCurDirFromFile($curPath); 596 //trace ("cur: " + $curPath); 597 } 598 string $newPath = `fileDialog -dm ($curPath + "*.cmdl")`; 599 if (size($newPath) > 0) 600 { 601 textField -e -tx $newPath $pathCtrl; 602 // set attr direct 603 // because connectControl is not effective for change in mel 604 string $animRange = GetCurrentAnimRange($wName); 605 if ($animRange != "") 606 { 607 setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeMergeCmdlPath") $newPath; 608 } 609 } 610} 611 612/****************************************************************************** 613 enable custom opts callback 614******************************************************************************/ 615global proc nw4cSetAnimRange_EnableCustomOptsCB(string $wName) 616{ 617 int $enable = false; 618 if (`control -q -en ($wName + "EnableCustomOpts")`) 619 { 620 $enable = `checkBoxGrp -q -v1 ($wName + "EnableCustomOpts")`; 621 } 622 string $label = "Custom Options"; 623 control -e -en $enable ($wName + "CompressNode"); 624 control -e -en $enable ($wName + "CompressMaterial"); 625 control -e -en $enable ($wName + "OptimizePrimitive"); 626 control -e -en $enable ($wName + "DisableSkeletalModelSimplification"); 627 frameLayout -e -l $label ($wName + "CustomOptsLayout"); 628} 629 630/****************************************************************************** 631 set editor current 632******************************************************************************/ 633proc SetEditorCurrent(string $wName, string $animRange) 634{ 635 int $enable = ($animRange != ""); 636 637 if ($enable) 638 { 639 nameField -e -en true -o $animRange ($wName + "AnimRangeNameMaster"); 640 nameField -e -en true -o $animRange ($wName + "AnimRangeName"); 641 nw4cSetAnimRange_AddAnimRangeAttr($animRange); 642 layout -e -en true ($wName + "Editor"); 643 ConnectAnimRangeControl($wName, $animRange); 644 SaveTitleList($wName, $animRange); 645 } 646 else 647 { 648 nameField -e -en false ($wName + "AnimRangeNameMaster"); 649 nameField -e -en false ($wName + "AnimRangeName"); 650 layout -e -en false ($wName + "Editor"); 651 } 652 653 control -e -en $enable ($wName + "MergeCmdlFlag"); 654 nw4cSetAnimRange_MergeCmdlFlagCB($wName); 655 656 string $optsLayout = $wName + "CustomOptsLayout"; 657 control -e -en $enable ($wName + "EnableCustomOpts"); 658 if (!$enable) 659 { 660 //frameLayout -e -cl true $optsLayout; 661 } 662 nw4cSetAnimRange_EnableCustomOptsCB($wName); 663} 664 665/****************************************************************************** 666 is special root node 667******************************************************************************/ 668proc int IsSpecialRootNode(string $node) 669{ 670 string $type = nodeType($node); 671 string $childs[] = `listRelatives -pa -s $node`; 672 if (size(`ls -cameras -lights -typ environmentFog $childs`) > 0 || 673 $type == "lookAt") 674 { 675 return true; 676 } 677 return false; 678} 679 680/****************************************************************************** 681 get dag list 682******************************************************************************/ 683proc string[] GetDagList() 684{ 685 string $works[] = `ls -as`; 686 string $exlist[] = { "persp", "top", "front", "side" }; 687 $works = stringArrayRemove($exlist, $works); 688 689 string $list[]; 690 string $item; 691 for ($item in $works) 692 { 693 if (!IsSpecialRootNode($item)) 694 { 695 $list[size($list)] = $item; 696 } 697 } 698 if (size($list)) 699 { 700 $list = `sort $list`; 701 } 702 return $list; 703} 704 705/****************************************************************************** 706 get animation range list 707******************************************************************************/ 708proc string[] GetAnimRangeList() 709{ 710 string $list[] = `ls -tr -tm`; // transform & templated 711 string $retList[]; 712 string $item; 713 for ($item in $list) 714 { 715 if (IsAnimRange($item)) 716 { 717 $retList[size($retList)] = $item; 718 } 719 } 720 if (size($retList)) 721 { 722 $retList = `sort $retList`; 723 } 724 return $retList; 725} 726 727/****************************************************************************** 728 get animation range from dag 729******************************************************************************/ 730proc string GetAnimRangeFromDag(string $dag) 731{ 732 string $ret = ""; 733 if (`objExists $dag`) 734 { 735 string $list[] = `listRelatives -pa -typ "transform" $dag`; 736 string $item; 737 for ($item in $list) 738 { 739 if (IsAnimRange($item)) 740 { 741 $ret = $item; 742 break; 743 } 744 } 745 } 746 return $ret; 747} 748 749/****************************************************************************** 750 get dag from animation range 751******************************************************************************/ 752proc string GetDagFromAnimRange(string $animRange) 753{ 754 string $ret = ""; 755 if (`objExists $animRange`) 756 { 757 string $list[] = `listRelatives -pa -p -typ "transform" $animRange`; 758 string $item; 759 if ($list[0] != "") 760 { 761 string $dags[] = GetDagList(); 762 if (size($dags)) 763 { 764 if (IsStringInArray($list[0], $dags)) 765 { 766 $ret = $list[0]; 767 } 768 } 769 } 770 } 771 return $ret; 772} 773 774/****************************************************************************** 775 relation dag to animation range list 776******************************************************************************/ 777proc RelationDagToAnimRangeList(string $wName, string $dag) 778{ 779 string $animRange = GetAnimRangeFromDag($dag); 780 if ($animRange != "") 781 { 782 SetEditorCurrent($wName, $animRange); 783 nw4cSetAnimRange_UpdateAnimRangeList($wName, 0); 784 } 785 else 786 { 787 SetEditorCurrent($wName, ""); 788 textScrollList -e -da ($wName + "AnimRangeList"); 789 } 790} 791 792/****************************************************************************** 793 relation animation range to dag list 794******************************************************************************/ 795proc RelationAnimRangeToDagList(string $wName, string $animRange) 796{ 797 string $dag = GetDagFromAnimRange($animRange); 798 if ($dag != "") 799 { 800 nameField -e -en true -o $dag ($wName + "DagName"); 801 nw4cSetAnimRange_UpdateDagList($wName); 802 } 803 else 804 { 805 nameField -e -en false ($wName + "DagName"); 806 textScrollList -e -da ($wName + "DagList"); 807 } 808} 809 810/****************************************************************************** 811 quick sort 812******************************************************************************/ 813proc QuickSort(string $a[], int $idx[], int $left, int $right, string $compare) 814{ 815 int $i, $j, $t; 816 string $s; 817 if ($left < $right) 818 { 819 $s = $a[$idx[($left + $right) / 2]]; 820 $i = $left - 1; 821 $j = $right + 1; 822 while (1) 823 { 824 while(eval($compare + " \"" + $a[$idx[++$i]] + "\" \"" + $s + "\"") < 0) 825 ; 826 while(eval($compare + " \"" + $a[$idx[--$j]] + "\" \"" + $s + "\"") > 0) 827 ; 828 if ($i >= $j) 829 { 830 break; 831 } 832 $t = $idx[$i]; 833 $idx[$i] = $idx[$j]; 834 $idx[$j] = $t; 835 } 836 QuickSort($a, $idx, $left, ($i - 1), $compare); 837 QuickSort($a, $idx, ($j + 1), $right, $compare); 838 } 839} 840 841/****************************************************************************** 842 quick sort string array 843******************************************************************************/ 844proc string[] QsortStringArray(string $array[], string $compare) 845{ 846 int $sz = size($array); 847 if ($sz <= 1) 848 { 849 return $array; 850 } 851 852 int $i, $idx[]; 853 for ($i = ($sz - 1); $i >= 0; --$i) 854 { 855 $idx[$i] = $i; 856 } 857 QuickSort($array, $idx, 0, ($sz - 1), $compare); 858 859 // string list 860 string $retList[]; 861 for ($i = ($sz - 1); $i >= 0; --$i) 862 { 863 $retList[$i] = $array[$idx[$i]]; 864 } 865 return $retList; 866} 867 868/****************************************************************************** 869 merge float range array 870******************************************************************************/ 871proc MergeFloatRangeArray(float $s[], float $e[], float $sf[], float $ef[]) 872{ 873 int $chk; 874 int $i, $j; 875 876 if (!size($s) || !size($e) || (size($s) != size($e))) 877 { 878 return; 879 } 880 881 while(1) 882 { 883 clear($sf); 884 clear($ef); 885 $chk = 0; 886 $sf[0] = $s[0]; 887 $ef[0] = $e[0]; 888 for ($i = 1; $i < size($s); ++$i) 889 { 890 for ($j = 0; $j < size($sf); ++$j) 891 { 892 if ($sf[$j] <= $s[$i] && $e[$i] <= $ef[$j]) 893 { 894 $chk = 1; 895 } 896 else if ($sf[$j] <= $s[$i] && $s[$i] <= ($ef[$j] + 1)) 897 { 898 $ef[$j] = $e[$i]; 899 $chk = 1; 900 } 901 else if (($sf[$j] - 1) <= $e[$i] && $e[$i] <= $ef[$j]) 902 { 903 $sf[$j] = $s[$i]; 904 $chk = 1; 905 } 906 else if ($sf[$j] > $s[$i] && $e[$i] > $ef[$j]) 907 { 908 $sf[$j] = $s[$i]; 909 $ef[$j] = $e[$i]; 910 $chk = 1; 911 } 912 else 913 { 914 continue; 915 } 916 break; 917 } 918 if ($j >= size($sf)) 919 { 920 $sf[size($sf)] = $s[$i]; 921 $ef[size($ef)] = $e[$i]; 922 } 923 } 924 if (!$chk) 925 { 926 break; 927 } 928 929 clear($s); 930 clear($e); 931 for ($j = 0; $j < size($sf); ++$j) 932 { 933 $s[$j] = $sf[$j]; 934 $e[$j] = $ef[$j]; 935 } 936 } 937 string $array[]; 938 for ($i = 0; $i < size($sf); ++$i) 939 { 940 $array[$i] = $sf[$i] + "," + $ef[$i]; 941 } 942 $array = QsortStringArray($array, "nw4cSetAnimRange_CompareFloatRange"); 943 string $tokBuf[]; 944 for ($i = 0; $i < size($sf); ++$i) 945 { 946 tokenize $array[$i] "," $tokBuf; 947 $sf[$i] = (float)$tokBuf[0]; 948 $ef[$i] = (float)$tokBuf[1]; 949 } 950} 951 952/****************************************************************************** 953 enable change CB 954******************************************************************************/ 955global proc nw4cSetAnimRange_OnEnableChange(string $wName, int $i) 956{ 957 string $animRange = GetCurrentAnimRange($wName); 958 if ($animRange == "") 959 { 960 return; 961 } 962 int $en = `getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`; 963 floatField -e -en $en ($wName + "ClipStart" + $i); 964 floatField -e -en $en ($wName + "ClipEnd" + $i); 965 checkBox -e -en $en ($wName + "ClipLoop" + $i); 966 textField -e -en $en ($wName + "ClipName" + $i); 967 button -e -en $en ($wName + "ClipNo" + $i); 968} 969 970/****************************************************************************** 971 key change CB 972******************************************************************************/ 973global proc nw4cSetAnimRange_OnKeyChange(string $wName, int $i) 974{ 975 string $animRange = GetCurrentAnimRange($wName); 976 if ($animRange == "") 977 { 978 return; 979 } 980 float $f[] = GetTimeRangeFromKey($animRange, $i); 981 DisplayTimeRange($wName, $i, $f[0], $f[1]); 982} 983 984/****************************************************************************** 985 key change add key CB 986******************************************************************************/ 987global proc nw4cSetAnimRange_OnKeyChangeAddKey(string $wName) 988{ 989 string $animRange = GetCurrentAnimRange($wName); 990 if ($animRange == "") 991 { 992 return; 993 } 994 string $list[] = `keyframe -q -sl -n $animRange`; 995 if (size($list)) 996 { 997 int $i; 998 int $no = GetNumberOfClip(); 999 for ($i = 0; $i < $no; ++$i) 1000 { 1001 $list = `keyframe -q -sl -n ($animRange + "." + "nw4c_AnimRange" + $i)`; 1002 if (size($list)) 1003 { 1004 nw4cSetAnimRange_OnKeyChange($wName, $i); 1005 } 1006 } 1007 } 1008} 1009 1010/****************************************************************************** 1011 key change UI CB 1012******************************************************************************/ 1013global proc nw4cSetAnimRange_OnKeyChangeUI(string $wName, int $i, string $which) 1014{ 1015 string $animRange = GetCurrentAnimRange($wName); 1016 if ($animRange == "") 1017 { 1018 return; 1019 } 1020 float $s = `floatField -q -v ($wName + "ClipStart" + $i)`; 1021 float $e = `floatField -q -v ($wName + "ClipEnd" + $i)`; 1022 float $f[] = GetTimeRangeFromKey($animRange, $i); 1023 1024 if ($which == "s") 1025 { 1026 if ($f[0] != $s) 1027 { 1028 if ($s >= $e) 1029 { 1030 //$e = $s + 1; 1031 $e = $s; // if allow s = e // changed from original (2006/03/07) 1032 } 1033 } 1034 } 1035 else 1036 { 1037 if ($f[1] != $e) 1038 { 1039 if ($s >= $e) 1040 { 1041 //$s = $e - 1; 1042 $s = $e; // if allow s = e // changed from original (2006/03/07) 1043 } 1044 } 1045 } 1046 1047 DisplayTimeRange($wName, $i, $s, $e); 1048 //if ($f[0] != $s || $f[1] != $e) 1049 if ($f[0] != $s || $f[1] != $e || 1050 `keyframe -q -kc ($animRange + "." + "nw4c_AnimRange" + $i)` == 0) // changed from original (2006/04/07) 1051 { 1052 SetTimeRangeToKey($wName, $animRange, $i, $s, $e); 1053 } 1054} 1055 1056/****************************************************************************** 1057 select dag list CB 1058******************************************************************************/ 1059global proc nw4cSetAnimRange_OnSelectDagList(string $wName) 1060{ 1061 if (!`window -ex $wName`) 1062 { 1063 return; 1064 } 1065 1066 string $sel[] = `textScrollList -q -si ($wName + "DagList")`; 1067 if (size($sel)) 1068 { 1069 nameField -e -en true -o $sel[size($sel) - 1] ($wName + "DagName"); 1070 RelationDagToAnimRangeList($wName, $sel[size($sel) - 1]); 1071 } 1072} 1073 1074/****************************************************************************** 1075 double click dag list CB 1076******************************************************************************/ 1077global proc nw4cSetAnimRange_OnDblClkDagList(string $wName) 1078{ 1079 string $dag = GetCurrentDag($wName); 1080 if ($dag != "") 1081 { 1082 select -r $dag; 1083 } 1084} 1085 1086/****************************************************************************** 1087 select animation range list CB 1088******************************************************************************/ 1089global proc nw4cSetAnimRange_OnSelectAnimRangeList(string $wName) 1090{ 1091 if (!`window -ex $wName`) 1092 { 1093 return; 1094 } 1095 1096 string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`; 1097 if (size($sel)) 1098 { 1099 SetEditorCurrent($wName, $sel[size($sel) - 1]); 1100 RelationAnimRangeToDagList($wName, $sel[size($sel) - 1]); 1101 } 1102} 1103 1104/****************************************************************************** 1105 double click animation range list CB 1106******************************************************************************/ 1107global proc nw4cSetAnimRange_OnDblClkAnimRangeList(string $wName) 1108{ 1109 string $animRange = GetCurrentAnimRange($wName); 1110 if ($animRange != "") 1111 { 1112 select -r $animRange; 1113 } 1114} 1115 1116/****************************************************************************** 1117 dag list menu CB 1118******************************************************************************/ 1119global proc nw4cSetAnimRange_OnMenuDagList(string $wName) 1120{ 1121 if (!`window -ex $wName`) 1122 { 1123 return; 1124 } 1125 1126 string $sel[] = `textScrollList -q -si ($wName + "DagList")`; 1127 int $en = false; 1128 if (size($sel)) 1129 { 1130 if (`objExists $sel[size($sel) - 1]`) 1131 { 1132 if (GetAnimRangeFromDag($sel[size($sel) - 1]) == "") 1133 { 1134 $en = true; 1135 } 1136 } 1137 } 1138 menuItem -e -en $en ($wName + "DagListMenuItem1"); 1139} 1140 1141/****************************************************************************** 1142 animation range list menu CB 1143******************************************************************************/ 1144global proc nw4cSetAnimRange_OnMenuAnimRangeList(string $wName) 1145{ 1146 if (!`window -ex $wName`) 1147 { 1148 return; 1149 } 1150 1151 string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`; 1152 int $en = false; 1153 string $animRange; 1154 if (size($sel)) 1155 { 1156 $animRange = $sel[size($sel) - 1]; 1157 if (`objExists $animRange`) 1158 { 1159 $en = true; 1160 } 1161 } 1162 menuItem -e -en $en ($wName + "AnimRangeListMenuItem2"); 1163 menuItem -e -en $en ($wName + "AnimRangeListMenuItem5"); 1164 1165 int $con = $en; 1166 if ($en) 1167 { 1168 if (GetDagFromAnimRange($animRange) != "") 1169 { 1170 $en = false; 1171 } 1172 else 1173 { 1174 $con = false; 1175 } 1176 } 1177 if ($en) 1178 { 1179 $sel = `textScrollList -q -ai ($wName + "DagList")`; 1180 string $list[]; 1181 string $dag; 1182 if (size($sel)) 1183 { 1184 for ($dag in $sel) 1185 { 1186 if (`objExists $dag`) 1187 { 1188 if (GetAnimRangeFromDag($dag) == "") 1189 { 1190 $list[size($list)] = $dag; 1191 } 1192 } 1193 } 1194 } 1195 if (size($list)) 1196 { 1197 popupMenu -e -dai ($wName + "AnimRangeListMenuItem3"); 1198 setParent -menu ($wName + "AnimRangeListMenuItem3"); 1199 for ($dag in $list) 1200 { 1201 menuItem -l $dag -c ("nw4cSetAnimRange_AttachAnimRange " + $wName + " " + $dag); 1202 } 1203 } 1204 else 1205 { 1206 $en = false; 1207 } 1208 } 1209 menuItem -e -en $en ($wName + "AnimRangeListMenuItem3"); 1210 menuItem -e -en $con ($wName + "AnimRangeListMenuItem4"); 1211} 1212 1213/****************************************************************************** 1214 create animation range 1215******************************************************************************/ 1216global proc nw4cSetAnimRange_CreateAnimRange(string $wName, string $mode) 1217{ 1218 if (!`window -ex $wName`) 1219 { 1220 return; 1221 } 1222 string $dag; 1223 if ($mode == "a") 1224 { 1225 string $sel[] = `textScrollList -q -si ($wName + "DagList")`; 1226 if (size($sel)) 1227 { 1228 $dag = $sel[size($sel) - 1]; 1229 } 1230 } 1231 string $animRange = CreateAnimRangeNode($wName, $dag); 1232 SetEditorCurrent($wName, $animRange); 1233} 1234 1235/****************************************************************************** 1236 duplicate animation range 1237******************************************************************************/ 1238global proc nw4cSetAnimRange_DuplicateAnimRange(string $wName) 1239{ 1240 if (!`window -ex $wName`) 1241 { 1242 return; 1243 } 1244 1245 string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`; 1246 if (size($sel)) 1247 { 1248 if (`objExists $sel[size($sel) - 1]`) 1249 { 1250 string $list[] = `ls -l -sl`; 1251 string $cpy[] = `duplicate $sel[size($sel) - 1]`;; 1252 if (`copyKey $sel[size($sel) - 1]`) 1253 { 1254 pasteKey $cpy[0]; 1255 } 1256 if (size($list)) 1257 { 1258 select -r $list; 1259 } 1260 else 1261 { 1262 select -cl; 1263 } 1264 1265 $sel = `listRelatives -pa -p $cpy[0]`; 1266 if (size($sel)) 1267 { 1268 $cpy[0] = ParentAnimRange($wName, $cpy[0], ""); 1269 } 1270 1271 SetEditorCurrent($wName, $cpy[0]); 1272 } 1273 } 1274} 1275 1276/****************************************************************************** 1277 delete animation range control 1278******************************************************************************/ 1279global proc nw4cSetAnimRange_DeleteAnimRangeCtrl(string $wName) 1280{ 1281 if (!`window -ex $wName`) 1282 { 1283 return; 1284 } 1285 string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`; 1286 if (size($sel)) 1287 { 1288 if (!ConfirmDialogCheckWin($wName, "Delete " + $sel[size($sel) - 1] + ".\n")) 1289 { 1290 return; 1291 } 1292 DeleteAnimRangeNode($sel[size($sel) - 1]); 1293 } 1294} 1295 1296/****************************************************************************** 1297 attach animation range 1298******************************************************************************/ 1299global proc nw4cSetAnimRange_AttachAnimRange(string $wName, string $dag) 1300{ 1301 if (!`window -ex $wName`) 1302 { 1303 return; 1304 } 1305 string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`; 1306 if (size($sel)) 1307 { 1308 if (`objExists $sel[size($sel) - 1]`) 1309 { 1310 if (`objExists $dag`) 1311 { 1312 $sel[size($sel) - 1] = ParentAnimRange($wName, $sel[size($sel) - 1], $dag); 1313 } 1314 } 1315 } 1316} 1317 1318/****************************************************************************** 1319 dettach animation range 1320******************************************************************************/ 1321global proc nw4cSetAnimRange_DeattachAnimRange(string $wName) 1322{ 1323 if (!`window -ex $wName`) 1324 { 1325 return; 1326 } 1327 string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`; 1328 if (size($sel)) 1329 { 1330 if (`objExists $sel[size($sel) - 1]`) 1331 { 1332 $sel[size($sel) - 1] = ParentAnimRange($wName, $sel[size($sel) - 1], ""); 1333 } 1334 } 1335} 1336 1337/****************************************************************************** 1338 file menu CB 1339******************************************************************************/ 1340global proc nw4cSetAnimRange_OnMenuFile(string $wName) 1341{ 1342 if (!`window -ex $wName`) 1343 { 1344 return; 1345 } 1346 int $en = false; 1347 string $animRange = GetCurrentAnimRange($wName); 1348 if ($animRange != "") 1349 { 1350 $en = true; 1351 } 1352 menuItem -e -en $en ($wName + "FileMenuItem1"); 1353 menuItem -e -en $en ($wName + "FileMenuItem2"); 1354} 1355 1356/****************************************************************************** 1357 get enabled time range array 1358******************************************************************************/ 1359proc GetEnabledTimeRangeArray(string $animRange, float $sf[], float $ef[]) 1360{ 1361 int $i; 1362 float $s[], $e[], $f[]; 1363 int $no = GetNumberOfClip(); 1364 for ($i = 0; $i < $no; ++$i) 1365 { 1366 if (`getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`) 1367 { 1368 $f = GetTimeRangeFromKey($animRange, $i); 1369 //if ($f[0] < $f[1]) 1370 if ($f[0] <= $f[1]) // if allow s = e // changed from original (2006/03/07) 1371 { 1372 $s[size($s)] = $f[0]; 1373 $e[size($e)] = $f[1]; 1374 } 1375 } 1376 } 1377 clear($sf); 1378 clear($ef); 1379 if (size($s)) 1380 { 1381 MergeFloatRangeArray($s, $e, $sf, $ef); 1382 } 1383} 1384 1385/****************************************************************************** 1386 make playback info 1387******************************************************************************/ 1388proc MakePlaybackInfo(string $wName, string $animRange) 1389{ 1390 int $i, $j, $l; 1391 float $f[], $sf[], $ef[]; 1392 int $no = GetNumberOfClip(); 1393 int $loop = `intField -q -v ($wName + "Loop")`; 1394 if ($loop <= 0) 1395 { 1396 $loop = 1; 1397 } 1398 1399 for ($i = 0; $i < $no; ++$i) 1400 { 1401 if (`getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`) 1402 { 1403 $f = GetTimeRangeFromKey($animRange, $i); 1404 $f[0] = (float)FloatToInt($f[0]); 1405 $f[1] = (float)FloatToInt($f[1]); 1406 if ($f[0] < $f[1]) 1407 { 1408 if (`getAttr ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]")`) 1409 { 1410 $l = $loop; 1411 } 1412 else 1413 { 1414 $l = 1; 1415 } 1416 for ($j = 0; $j < $l; ++$j) 1417 { 1418 $sf[size($sf)] = $f[0]; 1419 $ef[size($ef)] = $f[1]; 1420 } 1421 } 1422 } 1423 } 1424 1425 if (`window -ex ($wName + "AnimRange")`) 1426 { 1427 deleteUI ($wName + "AnimRange"); 1428 } 1429 window ($wName + "AnimRange"); 1430 formLayout; 1431 textScrollList ($wName + "sList"); 1432 textScrollList ($wName + "eList"); 1433 1434 for ($i = 0; $i < size($sf); ++$i) 1435 { 1436 textScrollList -e -a ((string)$sf[$i]) ($wName + "sList"); 1437 textScrollList -e -a ((string)$ef[$i]) ($wName + "eList"); 1438 } 1439 if (size($sf)) 1440 { 1441 if (`play -q -f`) 1442 { 1443 $i = 0; 1444 } 1445 else 1446 { 1447 $i = `size($sf)` - 1; 1448 } 1449 intField -v $i ($wName + "Pointer"); 1450 floatField -v `playbackOptions -q -min` ($wName + "OrgMin"); // backup 1451 floatField -v `playbackOptions -q -max` ($wName + "OrgMax"); // backup 1452 textField -tx `playbackOptions -q -l` ($wName + "Looping"); // backup 1453 playbackOptions -min $sf[$i] -max $ef[$i] -l "once"; 1454 if (`play -q -f`) 1455 { 1456 currentTime $sf[$i]; 1457 } 1458 else 1459 { 1460 currentTime $ef[$i]; 1461 } 1462 } 1463 else 1464 { 1465 play -st false; 1466 } 1467} 1468 1469/****************************************************************************** 1470 update playback button 1471******************************************************************************/ 1472proc UpdatePlaybackButton(string $wName) 1473{ 1474 if (!`window -ex $wName`) 1475 { 1476 return; 1477 } 1478 1479 int $en0 = true, $en1 = true; 1480 int $cmd0 = 1, $cmd1 = 2; 1481 int $playFlag = `isTrue "playingBack"`; 1482 int $animRangePlayFlag = `window -ex ($wName + "AnimRange")`; 1483 1484 if ($playFlag || $animRangePlayFlag) 1485 { 1486 if (!`checkBox -q -v ($wName + "PlaybackContinuous")`) 1487 { 1488 $en0 = $playFlag; 1489 $en1 = 0; 1490 $cmd0 = 0; // stop 1491 } 1492 else 1493 { 1494 $en0 = 0; 1495 $en1 = $playFlag; 1496 $cmd1 = 0; // stop 1497 } 1498 } 1499 1500 string $img0 = ($cmd0) ? 1501 "nw4cSetAnimRange_Play.bmp" : "nw4cSetAnimRange_Stop.bmp"; 1502 string $img1 = ($cmd1) ? 1503 "nw4cSetAnimRange_PlayLoop.bmp" : "nw4cSetAnimRange_Stop.bmp"; 1504 string $ann0 = ($cmd0) ? "AnimRange Once" : "Stop"; 1505 string $ann1 = ($cmd1) ? "AnimRange Continuous" : "Stop"; 1506 1507 symbolButton -e -en $en0 -i $img0 -w 26 -h 26 -ann $ann0 1508 -c ("nw4cSetAnimRange_OnPlaybackButton " + $wName + " " + $cmd0 + ";") 1509 ($wName + "PlayBtn0"); 1510 symbolButton -e -en $en1 -i $img1 -w 26 -h 26 -ann $ann1 1511 -c ("nw4cSetAnimRange_OnPlaybackButton " + $wName + " " + $cmd1 + ";") 1512 ($wName + "PlayBtn1"); 1513} 1514 1515/****************************************************************************** 1516 playback condition 1517******************************************************************************/ 1518global proc int nw4cSetAnimRange_PlaybackCondition(string $wName) 1519{ 1520 string $cmd; 1521 string $animRange; 1522 int $ret = false; 1523 int $i, $no; 1524 1525 if (`isTrue "playingBack"`) 1526 { 1527 if (!`window -ex $wName`) 1528 { 1529 return true; 1530 } 1531 if (`checkBox -q -v ($wName + "PlaybackEnable")`) 1532 { 1533 $animRange = GetCurrentAnimRange($wName); 1534 if ($animRange != "") 1535 { 1536 layout -e -en false ($wName + "Pane"); 1537 intField -e -en false ($wName + "Loop"); 1538 MakePlaybackInfo($wName, $animRange); 1539 } 1540 checkBox -e -v false ($wName + "PlaybackEnable"); 1541 } 1542 $ret = true; 1543 } 1544 else 1545 { 1546 if (`window -ex ($wName + "AnimRange")`) 1547 { 1548 if (`floatField -ex ($wName + "OrgMin")`) 1549 { 1550 if (`window -ex $wName`) 1551 { 1552 if (!`checkBox -q -v ($wName + "PlaybackStop")`) 1553 { 1554 int $fwd = `play -q -f`; 1555 string $s[] = `textScrollList -q -ai ($wName + "sList")`; 1556 string $e[] = `textScrollList -q -ai ($wName + "eList")`; 1557 if (size($s)) 1558 { 1559 $i = `intField -q -v ($wName + "Pointer")`; 1560 if ($fwd) 1561 { 1562 ++$i; 1563 if ($i >= size($s)) 1564 { 1565 if (`checkBox -q -v ($wName + "PlaybackContinuous")`) 1566 { 1567 $i = 0; 1568 } 1569 } 1570 } 1571 else 1572 { 1573 $i--; 1574 if ($i < 0) 1575 { 1576 if (`checkBox -q -v ($wName + "PlaybackContinuous")`) 1577 { 1578 $i = size($s) - 1; 1579 } 1580 } 1581 } 1582 if (0 <= $i && $i < size($s)) 1583 { 1584 intField -e -v $i ($wName + "Pointer"); 1585 playbackOptions -min $s[$i] -max $e[$i]; 1586 if ($fwd) 1587 { 1588 currentTime $s[$i]; 1589 } 1590 else 1591 { 1592 currentTime $e[$i]; 1593 } 1594 play -f $fwd; 1595 return true; 1596 } 1597 } 1598 1599 float $max1; 1600 if ($fwd) 1601 { 1602 $max1 = `playbackOptions -q -max`; 1603 } 1604 else 1605 { 1606 $max1 = `playbackOptions -q -min`; 1607 } 1608 // assistance "move to playback end" (Maya bugfix) 1609 currentTime $max1; 1610 } 1611 } 1612 playbackOptions -min `floatField -q -v ($wName + "OrgMin")` -max `floatField -q -v ($wName + "OrgMax")`; 1613 playbackOptions -l (`textField -q -tx ($wName + "Looping")`); 1614 } 1615 deleteUI ($wName + "AnimRange"); 1616 } 1617 1618 if (!`window -ex $wName`) 1619 { 1620 evalDeferred("nw4cSetAnimRange_PlaybackExit " + $wName); 1621 } 1622 else 1623 { 1624 if (!`layout -q -en ($wName + "Pane")`) 1625 { 1626 layout -e -en true ($wName + "Pane"); 1627 intField -e -en true ($wName + "Loop"); 1628 $animRange = GetCurrentAnimRange($wName); 1629 SetEditorCurrent($wName, $animRange); 1630 } 1631 } 1632 } 1633 1634 UpdatePlaybackButton($wName); 1635 1636 return $ret; 1637} 1638 1639/****************************************************************************** 1640 playback exit 1641******************************************************************************/ 1642global proc nw4cSetAnimRange_PlaybackExit(string $wName) 1643{ 1644 string $cnd[] = `scriptJob -lc`; 1645 if (IsStringInArray(($wName + "PlaybackCondition"), $cnd)) 1646 { 1647 condition -del ($wName + "PlaybackCondition"); 1648 } 1649} 1650 1651/****************************************************************************** 1652 compare float range 1653******************************************************************************/ 1654global proc int nw4cSetAnimRange_CompareFloatRange(string $str1, string $str2) 1655{ 1656 string $tokBuf1[], $tokBuf2[]; 1657 tokenize $str1 "," $tokBuf1; 1658 tokenize $str2 "," $tokBuf2; 1659 float $t1 = (float)$tokBuf1[0]; 1660 float $t2 = (float)$tokBuf2[0]; 1661 if ($t1 < $t2) 1662 { 1663 return -1; 1664 } 1665 if ($t1 > $t2) 1666 { 1667 return 1; 1668 } 1669 $t1 = (float)$tokBuf1[1]; 1670 $t2 = (float)$tokBuf2[1]; 1671 if ($t1 < $t2) 1672 { 1673 return -1; 1674 } 1675 if ($t1 > $t2) 1676 { 1677 return 1; 1678 } 1679 return 0; 1680} 1681 1682/****************************************************************************** 1683 substring title 1684******************************************************************************/ 1685proc string SubstringTitle(string $str) 1686{ 1687 string $retStr = ""; 1688 int $sz = size($str); 1689 if ($sz >= 10) 1690 { 1691 string $ex = `match "^[^,]+,[^,]+,[^,]+,[^,]+,[^,]+," $str`; 1692 int $len = size($ex); 1693 if ($sz > $len) 1694 { 1695 $retStr = substring($str, $len + 1, size($str)); 1696 } 1697 } 1698 return $retStr; 1699} 1700 1701/****************************************************************************** 1702 compare name 1703******************************************************************************/ 1704global proc int nw4cSetAnimRange_CompareName(string $str1, string $str2) 1705{ 1706 string $tokBuf1[], $tokBuf2[]; 1707 tokenize($str1, ",", $tokBuf1); 1708 $tokBuf1[5] = SubstringTitle($str1); 1709 tokenize($str2, ",", $tokBuf2); 1710 $tokBuf2[5] = SubstringTitle($str2); 1711 float $s1 = (float)$tokBuf1[2]; 1712 float $s2 = (float)$tokBuf2[2]; 1713 float $e1 = (float)$tokBuf1[3]; 1714 float $e2 = (float)$tokBuf2[3]; 1715 if ($s1 != $e1 && $s2 == $e2) 1716 { 1717 return -1; 1718 } 1719 if ($s1 == $e1 && $s2 != $e2) 1720 { 1721 return 1; 1722 } 1723 return `strcmp $tokBuf1[5] $tokBuf2[5]`; 1724} 1725 1726/****************************************************************************** 1727 compare time range 1728******************************************************************************/ 1729global proc int nw4cSetAnimRange_CompareTimeRange(string $str1, string $str2) 1730{ 1731 // 0 no 1732 // 1 enable 1733 // 2 start 1734 // 3 end 1735 // 4 loop 1736 // 5 name 1737 string $tokBuf1[], $tokBuf2[]; 1738 int $n; 1739 $n = tokenize($str1, ",", $tokBuf1); 1740 if ($n < 4) 1741 { 1742 return 0; 1743 } 1744 $n = tokenize($str2, ",", $tokBuf2); 1745 if ($n < 4) 1746 { 1747 return 0; 1748 } 1749 float $s1 = (float)$tokBuf1[2]; 1750 float $s2 = (float)$tokBuf2[2]; 1751 float $e1 = (float)$tokBuf1[3]; 1752 float $e2 = (float)$tokBuf2[3]; 1753 if ($s1 != $e1 && $s2 == $e2) 1754 { 1755 return -1; 1756 } 1757 if ($s1 == $e1 && $s2 != $e2) 1758 { 1759 return 1; 1760 } 1761 if ($s1 < $s2) 1762 { 1763 return -1; 1764 } 1765 if ($s1 > $s2) 1766 { 1767 return 1; 1768 } 1769 if ($e1 < $e2) 1770 { 1771 return -1; 1772 } 1773 if ($e1 > $e2) 1774 { 1775 return 1; 1776 } 1777 return nw4cSetAnimRange_CompareName($str1, $str2); 1778} 1779 1780/****************************************************************************** 1781 make animation range data string array 1782******************************************************************************/ 1783proc string[] MakeAnimRangeDataStringArray(string $animRange) 1784{ 1785 int $i; 1786 int $no = GetNumberOfClip(); 1787 float $f[]; 1788 string $array[]; 1789 for ($i = 0; $i < $no; ++$i) 1790 { 1791 $array[$i] = (string)($i + 1); 1792 $array[$i] = $array[$i] + "," + (string)`getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`; 1793 $f = GetTimeRangeFromKey($animRange, $i); 1794 $array[$i] = $array[$i] + "," + ((string)$f[0] + "," + (string)$f[1]); 1795 $array[$i] = $array[$i] + "," + (string)`getAttr ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]")`; 1796 $array[$i] = $array[$i] + "," + `getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")`; 1797 } 1798 return $array; 1799} 1800 1801/****************************************************************************** 1802 set animation range data from string array 1803******************************************************************************/ 1804proc SetAnimRangeDataFromStringArray(string $wName, string $animRange, string $array[]) 1805{ 1806 int $i, $n, $enable; 1807 int $no = GetNumberOfClip(); 1808 string $tokBuf[]; 1809 float $s, $e; 1810 for ($i = 0; $i < $no; ++$i) 1811 { 1812 EnableKeyChangeScript($wName, $animRange, $i, false); 1813 $n = tokenize($array[$i], ",", $tokBuf); 1814 $enable = (int)$tokBuf[1]; 1815 setAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]") $enable; 1816 cutKey -cl -at ("nw4c_AnimRange" + $i) $animRange; 1817 setAttr -c ($animRange + "." + "nw4c_AnimRange" + $i) 0; 1818 setAttr ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]") ((int)$tokBuf[4]); 1819 1820 $tokBuf[5] = SubstringTitle($array[$i]); 1821 setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]") $tokBuf[5]; 1822 1823 $s = (float)$tokBuf[2]; 1824 $e = (float)$tokBuf[3]; 1825 //if ($s != $e) 1826 if ($s != $e || $s != 0 || $enable) // if allow s = e // changed from original (2006/04/07) 1827 { 1828 SetTimeRangeToKey($wName, $animRange, $i, $s, $e); 1829 } 1830 EnableKeyChangeScript($wName, $animRange, $i, true); 1831 } 1832} 1833 1834/****************************************************************************** 1835 sort pack 1836******************************************************************************/ 1837global proc nw4cSetAnimRange_SortPack(string $wName, string $mode) 1838{ 1839 string $animRange = GetCurrentAnimRange($wName); 1840 if ($animRange != "") 1841 { 1842 string $array[] = MakeAnimRangeDataStringArray($animRange); 1843 if ($mode == "t") 1844 { 1845 $array = QsortStringArray($array, "nw4cSetAnimRange_CompareTimeRange"); 1846 } 1847 else 1848 { 1849 $array = QsortStringArray($array, "nw4cSetAnimRange_CompareName"); 1850 } 1851 SetAnimRangeDataFromStringArray($wName, $animRange, $array); 1852 SetEditorCurrent($wName, $animRange); 1853 } 1854} 1855 1856/****************************************************************************** 1857 set unique animation range name 1858******************************************************************************/ 1859// added (2006/01/23) 1860proc SetUniqueAnimRangeName(string $animRange, int $idst) 1861{ 1862 int $no = GetNumberOfClip(); 1863 string $base = `getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $idst + "]")`; 1864 string $name = $base; 1865 int $id = 1; 1866 1867 while (1) 1868 { 1869 int $found = false; 1870 int $i; 1871 for ($i = 0; $i < $no; ++$i) 1872 { 1873 if ($i != $idst) 1874 { 1875 string $other = `getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")`; 1876 if ($other == $name) 1877 { 1878 $found = true; 1879 break; 1880 } 1881 } 1882 } 1883 if ($found) 1884 { 1885 $name = $base + "_" + $id; 1886 ++$id; 1887 } 1888 else 1889 { 1890 break; 1891 } 1892 } 1893 1894 if ($id > 1) 1895 { 1896 setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $idst + "]") 1897 $name; 1898 //trace ("unique: " + $base + " -> " + $name); 1899 } 1900} 1901 1902/****************************************************************************** 1903 drag animation range 1904******************************************************************************/ 1905global proc string[] nw4cSetAnimRange_DragAnimRange(string $wName, 1906 string $dragControl, int $x, int $y, int $mods) 1907{ 1908 string $msgs[]; 1909 if (!`window -ex $wName`) 1910 { 1911 return $msgs; 1912 } 1913 if ($mods != 0 && $mods != 2) 1914 { 1915 return $msgs; 1916 } 1917 string $i = match("[0-9]+$", $dragControl); 1918 if ($i != "") 1919 { 1920 $msgs[0] = $wName + "Clip"; 1921 if ($mods == 0) 1922 { 1923 $msgs[1] = "Move"; 1924 } 1925 else if ($mods == 2) // ctrl 1926 { 1927 $msgs[1] = "Copy"; 1928 } 1929 $msgs[2] = $i; 1930 } 1931 return $msgs; 1932} 1933 1934/****************************************************************************** 1935 drop animation range 1936 1937 $msgs[0] $wName + "Clip" 1938 $msgs[1] "Move" or "Copy" 1939 $msgs[2] clip index of drag item (source) 1940******************************************************************************/ 1941global proc nw4cSetAnimRange_DropAnimRange(string $wName, 1942 string $dragControl, string $dropControl, string $msgs[], 1943 int $x, int $y, int $type) 1944{ 1945 if (!`window -ex $wName`) 1946 { 1947 return; 1948 } 1949 1950 //if ($type != 2) 1951 // return; 1952 1953 if ($msgs[0] == $wName + "Clip") 1954 { 1955 string $i = match("[0-9]+$", $dropControl); 1956 if ($i != "" && $msgs[2] != "" && $i != $msgs[2]) 1957 { 1958 int $s = (int)$msgs[2]; 1959 int $d = (int)$i; 1960 string $animRange = GetCurrentAnimRange($wName); 1961 if ($animRange != "") 1962 { 1963 string $array[] = MakeAnimRangeDataStringArray($animRange); 1964 string $result[]; 1965 int $j, $k = 0; 1966 int $no = GetNumberOfClip(); 1967 if ($msgs[1] == "Move") 1968 { 1969 for ($j = 0; $j < $no; ++$j) 1970 { 1971 if ($j == $s) 1972 { 1973 continue; 1974 } 1975 if ($s < $d) 1976 { 1977 $result[$k++] = $array[$j]; 1978 } 1979 if ($j == $d) 1980 { 1981 $result[$k++] = $array[$s]; 1982 } 1983 if ($s > $d) 1984 { 1985 $result[$k++] = $array[$j]; 1986 } 1987 } 1988 } 1989 else if ($msgs[1] == "Copy") 1990 { 1991 for ($j = 0; $j < $no; ++$j) 1992 { 1993 if ($j == $d) 1994 { 1995 $result[$k++] = $array[$s]; 1996 } 1997 else 1998 { 1999 $result[$k++] = $array[$j]; 2000 } 2001 } 2002 } 2003 SetAnimRangeDataFromStringArray($wName, $animRange, $result); 2004 // changed from original (2006/01/23) 2005 if ($msgs[1] == "Copy") 2006 { 2007 SetUniqueAnimRangeName($animRange, $d); 2008 } 2009 SetEditorCurrent($wName, $animRange); 2010 } 2011 } 2012 } 2013} 2014 2015/****************************************************************************** 2016 import animation range proc (called from animation range file) 2017 2018 $orgAnimRange is not used 2019******************************************************************************/ 2020global proc nw4cSetAnimRange_ImportAnimRangeProc(string $wName, 2021 string $exprotVer, string $orgAnimRange, string $list[]) 2022{ 2023 string $animRange = GetCurrentAnimRange($wName); 2024 if ($animRange == "") 2025 { 2026 return; 2027 } 2028 if ($exprotVer != "1.00") // check version 2029 { 2030 return; 2031 } 2032 string $array[], $titles[], $tokBuf[]; 2033 string $str; 2034 float $s, $e; 2035 int $no = GetNumberOfClip(); 2036 int $i; 2037 for ($str in $list) 2038 { 2039 clear($tokBuf); 2040 if (tokenize($str, ", \r\n\t", $tokBuf) < 6) 2041 { 2042 continue; 2043 } 2044 $i = $tokBuf[0]; 2045 if ($i <= 0 || $i > $no) 2046 { 2047 continue; 2048 } 2049 $i--; 2050 2051 $s = (float)$tokBuf[2]; 2052 $e = (float)$tokBuf[3]; 2053 if ($s > $e) // check range 2054 { 2055 continue; 2056 } 2057 if (match("[^0-9a-zA-Z_]", $tokBuf[5]) != "") // check title 2058 { 2059 continue; 2060 } 2061 $array[$i] = $tokBuf[0] + "," + $tokBuf[1] + "," + $tokBuf[2] + "," + $tokBuf[3] + "," + $tokBuf[4] + "," + $tokBuf[5]; 2062 $titles[$i] = $tokBuf[5]; 2063 } 2064 2065 int $ret = false; 2066 if (size($array) == $no) // check number of channels 2067 { 2068 for ($i = 0; $i < $no; ++$i) 2069 { 2070 if ($array[$i] == "") // check title 2071 { 2072 break; 2073 } 2074 } 2075 if ($i == $no) // check number of channels 2076 { 2077// enabled import animation range channel -> disabled current animation range channel 2078// string $currentArray[] = MakeAnimRangeDataStringArray($animRange); 2079// string $currentTitles[]; 2080// int $j = 0; 2081// for ($i = 0; $i < $no; ++$i) 2082// { 2083// clear $tokBuf; 2084// tokenize $currentArray[$i] ", \r\n\t" $tokBuf; 2085// $currentTitles[$i] = $tokBuf[5]; 2086// if ($tokBuf[1] == "1") // enable 2087// continue; 2088// 2089// clear $tokBuf; 2090// tokenize $array[$j] ", \r\n\t" $tokBuf; 2091// if ($tokBuf[1] == "1") // enable 2092// { 2093// $currentArray[$i] = $array[$j]; 2094// $currentTitles[$i] = $tokBuf[5]; 2095// $j++; 2096// } 2097// } 2098// $currentTitles = stringArrayRemoveDuplicates($currentTitles); // check title 2099// if (size($currentTitles) == $no) 2100// { 2101// SetAnimRangeDataFromStringArray($wName, $animRange, $currentArray); 2102// SetEditorCurrent($wName, $animRange); 2103// 2104// for (; $j<$no; $j++) 2105// { 2106// clear $tokBuf; 2107// tokenize $array[$j] ", \r\n\t" $tokBuf; 2108// if ($tokBuf[1] == "1") // enable 2109// { 2110// warning ("Remain channels in import file. <" + $wName + ">"); 2111// break; 2112// } 2113// } 2114// 2115// $ret = true; 2116// } 2117// else 2118// DoError ("Found same title as current nw4c_AnimRangeCtrl in import file. <" + $wName + ">"); 2119// overwrite all 2120// $titles = stringArrayRemoveDuplicates($titles); // check title 2121// if (size($titles) == $no) 2122// { 2123// SetAnimRangeDataFromStringArray($wName, $animRange, $array); 2124// SetEditorCurrent($wName, $animRange); 2125// $ret = true; 2126// } 2127// overwrite title or title and range 2128 $titles = stringArrayRemoveDuplicates($titles); // check title 2129 if (size($titles) == $no) 2130 { 2131 string $opt = `confirmDialog -t "Import Option" 2132 -m "Select Import Type." -p $wName 2133 -b "All" -b "Title and Range" -b "Only Title" -b "Cancel" 2134 -db "All" -cb "Cancel" -ds "Cancel"`; 2135 if ($opt != "Cancel") 2136 { 2137 string $currentArray[] = MakeAnimRangeDataStringArray($animRange); 2138 string $tokBufTemp[]; 2139 for ($i = 0; $i < $no; ++$i) 2140 { 2141 clear($tokBuf); 2142 tokenize($currentArray[$i], ", \r\n\t", $tokBuf); 2143 2144 clear($tokBufTemp); 2145 tokenize($array[$i], ", \r\n\t", $tokBufTemp); 2146 2147 $tokBuf[5] = $tokBufTemp[5]; // title 2148 if ($opt != "Only Title") 2149 { 2150 $tokBuf[2] = $tokBufTemp[2]; // start 2151 $tokBuf[3] = $tokBufTemp[3]; // end 2152 } 2153 if ($opt == "All") 2154 { 2155 $tokBuf[1] = $tokBufTemp[1]; // enable 2156 $tokBuf[4] = $tokBufTemp[4]; // loop 2157 } 2158 $currentArray[$i] = $tokBuf[0] + "," + $tokBuf[1] + "," + $tokBuf[2] + "," + $tokBuf[3] + "," + $tokBuf[4] + "," + $tokBuf[5]; 2159 } 2160 SetAnimRangeDataFromStringArray($wName, $animRange, $currentArray); 2161 SetEditorCurrent($wName, $animRange); 2162 } 2163 $ret = true; 2164 } 2165 } 2166 } 2167 if (!$ret) 2168 { 2169 DoError("Invalid import file. <" + $wName + ">"); 2170 } 2171} 2172 2173/****************************************************************************** 2174 import animation range CB 2175******************************************************************************/ 2176global proc int nw4cSetAnimRange_ImportAnimRangeCB(string $wName, 2177 string $fileName, string $fileType) 2178{ 2179 //string $abRet[]; 2180 //catch($abRet = nw4c_ABGetLatest("", { $fileName })); 2181 2182 int $fh = fopen($fileName, "r"); 2183 if ($fh == 0) 2184 { 2185 return false; 2186 } 2187 string $str = fgetline($fh); 2188 $str = match("^nw4cSetAnimRange_ImportAnimRangeProc", $str); 2189 fclose($fh); 2190 2191 if ($str == "") 2192 { 2193 DoError("Not exported file. <" + $wName + ">"); 2194 return false; 2195 } 2196 2197 eval("source \"" + $fileName + "\""); 2198 2199 // save last accessed folder 2200 optionVar -sv nw4cSetAnimRange_AnimRangeFileFolder `dirname $fileName`; 2201 2202 return true; 2203} 2204 2205/****************************************************************************** 2206 write file export animation range 2207******************************************************************************/ 2208proc int WriteFileExportAnimRange(string $wName, string $animRange, string $fileName) 2209{ 2210 int $fh = fopen($fileName, "w"); 2211 if ($fh == 0) 2212 { 2213 return false; 2214 } 2215 string $str = "nw4cSetAnimRange_ImportAnimRangeProc(\r\n\t\"" + $wName + 2216 "\",\r\n\t\"1.00\",\r\n\t\"" + $animRange + "\",\r\n"; 2217 fprint($fh, $str); 2218 string $list[] = MakeAnimRangeDataStringArray($animRange); 2219 $str = "\t{\r\n"; 2220 int $i; 2221 for ($i = 0; $i < size($list); ++$i) 2222 { 2223 $str += ("\t\t\"" + $list[$i] + "\""); 2224 if ($i < (size($list) - 1)) 2225 { 2226 $str += ","; 2227 } 2228 $str += "\r\n"; 2229 } 2230 $str += "\t}\r\n"; 2231 $str += ");\r\n"; 2232 fprint($fh, $str); 2233 fclose($fh); 2234 return true; 2235} 2236 2237/****************************************************************************** 2238 export animation range CB 2239******************************************************************************/ 2240global proc int nw4cSetAnimRange_ExportAnimRangeCB(string $wName, 2241 string $fileName, string $fileType) 2242{ 2243 string $animRange = GetCurrentAnimRange($wName); 2244 if ($animRange == "") 2245 { 2246 return false; 2247 } 2248 2249 //string $abRet[]; 2250 //int $abCheckout = false; 2251 //if (!catch($abRet = nw4c_ABCheckOut("", { $fileName }))) 2252 // $abCheckout = $abRet[0]; 2253 2254 int $ret = WriteFileExportAnimRange($wName, $animRange, $fileName); 2255 2256 //if ($abCheckout) 2257 // catch($abRet = nw4c_ABCheckIn("", { $fileName })); 2258 2259 // save last accessed folder 2260 optionVar -sv nw4cSetAnimRange_AnimRangeFileFolder `dirname $fileName`; 2261 2262 return $ret; 2263} 2264 2265/****************************************************************************** 2266 get animation range win dir 2267******************************************************************************/ 2268proc string GetAnimRangeFileFolder(string $wName, int $md) 2269{ 2270 string $path; 2271 if (`optionVar -ex nw4cSetAnimRange_AnimRangeFileFolder`) 2272 { 2273 $path = `optionVar -q nw4cSetAnimRange_AnimRangeFileFolder`; 2274 if (`filetest -d $path`) 2275 { 2276 return $path; 2277 } 2278 } 2279 $path = `workspace -q -rd`; 2280 if (`filetest -d $path`) 2281 { 2282 return $path; 2283 } 2284 return ""; 2285} 2286 2287/****************************************************************************** 2288 import animation range 2289******************************************************************************/ 2290global proc nw4cSetAnimRange_ImportAnimRange(string $wName) 2291{ 2292 string $animRange = GetCurrentAnimRange($wName); 2293 if ($animRange == "") 2294 { 2295 return; 2296 } 2297 string $path = GetAnimRangeFileFolder($wName, true); 2298 if ($path == "") 2299 { 2300 return; 2301 } 2302 string $old = `workspace -q -dir`; 2303 workspace -dir $path; 2304 fileBrowserDialog -m 0 -fc ("nw4cSetAnimRange_ImportAnimRangeCB " + $wName) 2305 -an "Import" -ft "mel"; 2306 workspace -dir $old; 2307 2308 // title bar doesn't become active (Maya bugfix) 2309 catch(setFocus(`getPanel -wf`)); 2310 showWindow $wName; 2311} 2312 2313/****************************************************************************** 2314 export animation range 2315******************************************************************************/ 2316global proc nw4cSetAnimRange_ExportAnimRange(string $wName) 2317{ 2318 string $animRange = GetCurrentAnimRange($wName); 2319 if ($animRange == "") 2320 { 2321 return; 2322 } 2323 string $path = GetAnimRangeFileFolder($wName, true); 2324 if ($path == "") 2325 { 2326 return; 2327 } 2328 string $old = `workspace -q -dir`; 2329 workspace -dir $path; 2330 fileBrowserDialog -m 1 -fc ("nw4cSetAnimRange_ExportAnimRangeCB " + $wName) 2331 -an "Export" -ft "mel"; 2332 workspace -dir $old; 2333 2334 // title bar doesn't become active (Maya bugfix) 2335 catch(setFocus(`getPanel -wf`)); 2336 showWindow $wName; 2337} 2338 2339/****************************************************************************** 2340 call editor (Graph Editor / Dope Sheet) 2341******************************************************************************/ 2342global proc nw4cSetAnimRange_CallEditor(string $wName, string $cmd) 2343{ 2344 string $node; 2345 $node = GetCurrentDag($wName); 2346 if ($node == "") 2347 { 2348 $node = GetCurrentAnimRange($wName); 2349 } 2350 if ($node != "") 2351 { 2352 select -r $node; 2353 } 2354 eval($cmd); 2355} 2356 2357/****************************************************************************** 2358 editor menu CB 2359******************************************************************************/ 2360global proc nw4cSetAnimRange_OnMenuEditor(string $wName, int $i) 2361{ 2362 if (!`window -ex $wName`) 2363 { 2364 return; 2365 } 2366 2367 menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item1"); // animation range from selected range 2368 menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item2"); // animation range from playback range 2369 menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item3"); // animation range from scene range 2370 menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item4"); // playback from selected animation range 2371 menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item5"); // select animation range anim curve 2372 menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item6"); // select animation range hierarchy anim curve 2373 menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item9"); // delete selected animation range 2374 2375 int $en; 2376 if ($i) 2377 { 2378 $en = true; 2379 } 2380 else 2381 { 2382 $en = false; 2383 } 2384 menuItem -e -en $en ($wName + "EditorMenu" + $i + "Item7"); // move up 2385 2386 if ($i < (GetNumberOfClip() - 1)) 2387 { 2388 $en = true; 2389 } 2390 else 2391 { 2392 $en = false; 2393 } 2394 menuItem -e -en $en ($wName + "EditorMenu" + $i + "Item8"); // move down 2395 2396 $en = false; 2397 if (`checkBox -q -v ($wName + "ClipEnable" + $i)`) 2398 { 2399 if (GetCurrentDag($wName) != "") 2400 { 2401 $en = true; 2402 } 2403 } 2404 menuItem -e -en $en ($wName + "EditorMenu" + $i + "Item10"); // add key to hierarchy from selected animation range 2405 2406 $en = false; 2407 if (GetCurrentDag($wName) != "") 2408 { 2409 $en = true; 2410 } 2411 menuItem -e -en $en ($wName + "EditorMenu" + $i + "Item11"); // add key to hierarchy from enable animation range 2412} 2413 2414/****************************************************************************** 2415 get time range 2416******************************************************************************/ 2417global proc nw4cSetAnimRange_GetTimeRange(string $wName, int $i, string $mode) 2418{ 2419 if (!`window -ex $wName`) 2420 { 2421 return; 2422 } 2423 2424 float $s, $e; 2425 if ($mode == "s") // playback from selected animation range 2426 { 2427 nw4cSetAnimRange_OnKeyChangeUI($wName, $i, "s"); 2428 $s = `floatField -q -v ($wName + "ClipStart" + $i)`; 2429 $e = `floatField -q -v ($wName + "ClipEnd" + $i)`; 2430 // changed from original (2006/03/07) 2431 // set start frame later to avoid adjusting start frame when (s = e) 2432 playbackOptions -max `FloatToInt $e`; 2433 playbackOptions -min `FloatToInt $s`; 2434 } 2435 else if ($mode == "m") // playback from enable animation range 2436 { 2437 string $animRange = GetCurrentAnimRange($wName); 2438 if ($animRange != "") 2439 { 2440 float $sf[], $ef[]; 2441 GetEnabledTimeRangeArray($animRange, $sf, $ef); 2442 if (size($sf)) 2443 { 2444 // changed from original (2006/03/07) 2445 // set start frame later to avoid adjusting start frame when (s = e) 2446 playbackOptions -max `FloatToInt ($ef[size($ef) - 1])`; 2447 playbackOptions -min `FloatToInt $sf[0]`; 2448 } 2449 } 2450 } 2451 else 2452 { 2453 if ($mode == "t") // animation range from selected range 2454 { 2455 string $list[] = `lsUI -ctl`; 2456 string $item; 2457 for ($item in $list) 2458 { 2459 if (`objectType $item` == "timeControl") 2460 { 2461 string $rng = `timeControl -q -rng $item`; 2462 string $tokBuf[]; 2463 tokenize($rng, "\"", $tokBuf); 2464 tokenize($tokBuf[0], ":", $tokBuf); 2465 $s = (float)$tokBuf[0]; 2466 $e = (float)$tokBuf[1]; 2467 break; 2468 } 2469 } 2470 } 2471 else if ($mode == "p") // animation range from playback range 2472 { 2473 $s = `playbackOptions -q -min`; 2474 $e = `playbackOptions -q -max`; 2475 } 2476 else if ($mode == "a") // animation range from scene range 2477 { 2478 $s = `playbackOptions -q -ast`; 2479 $e = `playbackOptions -q -aet`; 2480 } 2481 DisplayTimeRange($wName, $i, $s, $e); 2482 nw4cSetAnimRange_OnKeyChangeUI($wName, $i, "s"); 2483 } 2484} 2485 2486/****************************************************************************** 2487 select time range key 2488******************************************************************************/ 2489global proc nw4cSetAnimRange_SelectTimeRangeKey(string $wName, int $i) 2490{ 2491 string $node; 2492 $node = GetCurrentDag($wName); 2493 if ($node == "") 2494 { 2495 $node = GetCurrentAnimRange($wName); 2496 } 2497 if ($node != "") 2498 { 2499 select -r $node; 2500 } 2501 2502 $node = GetCurrentAnimRange($wName); 2503 if ($node != "") 2504 { 2505 selectKey -add -k ($node + "." + "nw4c_AnimRange" + $i); 2506 } 2507} 2508 2509/****************************************************************************** 2510 AE expand names 2511******************************************************************************/ 2512// in others/showEditor.mel 2513proc string[] AEexpandNames(string $array[]) 2514{ 2515 string $retval[]; 2516 string $buffer[]; 2517 for ($i = 0; $i < size($array); ++$i) 2518 { 2519 $buffer = `ls -l $array[$i]`; 2520 for ($j = 0; $j < size($buffer); ++$j) 2521 { 2522 $retval[size($retval)] = $buffer[$j]; 2523 } 2524 clear($buffer); 2525 } 2526 return $retval; 2527} 2528 2529/****************************************************************************** 2530 AE filter unwanted nodes 2531******************************************************************************/ 2532// in others/showEditor.mel 2533proc string[] AEfilterUnwantedNodes(string $array[]) 2534{ 2535 string $retVal[]; 2536 string $nodeType; 2537 int $count, $i, $j = 0; 2538 2539 $count = size($array); 2540 for ($i = 0; $i < $count; ++$i) 2541 { 2542 $nodeType = `nodeType $array[$i]`; 2543 // Remove Referenced Fur Globals from a list 2544 int $refFurGlobal = `reference -q -inr $array[$i]`; 2545 if (!($nodeType == "renderGlobals" || 2546 ($nodeType == "FurGlobals" && $refFurGlobal))) 2547 { 2548 $retVal[$j] = $array[$i]; 2549 ++$j; 2550 } 2551 } 2552 2553 return $retVal; 2554} 2555 2556/****************************************************************************** 2557 AE get related nodes 2558******************************************************************************/ 2559// in others/showEditor.mel 2560proc string[] AEgetRelatedNodes(string $node) 2561{ 2562 string $rNodes[], $retval[], $tmpNodes[]; 2563 string $nodeNameType = `nodeType $node`; 2564 string $relatedScript = ("AE"+$nodeNameType+"Related"); 2565 2566 if (`exists $relatedScript`) 2567 { 2568 $tmpNodes = `eval($relatedScript + " \"" + $node + "\"")`; 2569 $rNodes = AEexpandNames($tmpNodes); 2570 } 2571 else 2572 { 2573 string $focusNode[]; 2574 $tmpNodes = `defaultNavigation -ren -d $node`; 2575 $tmpNodes = AEfilterUnwantedNodes($tmpNodes); 2576 $rNodes = AEexpandNames($tmpNodes); 2577 $focusNode[0] = `defaultNavigation -dwn -d $node`; 2578 clear($tmpNodes); 2579 $tmpNodes = AEexpandNames($focusNode); 2580 $rNodes[size($rNodes)] = $tmpNodes[0]; 2581 } 2582 // the first item in the return string array is the node itself 2583 // 2584 clear($tmpNodes); 2585 $tmpNodes[0] = $node; 2586 $retval = AEexpandNames($tmpNodes); 2587 2588 // need to go through the string array and remove unwanted 2589 // duplicates 2590 // 2591 for ($i = 0; $i < size($rNodes)-1; ++$i) 2592 { 2593 $duplicated = false; 2594 for ($j = 0; $j < size($retval); ++$j) 2595 { 2596 if ($rNodes[$i] == $retval[$j]) 2597 { 2598 $duplicated = true; 2599 break; 2600 } 2601 } 2602 if (!$duplicated) 2603 { 2604 $retval[size($retval)] = $rNodes[$i]; 2605 } 2606 } 2607 2608 // now search for the last item in the $retval for a duplicate 2609 // 2610 string $lastNode = $rNodes[size($rNodes)-1]; 2611 $duplicated = false; 2612 for ($i = 0; $i < size($retval); ++$i) 2613 { 2614 if ($lastNode == $retval[$i]) 2615 { 2616 $duplicated = true; 2617 break; 2618 } 2619 } 2620 2621 if (!$duplicated) 2622 { 2623 $retval[size($retval)] = $node; 2624 } 2625 else 2626 { 2627 $retval[size($retval)] = $lastNode; 2628 } 2629 2630 return $retval; 2631} 2632 2633/****************************************************************************** 2634 fix AE get related nodes 2635******************************************************************************/ 2636proc string[] FixAEgetRelatedNodes(string $node) 2637{ 2638 string $list[] = AEgetRelatedNodes($node); 2639 2640 // shader search (Maya bugfix) 2641 string $shape[] = `ls -s $list`; 2642 string $workList[], $tmp[]; 2643 string $work, $item; 2644 for ($work in $shape) 2645 { 2646 $workList = `listConnections -t "shadingEngine" $work`; 2647 $workList = stringArrayRemoveDuplicates($workList); 2648 for ($item in $workList) 2649 { 2650 $tmp = `listConnections ($item + ".surfaceShader")`; 2651 if (size($tmp)) 2652 { 2653 if (!IsStringInArray($tmp[0], $list)) 2654 { 2655 $list[size($list)] = $tmp[0]; 2656 } 2657 } 2658 } 2659 } 2660 return $list; 2661} 2662 2663/****************************************************************************** 2664 ls material 2665******************************************************************************/ 2666proc string[] LsMaterial(string $list[]) 2667{ 2668 string $tmpList[]; 2669 if (size($list)) 2670 { 2671 $tmpList = `ls -mat $list`; 2672 } 2673 string $workList[], $retList[]; 2674 string $temp, $work; 2675 for ($temp in $tmpList) 2676 { 2677 $work = `nodeType $temp`; 2678 $workList = `getClassification $work`; 2679 if (match("^shader/surface", $workList[0]) != "") 2680 { 2681 $retList[size($retList)] = $temp; 2682 } 2683 } 2684 return $retList; 2685} 2686 2687/****************************************************************************** 2688 get selected key time list 2689******************************************************************************/ 2690proc string[] GetSelectedKeyTimeList() 2691{ 2692 string $sel[] = `keyframe -q -sl -n`; 2693 string $org[]; 2694 float $key[]; 2695 int $i, $j; 2696 // make list (attr_name, time[0], time[1], time[2], ...) 2697 for ($i = 0; $i < size($sel); ++$i) 2698 { 2699 $org[$i] = $sel[$i]; 2700 $key = `keyframe -q -sl $org[$i]`; 2701 for ($j = 0; $j < size($key); ++$j) 2702 { 2703 $org[$i] = $org[$i] + "," + $key[$j]; 2704 } 2705 } 2706 return $org; 2707} 2708 2709/****************************************************************************** 2710 select key time list 2711******************************************************************************/ 2712proc SelectKeyTimeList(string $list[]) 2713{ 2714 int $i, $j; 2715 string $tokBuf[]; 2716 if (`keyframe -q -kc`) 2717 { 2718 selectKey -cl; 2719 } 2720 string $arg; 2721 for ($i = 0; $i < size($list); ++$i) 2722 { 2723 clear($tokBuf); 2724 tokenize($list[$i], ",", $tokBuf); 2725 $arg = ""; 2726 for ($j = 1; $j < size($tokBuf); ++$j) 2727 { 2728 $arg += (" -t " + ((float)$tokBuf[$j])); 2729 } 2730 if ($arg != "") 2731 { 2732 eval("selectKey -add -k" + $arg + " " + $tokBuf[0]); 2733 } 2734 } 2735} 2736 2737/****************************************************************************** 2738 search connect key attr 2739******************************************************************************/ 2740proc string SearchConnectKeyAttr(string $src) 2741{ 2742 string $node[] = `listConnections -p false ($src + ".output")`; 2743 if (!size($node)) 2744 { 2745 return ""; 2746 } 2747 string $plug[] = `listConnections -p true ($src + ".output")`; 2748 2749 if (`nodeType $node[0]` == "mute" && ($node[0] + ".input") == $plug[0]) 2750 { 2751 return SearchConnectKeyAttr($node[0]); 2752 } 2753 else 2754 { 2755 return $plug[0]; 2756 } 2757} 2758 2759/****************************************************************************** 2760 is driven anim 2761******************************************************************************/ 2762proc int IsDrivenAnim(string $anim) 2763{ 2764 string $plug = SearchConnectKeyAttr($anim); 2765 if ($plug != "") 2766 { 2767 string $drv[] = `setDrivenKeyframe -q -dr $plug`; 2768 if (size($drv)) 2769 { 2770 if ($drv[0] != "No drivers.") 2771 { 2772 return true; 2773 } 2774 } 2775 } 2776 return false; 2777} 2778 2779/****************************************************************************** 2780 select hierarchy time range 2781******************************************************************************/ 2782global proc nw4cSetAnimRange_SelectHierarchyTimeRange(string $wName, int $i) 2783{ 2784 if ((`getModifiers` % 2) != 1) // != shift 2785 { 2786 if (`keyframe -q -kc`) 2787 { 2788 selectKey -cl; 2789 } 2790 } 2791 2792 string $node = GetCurrentDag($wName); // top dag 2793 if ($node == "") 2794 { 2795 return; 2796 } 2797 string $animRange = GetCurrentAnimRange($wName); 2798 if ($animRange == "") 2799 { 2800 return; 2801 } 2802 nw4cSetAnimRange_OnKeyChangeUI($wName, $i, "s"); 2803 float $s = `floatField -q -v ($wName + "ClipStart" + $i)`; 2804 float $e = `floatField -q -v ($wName + "ClipEnd" + $i)`; 2805 if ($s >= $e) 2806 { 2807 return; 2808 } 2809 2810 // if loop, select key at (endFrame + 1) 2811 // changed from original (2006/01/23) 2812 //if (`checkBox -q -v ($wName + "ClipLoop" + $i)`) 2813 //{ 2814 // ++$e; 2815 //} 2816 2817 waitCursor -state on; 2818 string $selKey[] = GetSelectedKeyTimeList(); 2819 string $sel[] = `ls -sl`; 2820 2821 select -r $node; 2822 select -hi; 2823 string $list[] = `ls -sl`; 2824 string $item; 2825 string $tree[]; // related node list 2826 string $workList[]; 2827 for ($item in $list) 2828 { 2829 $workList = FixAEgetRelatedNodes($item); 2830 if (size($workList)) 2831 { 2832 $tree = stringArrayCatenate($tree, $workList); 2833 } 2834 } 2835 $tree = stringArrayRemoveDuplicates($tree); 2836 $tree = `ls $tree`; // full path -> fine path 2837 $workList = GetAnimRangeList(); 2838 $tree = stringArrayRemove($workList, $tree); // exclude animation range node 2839 $tree[size($tree)] = $animRange + ".nw4c_AnimRange" + $i; // add specified animation range 2840 2841 // for custom effect of material 2842 $workList = LsMaterial($tree); 2843 if (size($workList)) 2844 { 2845 $workList = `listHistory $workList`; 2846 if (size($workList)) 2847 { 2848 $workList = stringArrayRemoveDuplicates($workList); 2849 $tree = stringArrayCatenate($tree, $workList); 2850 $tree = stringArrayRemoveDuplicates($tree); 2851 } 2852 } 2853 2854 // add select 2855 select -r $sel; 2856 SelectKeyTimeList($selKey); 2857 for ($item in $tree) 2858 { 2859 $workList = `keyframe -q -n $item`; 2860 for ($item in $workList) // anim curve node list 2861 { 2862 if (!IsDrivenAnim($item)) 2863 { 2864 selectKey -add -k -t ($s + ":" + $e) $item; 2865 } 2866 } 2867 } 2868 2869 // for dope sheet 2870 setToolTo scaleSuperContext; 2871 waitCursor -state off; 2872} 2873 2874/****************************************************************************** 2875 delete time range 2876******************************************************************************/ 2877global proc nw4cSetAnimRange_DeleteTimeRange(string $wName, int $i, string $mode) 2878{ 2879 string $animRange = GetCurrentAnimRange($wName); 2880 if ($animRange != "") 2881 { 2882 int $s, $e; 2883 if ($mode == "s") // selected animation range 2884 { 2885 if (!ConfirmDialogCheckWin($wName, "Delete nw4c_AnimRange" + $i + ".\n")) 2886 { 2887 return; 2888 } 2889 $s = $i; 2890 $e = $s + 1; 2891 } 2892 else // disabled animation range 2893 { 2894 if (!ConfirmDialogCheckWin($wName, "Delete Disabled AnimRanges.\n")) 2895 { 2896 return; 2897 } 2898 $s = 0; 2899 $e = GetNumberOfClip(); 2900 } 2901 2902 for ($i = $s; $i < $e; ++$i) 2903 { 2904 if ($mode == "m") 2905 { 2906 if (`getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`) 2907 { 2908 continue; 2909 } 2910 } 2911 EnableKeyChangeScript($wName, $animRange, $i, false); 2912 cutKey -cl -at ("nw4c_AnimRange" + $i) $animRange; 2913 setAttr -c ($animRange + "." + "nw4c_AnimRange" + $i) 0; 2914 2915 $f = GetTimeRangeFromKey($animRange, $i); 2916 DisplayTimeRange($wName, $i, $f[0], $f[1]); 2917 2918 setAttr ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]") false; 2919 setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]") 2920 `GetUniqueAnimRangeTitle $animRange $i`; 2921 EnableKeyChangeScript($wName, $animRange, $i, true); 2922 2923 setAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]") false; 2924 } 2925 } 2926} 2927 2928/****************************************************************************** 2929 move time range (up / down) (using drag & drop proc) 2930******************************************************************************/ 2931global proc nw4cSetAnimRange_MoveTimeRange(string $wName, int $i, string $mode) 2932{ 2933 string $animRange = GetCurrentAnimRange($wName); 2934 if ($animRange != "") 2935 { 2936 int $s = $i; 2937 int $d = $i; 2938 if ($mode == "u") 2939 { 2940 if ($i) 2941 { 2942 $d--; 2943 } 2944 } 2945 else 2946 { 2947 if ($i < (GetNumberOfClip() - 1)) 2948 { 2949 $s++; 2950 } 2951 } 2952 if ($s != $d) 2953 { 2954 string $dragControl = ($wName + "ClipNo" + $s); 2955 string $dropControl = ($wName + "ClipNo" + $d); 2956 string $msgs[] = nw4cSetAnimRange_DragAnimRange($wName, $dragControl, 0, 0, 0); 2957 nw4cSetAnimRange_DropAnimRange($wName, $dragControl, $dropControl, $msgs, 0, 0, 2); 2958 } 2959 } 2960} 2961 2962/****************************************************************************** 2963 enable all 2964******************************************************************************/ 2965global proc nw4cSetAnimRange_EnableAll(string $wName, string $mode) 2966{ 2967 string $animRange = GetCurrentAnimRange($wName); 2968 if ($animRange != "") 2969 { 2970 int $i; 2971 int $no = GetNumberOfClip(); 2972 int $en = false; 2973 if ($mode == "e") 2974 { 2975 $en = true; 2976 } 2977 for ($i = 0; $i < $no; ++$i) 2978 { 2979 setAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]") $en; 2980 } 2981 } 2982} 2983 2984/****************************************************************************** 2985 check animation range title (if empty or same as other, restore) 2986******************************************************************************/ 2987global proc nw4cSetAnimRange_CheckAnimRangeTitle(string $wName, int $i) 2988{ 2989 string $animRange = GetCurrentAnimRange($wName); 2990 if ($animRange != "") 2991 { 2992 string $item = `getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")`; 2993 //$item = `strip $item`; 2994 //setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]") $item; 2995 if ($item == "" 2996 || match("[^0-9a-zA-Z_]", $item) != "") 2997 { 2998 RestoreTitleList($wName, $animRange, $i); 2999 warning (("nw4c_AnimRange" + $i) + ":Invalid name was specified. <" + $wName + ">."); 3000 return; 3001 } 3002 3003 int $idx; 3004 int $no = GetNumberOfClip(); 3005 string $list[] = GetAttrTitleList($animRange); 3006 for ($idx = 0; $idx < $no; ++$idx) 3007 { 3008 if ($idx == $i) 3009 { 3010 continue; 3011 } 3012 if ($item == $list[$idx]) 3013 { 3014 break; 3015 } 3016 } 3017 if ($idx < $no) // same name 3018 { 3019 RestoreTitleList($wName, $animRange, $i); 3020 warning (("nw4c_AnimRange" + $i) + ":Duplicate name was specified. <" + $wName + ">."); 3021 return; 3022 } 3023 3024 SaveTitleList($wName, $animRange); 3025 } 3026} 3027 3028/****************************************************************************** 3029 set animation range range key 3030******************************************************************************/ 3031global proc nw4cSetAnimRange_SetAnimRangeRangeKey(string $wName, int $i) 3032{ 3033 string $node = GetCurrentDag($wName); // top dag 3034 if ($node == "") 3035 { 3036 return; 3037 } 3038 string $animRange = GetCurrentAnimRange($wName); 3039 if ($animRange == "") 3040 { 3041 return; 3042 } 3043 nw4cSetAnimRange_OnKeyChangeUI($wName, $i, "s"); 3044 float $s = `floatField -q -v ($wName + "ClipStart" + $i)`; 3045 float $e = `floatField -q -v ($wName + "ClipEnd" + $i)`; 3046 if ($s >= $e) 3047 { 3048 return; 3049 } 3050 3051 // if loop, set key at (endFrame + 1) 3052 // changed from original (2006/01/23) 3053 //if (`checkBox -q -v ($wName + "ClipLoop" + $i)`) 3054 //{ 3055 // ++$e; 3056 //} 3057 3058 waitCursor -state on; 3059 3060 string $sel[] = `ls -sl`; 3061 3062 select -r $node; 3063 select -hi; 3064 string $list[] = `ls -sl`; 3065 string $item; 3066 string $tree[]; // related node list 3067 string $workList[]; 3068 for ($item in $list) 3069 { 3070 $workList = FixAEgetRelatedNodes($item); 3071 if (size($workList)) 3072 { 3073 $tree = stringArrayCatenate($tree, $workList); 3074 } 3075 } 3076 $tree = stringArrayRemoveDuplicates($tree); 3077 $tree = `ls $tree`; // full path -> fine path 3078 $workList = GetAnimRangeList(); 3079 $tree = stringArrayRemove($workList, $tree); // exclude animation range node 3080 3081 // for custom effect of material 3082 $workList = LsMaterial($tree); 3083 if (size($workList)) 3084 { 3085 $workList = `listHistory $workList`; 3086 if (size($workList)) 3087 { 3088 $workList = stringArrayRemoveDuplicates($workList); 3089 $tree = stringArrayCatenate($tree, $workList); 3090 $tree = stringArrayRemoveDuplicates($tree); 3091 } 3092 } 3093 3094 // add key 3095 float $anchor[] = { $s, $e }; 3096 float $times[], $vals[]; 3097 string $itt[], $ott[]; 3098 int $i; 3099 for ($item in $tree) 3100 { 3101 $workList = `keyframe -q -n $item`; 3102 for ($item in $workList) // anim curve node list 3103 { 3104 if (IsDrivenAnim($item)) 3105 { 3106 continue; 3107 } 3108 for ($i = 0; $i < size($anchor); ++$i) 3109 { 3110 $times = `keyframe -q $item`; 3111 if ($times[0] <= $anchor[$i] && $anchor[$i] <= $times[size($times) - 1]) 3112 { 3113 catchQuiet(`setKeyframe -i -hi none -t $anchor[$i] $item`); 3114 } 3115 else // out of time-range 3116 { 3117 if (`getAttr ($item + ".preInfinity")` || `getAttr ($item + ".postInfinity")`) 3118 { 3119 continue; // != constant 3120 } 3121 3122 if ($times[0] > $anchor[$i]) 3123 { 3124 $itt = `keyTangent -in 0 -q -itt $item`; 3125 if ($itt[0] == "spline" || $itt[0] == "fixed") 3126 { 3127 catchQuiet(`keyTangent -in 0 -e -l false -itt "clamped" $item`); 3128 } 3129 3130 $ott = `keyTangent -in 0 -q -ott $item`; 3131 if ($ott[0] == "step") 3132 { 3133 $vals = `keyframe -t $times[0] -q -vc $item`; 3134 catchQuiet(`setKeyframe -hi none -t $anchor[$i] -v $vals[0] $item`); 3135 continue; 3136 } 3137 } 3138 else 3139 { 3140 $ott = `keyTangent -in (size($times) - 1) -q -ott $item`; 3141 if ($ott[0] == "spline" || $ott[0] == "fixed") 3142 { 3143 catchQuiet(`keyTangent -in (size($times) - 1) -e -l false -ott "clamped" $item`); 3144 } 3145 } 3146 catchQuiet(`setKeyframe -i -hi none -t $anchor[$i] $item`); 3147 } 3148 } 3149 } 3150 } 3151 3152 if (size($sel)) 3153 { 3154 select -r $sel; 3155 } 3156 else 3157 { 3158 select -cl; 3159 } 3160 3161 waitCursor -state off; 3162} 3163 3164/****************************************************************************** 3165 set enabled animation range range key 3166******************************************************************************/ 3167global proc nw4cSetAnimRange_SetEnabledAnimRangeRangeKey(string $wName, int $i) 3168{ 3169 string $node = GetCurrentDag($wName); // top dag 3170 if ($node == "") 3171 { 3172 return; 3173 } 3174 string $animRange = GetCurrentAnimRange($wName); 3175 if ($animRange == "") 3176 { 3177 return; 3178 } 3179 3180 int $no = GetNumberOfClip(); 3181 for ($i = 0; $i < $no; ++$i) 3182 { 3183 if (`getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`) 3184 { 3185 nw4cSetAnimRange_SetAnimRangeRangeKey($wName, $i); 3186 } 3187 } 3188} 3189 3190/****************************************************************************** 3191 update dag list 3192******************************************************************************/ 3193global proc nw4cSetAnimRange_UpdateDagList(string $wName) 3194{ 3195 if (!`window -ex $wName`) 3196 { 3197 return; 3198 } 3199 3200 string $exlist[] = GetDagList(); 3201 string $list[]; 3202 string $work; 3203 for ($work in $exlist) 3204 { 3205 if (!IsAnimRange($work)) 3206 { 3207 $list[size($list)] = $work; 3208 } 3209 } 3210 string $sel[] = `textScrollList -q -ai ($wName + "DagList")`; 3211 string $name; 3212 int $i = 0; 3213 3214 // same list 3215 if (size($sel) == size($list) && size($list)) 3216 { 3217 // speed up 3218 //$sel = stringArrayRemove($list, $sel); 3219 //if (!size($sel)) 3220 string $intsct = `stringArrayIntersector -i $list`; 3221 stringArrayIntersector -e -i $sel $intsct; 3222 $sel = `stringArrayIntersector -q $intsct`; 3223 deleteUI $intsct; 3224 if (size($sel) == size($list)) 3225 { 3226 $i = 1; 3227 } 3228 } 3229 // change list 3230 if (!$i) 3231 { 3232 // speed up 3233 textScrollList -e -vis false -m false ($wName + "DagList"); 3234 textScrollList -e -ra ($wName + "DagList"); 3235 3236 if (size($list)) 3237 { 3238 $name = ""; 3239 for ($work in $list) 3240 { 3241 $name += (" -a \"" + $work + "\""); 3242 } 3243 if (size($name)) 3244 { 3245 eval("textScrollList -e " + $name + " " + ($wName + "DagList")); 3246 } 3247 } 3248 // speed up 3249 textScrollList -e -vis true -m true ($wName + "DagList"); 3250 } 3251 3252 // select 3253 $work = GetCurrentDag($wName); 3254 if ($work != "") 3255 { 3256 $sel = `ls $work`; 3257 $work = $sel[0]; 3258 if (IsStringInArray($work, $list)) 3259 { 3260 textScrollList -e -si $work ($wName + "DagList"); 3261 } 3262 } 3263} 3264 3265/****************************************************************************** 3266 update animation range list 3267******************************************************************************/ 3268global proc nw4cSetAnimRange_UpdateAnimRangeList(string $wName, int $updateEditor) 3269{ 3270 if (!`window -ex $wName`) 3271 { 3272 return; 3273 } 3274 3275 string $list[] = GetAnimRangeList(); 3276 string $sel[] = `textScrollList -q -ai ($wName + "AnimRangeList")`; 3277 string $work; 3278 string $name; 3279 int $i = 0; 3280 3281 // same list 3282 if (size($sel) == size($list) && size($list)) 3283 { 3284 $sel = stringArrayRemove($list, $sel); 3285 if (!size($sel)) 3286 { 3287 $i = 1; 3288 } 3289 } 3290 // change list 3291 if (!$i) 3292 { 3293 textScrollList -e -ra ($wName + "AnimRangeList"); 3294 3295 if (size($list)) 3296 { 3297 $name = ""; 3298 for ($work in $list) 3299 { 3300 $name += (" -a \"" + $work + "\""); 3301 } 3302 if (size($name)) 3303 { 3304 eval("textScrollList -e" + $name + " " + ($wName + "AnimRangeList")); 3305 } 3306 } 3307 } 3308 3309 // select 3310 $work = GetCurrentAnimRange($wName); 3311 if ($work != "") 3312 { 3313 $sel = `ls $work`; 3314 $work = $sel[0]; 3315 if (IsStringInArray($work, $list)) 3316 { 3317 textScrollList -e -si $work ($wName + "AnimRangeList"); 3318 RelationAnimRangeToDagList($wName, $work); 3319 // changed from original (2006/01/23) 3320 if ($updateEditor) 3321 { 3322 SetEditorCurrent($wName, $work); 3323 } 3324 } 3325 } 3326 else 3327 { 3328 SetEditorCurrent($wName, ""); 3329 } 3330} 3331 3332/****************************************************************************** 3333 update view 3334******************************************************************************/ 3335global proc nw4cSetAnimRange_UpdateView(string $wName, int $updateEditor) 3336{ 3337 if (!`window -ex $wName`) 3338 { 3339 return; 3340 } 3341 checkBox -e -v false ($wName + "UpdateQueued"); 3342 nw4cSetAnimRange_UpdateDagList($wName); 3343 nw4cSetAnimRange_UpdateAnimRangeList($wName, $updateEditor); 3344} 3345 3346/****************************************************************************** 3347 update view queue 3348******************************************************************************/ 3349global proc nw4cSetAnimRange_UpdateViewQueue(string $wName, int $updateEditor) 3350{ 3351 if (!`window -ex $wName`) 3352 { 3353 return; 3354 } 3355 3356 if (!`checkBox -q -v ($wName + "UpdateQueued")`) 3357 { 3358 checkBox -e -v true ($wName + "UpdateQueued"); 3359 evalDeferred -lp ("nw4cSetAnimRange_UpdateView " + $wName + " " + $updateEditor); 3360 } 3361} 3362 3363/****************************************************************************** 3364 draw editor label (by frameLayout) 3365******************************************************************************/ 3366proc DrawEditorLabel(string $label) 3367{ 3368 frameLayout -lv false -cll false -bs "etchedOut"; 3369 columnLayout -adj true -cat "both" 0; 3370 text -l $label; 3371 setParent ..; 3372 setParent ..; 3373} 3374 3375/****************************************************************************** 3376 playback button CB 3377******************************************************************************/ 3378global proc nw4cSetAnimRange_OnPlaybackButton(string $wName, int $cmd) 3379{ 3380 if (!`window -ex $wName`) 3381 { 3382 return; 3383 } 3384 if (GetCurrentAnimRange($wName) != "") 3385 { 3386 int $cmdTable[]; 3387 if ($cmd == 0) // stop 3388 { 3389 $cmdTable = { false, false, true }; 3390 } 3391 else if ($cmd == 1) // once 3392 { 3393 $cmdTable = { true, false, false }; 3394 } 3395 else // continuous 3396 { 3397 $cmdTable = { true, true, false }; 3398 } 3399 checkBox -e -v $cmdTable[0] ($wName + "PlaybackEnable"); 3400 checkBox -e -v $cmdTable[1] ($wName + "PlaybackContinuous"); 3401 checkBox -e -v $cmdTable[2] ($wName + "PlaybackStop"); 3402 if ($cmd) 3403 { 3404 playButtonForward(); // others/timeSlider.mel 3405 } 3406 } 3407 if ($cmd == 0) // stop 3408 { 3409 play -st false; 3410 } 3411} 3412 3413/****************************************************************************** 3414 create playback control 3415******************************************************************************/ 3416proc string CreatePlaybackControl(string $wName) 3417{ 3418 string $lay = `formLayout`; 3419 string $btn0 = `symbolButton -w 26 -h 26 ($wName + "PlayBtn0")`; 3420 string $btn1 = `symbolButton -w 26 -h 26 ($wName + "PlayBtn1")`; 3421 setParent ..; // formLayout 3422 formLayout -e 3423 -af $btn0 "left" 24 3424 -af $btn0 "top" 0 3425 -af $btn0 "bottom" 0 3426 -ac $btn1 "left" 20 $btn0 3427 -af $btn1 "top" 0 3428 -af $btn1 "bottom" 0 3429 $lay; 3430 UpdatePlaybackButton($wName); 3431 return $lay; 3432/* 3433 string $addAnn = "AnimRange "; 3434 string $icon[] = // iconFile, annotation, command, dimWhenPlay, space 3435 { 3436 "nw4cSetAnimRange_Play.bmp" , ($addAnn + "Once"), 3437 ("nw4cSetAnimRange_OnPlaybackButton " + $wName + " 1;"), "t", "0" , 3438 "nw4cSetAnimRange_PlayLoop.bmp", ($addAnn + "Continuous"), 3439 ("nw4cSetAnimRange_OnPlaybackButton " + $wName + " 2;"), "t", "20", 3440 "nw4cSetAnimRange_Stop.bmp" , ("Stop"), 3441 ("nw4cSetAnimRange_OnPlaybackButton " + $wName + " 0;"), "f", "20" 3442 }; 3443 int $i, $j = 0, $w, $h; 3444 string $lay; 3445 string $btn[]; 3446 $lay = `formLayout`; 3447 for ($i = 0; $i < size($icon); $i += 5) 3448 { 3449 // get size 3450 $btn[$j] = `picture -i $icon[$i]`; 3451 $w = `picture -q -w $btn[$j]`; 3452 $h = `picture -q -h $btn[$j]`; 3453 deleteUI $btn[$j]; 3454 // create 3455 $btn[$j] = `symbolButton -w ($w + 2) -h ($h + 2) 3456 -i $icon[$i] -ann $icon[$i + 1] -c $icon[$i + 2] 3457 ($wName + "PlayBtn" + $j)`; 3458 eval("dimWhen -" + $icon[$i + 3] + " playingBack " + $btn[$j]); 3459 if (!$i) 3460 { 3461 formLayout -e 3462 -af $btn[$j] "top" 0 3463 -af $btn[$j] "left" 0 3464 -af $btn[$j] "bottom" 0 $lay; 3465 } 3466 else 3467 { 3468 formLayout -e 3469 -af $btn[$j] "top" 0 3470 -ac $btn[$j] "left" ((int)$icon[$i + 4]) $btn[$j - 1] 3471 -af $btn[$j] "bottom" 0 $lay; 3472 } 3473 ++$j; 3474 } 3475 setParent ..; // formLayout 3476 return $lay; 3477*/ 3478} 3479 3480/****************************************************************************** 3481 create animation range edit control 3482******************************************************************************/ 3483proc CreateAnimRangeEditControl(string $wName) 3484{ 3485 int $afterMaya2011Adjust = 0; 3486 if (getApplicationVersionAsFloat() >= 2011) 3487 $afterMaya2011Adjust = 1; 3488 3489 int $no = GetNumberOfClip(); 3490 for ($i = 0; $i < $no; ++$i) 3491 { 3492 rowLayout -nc 7 -cw 1 (110 + $afterMaya2011Adjust * 10) -cw 2 (40 + $afterMaya2011Adjust * 9) 3493 -cw 3 200 -cw 4 45 -cw 5 45 -cw 6 50 -cw 7 40 3494 -cat 1 "both" 0 -cat 2 "both" 12 -cat 3 "both" 0 -cat 4 "both" 0 -cat 5 "both" 1 -cat 6 "both" 3 -cat 7 "both" 12 3495 -cal 1 "center" -cal 2 "center" -cal 3 "center" -cal 4 "center" -cal 5 "center" -cal 6 "center" -cal 7 "center" 3496 -rat 6 "bottom" 1; 3497 popupMenu -b 3 -pmc ("nw4cSetAnimRange_OnMenuEditor " + $wName + " " + $i); 3498 menuItem -l ("Set Anim Range from \"Selected Range\"") 3499 -c ("nw4cSetAnimRange_GetTimeRange " + $wName + " " + $i + " t") 3500 ($wName + "EditorMenu" + $i + "Item1"); 3501 menuItem -l ("Set Anim Range from \"Playback Range\"") 3502 -c ("nw4cSetAnimRange_GetTimeRange " + $wName + " " + $i + " p") 3503 ($wName + "EditorMenu" + $i + "Item2"); 3504 menuItem -l ("Set Anim Range from \"Scene Range\"") 3505 -c ("nw4cSetAnimRange_GetTimeRange " + $wName + " " + $i + " a") 3506 ($wName + "EditorMenu" + $i + "Item3"); 3507 menuItem -d true; 3508 menuItem -l ("Set Playback Range from \"nw4c_AnimRange" + $i + "\"") 3509 -c ("nw4cSetAnimRange_GetTimeRange " + $wName + " " + $i + " s") 3510 ($wName + "EditorMenu" + $i + "Item4"); 3511 menuItem -l ("Set Playback Range from \"Enabled Anim Ranges\"") 3512 -c ("nw4cSetAnimRange_GetTimeRange " + $wName + " " + $i + " m"); 3513 menuItem -d true; 3514 menuItem -l ("Select \"nw4c_AnimRange" + $i + "\" Anim Curve") 3515 -c ("nw4cSetAnimRange_SelectTimeRangeKey " + $wName + " " + $i) 3516 ($wName + "EditorMenu" + $i + "Item5"); 3517 menuItem -l ("Select \"nw4c_AnimRange" + $i + "\" Hierarchy Anim Curve") 3518 -c ("nw4cSetAnimRange_SelectHierarchyTimeRange " + $wName + " " + $i) 3519 ($wName + "EditorMenu" + $i + "Item6"); 3520 menuItem -d true; 3521 menuItem -l ("Move Up \"nw4c_AnimRange" + $i + "\"") 3522 -c ("nw4cSetAnimRange_MoveTimeRange " + $wName + " " + $i + " u") 3523 ($wName + "EditorMenu" + $i + "Item7"); 3524 menuItem -l ("Move Down \"nw4c_AnimRange" + $i + "\"") 3525 -c ("nw4cSetAnimRange_MoveTimeRange " + $wName + " " + $i + " d") 3526 ($wName + "EditorMenu" + $i + "Item8"); 3527 menuItem -d true; 3528 menuItem -l ("Sort Order by Anim Range") 3529 -c ("nw4cSetAnimRange_SortPack " + $wName + " t"); 3530 menuItem -l ("Sort Order by Title") 3531 -c ("nw4cSetAnimRange_SortPack " + $wName + " n"); 3532 menuItem -d true; 3533 menuItem -l ("Delete \"nw4c_AnimRange" + $i + "\"") 3534 -c ("nw4cSetAnimRange_DeleteTimeRange " + $wName + " " + $i + " s") 3535 ($wName + "EditorMenu" + $i + "Item9"); 3536 menuItem -l ("Delete \"Disabled Anim Ranges\"") 3537 -c ("nw4cSetAnimRange_DeleteTimeRange " + $wName + " " + $i + " m"); 3538 menuItem -d true; 3539 menuItem -l ("Add Key to Hierarchy from \"nw4c_AnimRange" + $i + "\"") 3540 -c ("nw4cSetAnimRange_SetAnimRangeRangeKey " + $wName + " " + $i) 3541 ($wName + "EditorMenu" + $i + "Item10"); 3542 menuItem -l ("Add Key to Hierarchy from Enabled Anim Ranges") 3543 -c ("nw4cSetAnimRange_SetEnabledAnimRangeRangeKey " + $wName + " " + $i) 3544 ($wName + "EditorMenu" + $i + "Item11"); 3545 3546 button -l ("nw4c_AnimRange" + $i) 3547 -dgc ("nw4cSetAnimRange_DragAnimRange " + $wName) 3548 -dpc ("nw4cSetAnimRange_DropAnimRange " + $wName) 3549 -ann ("Select \"nw4c_AnimRange" + $i + "\" Hierarchy Anim Curve") 3550 -c ("nw4cSetAnimRange_SelectHierarchyTimeRange " + $wName + " " + $i) 3551 ($wName + "ClipNo" + $i); 3552 3553 checkBox -l "" ($wName + "ClipEnable" + $i); 3554 3555 textField -cc ("nw4cSetAnimRange_CheckAnimRangeTitle " + $wName + " " + $i) 3556 ($wName + "ClipName" + $i); 3557 3558 floatField -pre 0 ($wName + "ClipStart" + $i); 3559 floatField -pre 0 ($wName + "ClipEnd" + $i); 3560 3561 frameLayout -lv false -cll false -bs "in" -mw 1; 3562 text -l "" ($wName + "ClipSpan" + $i); 3563 setParent ..; // frameLayout 3564 3565 checkBox -l "" ($wName + "ClipLoop" + $i); 3566 setParent ..; // rowLayout 3567 3568 // no attr-change-event from anim-editor (Maya bugfix) 3569 floatField -m false ($wName + "ClipAttr" + $i); 3570 } 3571} 3572 3573/****************************************************************************** 3574 load plugin 3575******************************************************************************/ 3576proc LoadPlugin() 3577{ 3578 if (!`pluginInfo -q -l "NW4C_CallbackJob.mll"`) 3579 { 3580 loadPlugin("NW4C_CallbackJob.mll"); 3581 } 3582} 3583 3584/****************************************************************************** 3585 main 3586******************************************************************************/ 3587global proc NW4C_SetAnimRange() 3588{ 3589 int $afterMaya2011Adjust = 0; 3590 if (getApplicationVersionAsFloat() >= 2011) 3591 $afterMaya2011Adjust = 1; 3592 3593 // minimum window size 3594 int $winW = 580 + $afterMaya2011Adjust * 50; 3595 int $winH = 441; 3596 3597 //----------------------------------------------------------------------------- 3598 // load plugin 3599 LoadPlugin(); 3600 3601 //----------------------------------------------------------------------------- 3602 // check window exists 3603 string $wName = GetWindowNameString(); 3604 if (`window -ex $wName`) 3605 { 3606 showWindow $wName; 3607 return; 3608 } 3609 3610 //----------------------------------------------------------------------------- 3611 // check playing back 3612 if (`isTrue "playingBack"`) 3613 { 3614 play -st false; 3615 warning ("PlayBack was stopped. Please restart \"NW4C Set Anim Range\"."); 3616 return; 3617 } 3618 nw4cSetAnimRange_PlaybackExit($wName); 3619 3620 //----------------------------------------------------------------------------- 3621 // begin create window 3622 waitCursor -st 1; 3623 window -t "NW4C Set Animation Range" -wh $winW $winH -mb 1 $wName; 3624 window -e -in `window -q -t $wName` $wName; // (Maya bugfix) 3625 3626 //----------------------------------------------------------------------------- 3627 // main menu 3628 //menuBarLayout; 3629 menu -l "File" -pmc ("nw4cSetAnimRange_OnMenuFile " + $wName); 3630 menuItem -l "Import Animation Range Channels..." 3631 -c ("nw4cSetAnimRange_ImportAnimRange " + $wName) 3632 ($wName + "FileMenuItem1"); 3633 menuItem -l "Export Animation Range Channels..." 3634 -c ("nw4cSetAnimRange_ExportAnimRange " + $wName) 3635 ($wName + "FileMenuItem2"); 3636 menu -l "Window"; 3637 //if (!`exists nw4c_AnimEditUtility`) 3638 if (1) 3639 { 3640 menuItem -l "Graph Editor..." -c ("nw4cSetAnimRange_CallEditor " + $wName + " GraphEditor"); 3641 menuItem -l "Dope Sheet..." -c ("nw4cSetAnimRange_CallEditor " + $wName + " DopeSheetEditor"); 3642 } 3643 //else 3644 //{ 3645 // menuItem -l "NW4C AnimEdit Utility..." -c ("nw4cSetAnimRange_CallEditor " + $wName + " nw4c_AnimEditUtility"); 3646 //} 3647 menu -l "Help"; 3648 menuItem -l ("Help on " + `window -q -t $wName` + "...") 3649 -c "NW4C_ShowHelp \"html/NW4C_SetAnimRange.html\" \"\""; 3650 //setParent ..; // menuBarLayout 3651 3652 //----------------------------------------------------------------------------- 3653 // top layout 3654 string $frm, $ctl; 3655 formLayout ($wName + "TopLayout"); 3656 nameField -en false -vis false ($wName + "DagName"); 3657 nameField -en false -vis false ($wName + "AnimRangeNameMaster"); 3658 paneLayout -cn "top3" -ps 1 50 30 -ps 2 50 30 -ps 3 100 70 3659 -h 270 -w 530 ($wName + "Pane"); 3660 //----------------------------------------------------------------------------- 3661 // dag list 3662 $frm = `formLayout`; 3663 $ctl = `text -l "Root List"`; 3664 textScrollList -ams false -fn "plainLabelFont" 3665 -sc ("nw4cSetAnimRange_OnSelectDagList " + $wName) 3666 -dcc ("nw4cSetAnimRange_OnDblClkDagList " + $wName) 3667 ($wName + "DagList"); 3668 popupMenu -b 3 -pmc ("nw4cSetAnimRange_OnMenuDagList " + $wName); 3669 menuItem -l "Create and Attach nw4c_AnimRangeCtrl" 3670 -c ("nw4cSetAnimRange_CreateAnimRange " + $wName + " a") 3671 ($wName + "DagListMenuItem1"); 3672 formLayout -e 3673 -af $ctl "top" 0 3674 -af $ctl "left" 5 3675 -an $ctl "bottom" 3676 -af $ctl "right" 0 3677 -ac ($wName + "DagList") "top" 0 $ctl 3678 -af ($wName + "DagList") "left" 0 3679 -af ($wName + "DagList") "bottom" 0 3680 -af ($wName + "DagList") "right" 0 3681 $frm; 3682 setParent ..; // formLayout 3683 3684 //----------------------------------------------------------------------------- 3685 // animation range list 3686 $frm = `formLayout`; 3687 $ctl = `text -l "nw4c_AnimRangeCtrl List"`; 3688 nameField -vis false ($wName + "AnimRangeNameWork"); 3689 textScrollList -ams false -fn "plainLabelFont" 3690 -sc ("nw4cSetAnimRange_OnSelectAnimRangeList " + $wName) 3691 -dcc ("nw4cSetAnimRange_OnDblClkAnimRangeList " + $wName) 3692 ($wName + "AnimRangeList"); 3693 popupMenu -b 3 -pmc ("nw4cSetAnimRange_OnMenuAnimRangeList " + $wName); 3694 menuItem -l "Create nw4c_AnimRangeCtrl" 3695 -c ("nw4cSetAnimRange_CreateAnimRange " + $wName + " c") 3696 ($wName + "AnimRangeListMenuItem1"); 3697 menuItem -l "Duplicate Highlighted" 3698 -c ("nw4cSetAnimRange_DuplicateAnimRange " + $wName) 3699 ($wName + "AnimRangeListMenuItem2"); 3700 menuItem -d true; 3701 menuItem -l "Attach Highlighted to" -sm true 3702 ($wName + "AnimRangeListMenuItem3"); 3703 setParent -menu ..; 3704 menuItem -l "Detach Highlighted" 3705 -c ("nw4cSetAnimRange_DeattachAnimRange " + $wName) 3706 ($wName + "AnimRangeListMenuItem4"); 3707 menuItem -d true; 3708 menuItem -l "Delete Highlighted" 3709 -c ("nw4cSetAnimRange_DeleteAnimRangeCtrl " + $wName) 3710 ($wName + "AnimRangeListMenuItem5"); 3711 formLayout -e 3712 -af $ctl "top" 0 3713 -af $ctl "left" 5 3714 -an $ctl "bottom" 3715 -af $ctl "right" 0 3716 -ac ($wName + "AnimRangeList") "top" 0 $ctl 3717 -af ($wName + "AnimRangeList") "left" 0 3718 -af ($wName + "AnimRangeList") "bottom" 0 3719 -af ($wName + "AnimRangeList") "right" 0 3720 $frm; 3721 setParent ..; // formLayout 3722 3723 //----------------------------------------------------------------------------- 3724 // edit area 3725 $frm = `formLayout`; 3726 $ctl = `scrollLayout -hst 0`; 3727 formLayout -e 3728 -af $ctl "top" 0 3729 -af $ctl "left" 0 3730 -af $ctl "bottom" 0 3731 -af $ctl "right" 0 3732 $frm; 3733 columnLayout -adj true -cat "both" 0; 3734 text -l " Edit" -fn "boldLabelFont" -al "left"; 3735 rowLayout -nc 2 -cw 1 (170 + $afterMaya2011Adjust * 20) -cw 2 220 3736 -ct2 "both" "both" -cl2 "right" "center"; 3737 text -l "Current nw4c_AnimRangeCtrl : "; 3738 nameField -en false ($wName + "AnimRangeName"); 3739 setParent ..; // rowLayout 3740 separator -st "none" -h 5; 3741 3742 rowColumnLayout -nc 5 3743 -cw 1 (1 + $afterMaya2011Adjust * 75) -cw 2 (169 - $afterMaya2011Adjust * 53) -cw 3 300 -cw 4 5 -cw 5 25 3744 -cat 2 "right" 0; 3745 text -l ""; // dummy 3746 checkBox -l "Merge cmdl File" -v 0 3747 -cc ("nw4cSetAnimRange_MergeCmdlFlagCB " + $wName) 3748 ($wName + "MergeCmdlFlag"); 3749 textField 3750 ($wName + "MergeCmdlPath"); 3751 text -l ""; // dummy 3752 symbolButton -i "navButtonBrowse.xpm" 3753 -c ("nw4cSetAnimRange_MergeCmdlBrowserCB " + $wName) 3754 ($wName + "MergeCmdlBrowser"); 3755 setParent ..; // rowColumnLayout 3756 separator -st "none" -h 5; 3757 3758 frameLayout -l "" -cll 1 -cl 1 -bv 1 -bs "etchedIn" 3759 ($wName + "CustomOptsLayout"); 3760 columnLayout -adj 1 -rs 4; 3761 checkBoxGrp -l "" -ncb 1 -cw2 18 200 3762 -l1 "Enable Custom Options" 3763 -cc ("nw4cSetAnimRange_EnableCustomOptsCB " + $wName) 3764 ($wName + "EnableCustomOpts"); 3765 frameLayout -l "Optimization Options" -cll 0 -cl 0 -bv 1 -bs "etchedIn"; 3766 columnLayout -adj 1 -rs 4; 3767 optionMenuGrp -l "Compress Node" -cw 1 100 3768 -rat 1 "both" 4 -cat 1 "right" 4 3769 ($wName + "CompressNode"); 3770 menuItem -da 0 -l "None"; 3771 menuItem -da 1 -l "Cull Useless Node"; 3772 menuItem -da 2 -l "Cull Uninfluential Node"; 3773 menuItem -da 3 -l "Unite Compressible Node"; 3774 menuItem -da 4 -l "Unite All Node"; 3775 menuItem -da 5 -l "Unite Below Node"; 3776 optionMenuGrp -l "Compress Material" -cw 1 100 3777 -rat 1 "both" 4 -cat 1 "right" 4 3778 ($wName + "CompressMaterial"); 3779 menuItem -da 0 -l "None"; 3780 menuItem -da 1 -l "Compress Same Material"; 3781 checkBoxGrp -l "" -ncb 1 -cw 1 100 -cw 2 120 3782 -l1 "Optimize Primitive" -v1 0 3783 ($wName + "OptimizePrimitive"); 3784 checkBoxGrp -l "" -ncb 1 -cw 1 100 -cw 2 190 3785 -l1 "Disable SkeletalModel-Simplification" -v1 0 3786 ($wName + "DisableSkeletalModelSimplification"); 3787 setParent ..; // columnLayout 3788 setParent ..; // frameLayout 3789 setParent ..; // columnLayout 3790 setParent ..; // frameLayout 3791 separator -st "none" -h 5; 3792 3793 columnLayout -adj true -cat "both" 0 ($wName + "Editor"); 3794 textScrollList -vis 0 ($wName + "_ClipNameList"); // to restore name (never displayed) 3795 rowLayout -nc 6 3796 -cw 1 (110 + $afterMaya2011Adjust * 10) -cw 2 (40 + $afterMaya2011Adjust * 10) 3797 -cw 3 200 -cw 4 (90 + $afterMaya2011Adjust * 33) -cw 5 50 -cw 6 40 3798 -ct6 "both" "both" "both" "both" "both" "both" 3799 -cl6 "center" "center" "center" "center" "center" "center"; 3800 DrawEditorLabel("Channel"); 3801 DrawEditorLabel("Enable"); 3802 popupMenu -b 3; 3803 menuItem -l "Enable All" 3804 -c ("nw4cSetAnimRange_EnableAll " + $wName + " e"); 3805 menuItem -l "Disable All" 3806 -c ("nw4cSetAnimRange_EnableAll " + $wName + " d"); 3807 DrawEditorLabel("Title"); 3808 DrawEditorLabel("Animation Range"); 3809 DrawEditorLabel("Size"); 3810 DrawEditorLabel("Loop"); 3811 setParent ..; // rowLayout 3812 columnLayout -adj true -cat "both" 0; 3813 CreateAnimRangeEditControl($wName); 3814 setParent ..; // columnLayout 3815 setParent ..; // columnLayout 3816 setParent ..; // columnLayout 3817 setParent ..; // scrollLayout 3818 setParent ..; // formLayout 3819 setParent ..; // paneLayout 3820 3821 //----------------------------------------------------------------------------- 3822 $ctl = `columnLayout -adj true -cat "both" 0`; 3823 //----------------------------------------------------------------------------- 3824 // playback 3825 frameLayout -lv false -cll false -bs "in"; 3826 columnLayout -adj true -cat "both" 0; 3827 rowLayout -nc 3 -cw 1 220 -cw 2 180 -adj 3 3828 -ct3 "both" "both" "both" 3829 -cl3 "left" "center" "center"; 3830 columnLayout -adj true -cat "both" 0 -cal "left"; 3831 text -l " Current Animation Range Playback" -fn "boldLabelFont"; 3832 setParent ..; // columnLayout 3833 columnLayout -adj true -cat "both" 0; 3834 separator -st "none" -h 5; 3835 CreatePlaybackControl($wName); 3836 setParent ..; // columnLayout 3837 columnLayout -adj true -cat "both" 0; 3838 separator -st "none" -h 8; 3839 rowLayout -nc 2 -cw 1 70 -cw 2 40 3840 -ct2 "both" "both" -cl2 "right" "center"; 3841 text -l "Loop Count "; 3842 intField -v 3 -min 1 ($wName + "Loop"); 3843 setParent ..; // rowLayout 3844 setParent ..; // columnLayout 3845 setParent ..; // rowLayout 3846 columnLayout -vis false -adj true -cat "both" 10 -cal "left"; 3847 checkBox -l "" ($wName + "PlaybackEnable"); 3848 checkBox -l "" ($wName + "PlaybackContinuous"); 3849 checkBox -l "" ($wName + "PlaybackStop"); 3850 separator -st "none" -h 3; 3851 setParent ..; // columnLayout 3852 separator -st "none" -h 3; 3853 setParent ..; // columnLayout 3854 setParent ..; // frameLayout 3855 separator -st "none" -h 5; 3856 3857 //----------------------------------------------------------------------------- 3858 // close button 3859 columnLayout -adj true -cat "both" 10; 3860 button -l "Close" -c ("deleteUI " + $wName); 3861 setParent ..; // columnLayout 3862 3863 formLayout -e 3864 -af ($wName + "Pane") "top" 0 3865 -af ($wName + "Pane") "left" 0 3866 -ac ($wName + "Pane") "bottom" 0 $ctl 3867 -af ($wName + "Pane") "right" 0 3868 -an $ctl "top" 3869 -af $ctl "left" 0 3870 -af $ctl "bottom" 3 3871 -af $ctl "right" 0 3872 ($wName + "TopLayout"); 3873 3874 // speed up 3875 //nw4cSetAnimRange_NodeUpdateCtrl($wName, $wName + "TopLayout", "nw4cSetAnimRange_UpdateView " + $wName); 3876 // ^ commented out in original 3877 checkBox -m false -v false ($wName + "UpdateQueued"); 3878 3879 //----------------------------------------------------------------------------- 3880 // set script job 3881 scriptJob -p $wName -e deleteAll ("nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0"); 3882 scriptJob -p $wName -e NameChanged ("nw4cSetAnimRange_UpdateViewQueue " + $wName + " 1"); 3883 scriptJob -p $wName -cf readingFile ("nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0"); 3884 scriptJob -p $wName -ct "delete" ("nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0"); 3885 scriptJob -p $wName -e DagObjectCreated ("nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0"); 3886 eval("NW4C_CallbackJob -p " + $wName 3887 + " -e kAfterRemoveReference \"nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0\""); 3888 if (`getApplicationVersionAsFloat` >= 6.5) // in startup/getApplicationVersionAsFloat.mel 3889 { 3890 eval("NW4C_CallbackJob -p " + $wName 3891 + " -e kAfterUnloadReference \"nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0\""); 3892 } 3893 eval("NW4C_CallbackJob -p " + $wName 3894 + " -e kParentAdded \"nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0\""); 3895 eval("NW4C_CallbackJob -p " + $wName 3896 + " -e kParentRemoved \"nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0\""); 3897 eval("NW4C_CallbackJob -p " + $wName 3898 + " -e kChildReordered \"nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0\""); 3899 3900 button -m false ($wName + "DefFocus"); 3901 setFocus ($wName + "DefFocus"); 3902 3903 setParent ..; // columnLayout (playback & close) 3904 setParent ..; // formLayout (Top) 3905 3906 if (`window -q -w $wName` < $winW) 3907 { 3908 window -e -w $winW $wName; 3909 } 3910 if (`window -q -h $wName` < $winH) 3911 { 3912 window -e -h $winH $wName; 3913 } 3914 3915 showWindow; 3916 3917 //----------------------------------------------------------------------------- 3918 // update window 3919 nw4cSetAnimRange_UpdateView($wName, 0); 3920 SetEditorCurrent($wName, ""); 3921 waitCursor -st 0; 3922 3923 //----------------------------------------------------------------------------- 3924 // create playing back condition 3925 condition -i -d "playingBack" 3926 -s ("nw4cSetAnimRange_PlaybackCondition " + $wName) 3927 ($wName + "PlaybackCondition"); 3928 scriptJob -uid $wName ("nw4cSetAnimRange_PlaybackCondition " + $wName); 3929 scriptJob -p $wName -e SelectionChanged 3930 ("nw4cSetAnimRange_OnKeyChangeAddKey " + $wName); 3931} 3932 3933