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