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