gH]kDwP|trueSpace7.6[VS_O93Y*I Clinton Reese, RUR`d8pM*#ͺO2PNG  IHDR@@% IDATxُ]וÙ\YUdLjEInm +F$@$O~_txl$(DR*|V{ϸ@e5٦vq}ƍoo9MRv73 D՛oIuמyz㝋oO'Ӽ,VwwmnX\ʲ j%Y+4u}ww{[\\xm]`ƫHuJk`U43ñ$ϹQʟ5kz1`w߹x믽l֍Q`o_>3g\򲎣h?kڽ)-Fe$QGJ Dd "֫zt$*kEM#DXCv l{~)b)BV23 "" >`  d(iMxw?_\ZW2Y<㓢;k)jLΛ94T"bT(MUr+3!_w#"& &pi ~vБq!C+KDr`jE5Y@MS8 tDVK< >/ [ RHMtW.@, (msɬ+H2V9v!`$N fDF} qQL8q$PDD;@D`6^uU$T2GJG_RB/\JI0n4E,xSRRt,JӘ>P`]R $y v.kW9\{gBp"%@BJGQe R<瞹JHF D(E^8?}WWPR88NRj@`,|PHHL{(umۜNr"T"/K%4{DR@Iq8M=02GJGQ9 3 `:wܙف>$^zO@a_΃=ꏂ1Vˆy $gyk ᜣf;\aLU@k3;3K_t{_?bNt0;Gfgg]m+So?nGR3m:@$ieQ2@}&e_~koǕ+R򩲪"%Sb=>:\X]]}x</--f.nC+KQ# $0J@[|:yB"JڑcGD%U]*ғ;:~p8ŭ57FQܛQ~(jT_zg}͛e4nomn+936&uρYC!{}DB8MpX;rĝՏ[}+?~ݭvUk_uB!x2YX?ѧb| 0L0#37u (E&J*^J6@X?\COl^\Xw;OmÞ)>kPnzGRÇ;3yɫǏlo Xbzkuʓ++ `vнrh~ocgkwv0c}u烊Bؘ;8ËgduwYs#+)mmL:O85-&,`os?ï9wv{{s<>RJ""(jg{78888wtvov1,KQ o.MH%JHJ眎#"_WnɭQ1|`vowXZ;ٴq2>V&LQLO_:-8Ļy_t婫W=19w-G fB`ݾP$B*@@U] A'0{f@彃êtf?9mDvƵ{d09܁Ψv[[= o{e5\xpm%gdʘ"n۸uV+ŒNy{ʣyQĭ#I7HmM3\Ǻ*\~xgo:ћ1DuC:U_GC7WօVB`D9;8:ϧyయe1`SׯJǎt(kTii_޻~wMitـDN5;P^^MFyqh:98::" $(Sԭ}`po۬Yju9$J  NPP׾^yg7nLN&?lwEG+ '##o7M7WS'GSb|hǁA)e3ޝGU] 0 C(A+ٲ,bb N$wv_+5NWw_֍tBe<5M@ {o?)]v'qQz"&|4HƐT+_}t'2EɁ )BIa/KO]/XG)Yo_xwo^VWyzQt U;Q։N'-j{W.J/éj/.,[`eqGY(0 t$i4px`yy%Mu}l~.8gϟɫbt8/|s)88M$RJDcau\8:tfaqӗN.?۷N[o%#罐 Lc==`&vuŏR+ҝS`TUӬ>ޝ݋wa:g4NS -!0֢ےbjOW/_xB.|w*({&Fm|` Xqnn{F:ZS~X:[3+ F*˻"vgNi!ePG2(gVN_?__RD-^Zg(jLDJVi! ,JE{!0#Uu 3Ky x|4uNGRJm@SOç:y$NTlON uOά|G^UU>ZF)cj!&Ӊ*y"PJ@c)AR30sf=Gɥ,ͦImLEՔ!: xzJ͝rѝnUm۲N| VuQjRJ23 |R#29됁XDT(}D@@y:cB =J}ȔMmRF}MpToܾ+)Rp?37"3 K%tDVOTRB9HB8? Yb'R{S U`<+,,~hwf"!ToNU($K)bD<64UDGY#FȰgdJ "~'SF'Z#,OARD,Bg=إn!XiEq@(4&P`4RH9P>Eiєi+inw>=rkFQֽAOhc}#sQ'q W9c}N cm~=3ΗSIxRc (2xRQ<7;R ^+)Um!}ft*n !|rzR:/,8 CD)!;[["Nqs4AFc=oE`:e$)T QJRx)LDYTC]{ODNxk1z{{^fƙA9d86&Zk-'E:w‹Q~Zg1`.Ѿ5u 6VODR:.EJZYUkS(UUy88rb䣏9{XY[ke]9wQJn (CP$ibwD\j-~QvPT)@ .QGёcOBx@(/Q=ԇ{̠dt4_L3_W>ևO?Nӟ޼yʕg}w/_{擪 "}IENDB`/tfѭ8Lwb"q&܂dKu=pE <doom3 MD5 Animation Export v0pE .;]kI 忞@.;]kI 忞@"SubObject*Encapsulated objects"V Y qE 4W}@O{4W}@O{$ Owner4Owner of the Encapsulator$-1OSM n-1OSM n"LayoutLayout 럆L<_ї"(XFҦV(XFҦV"LE2Data$LE2 Data for node >g'JNjn*p""G NffMCONffMCODMyFileName\W x3 z@Hoz@Ho Control InTransitionInPLX Þ [jdOA#}[jdOA#}DstatusLine\,Z [jdOA#}@MD5AnimExport - start of export(XFҦV>g'JNjn*p^CC~@@\@tveDCE`"IWJ}?B`?NffMCOC:\Documents and Settings\Clinton\My Documents\tsOutput\test.md5anim-1OSM n 럆L<_ї5  Default Asp4  GFʠN=F G5 }}AnNffMCOZ`Ez]UO1釥GP>aHG,NffMCOZ`Ez]UO GFʠN=X ; }} MyFileNameNffMCOZ`Ez]UO1釥GP>aX ,NffMCOZ`Ez]UO#nKSM2P@ $\VVNffMCOZ`Ez]UOOˁ CRih[P@ ^Activity.Run('%THIS_NAME%' + '/MD5AnimExport')ExportZ`Ez]UO GFʠN=@ ]}}<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO GFʠN=@`P 1 }}[jdOA#}Z`Ez]UO1釥GP>a`@P ,[jdOA#}Z`Ez]UOz@Hot t 48@J g'JNjn*pceZU@䑧rceZU@䑧r$_scriptData*Internal Script data [җJs@ %V 4W}@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*pW NffMCOD2|=Bynj2|=Bynj Control OutTransitionOutPLX z@Ho 2|=Bynj2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Doom3 md5anim export // July 2008 // clinton reese // // // // file format // header 2 lines and an empty line // numFrames // numJoints // frameRate // numAnimatedComponents // hierarchy one line for each joint // name, parent index, 6bit anim flag and start index of animation then comment with parent name and human readable anim flag // bounds section - bounding box for each frame // baseframe // all other frames - same format as baseframe except only animated elements listed // each line corresponds to non zero anim flag of joints // // // August 1 2008 - first fully working animation export // // // // Execute // Called to execute the command function Execute(params) { //TODO: test for existence of doomActor in the scene, later do check on selected object for a skeleton node var myScale = 10.0; // 1 inch in doom3 = 0.1 meter in trueSpace //make sure selected object has skeleton skeletonFound = false; scene = Space.CurrentScene(); 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; } if(!skeletonFound) { System.Alert("No skeleton found inside selected node"); return; } //build joint list //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 baseframe jointList.qx = new Array(); jointList.qy = new Array(); jointList.qz = new Array(); jointList.qw = new Array(); //xyz storage baseframe jointList.x = new Array(); jointList.y = new Array(); jointList.z = new Array(); // //get first true doom3 joint // //skeleton root(joint like) connects to dummy bone which connects to dummy joint and first doom3 joint 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 //System.Trace(name); //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 num2 = Node.LinkedOutputNodeCount(jointName,"Joint"); //dummy joint has no children //if joint has child bone then is the start of doom3 heirarchy if(num2>0) { startJoint = jointName; numchild = num2; } //System.Trace("joint" + i +" has " + num2); } System.Trace(startJoint); //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 cuurent joint lastIndex = 0;//add new joints to list here //put while loop start here while(currIndex != -1) { //add current child to list if(jointList.curChild[currIndex] < jointList.numChildren[currIndex]) { //NOTE: dont forget to filter out ik handles, ik stops and limb pass throughs //System.Trace("curr joint = " + jointList.path[currIndex]); //System.Trace("curr child ind = " + jointList.curChild[currIndex]); //childBoneCount = Node.LinkedOutputNodeCount(jointList.path[currIndex],"Joint"); //if joint has child bone then is not a leaf //if(childBoneCount != 0) //{ //child bone of the joint curBone = Node.LinkedOutputNode(jointList.path[currIndex],"Joint",0); //System.Trace(curBone); //current child joint currentChildIndex = jointList.curChild[currIndex]; curJoint = Node.LinkedOutputNode(curBone,"Bone",currentChildIndex); //check for limb boneInOut = Node.LinkedInputNodeCount(curJoint,"Bone") + Node.LinkedOutputNodeCount(curJoint,"Bone"); if(boneInOut==2) { //limb found curJoint = Node.LinkedOutputNode(curJoint,"Bone"); } //System.Trace(curJoint); //if leaf then do leaf stuff otherwise continue 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(curJoint,"Bone"); } leaftest = Node.LinkedOutputNodeCount(qleafjoint,"Joint"); //System.Trace(leaftest); 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"); } else { numchild = 0; } //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; 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; myMatrix = System.CreateDO('Math Package/Matrix Float Data'); //animation flags jointList.afx = new Array(); jointList.afy = new Array(); jointList.afz = new Array(); jointList.afqx = new Array(); jointList.afqy = new Array(); jointList.afqz = new Array(); //save basepose data for joints //IRiAnim=RsAnim RsAnim.PutFrame(firstSel,0); for(jind=0;jind<numJoints;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; jointList.x[jind] = xval; jointList.y[jind] = yval; jointList.z[jind] = zval; qx = 0; qy = 0; qz = 0; qw = 0; mattoquat(myMatrix); jointList.qx[jind] = qx; jointList.qy[jind] = qy; jointList.qz[jind] = qz; jointList.qw[jind] = qw; //set all animation flags to zero jointList.afx[jind] = 0; jointList.afy[jind] = 0; jointList.afz[jind] = 0; jointList.afqx[jind] = 0; jointList.afqy[jind] = 0; jointList.afqz[jind] = 0; } //these will be on button to load defaults into typeable field later firstFrame = Node.Value("/Preferences/AnimPref","PlayRangeStart"); lastFrame = Node.Value("/Preferences/AnimPref","PlayRangeEnd"); numFrames = lastFrame - firstFrame + 1; //frameRate = Node.Value("/Preferences/AnimPref","Frame Rate");//this is enum value not a number //determine animated flag components //6bit flag //qz qy qx tz ty tx for(frame = firstFrame;frame<=lastFrame;frame++) { // RsAnim.PutFrame(firstSel,frame); for(jind=0;jind<numJoints;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; if(Math.abs(jointList.x[jind] - xval) > 0.00001) jointList.afx[jind] = 1; if(Math.abs(jointList.y[jind] - yval) > 0.00001) jointList.afy[jind] = 2; if(Math.abs(jointList.z[jind] - zval) > 0.00001) jointList.afz[jind] = 4; qx = 0; qy = 0; qz = 0; qw = 0; mattoquat(myMatrix); if(Math.abs(jointList.qx[jind] - qx) > 0.00001) jointList.afqx[jind] = 8; if(Math.abs(jointList.qy[jind] - qy) > 0.00001) jointList.afqy[jind] = 16; if(Math.abs(jointList.qz[jind] - qz) > 0.00001) jointList.afqz[jind] = 32; } } numAnimatedComponents = 0; for(jind=0;jind<numJoints;jind++) { if(jointList.afx[jind] != 0) numAnimatedComponents++; if(jointList.afy[jind] != 0) numAnimatedComponents++; if(jointList.afz[jind] != 0) numAnimatedComponents++; if(jointList.afqx[jind] != 0) numAnimatedComponents++; if(jointList.afqy[jind] != 0) numAnimatedComponents++; if(jointList.afqz[jind] != 0) numAnimatedComponents++; } MyFileName = params.conValue('MyFileName'); scene = Space.CurrentScene(); owner = System.ThisOwner(); System.Trace("start of export"); Node.Value(owner,"statusLine") = "MD5AnimExport - start of export"; var forReading = 1, forWriting = 2, forAppending = 8; rline = new Array(); fs = new ActiveXObject("Scripting.FileSystemObject"); f = fs.GetFile(MyFileName); connToFile = f.OpenAsTextStream( forWriting, 0); //Header connToFile.WriteLine("MD5Version 10"); connToFile.WriteLine("commandline"); connToFile.WriteBlankLines(1); connToFile.WriteLine("numFrames " + numFrames); connToFile.WriteLine("numJoints " + numJoints); connToFile.WriteLine("frameRate " + "77"); connToFile.WriteLine("numAnimatedComponents " + numAnimatedComponents); connToFile.WriteBlankLines(1); connToFile.WriteLine("hierarchy {"); animCount = 0;//running index count for(jind=0;jind<numJoints;jind++) { shortname = Node.ShortName(jointList.path[jind]); parentInd = jointList.parentIndex[jind]; if(parentInd != -1) parentname = Node.ShortName(jointList.path[parentInd]); else { parentname = ""; if(shortname != "origin") System.Alert("Warning: first joint not named 'origin'"); } //anim flags animFlags = jointList.afx[jind] + jointList.afy[jind] + jointList.afz[jind] + jointList.afqx[jind] + jointList.afqy[jind] + jointList.afqz[jind]; if(jointList.afx[jind] != 0) animCount++; if(jointList.afy[jind] != 0) animCount++; if(jointList.afz[jind] != 0) animCount++; if(jointList.afqx[jind] != 0) animCount++; if(jointList.afqy[jind] != 0) animCount++; if(jointList.afqz[jind] != 0) animCount++; if(animFlags == 0) animIndex = 0; //else // animIndex = animCount; theString = '\t' + '"' + shortname + '"\t' + parentInd + ' ' + animFlags + ' ' + animIndex; theString = theString + '\t// ' theString = theString + parentname; //anim flags //animFlags = jointList.afx[jind] + jointList.afy[jind] + jointList.afz[jind] + jointList.afqx[jind] + jointList.afqy[jind] + jointList.afqz[jind]; if(animFlags != 0) { theString = theString + " ( "; if(jointList.afx[jind] != 0) theString = theString + "Tx "; if(jointList.afy[jind] != 0) theString = theString + "Ty "; if(jointList.afz[jind] != 0) theString = theString + "Tz "; if(jointList.afqx[jind] != 0) theString = theString + "Qx "; if(jointList.afqy[jind] != 0) theString = theString + "Qy "; if(jointList.afqz[jind] != 0) theString = theString + "Qz "; theString = theString + ")"; } connToFile.WriteLine(theString); //animation start index update for next bone if(animFlags == 0) animIndex = 0; else animIndex = animCount; } connToFile.WriteLine("}"); connToFile.WriteBlankLines(1); connToFile.WriteLine("bounds {"); tempB = System.CreateDO('Common Data Package/Number Array Data'); //TODO: change so can start at not zero for(i=0;i<numFrames;i++) { RsAnim.PutFrame(firstSel,i); //one line bounding box for each frame //IRiSpaceCommand = Space tempB = Space.GetBoundingBox(firstSel); xmin = myScale * tempB.GetAt(0); xmax = myScale * tempB.GetAt(1); ymin = myScale * tempB.GetAt(2); ymax = myScale * tempB.GetAt(3); zmin = myScale * tempB.GetAt(4); zmax = myScale * tempB.GetAt(5); //note: this is (probably) wrong because of unmoving bone and test is centered on origin // later take moving non centered mesh into account(if necessary) // maybe use bb of largest mesh, skinning output, hmm maybe not theString = '\t' + '( ' + xmin.toFixed(10) + ' ' + ymin.toFixed(10) + ' ' + zmin.toFixed(10) + ' ) ( '; theString = theString + xmax.toFixed(10) + ' ' + ymax.toFixed(10) + ' ' + zmax.toFixed(10) + ' )'; connToFile.WriteLine(theString); } connToFile.WriteLine("}"); connToFile.WriteBlankLines(1); connToFile.WriteLine("baseframe {"); for(jind=0;jind<numJoints;jind++) { xval = jointList.x[jind] ; yval = jointList.y[jind] ; zval = jointList.z[jind] ; qxval = jointList.qx[jind] ; qyval = jointList.qy[jind] ; qzval = jointList.qz[jind] ; //jointList.qw[jind] = qw; //use sign of quat w to fix flipping for doom3 if(jointList.qw[jind]<0) { qxval = -jointList.qx[jind] ; qyval = -jointList.qy[jind] ; qzval = -jointList.qz[jind] ; } //theString = '\t' + '( 0 0 0 ) ( 0 0 0 )'; theString = '\t' + '( ' + xval.toFixed(10) + ' ' + yval.toFixed(10) + ' ' + zval.toFixed(10) + ' ) ( '; theString = theString + qxval.toFixed(10) + ' ' + qyval.toFixed(10) + ' ' + qzval.toFixed(10) + ' )'; connToFile.WriteLine(theString); } connToFile.WriteLine("}"); connToFile.WriteBlankLines(1); curFrame = 0; for(frm=firstFrame;frm<=lastFrame;frm++) { RsAnim.PutFrame(firstSel,frm); theString = 'frame ' + curFrame + ' {'; connToFile.WriteLine(theString); for(jind=0;jind<numJoints;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 ; } //theString = '\t' + '( 0 0 0 ) ( 0 0 0 )'; theString = '\t '; if(jointList.afx[jind] != 0) theString = theString + xval.toFixed(10) + " "; if(jointList.afy[jind] != 0) theString = theString + yval.toFixed(10) + " "; if(jointList.afz[jind] != 0) theString = theString + zval.toFixed(10) + " "; if(jointList.afqx[jind] != 0) theString = theString + qx.toFixed(10) + " "; if(jointList.afqy[jind] != 0) theString = theString + qy.toFixed(10) + " "; if(jointList.afqz[jind] != 0) theString = theString + qz.toFixed(10) + " "; //anim flags animFlags = jointList.afx[jind] + jointList.afy[jind] + jointList.afz[jind] + jointList.afqx[jind] + jointList.afqy[jind] + jointList.afqz[jind]; if(animFlags != 0) connToFile.WriteLine(theString); } connToFile.WriteLine("}"); connToFile.WriteBlankLines(1); curFrame++; } connToFile.Close(); //return; } //***************************************************** //***************************************************** //***************************************************** //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,9#^cstringMyFileNameNffMCO4W}@O{(XFҦV>g'JNjn*pnCCz@@V@2|=Bynj|?z@Hoۙ>?NffMCOC:\Documents and Settings\Clinton\My Documents\tsOutput\test.md5animJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї˱  ControlOˁ CRih[  nKg8Activity.Run('%THIS_NAME%')ImportZ`Ez]UOOˁ CRih[0HnKe:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=`  nKa}}An<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO1釥GP>a 0nK,NffMCOZ`Ez]UO#nKSM2` nK$\VVNffMCOZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Hoͤ*EgbĬkZ status2AEHM'ceZU@䑧r%Y 4W}@O{$(XFҦV#.;]kI 忞@"-1OSM n#,Z [jdOA#}D2AEHM'>g'JNjn*pFBC`@0@?ceZU@䑧r[җJs@ |NewObject// OnComputeOutputs // Called to compute values of all output connectors function OnComputeOutputs(params) { var statusLine = params.ConValue('statusLine'); // TODO: put your computation here } NScript Object Package/jScript languagestringstatusLine[jdOA#}4W}@O{[jdOA#}@MD5AnimExport - start of export(XFҦV>g'JNjn*pFCCb@@@?.;]kI 忞@-1OSM n 럆L<_ї, 8ʯȥJH|o7 gH]kDwPXj|`d8pM*#ͺOY|2/tfѭ8Lwb"q&Թ