gH]kDwP~trueSpace7.51[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=̧ 0Constraint script v1.11 `.;]kI 忞@.;]kI 忞@"SubObject*Encapsulated objects# h6q_ #' 0@. H OE pQ _ 4W}@O{4W}@O{$ Owner4Owner of the Encapsulator%h8 (XFҦV(XFҦV"LE2Data$LE2 Data for node >g'JNjn*p"+-1OSM n-1OSM n"LayoutLayout 럆L<_ї"h!  ΁lvJLٵE! ΁lvJLٵE!Dmaintain \x x{vR.A&]}G{vR.A&]}GD xFlag \ UI ֙eJK~,j^i%֙eJK~,j^i%D yFlag \8 8 :@$^s:@$^sD zFlag \0 HB RE#0إD|B RE#0إD|DxrFlag \R) #@` #@` DyrFlag \hR( SvKm_ú'SvKm_ú'DzrFlag \hE_ vwu(@g$5;hvwu(@g$5;hDpreStore \ȗ  #@` 4W}@O{:@$^s ֙eJK~,j^i% (XFҦV>g'JNjn*pFHBh@q@A?SvKm_ú'  ΁lvJLٵE! {vR.A&]}G B RE#0إD| .;]kI 忞@-1OSM n 럆L<_ї˰ DefaultOˁ CRih[`0`0LActivity.Run("%THIS_NAME%" + "/doIt")add constraintZ`Ez]UO GFʠN=0`@@ }}maintain offset ΁lvJLٵE!Z`Ez]UOͽ>fdN*5Ւh`0@8 ` ΁lvJLٵE!Z`Ez]UO GFʠN=X@h2 }}X{vR.A&]}GZ`Ez]UOͽ>fdN*5Ւhh@8 @{vR.A&]}GZ`Ez]UO GFʠN=@Xh2 }}Y֙eJK~,j^i%Z`Ez]UOͽ>fdN*5Ւh@h8 @֙eJK~,j^i%Z`Ez]UO GFʠN=Xh2 }}Z:@$^sZ`Ez]UOͽ>fdN*5Ւhh8 @:@$^sZ`Ez]UOOˁ CRih[`0`0PActivity.Run("%THIS_NAME%" + "/unDoIt")$remove constraintZ`Ez]UO GFʠN=@X-Position+E$@B GFʠN=-Rotation+E$@B GFʠN=@3 }}XrB RE#0إD|Z`Ez]UOͽ>fdN*5Ւh@8 @B RE#0إD|Z`Ez]UO GFʠN=@3 }}Yr#@` Z`Ez]UOͽ>fdN*5Ւh@8 @#@` Z`Ez]UO GFʠN=3 }}ZrSvKm_ú'Z`Ez]UOͽ>fdN*5Ւh8 @SvKm_ú'Z`Ez]UOOˁ CRih[``jActivity.Run('%THIS_NAME%' + "/preStoreConstrainee")constraineeZ`Ez]UOOˁ CRih[``jActivity.Run('%THIS_NAME%' + "/preStoreConstrainor")constrainorZ`Ez]UO GFʠN=`1 }}vwu(@g$5;hZ`Ez]UOͽ>fdN*5Ւh`8 `vwu(@g$5;hZ`Ez]UOvwu(@g$5;h F\ ܂dKu=}Constraint .;]kI 忞@#8  h64W}@O{%`e (XFҦV"@U* vs]}@)Ό| vs]}@)Ό| DorigMatrix `^02eE{|@\E y%9IFO) p9IFO) pDxOffset\0< XI +ơ@;+ơ@;DyOffset\P ` >u3kMC!">u3kMC!"DzOffset\P 0y&4@F9}ȿy&4@F9}ȿDactive \؀& >u3kMC!"vs]}@)Ό| 4W}@O{(XFҦV>g'JNjn*pF@0DBb@@X@?y&4@F9}ȿ +ơ@;.;]kI 忞@9IFO) p48@J g'JNjn*p 9ceZU@䑧rceZU@䑧r$_scriptData*Internal Script data [җJs@ %8  4W}@O{$ ~C (XFҦVLE2Data, 1#8 J@#QLJ@#QLLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 3@ MT^RwL~YYTMT^RwL~YYTޢLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 2  ƐuE$q ƐuE$qD countDE vs]}@)Ό| D@U* C~Wa5IH9 Q~Wa5IH9 QD xFlag D`@ uDjUbuDjUbD yFlag DV PKEZآPKEZآD zFlag D0< 9IFO) pDy%P +ơ@;DXI P >u3kMC!"D` < f z K4of z K4oDconstraineeD"B }IC?}IC?Dmaintain D dPB>2LdPB>2LDxrFlag DV" ^4FIH^4FIHDyrFlag DV"  3=Ku+'# 3=Ku+'#DzrFlag D؀& y&4@F9}ȿD0X& 2|=Bynj2|=Bynj Control OutTransitionOutD! z@Hoz@Ho Control InTransitionIn2|=Bynj}IC?>u3kMC!"uDjUb2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ %NewCommand // dataCalc - Constraint v1.1 // // February 14 2008 // // by Clinton Reese // // purpose: signalled by a constrainor matrix change or a weight change to update the location and orientation of the constrainee // // Feb 28 2008 fix save as bug, enhance calculations for group objects // // Execute // Called to execute the command function Execute(params) { var count = params.ConValue('count'); var origMatrix = params.ConValue('origMatrix'); var xFlag = params.ConValue('xFlag'); var yFlag = params.ConValue('yFlag'); var zFlag = params.ConValue('zFlag'); var xOffset = params.ConValue('xOffset'); var yOffset = params.ConValue('yOffset'); var zOffset = params.ConValue('zOffset'); var constrainee = params.ConValue('constrainee'); var maintain = params.ConValue('maintain'); var xrFlag = params.ConValue('xrFlag'); var yrFlag = params.ConValue('yrFlag'); var zrFlag = params.ConValue('zrFlag'); var active = params.ConValue('active'); if(!active) return; tmpMatrix = System.CreateDO("Math Package/Matrix Float Data"); tmpMatrix2 = System.CreateDO("Math Package/Matrix Float Data"); parentMat = System.CreateDO("Math Package/Matrix Float Data"); parentMatInv = System.CreateDO("Math Package/Matrix Float Data"); childMat = System.CreateDO("Math Package/Matrix Float Data"); cumX = 0; cumY = 0; cumZ = 0; cumWeight = 0; cumXR = 0; cumYR = 0; cumZR = 0; owner = System.ThisOwner(); // read through and use weight with matrix for new position for(i=1;i<=count;i++) { wNode = Node.Value(owner + "/w"+i,"constrainor"); weight = Node.Value(owner + "/w"+i,"pWeight"); if(count==1) weight = 1; //get world matrix of constrainor //save as bug //tmpMatrix = Node.Value(wNode,"WldMatrix"); tmpMatrix = Node.Value(Space.CurrentScene() + wNode,"WldMatrix"); //read translation values xval = tmpMatrix.GetTransX(); yval = tmpMatrix.GetTransY(); zval = tmpMatrix.GetTransZ(); cumX = cumX + xval*weight; cumY = cumY + yval*weight; cumZ = cumZ + zval*weight; //read rotation values xrval = tmpMatrix.GetRoll(); yrval = tmpMatrix.GetPitch(); zrval = tmpMatrix.GetYaw(); cumXR = cumXR + xrval*weight; cumYR = cumYR + yrval*weight; cumZR = cumZR + zrval*weight; cumWeight = cumWeight + weight; //System.Info("constrainor matrix calc"); } // maintain the constrainee position by adding offset values if(maintain) { xval = cumX/cumWeight; yval = cumY/cumWeight; zval = cumZ/cumWeight; xOff = origMatrix.GetTransX() - xval; yOff = origMatrix.GetTransY() - yval; zOff = origMatrix.GetTransZ() - zval; //store it Node.Value(owner ,"xOffset") = xOff; Node.Value(owner ,"yOffset") = yOff; Node.Value(owner ,"zOffset") = zOff; xOffset = xOff; yOffset = yOff; zOffset = zOff; //reset maintain offset - only for first calculation params.ConValue('maintain') = 0; } // divide by zero safety if(cumWeight==0) cumWeight = 1; //new calculated position xval = cumX/cumWeight + xOffset; yval = cumY/cumWeight + yOffset; zval = cumZ/cumWeight + zOffset; //new calculated rotations xrval = cumXR/cumWeight; yrval = cumYR/cumWeight; zrval = cumZR/cumWeight; //flags determine what gets applied as a change if(xFlag) origMatrix.SetTransX(xval); if(yFlag) origMatrix.SetTransY(yval); if(zFlag) origMatrix.SetTransZ(zval); if(xrFlag) origMatrix.SetRoll(xrval); if(yrFlag) origMatrix.SetPitch(yrval); if(zrFlag) origMatrix.SetYaw(zrval); //new calculation take parent into account //parent world matrix parentMat = Node.Value(Space.CurrentScene() + constrainee,"OwnerMatrix"); //parent inverse matrix parentMatInv = parentMat.Invert(); childMat = origMatrix;//new child world matrix //multiply by parent inverse to get local matrix childMat.Mult(parentMatInv); //set constrainee matrix Node.Value(Space.CurrentScene() + constrainee, "Matrix") = childMat; // set constrainee matrix //Node.Value(constrainee, "Matrix") = origMatrix; //System.Info("new xyz " + xval + ", " + yval + ", " + zval + ", "); } NScript Object Package/jScript language@?>$ &int count ƐuE$q>Math Package/Matrix Float DataorigMatrix `^02eE{|@vs]}@)Ό| boolean xFlag ~Wa5IH9 Qboolean yFlag uDjUbboolean zFlag PKEZآnumberxOffset9IFO) pnumberyOffset+ơ@;numberzOffset>u3kMC!"stringconstraineef z K4obooleanmaintain }IC?booleanxrFlag dPB>2LbooleanyrFlag ^4FIHbooleanzrFlag 3=Ku+'#booleanactive y&4@F9}ȿvs]}@)Ό|  ƐuE$q4W}@O{^4FIH~Wa5IH9 Q(XFҦV>g'JNjn*pnD?y&4@F9}ȿdPB>2L+ơ@;f z K4oJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>? 3=Ku+'#PKEZآ-1OSM n 럆L<_ї˂ControlOˁ CRih[ Cq 8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0 Cq:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho9IFO) p 5@(lD  Watch Dog Event8 2|=Bynjv8ffNzw̮8ffNzw̮Change detect.Change detection input8_ z@Hoq_ 4W}@O{%`}_ J@#QLph(XFҦVLE2Data, 1#0`_ -1OSM n"# asvHhTG asvHhTG$NodeIconNodeIcon eSBgc$2|=Bynj4W}@O{(XFҦV>g'JNjn*pF CCb@@P@? asvHhTGeSBgc|< !{xHP;<<x}XT9`1~ޘx{[b7j{oXb/REAT@AP`TD{y˙s55<9032]]e3g-HH4k W޾ ?oߊ^}[:t~[b͘ '7/d7hQ hGQ+$&rL2 Q'P`FƢmTs<S_^⊊t7P|WJMɨunF&w5w,l7ݏ#Q5> Q@2m9On#gh4W JZ$5T"*I5(URUJPt{¿,Pv/?Id"ʅ@PtQ+0z"-0e t6ч#WPh?9`޼aIxVD֭u0~YA`2͛wt9' AӁQ{'Svmҍ*95o{B(eʇBٞۃ1 c] dk=)T8 l~h F|^E}Xs#vpj(wD?Fd+;B`klV+Xk6yR٘j:ٌwcr(ߤt(ţ䁳(v6a59k.tۅa x&}4 b} f +og$9$H1ܺ͛;qv\4\83q,a.AX[a,ẍ́F ,wg0f Cߑ!PK.(=g1> EQaOu߆ W|#QE;*m G>W?Z5ń8x8 ^w")8${?Vz7pw3p{t內7A'H/N&Xp4N^Xi ǣ(V _e|Hxo)|wo" 4$d[E65nɫr t9$wIҐ;FheA$ېs97M/<ēkxtq_uS9>ĕGY 6:9[; ߍ_ׅ(ܡ'>\I((ލ)LoL[NPTK6Cm-ԪSp‘OHgzO .=w 疷 s)^Lz>ӕʽ w\](>0= SdЏ(Tr*Pvt Cɽ2 /]bQlj%|0~qٳ"7pg~pN'9Aǐ죧wC<GoN{M{1뫮¯\:{N [I,1a*icBQnޗbêC엮ױ)rP~Uk?լ'#|A0Jr$N {Ǔ?<ݽ/l?sٿW zu@҅'\;C׏O ,voGJ9ٗQ~ ŃDGծjk&1gPTYEs` HF!|@;u  /W>qkw6)w\5xYe6 Cὐx4ڴӭ|M-㖭EC~*y@ ~k7w$3>:l~[ؼƢ«q.e3h݉J(5t"ʐ >L),<<Umi<[kɟc/ 'uIu$/Ӌu S>`z2>hXj(b'Qocq_lhyj_F(R>. ͳq܈i8poys{g>yoÖSHOw:Rs:`; [xȫ ^ s(NZFیy(֡Jq~o˔pԹ5#6lޓbYؿ۹ƽZkkvϰߗvqx3~|!{ (g5")>0?Սy‹:q[\m3?3 N̮8dhiPj8Vy΂+&H o剺 @B(o`,cI5<|gr@ ` gk:VRʬ߆'߽YV4 Db*Uu ??|Nz30m^E:CfeA{Ⱦp8a1_Oo5Ɵsݳ^SUNeR|/Nυ>&U>9;LHrxluUbc3ݸszY`}`anՇBTX7m Sٝ/_^,c3˜I$yQRct:ҁl _#d}u,p_̾b1f cWtg7tLZ)Pco4.,xll}к=5dk6ad{n;8ZJ>qk4anui)$'0慯z26N^3k\_(UE)ەPB}f >`F~%E ,r6nXWp3{x3>ʀ7LH.:z%׊izŇ}<~[Xg<<|F6RiF`֡JGX99b@Jj]ѡtyp4l%پX#VOy8{5><)pzl]Or1<>!z@ԃ3@ rs? P>8 ?/Qr&96n[1|ͯ1!$KrZ8~J{Q#r뀎sz`#0^u@ZnW^}.]W Qj5!x{s9`ž0Թ|l-~rYH[Fkgkk,f9 r.u쨴Dz|$0p\~|:0@> }-+estY1} R7RB̏h &X9!;Y/2b`QaGwM&ʄ$# bvD>3+fke7X=:>Z&Lrb>00ϔ|97e8.c,DXf8Xx_^\u}ӝq,دjDAQb@m&O _w S4-zD¡xvS>w/R|5Bh Ov}C\c3tUz,}ygtb.ވDpߣmތozyx,<a,|ݩ%[vA̞q@y 1i){pgu|_E^yHʃe/[$wܕW =5Wt Y~II;Ba>gƹĀ|g aæY3PmJ+ךyK-4R}b_5 w/jZY}7xOMޖX^.ާ]>qh}@?~#1Ыօ_dylLuB5;ߓ7}Ȧ[oZ2ƫ>[lOek>i cGHMr<9:0KybXӅF:`R%H s& &dwyվ@~3"/ OÇ${!`S|]aMקF@[R$ĐPXK> GߨՄi 5~P2(omr<_WF{ *n?j8}lsƱw-zm_#]Ws=⟎ CS#+Uy8+rB;FJ;ɺ0G~IMkċ\'_k4'^CQlaTbr<_K'D韎hգ%\8<^̏y |.s/8]iƳNgqb])1>C]HGAy ,|g{W& O({~7=eb!ʯ؈~ûkdwټlAc8qg~9-?~ Oܑsd_'ھ#/bփ/倯?pj8m 1Pf[P~w,FShI`=~,q3iu?g>15S/}x=#yE5Ȗ:8]7j>@5`1b @ټ!vp:@nu'v'tùc͟ݡ!QSN'q?Y~uх9Oo5.1 !rtVe>,?ܒ%Lp@2n8`@#sfy逻aOy0=;0i,#ipFE{4o  -)!~^Ca6tt{xNsM{7?[mzIZւd_zSSYDx?in;r Qw95xfF"0ؿ^9'x^1h#?ress O [ b%zY\fo?{ ޗ"/ˋ!C[.B,èsP (ۢEALv6=hI.  =doK_էOg c 9#F~93p۳C͂ـ0A٠C|q} d|"];WR7[D/=;%1 z'sݫ~Xb??χ sq'&9iJ( qe1|5 8 ͯej)|ӿ =,p!iM_{Ntt W}9`?/~ zQ_g\yjU? G8BW PtWy}_ Ehu &Wa8yd9y|r/X,I:9gu\.H␻'yC3ܸ_h2k*T(|vRttͯnhDE:++eG`\bL:G~f =@la̸/z}]UʄPVtpC_c,~q=A2_g{/- d+oE8xKϒ|={0MG/K&{_b|'vN/f@GwWwksܓ En:aT}# /z:s8y::P<(*l 79V,VC;hp>5NDtf} >_uF>@= }=XwA. K_`< v[W= 7#m =b'~?yl}N{>@̧ kj>!;FoDKl؅»c?fYg E3 ϕ|αUكዧb=>x_@8L8To1G-_ٻ1rco˳A}t/콞(q(ttބF^3T^v=x= uA}]$,ϑz }K,0M"N/pkzg~~}_fPu:ZN†U8$`n?? 87Y.-OY7>WPZyƏh>}̯|b3nNkbFlFQgڙwDjcߔYv +gQ>H\pZ+l\\q8'̫/vov3e !HCiC,Ƚ\9Gq!~=U}epxoRZWK;0 j=A`qqit灲0ݫ$K=y"|Y?6H\Yfgx3>I%{vϰt+ؚNɻt%W~AL^W~ۋjF cU; t<1Yົ[y aP BN;]}:=F߿2sg]p~t>!6?:c!8Cev [8pD W&u #0>^w[ECqtG~Rm"`GWfK?c {/+}G`/~gz@VnݙH|c(+c·hOc[uḆw:(OX߄2 M݇lYu(_x&&P9wQ |z!'@wPtJ! ڲaɍȼgW)yE]uOW2w؀˙v3l4GQӀW_+w8e9{GR:Mʼn4/ܡi ٝ Q\Jؾo矾 OO2Y|q=c(E>o5-uyw,~&'W(=g(t`IV,20ԑϞP:.An(LKO8̺0j,FۏI7Q]T<1=NǶ#/ӽp֞*׏<|j8=qy̍yXd!U t57PmoQ[vmt\ .wu|ǜ~Z.WlWCny⻰ nwfA ",6f] P(9CZ_hrTAitP=/ԃّghy,1BI<d@ ]v[ P~ ˏ(֪ ?fzt ܏'/xA>p;,c᜴ v$^+<&?G8#5 G̍Hꏸ;zvpNŜ̫B̓Ot1'sÈ%o/פ7>w}>,&Y *Uesg9:`8-(YgL>el@*(PQė㗯Ex8'HGGvocpIمiC!f\[cujZp}z \/!n$"$"WR.fi 9N؟@='YH,ʴ9 ͻeCaό-1oz~=$^E>+v^+9(,2bۡws5+QR:fY3l/zEšj|~,<*{b5< vDV[^x_܋Cr9Wv":#3'$3k!!8B"8 _ú[W0:=raN%)zƁIOy7fͱG+0*pe/EY .>:]m;g{KRP|o(6識2(]h=w3{~- MATT>P<GT#)?d|/W4 B0qz ]?&fGοs8;gyz<+:; fSQ2mP~q9>@M{2JZ$@ut80(wAGG(=wW4gZ%cY׬ðj Go􋉀El FcTnELZGUjZɫVbrLf_&,׳އBvDf΅<̹2{~&P:ɇP{ (Ln>ǝ||?WNPUjePw&jP[Mx(ڽA0{",Auhn]ax.HJ:%*nN߂aF>q;'{Gw|9PgxρfSx5 >Pk+$--+p9߄5KdX.7r#03vf`y6M{#n/qg];ioAi:l~8Ԇ JnP-$ͭv=8;Io+=>MbH6OÔGl~꠭b;۩m,M!'R'웏"Gp4EݠTi5Z?1sY /Wlo^cpBxtc)2tAFw[Bn:̅t`à4PFZF&_w][.gև)_^`GbK"sgvʸP(W)+lk*Xߕao'x &}|՛l+ԪmQRsL:.Ŝyr^4J.U.H eqzemgk:*a +ZJ|Qhyץ \xxG=2<_{#ys~{Jy6LSݫP^bl.2:Uۣб ͻ.X: p^߽# {;Gg#L{^*s'_Avx^yFrFC3_+Pr}t3k }y~y,P~|>{o?@ Oٽt$j!ud5o7a/_/ (g:<ݦa uE1Av(S {uDݞk:^'{jdƓ'Q~ǰgu Pj@<+*j f|]Ms|}*qϱ2Jui> {oyn/!P*Ǿ+@f \mO>;^{KgqZ= p ۹+{:,W[ܞVg>a?8^QkuZ#*}Fb"n'Wݒ=L.ݟ|f<o|jP:C^^m;QQ[^%Y]G#;ZZtws}P[~0{^keMo'r{ľhNuڣtz$=lQގ^=|uyg矢xgsU^\O-'jzr'rq<rq|*ImI&YD14Y}^^Qٽ2.gqy~.gaثH& _E~;Pi+L2w6bn m3e'u}+SOu]pWX=c-g\o0c5=ۋnyyW =}Nn&_s\ﱜV,SX꺓Ϗ%^+}]/qxϓ8PoеOQ&]JG1{sSy} y~~T96PȅBU޿{8Z-׬r[Tn#M5:*Rnk]yAð#{9b.mٌu&Zg yS Tnmz`Xo*ibvj<f؟&Y}':b*(lVsNi68prkZ;y-ǂޝ)+ ^^_=>a;K>_bJ;x=W{n ެj|UKw^@XV{xw?{ {{0ݫ=a/빬7&ox^QӡX_j+c'oLeh`,ϟ'汘oV՛kL ,8fu{E=Ǟf3Ay-W=Qj[Ti jyoJ7*%Dg%:[Di(f-FD(xJo@3/J@#QL>g'JNjn*pFBB`@P@?8ffNzw̮-1OSM n 럆L<_їActivity GFʠN=1 }}8ffNzw̮Z`Ez]UO GFʠN= = }} Control Out2|=BynjZ`Ez]UOz@Ho܂dKu= w .;]kI 忞@#d" B #4W}@O{%`< (XFҦV"A-1OSM n"0;lJˋP;lJˋPDtheNode\x  $FEW2t`$FEW2t`Dconstrainor\и 8ffNzw̮H9814Cx-R|14Cx-R|DpWeight\ 14Cx-R|?4W}@O{(XFҦV>g'JNjn*pFpDb@@T@CB?;lJˋP8ffNzw̮?.;]kI 忞@-1OSM n 럆L<_їDefault GFʠN=F@1 }}$FEW2t`Z`Ez]UO1釥GP>aH`@<$FEW2t`Z`Ez]UO GFʠN=P @1 }}4KUH,5'aPZ`Ez]UO1釥GP>aP @<F4KUH,5'aPZ`Ez]UO$FEW2t` 5@(l&  Watch Dog EventPF 2|=BynjI H98ffNzw̮I z@Hod" 4W}@O{%  J@#QLp(XFҦVLE2Data, 1# -1OSM n"= asvHhTG$2|=Bynj4W}@O{(XFҦV>g'JNjn*pFbCCb@@P@? asvHhTGeSBgc8 !{xHP;J@#QL>g'JNjn*pFBB`@P@?8ffNzw̮?-1OSM n 럆L<_їActivity GFʠN=1 }}8ffNzw̮Z`Ez]UO GFʠN= = }} Control Out2|=BynjZ`Ez]UOz@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommandl// Execute // Called to execute the command function Execute(params) { var constrainor = params.ConValue('constrainor'); var pWeight = params.ConValue('pWeight'); var theNode = params.ConValue('theNode'); // TODO: put your action code here Activity.Run(Space.CurrentScene() + theNode); } NScript Object Package/jScript language4stringconstrainor$FEW2t`numberpWeight14Cx-R|stringtheNode;lJˋP4W}@O{(XFҦV>g'JNjn*pn)DBb@@X@2|=Bynj|?z@Hoۙ>?;lJˋPJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї˛DefaultControl Oˁ CRih[ Cq 8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0 Cq:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=P#1 }}z@HoZ`Ez]UO1釥GP>aP#<Fz@HoZ`Ez]UO GFʠN=F #1 }}z7fI! /Z`Ez]UO1釥GP>aHX #<z7fI! /Z`Ez]UO GFʠN= F0#1 }}$FEW2t`Z`Ez]UO1釥GP>aH X0#<$FEW2t`Z`Ez]UO GFʠN=0P@#1 }}4KUH,5'aPZ`Ez]UO1釥GP>aP0@#<F4KUH,5'aPZ`Ez]UO GFʠN=@PP#1 }}2|=BynjZ`Ez]UO1釥GP>aP@P#<F2|=BynjZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho$FEW2t`܂dKu=,d "sendMatrixChange .;]kI 忞@#' 4W}@O{%`0 (XFҦV"4W}@O{(XFҦV>g'JNjn*pFDqCX@1@?.;]kI 忞@48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand// Execute // Called to execute the command function Execute(params) { var theNode = params.ConValue('theNode'); // TODO: put your action code here //RsApp.SendCustomEvent(theNode,1); Activity.Run(Space.CurrentScene() + theNode); } NScript Object Package/jScript language䧌stringtheNode."O؈4W}@O{."O؈(XFҦV>g'JNjn*pn@NDCu@@P@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їDefaultControlOˁ CRih[ Cq 8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0 Cq:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=Pr1 }}z@HoZ`Ez]UO1釥GP>aPr<Fz@HoZ`Ez]UO GFʠN=F r1 }}."O؈Z`Ez]UO1釥GP>aHP r<."O؈Z`Ez]UO GFʠN= P0r1 }}2|=BynjZ`Ez]UO1釥GP>aP 0r<F2|=BynjZ`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@ VNewCommand// unDoIt - Constraints // // February 14 2008 // // by Clinton Reese // // purpose: remove all constraints on the constrainee // select constrainee and run // // March 2 2008 // not cleaning up properly // //// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here //check for only 1 objects selected sel = Node.Selection(); //list of selected nodes numsel = Node.SelectionLength(sel); // number of selected nodes if(numsel != 1) { //Node.Value("Status Line","Model") = "please select a constrainee"; return; } constrainee = Node.SelectionGetAt(sel, 0); //if constraint not exist return if(!Node.Exists(constrainee + "/Constraint")) return; //get weight count from constrainee ecount = Node.SubObjectCount(constrainee + "/Constraint") - 1;//minus one for dataCalc node //for each weight delete the corresponding constrainor sendIt# checkValue = constrainee + "/Constraint/dataCalc"; for(i=1;i<=ecount;i++) { //get the constrainor path from the constrainee weight node //constrainor = Node.Value(constrainee + "/Constraint/w"+i,"constrainor"); constrainor = Space.CurrentScene() + Node.Value(constrainee + "/Constraint/w"+i,"constrainor"); //sendMatrixChange contains a trigger(sendIt) for each constraint ocount = Node.SubObjectCount(constrainor + "/sendMatrixChange"); for(j=0;j<ocount;j++) { //read node and check agains checkValue, if match delete it //theNode = Node.Value(constrainor + "/sendMatrixChange/sendIt"+j,"theNode"); theNode = Space.CurrentScene() + Node.Value(constrainor + "/sendMatrixChange/sendIt"+j,"theNode"); if(theNode==checkValue) Node.Delete(constrainor + "/sendMatrixChange/sendIt"+j); } //check for empty sendMatrixChange, if so delete it and the watch dog ocount = Node.SubObjectCount(constrainor + "/sendMatrixChange"); if(ocount==0) { Node.Delete(constrainor + "/sendMatrixChange"); Node.Delete(constrainor + "/Watch Dog Event"); } } //delete the constraint Node.Delete(constrainee + "/Constraint"); } NScript Object Package/jScript language~൱D#^c4W}@O{(XFҦV>g'JNjn*pnCB`@@P@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї˂ControlOˁ CRih[ Cq 8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0 Cq: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 sel = Node.Selection(); params.ConValue("mySelect") = Node.SelectionGetAt(sel, 0); } NScript Object Package/jScript language;stringmySelect:bK`94W}@O{:bK`96/Project/Space 3D, 12/Cone(XFҦV>g'JNjn*pnD`At@@P@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їControlOˁ CRih[ Cq 8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0 Cq:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=P1 }}z@HoZ`Ez]UO1釥GP>aP<Fz@HoZ`Ez]UO GFʠN=P 1 }}2|=BynjZ`Ez]UO1釥GP>aP <F2|=BynjZ`Ez]UO GFʠN= F01 }}:bK`9Z`Ez]UO1釥GP>aH @0<:bK`9Z`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 sel = Node.Selection(); params.ConValue("mySelect") = Node.SelectionGetAt(sel, 0); } NScript Object Package/jScript language;stringmySelect:bK`94W}@O{:bK`96/Project/Space 3D, 12/Cube(XFҦV>g'JNjn*pnDCs@@P@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їDefaultControlOˁ CRih[ Cq 8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0 Cq:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=Pp1 }}z@HoZ`Ez]UO1釥GP>aPp<Fz@HoZ`Ez]UO GFʠN=P p1 }}2|=BynjZ`Ez]UO1釥GP>aP p<F2|=BynjZ`Ez]UO GFʠN= F0p1 }}:bK`9Z`Ez]UO1釥GP>aH 80p<:bK`9Z`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@ 7NewCommand3// doIt - Constraints v1.1 // // February 14 2008 // // by Clinton Reese // // use: makes the first selected object(constrainee) follow the rotations and position of the second selected object(constrainor) // flags determine which axis are active for rotation and position // this script sets up the relationship // // // February 28 2008 v1.1, fix save as bug // Execute // Called to execute the command function Execute(params) { var maintain = params.ConValue('maintain'); var xFlag = params.ConValue('xFlag'); var yFlag = params.ConValue('yFlag'); var zFlag = params.ConValue('zFlag'); var xrFlag = params.ConValue('xrFlag'); var yrFlag = params.ConValue('yrFlag'); var zrFlag = params.ConValue('zrFlag'); var preStore = params.ConValue('preStore'); owner = System.ThisOwner(); //use pres stored selection if(preStore) { constrainor = Node.Value(owner + "/preStoreConstrainor","mySelect"); constrainee = Node.Value(owner + "/preStoreConstrainee","mySelect"); //return if not a valid selection if(!Node.Exists(constrainor)) return; if(!Node.Exists(constrainee)) return; } else { //check for only 2 objects selected sel = Node.Selection(); //list of selected nodes numsel = Node.SelectionLength(sel); // number of selected nodes if(numsel != 2) { //Node.Value("Status Line","Model") = "please select a constrainor and constrainee"; return; } constrainor = Node.SelectionGetAt(sel, 1);//controller constrainee = Node.SelectionGetAt(sel, 0);//controlled object } // strip away "/Project/scene name" otherwise fails when new scene //constrainor indx = constrainee.indexOf("/",1); msg1 = constrainee.slice(indx); indx = msg1.indexOf("/",1); neeSave = msg1.slice(indx); //constrainee indx = constrainor.indexOf("/",1); msg1 = constrainor.slice(indx); indx = msg1.indexOf("/",1); norSave = msg1.slice(indx); //if constraint not already inside constrainee then add constraint node if(!Node.Exists(constrainee + "/Constraint")) Node.Copy(owner + "/Constraint",constrainee); //get weight count from constrainee and update //count = Node.Value(owner + "/pointConstraint/dataCalc","count"); count = Node.Value(constrainee + "/Constraint/dataCalc","count"); count++; Node.Value(constrainee + "/Constraint/dataCalc","count") = count; //save the constrainee path in the data calculation node //fix save as bug //Node.Value(constrainee + "/Constraint/dataCalc","constrainee") = constrainee; Node.Value(constrainee + "/Constraint/dataCalc","constrainee") = neeSave; //copy weight node into constrainee and rename it temp = Node.Copy(owner + "/w",constrainee +"/Constraint"); temp2 = Node.Rename(temp,"w"+count); //save constrainor name in weight node //fix save as bug //Node.Value(temp2,"constrainor") = constrainor; Node.Value(temp2,"constrainor") = norSave; //save pointer to pointConstraint code //fix save as bug //Node.Value(temp2,"theNode") = constrainee + "/Constraint/dataCalc"; Node.Value(temp2,"theNode") = neeSave + "/Constraint/dataCalc"; //copy event signal node to the constrainor //create framework if it does not yet exist if(!Node.Exists(constrainor + "/Watch Dog Event")) { temp3 = Node.Copy(owner + "/sendMatrixChange", constrainor); temp4 = Node.Copy(owner + "/Watch Dog Event", constrainor); Node.ConnectTo(constrainor + "/Transform", "WldMatrix", constrainor + "/Watch Dog Event", "Change detect"); } //get number of sendIt nodes - each sendIt node runs the data calculation inside the constrainee when the constrainor matrix changes //an object can be the constrainor for more than one constrainee numNodes = Node.SubObjectCount(constrainor + "/sendMatrixChange"); if (numNodes==0) { Node.Copy(owner + "/sendIt",constrainor + "/sendMatrixChange"); Node.Rename(constrainor + "/sendMatrixChange/sendIt","sendIt0"); Node.ExportConnector(constrainor + "/sendMatrixChange/sendIt0", " Control In", "", 1, 1); Node.ConnectTo(constrainor + "/Watch Dog Event", " Control Out", constrainor + "/sendMatrixChange", " Control In");//note space in control names //fix save as bug //Node.Value(constrainor + "/sendMatrixChange/sendIt0","theNode") = constrainee + "/Constraint/dataCalc"; Node.Value(constrainor + "/sendMatrixChange/sendIt0","theNode") = neeSave + "/Constraint/dataCalc"; } else { //loop to get new name for sendIt node - sendIt0, sendIt1... i = 0; while(Node.Exists(constrainor + "/sendMatrixChange/sendIt" + i)) { i++; } //copy sendIt and rename it Node.Copy(owner + "/sendIt",constrainor + "/sendMatrixChange"); Node.Rename(constrainor + "/sendMatrixChange/sendIt","sendIt"+i); //note that the order of control connections is important //connect watch dog event to the sendIt Node.ConnectTo(constrainor + "/sendMatrixChange", " Control In", constrainor + "/sendMatrixChange/sendIt"+i, " Control In"); Node.ConnectTo(constrainor + "/Watch Dog Event", " Control Out", constrainor + "/sendMatrixChange", " Control In"+", "+i);//note space in control names //fix save as bug //Node.Value(constrainor + "/sendMatrixChange/sendIt"+i,"theNode") = constrainee + "/Constraint/dataCalc"; Node.Value(constrainor + "/sendMatrixChange/sendIt"+i,"theNode") = neeSave + "/Constraint/dataCalc"; } //connect weight to the outside //pWeight is parent constraint weight(terminology from Maya) Node.ExportConnector(temp2, "pWeight", "", 1, 1); //change by count here - each new weight has a new name if(count==1) Node.ExportConnector(constrainee +"/Constraint", "pWeight", "", 1, 1); else { tempcount = count-1; Node.ExportConnector(constrainee +"/Constraint", "pWeight, "+tempcount, "", 1, 1); } //connect constranee world matrix to constraint node Node.ConnectTo(constrainee + "/Transform", "WldMatrix", constrainee + "/Constraint", "origMatrix"); //copy flags to datacalc node Node.Value(constrainee + "/Constraint/dataCalc","xFlag") = xFlag; Node.Value(constrainee + "/Constraint/dataCalc","yFlag") = yFlag; Node.Value(constrainee + "/Constraint/dataCalc","zFlag") = zFlag; Node.Value(constrainee + "/Constraint/dataCalc","maintain") = maintain; Node.Value(constrainee + "/Constraint/dataCalc","xrFlag") = xrFlag; Node.Value(constrainee + "/Constraint/dataCalc","yrFlag") = yrFlag; Node.Value(constrainee + "/Constraint/dataCalc","zrFlag") = zrFlag; //run initial calculation of constraint Activity.Run(constrainee + "/Constraint/dataCalc"); } NScript Object Package/jScript languagebooleanmaintain ΁lvJLٵE!boolean xFlag {vR.A&]}Gboolean yFlag ֙eJK~,j^i%boolean zFlag :@$^sbooleanxrFlag B RE#0إD|booleanyrFlag #@` booleanzrFlag SvKm_ú'booleanpreStore vwu(@g$5;h4W}@O{:@$^s ֙eJK~,j^i% (XFҦV>g'JNjn*pnBlBb@ f@2|=Bynj|?z@Hoۙ>?SvKm_ú'  ΁lvJLٵE! {vR.A&]}G J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?B RE#0إD| -1OSM n 럆L<_ї˂ControlOˁ CRih[ Cq 8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0 Cq:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOvwu(@g$5;h MT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho8ʯȥJH|o7 gH]kDwP@~`d8pM*#ͺOY~2/tfѭ8Lwb"q*vB