gH]kDwP$Rosetta Beta 7.61[VS_O93YJClinton Reese, Clintons 3D Creations`d8pM*#ͺOI)PNG  IHDR`ZIDATxJAn`s+饽HO}>^"Ql&Y_Ä/?2 Ì~JT`f`f`f`f`f`f`f`f`f`f`fX׿_ iL(/LãO`4v"L)=H9=0f 0W&@H)mKO(/R w9VU]bחzHy1 ;8zzEya=L&M,on!jghœ al79gzEya's~[+ n=5z=y -{z9Ce`f`f`f`f`c0P`IENDB`/tfѭ8Lwb"qR܂dKu=hJinstall PSK-PSA Import-Export ButtonX.;]kI 忞@.;]kI 忞@"SubObject*Encapsulated objects"XXص4W}@O{4W}@O{$ Owner4Owner of the Encapsulator$(XFҦV(XFҦV"LE2Data$LE2 Data for node >g'JNjn*p" zFAa| zFAa|DhelpText\vRm)EC!avRm)EC!aD leftClickScript\1V {E!Y1V {E!YD name\!K0}q!K0}qD"rightClickScript\-1OSM n-1OSM n"LayoutLayout 럆L<_ї"1V {E!YsayHello!K0}q2System.Alert("goodbye");(XFҦV>g'JNjn*pF0DBr@@T@1B?vRm)EC!a<System.Alert("hello there!");-1OSM n 럆L<_ї˃DefaultOˁ CRih[  8}}LActivity.Run('%THIS_NAME%' + "/doIt")8install buttons and scriptsZ`Ez]UO GFʠN= 08.}} version 1.3.3Z`Ez]UO}} zFAa|say helloS`._E#ބ6fCustomFrame)X.;]kI 忞@"4W}@O{$*O΢C}*O΢C} WinIDWindow ID-pϗO 0)t-pϗO 0)PositionShelf Position mz!OHwcXX>-MD'zZt>-MD'zZRectangle"Screen Rectangle THj6F 2s*RÒGbDeC tRÒGbDeC  WidthWindow widthXX[FB%n*jt[FB%n*jHeightWindow heightX [GDJM [GDJMMin Width$Min. Window width%]GJ7ψ%]GJ7ψMin Height&Min. Window height^^Dy^^DyMax Width$Max. Window widthv43N tv43N tMax Height&Max. Window height~൱D@ j#^c~൱D@ j#^cMaximized(Window Is Maximized 9@'s9@'sRootNodeRootNode{Q !aOt {Q !aOt  TitleTitle Text6*Mv46*Mv4View Index$View window indexf$I `7f$I `7Frame TypeFrame Typej^G@!,j^G@!,"ViewersViewers array 2bOdA)f "I)LL !I)LL ! Def1D Default 1D GUID8M0cry8M0cry Def2D Default 2D GUIDF L$3F L$3 Def3D Default 3D GUIDobFFJL}obFFJL}SnappedTo$Snapped To WindowBXPjKɸtEBXPjKɸtE SnappedToTarget@Snapped To Window Target CornerkJHx(V@WkJHx(V@W SnappedToSource@Snapped To Window Source CornerKTLA7~fKTLA7~f"SnappedToOffsetX6Snapped To Window Offset XK8Y8O#=gtMK8Y8O#=gtM"SnappedToOffsetY6Snapped To Window Offset Ymk~_Lb.mk~_Lb.SnappedToWidth0Snapped To Window Width|7EId |7EId  SnappedToHeight2Snapped To Window HeightKXtO LKXtO L,StartSnappedToOffsetXBStart Snapped To Window Offset XVG))jHETVG))jHET,StartSnappedToOffsetYBStart Snapped To Window Offset Y?V{N7l?V{N7lSnappedToRatio,Snapped To Ratio Mode 86*n^HD9t 86*n^HD9t OwnedByOwned By|_ D|_ DTabsAsButtons Tabs As Buttons _N>G1_N>G1HiddenHidden Flag \q^2FII3w\q^2FII3wPreference,View Preference Panel >=жaMpT>=жaMpT&HideDockedTitlebarJHide Title bar when window is docked N'D)L-N'D)L-MinimizedBHJWindow Is Minimized into Blue Handle ϕ`&FSx9wϕ`&FSx9wSizeLockPrevent horizontal and/or vertical size change. 0x01 - horizontal, 0x02 - vertical˽OS˽OSDispTitleText,Display Titlebar Text Ī8mݧC>!7Ī8mݧC>!7SmallerTabs*Display smaller Tabs (XFҦV"-1OSM n"'>-MD'zZ9@'s^^DyVG))jHETF L$3[FB%n*jmk~_Lb.*O΢C}N{5FDDFE6E-518F-464A-B4B9-8D24B556E36C}˽OS6*Mv48M0cryN{485B725E-A69D-4AD5-A876-B3BBA72D2C0A}>=жaMpT~൱D@ j#^c?V{N7l KTLA7~fj^G@!,2bOdA)f 6^r[HJv-, ^r[HJv-, v43N t |7EId I)LL !BXPjKɸtEkJHx(V@W86*n^HD9t KXtO L%]GJ7ψ-1OSM n 럆L<_ї0(XFҦV>g'JNjn*pFBCX@1@?-pϗO 0)mz!OHwc _N>G1K8Y8O#=gtMobFFJL}f$I `7 [GDJMRÒGbDeC 1ϕ`&FSx9wĪ8mݧC>!7|_ DN'D)L-{Q !aOt \q^2FII3w^r[HJv-, TfToolbar.;]kI 忞@"4W}@O{$n_<&KES Qn_<&KES Q NameItem nameo(K ]p do(K ]p dHelpTextHelp text8Cechg8Cechg RowsToolbar RowsNL {NL {$Dimension$Toolbar dimension$Z_IFL!OSZ_IFL!OSHorizontal Horizontal Flag .S)A2UЍc.S)A2UЍcIsSubToolbar$IsSubToolbar Flag =JM@hM Q3=JM@hM Q3IsImportant2IsImportant Toolbar Flag .UuwO e.UuwO eIDToolbar ID'0#ԪC'X/9}'0#ԪC'X/9}$ IndexItem Index$_N>G1JdWJc~JdWJc~PrototypePrototype name<9BH@b\<9BH@b\IsMinimizedPTrue/False flag if toolbar is minimized m O1Wwm O1Ww$IsAspectT(Aspect Toolbar Flag $(XFҦV".UuwO e'0#ԪC'X/9}m O1Ww=JM@hM Q3 (XFҦV>g'JNjn*pFBCb@ f@?_N>G1Z_IFL!OS NL {JdWJc~8Cechg.S)A2UЍc n_<&KES Qo(K ]p d<9BH@b\ R/$ķKniaWeunrealPSKPSA'0#ԪC'X/9}]8teO?s]8teO?s"MaxItemTxtHeight.Maximal item text size% sH?DC sH?DCTagTag%IlfāA>ˁwIlfāA>ˁwTagAliasTag Alias%/ru|GF0/ru|GF0AgentIDUpdate agentID(XFҦVLE2Data, 1"-1OSM n".;]kI 忞@"X4W}@O{$n_<&KES Qo(K ]p dQm6l3Ll/V^Qm6l3Ll/V^CommandAction commandN="QEj%:N="QEj%:RClickCommand,RClick Action Command$ܿORE bi$ܿORE biPreview2D8Item preview 2D resource id*S]?G[~x;*S]?G[~x;Preview3D8Item preview 3D resource idSr)B8Sr)B8Package"Package class idDNOQsP'ѭDNOQsP'ѭBitmap.Item preview 3D bitmap eSBgciDsL[wiDsL[wRadio Group(Radio buttons group4E*4E*ControlID2D&User Control ID 2Dh>ǑJ]@<h>ǑJ]@<ControlID3D&User Control ID 3D+fyOA7XC+fyOA7XC MaxItemBmpWidth2Maximal item bitmap sizeTl@fC.^&GZTl@fC.^&GZ"MaxItemBmpHeight2Maximal item bitmap sizeh0OY~ C h0OY~ C  MaxItemTxtWidth.Maximal item text size%?Aυ D)7t?Aυ D)7tGrayPercentxGray icon about specified percents if it is not highlighted][D+Iv(][D+Iv( MenuAct As Menu 8{Nm(!8{Nm(!IsMenuButtonIs Menu Button ko6ǑJ]@<N{2BBC850E-6EEF-4364-9265-A4A606AE464B}N="QEj%:$ܿORE bi//ru|GF0N{00000000-0000-0000-0000-000000000000}+fyOA7XC(XFҦV>g'JNjn*pFCb@v@p8B?8{Nm(!][D+Iv(ko6ˁw?Aυ D)7tUTl@fC.^&GZo(K ]p dBopen PSK-PSA import-export panel]8teO?s.;]kI 忞@Sr)B8-1OSM n 럆L<_ї0DNOQsP'ѭeSBgc PC:\Users\Clint\Pictures\unreal_icon.bmpggFV hk9 xiPTWO,j$2D!Vfih! WI *!BEA$D]Ʊ35&3Ix<*lj˗̇S^SSSUUUh^* Z tZ?3Z{{f Z_ZR薙 .!,ZyY7P&wgd }: ey;V %1ѱlVzıD= w Odp/+v%SHYzz!U"cZ+X[1TZ^/ B`ySܭש_!Q|¦a#K G۷sp[ǚۨNr ſEqۗe!ӪKJJ/VF,.]9rzLJn =ig4Ihxvmt?>E~###^SSc׾\nNk:Ԃb:?Ghmmr3_*em/Mjk,rE_xAAg8)kGcAkqp@/kllfgo-]39:rrr Nlj=Ɂft7*++ cIihe+{pӦ]]ޚ}mm8B<wbb z;@Ȩ#NŦ`Zv/:=z}$J?*T{ɗv vvwd[znÃoA%LƖ㭒F &W1y9q>y$Zu_%Jm@?71s[vQaa:M݁c'M 9,sgO@t4?vTtg'JNjn*pceZU@䑧rceZU@䑧r$_scriptData*Internal Script data [җJs@ %X4W}@O{$(XFҦVLE2Data, 1#J@#QLJ@#QLLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 3MT^RwL~YYTMT^RwL~YYTޢLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 22|=Bynj2|=Bynj Control OutTransitionOutz@Hoz@Ho Control InTransitionIn 2|=Bynj2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ "NewCommand // Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); button1 = "unrealPSKPSA"; theScript = "unreal import export"; // if(Node.Exists("/Project/Windows Manager Space/CustomFrame/Toolbar/" + button1)) { replaceLeft = System.Question(button1 + " button already exists in the toolbar. Would you like to replace it?"); if(replaceLeft) Node.Delete("/Project/Windows Manager Space/CustomFrame/Toolbar/" + button1); else return; } //check for and create customframe if(!Node.Exists("/Project/Windows Manager Space/CustomFrame")) Node.Copy(owner + "/CustomFrame","/Project/Windows Manager Space"); //copy buttons to custom frame oldButt = Node.Copy(owner + "/" + button1,"/Project/Windows Manager Space/CustomFrame/Toolbar"); //copy script to custom commands //create CustomCommands if(!Node.Exists("/Scripts/CustomCommands")) { temp = Node.Create("Kernel Package/Object","/Scripts"); custcom = Node.Rename(temp,"CustomCommands"); } if(Node.Exists("/Scripts/CustomCommands/" + theScript)) { replaceLeft = System.Question(theScript + " script already exists. Would you like to replace it?"); if(replaceLeft) Node.Delete("/Scripts/CustomCommands/" + theScript); else return; } Node.Copy(owner + "/" + theScript,"/Scripts/CustomCommands"); //activate it WindowsManager.Activate(); WindowsManager.UpdateWindowsStructure(); //reset the toolbar //1D Aspect WindowsManager.SetWindowAspect('/Project/Windows Manager Space/CustomFrame', 1); //2D Aspect WindowsManager.SetWindowAspect('/Project/Windows Manager Space/CustomFrame', 2); } NScript Object Package/jScript languageL{ 4W}@O{(XFҦV>g'JNjn*pn7C`b@H@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ Ca8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0 Ca:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho܂dKu=lJ*unreal import export X.;]kI 忞@")د8ĊȊ8͊ъ׊8ۊߊ8888 88ppppp|pv/H)#lص4W}@O{$(XFҦV"-1OSM n"XV4; J2fV4; J2fDfilenameTpس2{BطFt2{BطFtDfilename, 1TpX ִ׮M&E ִ׮M&EDfilename, 2TpزA IJlvA IJlvDfilename, 3TpX#ŝCG C:\Å#ŝCG C:\ÅDreduce Tp2{BطFt(XFҦV>g'JNjn*pF@k@t@DD?A IJlv ִ׮M&EV4; J2f#ŝCG C:\Å -1OSM n 럆L<_ї˚Default Setup GFʠN=p .}} version 1.3.2Z`Ez]UO AϠOsXp %}}Z`Ez]UOOˁ CRih[8p }}\Activity.Run('%THIS_NAME%' + "/setupTSXpath")Setup TSX PathZ`Ez]UO GFʠN=@xp }}wPush this button to create a folder named tsx in the truespace folder. This is needed for truespace standalone version.Z`Ez]UO GFʠN=00D }}PSK Import filenameV4; J2fZ`Ez]UO1釥GP>a0@0 }}V4; J2fZ`Ez]UO#nKSM200$V4; J2fƄvR^I҂{iksOˁ CRih[0"Tahoma<*XActivity.Run('%THIS_NAME%' + "/importPSK");Load PSKƄvR^I҂{iks GFʠN=0@`D }}PSA Import filename2{BطFtZ`Ez]UO#nKSM2@0`$2{BطFtƄvR^I҂{iks1釥GP>a`p0 }}2{BطFtZ`Ez]UOOˁ CRih[@`"Tahoma\*XActivity.Run('%THIS_NAME%' + "/importPSA");Load PSAƄvR^I҂{iks GFʠN=0D }}PSK Export filename ִ׮M&EZ`Ez]UO#nKSM20$}} ִ׮M&EZ`Ez]UO1釥GP>a0 }} ִ׮M&EZ`Ez]UOOˁ CRih["Tahoma*ZActivity.Run('%THIS_NAME%' + "/getPSKfile");Save PSKƄvR^I҂{iks GFʠN=0D }}PSA Export filenameA IJlvZ`Ez]UO1釥GP>a0 }}A IJlvZ`Ez]UO#nKSM20$}}A IJlvZ`Ez]UOOˁ CRih["Tahomal*ZActivity.Run('%THIS_NAME%' + "/getPSAfile");Save PSAƄvR^I҂{iksOˁ CRih[`("TahomaPdActivity.Run('%THIS_NAME%' + "/cancelPSAimport");$Cancel PSA ImportƄvR^I҂{iks GFʠN=@(x}}"Tahoma+ reduce keys#ŝCG C:\ÅZ`Ez]UOͽ>fdN*5Ւh@`(, }}#ŝCG C:\ÅZ`Ez]UO GFʠN=(8.}} version 1.3.3Z`Ez]UO AϠOsX%}}Z`Ez]UOOˁ CRih[px"TahomatPTActivity.Run('%THIS_NAME%' + "/clearIK"); delete IK nodesƄvR^I҂{iksOˁ CRih[xhS"Tahoma|Pnewskel = Node.Copy('%THIS_NAME%' + "/NewSkeleton",Space.CurrentScene()); Node.Rename(newskel,"Skeleton");new skeletonƄvR^I҂{iks}}}}48@J g'JNjn*pLE2Data, 2J@#QLLE2Data, 3-1OSM n# 2|=Bynj2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ BNewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here ScriptObject.RunCmd("character editor package/set pose as default", "Selection", ""); } NScript Object Package/jScript language4W}@O{(XFҦV>g'JNjn*pnX@>@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here scene = Space.CurrentScene(); Node.Delete(scene + "/PSKfilename"); } NScript Object Package/jScript language4W}@O{(XFҦV>g'JNjn*pnX@E@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommandN// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here progPath = System.GetMainDir(); scene = Space.CurrentScene(); var forReading = 1, forWriting = 2, forAppending = 8; rline = new Array(); fs = new ActiveXObject("Scripting.FileSystemObject"); thefilename = Node.Value(scene + "/PSKfilename","filename"); justFileName = fs.GetFileName(thefilename); justFileTok = justFileName.split("."); justName = justFileTok[0]; //f = fs.GetFile("c:\\pskvrawboneinf.txt"); f = fs.GetFile(progPath + "\\tsx\\pskvrawboneinf.txt"); connToFile = f.OpenAsTextStream( forReading, 0); numBones = connToFile.ReadLine();//read num bones System.Trace(numBones); boneName = new Array(); for(j=0;j<numBones;j++) { boneName[j] = connToFile.ReadLine(); } numVerts = connToFile.ReadLine();//read num vertices System.Trace(numVerts); weight = new Array(); ptIndex = new Array(); boneIndex = new Array(); boneName2 = new Array(); //for(k=0;k<numVerts;k++) //{ // curLine = connToFile.ReadLine(); // curLineTok = curLine.split(","); // weight[k] = curLineTok[0]; // ptIndex[k] = curLineTok[1]; // boneIndex[k] = curLineTok[2]; // boneName2[k] = curLineTok[3]; //} // read entire file then process count = 0; while( !connToFile.AtEndOfStream ) { curLine = connToFile.ReadLine(); curLineTok = curLine.split(","); weight[count] = curLineTok[0]; ptIndex[count] = curLineTok[1]; boneIndex[count] = curLineTok[2]; boneName2[count] = curLineTok[3]; count++; } //System.Trace(count); skinstream = System.CreateDO('Space 3D Package/Skinning direct stream data'); skinparam = System.CreateDO('Space 3D Package/Skinning parameters DO'); outstream = System.CreateDO('Space 3D Package/Skinning direct stream data'); tsBoneWeights = new Array();//list of all vertex weights for a bone //skinPath = "/Project/Space 3D/Actor, 1/Topology Example Node/Skinning"; //skelPath = "/Project/Space 3D/Actor, 1/Skeleton"; skinPath = scene + "/" + justName + "/PSKNode/Skinning"; skelPath = scene + "/" + justName + "/Skeleton"; for(jind=0;jind<numBones;jind++) { bonePath = skelPath + "/" + boneName[jind] + "Bone"; //System.Trace(bonePath); skinparam = Node.Value(skinPath,"Weights"); //test = skinparam.GetNumBones(); //System.Trace(test); skinstream = skinparam.GetSkinningData(bonePath); //default indexless weights to zero for each vertex for current bone for(ii=0;ii<numVerts;ii++) tsBoneWeights[ii]=0; //for each influence match bone and save weight in point index of array for(jj=0;jj<count;jj++) { if(boneIndex[jj] == jind) tsBoneWeights[ptIndex[jj]] = weight[jj]; } outstream.SetNumSkinWeights(numVerts); for(skw=0;skw<numVerts;skw++) { outstream.weight(skw) = tsBoneWeights[skw]; } skinparam.SetSkinningData(bonePath, outstream); Node.Value(skinPath,"Weights") = skinparam; } //select node for default pose set Node.Select(scene + "/" + justName); } NScript Object Package/jScript language4W}@O{(XFҦV>g'JNjn*pn7X@E@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ .NewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here progPath = System.GetMainDir(); scene = Space.CurrentScene(); var forReading = 1, forWriting = 2, forAppending = 8; rline = new Array(); fs = new ActiveXObject("Scripting.FileSystemObject"); thefilename = Node.Value(scene + "/PSKfilename","filename"); justFileName = fs.GetFileName(thefilename); justFileTok = justFileName.split("."); justName = justFileTok[0]; //f = fs.GetFile("c:\\pskout.txt"); f = fs.GetFile(progPath + "\\tsx\\pskout.txt"); connToFile = f.OpenAsTextStream( forReading, 0); curLine = connToFile.ReadLine();//read header //curLine = connToFile.ReadLine();//first line //curLineTok = curLine.split(","); //bname = curLineTok[0]; //System.Alert(bname); //connToFile.Close(); //return; //read pskout.txt file to get bone names for add bone to skin command //note mystery but ", 1" added to node name put it back //Node.Rename("/Project/Space 3D/Topology Example Node, 1","Topology Example Node"); //truespace root bone CharacterEditor.AttachSkinToBone(scene + "/PSKNode", scene + "/Skeleton/MyBone"); Node.Rename(scene + "/Actor, 1",justName); //actor created at this point so adjust for rest of bones while( !connToFile.AtEndOfStream ) { curLine = connToFile.ReadLine(); curLineTok = curLine.split(","); bname = curLineTok[0]; //CharacterEditor.AttachSkinToBone("/Project/Space 3D/Actor, 1/Topology Example Node","/Project/Space 3D/Actor, 1/Skeleton/" + bname + "Bone"); CharacterEditor.AttachSkinToBone(scene + "/" + justName + "/PSKNode",scene + "/" + justName + "/Skeleton/" + bname + "Bone"); } //remove space from name so fscanf works better //Node.Rename("/Project/Space 3D/Actor, 1","Actor,1"); connToFile.Close(); } NScript Object Package/jScript language4W}@O{(XFҦV>g'JNjn*pn\X@>@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here //ExamplesPlugin.TopologyExample2(); Clintons3dPlugin.ImportPSK(); } NScript Object Package/jScript languageԜ4W}@O{(XFҦV>g'JNjn*pnX@>@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їControlOˁ CRih[ ֠a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0֠a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=0֠}}}\REQUIRED c:\test.psk and scene name must be Space 3D and special skeleton with expandin nodeZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho1(ssD =tZPause Activityk@ BLpA,k@ BLpA,Keep period<Keep constant period in cycle uW}Mzq>uW}Mzq>Period&Timer period in ms֊2|=BynjҊ8׊z@Ho׊4W}@O{$(XFҦV"-1OSM n" asvHhTG asvHhTG$NodeIconNodeIcon eSBgc$2|=Bynjk@ BLpA, (XFҦV>g'JNjn*pF`X@1@? asvHhTGeSBgcR ggFV hkBxRxe|U=yd%x;. wq7݋;w(:uZpcL2.IÇ7+k96d.FP++++++++ҿ*QuR^IՅy4$;FdFӘ4>'MNJӒ@ Y P| 4О$u=h\Z_AC'Ru`B_+I "B3ibJ(M8OZJ+hC-mMm P%L]Iۮ|Ɗ[ҦXZkOKchnM)!46} e/ITM#hZFcЩl{:gOofTJ=rTAg.]|Vl;:=؎Үx+cKKivMDihn:U~OVeP0ϡaQ4"3MQzz-Ίҩt sF:ӷc .h 2Ņ Ms%Wzg?wp/8GtXOaSh퍷47&DQ)ih^&UWOQeI)Ue%ѐzkMSl |:_H9w`Dg-͂BEnDK܉y-V2B n{l#.D`?F8jG̑.ĆSQ4/ҝtaT]T@J~7UQUZ4 lK39Ϭhw@LC.cDErh8A=6ymx{;k=S|ϱ 1F87OKЦKvt,ɆvFYAzG#АW s/HHц(Kڃ>=eK7*34Mcυ`lVh3 LwB>AgWKsJf㺜?8->D: Ą36t a MM#RuA+;x H4-FO %~*|3Cvod:t:NBQ lmKyn"pM>ڡʉo{8cC`Sp2B]WI]hZ_=dE{Pgv#j/'i,v2b&|p xx efG4i9/@FTogwT{`[8$ϻ!kVr~5hb[ >j;Yz:z1Šq*3g׉%TߏFri#r^)S>!yפ_^NI}kR+R.i>w^ڂՉ e2 &v~|{fG6ٽ4,*^:ZȁŃ|@{fiA;C0ØL)>%drL̝}ܻUt]xM4;LOCcè?.DИP{ZׂvD4翩rFT}]ҕym?Qׯ>u6p6 hzgiczFQ/]aO*0n=ŽhA%Ў_:?CyTگ-M @-]EPg+xuj ]KG5~?/}_^ױPlߡj>`[滋$BGr|Ü3*qYTC3CLi@:[َ O_#km_?|본?/&ܨ_pLƀ^ 2Gnz]ɚ`4; ujfFЦ0sәRb06>(?-*Cio`E'l.VOtsjeTo}˱w-3ښO}mwYN<6<+c@]{y#M إu&7X&mi.p5aTLs=ͨSU@7#VV}JUМfq ;зh`u~e98uN˩5g6yrErݿ1@[֌T?$5sޢ[d {b^%8=]=w=t*u!E32lW36- zz'ˑg#dh dpā`  liA3J8PAe!n4 b5J߃w|sK${7)c{sʜ/LA'?"tY%-vvZ ill @hh7^#b/5rm`QhO,izU k| sr;MbBZ8{}PW惡׬խIT:< ãt:].Ax ؁b e?+z:A{h+Ikނ.]u!!wtr-m 1T/=.(/ԡcEGmNس}Ns" d>d +7>"GB ڂE{6e tnYll X|U>"֜ƹNvxۅkŵ@C^c7y #_z:_,}džUP3}{36) qY*-,42 -Ct=Ձ8 qn㺘6s<">:_ &]&̡k!`Mw`r߻QSy*H)\$t=솶BG0mރ=lAlڈCK=u#Y+c st#֞e]h$bkE[jFA4dKWl'z\"lZ|xM>H^o缹c)0xGѿgRVӇ.w[=q{w`w8|PuPאָ}?tc9\l\w|. B;΢=gSx}m:g;О hjoν[g_&ja^/}}ȅ8g)7^TQPҹIN4mcMgQ T,Ʒx|yxh'SOvo·N.'ѯ7o4;D݋{^? v6lno@S֭չ+}E}y= p h%\ _FAhõ\B$lm:6B;;Ͱ鵰Ǖ82LB3e0IW 9˙atf =0.hN=>ؗ̾0'r=[Ӛ^6z=MM~ee=G(E~zy>Rx}|ߋ'<\‰~.|_ޣL D߃ñ 5qv|oq_?ϟG.tcBt0]CMf hDt1b/b6zg5οYQ/kA98ict Cіʒc_*J mO[Ҳ]Mp ޥs]>EZ}NcwNG:p\AwV{kwߦ} |w&@, u~//ǖ<8?s\=]Il<}r\v-7FAH5?G>:Aİ]hf{.j2""W~{ih\UcpQ ;'qt<hB"͛ӊt4܁JvP(.T71ޛ/q,ß {;zb˳ț7b*MMHoiMz,m5ғL,̞gD_#s"yK5}Ե~Y-/o<F^|0Fzjnn\Jih5jcCzO[PCM;6!ƭB{%dTc@=(= uh]))޿'+~e3=a߯;Ql =b| 1D_Ok˺Ss/''G2֓1#qy>| ?}5<#/tηP}A6FS^N[jnnK=Ybi ι_T?ϙW@3}@z41МJc%sC(- 9ǘuz#}RTj|ʟ]5ݟ bI ˛4#+5>v1yUxC_$n"v_S|ۧfo G<"|C /72M̎;✻Q}C؂6.A[1L1/>M?cjRP3=D=P 5.t9Y4&z9%P95Qֲ$ޯнvX{_+#'Fl<}b.MJL~?AЯb}2o+6؅~Jr{]ZQYD//)GO DƴLٖ3ЦW1)>~n򌖗._E1ԕ}Kws0@z:k+OJƚ=꾎ۃ|r4&ցnGڴihgW/Υ;КuGdO&:/ۡ3u]^ssɿ[oQ'hyVK֠M?գ&W}Ear>J(Jqc rnm cJmHcgVzz`ٞJYb[M `sxi_<1/{ ;Ab>UrGa',g1E[ ?naK`[{?CZoj NsߞXv4הyaϕGy~4miG#~B9):'׼^(#z;a/5?K_ ~ {Խ\>bq?_}]*Tߩ^_!؏~}5ԀE2dBINt?ܞ.ђf^3XVVM ]ʫ-lEӛ;cb9G ?5LWc|^J4o% gD5䣸~rd++{( O%; WU#ρ~ߌsĹ`3לQ%QT?Dӭ6t9`jkO9ܺ@nveX8ִa=AQ?1%( ^fۘ?'QKibbeDO1x]F?;}D{KU{5{Ny/ V߂=};+TYC_jW|YyV*rge0r;)ۖNb:ДFy~P7cbnjP;H_$: %w*m8S,A_$p=C.O1_ׂ̐J{ UnUִu^zD%y)w1kl@j [́2^d7x]b_-/`{w}s{յh:#߱7ii/ε5bĩ>Y á!u[yP1Thᘏc5׃t(َ(pzۊnX^Ԁ2ЖʲeIc}LhMWވ1;SHKp)cg *U̍52z?%ݒOF=eςٛ;::P 3[I?$l`'jUy?=m1`pL3ǸKhh%ے ܧ rkNE1FrxҴSڄq`r *sh?^m-0]K}.D_o !- _Y]~oVImewyўb-jXޗ5i J߯J`[P.E{f:8+l Zn2FnmJnP"Д(Q |= 3{tu$צT։*Gu"dN;o; <5hKze]Ǹ Zykݹ^ z Gkן ^)࿿[O"ݢy^ž}޻<e=ƆR6ؔB/î&E=2?H@D·[= Sס$Cp7bHQ_==iMvmM۷;4ݭ)t ,-~T&Lficdim@r?s/u7^*ǘj r%>ǔ~m࿛#_ީ%q>βSؐ%YXX(GbC,9v[?_{C yʂ2?dM4>C>P(l=ܔkA>%fe6hM|r(ÊFXنr)9jY uR KM$m`X^ k)k?t5/zE *x:}| w{O]E$2Vx iӆo}z8?Y/q3{?SIF<8JQP8 7 f`Sג;6¸(*/oUPFj:x~ҙ>S?ԥfkQr{K͘p|օs{%!K ^ nUyKZ|ZYy_kQItFaoeeʽEԴiSjܸ1t:um] 5$=~f+G@~t'Ȑ6UNT71 )͔`[בDXU_%* Dv~{ 6~?j/!ޓDد_o`nC&dfff7o\anhhHO;g-;ڈ؟R{)j7uWs[ϝ :c@ݛ$H%q染9RQ)0vtv͟K T=$uLb3s/O5?y^;GUY3 y/k>@z7iUvYq6 }Ȩ;0Y Os=vZ {*(#F4ѐڻQqdzLL^!TnB-h=HD;ϑ?2Thl`F؀2@Os <&<y=]v<3?sB}OKǹv#IT:Q-ɰq2ohfE8T?!ӡԦ"'@5UBd&w5'9fH3%TүGFSL *A_`ING'Iujrij-.x !/k(}t]_e^w˽K.{xm=;s X4jkB#Ln%ԖroXU=`>_?۩ ZF?C_8 [I-<ca~=07| h9Qss*_o!(՚ZӊVt>@9ZOsdƁJMM8^uo,b_'#߭$ B6̟5E7|i>X}q@[l'[`3shQ}ۂ4(O97y>3Z Ƶs55d/s?v9g'!:anh5Wrh4`2x cPgǁʙ1{5zoK>s6v#/d24 Pf Ct?7U԰|*o@W h!gv:*iZo)(޶  =-9Y'X=5lj`3]ji4?=? C[Nq,O$?~_7I?Nj=.: Γl(65nOqQ_i Thl@rcG b6;#*o3)z`>m2Gm_Wg@ef~ߦ }9ׂ,hK9l/ }륀ch|59hbUOwo0 J7zz7pIH{r|j>`ο?k[ n־}g"؏C^ ; d,Zhx`3QO- ?mY3О̟΢hGb+a82+5wh@ 6 o ִ:Nt(xU'k&p=03 }w޼nz [?XX jp2G5Fhbm+o_SG Νɸ^< Qu">L^~n<#*OHڹ-#]l0zc=Q=Ub<TjZx\sb_xBNd7!W?`Ͽ P_Mzh[u}X#e,.JF80ʿӃش㿃 o#iΝ I^,T4>aP3Uo+b?w}'wp3*u2ft5B  [g q\]js_#l:ب;چL, K(ho 쩫_}6#χkרP)bCb0|~ϵF~h/ǃ2NDu#uyaZWk|#_Bڃ!w?w(E8Ru7^fK_Fݬ 5u@@zj56P{`0& ׂUJc"_gSkυ5YXR6fݙO0ڈ9Ǡ4|- ^>W h27O߃@KѦɰj7hS T0h?׀>k\_-x]kČ0 gzc7 uD1_.ג6uaK|W6sG1?c+6X_ێkā;ɯk=m\Z= c3[4fJE=:֛fR 4š)m5`Q%N"$9.Ld.qu]qlF!OBՒRޕYwfkB6nd{z**O 6:BeE\q? vk ?xJϕc?mߤffPSwþd_?ܿNGS9QQeg A)۾hg+:hIv`ѧ8'1: I@s h@[(1_ %ؽFLML,mkSf͚=]?QfxO }]`&0\{/rofq|.ӜA!`; mAf?>.o-$kC*lNE?7cb)]ߜF7e.頏 mgNoza=q JcIT〳 kǀ|/˜p>92 ޯ2U[Z=V[׆Xq?7jd7WZc9ƀۺ5sBJn-׷`- EG?\o0s -s? [ggcb X7D17e?Z[_OW`_1^`)rfw՞ӭ[|Y q!߂€ 6w75+ 0ލŹV0IW{lqf h,0au]eΣ2t#ڀk߁ |d>PmO;?1b8EJoP,? ? W,tb ?KDm+d879O2π>J3@Lc)]MWsgAҋ6ؿ>2Ɣ>a*-sGmf?}6]Q>|#QHkn9<Ds5 y>ɽKs01! ۈqIގoH}P5)3G{75k9/Ah5~%oA\Pjl,0 PlCp6lGWe8 v9~>f; ~O8E4:"~m(`9>p0ڍ )ŸT0ɿCӚ:Oz*{>Bw7HS?AK(SOEfkmutw 6𥓴M/I-(6a&d*?0~B9m1_?S?#`3zkUb.6׋ UyFY{d 5:B]KMW =Ms:L̶%yzaX:Zi[x,!mW;f{׀??WyiR??>d(bpWy/޿{(s1yq^o~k(`Ahc25&TE%8QR7ֆy(t NF8?hSk_,/Lia PKģ}tpvhS~RoqhfQ9?!3ezІŰÝ?.mGN^}5p[+$b)꿉?1Î~OOwkb!{j!T)lb? y޼ӿ- Mmq-_ q~$}9lk}Eh/{PyޟDK*3E s7/\b.X#m@ ! ? FW!}Fk}׌z >X_ 6P|_1 {WDmiH ,uvy|AƬg|/vFk".OƂ_Վqyi oZM*ub..d?}8dڣ|9 kMލkJ|B' :%hUUdPlM]FW`A?=UځJ,;bm_G1TO(͖}V}k0p[됦5*ꪋNu`3vg{IYОR@bgwo{ܷޤU2+Q+؀x@ӡ2T0h_71H73ahh ym }i#&H \jjC2y%Cd X᠃T}GXӏ#gƹm#ƙݍ:'VʺXtXM.!8OIQ4(뿿&~JO0+aKS&q O\DzwEsҀ60!Z<Sr4qe: 8[v Jmz˿%C/)pѿ82/Uk-]=|cT856e<&mM菾O>|ex4U:z< /Ox]8[ ^ȳ0 ];6|y:תKʚ4K;/,c Tܛ6boٲ9ESBa'm B<&Gް_}sq|)l3Ztk  'unOYm0D}2cR^>sJLS/?ρ?B\^(7xjҘA|-g!D؋yNZMjԬsMl'j!˜ׅFVxBPǥ>R< !?w].KR:O=)њv8FhbD ;y 4 [j gؤ['3ޟ;Uj+#+/mq߀TR٫JL4 Jh {*(1z?}JEmϭ/kxjSkk|1NBCvكh]ݕŇнu/>ޏ w#;ӷ1eza-7i4M4[|Kqhz<#P༗Y*MBF4A`ۇagx>ca ?"f?mek;gü<˓12Ǣ}<98eV1%Uj8^Bxݚzy3zԈ~qB-#%sڂX_{)w; 2s(+[Xh%~XGo7saOY29{k0f0e@l7 &ys`oR6>Q3ͤ5ЮhO31d5c#}KkϹu#ofc=Pq~1euhKmpTbw^ yWS|!; I* 5HTq=dTGzO+ )z"/?>EM:h"pw1R3^:?CEe#rlMh|}Ncr 5]螁Ed F>$wnǚϩYÜmky=ܞ}d{o~秷@ llDT\XS9X02)' ٙ0$:e<s@e<ݖ1}𵴅41Bk?=G?k|[w|l_9s>@:㪁ÜNh#ھBs3a]$G(UTRQ\V2'6p<0yMOI_*#|&vPgz(8D=y97q]wBqncQͨσJ""_l_I )?۴QƊ?aP pOCio>[Kxmlg3ڶul)hSE-I*/(Uֻ:Q xŒJ,\+ydrVbxuK궴&MW_Ün\5< ;v1@*4 ^qo7LJS)?;z:S1:uX+9]"ᘌHgiwF~Qy>s>?s|_ \?m{2]Tܵ3'PE~K,;##)s{*rSW-iSXubxM{>%}^9+?&cg5ηgxv Ƭ+\lP+1<=U]ge3DEQ ޮThEC,iTK#< ׎ Zq2 ׫\ UOefbvn3q ;Ҵ [Pt Dgː#{0xS3U:P[SaтFiL0  Cxyxa4ɨF4P]U;vn>^(A3I⚡qJRmP{P z8)*[r)jRATکvF}PiT4\{WzWzWzWzWzWzS?uW}Mzq>B-1OSM n 럆L<_ї GFʠN= P0< }} Control Inz@HoZ`Ez]UO GFʠN= K }}Keep fixed period in cyclek@ BLpA,Z`Ez]UOͽ>fdN*5Ւh , }}k@ BLpA,Z`Ez]UO GFʠN=81 }}uW}Mzq>Z`Ez]UO1釥GP>ap0 }}uW}Mzq>Z`Ez]UO GFʠN=P 0= }} Control Out2|=BynjZ`Ez]UON\q+nN-K^8pA\VV.@p@uW}Mzq>Z`Ez]UOY@z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ HNewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); Node.Copy(owner + "/Skeleton",Space.CurrentScene()); Node.Copy(owner + "/PSKimportfilename",Space.CurrentScene()); Node.Rename(Space.CurrentScene() + "/PSKimportfilename","PSKfilename"); } NScript Object Package/jScript language|x>4W}@O{(XFҦV>g'JNjn*pnX@>@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here scene = Space.CurrentScene(); Node.Delete(scene + "/PSAfilename"); } NScript Object Package/jScript language 4W}@O{(XFҦV>g'JNjn*pn\X@E@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ x NewCommand // Execute // Called to execute the command function Execute(params) { // TODO: put your action code here var forReading = 1, forWriting = 2, forAppending = 8; progPath = System.GetMainDir(); scene = Space.CurrentScene(); theMatrix = System.CreateDO('Math Package/Matrix Float Data'); fs = new ActiveXObject("Scripting.FileSystemObject"); //f = fs.GetFile("c:\\psaout3.txt"); f = fs.GetFile(progPath + "\\tsx\\psaout3.txt"); connToFile = f.OpenAsTextStream( forReading, 0); prevFrame = 0; curFrame = 0; sel = Node.FirstSelected();//full path to selection //actor created at this point so adjust for rest of bones while( !connToFile.AtEndOfStream) { curLine = connToFile.ReadLine(); curLineTok = curLine.split(","); bname = curLineTok[0]; //System.Trace(bname); curFrame = curLineTok[7]; if(curFrame != prevFrame) { //RsAnim.SetKeyFrame("/Project/Space 3D/Actor,1/Skeleton", prevFrame); RsAnim.SetKeyFrame(sel + "/Skeleton", prevFrame); prevFrame = curFrame; System.Trace(curFrame); } theMatrix.LoadIdentity(); theMatrix.SetTransX(curLineTok[1]); theMatrix.SetTransY(curLineTok[2]); theMatrix.SetTransZ(curLineTok[3]); theMatrix.SetPitch(curLineTok[4]); theMatrix.SetRoll(curLineTok[5]); theMatrix.SetYaw(curLineTok[6]); //Node.Value("/Project/Space 3D/Actor,1/Skeleton/" + bname, "Matrix") = theMatrix; Node.Value(sel + "/Skeleton/" + bname, "Matrix") = theMatrix; } //RsAnim.SetKeyFrame("/Project/Space 3D/Actor,1/Skeleton", curFrame); RsAnim.SetKeyFrame(sel + "/Skeleton", curFrame); connToFile.Close(); } NScript Object Package/jScript language4W}@O{(XFҦV>g'JNjn*pn}X@>@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here //ExamplesPlugin.TopologyExample4(); Clintons3dPlugin.ImportPSA(); } NScript Object Package/jScript language4W}@O{(XFҦV>g'JNjn*pn@X@1@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho1(ssD =4_$Pause Activity, 1k@ BLpA,uW}Mzq>2|=Bynj8z@Ho4W}@O{$(XFҦV"-1OSM n" asvHhTG$2|=Bynjk@ BLpA, (XFҦV>g'JNjn*pF X@>@? asvHhTGeSBgc8 ggFV hkBuW}Mzq>-1OSM n 럆L<_ї GFʠN= P0< }} Control Inz@HoZ`Ez]UO GFʠN= K }}Keep fixed period in cyclek@ BLpA,Z`Ez]UOͽ>fdN*5Ւh , }}k@ BLpA,Z`Ez]UO GFʠN=81 }}uW}Mzq>Z`Ez]UO1釥GP>ap0 }}uW}Mzq>Z`Ez]UO GFʠN=P 0= }} Control Out2|=BynjZ`Ez]UON\q+nN-K^8pA\VV.@p@uW}Mzq>Z`Ez]UOY@z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here scene = Space.CurrentScene(); Node.Delete(scene + "/PSKfilename"); } NScript Object Package/jScript language~൱D!#^c4W}@O{(XFҦV>g'JNjn*pn\X@E@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here //ExamplesPlugin.HelloWorld2(); Clintons3dPlugin.ExportPSK(); //bob=System.CreateDO('Space 3D Package/Material List Data'); //sue=System.CreateDO('Space 3D Package/Material Index Stream Data'); } NScript Object Package/jScript language 2Dҗ4W}@O{(XFҦV>g'JNjn*pnX@1@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho1(ssD =O$Pause Activity, 2k@ BLpA,uW}Mzq>2|=Bynj8z@Ho4W}@O{$(XFҦV"-1OSM n" asvHhTG$2|=Bynjk@ BLpA, (XFҦV>g'JNjn*pF`X@>@? asvHhTGeSBgc8 ggFV hkBuW}Mzq>-1OSM n 럆L<_ї GFʠN= P0< }} Control Inz@HoZ`Ez]UO GFʠN= K }}Keep fixed period in cyclek@ BLpA,Z`Ez]UOͽ>fdN*5Ւh , }}k@ BLpA,Z`Ez]UO GFʠN=81 }}uW}Mzq>Z`Ez]UO1釥GP>ap0 }}uW}Mzq>Z`Ez]UO GFʠN=P 0= }} Control Out2|=BynjZ`Ez]UON\q+nN-K^8pA\VV.@p@uW}Mzq>Z`Ez]UOY@z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ ]NewCommandN]// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); scene = Space.CurrentScene(); Node.Copy(owner + "/PSKexportfilename",Space.CurrentScene()); Node.Rename(scene + "/PSKexportfilename", "PSKfilename"); progPath = System.GetMainDir(); //declare arrays, use for loop with break set all clear flag for each time run for loop if all clear at end then done jointList = new Array(); jointList.path = new Array();//full parth to joints jointList.parentIndex = new Array();//parent index in this array of the parent jointList.numChildren = new Array();//number of children for this joint jointList.curChild = new Array();//the current child node that is being explored //quaternion storage jointList.qx = new Array(); jointList.qy = new Array(); jointList.qz = new Array(); jointList.qw = new Array(); firstSel = Node.FirstSelected();//full path to selection skelPath = firstSel + "/Skeleton"; num = Node.LinkedOutputNodeCount(skelPath + "/Skeleton root","Joint");//skeleton root is like an invisible first joint for truespace dummyBone = Node.LinkedOutputNode(skelPath + "/Skeleton root","Joint",0);//full path name of dummy bone //dummy bone can only have 2 joints num = Node.LinkedOutputNodeCount(dummyBone,"Bone"); if(num>2) { System.Alert("to many joint connections to dummy bone"); return; } startJoint=""; for(i=0;i<num;i++) { jointName = Node.LinkedOutputNode(dummyBone,"Bone",i);//full joint path name System.Trace(jointName); num2 = Node.LinkedOutputNodeCount(jointName,"Joint"); System.Trace(num2); //dummy joint has no children //if joint has child bone then is the start of doom3 heirarchy if(num2>0) { startJoint = jointName; num3 = Node.LinkedOutputNodeCount(jointName + "Bone","Bone"); numchild = num3; } //System.Trace("joint" + i +" has " + num2); } System.Trace("start"); //System.Trace(startJoint); //System.Trace(numchild); //save origin joint to the list jointList.path[0] = startJoint;//full path to joint jointList.parentIndex[0] = -1; jointList.numChildren[0] = numchild; jointList.curChild[0] = 0; currIndex = 0;//track current joint lastIndex = 0;//add new joints to list here while(currIndex != -1) { //add current child to list //if not the last joint child of the current joint if(jointList.curChild[currIndex] < jointList.numChildren[currIndex]) { //number of bone children of current joint - always 1 or 0 //ik handle and stops removed before export //no leaf joints allowed on origin joint //if joint has child bone then is not a leaf //child bone of the current joint curBone = Node.LinkedOutputNode(jointList.path[currIndex],"Joint",0); //System.Trace(curBone); //current child joint currentChildIndex = jointList.curChild[currIndex];//read index of current child joint curJoint = Node.LinkedOutputNode(curBone,"Bone",currentChildIndex); //System.Trace(curJoint); //check for limb boneInOut = Node.LinkedInputNodeCount(curJoint,"Bone") + Node.LinkedOutputNodeCount(curJoint,"Bone"); if(boneInOut==2) { //limb found curJoint = Node.LinkedOutputNode(curJoint,"Bone"); //System.Trace("limb found"); } //if pre leaf joint then do leaf stuff otherwise continue //qleafbone and qleafjoint are guranteed to exist because of "no leaf joints on origin bone rule" qleafbone = Node.LinkedOutputNode(curJoint,"Joint",0); qleafjoint = Node.LinkedOutputNode(qleafbone,"Bone",0); //check for limb boneInOut = Node.LinkedInputNodeCount(qleafjoint,"Bone") + Node.LinkedOutputNodeCount(qleafjoint,"Bone"); if(boneInOut==2) { //limb found qleafjoint = Node.LinkedOutputNode(qleafjoint,"Bone"); //System.Trace("limb found leaf"); } //check see if last joint(grandchild of current joint) has a child bone, if not then is a leaf leaftest = Node.LinkedOutputNodeCount(qleafjoint,"Joint"); if(leaftest!=0) { //get num children(joints) - get child bone of child joint then num joints hooked to that childBoneOfChildJoint = Node.LinkedOutputNode(curJoint,"Joint",0); numchild = Node.LinkedOutputNodeCount(childBoneOfChildJoint,"Bone");//number of grandchildren throught this child joint //System.Trace("not a leaf"); } else { numchild = 0;//leaf has no children //System.Trace("leaf declared"); } //save to the list lastIndex++; jointList.path[lastIndex] = curJoint;//full path to joint jointList.parentIndex[lastIndex] = currIndex; jointList.numChildren[lastIndex] = numchild; jointList.curChild[lastIndex] = 0; //System.Trace(curJoint); //System.Trace(numchild); currIndex = lastIndex; } //last child of current joint else { parentIndex = jointList.parentIndex[currIndex]; //update the parent's current child index to point to next child jointList.curChild[parentIndex]++; //set parent as current index currIndex = parentIndex; } }//end of loop all joints are in the list when currIndex = -1 numJoints = lastIndex + 1; System.Trace(numJoints); System.Trace("end"); //return; var forReading = 1, forWriting = 2, forAppending = 8; fs = new ActiveXObject("Scripting.FileSystemObject"); //fs.CreateTextFile("c://pskvbone.txt",true); //f = fs.GetFile("c://pskvbone.txt"); fs.CreateTextFile(progPath + "//tsx//pskvbone.txt",true); f = fs.GetFile(progPath + "//tsx//pskvbone.txt"); var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0; connToFile = f.OpenAsTextStream( forWriting, TristateUseDefault); //header num bones theLine = lastIndex + 1; connToFile.WriteLine(theLine); myScale=10;//inverse of plugin scale myMatrix = System.CreateDO('Math Package/Matrix Float Data'); for(jind=0;jind<=lastIndex;jind++) { //System.Trace(jointList.path[j] + " " + jointList.parentIndex[j]); myMatrix = Node.Value(jointList.path[jind],"Matrix"); xval = myMatrix.GetTransX() * myScale; yval = myMatrix.GetTransY() * myScale; zval = myMatrix.GetTransZ() * myScale; qx = 0; qy = 0; qz = 0; qw = 0; mattoquat(myMatrix); theLine = Node.ShortName(jointList.path[jind]) + " " + jointList.numChildren[jind] + " " + jointList.parentIndex[jind]; theLine = theLine + " " + qx.toFixed(6) + " " + qy.toFixed(6) + " " + qz.toFixed(6) + " " + qw.toFixed(6); theLine = theLine + " " + xval.toFixed(6) + " " + yval.toFixed(6) + " " + zval.toFixed(6); connToFile.WriteLine(theLine); } connToFile.Close(); //************************************************ // now do raw bone influences text file //************************************************ //find mesh node childCount = Node.SubObjectCount(firstSel); for(i=0;i<childCount;i++) { curNode = Node.SubObject(firstSel,i);//short name of child if(curNode!="Skeleton" && Node.ConExists(firstSel + "/" + curNode,"Mesh")) meshPath = firstSel + "/" + curNode; } System.Trace(meshPath); dM = System.CreateDO("Space 3D Package/Mesh Data"); dV = System.CreateDO("Space 3D Package/Vertex Stream Data"); dM = Node.Value(meshPath + "/Editable shape", 'Mesh');//editable shape added to stop crash mesh is coming to outside via skinning node dV = dM.GetVertices(); numverts = dV.GetNumVertices(); System.Trace(numverts); skinparam = System.CreateDO('Space 3D Package/Skinning parameters DO'); skinstream = System.CreateDO('Space 3D Package/Skinning direct stream data');//IRdSkinWeightDirect skinparam = Node.Value(meshPath + "/Skinning","Weights"); // create/open the file //fs.CreateTextFile("c://pskvrawboneinf.txt",true); //f = fs.GetFile("c://pskvrawboneinf.txt"); fs.CreateTextFile(progPath + "//tsx//pskvrawboneinf.txt",true); f = fs.GetFile(progPath + "//tsx//pskvrawboneinf.txt"); var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0; connToFile = f.OpenAsTextStream( forWriting, TristateUseDefault); //get num influences numinf = 0; for(bind=0;bind<=lastIndex;bind++) { //get bone from joint - joint and bone always together, not seperated by limb theJoint = jointList.path[bind]; theBone = Node.LinkedOutputNode(theJoint,"Joint",0); System.Trace(theBone); skinstream = skinparam.GetSkinningData(theBone); if(!skinstream) System.Trace("empty bone weight found " + theJoint);//actually not a problem else { //numweight = skinstream.GetNumSkinWeights(); //numweight = skinstream.GetNumSkinWeights(); //System.Trace(theJoint + " has " + numweight); //temp = 0; for(pt=0;pt<numverts;pt++) { //if(skinstream.weight(wt) > 0) temp++; wt = skinstream.weight(pt); if(wt > 0) { //theLine = wt.toFixed(10) + " " + pt + " " + bind; //connToFile.WriteLine(theLine); numinf++; } } //if(bind==0) System.Trace(theJoint + " has " + numweight); } } theLine = numinf; connToFile.WriteLine(theLine); //for each bone write out its bone influences for(bind=0;bind<=lastIndex;bind++) { //get bone from joint - joint and bone always together, not seperated by limb theJoint = jointList.path[bind]; theBone = Node.LinkedOutputNode(theJoint,"Joint",0); //System.Trace(theBone); skinstream = skinparam.GetSkinningData(theBone); if(!skinstream) System.Trace("empty bone weight found " + theJoint);//actually not a problem else { //numweight = skinstream.GetNumSkinWeights(); //System.Trace(theJoint + " has " + numweight); //temp = 0; for(pt=0;pt<numverts;pt++) { //if(skinstream.weight(wt) > 0) temp++; wt = skinstream.weight(pt); if(wt > 0) { theLine = wt.toFixed(10) + " " + pt + " " + bind; connToFile.WriteLine(theLine); } } //if(bind==0) System.Trace(theJoint + " has " + numweight); } } connToFile.Close(); } //from Advanced Animation and rendering techniques Alan Watt, Mark Watt //math for tr > 0 verified //tr <= 0 take on faith function mattoquat(myMatrix) { qx = 1; qy = 2; qz = 3; qw = 4; nxt = new Array(); nxt[0] = 1; nxt[1] = 2; nxt[2] = 0;//YZX tr = myMatrix.GetAt(0,0) + myMatrix.GetAt(1,1) + myMatrix.GetAt(2,2); if(tr > 0) { s = Math.sqrt(tr + 1); qw = 0.5 * s; s = 0.5 / s; //qx = s * (myMatrix.GetAt(1,2) - myMatrix.GetAt(2,1)); //qy = s * (myMatrix.GetAt(2,0) - myMatrix.GetAt(0,2)); //qz = s * (myMatrix.GetAt(0,1) - myMatrix.GetAt(1,0)); //make negative for doom3 quats(had do same for lightwave exporter qx = -s * (myMatrix.GetAt(1,2) - myMatrix.GetAt(2,1)); qy = -s * (myMatrix.GetAt(2,0) - myMatrix.GetAt(0,2)); qz = -s * (myMatrix.GetAt(0,1) - myMatrix.GetAt(1,0)); } else { //TODO: put real code here, possible is not needed we'll see //found need when exporting animation so add here too //for doom3 get flipping so use w to determine sign of result later qx = 1; qy = 2; qz = 3; qw = 4; i=0;//X if(myMatrix.GetAt(1,1) > myMatrix.GetAt(0,0)) i = 1;//Y if(myMatrix.GetAt(2,2) > myMatrix.GetAt(i,i)) i = 2;//Z j = nxt[i]; k = nxt[j] s = Math.sqrt((myMatrix.GetAt(i,i) - (myMatrix.GetAt(j,j) + myMatrix.GetAt(k,k))) + 1); if(i==0) qx = -s * 0.5; if(i==1) qy = -s * 0.5; if(i==2) qz = -s * 0.5; s = 0.5 / s; qw = (myMatrix.GetAt(j,k) - myMatrix.GetAt(k,j)) * s; qj = (myMatrix.GetAt(i,j) + myMatrix.GetAt(j,i)) * s; if(j==0) qx = -qj; if(j==1) qy = -qj; if(j==2) qz = -qj; qk = (myMatrix.GetAt(i,k) + myMatrix.GetAt(k,i)) * s; if(k==0) qx = -qk; if(k==1) qy = -qk; if(k==2) qz = -qk; } return; }NScript Object Package/jScript languaged 4W}@O{(XFҦV>g'JNjn*pnXX@1@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here scene = Space.CurrentScene(); Node.Delete(scene + "/PSAfilename"); } NScript Object Package/jScript languageLv>4W}@O{(XFҦV>g'JNjn*pnIoX@E@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand~// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here //ExamplesPlugin.HelloWorld3(); Clintons3dPlugin.ExportPSA(); } NScript Object Package/jScript languaget4W}@O{(XFҦV>g'JNjn*pn@koX@1@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho1(ssD =8$Pause Activity, 3k@ BLpA,uW}Mzq>82|=Bynj8 z@Ho84W}@O{$(XFҦV"-1OSM n" asvHhTG$2|=Bynjk@ BLpA, (XFҦV>g'JNjn*pF`oX@>@? asvHhTGeSBgc8 ggFV hkBuW}Mzq>-1OSM n 럆L<_ї GFʠN= P0< }} Control Inz@HoZ`Ez]UO GFʠN= K }}Keep fixed period in cyclek@ BLpA,Z`Ez]UOͽ>fdN*5Ւh , }}k@ BLpA,Z`Ez]UO GFʠN=81 }}uW}Mzq>Z`Ez]UO1釥GP>ap0 }}uW}Mzq>Z`Ez]UO GFʠN=P 0= }} Control Out2|=BynjZ`Ez]UON\q+nN-K^8pA\VV.@p@uW}Mzq>Z`Ez]UOY@z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ fRNewCommandQ// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); scene = Space.CurrentScene(); Node.Copy(owner + "/PSAexportfilename",Space.CurrentScene()); Node.Rename(scene + "/PSAexportfilename", "PSAfilename"); progPath = System.GetMainDir(); //declare arrays, use for loop with break set all clear flag for each time run for loop if all clear at end then done jointList = new Array(); jointList.path = new Array();//full parth to joints jointList.parentIndex = new Array();//parent index in this array of the parent jointList.numChildren = new Array();//number of children for this joint jointList.curChild = new Array();//the current child node that is being explored //quaternion storage jointList.qx = new Array(); jointList.qy = new Array(); jointList.qz = new Array(); jointList.qw = new Array(); myScale = 10;//inverse of import scale firstSel = Node.FirstSelected();//full path to selection skelPath = firstSel + "/Skeleton"; num = Node.LinkedOutputNodeCount(skelPath + "/Skeleton root","Joint");//skeleton root is like an invisible first joint for truespace dummyBone = Node.LinkedOutputNode(skelPath + "/Skeleton root","Joint",0);//full path name of dummy bone //dummy bone can only have 2 joints num = Node.LinkedOutputNodeCount(dummyBone,"Bone"); if(num>2) { System.Alert("to many joint connections to dummy bone"); return; } startJoint=""; for(i=0;i<num;i++) { jointName = Node.LinkedOutputNode(dummyBone,"Bone",i);//full joint path name System.Trace(jointName); num2 = Node.LinkedOutputNodeCount(jointName,"Joint"); System.Trace(num2); //dummy joint has no children //if joint has child bone then is the start of doom3 heirarchy if(num2>0) { startJoint = jointName; num3 = Node.LinkedOutputNodeCount(jointName + "Bone","Bone"); numchild = num3; } //System.Trace("joint" + i +" has " + num2); } System.Trace("start"); RsAnim.PutFrame(firstSel,0);//start @ frame 0 for bones just in case some ref pose needed to match(probably not) //System.Trace(startJoint); //System.Trace(numchild); //save origin joint to the list jointList.path[0] = startJoint;//full path to joint jointList.parentIndex[0] = -1; jointList.numChildren[0] = numchild; jointList.curChild[0] = 0; currIndex = 0;//track current joint lastIndex = 0;//add new joints to list here while(currIndex != -1) { //add current child to list //if not the last joint child of the current joint if(jointList.curChild[currIndex] < jointList.numChildren[currIndex]) { //number of bone children of current joint - always 1 or 0 //ik handle and stops removed before export //no leaf joints allowed on origin joint //if joint has child bone then is not a leaf //child bone of the current joint curBone = Node.LinkedOutputNode(jointList.path[currIndex],"Joint",0); //System.Trace(curBone); //current child joint currentChildIndex = jointList.curChild[currIndex];//read index of current child joint curJoint = Node.LinkedOutputNode(curBone,"Bone",currentChildIndex); //System.Trace(curJoint); //check for limb boneInOut = Node.LinkedInputNodeCount(curJoint,"Bone") + Node.LinkedOutputNodeCount(curJoint,"Bone"); if(boneInOut==2) { //limb found curJoint = Node.LinkedOutputNode(curJoint,"Bone",0); //System.Trace("limb found"); } //if pre leaf joint then do leaf stuff otherwise continue //qleafbone and qleafjoint are guranteed to exist because of "no leaf joints on origin bone rule" qleafbone = Node.LinkedOutputNode(curJoint,"Joint",0); qleafjoint = Node.LinkedOutputNode(qleafbone,"Bone",0); //check for limb boneInOut = Node.LinkedInputNodeCount(qleafjoint,"Bone") + Node.LinkedOutputNodeCount(qleafjoint,"Bone"); if(boneInOut==2) { //limb found //qleafjoint = Node.LinkedOutputNode(qleafjoint,"Bone"); qleafjoint = Node.LinkedOutputNode(qleafjoint,"Bone",0);//jan 2010 //System.Trace("limb found leaf"); } //check see if last joint(grandchild of current joint) has a child bone, if not then is a leaf leaftest = Node.LinkedOutputNodeCount(qleafjoint,"Joint"); if(leaftest!=0) { //get num children(joints) - get child bone of child joint then num joints hooked to that childBoneOfChildJoint = Node.LinkedOutputNode(curJoint,"Joint",0); numchild = Node.LinkedOutputNodeCount(childBoneOfChildJoint,"Bone");//number of grandchildren throught this child joint //System.Trace("not a leaf"); } else { numchild = 0;//leaf has no children //System.Trace("leaf declared"); } //save to the list lastIndex++; jointList.path[lastIndex] = curJoint;//full path to joint jointList.parentIndex[lastIndex] = currIndex; jointList.numChildren[lastIndex] = numchild; jointList.curChild[lastIndex] = 0; //System.Trace(curJoint); //System.Trace(numchild); currIndex = lastIndex; } //last child of current joint else { parentIndex = jointList.parentIndex[currIndex]; //update the parent's current child index to point to next child jointList.curChild[parentIndex]++; //set parent as current index currIndex = parentIndex; } }//end of loop all joints are in the list when currIndex = -1 numJoints = lastIndex + 1; System.Trace(numJoints); System.Trace("end"); //return; var forReading = 1, forWriting = 2, forAppending = 8; fs = new ActiveXObject("Scripting.FileSystemObject"); //fs.CreateTextFile("c://psadata.txt",true); //f = fs.GetFile("c://psadata.txt"); fs.CreateTextFile(progPath + "//tsx//psadata.txt",true); f = fs.GetFile(progPath + "//tsx//psadata.txt"); var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0; connToFile = f.OpenAsTextStream( forWriting, TristateUseDefault); var r, ss; var re = new RegExp(" ","g"); //header num bones theLine = lastIndex + 1; connToFile.WriteLine(theLine); myScale=10;//inverse of plugin scale myMatrix = System.CreateDO('Math Package/Matrix Float Data'); for(jind=0;jind<=lastIndex;jind++) { //System.Trace(jointList.path[j] + " " + jointList.parentIndex[j]); myMatrix = Node.Value(jointList.path[jind],"Matrix"); xval = myMatrix.GetTransX() * myScale; yval = myMatrix.GetTransY() * myScale; zval = myMatrix.GetTransZ() * myScale; //inverse matrix joint 0 if(jind==0) myMatrix = myMatrix.Invert(); qx = 0; qy = 0; qz = 0; qw = 0; mattoquat(myMatrix); //NOTE: spaces not allowed in joint names shortname = Node.ShortName(jointList.path[jind]); ss = shortname.replace(re,"?"); //theLine = Node.ShortName(jointList.path[jind]) + " " + jointList.numChildren[jind] + " " + jointList.parentIndex[jind]; theLine = ss + " " + jointList.numChildren[jind] + " " + jointList.parentIndex[jind]; theLine = theLine + " " + qx.toFixed(8) + " " + qy.toFixed(8) + " " + qz.toFixed(8) + " " + qw.toFixed(8); theLine = theLine + " " + xval.toFixed(8) + " " + yval.toFixed(8) + " " + zval.toFixed(8); //theLine = theLine + " " + jointList.path[jind]; connToFile.WriteLine(theLine); } firstFrame = Node.Value("/Preferences/AnimPref","PlayRangeStart"); lastFrame = Node.Value("/Preferences/AnimPref","PlayRangeEnd"); //frameRate = Node.Value("/Preferences/AnimPref","Frame Rate");//this is enum value not a number frameRate = 30.0;//TODO get real fps //anim header info connToFile.WriteLine(firstFrame); connToFile.WriteLine(lastFrame); connToFile.WriteLine(frameRate); //now write keys to the file for(frm=firstFrame;frm<=lastFrame;frm++) { RsAnim.PutFrame(firstSel,frm); for(jind=0;jind<=lastIndex;jind++) { myMatrix = Node.Value(jointList.path[jind],"Matrix");//Matrix give rel to parent xval = myMatrix.GetTransX() * myScale; yval = myMatrix.GetTransY() * myScale; zval = myMatrix.GetTransZ() * myScale; qx = 0; qy = 0; qz = 0; qw = 0; mattoquat(myMatrix); //use sign of quat w to fix flipping for doom3 //if(qw<0) //{ // qx = -qx ; // qy = -qy ; // qz = -qz ; //} theLine = xval.toFixed(8) + " " + yval.toFixed(8) + " " + zval.toFixed(8); theLine = theLine + " " + qx.toFixed(8) + " " + qy.toFixed(8) + " " + qz.toFixed(8) + " " + qw.toFixed(8); connToFile.WriteLine(theLine); } } connToFile.Close(); } //***************************************************** //***************************************************** //***************************************************** //from Advanced Animation and rendering techniques Alan Watt, Mark Watt //math for tr > 0 verified //tr <= 0 take on faith function mattoquat(myMatrix) { nxt = new Array(); nxt[0] = 1; nxt[1] = 2; nxt[2] = 0; //YZX qx = 1; qy = 2; qz = 3; qw = 4; tr = myMatrix.GetAt(0,0) + myMatrix.GetAt(1,1) + myMatrix.GetAt(2,2); if(tr > 0) { s = Math.sqrt(tr + 1); qw = 0.5 * s; s = 0.5 / s; //qx = s * (myMatrix.GetAt(1,2) - myMatrix.GetAt(2,1)); //qy = s * (myMatrix.GetAt(2,0) - myMatrix.GetAt(0,2)); //qz = s * (myMatrix.GetAt(0,1) - myMatrix.GetAt(1,0)); //make negative for doom3 quats(had do same for lightwave exporter qx = -s * (myMatrix.GetAt(1,2) - myMatrix.GetAt(2,1)); qy = -s * (myMatrix.GetAt(2,0) - myMatrix.GetAt(0,2)); qz = -s * (myMatrix.GetAt(0,1) - myMatrix.GetAt(1,0)); } else { //TODO: put real code here, possible is not needed we'll see //getting some sign flip but numbers look good qx = 1; qy = 2; qz = 3; qw = 4; var j; var k; var i=0;//X if(myMatrix.GetAt(1,1) > myMatrix.GetAt(0,0)) i = 1;//Y if(myMatrix.GetAt(2,2) > myMatrix.GetAt(i,i)) i = 2;//Z j = nxt[i]; k = nxt[j] s = Math.sqrt((myMatrix.GetAt(i,i) - (myMatrix.GetAt(j,j) + myMatrix.GetAt(k,k))) + 1); if(i==0) qx = -s * 0.5; if(i==1) qy = -s * 0.5; if(i==2) qz = -s * 0.5; s = 0.5 / s; qw = (myMatrix.GetAt(j,k) - myMatrix.GetAt(k,j)) * s; qj = (myMatrix.GetAt(i,j) + myMatrix.GetAt(j,i)) * s; if(j==0) qx = -qj; if(j==1) qy = -qj; if(j==2) qz = -qj; qk = (myMatrix.GetAt(i,k) + myMatrix.GetAt(k,i)) * s; if(k==0) qx = -qk; if(k==1) qy = -qk; if(k==2) qz = -qk; } return; } NScript Object Package/jScript language~൱D@ j#^c4W}@O{(XFҦV>g'JNjn*pn`ob@H@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand>// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); if(Node.Exists("/Status Line")) { if(Node.ConExists("/Status Line","Model")) Node.Value("/Status Line","Model") = ""; } } NScript Object Package/jScript language\; 4W}@O{(XFҦV>g'JNjn*pnb@H@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Hoͤ*EgbĬ$PSKimportfilename2AEHM'ceZU@䑧r%p4W}@O{$(XFҦV#.;]kI 忞@"-1OSM n#p!@L-B~t!@L-B~DfilenameDC%kFClTC%kFClB dummyB!@L-B~XD:\ut3pskfeb2009\ut3pskfeb2009\UT3_Male.PSK2AEHM'>g'JNjn*pFBC`@0@?ceZU@䑧r[җJs@ NewObject// OnComputeOutputs // Called to compute values of all output connectors function OnComputeOutputs(params) { var filename = params.ConValue('filename'); // TODO: put your computation here params.ConValue('dummy') = filename; } NScript Object Package/jScript languagestringfilename!@L-B~string dummyC%kFCl4W}@O{(XFҦV>g'JNjn*pF X@1@?C%kFClXD:\ut3pskfeb2009\ut3pskfeb2009\UT3_Male.PSK.;]kI 忞@-1OSM n 럆L<_їDefault GFʠN=F 1 }}!@L-B~Z`Ez]UO1釥GP>aH 0 }}!@L-B~Z`Ez]UO GFʠN=F  1 }}C%kFClZ`Ez]UO1釥GP>aH  0 }}C%kFClZ`Ez]UO48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here var dummy = params.ConValue('dummy'); if(Node.Exists("/Status Line")) { if(Node.ConExists("/Status Line","Model")) Node.Value("/Status Line","Model") = "importing PSK file"; } scene = Space.CurrentScene(); if(Node.Exists(scene + "/PSKfilename")) Node.Delete(scene + "/PSKfilename"); //create encapsulator theNode = Node.Create('Kernel Package/Object',Space.CurrentScene()); nn = Node.Rename(theNode,"PSKNode"); //create transform inside encapsulator trans = Node.Create('Space 3D Package/Transform',nn); //export the transforms connectors Node.ExportConnector(trans,"Matrix","",1,1); Node.ExportConnector(trans,"WldMatrix","",1,1); Node.ExportConnector(trans,"ObjMatrix","",1,1); Node.ExportConnector(trans,"OwnerMatrix","",1,1); } NScript Object Package/jScript languagestring dummy|HɈ 4W}@O{(XFҦV>g'JNjn*pn@`@@P@2|=Bynj|?z@Hoۙ>?|HɈ XD:\ut3pskfeb2009\ut3pskfeb2009\UT3_Male.PSKJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ VNewCommandr// Execute // Called to execute the command function Execute(params) { var dummy = params.ConValue('dummy'); // TODO: put your action code here if(Node.Exists("/Status Line")) { if(Node.ConExists("/Status Line","Model")) Node.Value("/Status Line","Model") = "importing PSA file"; } scene = Space.CurrentScene(); owner = System.ThisOwner(); if(Node.Exists(scene + "/PSAfilename")) Node.Delete(scene + "/PSAfilename"); Node.Copy(owner + "/PSAimportfilename", scene); Node.Rename(scene + "/PSAimportfilename","PSAfilename"); } NScript Object Package/jScript language~൱Dl  #^cstring dummya+ksI z ;4W}@O{(XFҦV>g'JNjn*pn`@@P@2|=Bynj|?z@Hoۙ>?a+ksI z ;JD:\unrealAnimation_Demo\Pendulum.PSAJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J I[vPˁSf> I[vPˁD dummyDp2|=Bynj{z@Ho 2|=Bynj2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand6// Execute // Called to execute the command function Execute(params) { var dummy = params.ConValue('dummy'); // TODO: put your action code here if(Node.Exists("/Status Line")) { if(Node.ConExists("/Status Line","Model")) Node.Value("/Status Line","Model") = "exporting psk mesh"; } //reset to default pose ScriptObject.RunCmd("character editor package/reset pose", "Selection", ""); scene = Space.CurrentScene(); if(Node.Exists(scene + "/PSKfilename")) Node.Delete(scene + "/PSKfilename"); } NScript Object Package/jScript language~൱D@ j#^cstring dummySf> I[vPˁ4W}@O{(XFҦV>g'JNjn*pnb@@P@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?Sf> I[vPˁ-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ \NewCommandx// Execute // Called to execute the command function Execute(params) { var dummy = params.ConValue('dummy'); // TODO: put your action code here if(Node.Exists("/Status Line")) { if(Node.ConExists("/Status Line","Model")) Node.Value("/Status Line","Model") = "compile and export psa animation"; } scene = Space.CurrentScene(); if(Node.Exists(scene + "/PSAfilename")) Node.Delete(scene + "/PSAfilename"); } NScript Object Package/jScript language~൱D@ j#^cstring dummy<fLI4W}@O{(XFҦV>g'JNjn*pn|b@@P@2|=Bynj|?z@Hoۙ>?<fLIJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Hoͤ*EgbĬD $PSAimportfilename2AEHM'ceZU@䑧r%p4W}@O{$(XFҦV#.;]kI 忞@"-1OSM n#p!@L-B~pDC%kFClPB!@L-B~JD:\unrealAnimation_Demo\Pendulum.PSA2AEHM'>g'JNjn*pFBC`@0@?ceZU@䑧r[җJs@ NewObject// OnComputeOutputs // Called to compute values of all output connectors function OnComputeOutputs(params) { var filename = params.ConValue('filename'); // TODO: put your computation here params.ConValue('dummy') = filename; } NScript Object Package/jScript language4@stringfilename!@L-B~string dummyC%kFCl4W}@O{(XFҦV>g'JNjn*pF X@1@?C%kFClJD:\unrealAnimation_Demo\Pendulum.PSA-1OSM n 럆L<_їDefault GFʠN=F 1 }}!@L-B~Z`Ez]UO1釥GP>aH 0 }}!@L-B~Z`Ez]UO GFʠN=F  1 }}C%kFClZ`Ez]UO1釥GP>aH  0 }}C%kFClZ`Ez]UO.;]kI 忞@ͤ*EgbĬ $PSKexportfilename2AEHM'ceZU@䑧r%p4W}@O{$(XFҦV#.;]kI 忞@"-1OSM n#p!@L-B~pDC%kFClPB!@L-B~2AEHM'>g'JNjn*pFBC`@0@?ceZU@䑧r[җJs@ NewObject// OnComputeOutputs // Called to compute values of all output connectors function OnComputeOutputs(params) { var filename = params.ConValue('filename'); // TODO: put your computation here params.ConValue('dummy') = filename; } NScript Object Package/jScript languagestringfilename!@L-B~string dummyC%kFCl4W}@O{(XFҦV>g'JNjn*pF X@1@?C%kFCl.;]kI 忞@-1OSM n 럆L<_їDefault GFʠN=F 1 }}!@L-B~Z`Ez]UO1釥GP>aH 0 }}!@L-B~Z`Ez]UO GFʠN=F  1 }}C%kFClZ`Ez]UO1釥GP>aH  0 }}C%kFClZ`Ez]UOͤ*EgbĬt!$PSAexportfilename2AEHM'ceZU@䑧r%p4W}@O{$(XFҦV#.;]kI 忞@"-1OSM n#p!@L-B~pDC%kFClPB!@L-B~2AEHM'>g'JNjn*pFBC`@0@?ceZU@䑧r[җJs@ NewObject// OnComputeOutputs // Called to compute values of all output connectors function OnComputeOutputs(params) { var filename = params.ConValue('filename'); // TODO: put your computation here params.ConValue('dummy') = filename; } NScript Object Package/jScript language4@stringfilename!@L-B~string dummyC%kFCl4W}@O{(XFҦV>g'JNjn*pF@@H@?C%kFCl-1OSM n 럆L<_їDefault GFʠN=F 1 }}!@L-B~Z`Ez]UO1釥GP>aH 0 }}!@L-B~Z`Ez]UO GFʠN=F  1 }}C%kFClZ`Ez]UO1釥GP>aH  0 }}C%kFClZ`Ez]UO.;]kI 忞@48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ BNewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); //Node.Value(owner + "/ActvLoop","Current iteration") = Node.Value(owner + "/ActvLoop","Iteration count"); Node.Value(owner + "/get sequence count","count") = 1; if(Node.Exists("/Status Line")) { if(Node.ConExists("/Status Line","Model")) Node.Value("/Status Line","Model") = "Cancel Render... "; } } NScript Object Package/jScript language,le4W}@O{(XFҦV>g'JNjn*pn@)`@@P@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@HoddKtN4 "ActvLoop 2|=Bynjp4W}@O{$(XFҦV"pt|Iet|Ie Iteration count Iteration counth#nFO&h#nFO&LE2Data$LE2 Data for node >g'JNjn*pp; `A$%}; `A$%}LoopBodyLoopBody,hML,hML$Current iteration$Current iterationp-1OSM n#z@HouB!#~}uB!#~}LE2Data, 2$LE2 Data for node >g'JNjn*p asvHhTG$ 2|=Bynj4W}@O{(XFҦV>g'JNjn*pn`Bb@@X@; `A$%}ߒ$)?? asvHhTGeSBgc$ ggFV hkAx]y\q׼]B@Z]sIB7@d$F>bl8N!8PIS1!(qHlvm\B"m{Ǽ7켙7ZVu_w~FmFmFmFmv텵kÊ1|0aYs ÿ߰П`cmpW9L3< DQAt2e*Ys`˖ sQo杇j0l0D$P_&1lh|h=.F K,g{B6ܹAQT@nA,EAͼΓ>f s>RPOC2I0ck!kL8̞=f~߳RWU hZ03%sSdϥ;JP,(D@"{8q>^ÖL66mwqw}㦛S )C,,Sؼ$2 ׉FO%,XRطп; /_i$ͅh1^?~qܯ7])kw}^&(ŒB@v ?I>Ӡ ź^ЇrWs[$fѯNvׅ+Vȷ=z Tz2g'֐e3Y,bڂ^NuPܥ*~1G#y]φm YPK k˙-H$p㍷ OU\}&x~xO1{[b;/J}-ZH.xQT%,r.c:fͶ@;-}&=ojz.Vl:=uʠ{q 3F={*n:uOoz^jj,Wp ;Y dvl&{.ؽ-pW0{/|}39Z]3xq4ދ|8%6C<}?d3YzZm%/cj :::Q[ ˖t"2 ԓIM3[sWBdq(hr~%d0HTvN+/gG<Hdu+D/X<"0iW"żG˂,ޅ}7 UdŲ/2{cفZ޽A̕E@_Z}UqG00gS?#߱C{ptD9 02@{-bR=y~قq!E_Ws==!&D 烑>_{_'Uص9O= Xۍ>ݛ{ 8c$_{nnY$e|G4hg}G>hC9]^w)afcۙyAucǞ6'N²vx>F@O<,=ܷ`MEus,/#4m_ed_^i)_@ݶtɒp%\,Z30t}[pς$`tB/UG\:kbϗ.]Q]}Ff /Z+2TZ#x}Gچk1h̙| IgAS@悪]1:ԟ=˟lG>a.hl y@TO F% ڸBW#$ނhh;Xg5T[CuއCY6oMem dW6o!ڭ>9??ʄ~t]AoyWc} !KwQm 0;(yO1JN|qg1O7$x .~ԗ5=>oVRC|c˖#і/xڟZڈ׉ܧTM<= 5P˿˪E-_0öm;BǟUoj?[oꪫ]yc./`⢭OOcVa] \pqH df 9pc?|H 2ɀ}\x9>$/A]8V?şkr-w~_nwu-gV?"*~j +b`T}3ߔ͍3[rgsϩdo]mh'[]gZ迾Xӱ_ĽAO~^EcQs1b 9; F{<-?q_r= #'osV_fz-}-ÿ zo\Xjo sezs-~>}g5wAloΖ=7Lx~dSezO5gy'r.7nH'q?}ݯi.{yr}1~^W}D1s]?>O}7,\zkcqWZz_W{']>l)$~3cVcQEe^wF[{PH{s?ڼjNZfX/p;Coܵ^[zU "´r`ػ5c7ԫi).䧯rQ&/!W;xݶks/ۧ DN5pٟrϮMF=U`Yn=@D˾hiqa ֞J6c0X^{0Ǻbr:~xc=Y?q<3i~[K<_M{N^ϲ{ /$i[sl+ (S5\ ϠQQ>jwq}Um+//ul+b̼TTlީĉ#\'sǐY@\F0_!g@Rݏm4aݺ lΣ$WW3 좆e=Giln-S }и^ϽwU ޚAܧfQ,Q5gzqf~<~e=@P˟Ÿ`k$vT͉hL=bvz(oeefVkH~ ہW}ͮ$OzODksl d<~ެ]o=M1گK}N{ gp E\%?؜Fٹ,Zso`F]:_n.{ҳhcGVw[`q JR4[0uӓbI+\aS 5՗,ɂ3R]mur~'#$^bۻ{wӠYU(G{ 2O|mQ;5S5lOο9p%HZאa=1sIM{AWIYKs$[oW~o2i @|<˅w={ kko`FSQ= }P6Ϛo}w hO?n~# j@5wf=zn8 נWyWȗ~d+ bRmYdo9a vޭ%cѢMbߑ%쟰9ȿU(߀`ϜdWwܾ Z>_S6HN1?{cy`d63ۛKk]w?vLvßmY%=/^=΁z }+Kg5P>n1vqR Z8H|S.?l̿:?(xl 0TdǏ=^GRDǝ^'~majs.(?V5Ȕe '[Mdq0F]??ʣ H+4f1lnk^X:zr{E:STȀx@(ʫ{yF.gn8,Ni@$> K7[yDι7VǑÐ~2OA,00ߎuTUGX!|O9Q:Olx_.DKڳQsǓ|t&yě`_d ?-] ~0b="`*G9ӜDj ɓGB ,$oB=,{F'Eg}YޛwD*˻84Xǿ|ޘ7 Oym>O={Sj̿'gUἧjiF]ЙT[hNff?'EOZڻX/16{ &5|V}ol~ :b,ߖ{eSBuƌYcuW0Tԗjhi 9hIL}Z6t>^s ۨw=\w9`d_qah~%繦O}ɓ;صwAf12}'g~ WfΜݐw3xܸMqeՕ>$zۊ'.?/i5_=O:O+;X*SEwdOt+\oxJN]u`Oވrd9~rFPrV5g&͎S ʃQ\c,D;;S+eI"` 7uy+:g<^4, `B穑1b@M<xkXQP=>ojY<6/L@T;cBY'6O7H,^^,)aqR NlN,kQlpqilK5h{!f џCU,EFXk\B͝V_h^|P[DK?S?/}ejO>Gjg.+P{9mom豝hgɟEc-rsTja%KmlF5\.ݏr&{ p*Ǚ8䱎@ַ-P^Ǡ9>x}]o܆Wt`+ժ :37P jxcgu +06娇@%u7/6'}}KOC{as6kw7rFks+s{σ}k _)4Ļ^c|4jƤVߪ< y t~wmU+jBlZ1\`P4罙;g{EٗsgE`Ӧ-sP>z 6 l m5Jo堟)ٻ̾|M:Ur>@P-\w-ec-F{ F~_>T5_-b?f/M_dnUhePmye@5ںfe~Ơ Ƣ%+I]';Y:@5 B|^OªU}kpDzFl|k{ d 6 n(`ٲ|Pg>1ǧAO~ݏ[P+pӒBz}Y#qԌjol@6Gvg7>TO4~8Y {zھ`@vλexìyNN'*qYPn'{w\|BP\Gs4sc'as*3Lp 5Py>Q>Sf~2Xd@C*\˩ғnnjǝ魓zh'8`WnCiSAm</*堧h5cXHd&aZhyg|mי<Ϲű"|h _&WtfC֏t7 t^XjJ}Hv;\,׉A^RbhjD:jeAB_q$ &[3^mrrՠ^oߚ0u!Y{*ɨ/`Bh|=$2}:џ?KPREANbcAd:C(C3f~3ICvn{zC(@' OB[R1F: .f_g4t~ 3~ofDCa=g=CTsJܭ^ڣt}l>œTGgĶyz< ͩ%̚5ƌ&LfygY#FmFmFm ?Yڏt|Ieh#nFO&>g'JNjn*pFCC@f@X@?; `A$%}-1OSM n 럆L<_ї.Activity GFʠN= H0< }} Control Inz@HoZ`Ez]UO GFʠN=P@ }}Iteration countt|IeZ`Ez]UO1釥GP>aP0 }}t|IeZ`Ez]UO GFʠN=H 0= }} Control Out2|=BynjZ`Ez]UO GFʠN=` B }}Current iteration,hMLZ`Ez]UO1釥GP>a` 0 }},hMLZ`Ez]UO GFʠN=0@9 }}LoopBody; `A$%}Z`Ez]UO,hMLuB!#~}>g'JNjn*pnC:Cb@T@; `A$%}ߒ$)??z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ JNewCommandl// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here var forReading = 1, forWriting = 2, forAppending = 8; progPath = System.GetMainDir(); fs = new ActiveXObject("Scripting.FileSystemObject"); f = fs.GetFile(progPath + "\\tsx\\psaout.txt"); connToFile = f.OpenAsTextStream( forReading, 0); curLine = connToFile.ReadLine();//header seqCount = 0; while( !connToFile.AtEndOfStream) { curLine = connToFile.ReadLine(); //curLineTok = curLine.split(","); seqCount++; curLine = connToFile.ReadLine();//skip every other line } connToFile.Close(); params.ConValue("count") = seqCount; } NScript Object Package/jScript language L]int countБwfM+4W}@O{(XFҦV>g'JNjn*pn`@S@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?БwfM+z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?'9DϨfxceZU@䑧r[җJs@ NewCommand // Execute // Called to execute the command function Execute(params) { var curAnim = params.ConValue('curAnim'); // TODO: put your action code here var forReading = 1, forWriting = 2, forAppending = 8; progPath = System.GetMainDir(); fs = new ActiveXObject("Scripting.FileSystemObject"); f = fs.GetFile(progPath + "\\tsx\\psaout.txt"); connToFile = f.OpenAsTextStream( forReading, 0); curLine = connToFile.ReadLine();//header keytot = 0; var ss, re, r; while( !connToFile.AtEndOfStream) { curLine = connToFile.ReadLine(); curLineTok = curLine.split(","); index = curLineTok[0]*1; if(index < curAnim-1) keytot = keytot + curLineTok[2]*1; //System.Trace(index + " " + curAnim); if(index==curAnim-1) { params.ConValue("startFrame") = curLineTok[6]*1; params.ConValue("endFrame") = curLineTok[6]*1 + curLineTok[7]*1 - 1; params.ConValue("keyquot") = keytot; ss = curLineTok[1]; r = ss.replace(" ", ""); params.ConValue("seqName") = r; } curLine = connToFile.ReadLine();//skip every other line } connToFile.Close(); if(Node.Exists("/Status Line")) { if(Node.ConExists("/Status Line","Model")) Node.Value("/Status Line","Model") = "import anim sequence " + curAnim; } // params.ConValue("startFrame") = ... // params.ConValue("endFrame") = ... } NScript Object Package/jScript languageintstartFrameσy O?륢tintcurAnim1CAj!(FintendFramer1Cintkeyquot'9DϨfxstringseqName4_FwO1t)u4W}@O{4_FwO1t)uSwinging(XFҦV>g'JNjn*pnb@a@2|=Bynj|?z@Hoۙ>?1CAj!(FJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?r1Cσy O?륢t-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ LNewCommand&// Execute // Called to execute the command function Execute(params) { var startFrame = params.ConValue('startFrame'); var endFrame = params.ConValue('endFrame'); var numSkip = params.ConValue('numSkip'); var reduce = params.ConValue('reduce'); var seqName = params.ConValue('seqName'); // TODO: put your action code here var forReading = 1, forWriting = 2, forAppending = 8; progPath = System.GetMainDir(); scene = Space.CurrentScene(); theMatrix = System.CreateDO('Math Package/Matrix Float Data'); fs = new ActiveXObject("Scripting.FileSystemObject"); //f = fs.GetFile("c:\\psaout3.txt"); f = fs.GetFile(progPath + "\\tsx\\psaout3.txt"); connToFile = f.OpenAsTextStream( forReading, 0); prevFrame = 0; curFrame = 0; //version 1.05 subtract 1 from numSkip, was too aggresive, solve zero key problem for(i=0;i<numSkip-1;i++) { connToFile.SkipLine(); } sel = Node.FirstSelected();//full path to selection yesnokey=1; newTrack = RsAnimTrack.CreateEditableTrack(sel); vBlendMode = 0; RsAnimTrack.SetBlendMode(sel, newTrack, vBlendMode);//no additive blend theTrack = RsAnimTrack.TrackRename(sel, newTrack, seqName); //actor created at this point so adjust for rest of bones while(!connToFile.AtEndOfStream && curFrame <= endFrame) { curLine = connToFile.ReadLine(); curLineTok = curLine.split(","); bname = curLineTok[0]; //System.Trace(bname); curFrame = curLineTok[7]; if(curFrame < startFrame) { prevFrame = curFrame;//skip to start } else { if(curFrame != prevFrame) { if(reduce==false) { RsAnim.SetKeyFrame(sel + "/Skeleton", prevFrame); } else { if(yesnokey==1) { RsAnim.SetKeyFrame(sel + "/Skeleton", prevFrame); yesnokey = 0; } else yesnokey = 1; } prevFrame = curFrame; //System.Trace(curFrame); } theMatrix.LoadIdentity(); theMatrix.SetTransX(curLineTok[1]); theMatrix.SetTransY(curLineTok[2]); theMatrix.SetTransZ(curLineTok[3]); theMatrix.SetPitch(curLineTok[4]); theMatrix.SetRoll(curLineTok[5]); theMatrix.SetYaw(curLineTok[6]); Node.Value(sel + "/Skeleton/" + bname, "Matrix") = theMatrix; } } if(connToFile.AtEndOfStream) RsAnim.SetKeyFrame(sel + "/Skeleton", curFrame); //RsAnimTrack.DisableTrack(sel, theTrack, true); connToFile.Close(); } NScript Object Package/jScript languageintstartFramevO }=AW#intendFrameBZ]Pj|Ak lRintnumSkipTF?g4booleanreduce #ŝCG C:\ÅstringseqNamenBӂNkkb4W}@O{(XFҦV>g'JNjn*pn@W b@ `@2|=Bynj|?z@Hoۙ>?vO }=AW#TF?g4J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?#ŝCG C:\Å -1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?nBӂNkkbSwingingz@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ ^dNewCommandc// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); scene = Space.CurrentScene(); Node.Copy(owner + "/PSKexportfilename",Space.CurrentScene()); Node.Rename(scene + "/PSKexportfilename", "PSKfilename"); progPath = System.GetMainDir(); //declare arrays, use for loop with break set all clear flag for each time run for loop if all clear at end then done jointList = new Array(); jointList.path = new Array();//full parth to joints jointList.parentIndex = new Array();//parent index in this array of the parent jointList.numChildren = new Array();//number of children for this joint jointList.curChild = new Array();//the current child node that is being explored //quaternion storage jointList.qx = new Array(); jointList.qy = new Array(); jointList.qz = new Array(); jointList.qw = new Array(); firstSel = Node.FirstSelected();//full path to selection skelPath = firstSel + "/Skeleton"; num = Node.LinkedOutputNodeCount(skelPath + "/Skeleton root","Joint");//skeleton root is like an invisible first joint for truespace dummyBone = Node.LinkedOutputNode(skelPath + "/Skeleton root","Joint",0);//full path name of dummy bone //dummy bone can only have 2 joints num = Node.LinkedOutputNodeCount(dummyBone,"Bone"); if(num>2) { System.Alert("to many joint connections to dummy bone"); return; } startJoint=""; for(i=0;i<num;i++) { jointName = Node.LinkedOutputNode(dummyBone,"Bone",i);//full joint path name System.Trace(jointName); num2 = Node.LinkedOutputNodeCount(jointName,"Joint"); System.Trace(num2); //dummy joint has no children //if joint has child bone then is the start of doom3 heirarchy if(num2>0) { startJoint = jointName; num3 = Node.LinkedOutputNodeCount(jointName + "Bone","Bone"); numchild = num3; } //System.Trace("joint" + i +" has " + num2); } System.Trace("start"); //System.Trace(startJoint); //System.Trace(numchild); //save origin joint to the list jointList.path[0] = startJoint;//full path to joint jointList.parentIndex[0] = -1; jointList.numChildren[0] = numchild; jointList.curChild[0] = 0; currIndex = 0;//track current joint lastIndex = 0;//add new joints to list here while(currIndex != -1) { //add current child to list //if not the last joint child of the current joint if(jointList.curChild[currIndex] < jointList.numChildren[currIndex]) { //number of bone children of current joint - always 1 or 0 //ik handle and stops removed before export //no leaf joints allowed on origin joint //if joint has child bone then is not a leaf //child bone of the current joint curBone = Node.LinkedOutputNode(jointList.path[currIndex],"Joint",0); //System.Trace(curBone); //current child joint currentChildIndex = jointList.curChild[currIndex];//read index of current child joint curJoint = Node.LinkedOutputNode(curBone,"Bone",currentChildIndex); //System.Trace(curJoint); //check for limb boneInOut = Node.LinkedInputNodeCount(curJoint,"Bone") + Node.LinkedOutputNodeCount(curJoint,"Bone"); if(boneInOut==2) { //limb found curJoint = Node.LinkedOutputNode(curJoint,"Bone",0); //System.Trace("limb found"); } //if pre leaf joint then do leaf stuff otherwise continue //qleafbone and qleafjoint are guranteed to exist because of "no leaf joints on origin bone rule" qleafbone = Node.LinkedOutputNode(curJoint,"Joint",0); qleafjoint = Node.LinkedOutputNode(qleafbone,"Bone",0); //check for limb boneInOut = Node.LinkedInputNodeCount(qleafjoint,"Bone") + Node.LinkedOutputNodeCount(qleafjoint,"Bone"); if(boneInOut==2) { //limb found //qleafjoint = Node.LinkedOutputNode(qleafjoint,"Bone"); qleafjoint = Node.LinkedOutputNode(qleafjoint,"Bone",0);//jan 2010 //System.Trace("limb found leaf"); } //check see if last joint(grandchild of current joint) has a child bone, if not then is a leaf leaftest = Node.LinkedOutputNodeCount(qleafjoint,"Joint"); if(leaftest!=0) { //get num children(joints) - get child bone of child joint then num joints hooked to that childBoneOfChildJoint = Node.LinkedOutputNode(curJoint,"Joint",0); numchild = Node.LinkedOutputNodeCount(childBoneOfChildJoint,"Bone");//number of grandchildren throught this child joint //System.Trace("not a leaf"); } else { numchild = 0;//leaf has no children //System.Trace("leaf declared"); } //save to the list lastIndex++; jointList.path[lastIndex] = curJoint;//full path to joint jointList.parentIndex[lastIndex] = currIndex; jointList.numChildren[lastIndex] = numchild; jointList.curChild[lastIndex] = 0; //System.Trace(curJoint); //System.Trace(numchild); currIndex = lastIndex; } //last child of current joint else { parentIndex = jointList.parentIndex[currIndex]; //update the parent's current child index to point to next child jointList.curChild[parentIndex]++; //set parent as current index currIndex = parentIndex; } }//end of loop all joints are in the list when currIndex = -1 numJoints = lastIndex + 1; System.Trace(numJoints); System.Trace("end"); //return; var forReading = 1, forWriting = 2, forAppending = 8; fs = new ActiveXObject("Scripting.FileSystemObject"); //fs.CreateTextFile("c://pskvbone.txt",true); //f = fs.GetFile("c://pskvbone.txt"); fs.CreateTextFile(progPath + "//tsx//pskvbone.txt",true); f = fs.GetFile(progPath + "//tsx//pskvbone.txt"); var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0; connToFile = f.OpenAsTextStream( forWriting, TristateUseDefault); //header num bones theLine = lastIndex + 1; connToFile.WriteLine(theLine); var r, ss; var re = new RegExp(" ","g"); myScale=10;//inverse of plugin scale myMatrix = System.CreateDO('Math Package/Matrix Float Data'); for(jind=0;jind<=lastIndex;jind++) { //System.Trace(jointList.path[j] + " " + jointList.parentIndex[j]); myMatrix = Node.Value(jointList.path[jind],"Matrix"); xval = myMatrix.GetTransX() * myScale; yval = myMatrix.GetTransY() * myScale; zval = myMatrix.GetTransZ() * myScale; //inverse matrix joint 0 if(jind==0) myMatrix = myMatrix.Invert(); qx = 0; qy = 0; qz = 0; qw = 0; mattoquat(myMatrix); //cant have spaces for fscanf shortname = Node.ShortName(jointList.path[jind]); ss = shortname.replace(re,"?"); //theLine = Node.ShortName(jointList.path[jind]) + " " + jointList.numChildren[jind] + " " + jointList.parentIndex[jind]; theLine = ss + " " + jointList.numChildren[jind] + " " + jointList.parentIndex[jind]; theLine = theLine + " " + qx.toFixed(6) + " " + qy.toFixed(6) + " " + qz.toFixed(6) + " " + qw.toFixed(6); theLine = theLine + " " + xval.toFixed(6) + " " + yval.toFixed(6) + " " + zval.toFixed(6); connToFile.WriteLine(theLine); } connToFile.Close(); //************************************************ // now do raw bone influences text file //************************************************ //find mesh node childCount = Node.SubObjectCount(firstSel); for(i=0;i<childCount;i++) { curNode = Node.SubObject(firstSel,i);//short name of child if(curNode!="Skeleton" && Node.ConExists(firstSel + "/" + curNode,"Mesh")) meshPath = firstSel + "/" + curNode; } System.Trace(meshPath); dM = System.CreateDO("Space 3D Package/Mesh Data"); dV = System.CreateDO("Space 3D Package/Vertex Stream Data"); dM = Node.Value(meshPath + "/Editable shape", 'Mesh');//editable shape added to stop crash mesh is coming to outside via skinning node dV = dM.GetVertices(); numverts = dV.GetNumVertices(); System.Trace(numverts); skinparam = System.CreateDO('Space 3D Package/Skinning parameters DO'); skinstream = System.CreateDO('Space 3D Package/Skinning direct stream data');//IRdSkinWeightDirect skinstreamI = System.CreateDO('Space 3D Package/Skinning index stream Data');//indexed version skinparam = Node.Value(meshPath + "/Skinning","Weights"); // create/open the file //fs.CreateTextFile("c://pskvrawboneinf.txt",true); //f = fs.GetFile("c://pskvrawboneinf.txt"); fs.CreateTextFile(progPath + "//tsx//pskvrawboneinf.txt",true); f = fs.GetFile(progPath + "//tsx//pskvrawboneinf.txt"); var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0; connToFile = f.OpenAsTextStream( forWriting, TristateUseDefault); //get num influences numinf = 0; for(bind=0;bind<=lastIndex;bind++) { //get bone from joint - joint and bone always together, not seperated by limb theJoint = jointList.path[bind]; theBone = Node.LinkedOutputNode(theJoint,"Joint",0); System.Trace(theBone); //determine if direct or indirect stream skinstream = skinparam.GetSkinningData(theBone); skinstreamI = skinparam.GetSkinningData(theBone); directF = 1; indirectF = 1; try { numb = skinstreamI.GetNumRecords(); } catch(e) { indirectF = 0; } try { numb = skinstream.GetNumSkinWeights(); } catch(ee) { directF = 0; } if(directF==1) { for(pt=0;pt<numverts;pt++) { wt = skinstream.weight(pt); if(wt > 0) numinf++; } } if(indirectF==1) { for(pt=0;pt<numb;pt++) { wt = skinstreamI.weight(pt); if(wt > 0) numinf++; } } } theLine = numinf; connToFile.WriteLine(theLine); //return early //connToFile.Close(); //return; //end return early //for each bone write out its bone influences for(bind=0;bind<=lastIndex;bind++) { //get bone from joint - joint and bone always together, not seperated by limb theJoint = jointList.path[bind]; theBone = Node.LinkedOutputNode(theJoint,"Joint",0); skinstream = skinparam.GetSkinningData(theBone); skinstreamI = skinparam.GetSkinningData(theBone); directF = 1; indirectF = 1; try { numb = skinstreamI.GetNumRecords(); } catch(e) { indirectF = 0; } try { numb = skinstream.GetNumSkinWeights(); } catch(ee) { directF = 0; } if(directF==1) { for(pt=0;pt<numverts;pt++) { wt = skinstream.weight(pt); if(wt > 0) { theLine = wt.toFixed(10) + " " + pt + " " + bind; connToFile.WriteLine(theLine); } } } if(indirectF==1) { for(pt=0;pt<numb;pt++) { wt = skinstreamI.weight(pt); if(wt > 0) { vt = skinstreamI.index(pt); theLine = wt.toFixed(10) + " " + vt + " " + bind; connToFile.WriteLine(theLine); } } } } connToFile.Close(); } //from Advanced Animation and rendering techniques Alan Watt, Mark Watt //math for tr > 0 verified //tr <= 0 take on faith function mattoquat(myMatrix) { qx = 1; qy = 2; qz = 3; qw = 4; nxt = new Array(); nxt[0] = 1; nxt[1] = 2; nxt[2] = 0;//YZX tr = myMatrix.GetAt(0,0) + myMatrix.GetAt(1,1) + myMatrix.GetAt(2,2); if(tr > 0) { s = Math.sqrt(tr + 1); qw = 0.5 * s; s = 0.5 / s; //qx = s * (myMatrix.GetAt(1,2) - myMatrix.GetAt(2,1)); //qy = s * (myMatrix.GetAt(2,0) - myMatrix.GetAt(0,2)); //qz = s * (myMatrix.GetAt(0,1) - myMatrix.GetAt(1,0)); //make negative for doom3 quats(had do same for lightwave exporter qx = -s * (myMatrix.GetAt(1,2) - myMatrix.GetAt(2,1)); qy = -s * (myMatrix.GetAt(2,0) - myMatrix.GetAt(0,2)); qz = -s * (myMatrix.GetAt(0,1) - myMatrix.GetAt(1,0)); } else { //TODO: put real code here, possible is not needed we'll see //found need when exporting animation so add here too //for doom3 get flipping so use w to determine sign of result later qx = 1; qy = 2; qz = 3; qw = 4; i=0;//X if(myMatrix.GetAt(1,1) > myMatrix.GetAt(0,0)) i = 1;//Y if(myMatrix.GetAt(2,2) > myMatrix.GetAt(i,i)) i = 2;//Z j = nxt[i]; k = nxt[j] s = Math.sqrt((myMatrix.GetAt(i,i) - (myMatrix.GetAt(j,j) + myMatrix.GetAt(k,k))) + 1); if(i==0) qx = -s * 0.5; if(i==1) qy = -s * 0.5; if(i==2) qz = -s * 0.5; s = 0.5 / s; qw = (myMatrix.GetAt(j,k) - myMatrix.GetAt(k,j)) * s; qj = (myMatrix.GetAt(i,j) + myMatrix.GetAt(j,i)) * s; if(j==0) qx = -qj; if(j==1) qy = -qj; if(j==2) qz = -qj; qk = (myMatrix.GetAt(i,k) + myMatrix.GetAt(k,i)) * s; if(k==0) qx = -qk; if(k==1) qy = -qk; if(k==2) qz = -qk; } return; }NScript Object Package/jScript language~൱D@ j#^c4W}@O{(XFҦV>g'JNjn*pnX@L@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommandp// Execute // Called to execute the command function Execute(params) { // owner = System.ThisOwner(); try { sadata = System.CreateDO('Clintons3d Package/File Save As data'); } catch(err) { sadata = false; } if(sadata) { sadata.SetName("Unreal Mesh Files (*.psk)~*.PSK~All Files (*.*)~*.*~~"); safile = sadata.GetName(); if(safile != "") { Node.Value(owner,"filename, 2") = safile; Activity.Run(owner + "/exportPSK"); } else { if(Node.Exists("/Status Line")) { Node.Value("/Status Line","Model") = "export aborted "; } } } else Activity.Run(owner + "/exportPSK");//use value from open file dialog } NScript Object Package/jScript language~൱D#^c4W}@O{(XFҦV>g'JNjn*pnb@H@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ HNewCommand// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); try { sadata = System.CreateDO('Clintons3d Package/File Save As data'); } catch(err) { sadata = false; } if(sadata) { sadata.SetName("Unreal Anim Files (*.psa)~*.PSA~All Files (*.*)~*.*~~"); safile = sadata.GetName(); if(safile != "") { Node.Value(owner,"filename, 3") = safile; Activity.Run(owner + "/exportPSA"); } else { if(Node.Exists("/Status Line")) { Node.Value("/Status Line","Model") = "export aborted "; } } } else Activity.Run(owner + "/exportPSA");//use value from open file dialog } NScript Object Package/jScript languagez4W}@O{(XFҦV>g'JNjn*pn b@H@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Execute // Called to execute the command function Execute(params) { // create tsx folder for truespace standalone version progPath = System.GetMainDir(); fs = new ActiveXObject("Scripting.FileSystemObject"); if(!fs.FolderExists(progPath + "\\tsx")) { fs.CreateFolder(progPath + "\\tsx"); } } NScript Object Package/jScript language~൱DlH#^c4W}@O{(XFҦV>g'JNjn*pn`@@P@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho܂dKu=)$compile AnimationH$.;]kI 忞@" HHH#4W}@O{$(XFҦV""z@HoHH"2|=Bynj-1OSM n"2|=Bynj(XFҦV>g'JNjn*pF[b@H@?-1OSM n 럆L<_ї0z@HoddKtN4 ActvLoop, 1 H!2|=Bynj 4W}@O{$(XFҦV"t|Ieh#nFO&; `A$%}HH,hMLH-1OSM n#Hz@HouB!#~}uB!#~}LE2Data, 2$LE2 Data for node >g'JNjn*p asvHhTG$ 2|=Bynj4W}@O{(XFҦV>g'JNjn*pn`DzCb@@X@; `A$%}ߒ$)?? asvHhTGeSBgc8 ggFV hkAt|Ieh#nFO&>g'JNjn*pFCC@f@X@?; `A$%}-1OSM n 럆L<_ї.Activity GFʠN= H0< }} Control Inz@HoZ`Ez]UO GFʠN=P@ }}Iteration countt|IeZ`Ez]UO1釥GP>aP0 }}t|IeZ`Ez]UO GFʠN=H 0= }} Control Out2|=BynjZ`Ez]UO GFʠN=` B }}Current iteration,hMLZ`Ez]UO1釥GP>a` 0 }},hMLZ`Ez]UO GFʠN=0@9 }}LoopBody; `A$%}Z`Ez]UO,hMLuB!#~}>g'JNjn*pnC:Cb@T@; `A$%}ߒ$)??z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ HNewCommandv// Execute // Called to execute the command function Execute(params) { var frame = params.ConValue('frame'); var firstSel = params.ConValue('firstSel'); var superR = params.ConValue('superR'); var newAct = params.ConValue('newAct'); // TODO: put your action code here firstFrame = Node.Value("/Preferences/AnimPref","PlayRangeStart"); //lastFrame = Node.Value("/Preferences/AnimPref","PlayRangeEnd"); //numFrames = lastFrame - firstFrame + 1; //for(frame = firstFrame;frame<=lastFrame;frame++) //{ // absFrame = frame + firstFrame - 1; RsAnim.PutFrame(firstSel,absFrame); //RsAnim.PutFrame(superR,absFrame); RsAnim.PutFrame(newAct,absFrame); //myMatrix = Node.Value(hipJoint, "WldMatrix"); //Node.Value(superR,"Matrix") = myMatrix; //RsAnim.SetKeyFrame(superR, absFrame); } NScript Object Package/jScript language`<=int frameTG'7OJpRAstringfirstSel rB-Yo*stringsuperR|^M@U/܆stringnewActbW;EVP4W}@O{(XFҦV>g'JNjn*pnDCb@@\@2|=Bynj|?z@Hoۙ>?bW;EVP@/Project/Space 3D/UT3_Female, 1 rB-Yo*:/Project/Space 3D/UT3_FemaleJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?TG'7OJpRA|^M@U/܆j/Project/ut3maleClean, 1/UT3_Male/Skeleton/superRoot-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@  NewCommand // Execute // Called to execute the command function Execute(params) { var frame = params.ConValue('frame'); var firstSel = params.ConValue('firstSel'); var superR = params.ConValue('superR'); var hipJoint = params.ConValue('hipJoint'); var newAct = params.ConValue('newAct'); // TODO: put your action code here //Node.Disconnect(hipJoint, "WldMatrix", superR, "Matrix"); //newSuperR = Node.Copy(superR, newAct + "/Skeleton"); //Node.Delete(superR); //replace first part of hipJoint firstSel -> newAct //firstSelsn = Node.ShortName(firstSel); //newActsn = Node.ShortName(newAct); //hipJoint = hipJoint.replace(firstSelsn, newActsn); //set "hips" translation limits //transRange = 100; //Node.Value(hipJoint ,"MovMaxX") = transRange; //Node.Value(hipJoint ,"MovMaxY") = transRange; //Node.Value(hipJoint ,"MovMaxZ") = transRange; //Node.Value(hipJoint ,"MovMinX") = -transRange; //Node.Value(hipJoint ,"MovMinY") = -transRange; //Node.Value(hipJoint ,"MovMinZ") = -transRange; //connect superRoot WldMatrix to Matrix of "hips" will override the animation //Node.ConnectTo(newSuperR, "WldMatrix", hipJoint, "Matrix"); //lock skeleton root - found that this is not needed for correct read to ut3 //only needed to look good inside truespace LE.ExpandMatrix(newAct + "/Skeleton/Skeleton root/Matrix"); Node.Select(newAct); } NScript Object Package/jScript language<'int frameTG'7OJpRAstringfirstSel rB-Yo*stringsuperR|^M@U/܆stringhipJointdpLE BstringnewActeEG Ah4W}@O{dpLE Bd/Project/ut3maleClean, 1/UT3_Male/Skeleton/b_Hips(XFҦV>g'JNjn*pnpE=Cb@ `@2|=Bynj|?z@Hoۙ>? rB-Yo*D/Project/ut3maleClean, 1/UT3_MaleJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?TG'7OJpRA-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO|^M@U/܆j/Project/ut3maleClean, 1/UT3_Male/Skeleton/superRootMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?eEG Ah@/Project/Space 3D/UT3_Female, 1z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?JW?ޯ̍E*ceZU@䑧r[җJs@ NewCommand// Execute // Called to execute the command function Execute(params) { scene = Space.CurrentScene(); owner = System.ThisOwner(); firstSel = Node.FirstSelected();//full path to selection newAct = Node.Copy(firstSel, scene); myList = System.CreateDO("Common Data Package/String Enum Data"); myList.Clear(); k=0; childcnt = Node.SubObjectCount(newAct + "/Skeleton"); for(i=0;i<childcnt;i++) { childik = Node.SubObject(newAct + "/Skeleton", i); if(childik.substr(0,3) == "IK ") { myList.SetStringAt(k, newAct + "/Skeleton/" + childik); k++; } } for(d=0;d<k;d++) { curNode = myList.GetStringAt(d); Node.Delete(curNode); } firstFrame = Node.Value("/Preferences/AnimPref","PlayRangeStart"); lastFrame = Node.Value("/Preferences/AnimPref","PlayRangeEnd"); numFrames = lastFrame - firstFrame + 1; //copy superRoot to actor //superR = Node.Copy(owner + "/superRoot",firstSel + "/Skeleton"); //get "hips" - first joint MyBone MyJoint dummyBone = Node.LinkedOutputNode(firstSel + "/Skeleton/Skeleton root","Joint",0);//MyBone jointName = Node.LinkedOutputNode(dummyBone,"Bone",0);//full joint path name shortJointName = Node.ShortName(jointName); if(shortJointName != "MyJoint") originJoint = jointName; else originJoint = Node.LinkedOutputNode(dummyBone,"Bone",1);//full joint path name boneName = Node.LinkedOutputNode(originJoint,"Joint",0);//origin bone hipJoint = Node.LinkedOutputNode(boneName,"Bone",0);//hip full joint path name //connect superRoot matrix to hip world matrix //Node.ConnectTo(hipJoint, "WldMatrix", superR, "Matrix"); params.ConValue("newAct") = newAct; params.ConValue("numFrames") = numFrames; params.ConValue("firstSel") = firstSel; //params.ConValue("superR") = superR; params.ConValue("hipJoint") = hipJoint; } NScript Object Package/jScript language~൱D@ j#^cintnumFramesJW?ޯ̍E*stringfirstSelth,C4@R_]stringsuperRRuLJl;lstringnewActI\# KfystringhipJointˏJ!ÓˏJ!ÓZ/Project/Space 3D/UT3_Female/Skeleton/b_Hips4W}@O{(XFҦV>g'JNjn*pn`DCb@c@2|=Bynj|?z@Hoۙ>?I\# Kfy@/Project/Space 3D/UT3_Female, 1th,C4@R_]:/Project/Space 3D/UT3_FemaleJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?RuLJl;lj/Project/ut3maleClean, 1/UT3_Male/Skeleton/superRootz@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ TNewCommand// Execute // Called to execute the command function Execute(params) { var frame = params.ConValue('frame'); var firstSel = params.ConValue('firstSel'); var superR = params.ConValue('superR'); var newAct = params.ConValue('newAct'); // TODO: put your action code here firstFrame = Node.Value("/Preferences/AnimPref","PlayRangeStart"); //lastFrame = Node.Value("/Preferences/AnimPref","PlayRangeEnd"); //numFrames = lastFrame - firstFrame + 1; //for(frame = firstFrame;frame<=lastFrame;frame++) //{ // //absFrame = frame + firstFrame - 1; //RsAnim.PutFrame(firstSel,absFrame); //RsAnim.PutFrame(superR,absFrame); RsAnim.PutFrame(newAct,firstFrame); //myMatrix = Node.Value(hipJoint, "WldMatrix"); //Node.Value(superR,"Matrix") = myMatrix; //RsAnim.SetKeyFrame(superR, absFrame); } NScript Object Package/jScript language4Hint frameTG'7OJpRAstringfirstSel rB-Yo*stringsuperR|^M@U/܆stringnewActbW;EVP4W}@O{(XFҦV>g'JNjn*pn EaCb@@\@2|=Bynj|?z@Hoۙ>?bW;EVP@/Project/Space 3D/UT3_Female, 1 rB-Yo*D/Project/ut3maleClean, 1/UT3_MaleJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?TG'7OJpRA-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO|^M@U/܆j/Project/ut3maleClean, 1/UT3_Male/Skeleton/superRootMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommandp // Execute // Called to execute the command function Execute(params) { var frame = params.ConValue('frame'); var firstSel = params.ConValue('firstSel'); var newAct = params.ConValue('newAct'); var superR = params.ConValue('superR'); var hipJoint = params.ConValue('hipJoint'); // TODO: put your action code here myMatrix = System.CreateDO("Math Package/Matrix Float Data"); firstFrame = Node.Value("/Preferences/AnimPref","PlayRangeStart"); //lastFrame = Node.Value("/Preferences/AnimPref","PlayRangeEnd"); //numFrames = lastFrame - firstFrame + 1; //for(frame = firstFrame;frame<=lastFrame;frame++) //{ // absFrame = frame + firstFrame - 1; //RsAnim.PutFrame(firstSel,absFrame); //RsAnim.PutFrame(superR,frame); //myMatrix = Node.Value(hipJoint, "WldMatrix"); //Node.Value(superR,"Matrix") = myMatrix; childcnt = Node.SubObjectCount(newAct + "/Skeleton"); for(i=0;i<childcnt;i++) { child = Node.SubObject(newAct + "/Skeleton", i); if(Node.ConExists(newAct + "/Skeleton/" + child,"Matrix")) { myMatrix = Node.Value(firstSel + "/Skeleton/" + child,"Matrix"); if(hipJoint == firstSel + "/Skeleton/" + child) { myMatrix = Node.Value(firstSel + "/Skeleton/" + child,"WldMatrix"); //System.Trace("hip world"); } Node.Value(newAct + "/Skeleton/" + child,"Matrix") = myMatrix; } } RsAnim.SetKeyFrame(newAct, absFrame); //RsAnim.SetKeyFrame(superR, absFrame); } NScript Object Package/jScript language`; int frameTG'7OJpRAstringfirstSel rB-Yo*stringnewActЪ+'CGk)OstringsuperRw 50E?Ij$stringhipJointETfK̽4W}@O{ETfK̽Z/Project/Space 3D/UT3_Female/Skeleton/b_HipsЪ+'CGk)O@/Project/Space 3D/UT3_Female, 1(XFҦV>g'JNjn*pn`ECb@ `@2|=Bynj|?z@Hoۙ>?w 50E?Ij$j/Project/ut3maleClean, 1/UT3_Male/Skeleton/superRoot rB-Yo*:/Project/Space 3D/UT3_FemaleJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?TG'7OJpRA-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand // Execute // Called to execute the command function Execute(params) { var frame = params.ConValue('frame'); var firstSel = params.ConValue('firstSel'); var superR = params.ConValue('superR'); var hipJoint = params.ConValue('hipJoint'); var newAct = params.ConValue('newAct'); // TODO: put your action code here //Node.Disconnect(hipJoint, "WldMatrix", superR, "Matrix"); //newSuperR = Node.Copy(superR, newAct + "/Skeleton"); //Node.Delete(superR); //replace first part of hipJoint firstSel -> newAct firstSelsn = Node.ShortName(firstSel); newActsn = Node.ShortName(newAct); hipJoint = hipJoint.replace(firstSelsn, newActsn); //set "hips" translation limits transRange = 100; Node.Value(hipJoint ,"MovMaxX") = transRange; Node.Value(hipJoint ,"MovMaxY") = transRange; Node.Value(hipJoint ,"MovMaxZ") = transRange; Node.Value(hipJoint ,"MovMinX") = -transRange; Node.Value(hipJoint ,"MovMinY") = -transRange; Node.Value(hipJoint ,"MovMinZ") = -transRange; //connect superRoot WldMatrix to Matrix of "hips" will override the animation //Node.ConnectTo(newSuperR, "WldMatrix", hipJoint, "Matrix"); //lock skeleton root //LE.ExpandMatrix(newAct + "/Skeleton/Skeleton root/Matrix"); } NScript Object Package/jScript language~൱DB#^cint frameTG'7OJpRAstringfirstSel rB-Yo*stringsuperR|^M@U/܆stringhipJointdpLE BstringnewActeEG AhdpLE BZ/Project/Space 3D/UT3_Female/Skeleton/b_Hips4W}@O{(XFҦV>g'JNjn*pnDYCb@ `@2|=Bynj|?z@Hoۙ>? rB-Yo*:/Project/Space 3D/UT3_FemaleJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?TG'7OJpRA|^M@U/܆j/Project/ut3maleClean, 1/UT3_Male/Skeleton/superRoot-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@HoeEG Ah@/Project/Space 3D/UT3_Female, 148@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ vNewCommand function ExploreNode(thePath) { //declare local variables for recusrsive calls var curIndex; var curnumObj; var childPath, MyObj; sname = Node.ShortName(thePath); if(sname.substr(0,3) == "IK ") { myList.SetStringAt(k, thePath); k++; } //get first child curIndex = 0; curnumObj = Node.SubObjectCount(thePath); if(curnumObj > 0) { MyObj = Node.SubObject(thePath,0); childPath = thePath + "/" + MyObj; } //recursion runs here - get the next child while(curnumObj > 0) { ExploreNode(childPath); curIndex = curIndex + 1; if(curIndex < curnumObj) { MyObj = Node.SubObject(thePath, curIndex); childPath = thePath + "/" + MyObj; } else curnumObj = 0; } } // Execute // Called to execute the command function Execute(params) { // TODO: put your action code here skeletonFound = false; firstSel = Node.FirstSelected();//full path to selection System.Trace(firstSel); childCount = Node.SubObjectCount(firstSel); for(i=0;i<childCount;i++) { curNode = Node.SubObject(firstSel,i);//short name of child System.Trace(curNode); if(curNode=="Skeleton") { skeletonFound = true; firstnode = firstSel + "/Skeleton"; } } if(skeletonFound) System.Trace("skeleton found"); //bare skeleton sname = Node.ShortName(firstSel); if(sname=="Skeleton") { skeletonFound = true; firstnode = firstSel; } if(!skeletonFound) return; //firstnode = firstSel + "/Skeleton"; myList = System.CreateDO("Common Data Package/String Enum Data"); myList.Clear(); k=0; //do recursive search for ik nodes by name ExploreNode(firstnode); for(d=0;d<k;d++) { curNode = myList.GetStringAt(d); Node.Delete(curNode); } } NScript Object Package/jScript language4W}@O{(XFҦV>g'JNjn*pn`B`@@P@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho܂dKu=4rNewSkeleton.;]kI 忞@"  ?@Se4W}@O{$w`ZL. 5w`ZL. 5Show structure>Show skeleton joints and bones =-1OSM n"׊;Jf|ڢ׊;Jf|ڢBWldMatrixWorld matrix `^02eE{|@ZHH|Ȉ偢jD%~`8偢jD%~`8BObjMatrix Object's matrix `^02eE{|@Z<ĠF姁J]<ĠF姁J]DMatrix,Object's input matrix `^02eE{|@\WAGWAGOwnerMatrixOwner's matrix `^02eE{|@ G?ŋ G?ŋ tSObjLtrueSpace object synchronization data W5f@(䐈ZH|ȂHS $hKnPSVmS $hKnPSVm"RenderAttributes"RenderAttributes HEoq5vHHd_@ cB8Ed_@ cB8ESkeleton*Skeleton data object [}Nj2 2"IM6 Ex>"IM6 ExRot color(Rotation lock color -n,Njlpg;ƒsF2ƒsF2Dynamic LocksLSet of active locks for dynamic tools u|H '$(IДl/(IДl/Show locksShow IK locks <'a#G @=^V("'a#G @=^V("Show handlesShow handles =(XFҦV">"IM6 Ex-n,Njlpg%?>h>? 6Jѳ( S $hKnPSVmw`ZL. 5 'a#G @=^V(" 偢jD%~`8m6EfH-n,Njlpg???~?JmCb4IP}K^:KrbSxSolid defaultSolid diamondWire diamondWire thinSolid diamondd_@ cB8E(XFҦV>g'JNjn*pF@[Ck@ a@C8C?n1LH_r-n,Njlpg!? ?>~? 2>'??WAG`^02eE{|@B????(IДl/  G?ŋ~0iV@KU>x%fdN*5Ւh , }}v[IL'KIZ`Ez]UOͽ>fdN*5Ւh 0, }}(IДl/Z`Ez]UO GFʠN= p01 }}(IДl/Z`Ez]UOͽ>fdN*5Ւhp 0, }}'a#G @=^V("Z`Ez]UO GFʠN= 01 }}'a#G @=^V("Z`Ez]UO GFʠN= .}} Show SkeletonZ`Ez]UOͽ>fdN*5Ւhp , }}w`ZL. 5Z`Ez]UOͽ>fdN*5Ւh8H, }} 6Jѳ(Z`Ez]UO GFʠN=8HT }}#Use Character Editor color settings 6Jѳ(Z`Ez]UO B>IHHpX%}}n1LH_rZ`Ez]UO GFʠN=HHX1 }}n1LH_rZ`Ez]UO B>IHX%}}m6EfHZ`Ez]UO GFʠN=pHX1 }}m6EfHZ`Ez]UO B>IHXph%}}q\7LO#Z`Ez]UO GFʠN=XHh> }} Position lockq\7LO#Z`Ez]UO GFʠN=hHx> }} Rotation lock>"IM6 ExZ`Ez]UO B>IHhpx%}}>"IM6 ExZ`Ez]UO GFʠN=pXh: }} Full lock졉E/~ݾZ`Ez]UO B>IXh%}}졉E/~ݾñZ`Ez]UO GFʠN=phx!}}Z`Ez]UO GFʠN=08!}}Z`Ez]UOv[IL'KI q\7LO#-n,Njlpg>"?I??n 47m2O dTransform<ĠF姁J]pDWAGp偢jD%~`8PB׊;Jf|ڢPB4W}@O{$(XFҦV"-1OSM n"偢jD%~`8(XFҦV>g'JNjn*pFX@1@?׊;Jf|ڢWAG<ĠF姁J]-1OSM n 럆L<_ї0qU F3flp2Object Render AttributesS $hKnPSVmP8Ns2]t8Ns2] Surface Opacity Surface Opacity^mګA~Ksi[t^mګA~Ksi[Points opacityPoints opacity(lrsGrt(lrsGrPoints Size>Point Size in Point rendering.\Eh{5t\Eh{5Points ColorLColor of points during the rendering. -n,Njlpg"PbEGDߗrt"PbEGDߗr0Ignore mesh point color0Ignore mesh point color F?N dtF?N d.Ignore mesh point size.Ignore mesh point size ]*qBCxt]*qBCxEdges opacityEdges opacity\J:I%7ut\J:I%7uEdges ColorEdges Color -n,NjlpgiA޲1rIK>XtiA޲1rIK>X0Ignore mesh edges color0Ignore mesh edges color ,ot"AaYt,ot"AaY$Show hidden lines`Do not use ZBuffer in point and wireframe modes ^RI8ÿRt^RI8ÿRShow backfaceslEnable two-sided rendering when Color mode is enabled çwH5#VtçwH5#V0Ignore layer attributesvDo not combine render attributes with layer defined values 4W}@O{%J@#QL-1OSM n#(XFҦV"W0@zdW0@zd%VersionVersion%ȅ8vDCxZtȅ8vDCxZInvisibleInvisible flag F+2MGtF+2MGCast shadows$Cast shadows flag I2GWM:).$tI2GWM:).$ Receive shadows Receive shadows mBޖw ptmBޖw pLayer index(Modeler layer indexo[nfFto[nfF Overlay opacity Overlay opacityzgGFohN)tzgGFohN)Overlay ColorOverlay Color. -n,NjlpgvhD zʔtvhD zʔ4Ignore mesh overlay color6Ignore mesh overlay color. fB #^tfB #^$Transparency Mode@Quality of transparency solving :KrbSx|$}mK;)t|$}mK;) OverlayEnable*Enable color overlay  rg@*oHtrg@*oH OverlayColor*Color of the overlay -n,Njlpg !eLZE^Nt!eLZE^N OverlayStrengthJStrength (visibility) of the overlay zgGFohN)I2GWM:).$ vhD zʔ]*qBCx?S $hKnPSVmrg@*oHçwH5#V 4W}@O{fB #^:KrbSxv No Hidden FacesNo SortTriangle SortNo Sort\J:I%7u-n,Njlpg?\Eh{5-n,Njlpg?(XFҦV>g'JNjn*pF X@>@?F?N d ȅ8vDCxZ 8Ns2]?F+2MG "PbEGDߗr J@#QL>g'JNjn*pFCBb@ h@?(lrsGr?^mګA~Ksi[o[nfFW0@zdmBޖw p-1OSM n 럆L<_ї˓ DefaultAdvanced GFʠN=0(@6 }}Color\J:I%7uZ`Ez]UO B>I(0h@%}}\J:I%7uZ`Ez]UO GFʠN=@(P8 }}Opacity]*qBCxZ`Ez]UON\q+nN-K^(@hPA\VV?]*qBCxZ`Ez]UOY@ GFʠN=h@P@ }}Enable Obj ModeçwH5#VZ`Ez]UOͽ>fdN*5Ւh@P, }}çwH5#VZ`Ez]UO GFʠN=h 6 }}Color\Eh{5Z`Ez]UO B>I %}}\Eh{5Z`Ez]UO GFʠN=h 08 }}Opacity^mګA~Ksi[Z`Ez]UON\q+nN-K^ 0A\VV?^mګA~Ksi[Z`Ez]UOY@ GFʠN=h0@5 }}Size(lrsGrZ`Ez]UON\q+nN-K^0@A\VV?$@(lrsGrZ`Ez]UOY@ GFʠN=( 8 }}Opacity8Ns2]Z`Ez]UON\q+nN-K^(h A\VV?8Ns2]Z`Ez]UOY@ GFʠN=h(}}SurfaceZ`Ez]UO GFʠN= h0&}}EdgesZ`Ez]UO GFʠN=h'}}PointsZ`Ez]UO GFʠN=Ph`1 }}fB #^Z`Ez]UOnevG4'hP`̆fB #^VNo hidden faces No solving Triangle sortZ`Ez]UO GFʠN=1 }}^RI8ÿRZ`Ez]UOͽ>fdN*5Ւh, }}^RI8ÿRϱZ`Ez]UO GFʠN= 1 }},ot"AaYZ`Ez]UOͽ>fdN*5Ւh , }},ot"AaYZ`Ez]UO GFʠN= 01 }}ȅ8vDCxZZ`Ez]UOͽ>fdN*5Ւh 0, }}ȅ8vDCxZZ`Ez]UO GFʠN=0@1 }}F+2MGZ`Ez]UOͽ>fdN*5Ւh0@, }}F+2MGZ`Ez]UO GFʠN=@P1 }}I2GWM:).$Z`Ez]UOͽ>fdN*5Ւh@P, }}I2GWM:).$Z`Ez]UO GFʠN=P`1 }}mBޖw pZ`Ez]UO1釥GP>aP`0 }}mBޖw pZ`Ez]UO,ot"AaY !eLZE^N|$}mK;)^RI8ÿR iA޲1rIK>X qNoJi:nSkeleton root BL=ew!4tBL=ew!4TagSkeleton tag  .0F $1LӤt.0F $1LӤSymmetry$Skeleton symmetry   0_BEP1@0_BEP1@"SklMatrix@Skeleton space transform matrix `^02eE{|@"WAGp ׊;Jf|ڢB ݫK^BUTݫK^BU Joint"Joint parameters jh/L/VVf d_@ cB8EP8<ĠF姁J]D 4W}@O{$(XFҦV"-1OSM n" BUJztBUJz"SkelParSpc,Skeleton parent space `^02eE{|@" d_@ cB8E(XFҦV>g'JNjn*pF b@ `@?BL=ew!4׊;Jf|ڢ`^02eE{|@B????0_BEP1@`^02eE{|@B????WAG.0F $1LӤ <ĠF姁J]`^02eE{|@B????-1OSM n 럆L<_ї  GFʠN=? }}Root transform<ĠF姁J]Z`Ez]UO GFʠN= C }}Skeleton transformWAGZ`Ez]UO GFʠN= 01 }}.0F $1LӤZ`Ez]UOͽ>fdN*5Ւh 0, }}.0F $1LӤZ`Ez]UO GFʠN=0F@1 }}BL=ew!4Z`Ez]UO1釥GP>aF0@0 }}BL=ew!4Z`Ez]UO GFʠN=@P: }} Root boneݫK^BUZ`Ez]UO GFʠN=P`1 }}d_@ cB8EZ`Ez]UO GFʠN=`p1 }}׊;Jf|ڢZ`Ez]UOݫK^BUBUJz܂dKu=$Skeleton material .;]kI 忞@"%)036 4W}@O{$.F_P#.F_P#Material Output material __W8E#(U@Ra.U@Ra.LE2Data$LE2 Data for node >g'JNjn*p՞'fA5-_՞'fA5-_D3DEYED3DEYE =xNT{-1OSM n"(XFҦVLE2Data, 1"J@#QLLE2Data, 24W}@O{(XFҦV>g'JNjn*pF@X@>@BA?՞'fA5-_.F_P#J@#QL>g'JNjn*pF4CtCd@@@?.;]kI 忞@-1OSM n 럆L<_ї0U@Ra.>g'JNjn*pFjCCd@T@?Pc|B;]2DMaterial.F_P#T.F_P#Material Output material __W8E#(S^M~b tS^M~b Alpha_shaderAlpha shader RnчINN5OD.GWf5t5OD.GWf5Color_shaderColor shader zdU@AUʂ*qΤIGGItqΤIGGIModel_shaderModel shader @SrE8㲻t,S@vTVt,S@vTVNormal_shaderNormal shader Xb"ٲN+4зVJiltзVJil Texcoord_shader Texcoord shader lrMH;e4W}@O{$U@Ra.-1OSM n"(XFҦVLE2Data, 1"kF_dkF_Vertex_shaderVertex shader k|eKwj9CqVertexShadert@*Ntt@*N Constant_shader Constant shader QVO Pk@<;vHwt<;vHwAlphaTest Alpha Test type :KrbSx 0S̤@+Rt 0S̤@+RAlphaTestValue"Alpha Test Value,S@vTV 0S̤@+R #<5OD.GWf54W}@O{зVJil(XFҦV>g'JNjn*pFDCX@@@?<;vHw:KrbSxdDisabledEnabledAs OpaqueAs OpaqueS^M~b .F_P#t@*NkF_-1OSM n 럆L<_ї0U@Ra.>g'JNjn*pFDnC`@\@?qΤIGGI/|V FK|ShaderInput?ڵfA'7(?ڵfA'7(EyePos8Eye position in world space F 1+5?N>/%dLrQn0%dLrQn0EyeDirNormalized eye vector in world space. Note that this is vector pointing from surface to the eye F 1+5?N>/.piDM7piDM7EyeDistNDistance from current point to the eye F 1+5?N>/^@A툷^@A툷PositionNShading point position in world space. F 1+5?N>/p1M@o=p1M@o=TexCoords3D texture coordinates for given surface point. Any undefined channel (u, v or w) is replaced with 0. Initialized to interpolated vertex texture coords. Replaced by output of TextCoord shader. F 1+5?N>/}E[2CV)}E[2CV) ColornColor specified by color shader. RGB portion is used to specify color (and is not limited to range 0-1). Initialized to interpolated vertex color. Replaced by output of Color shader. F 1+5?N>/,`MOWIB"ѥ`MOWIB"ѥNormalNormalized normal of the surface for given pixel. Normal vector is expected to be in world space. Initialized with denormalized interpolated vertex normal. Replaced by output of Normal shader. F 1+5?N>/-HtO{/(HtO{/(TangentNormalized tangent of the surface for given pixel. Tangent vector is expected to be in world space. Initialized with denormalized interpolated vertex tangent. Replaced by output of Normal shader. F 1+5?N>/ qQ@Rj qQ@Rj AlphaZTransparency specified for given pixel. Value should be specified in range 0...1 (full transparency ... fully opaque). Initialized to 1. Replaced by output of Alpha shader. F 1+5?N>/5ҥY@e&ҥY@e&LightDirNormalized light direction vector for given pixel. Light vector is expected to be in world space. Note that this is vector pointing from surface to the light. Initialized in the Vertex light shader. Replaced by output of Light shader. F 1+5?N>/.B_;OKFJ*rB_;OKFJ*rLightDistDistance of the current point to the light. Initialized in the Vertex light shader. Replaced by output of Light shader. F 1+5?N>/HRSEpFCHRSEpFCLightColorLight color for given pixel. Replaced by output of Light shader. F 1+5?N>//~__um1CR¬5~__um1CR¬5TangentToWorldTransformation matrix from tangent space to world space for vectors. F 1+5?N>/ٻzEuSٻzEuSWorldToObjectnTransformation matrix from world space to object space F 1+5?N>/SaI7֏bSaI7֏bObjectToWorldTransformation matrix from object space to world space. Note that this is inverse matrix to WorldToObject. F 1+5?N>/4W}@O{$%%u5E b%%u5E bLE2Data$LE2 Data for node >g'JNjn*p-1OSM n"(XFҦVLE2Data, 1"y"WMB]y"WMB]*ObjectToWorld_NormalA 3x3 Transformation matrix for normal and tangent vectors from object space to world space. F 1+5?N>/)5FYP)5FYPObjectToClipPerspective transformation matrix from object space to screen space. F 1+5?N>/x*yIx*yIWorldToClipPerspective transformation matrix from world space to screen space. F 1+5?N>/#h"mO('#h"mO('TexCoords2`A secondary set of texture coordinates for given surface point. Any undefined channel (u, v or w) is replaced with 0. Initialized to interpolated second vertex texture coords. F 1+5?N>/B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatp1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4)5FYPڳVܯ]FՃ尲1+tsxi_GetInputObjectToClip RtFloat4x4%%u5E b>g'JNjn*pFC`@0@?HRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4ٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x44W}@O{SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3x*yIڳVܯ]FՃ尲0*tsxi_GetInputWorldToClip RtFloat4x4(XFҦV>g'JNjn*pFCAX@1@?#h"mO('ڳVܯ]FՃ尲-'tsxi_GetInputTexCoords2RtFloat3ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]ڳVܯ]FՃ尲93!tsxi_GetInputObjectToWorld_Normal RtFloat3x3}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4-1OSM n 럆L<_ї0HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloatz€ L& InputFloat#+kCY5]BtOt+kCY5]BtO FloatInput float$$$uM@n;LATuM@n;LAFloatBrickFloat brick F 1+5?N>/-$\/3Kf͈,t\/3Kf͈,oFloatOutput float%GqiFE0IN tGqiFE0IN Input usageVThe usage specification for this parameter$%4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"GqiFE0IN SHININESS%%u5E b>g'JNjn*pFPb@X@?4W}@O{+kCY5]BtOA(XFҦV>g'JNjn*pFCCX@1@?uM@n;LA\/3Kf͈,?-1OSM n 럆L<_ї0]IDjdc|InputColor'"uI̎4)]t"uI̎4)] ColorInput color -n,Njlpg(((\PtIL;I1T\PtIL;I1ColorBrickColor brick F 1+5?N>/,(q\W D ɭtq\W D ɭoColorOutput color -n,Njlpg)GqiFE0IN p()4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"GqiFE0IN SPECULARCOLOR\PtIL;I1"uI̎4)]-n,Njlpg>>>?%%u5E b>g'JNjn*pFX@@b@X@?4W}@O{(XFҦV>g'JNjn*pFCCX@1@?q\W D ɭ-1OSM n 럆L<_ї0L{0nBg)`! Phong Lighting P)\Fvq3P)\Fvq3$PrivateShaderData$PrivateShaderData wk0.DX?_,:6~KAMt:6~KAMDiffuseColorzDiffuseColor : RtFloat4 - The four component vector or color F 1+5?N>//,R]JĀ7tR]JĀ7SpecularColor|SpecularColor : RtFloat4 - The four component vector or color F 1+5?N>//-vJ ~~tvJ ~~ShininessdShininess : RtFloat - Scalar floating point value F 1+5?N>//-$&*2HӁdńt$&*2HӁdńNormalVectorjNormalVector : RtFloat3 - The three component vector F 1+5?N>//.Z[G {/,tZ[G {/,EyeDirectionjEyeDirection : RtFloat3 - The three component vector F 1+5?N>//. zE%Sft zE%SfLightDirectionnLightDirection : RtFloat3 - The three component vector F 1+5?N>///w!XCLtw!XCLLightColorvLightColor : RtFloat4 - The four component vector or color F 1+5?N>/// B#A)[(dT B#A)[(dResultColorxResultColor : RtFloat4 - The four component vector or color F 1+5?N>/204W}@O{%%%u5E b-1OSM n"(XFҦVLE2Data, 1" %%u5E b>g'JNjn*pFCLb@d@?4W}@O{(XFҦV>g'JNjn*pFCCX@1@?Z[G {/,:6~KAM B#A)[(dP)\Fvq3wk0.DX?_|X?dK;,w!XCL$&*2HӁdńvJ ~~-1OSM n 럆L<_ї0 zE%SfR]JĀ7fC{oLShaderModel2qΤIGGIP2C/-~CxrEtC/-~CxrE Color$Input color brick F 1+5?N>/234W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"%%u5E b>g'JNjn*pF DA`@P@?4W}@O{(XFҦV>g'JNjn*pFCCX@1@?C/-~CxrE-1OSM n 럆L<_ї0qΤIGGIWG.3;WShaderAlpha5S^M~b P5;MF~Bt;MF~B Alpha$Input alpha brick F 1+5?N>/564W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"%%u5E b>g'JNjn*pFLD`B`@P@?4W}@O{(XFҦV>g'JNjn*pFCAX@1@?S^M~b ;MF~B-1OSM n 럆L<_ї0MYMJJ>zV"Skeleton display8:D x&t:D x&SkeletonSkeleton [}Nj2>8v[IL'KIp>9 6Jѳ(p>>9JmCb4IP}K^p>>:n1LH_rp>>:m6EfHp>>;q\7LO#p>>;>"IM6 Exp>><졉E/~ݾp>><(IДl/p>='a#G @=^V("p>=w`ZL. 5p>>tveDCE`"IWJPB> 2"IM6 Ex 6Jѳ( w`ZL. 5 'a#G @=^V(" m6EfHJmCb4IP}K^(XFҦV>g'JNjn*pFX@>@? 2tY `CG%S;>AngSprZ*Z angle limit spreadAE.*ÿ@;ft.*ÿ@;fAngCntX*X angle limit centerAE׾JBoͰwt׾JBoͰwAngCntY*Y angle limit centerAFgIR"q3tgIR"q3AngCntZ*Z angle limit centerAFxf?Iq -txf?Iq -AngSprX*X angle limit spreadAG@:WvZD,t@:WvZD,AngSprY*Y angle limit spreadAG}ITBKt}ITBKAngStiX$X angle stiffnessAHr<|ݔK .ǻKtr<|ݔK .ǻKAngStiY$Y angle stiffnessAHte6N'tte6N'AngStiZ$Z angle stiffnessAIBI zztBI zzAngDamX X angle dampingAI'7=B;;t'7=B;;AngDamY Y angle dampingAJ/6zsMf6 t/6zsMf6 AngDamZ Z angle dampingAJ6[v!Dt6[v!DMovMinX2X movement limit minimumAK @N1vxt @N1vxMovMinY2Y movement limit minimumAKﶌWMS'tﶌWMS'MovMinZ2Z movement limit minimumALavE/b+ tavE/b+ MovMaxX2X movement limit maximumALu'eDgutu'eDguMovMaxY2Y movement limit maximumAMR<&d@ d|tR<&d@ d|MovMaxZ2Z movement limit maximumAM!lMp[msdt!lMp[msdMovStiX*X movement stiffnessAN~Nc>I=ܯt~Nc>I=ܯMovStiY*Y movement stiffnessANгh@jtгh@jMovStiZ*Z movement stiffnessAObb Bu4Ǫ/tbb Bu4Ǫ/MovDamX&X movement dampingAOg^0A p Ytg^0A p YMovDamY&Y movement dampingAP(roACp"G,1t(roACp"G,1MovDamZ&Z movement dampingA0_BEP1@"<ĠF姁J]DQ׊;Jf|ڢpB(XFҦV"#bb Bu4Ǫ/? @N1vxs5g^0A p Y?6[v!D;rcAۏO'7=B;;?gIR"q3.*ÿ@;fO ,LJavE/b+ ;(XFҦV>g'JNjn*pFCBX@1@?@:WvZD,4C׾JBoͰwd'kJ^U*:KrbSx8 right left right׊;Jf|ڢ(roACp"G,1?BI zz?Y `CG%S;>4C0_BEP1@`^02eE{|@B???;s5?xf?Iq -4CWAG`^02eE{|@B????-5bACuۚ>te6N'?}ITBK?<ĠF姁J]`^02eE{|@B???;s5?~Nc>I=ܯ?!lMp[msd?-1OSM n 럆L<_ї. GFʠN=00@$}}MinZ`Ez]UO GFʠN=@0P$}}MaxZ`Ez]UO GFʠN=`0p*}} StiffnessZ`Ez]UO GFʠN= 00)}}PositionZ`Ez]UO GFʠN=P0`(}}DampingZ`Ez]UO GFʠN=@9 }}Limb tagrcAۏOZ`Ez]UO1釥GP>a@0 }}rcAۏOZ`Ez]UO GFʠN=@ 1 }}d'kJ^U*Z`Ez]UO GFʠN= 1 }}-5bACuۚZ`Ez]UO1釥GP>a 0 }}-5bACuۚZ`Ez]UO GFʠN=p0)}}RotationZ`Ez]UO GFʠN=0 h0"}}XZ`Ez]UO GFʠN=h 0"}}YZ`Ez]UO GFʠN= 0"}}ZZ`Ez]UO GFʠN=0ph"}}XZ`Ez]UO GFʠN=hp"}}YZ`Ez]UO GFʠN=p"}}ZZ`Ez]UO GFʠN=0'}}CenterZ`Ez]UO GFʠN=0'}}SpreadZ`Ez]UO GFʠN=0(}}DampingZ`Ez]UO GFʠN=0*}} StiffnessZ`Ez]UO1釥GP>a00h@0 }}6[v!DZ`Ez]UO1釥GP>ah0@0 }} @N1vxZ`Ez]UO1釥GP>a0@0 }}ﶌWMS'Z`Ez]UO1釥GP>a0@hP0 }}avE/b+ Z`Ez]UO1釥GP>ah@P0 }}u'eDguZ`Ez]UO1釥GP>a@P0 }}R<&d@ d|Z`Ez]UO1釥GP>a0Ph`0 }}bb Bu4Ǫ/Z`Ez]UO1釥GP>ahP`0 }}g^0A p YZ`Ez]UO1釥GP>aP`0 }}(roACp"G,1Z`Ez]UO1釥GP>a0`hp0 }}!lMp[msdZ`Ez]UO1釥GP>ah`p0 }}~Nc>I=ܯZ`Ez]UO1釥GP>a`p0 }}гh@jZ`Ez]UO1釥GP>a0h0 }}.*ÿ@;fZ`Ez]UO1釥GP>ah0 }}׾JBoͰwZ`Ez]UO1釥GP>a0 }}gIR"q3Z`Ez]UO1釥GP>a0h0 }}xf?Iq -Z`Ez]UO1釥GP>ah0 }}@:WvZD,Z`Ez]UO1釥GP>a0 }}Y `CG%S;>Z`Ez]UO1釥GP>a0h0 }}BI zzZ`Ez]UO1釥GP>ah0 }}'7=B;;Z`Ez]UO1釥GP>a0 }}/6zsMf6 Z`Ez]UO1釥GP>a0h0 }}}ITBKZ`Ez]UO1釥GP>ah0 }}r<|ݔK .ǻKZ`Ez]UO1釥GP>a0 }}te6N'Z`Ez]UOnevG4'@ Hd'kJ^U*right leftZ`Ez]UOR<&d@ d|ﶌWMS'/6zsMf6 ?ݫK^BUгh@j?u'eDgus5r<|ݔK .ǻK?;s5X;wJ|vJCD՟HFh-F׵Ԃ(TMyJoint%.;]kI 忞@"S4W}@O{$SݫK^BUpTrcAۏOpSTd'kJ^U*pSUO ,LJ-1OSM n"V-5bACuۚpSVWAGp$dWY `CG%S;>pSW.*ÿ@;fpSX׾JBoͰwpSXgIR"q3pSYxf?Iq -pSY@:WvZD,pSZ}ITBKpSZr<|ݔK .ǻKpS[te6N'pS[BI zzpS\'7=B;;pS\/6zsMf6 pS]6[v!DpS] @N1vxpS^ﶌWMS'pS^avE/b+ pS_u'eDgupS_R<&d@ d|pS`!lMp[msdpS`~Nc>I=ܯpSaгh@jpSabb Bu4Ǫ/pSbg^0A p YpSb(roACp"G,1pS0_BEP1@"<ĠF姁J]Dd׊;Jf|ڢpB(XFҦV"#bb Bu4Ǫ/? @N1vxg^0A p Y?6[v!DrcAۏO'7=B;;?gIR"q3.*ÿ@;f4O ,LJavE/b+ (XFҦV>g'JNjn*pFBDCX@1@?@:WvZD,4C׾JBoͰwd'kJ^U*:KrbSx8 right left right׊;Jf|ڢ(roACp"G,1?BI zz?Y `CG%S;>4C0_BEP1@`^02eE{|@B?BX?xf?Iq -4CWAG`^02eE{|@B????-5bACuۚ>te6N'?}ITBK?<ĠF姁J]`^02eE{|@B?BX?~Nc>I=ܯ?!lMp[msd?-1OSM n 럆L<_ї. GFʠN=00@$}}MinZ`Ez]UO GFʠN=@0P$}}MaxZ`Ez]UO GFʠN=`0p*}} StiffnessZ`Ez]UO GFʠN= 00)}}PositionZ`Ez]UO GFʠN=P0`(}}DampingZ`Ez]UO GFʠN=@9 }}Limb tagrcAۏOZ`Ez]UO1釥GP>a@0 }}rcAۏOZ`Ez]UO GFʠN=@ 1 }}d'kJ^U*Z`Ez]UO GFʠN= 1 }}-5bACuۚZ`Ez]UO1釥GP>a 0 }}-5bACuۚZ`Ez]UO GFʠN=p0)}}RotationZ`Ez]UO GFʠN=0 h0"}}XZ`Ez]UO GFʠN=h 0"}}YZ`Ez]UO GFʠN= 0"}}ZZ`Ez]UO GFʠN=0ph"}}XZ`Ez]UO GFʠN=hp"}}YZ`Ez]UO GFʠN=p"}}ZZ`Ez]UO GFʠN=0'}}CenterZ`Ez]UO GFʠN=0'}}SpreadZ`Ez]UO GFʠN=0(}}DampingZ`Ez]UO GFʠN=0*}} StiffnessZ`Ez]UO1釥GP>a00h@0 }}6[v!DZ`Ez]UO1釥GP>ah0@0 }} @N1vxZ`Ez]UO1釥GP>a0@0 }}ﶌWMS'Z`Ez]UO1釥GP>a0@hP0 }}avE/b+ Z`Ez]UO1釥GP>ah@P0 }}u'eDguZ`Ez]UO1釥GP>a@P0 }}R<&d@ d|Z`Ez]UO1釥GP>a0Ph`0 }}bb Bu4Ǫ/Z`Ez]UO1釥GP>ahP`0 }}g^0A p YZ`Ez]UO1釥GP>aP`0 }}(roACp"G,1Z`Ez]UO1釥GP>a0`hp0 }}!lMp[msdZ`Ez]UO1釥GP>ah`p0 }}~Nc>I=ܯZ`Ez]UO1釥GP>a`p0 }}гh@jZ`Ez]UO1釥GP>a0h0 }}.*ÿ@;fZ`Ez]UO1釥GP>ah0 }}׾JBoͰwZ`Ez]UO1釥GP>a0 }}gIR"q3Z`Ez]UO1釥GP>a0h0 }}xf?Iq -Z`Ez]UO1釥GP>ah0 }}@:WvZD,Z`Ez]UO1釥GP>a0 }}Y `CG%S;>Z`Ez]UO1釥GP>a0h0 }}BI zzZ`Ez]UO1釥GP>ah0 }}'7=B;;Z`Ez]UO1釥GP>a0 }}/6zsMf6 Z`Ez]UO1釥GP>a0h0 }}}ITBKZ`Ez]UO1釥GP>ah0 }}r<|ݔK .ǻKZ`Ez]UO1釥GP>a0 }}te6N'Z`Ez]UOnevG4'@ Hd'kJ^U*right leftZ`Ez]UOR<&d@ d|BXﶌWMS'BX/6zsMf6 ?ݫK^BUгh@j?u'eDgur<|ݔK .ǻK?BXۈsκDX CGUܩHMyBone .;]kI 忞@"e4W}@O{$f.(ѻD3Ϳ.(ѻD3Ϳ RootHRoot joint. Attach to parent joint. jh/L/VVfg!JTg!J Bone Bone parameters DZ5 O*\BUgIbEM K1gtIbEM K1g MassBone massfg}\L 5t}\L 5Virtual$Make bone virtual fh=}(siHa^t=}(siHa^Envelope skinNEnable envelope skinning for this bone fh"Ydg'JNjn*pFB|CX@1@?IbEM K1g?׊;Jf|ڢ`^02eE{|@B??BX@?0_BEP1@`^02eE{|@B????ۻJfHkG/.(ѻD3Ϳ"Yd"IM6 ExƒsF2w(IДl/w'a#G @=^V("xw`ZL. 5>"IM6 Ex-n,Njlpg%?>h>?S $hKnPSVm 6Jѳ( 'a#G @=^V(" w`ZL. 5 偢jD%~`8d_@ cB8EJmCb4IP}K^:KrbSxSolid defaultSolid diamondWire diamondWire thinSolid diamondm6EfH-n,Njlpg???~?(XFҦV>g'JNjn*pF@mCk@ c@PC1C? 2~?׊;Jf|ڢ.F_P#ƒsF2u|H '$ WAG`^02eE{|@B????졉E/~ݾ-n,Njlpg>>'?? G?ŋ~0iV@KU>x%fdN*5Ւh , }}v[IL'KIZ`Ez]UOͽ>fdN*5Ւh 0, }}(IДl/Z`Ez]UO GFʠN= p01 }}(IДl/Z`Ez]UOͽ>fdN*5Ւhp 0, }}'a#G @=^V("Z`Ez]UO GFʠN= 01 }}'a#G @=^V("Z`Ez]UO GFʠN= .}} Show SkeletonZ`Ez]UOͽ>fdN*5Ւhp , }}w`ZL. 5Z`Ez]UOͽ>fdN*5Ւh8H, }} 6Jѳ(Z`Ez]UO GFʠN=8HT }}#Use Character Editor color settings 6Jѳ(Z`Ez]UO B>IHHpX%}}n1LH_rZ`Ez]UO GFʠN=HHX1 }}n1LH_rZ`Ez]UO B>IHX%}}m6EfHZ`Ez]UO GFʠN=pHX1 }}m6EfHZ`Ez]UO B>IHXph%}}q\7LO#Z`Ez]UO GFʠN=XHh> }} Position lockq\7LO#Z`Ez]UO GFʠN=hHx> }} Rotation lock>"IM6 ExZ`Ez]UO B>IHhpx%}}>"IM6 ExZ`Ez]UO GFʠN=pXh: }} Full lock졉E/~ݾZ`Ez]UO B>IXh%}}졉E/~ݾñZ`Ez]UO GFʠN=phx!}}Z`Ez]UO GFʠN=08!}}Z`Ez]UOtveDCE`"IWJv[IL'KI q\7LO#-n,Njlpg>"?I??d47m2O Transformx<ĠF姁J]pDyzyWAGpzy偢jD%~`8PBnz׊;Jf|ڢPBmz4W}@O{$(XFҦV"-1OSM n"偢jD%~`8(XFҦV>g'JNjn*pFX@1@?׊;Jf|ڢWAG<ĠF姁J]-1OSM n 럆L<_ї0qU F3f2Object Render Attributes|S $hKnPSVmPp|8Ns2]p|}^mګA~Ksi[p|}(lrsGrp|~\Eh{5p|~"PbEGDߗrp|F?N dp|]*qBCxp|\J:I%7up|iA޲1rIK>Xp|,ot"AaYp|^RI8ÿRp|çwH5#Vp|4W}@O{%J@#QL-1OSM n#(XFҦV"W0@zd%ȅ8vDCxZp|F+2MGp|I2GWM:).$p|mBޖw pp|o[nfFp|zgGFohN)p|vhD zʔp|fB #^p||$}mK;)p |rg@*oHp |!eLZE^Np |I2GWM:).$ zgGFohN)S $hKnPSVm]*qBCx?vhD zʔçwH5#V rg@*oH4W}@O{\Eh{5-n,Njlpg?\J:I%7u-n,Njlpg?fB #^:KrbSxv No Hidden FacesNo SortTriangle SortNo Sort(XFҦV>g'JNjn*pF X@>@?F?N d 8Ns2]?ȅ8vDCxZ "PbEGDߗr F+2MG ^mګA~Ksi[(lrsGr?J@#QL>g'JNjn*pFCBb@ h@?W0@zdo[nfFmBޖw p,ot"AaY -1OSM n 럆L<_ї˓ DefaultAdvanced GFʠN=0(@6 }}Color\J:I%7uZ`Ez]UO B>I(0h@%}}\J:I%7uZ`Ez]UO GFʠN=@(P8 }}Opacity]*qBCxZ`Ez]UON\q+nN-K^(@hPA\VV?]*qBCxZ`Ez]UOY@ GFʠN=h@P@ }}Enable Obj ModeçwH5#VZ`Ez]UOͽ>fdN*5Ւh@P, }}çwH5#VZ`Ez]UO GFʠN=h 6 }}Color\Eh{5Z`Ez]UO B>I %}}\Eh{5Z`Ez]UO GFʠN=h 08 }}Opacity^mګA~Ksi[Z`Ez]UON\q+nN-K^ 0A\VV?^mګA~Ksi[Z`Ez]UOY@ GFʠN=h0@5 }}Size(lrsGrZ`Ez]UON\q+nN-K^0@A\VV?$@(lrsGrZ`Ez]UOY@ GFʠN=( 8 }}Opacity8Ns2]Z`Ez]UON\q+nN-K^(h A\VV?8Ns2]Z`Ez]UOY@ GFʠN=h(}}SurfaceZ`Ez]UO GFʠN= h0&}}EdgesZ`Ez]UO GFʠN=h'}}PointsZ`Ez]UO GFʠN=Ph`1 }}fB #^Z`Ez]UOnevG4'hP`̆fB #^VNo hidden faces No solving Triangle sortZ`Ez]UO GFʠN=1 }}^RI8ÿRZ`Ez]UOͽ>fdN*5Ւh, }}^RI8ÿRϱZ`Ez]UO GFʠN= 1 }},ot"AaYZ`Ez]UOͽ>fdN*5Ւh , }},ot"AaYZ`Ez]UO GFʠN= 01 }}ȅ8vDCxZZ`Ez]UOͽ>fdN*5Ւh 0, }}ȅ8vDCxZZ`Ez]UO GFʠN=0@1 }}F+2MGZ`Ez]UOͽ>fdN*5Ւh0@, }}F+2MGZ`Ez]UO GFʠN=@P1 }}I2GWM:).$Z`Ez]UOͽ>fdN*5Ւh@P, }}I2GWM:).$Z`Ez]UO GFʠN=P`1 }}mBޖw pZ`Ez]UO1釥GP>aP`0 }}mBޖw pZ`Ez]UO^RI8ÿR |$}mK;)!eLZE^NiA޲1rIK>X qNoJi:dSkeleton root BL=ew!4p.0F $1LӤp0_BEP1@"WAGp׊;Jf|ڢBݫK^BUPgd_@ cB8EPq<ĠF姁J]D4W}@O{$(XFҦV"-1OSM n"BUJzp" d_@ cB8EBL=ew!4(XFҦV>g'JNjn*pFX@1@?׊;Jf|ڢ`^02eE{|@Br?&݉3<?-9p뒼H/p6r?h124d4?0_BEP1@`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?WAG.0F $1LӤ <ĠF姁J]`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?-1OSM n 럆L<_ї  GFʠN=? }}Root transform<ĠF姁J]Z`Ez]UO GFʠN= C }}Skeleton transformWAGZ`Ez]UO GFʠN= 01 }}.0F $1LӤZ`Ez]UOͽ>fdN*5Ւh 0, }}.0F $1LӤZ`Ez]UO GFʠN=0F@1 }}BL=ew!4Z`Ez]UO1釥GP>aF0@0 }}BL=ew!4Z`Ez]UO GFʠN=@P: }} Root boneݫK^BUZ`Ez]UO GFʠN=P`1 }}d_@ cB8EZ`Ez]UO GFʠN=`p1 }}׊;Jf|ڢZ`Ez]UOBUJzݫK^BU܂dKu=$Skeleton material.;]kI 忞@"4W}@O{$.F_P#.F_P#Material Output material __W8E#(sU@Ra.U@Ra.LE2Data, 7$LE2 Data for node >g'JNjn*p՞'fA5-_՞'fA5-_D3DEYED3DEYE =xNT{-1OSM n"(XFҦVLE2Data, 1"J@#QLLE2Data, 24W}@O{(XFҦV>g'JNjn*pF@X@>@BA?.F_P#՞'fA5-_J@#QL>g'JNjn*pF4CtCd@@@?-1OSM n 럆L<_ї0.;]kI 忞@U@Ra.>g'JNjn*pFjCCd@T@?Pc|B;]24Material.F_P#T.F_P#Material Output material __W8E#(S^M~b p5OD.GWf5pqΤIGGIp,S@vTVpзVJilp4W}@O{$U@Ra.-1OSM n"(XFҦVLE2Data, 1"kF_`VertexShadert@*Ntt@*N Constant_shader Constant shader QVO Pk@<;vHwp 0S̤@+Rp,S@vTV5OD.GWf5 0S̤@+R #<зVJil4W}@O{(XFҦV>g'JNjn*pFDCX@@@?S^M~b <;vHw:KrbSxdDisabledEnabledAs OpaqueAs Opaque.F_P#kF_t@*N-1OSM n 럆L<_ї0U@Ra.>g'JNjn*pFDnC`@\@?qΤIGGI/|V FK|ShaderInput?ڵfA'7(%dLrQn0piDM7^@A툷p1M@o=}E[2CV)`MOWIB"ѥHtO{/( qQ@RjҥY@e&B_;OKFJ*rHRSEpFC~__um1CR¬5ٻzEuSSaI7֏b4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"y"WMB])5FYPx*yI#h"mO('B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4p1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3 qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatHRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4%%u5E b>g'JNjn*pFC`@0@?)5FYPڳVܯ]FՃ尲1+tsxi_GetInputObjectToClip RtFloat4x4ٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x44W}@O{(XFҦV>g'JNjn*pFCAX@1@?x*yIڳVܯ]FՃ尲0*tsxi_GetInputWorldToClip RtFloat4x4?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3#h"mO('ڳVܯ]FՃ尲-'tsxi_GetInputTexCoords2RtFloat3%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]ڳVܯ]FՃ尲93!tsxi_GetInputObjectToWorld_Normal RtFloat3x3}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3-1OSM n 럆L<_ї0piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloatz€ L& InputFloat+kCY5]BtOpuM@n;LAP\/3Kf͈,pGqiFE0IN p4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"GqiFE0IN SHININESS%%u5E b>g'JNjn*pFPb@X@?+kCY5]BtOA4W}@O{(XFҦV>g'JNjn*pFCCX@1@?uM@n;LA\/3Kf͈,?-1OSM n 럆L<_ї0]IDjdclInputColor"uI̎4)]p\PtIL;I1Pq\W D ɭpGqiFE0IN p4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"GqiFE0IN SPECULARCOLOR"uI̎4)]-n,Njlpg>>>?\PtIL;I1%%u5E b>g'JNjn*pFX@@b@X@?4W}@O{(XFҦV>g'JNjn*pFCCX@1@?q\W D ɭ-1OSM n 럆L<_ї0L{0nBg)`! Phong Lighting P)\Fvq3:6~KAMpR]JĀ7pvJ ~~p$&*2HӁdńpZ[G {/,p zE%Sfpw!XCLp B#A)[(dP4W}@O{%%%u5E b-1OSM n"(XFҦVLE2Data, 1" %%u5E b>g'JNjn*pFCLb@d@?4W}@O{:6~KAMZ[G {/,(XFҦV>g'JNjn*pFCCX@1@?P)\Fvq3wk0.DX?_|X?dK;, B#A)[(dw!XCL$&*2HӁdńvJ ~~-1OSM n 럆L<_ї0R]JĀ7 zE%SffC{o<ShaderModelqΤIGGIPC/-~CxrEp4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"%%u5E b>g'JNjn*pF DA`@P@?4W}@O{C/-~CxrE(XFҦV>g'JNjn*pFCCX@1@?-1OSM n 럆L<_ї0qΤIGGIWG.3;WShaderAlphaS^M~b P;MF~Bp4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"%%u5E b>g'JNjn*pFLD`B`@P@?4W}@O{(XFҦV>g'JNjn*pFCAX@1@?S^M~b ;MF~B-1OSM n 럆L<_ї0MYMJJ>zV\"Skeleton display:D x&pv[IL'KIp 6Jѳ(pJmCb4IP}K^pn1LH_rpm6EfHpq\7LO#p>"IM6 Exp졉E/~ݾp(IДl/p'a#G @=^V("pw`ZL. 5ptveDCE`"IWJPBp 2"IM6 Ex 6Jѳ( 'a#G @=^V(" w`ZL. 5 JmCb4IP}K^m6EfH(XFҦV>g'JNjn*pFX@>@?n1LH_r 2p.*ÿ@;fp׾JBoͰwpgIR"q3pxf?Iq -p@:WvZD,p}ITBKpr<|ݔK .ǻKpte6N'pBI zzp'7=B;;p/6zsMf6 p6[v!Dp @N1vxpﶌWMS'pavE/b+ pu'eDgupR<&d@ d|pa!lMp[msdpHb~Nc>I=ܯpbгh@jpHcbb Bu4Ǫ/pcg^0A p YpHd(roACp"G,1p0_BEP1@"<ĠF姁J]De׊;Jf|ڢpB(XFҦV"#bb Bu4Ǫ/? @N1vx6[v!Dg^0A p Y?rcAۏO.*ÿ@;fgIR"q3'7=B;;?O ,LJ(XFҦV>g'JNjn*pF]CBX@@@?avE/b+ ׾JBoͰw@:WvZD,4CY `CG%S;>4CBI zz?(roACp"G,1?׊;Jf|ڢd'kJ^U*:KrbSx8 right left rightxf?Iq -4C0_BEP1@`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?-5bACuۚ>WAG`^02eE{|@Br?&݉3<?-9p뒼H/p6r?h124d4?}ITBK?te6N'?~Nc>I=ܯ?<ĠF姁J]`^02eE{|@B????-1OSM n 럆L<_ї. GFʠN=00@$}}MinZ`Ez]UO GFʠN=@0P$}}MaxZ`Ez]UO GFʠN=`0p*}} StiffnessZ`Ez]UO GFʠN= 00)}}PositionZ`Ez]UO GFʠN=P0`(}}DampingZ`Ez]UO GFʠN=@9 }}Limb tagrcAۏOZ`Ez]UO1釥GP>a@0 }}rcAۏOZ`Ez]UO GFʠN=@ 1 }}d'kJ^U*Z`Ez]UO GFʠN= 1 }}-5bACuۚZ`Ez]UO1釥GP>a 0 }}-5bACuۚZ`Ez]UO GFʠN=p0)}}RotationZ`Ez]UO GFʠN=0 h0"}}XZ`Ez]UO GFʠN=h 0"}}YZ`Ez]UO GFʠN= 0"}}ZZ`Ez]UO GFʠN=0ph"}}XZ`Ez]UO GFʠN=hp"}}YZ`Ez]UO GFʠN=p"}}ZZ`Ez]UO GFʠN=0'}}CenterZ`Ez]UO GFʠN=0'}}SpreadZ`Ez]UO GFʠN=0(}}DampingZ`Ez]UO GFʠN=0*}} StiffnessZ`Ez]UO1釥GP>a00h@0 }}6[v!DZ`Ez]UO1釥GP>ah0@0 }} @N1vxZ`Ez]UO1釥GP>a0@0 }}ﶌWMS'Z`Ez]UO1釥GP>a0@hP0 }}avE/b+ Z`Ez]UO1釥GP>ah@P0 }}u'eDguZ`Ez]UO1釥GP>a@P0 }}R<&d@ d|Z`Ez]UO1釥GP>a0Ph`0 }}bb Bu4Ǫ/Z`Ez]UO1釥GP>ahP`0 }}g^0A p YZ`Ez]UO1釥GP>aP`0 }}(roACp"G,1Z`Ez]UO1釥GP>a0`hp0 }}!lMp[msdZ`Ez]UO1釥GP>ah`p0 }}~Nc>I=ܯZ`Ez]UO1釥GP>a`p0 }}гh@jZ`Ez]UO1釥GP>a0h0 }}.*ÿ@;fZ`Ez]UO1釥GP>ah0 }}׾JBoͰwZ`Ez]UO1釥GP>a0 }}gIR"q3Z`Ez]UO1釥GP>a0h0 }}xf?Iq -Z`Ez]UO1釥GP>ah0 }}@:WvZD,Z`Ez]UO1釥GP>a0 }}Y `CG%S;>Z`Ez]UO1釥GP>a0h0 }}BI zzZ`Ez]UO1釥GP>ah0 }}'7=B;;Z`Ez]UO1釥GP>a0 }}/6zsMf6 Z`Ez]UO1釥GP>a0h0 }}}ITBKZ`Ez]UO1釥GP>ah0 }}r<|ݔK .ǻKZ`Ez]UO1釥GP>a0 }}te6N'Z`Ez]UOnevG4'@ Hd'kJ^U*right leftZ`Ez]UO!lMp[msd?ݫK^BU/6zsMf6 ?ﶌWMS'i@R<&d@ d|i@r<|ݔK .ǻK?u'eDguгh@j? ZoUF_KACGUܩH<MyBone .;]kI 忞@"Hg4W}@O{$g.(ѻD3ͿHhg!JPhIbEM K1gpHhHi}\L 5pHhi=}(siHa^pHhHj"Ydg'JNjn*pFBBX@1@?=}(siHa^ }\L 5 g!J׊;Jf|ڢ`^02eE{|@Br?&݉3<?-9pqu1 :h124d4?IbEM K1g?0_BEP1@`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?ۻJfHkG/.(ѻD3Ϳ"Ydt a@7>syScale yHmHpԕfHKUR8HtԕfHKUR8HszScale ZHmp_.%YBQ:Pt_.%YBQ:PshxShear XHmHqhIu) thIu) shyShear YHmqglVL'{/:tglVL'{/:shzShear ZHmHr8S H"`7M_t8S H"`7M_ rollRotation by XHmrǰ϶F?tǰ϶F? pitchRotation by YHmHsތdnJAy0VWtތdnJAy0VWyawRotation by ZHms4W}@O{$(XFҦV"-1OSM n" a@7>?ȎJxѝ_.%YBQ:Pw<:'Cu`n(XFҦV>g'JNjn*pCAX@ f@_.%YBQ:P1 =glVL'{/:i>hIu) =?8S H"`7M_glVL'{/:hIu) ԕfHKUR8H?-1OSM n 럆L<_їrDefault GFʠN=@(P1 }}ǰ϶F?Z`Ez]UO1釥GP>a(@`P0 }}ǰ϶F?Z`Ez]UO GFʠN=0(@1 }}8S H"`7M_Z`Ez]UO1釥GP>a(0`@0 }}8S H"`7M_Z`Ez]UO GFʠN=`(p1 }}UA0GF(K3Z`Ez]UO1釥GP>a(``p0 }}UA0GF(K3Z`Ez]UO GFʠN=p(1 }} a@7>Z`Ez]UO1釥GP>a(p`0 }} a@7>Z`Ez]UO GFʠN=(1 }}ԕfHKUR8HZ`Ez]UO1釥GP>a(`0 }}ԕfHKUR8HZ`Ez]UO GFʠN=(1 }}OIo9Z`Ez]UO1釥GP>a(`0 }}OIo9Z`Ez]UO GFʠN=( 1 }}w<:'Cu`nZ`Ez]UO1釥GP>a(` 0 }}w<:'Cu`nZ`Ez]UO GFʠN= (01 }}ОU BPDC Z`Ez]UO1釥GP>a( `00 }}ОU BPDC Z`Ez]UO GFʠN=P(`1 }}ތdnJAy0VWZ`Ez]UO1釥GP>a(P``0 }}ތdnJAy0VWZ`Ez]UO GFʠN=`1 }}ȎJxѝZ`Ez]UOތdnJAy0VWǰ϶F?UA0GF(K3?ОU BPDC OIo98ʯȥJH|o7 gH]kDwPނ{`d8pM*#ͺOI/tfѭ8Lwb"qRA