BLENDER_v227REND 1SRd,VLLSRDisplacemapythoncr<RxLxL Ba4`LDDATA<RMRDATARMR<RDATARMRRDATARMPNRDATAPNMPNRDATAPNM$QNPNDATA$QNMlQNPNDATAlQNMQN$QNDATAQNM$NlQNDATA$NMLTQNDATALTMT$NdDATATMTLTdDATATMTTDATATMTTDATATMtTTDATAtTMyLTDATAyLMlyLtT|DATAlyLM$yLyL|DATA$yLMxLlyLTDATAxLM$yLTDATAxLNLxLRRDATALxLNLxL<RRDATALNԊLLxLPN<RDATAԊLNNLPNRDATANNDNԊLPNPNDATADNNlNN$QNRDATAlNNNDNlQNRDATANNNlN$QNlQNDATANNNPN$QNDATAN4NPNQNDATA4N|PNQNDATA|N4$QN$NDATAN |lQN$NDATA NTQN$NDATATNTO LTTDATATONOTLTTDATAONOTOTTDATAON,OOTTDATA,ONtOOTLTDATAtONO,OtTTDATAON HRtOtTTDATA HRNTHROyLTDATATHRNHR HRyL$NDATAHRNDLTHRlyLlQNDATADLNLHRlyLTDATALNLDLlyLyLDATALNLL$yLQNDATALNBaL$yLTDATABaNTBaLxLtTDATATBaN BaBaxLPNDATA BaNTBaxL$yLDATA4`OV<RPNPNRĶVTSDATAĶVCTS DdC&hxDjTC(BDC?z?DATADTSEĶV /9DATAVOV4`$QNRRlQNDATAVOVVQN$yLxLPN1=”=o?Q/0Q *"|VSDATAh|VI $ tW =DATA>|V$ ????????1=”=o?"AMuA??"A 7T B?=C11 DATABV$ zC AzC A #< #<`jFzD OBDATAVCS$ DdCDv@CC(BDC?z?DATADSEV$ LOAD TEXT FILEC:\testTGA\\Blender Anims\truedisp10-07-2003.py DATAVOĽVVPN$QN$NQN˛=/b=o?/0tS$LDATAtS>V ????????˛=/b=o?SRAU KA??SRA 7T B?=Ci\i\ DATAVBܼVtS zC AzC A #< #<`jFzD OBDATAܼVC$LV DdCDv@CC(BDC?z?DATAD$LEܼV !SAVE FILENTC:\testTGA\\lender Anims\untitled.blendDATAĽVOB A@CC #<@DATAh4FXISS  lFX4FX ????????1=”=o?"AMuA??"A 7T B?=C11 DATAFXBGXS zC AzC A #< #<`jFzD OBDATADGXEL,FX LOAD TEXT FILEC:\testTGA\\Blender Anims\truedisp10-07-2003.py DATAL,JGX SELECT IMAGE &&&&(6&6&I,z1.tga\testTGA\z1.tga\testTGA\^0BDATAd;_?,/?DATADLFKX KX< AAGGBA>B A@CC #<@DATAhKXITDL <  l|LXKX< ????????1=”=o?"AMuA??"A 7T B?=C11 DATA|LXBtMXT< zC AzC A #< #<`jFzD OBDATADtMXE T|LX< LOAD TEXT FILEC:\testTGA\\Blender Anims\truedisp10-07-2003.py DATA TJtMX < SELECT IMAGE &&&&(6&6&I,z1.tga\testTGA\z1.tga\testTGA\_0BDATANXOHL>DATADL>FL4DL$ ????????1=”=o?"AMuA??"A 7T B?=C11 DATAFLB|GLDL$ zC AzC A #< #<`jFzD OBDATAD|GLEFL$ LOAD TEXT FILEC:\testTGA\\Blender Anims\truedisp10-07-2003.py DATAHLOLNXyL$NlQNlyL1=”=o?*UILLTDATAILCJL+ DdCx1B D.8ACCC(BDC?z?DATAJLGKLIL+ CC̽̌?o>d;_?,/?DATAKLFdLLJL+ AAGGBA>B A@CC #<@VVDATA,V]OB`A 7TDATAhdLLILLKL +  lNLdLL+ ????????1=”=o?"AMuA??"A 7T B?=C11 DATANLB LLL+ zC AzC A #< #<`jFzD OBDATAD LELTNL+ LOAD TEXT FILEC:\testTGA\\Blender Anims\truedisp10-07-2003.py DATALTJ L + SELECT IMAGE &&&&(6&6&I,z1.tga\testTGA\z1.tga\testTGA\_0BDATALOHL$yLTtTxL1=”=o?WWkl*vWlLLDATAlLCTL6 DdC@:C eD]H4XCC(BDC?z?DATAhTLILlL 6 tW  =#%vDATAL>LTL6 ????????1=”=o?"AMuA??"A 7T B?=C11 DATALBLL6 zC AzC A #< #<`jFzD OBDATADLEL6 LOAD TEXT FILEC:\testTGA\\Blender Anims\truedisp10-07-2003.py SRdLL,VSRmaincreenAaSS_SLLD;DATAAaM|AaDATA|AaM4AaAaDATA4AaMS|AaDATASMS4AaDATASM\SSDATA\SMSSDATASMS\SDATASMSDATASN~L4Aa|AaDATA~LN\~LSSAaDATA\~LN~L~LSAaDATA~LN}L\~L\SSDATA}LN}L~L\SSDATA}LNlV}LS|AaDATAlVN _S}LS4AaDATA _SNT_SlVSSDATAT_SN_S _SS\SDATA_SNT_SSSDATALOLAaS\SSL|L DATALC|LLDdCUmB+DpM B-CC(BDC?z? 4YDATAD|LELL/9DATALOLLS|Aa4AaS)ZMDATALOLSSS\SUE=*D>o? L|L..DATAL>|LL@q&" eLz?ߧ>/m?H=>7Yq?Qqeߧ."LF/m? z?+=>z<@V??.z\$9q~g*v:6>ޘ'p (<? m _TԿgt[@FBРz<@V??8[̽?_?\C? m*A 7T B? #<Cz?>DATAD|LELLSAVE FILENTC:\Documents and Settings\sgoda\Desktop\untitled.blend.ttfSCD<SC1 7TUOLLLt4~@D8@lLdd??< da =fff?=fff?_@??////render///#DATAOL8L5$MDATAL8LLOL3MDATALL8LLLLDATAL8LLLtLDATAL8TLLLDATATL8LLԵMDATAL8LTL8MDATAL8\LLe9TDATA\L8LL `$MDATAL8 L\L 5MDATA L8dLL 5 MDATAdL8L L R MDATAL8LdL OLDATAL8L 7TDATA(lL7,d'=A@OB 7T59TOBCamera \Mc̼ =:@??????w?wc̼ =:@??????w?w/?dA?)d??>)d????OB9T5L 7TOBCylinderMTS8L@z@????????TS8L@z@?????DdA? #=?>=@???OBL5L9TOBCylinder.001$M+?L@z@????????+?L@z@?????DdA? #=?>=@???OBL5tLLOBCylinder.002Mz3n>???uEX>ʹ???x.B}?eai,=>}?z3n>?????DdA? #=?>=@???OBtL5LLLOBCylinder.003MJ?Бt&???[v)O???qF>Y x̢m?IGm?> >J?Бt&?????DdA? #=?>=?@???OBLL5$MtLOBCylinder.004MJ?"t&???[v)O???qF>Y x̢m?IGm?> >J?"t&?????DdA? #=?>=?@???OB$M5MLLOBCylinder.005Mѿ?8!???[v)O?!@??˴EWk>x^>BnIGg5n >ѿ?8!?????DdA? #=?>=?@???OBM5M$MOBCylinder.006MѿB@4)???[v)O?!@??˴EWk>x^>BnIGg5n >ѿB@4)?????DdA? #=?>=?@???OBM5 MMOBSphere4YZc̼|D@:@????????c̼|D@:@?????DdA? #=?>= @???DATAZOB M5 MMOBSphere.001MMc̼|D@:@????????c̼|D@:@?????DdA? #=?>= @???DATAMOB M5$M MOBSphere.002P> @⡁@????????> @⡁@?????DdA? #=?>=@???OB$M5M MOBSphere.0034 P @⡁@???????? @⡁@?????DdA? #=?>=@???OBM5ԵM$MOBMeshMG>A:???E? A:?????DdA? #=?>=?@???OBԵM5MOBSphere.004ԎP>(=Q @S???????.;?.;3 '??.;3.;>(=Q @S?????DdA? #=?>=?@???MEM2$MMECylinder`LMM98%;L?I?ܨ>jN?DATAtM/9˜>R9lA@>FB>q>*\q>nk>A@>/ ~x¦>;ќ/.9>l>ɫ;\͹bhFHĢ::4*ikɫ;UFbhkʭ;Dc/tk>]F:& :/ ? Lٳ+4sl> >FL?4P>Ȍ>_Ym>=K96Ć:K ҩR*72;՘LK|>5Bi?T`5ip??j];=#oTL2;o?^_]U0`qn>n?I?7;*=Fܧ>?i?Pm>,?y mq wj:?@w|j,?XRsg࿦f?OΜE;O?p; q>?&ΜԿ<>?~5ɿ p>L}?[!w]+Bſ;72?0qvɿfgO}?!WP]/;տE?<5&;@;?~R be ?UYXL;ޘ?~< hEr> ?TXF>>;?=u#vs>r?*2鮞"3)5Q;?dHr#o0dq?2PCbܤr?W]ģIXݤr?VbJ43>`{?ڃ#q&ߕs>p?պ PJs E;qT?Az\&dp?JZNPJa5H]{?U$|#'Iܻ> ao=qH4 >?YZ%H<<>H?_pH_Ц<>6YZQ&I8<> =~I X<>dLAf(JBI>eMADATALM*8@@@@@@@@             @ @     @ @         !(  "! #"$#%$ &% '&(''()*@&'*+@ %&+, $%,- #$-.@ "#./@ !"/0 (!0) )018 0/21 /.32.-43-,54 ,+65 +*76@*)87@ME$M2MMMECylinder.001t`  dMMA@?%;L?I?ܨ>jN?DATAM/A˜R9lA@>lBq>*Z qnk>A@>/E~;x¦>;/cB.>9>l>ɫ;\3FFH>Ģ::4(>*ikɫ;諹k;ʭ;DpBt>k>K4:>& :/ ? 'L+4s>l> >M]4L?>4P>Ȍ>M?Ym>=KcU 6?Ć:KG2Ȍ> mMҩR;*72;՘?|>?5Bi?t`?5ip??'=#o?TL2;o?^_G0`?qn>n?I?]&*=?Fܧ>?i?PDt?m>,?yQuGmq ?wj:?^|?j,?uGsg?f?2c?E;O?px;? q>?O2c?<>?~? p>L}?[!PH+B?;72?0$?fgO}?!H/;?E?<&@;@;?t2R @ be ?U3i@L;ޘ?z< @hEr> ?Yi@F>>;?=~2#@vs>r?*2QbU"3)@5Q;?dH5i#@o0dq?24bUC@bܤr?WJ ģI@Xݤr?V]J J4@3>`{?&|q&@ߕs>p?պMs @E;qT?&@dp?Ja5@H]{?U܃'I@ܻ> qH@4 >5%H@<<>HpH@_Ц<>6j?Q&I@8<> ro~I@ X<>dMf(J@B_JI@>eⲿI@:[?xW*@T<`X[?x=*7@<[?x1W* @<[?xm*N#@?=><=;<:;9:MEM2M$MMECylinder.002`jN?DATAtM/9˜>R9lA@>FB>q>*\q>nk>A@>/ ~x¦>;ќ/.9>l>ɫ;\͹bhFHĢ::4*ikɫ;UFbhkʭ;Dc/tk>]F:& :/ ? Lٳ+4sl> >FL?4P>Ȍ>_Ym>=K96Ć:K ҩR*72;՘LK|>5Bi?T`5ip??j];=#oTL2;o?^_]U0`qn>n?I?7;*=Fܧ>?i?Pm>,?y mq wj:?@w|j,?XRsg࿦f?OΜE;O?p; q>?&ΜԿ<>?~5ɿ p>L}?[!w]+Bſ;72?0qvɿfgO}?!WP]/;տE?<5&;@;?~R be ?UYXL;ޘ?~< hEr> ?TXF>>;?=u#vs>r?*2鮞"3)5Q;?dHr#o0dq?2PCbܤr?W]ģIXݤr?VbJ43>`{?ڃ#q&ߕs>p?պ PJs E;qT?Az\&dp?JZNPJa5H]{?U$|#'Iܻ> ao=qH4 >?YZ%H<<>H?_pH_Ц<>6YZQ&I8<> =~I X<>dLAf(JBI>eMADATAm]w?\@!%F2/?.@=NZ?@wD(r 8?@fs90 ڠ?=@,K{71?:@RXl4:?g@ɭZw[(?@VQUn?@(@\yj 7?b@<-)*Zl?O@<{fDATAX M*2      @  @  @  $ & F F F  & (            ! "!@#"@$#@%$&%'&@('@(@) F) !B)!"@)"#@)#$@)$%D)%&F)&'F)'(F()CMEM2MMMECylinder.004`l%Ll%LM~T*2/w<0@1C??Q?DATAH~T/*s9'@Q.(E=c@m]w?\@!%F2/?.@=NZ?@wD(r 8?@fs90 ڠ?=@,K{71?:@RXl4:?g@ɭZw[(?@VQUn?@(@\yj 7?b@<-)*Zl?O@<{fDATAXM*2      @  @  @  $ & F F F  & (            ! "!@#"@$#@%$&%'&@('@(@) F) !B)!"@)"#@)#$@)$%D)%&F)&'F)'(F()CMEM2MMMECylinder.006`%L%L MT*2+>@A,@8?p?DATAHT/*s9'@Q.M&Gb@@=@4G6d}`@Y03^@+bfU"@#hzݐ`5ռ@@_ùINh)'@NgsP4S@;t3b`@r6p{Y@J*f[@PLCU΍yԈ@363:D@Cx*3Qu+@);Dq2 @C7E:ip @UGu^l@C@9tLE$@͊q *DEr3@v9?@2OL`c! s?A@L,a=mAW?v@1oy.]sO;?;@s%Kz?@́mO?S`@q^ܷa2I?@5xLf샄_e?St@r>밤d?@96$z8B?7@"@FB;X@ @8(@Zgx 'h@@XҐai@@a]4;[@|@sp%a @@|‚*1@5͎@#χڲ=@@<ˎ@X@HT/l@_y@0/z#t'@ߢ@ռgK|% @z@v|DATAX M*2      @  @  @  $ & F F F  & (            ! "! #"@$#@%$&%'&@('@(@) D) !F)!"F)"#F)#$F)$%F)%&B)&'@)'(@()@MEM2MMMECylinder.007d`<&L<&L$MT*2+>@A,@8?p?DATAHT/*s9'@Q.M&Gb@@=@4G6d}`@Y03^@+bfU"@#hzݐ`5ռ@@_ùINh)'@NgsP4S@;t3b`@r6p{Y@J*f[@PLCU΍yԈ@363:D@Cx*3Qu+@);Dq2 @C7E:ip @UGu^l@C@9tLE$@͊q *DEr3@v9?@2OL`c! s?A@L,a=mAW?v@1oy.]sO;?;@s%Kz?@́mO?S`@q^ܷa2I?@5xLf샄_e?St@r>밤d?@96$z8B?7@"@FB;X@ @8(@Zgx 'h@@XҐai@@a]4;[@|@sp%a @@|‚*1@5͎@#χڲ=@@<ˎ@X@HT/l@_y@0/z#t'@ߢ@ռgK|% @z@v|DATAX$M*2      @  @  @  $ & F F F  & (            ! "! #"@$#@%$&%'&@('@(@) D) !F)!"F)"#F)#$F)$%F)%&B)&'@)'(@()@MEM2MMMEMesh.001tgM???MEM2PMMESphere4nMĿĿM$`Pt?7?u?(@.?DATANDATA%$`P/;?߄?6t^?^?c]W߄?;?w..?Mγ߄?;w^?^c]y;?߄6???&?&.u?.u?^ B ByR,?T,?;Ki]#g^?^?^-ZZR,?T,?;?2T2T..u?.u?^? B BW??߄??&?&trH;?߄?V5Jr7Xb?^?EJ߄?;?.o+.?^-ujJ{5T@;&]".^?^%eY7uH;?G5+[2[.Awi:4;߄?Dr4^^?%S4߄⿎;?.+G5.^-04߄⿑;.24^^%7wi:4;ʼ??&.u?.u^ ByV,?P,;2TΫ^?^^-ZV,?P,;?2TΫ..u?.u^? BW?߄??&t.?~>>뿨wT, ?>߄0>2۳w^V#ݨE?ǿGa?a?F@K@KX?T, ?;\n-?FljŦ?Ŧ?j`FF?^-?@v0?}Ŧ?Ŧ?>XXX?T, ?;?\n--?>}a?a?E?@K@KG?.>^?V##W?E?ljGS, ?>߄?0tE??Glj>?}>?}>T, ?߄?0trH>?O  }9&??^?[}I. m??kEgQ, ?X?;?-\n-o"?E?)d1C^-?F?^-(Ӊ_U9H:@>'_XKQ, ?XC@;"TIT/?8 B}.>?^#Vݨo"?F)dļ>V, ?0xiF?ǿLEJ >O wi3?O  }ዊ4E?g4ǿE?)a,0"V4뿔,04ǿF)aļዊ4FǿJѾO >뿨Xw >T,  ^#cݨa?aF@KY, ?X;-Ŧ?ŦX<^-?Fѿ^-0Ŧ?Ŧ>X<Y, ?X;?--a?aE?@KG.> ^?#c#WR, ߄?t>?X}T, ?߄?0t?.^?V #WX?P, ;?\nJ-F?^-@vX?P, ;\nJ?.^V ݨV, ?߄0:d?^ǿLELJթ?a FdRļO?&NtO?&>Nt"թ?a E?dR6d?ga ?ҩE?)a,0"&?Oɿ,0a ?ҩF)aļ>8dǿJ>:d?ǿLEJa ?ԩ?F)dļ&?O?!%mz&?|)@>KEKa ?ԩ?E?)d9d??JEg8d?>?LEgө?a ?E?d)Nt,0"O?&?Nt,0ө?a ?Fd)ļ9d?>ǿLEJ߄>>T/O >>T/O Q,>>O -?>߄0B?Р>X;տLEJw?<>ǿLEJmc?X;տG鬠?.u>^V#ݨqR??|d)ļM?a>Fd)ļJ?|lj?T,>;\n-!T?x#? Nt,0?Ŧ>Nt,0T/? }:?^>ݳ@v02K?'*?;>Nt,0"?Ŧ>>Nt,0"@?;>}?T,>;?\n--6?? mc?d)E?d)߄?0tB?Р>X;?LEgP? ??LEg ? ?X;?H2H2lj߄>>T/?O }S,>>?O }>>T/?O }>>T/?O  }>T,>?O  }>>T/?O  }7?5I?^?:FXL>?J?(?.7t ?P??LEgMY?NY?J?H2H2ljzBp?w°?;?-\n-?7? mc?)dQ)V0&?'?;>XXzBp?GT;@;"M@Ͱx#?E@$e^O(z? ?@'rJo`x?x? y#&J7?5I?^#Vݨ?qR?|)dļT??F)dļ??|@K@K >n?0Р>B?Y;տLEJ ?P?ǿLEJ ? ?Y;տH2H2>>T/O >>T/O >R,>O mc?Y;տLEJJ?|)dļ=V@ %YcU9ȝ<@@ T/O >T/O >X,O &>-Р>BY;տJ<>wǿJg4mcY;տJ.u>謠^#cݨ?pR|)aļa>MF)aļ4J|)aļ`,>ѿ;-x#?Tſ ,0Ŧ>ڿ,0j4T/翭 ,0^>:^-0/*?2KͿ;>,0"Ŧ>ڿ>,0"c4@𿆧;>,0"`,>ѿ;?--?4 mc?)aME?)a謠^?#c#WW>J?g<>w?gu74|J?g>݄T/?O  }>R,?O  } >T/?O  }>T/? }T,>? }>T/? }-?߄?0tB?|РX;?LELgw?Nt" ?M(z>Nt"+?%;>X<x°?yBp;\nJ"T?x# Nt ?M(zNtx?x X<7I?7^V ݨrR?|dRļ?TFdRļ?|@Kn? Ǿ߄0B?~РX;տLELJP? ǿLELJ ?~ Y;տH2͔>T/>T/S,>-?߄0 ?2[T/w > ǾT/翨Xw;>$@w>"@Xww?<ǿLELJꬠ?.u^V ݨ?IپJLELJ|?JGQY?IYKH2͔M?aFdRļ?P,;\nJ7?mcdRļX;?mcljǖ?ǖmc@K?ŦNt:?^ݳ@v5K?%*;Nt@?;}+?%;X<?Ŧ>Nt"?P,;?\nJ-"T?x# ?Nt"T/? ?}x?x ?X<M?aE?dR@?X};>@?} > ǾT/?X} >n߄?twi:3;@?O  }$>-߄?t 4 T/?O  } ?P?g 7?3I^?#c#WР>BX;?gg4 mcX;?gT?E?)a,0"?R^-0x#?Tſ ?,0"j4T/翪 ?,0"W(z? ,0Bp?s°;-/*?2KͿ;,0c4@𿙧;,0T?F)aļ 7?3I^#cݨ?4mc)aļV4X;տmc)aļ ?PǿJ >nW>KJu74|KJѩ3 T/O 1쳜;@O rH;>@?O  }Vv? ?T/?O  }q7dd?X;?Exg9̯?|? }=T/? ?7^Kb!?;H6X;?mc.5׳|?KLEJÇͳ ?T/O h4;>@O >-?0 > >T/翨w>>@w<>w?ǿLEJ.u>鬠?^#VݨL>?KLEJMY?NY?KH2H2a>M?F)dļM,>jK@;"T?7?mc>ǖ?ǖ?mcO2,Ŧ>? ) |^>:?^- !+%*?F?;&?'?;XX8>1@>$VVM,>?;?-\n-x#?"T? ?86^TOx?x? ?XXa>M?E?)d5C>bu?^??qR?|?WEj??|?@K@KG<>w??xEg>-?߄?0t~Р>B?X;?LEg >n?߄?0t>>@?} > >T/?}-?>߄?0tw?<>?LEg鬠?.u>^?V##W?N>J?LEg4I?7?^?V##W?T?E?d)Nt,0"R??܀@v0!T?x#? ?Nt,0" ?Q(z?Nt,0v°?}Bp?;\n-2K?'*?;Nt,0?T?Fd)ļ4I?7?^V#ݨ6??mcd)ļP? ?ǿLEJn? >߄0?N>JLEJ>?NY>JLEJ|o?{"?KLEJw1?8>Y;տLEJG?ǖ>mcd)ļ%d?*b?mcd)ļ?E?|d)ļ?'>;Nt,0?;?;Nt,0f?h5u? Nt,0A?x> ?Nt,0"f?h5u? ?Nt,0"?;?;>Nt,0"^?>|?d)?NY>J?LEgR? >X;?LEg8>w1?X;?LEg| >R?X;?TEgX>IF?J? 3_tE??|?>g*>^?|?w\}ǖ>G? mc?)dA? ?"rSZ,>3@@ O?;5x>N@!O*b?&d?mc>)?ǖ>G?mc>>^?|)dļy"?}o?KLEJIY>>?KLEJ| >R?Y;տLEJaY>>KJ"?yoKJ8>w1Y;տJ!ǖ>Fſmc)aļ*b?#dmc)aļE?|)aļ7>޿;,0B?;,0m5u?f ,0x>Aֿ ?,0"m5u?f ?,0"B?;>,0">]|?)aRX;?g8>w1X;?g~"?yoJ?g>?IYJ?LELgo?w"J?LELgw1?8X;?LELg?E|?dRNt"?7;Nt?%;NtA?x Nt'd?*bmcdRļG?ǖmcdRļ^?|dRļo?w"KLELJ>?IYJLELJR?~ X;տLELJw1?8Y;տLELJ?E|dRļf?c5u Nt?7;>Nt"'d?*b mc?dR>J?g!ǖ>Fſ mc?)a޿;>,0"x>Aֿ ,0>]|)aļ >RY;տJ8>w1?Y;տLEJE??|)dļe5u?P&=@C=¦8??;>j[/Y*b?&d? mc?)dX;?LEgG?ǖ> mc?d);>Nt,0"A?x> Nt,0^?>|d)ļR? >X;տLEJDATAM* @ @ @ @      @         !@ @ @ @   @  @  @ @@ @@@ !@@@ "@ #  ""#$%& ''()%*+""-#(/* !1 "- 3  5 !1 7 9  5 ; = 9  ? A=CADEPNQORP TM VT XL ZX \K ^ \`J b ` dI  f dhH jGhkFjll&km$mo# q s@ qf@o@ v@ sb@@ y@ v^@@|@ yZ@ @|VQR%R'R'&&%QQ*))|~(V~(~~&- @}@,}@,}y@{}@+Z{@+{@{@)|@0@~z@/z@/zv@~xz@.^x@.x@~x@,y@3@}w@2w@2ws@}uw@1bu@1u@}u@/v@6@|t@5ot@5tq@|rt@4fr@4r@|r@2s@9{p5qp5po{np8#n8n{n7m7m;$m$;&:k$&k:l7 l<j:l jl:k=F$kF=G<hGh9zi<ji<ihzgi?Hg?gzg>d 4f ye >eA >edyce AIc Ac yc @` 1b xa @a @a` x_aCJ_ C_,x_$B\ .^ w] B] B]\w[]EK[ E[w[DX(+Z vY DYDYXvWY GLW GW vW FT (VuUFUFUTuSUIMSISuSHPJO%ROR%QHQHPJNPNSREERDTDTASAQCtBVBVB=t@BU@U@t@TAP? s> X> X>9 s<> W < W< s< V= O; r: Z: Z:5 r8: Y8 Y8 r8 X9 N7 q6 \6 \61 q46 [4 [4 q4 Z5 M3 p2 ^2 ^2- p02 ]0 ]0 p0 \1 L/o.`*.`.(o,._,_,"o,^-`*K+*+K)a%$)%a'`(#'(b a'# 'a%;&$%&;$b$8#n!c!c!n!_"_nb ]@m@c@c@m@6@6@m@d@[@l@d@d@l@3@3@l@e@Y@k@e@e@k@0@0@k@f @W @j @f @f  @j  @-  @- @j @g@Uiggi**ih'SShh'hS'hiUg@j@W@f@k@Y@e@l@[@d@m@]@bn8;abaK`^oL\ p M Z q N X r O V s P TtQTRSH%JHu(F v + D"w.Bx@1 @ y 4 >z9=:<:;77{92@|@6@/@}@3@,@~@0@)@@-@&*&'%MEP2ԎPMMESphere.001lM\\PP:@IK9>JK9>IK9>DATAP/:fэ=>_}0+>6t>>_>c]W}0+>>_fэ=w.IK9>>_}0+>>_hэw>>_c]ygэ=>_}0+6H=H=~0+?&?&IK=CK= B By/=*=hэ2T2T>>ZZ/=*=fэ=2T2T.IK=CK=> B BWH=H=}0+>?&?&to_э=}0+>6tJK9>>c]W+y0+>fэ=w.u_FK9>+y0+>hэwJK9>c]yqaэ=~0+6HH=~0+?&KKAK= By2'=hэΫ2T>Z2'=fэ=Ϋ2T.KKAK=> BWHH=}0+>?&tfэB}0+>t>W}0+fэ=.IK9R}0+hэyhэB~0+IK9HH~0+GKSKy-:hэΫΫ-:fэ=ΫΫ.GKSK>WHH}0+>t2mэ}0+>tx 3>W;)30+fэ=.TB3NK9;)30+hэx 3y2oэ~0+H=H~0+?&MK=MK By4=3hэ2TΫ>Z4=3fэ=2TΫ.MK=MK> BWH=H}0+>?&t>_IK9>DATAP*@# @ @ @ @   9 9         ##    99@@ @! @"!#"#$""$%!!%& @ &'@'(@()@)**9*+9),+*(-,) '.-( &/.' %0/& $10%#1$#211230034/ /45. .56- -67, ,78++89898767@56@45@34@23#2MEԎP24YPMESphere.002cMwY$ Yb|{K? @I @?DATAW$ Y/bb?&7 >z Y>k[S;&>|d$m IWD?ML0o羘gb'?Î;휏EE?5FUBa?tBP}3r{?:ʤYGrW=?a`Z ? 6ܿdۨ>4!?_%}޿>p?%z1X??B1u|z$p?΋>!i]JW_!?d7 > }"!?#>{m p?> ^KUM?V0>{"#?>Ow-??;?sr8)ѿEi?9? l,C{8Ԓ?1T? e!MT.?Zl? ]~V饿$ys?>G? |T'_(IV??JfQ@Pv8?~??m燿1X?y?3sT> ?'nx,ydۨ>?*{rs#E>Ko?}s }:q\=t=?~rsKo?}},yTc?*J{T ?gnx燿~x? ̿sS@~?|m*IV;?g饿rW;G? H^W3rUl? |~V{1T? v!M)ѿ휏9? z,C羘2?8IW>-R[S=0>鄽"m Yԁ>E3_'?X#> [ҭ? =^| Yj>ށ5>[Sî>8,")ѿIWd> m)u羘 ? 3\=휏k='?\=z>?CGf3r)T?Ph@rWױh?PY%V;Jz?bb?i؏Ӿ~?opp`?RuՑTc?Dy`4ɕ?_C{ Iw\=?|`4#E>ɕ?_{Ցdۨ>?)Dyh`>?*RuЏӾ1X??o7pPv8?b?Di%V?Jz?Nb\@$ys?ܱh?XYf.?.T?JaPz8Ԓ?>?hGS=Ei?r='?\o=k?? ? Wt3)ѿ#?d> x)2뿴?î>8{p?Lj>`Qʭ!?7 =ey !?=k(nu|p?G>4cAKfԿ?,>N |/S#?>u #z0$j??Z>v@-fEi?9?Ur\6-8Ԓ?g"?l{?+.?5?N]fH J$ys?E?^wQiὬV?0T?BUZ=Pv8?a?"~J+b`>1X?\l?M%*>{i>> t?'Q0o%>dۨ>{?z)!zt`P>#E>k~?*wd>\=?+xXP>k~?**wp%>Tc{?z)zt>t?'ϲo`>~\l?M%{i=a?"+b`iV;-T?ZHJrWE?|wQ+ᆴ3r5?NH-g"?{?f휏9?\6 k羘Z>L@-`IW>u ݅0$uԿ[S>N F/YG>.v; ?ɼ=bQ Ʀ ?緝=GytZY>\ 37¿[Sgi> X9IIW>:g羘>Ɔ{$%휏~>8,P l3>&W74iὮ3r9?w<C=rWK{?$`D >V;q='?(M>Dc1?m-ج V-?~9?11/^t;?z@?%6eX\P?TcEE?9ikT\?Z+H?;Mo`?\=L#I?<pT\?#E>Z+H?;Mo\\P?dۨ>EE?9'ikx;?>z@?%68e-?1X?9?1F/^>Pv8?Cc1?m-(S V8>V?s='?(V]M`D=$ys?N{?$eD`i.?9?Olw<( 8Ԓ?t3>&q74%Ei? ~>u8,g??>:y{$)I#?>{"7¿?i> }_Z뿳p?>#?hA !?#=x8"km(L!?GY=M(]ῳp?W;=F,m1E? > y~0燿#?T>;}^ڝ:??Ξ>v{ӾEi?>Q;y`8Ԓ?ɯ>6v%P>.?>%Br),>$ys?1>2+m03-?V?d>1Df:O?Pv8?_>8S]BTw?1X?>>@QJ&֋?>?GBRDI?dۨ>O?3N/uYJ3?#E> ?R9^:?\=Ӌ ?T_J3? ?R9^BI?TcP?3NjuY"֋??GvRTw?~>>@^JO?_>8Bt-?V;d>1:>rW1>2+03>3r >%), ɯ>ʉ%Ӿ휏>Qņ:羘ʞ>v{臿IWT>ł^F[S > 0Y3;=O/ 4L?FY=3/L$?w<6ܿYw\=oN2[S= -yIWX;=< 羘->C܂r @֑휏>] <:3>"fH%>3rG>?)'?rW0쌻H\P?V;Tj>%9$] ?D)y>Bv%BI?~>Mأ2+#?->NY14K?Tcы>dƆ6D?>mN:?\=B> q <D?#E>>m:8K?dۨ>΋>d96#?>->NYtM1BI?1X?>M(\2+?Pv8??)y>Bf%\\P?V?Sj>%9m] ?$ys?0s`%>.?G>?)v#<8Ԓ?:3>"y֑Ei?>{??->C$}r ,y#?];=<?~ ?= 6ܿp?w\=>2r!?<g/:[!?,-Nu2Cڿp?O63uɨ?7 =@q#?B ~@Q??5}@IwEi?ѳ|=8Ԓ?b̥#zpd>.?~*x3$?$ys?2su`?V?`-8aR?dۨ> .p=?#E>H{!6?\=ld?D{k?TcZp4?nhai6?~vp಩S"?2 G`?V;`L2-< `3$?rWl32Hd>3rT*d=3rG?)'h?rW7dZ0EH\P?V;Sj%9$?A)yBvvBI?~Mأ#?-NY2K?TcԋdzD?mNt?\=BqD?#E>mt4K?dۨ>؋d9z#?>-NYtMBI?1X?M(\?Pv8?I)yBfvT\P?V?]j%9m?$ys?GdZ0sE`%>.?G?)vh#<8Ԓ?:3"y֑Ei?{z??-C$},y#?;ؽ<?~k? 6ܿp?x\>2r!?dݼRi*R(L!?xGYO |ῳp?;ؽF,mE? y~燿#?T;}:??ڞv{6ӾEi?Q;y|8Ԓ?ɯ6vb@>.?þ%Br>$ys?2־2+m-?V?d1DfKO?Pv8?_8S][Tw?1X?>@Q: ֋?>GB^@I?dۨ>U3N/H3?#E> Rǡ6?\=ԋ T H3? Rǡ:I?TcS3NjЋ֋?Gv^Tw?~>@^:O?_8[t-?V;d1K>rW1־2+>3rþ%`ɯʉbӾ휏Qņ|:羘̞v{6臿IWTłF[S Y>;ؽO4L?FY3/Ǧ ?𷝽GvZY\ z47¿[Shi XS9IIW:g羘Ɔ%휏~߾h k3&W jὮ3r9@C=rWI{$`>V;q='(y>Cc1m-جx-?~911ѡd;?z@%6ǁH\P?TcEE9ؗH\?Z+H;볐`?\=N#I<VH\?#E>Z+H;H\P?dۨ>EE9'h;?>z@%68-?1X?91Fѡ>Pv8?Ec1m-(S(>V?u='(V]y D=$ys?P{$ei.?9Ol8 8Ԓ?w3&q%Ei?~߾ug??:y+I#?{"7¿?i }S`Z뿳p?#?h !?U97 !?KȽE)v}p?G4cfԿ?4N |V#?þu #zk??ZvfEi?9Ur-8Ԓ?g"l+.?5N]fs8J$ys?E^`iὬV?1TBU=Pv8?a"~J՝P>1X?\lM%*>>> t'Q0NX%>dۨ>{z)!PP>#E>j~*xd>\=+wPP>j~**X%>Tc{z)ކ>t'N@>~\lM%=a"՝iV;,ThJrWE|+ᆴ3r5Ns-g"f휏9 k羘ZLbIWþu ݅vԿ[SN FYG.v ?мȽbҭ? ^|6Yjށ@[Sî8,n$)ѿIWd澠 m'x羘  ^=휏i='\ z>CYf3r'Tz@rWѱhP$%V;Jz`tӾ~o`ծ֑Tc⼆x4ɕ_CL@Iw\=yx4#E>ɕ_L ֑dۨ>)`>*Ӿ1X?o7Pv8?aDt%V?JzNh@$ys?ܱhX$f.?-TJaz8Ԓ?>hYX=Ei?s='\o q??  Wt)ѿ#?d澠 x'2뿴?î8{np?_j`y˭!?e x~r"!?#?m p? ^N?^0¾{C#?Ow??=srG)ѿEi?9 lԼ{8Ԓ? 1T e߲X.?Zl ]饿$ys?=G |T٠,IV?JX@Pv8?~?燿1X?x3AT> '-ydۨ>*&rs#E>Io}s Dq\=s=]rsIo},yTc*J&T gؒ燿~w AW@~a.IV;饿rW7G ٠]3rSl |{1T v߲ )ѿ휏9 zԼ羘0GIWR[S=0¾Cm YՁE3'?\#&b?*7 YkT[S;&ξ|d[m IWDMp羘db'Î{휏EE˹UBat3r{:ʤlGrW=cZV;b^<濞ÓΏ~BUS޿l婿H6ܿTc0!ۂڿ@Cڿ\=Rڿ#E> 6ܿdۨ>0!_ۂ޿>m婿%1X?B1S9%dۨ>v#E>% \=%xTcv9ځ~q=ϻ V;rW߮3rme 휏@#I̸羘*-IWċ ̉[S#0ҾYB~?` R$?)7 3})YZkT.[S:&ξd[/;3IWC7羘cb'Î{;휏EE'˹?BaptC3r{ʤlGrW=*IV;^L“$Ώ)N~US?XPk婿mHQTc/!2ۂHR@R\=RHR#E> Qdۨ>/!2_ۂ?XP>l婿m%(N1X?1SLPv8?Ó$=ΏIV?G^G$ys?=*QC.?{6[l ?8Ԓ?Bapc;Ei?EE'j˹7??qb'=q{1;3#?R|v.?\&ξz[)p?Ջi]$!?y7 F/ܓ)!?#N1;3p?r^<?\0¾{CE#?vOwN??;srGrWEi?9XlԼ(^8Ԓ?1Te߲T&f.?Xl}]"l$ys?;G2|T٠jrV?JԈwPv8?~?{1X?w3A~> ]'⮀dۨ>&,f#E>Gos x\=q=g],fGoᮀTcJ&~ ]gؒ{~v Aӈw~ahrV;lrW5G2٠R&f3rOl}|&^1Tv߲oW휏9XzԼN羘.GEIWv<[S<0¾C,;3YӁ3ד)?[#f&,-? 콢|6;Yj4ށ^I[Sî,nlWIWd`m'Bc羘 O p휏i=' k{>WCY3r$TprWαhP$V;Jz^*t~x?ծTc@⼆8ɕCL4\=ky8#E>ɕL dۨ>@)x>?*1X?7Pv8?_*DtV?JzNr$ys?ٱhX$.?,TJak{8Ԓ?>WhYT pEi?q='o Hc?? WtqW#?d`x'dI?î{n;p?Zj`y4-!?a yS1!?EȽ_ˆCp?Gc+U?3|S&f#?þ#z~sv??Z]vEi?9'Ur38Ԓ?g"l.?5]fs$ys?E^NV?,T`BU~Pv8?ai~J՝a̤1X?\l*>է>t[Q0Ndۨ>{!Y#E>f~Zʫ\=wYf~Z*Tc{ކէt[دNa̤~Zl~ai݂՝NV;*T`ྪrWE|3r5棙s3g"휏9'vsv羘Z]LL&fIWþ݅+U[SFCYGvJ1?ϼȽb75?QGIY zc^[SfiXS`rIW:ׂ羘&Ɔ휏~߾sb3WN3r9u౓mrWE{`_V;o='Aתy1@c1ج-~91ѡLz@ǁTcEEhؗGnV+H볐u\=J#ICVGn#E>V+H dۨ>EEh'L>z@8-1X?9Fѡ1Pv8?Ac1(SaV?p='AV]ym$ys?L{۠eN.?9uOls8Ԓ?s3qEi?~߾uׂ??&:yhr#?{l^?i}SIp?J?hB5!?N,~\7!?jGYJl"'Np?x;ؽӡme? |y~{#?T;}€??Ӟ{6Ei?񙾯;y|8Ԓ?ɯ}6vb_̤.?þBr$ys?1־m-V?d9DfKȹPv8?_(S][Ҿ1X?¿Q:>gB^ͦdۨ>Lͱ/Oa#E> ǡK\=ҋ J Oa ǡͦTcLͱjЋgv^Ҿ~¿^:ȹ_(ǭ[+V;d9μKrW1־]̤3rþھ ɯ}ʉb|휏񙾯ņ|羘Ȟ{6{IWTłe[S |NY/;ؽ\7?FY/8?ݼf3QYw\oi[SۮIWZ;ؽk羘-܂휏P]z :3]f3rG'hlrW5dZPEV;Uj$MA)y:vvͦ~dأ_-ITc̋Ez fNt%Z\=B #E>ftIdۨ>̋E9z_>-tMͦ1X?d(\MPv8?B)y:fvV?Qjml$ys?AdZPsE.?Gvh 8Ԓ?:3]ݚyEi?P{z ??-$}஀#?;ؽ?~ki? Qp?x\r8!?NݼT;-1M9!?k-{4Rp?6BuCk?߯5=v#?67@~U*??(}2Ei?i|X8Ԓ?ڳ,zʫ.?oN'՜xZ$ys?B;ٳ!susV?4kpPv8?xjI1X?B%X`@> Bг8R%Zdۨ>3=9#E>V2}!I\=;d9Z2}k$ZTcͻ34@8728iI~оX"rV;o ZrW-.!͍ʫ3rxM1'dXn3, 0휏L˝iyP*羘*솳DqIWS3@cCk[SÀ RY@2W$M9? G88?n܂r 휏>P] :3>]f3rG>'lrW.dZ>P쌻V;Ej>$] M4)y>:v%̦~>dأ2+]->1GTcЋ>EƆ6 >fN:%Z\=B> < #E>>f:Idۨ>ҋ>E96_>->tM1ͦ1X?쁂>d(\2+MPv8?6)y>:f%V?Mj>m] l$ys?2dZ>Ps.?G>v 8Ԓ?:3>]ݚyEi?>P{ ??->$}r ߮#?R;=?~ i?= Qp?w\=r8!?<2d:\7!?GY=qr*\%Np?R;=ӡm1e? >|y~0{#?T>;}^??Ξ>{~Ei?>;y8Ԓ? ɯ>}6v%^̤.?>Br),$ys?1>m03+V?d>9Df:ȹPv8?_>(S]BҾ1X?>¿QJ>?gBR˦dۨ>P?ͱ/uYMa#E> ? 9^I\=͋ ?J_Ma ? 9^˦TcO?ͱjuY?gvRҾ~>¿^Jȹ_>(ǭB+V;d>9μ:rW1>03\̤3r>ھ), ɯ>}ʉ%|휏>ņ羘Ğ>{{IWT>ł^e[S >|0NY3;=/ \7?FY=/L65?ᷝ=QGyIY> b^[S^i>X^rIW>:ׂ羘>&Ɔ{$휏}>8,sc3>W74N3r9?u౓x<mrWB{?`D]V;j='?AתM1;c1?ج V+~9?1/^Lz@?eTcEE?hikCnS+H?Mos\=E#I?CpCn#E>S+H?Modۨ>EE?h'ikL>z@?8e+1X?9?F/^1Pv8?=c1?(S V]V?l='?AV]Mm$ys?G{?۠eDN.?9?uOlw<s8Ԓ?g3>q74Ei?~>u8,ׂ??>&:y{$gr#?>{j^?ui>}Ip?>J?hAA5!? =&$ mR1!?=1uCp?G>cAK+U?$>|/R&f#?>#z0$zsv??Z>]v@-Ei?9?'Ur\638Ԓ?g"?l{?.?5?]fH$ys?E?^wQNV?&T?`BUZ|Pv8?a?i~J+b_̤1X?Sl?*>{iէ>t?[Q0odۨ>{?!ztY#E>`~?Zwʫ\=?xY`~?Z*wTc{?ztէt?[دϲo^̤~Tl?{i|a?i݂+bNV;$T?`ྪZrWE?|wQ3r5?棙H}3g"?{?휏9?'\6tsv羘Z>]L@-J&fIW>݅0$+U[S>F/CYG>v;I1?=bQ ,-? =| ;Yj>4ށ5\I[Sî>,jWIWd>`m)>c羘 ?3L p휏c='?=k{>?WCG3rT?PmrWȱh?PYV;Jz?b[?*i~~?pt??RuTc?@Dy4ɕ?C{2\=?k|4#E>ɕ?{dۨ>?@)Dyt>??*Ru1X??7pPv8?]?*DiV?Jz?Nbp$ys?ϱh?XY.?#T?JaPk{8Ԓ?>?WhGN pEi?h='?o=Cc?? ?Wt3pW#?d>`x)bI?î>{;p?>j>`Q2-!?- =|yۓ)!?#>R3{.;3p?聂>r^KU<?L0>{"E#?>vOw-N??5?sr8lWEi?9?Xl,C#^8Ԓ?1T?e!MO&f.?Ol?}]~Vl$ys?7G?2|T'_crV??JfΈwPv8?~??m{1X?r?3s~> ?]'nxܮdۨ>?{(f#E>Co?s }t\=m=?g~(fCo?}ܮTc?J{~ ?]gnx{~s? ̿sΈw~?amdrV;?flrW3G?2'_L&f3rJl?}|~V^1T?v!MlW휏9?Xz,C~N羘)?8EIW>v-<[S60>鄽"*;3Y΁>3_֓)?Q#>f $?7 >3z z)Y>Zk.[S3&>d$-;3IW??L07羘]b'?Î;;휏EE?'5F?Ba?ptBPC3r{?ʤYGrW=?*bIV;?iL?$2p$N~?Uέu8XPg?mHzQTc+!?2%}HR?@ R\=}?HR#E>? Qdۨ>,!?2_%}9XP>g?m%z&N1X??1uLPv8??$=2pIV??GiG$ys?=?*QbC.?{?6[Y?8Ԓ?Ba?pcBP;Ei?EE?'j5F7??ib'?=q;/;3#?J?|vL0.?J&>z$})p?ċ>i]JW$!?\7 >k/|~!? >^}~p?B>]W~?20>rzG%~#?ˋ ?4v1|??*?pq<|Ei?>#I?\j4G}8Ԓ?e?bHQ}.??pZZ}$ys??!Qb|V?? Gwj{Pv8??G|9?%zydۨ>|?}{#E>%? a|\=?{%?xazTc|?}{|9?z|~l=?Ev}?p~V;?vj|rW?b|3r?Z|e? HQ~휏8#I?4G~羘٩*?-q<~IW ?̉1~[S0>G%~YB>~~?T > sTz@"=F~#z@t=A~L(z@ϭ=Z~|>Y,z@Q=wfzK/z@ej=HuT2z@==hk l4z@߁<'OZP6z@4 .r6S6z@a0HP6z@l,4z@(l60&]U2z@CԽ L/z@&bX@Y,z@P-ÅL(z@b H#z@q!uTz@R$ #z@r!"\z@bqOz@PH7fz@&q*ɉ z@JԽf;V98 z@/lQ!\Xz@l(kH'z@ix*8Xz@4k(S78 z@߁                     !  "! #" $# %$ &% '&(')(*)+*,+-,.-/. 0/ 10  21  32  43 54 6576 87 98 :9 ;: <; =< => >?= =?@< <@A; ;AB: :BC9 9CD8 8DE7 7EF6 6FG5 5GH44HI33IJ22JK11KL00LM//MN..NO--OP,,PQ++QR**RS))ST((TU''UV& &VW% %WX$ $XY# #YZ" "Z[! ![\  \]\_^][`_\ Za`[ YbaZ XcbY WdcX VedW UfeV TgfUShgTRihSQjiRPkjQOlkPNmlOMnmNLonMKpoLJqpKIrqJHsrIGtsHFutG EvuF DwvE CxwD ByxC AzyB @{zA ?|{@ >|? >}| |}~{ {~z zy yx xw wv vu ut ts srrqqppoonnmmllkkjjiihhggf fe ed dc cb ba a` `_ _^                 ~ }~ >} >            @@@@@@           @@           @@@@@@            > >           @@@ @  @  @                @@        !   "!  #"   $#   %$ @ &% @'& @('@)(@*)@+* ,+ -, .- /. 0/ 10 21 32 43 54 65 >6 >76 6785 5894 49:3 3:;2 2;<1 1<=0 0=>/ />?. .?@- -@A, ,AB++BC**CD))DE((EF''FG&&GH%%HI$$IJ##JK""KL! !LM   MN NO OP PQ QR RS ST TUTWVUSXWT RYXS QZYR P[ZQ O\[P N]\O M^]N L_^M K`_LJa`KIbaJHcbIGdcHFedGEfeFDgfEChgDBihCAjiB@kjA?lk@ >ml? =nm> <on= ;po< :qp; 9rq: 8sr9 7ts8 >t7 >ut tuvs svwr rwxq qxyp pyzo oz{n n{|m m|}l l}~kk~jjiihhggffeeddccbbaa``__^^] ]\ \[ [Z ZY YX XW WV       ~}~|} {| z{ yz xy wx vw uv >u >                           > >                                         ! "!#"$#%$&%'&(' )( *) +* ,+ -, .- >. >/. ./0- -01, ,12+ +23* *34) )45( (56' '67& &78%%89$$9:##:;"";<!!<=  =>>??@@AABBCCDDEEF FG GH HI IJ JK KL LMLONMKPOL JQPK IRQJ HSRI GTSH FUTG EVUF DWVECXWDBYXCAZYB@[ZA?\[@>]\?=^]><_^=;`_<:a`;9ba:8cb97dc86ed7 5fe6 4gf5 3hg4 2ih3 1ji2 0kj1 /lk0 >l/ >ml lmnk knoj jopi ipqh hqrg grsf fste etud duvc cvwbbwxaaxy``yz__z{^^{|]]|}\\}~[[~ZZYYXXWWV VU UT TS SR RQ QP PO ON         ~}~|}{|z{yzxywxvw uv tu st rs qr pq op no mn >m >             @@@@@@           @@           @@@@@@            > >             @@@@@@           @ @                    @@@@@@       !  "! #" $# %$ &% >& >'& &'(% %()$ $)*# #*+" "+,! !,-   -. ./ /0 01 12233445566778899::;;< <= => >? ?@   @A   AB   BC   CD   DEDGFECHGD BIHC AJIB @KJA ?LK@ >ML? =NM> <ON= ;PO<:QP;9RQ:8SR97TS86UT75VU64WV53XW42YX31ZY20[Z1/\[0 .]\/ -^]. ,_^- +`_, *a`+ )ba* (cb) 'dc( >d' >ed defc cfgb bgha ahi` `ij_ _jk^ ^kl] ]lm\ \mn[[noZZopYYpqXXqrWWrsVVstUUtuTTuvSSvwRRwxQQxyPPyzOOz{NN{|M M|}L L}~K K~J JI IH HG GF   ~ }~ |} {| z{yzxywxvwuvtustrsqrpqopnomnlm kl jk ij hi gh fg ef >e >                           >   F EF E @ @ @ @  N MN M      V UV U @ @ @ @  ^ ]^ ]   @@ @  @       @@@@  !" "##$ $% %& &' '(@ ()@ )*@ *+@ +, ,- -. ./ /0 01 12 23 34  45  56  67  78@  89@ 9:@ :;@;<<==>>??@ @!!@Aa@?BA?>CB>=DC=<ED<;FE;:GF@:9HG@98IH@87JI@76KJ65LK54ML43NM32ON21PO10QP0/RQ/.SR.-TS-,UT,+WU+*XW@*)YX@)(ZY@('[Z@'&\[&%]\%$^]$#_^#"`_"!a`aAV ABV BCV CDV DEV EFV FGV GHV HIV IJV JKV KLV LMV MNV NOV OPV PQV QRV RSV STV TUV UWV WXV XYV YZV Z[V [\V \]V ]^V ^_V _`V `aV ME4Y24 PԎPMESphere.004 `\ \ 4sLOQj& SU>x[?|I@u1@DATA4sLNDATA'Q/;߄?6^^?c]y߄;?w.Mγ߄;w.^^c]W;߄6t??&t.u.u?^ BWR,T,?;Ti܍?^^?^-ZR,T,?;?2TΫ.u.u?^? By?߄??&rH3;?߄?Vʶ7X;b?^?j}J4߄?;?.24.?^-z~06|T@;& M.3^?^%SuH3;?Dr+[42[.~wi:;߄?G5㷴^^?%eY7ߴ߄⿎;?.o2G.^-0@vߴ߄⿑;.o+㷴^^%eYSwi:;G5Dr?&?&t.u.u^ B BWV,P,;2T2T.^^^-ZZV,P,;?2T2T.u.u^? B By߄??&?&.?A>뿨X}T, >߄0t2۳}<^V #WEǿGljaa?F@KGXT, ?;\nJ-ǿFljGŦŦ?jŹFѿ^-?@v}ŦŦ?>X<XT, ?;?\nJ>}aa?E?@K.>^?V ݨǿE?ljS, >߄?0E?G<?Xw?wT, ?߄?rH2>?O 9&?^?DI. ;m??kqbQ, X?;?-o"4?E?)]ϼ^-F?^-C#vC4L:@>'g+ C@;"ҫYIT/4?O..?^#c#Wo"4?F)aO  }wi?O ዊE?LEJ˴ǿE?)dļV뿌>,0NtV뿔,0Nt"˴ǿF)dXXY, X;?-\naaE?@K@K. ^?#Vݨ<Nt,0թa E?d)ļ:d^?LEJ^6d?LEJa ҩE?)dļ&Oɿ>,0Nt&Oɿ,0Nt"a ҩF)dK Aa ԩ?E?)aļ^9d??I8d>?LELJөa ?E?dRļOɿ&?>NtOɿ&?Nt"өa ?FdRǿLELg߄>T/ }>T/ }Q,> }->߄0tBР>X;տLELgw<>ǿLELgmcX;տGlj鬠.u>^V #WqR?|dRFdR;\nJ-!Tſx#? Nt"ڿŦ>Nt"T/ }:^>ݳ@v2KͿ'*?;>NtڿŦ>>Nt@;>}ѿT,>;?\nJ6? mc?dRļMa>E?dRļX;տ mc?ljn >߄?0BР>X;?LELJP ??LELJ ?X;?H2͔߄>T/?S,>?>T/?>T/?O T,>?O >T/?O 75I?^?:QLپ?J?(ɋ P??JMYNY?J?H2͔zBpw°?;?-7? mc?)aļT?E?)aļǖǖ? mc?@KR?^-.!;$*`+@pQש2&'?;>X<$Bpۚ;@;6MnOx#E@0O`PO(z ?.'Bxx? yڰ75I?^#c#WqR?|)aT/O  }>T/O  }R,>O  }3mc?Y;տg4J?|)a,0NtŦڿ>,0Ntc@𿆧;>,0Nt`,ѿ;?-\n4 mc?)dļaME?)dļVմX;տ mc?)dļ.u謠^?#VݨWپJ?LEJNt,0 M(z>Nt,0+%;>XXx°yBp;\n--"Tſx# Nt,0" M(zNt,0"xx XX7I7^V##WrR|d)Nt,0ѿP,;?\n-"Tſx# ?Nt,0T/ ?}xx ?XXMaE?d)ļꬠ.u^?V#ݨrR|?d)ļJ|?lj|?@K@K7I7^?V#ݨ | X;?H2H2P ?LEJn Ǿ߄?0IپJ?LEJQYIYJ?H2H2|J?G T/?w@?w;@?w Ǿ ǾT/?w Ǿn߄?0wi:;@?O $-߄?0 T/?O  P?LEJ 73I^?#VݨРBX;?LEJg mcX;?LEJTE?)dļBps°;?-\npR|?)dļJ|?)dļW(z >,0NtR^-0@vx#Tſ ?,0NtjT/翪 ?,0NtW(z ,0Nt"Bps°;-\n-/*2KͿ;,0Nt"c@𿙧;,0Nt"TF)d@?O Vv?3 ?T/?O q;7dd?X;?x̯?|? >=4T/? ?7^!4?;F,64X;?mc,w r3|?KgÇ3 ?T/O  }h44;>@O  }-?t Ǿ >T/翨X}>@X}$ CM,?;?-x#"T? ?86yxx? ?X<aM?E?)_˼Ҿbu?^?/U}qR?|?WEt?|?@K@?Xw Ǿ >T/?Xw->߄?0w<>?LELJ鬠.u>^?V ݨN>J?LELJ4I7?^?V ݨT?E?dRļv°}Bp?;?\nJqR?|?dRļ Q(z?>NtR?܀@v!Tſx#? ?Nt Q(z?Nt"v°}Bp?;\nJ-2KͿ'*?;Nt"T?FdR߄0tN>JLELg>NY>JLELg|o{"?KLELgw18>Y;տLELgGſǖ>mcdR;Nt";?;Nt"fh5u? Nt"Aֿx> ?Ntfh5u? ?Nt;?;>Nt^>|?dRļE?|?dRļ%d*b? mc?dRļ|o{"?J?LELJ>NY>J?LELJR >X;?LELJ8w1?X;?J| R?X;?ZXIF?J? ̡E?|?>F^?|?wKǖG? mc?)aļe5uf? ?9ixA? ?"O"3@px}ZN@0OJ!]*b&d?mc>)WgǖG?mc?Kg| R?Y;տgaY>KLEg"yoKLEg8w1Y;տLEg!ǖFſmc)d,0Nt]|?)dļE|?)dļ*b#d mc?)dļ RX;?LEJ8w1X;?LEJ~"yoJ?LEJ>IYJ?LEJow"J?LEJw18X;?LEJE|?d)ļ^|?d)ļGſǖ mc?d)ļfc5u ?Nt,0Aֿx ?Nt,0޿%;>Nt,07;Nt,0"޿%;Nt,0"Aֿx Nt,0"'d*bmcd)IYJLEgR~ X;տLEgw18Y;տLEgE|d)Nt,0'd*b mc?d)ļR| X;?LEJ`Y>J?LEJ!ǖFſ mc?)dļ7޿;>,0NtxAֿ ,0Nt"]|)di[Ц~*b&d? mc?)aļy"}o?J?e Zw18>X;?LELJGſǖ> mc?dRļ޿'>;>NtAֿx> Nt"^>|dRX;տLELgg_> fuXR. >bFK ElD=gc6@.nWf_A[ ?h Uϻ-kD?:h zUڟ6>(h wZվ7Gh 俭;VRlj>h 俫N%a2`=?h n4DW-Sh2 moW<qf_eAmV= ;#Iz >%iK|Qg_>wtGUbx\"g_>9GUb=_} >*;iK{ =&< ;"7{f_;A1%X q:oW5}u9Sh3DATA O* @ @ @ @      @         !@ @ @ @   @  @  @ @@ @@@ !@@@ "@ #  ""#$%& ''()%*+""-#(/* !1 "- 3  5 !1 7 9  5 ; = 9  ? A=CADEPNQORP TM VT XL ZX \K ^ \`J b ` dI  f dhH jGhkFjll&km$mo# q s@ qf@o@ v@ sb@@ y@ v^@@|@ yZ@ @|VQR%R'R'&&%QQ*))|~(V~(~~&- @}@,}@,}y@{}@+Z{@+{@{@)|@0@~z@/z@/zv@~xz@.^x@.x@~x@,y@3@}w@2w@2ws@}uw@1bu@1u@}u@/v@6@|t@5ot@5tq@|rt@4fr@4r@|r@2s@9{p5qp5po{np8#n8n{n7m7m;$m$;&:k$&k:l7 l<j:l jl:k=F$kF=G<hGh9zi<ji<ihzgi?Hg?gzg>d 4f ye >eA >edyce AIc Ac yc @` 1b xa @a @a` x_aCJ_ C_,x_$B\ .^ w] B] B]\w[]EK[ E[w[DX(+Z vY DYDYXvWY GLW GW vW FT (VuUFUFUTuSUIMSISuSHPJO%ROR%QHQHPJNPNSREERDTDTASAQCtBVBVB=t@BU@U@t@TAP? s> X> X>9 s<> W < W< s< V= O; r: Z: Z:5 r8: Y8 Y8 r8 X9 N7 q6 \6 \61 q46 [4 [4 q4 Z5 M3 p2 ^2 ^2- p02 ]0 ]0 p0 \1 L/o.`*.`.(o,._,_,"o,^-`*K+*+K)a%$)%a'`(#'(b a'# 'a%;&$%&;$b$8#n!c!c!n!_"_nb ]@m@c@c@m@6@6@m@d@[@l@d@d@l@3@3@l@e@Y@k@e@e@k@0@0@k@f @W @j @f @f  @j  @-  @- @j @g@Uiggi**ih'SShh'hS'hiUg@j@W@f@k@Y@e@l@[@d@m@]@bn8;abaK`^oL\ p M Z q N X r O V s P TtQTRSH%JHu(F v + D"w.Bx@1 @ y 4 >z9=:<:;77{92@|@6@/@}@3@,@~@0@)@@-@&*&'%F B  D F &@ @ @ @@@@@ME4 P24YMESphere.005kM,,Q, P:@IK9>JK9>IK9>DATA, P/:fэ>_}0+>6>_>c]y}0+>_fэ=wIK9>_}0+>_hэw.>_c]Wgэ>_}0+6tHH=~0+?&tIKCK= BW/*=hэ2TΫ.>Z/*=fэ=2TΫIKCK=> ByHH=}0+>?&o1_э=}0+>JK92>>y+2y0+>fэ=u_2FK9>+2y0+>hэ.JK92>Wq1aэ=~0+tH=H=~0+tKK=AK=W2='=hэΫΫ.>>2='=fэ=ΫΫKK=AK=>yH=H=}0+>fэ=B}0+>>>y}0+>fэ=IK9>R}0+>hэ.>Whэ=B~0+t2IK9H=H~0+?&tGK=SK BW-=:hэΫ2T.>Z-=:fэ=Ϋ2TGK=SK> ByH=H}0+>?&ጲmэ}0+>6x >c]y;)0+fэ=wTBNK9;)0+hэw.x c]Wጲoэ~0+6tHH~0+?&?&tMKMK B BW43hэ2T2T.ZZ43fэ=2T2TMKMK> B ByHH}0+>?&?&>_IK9>DATAQ*@# @ @ @ @   9 9         ##    99@@ @! @"!#"#$""$%!!%& @ &'@'(@()@)**9*+9),+*(-,) '.-( &/.' %0/& $10%#1$#211230034/ /45. .56- -67, ,78++89898767@56@45@34@23#2MAN!MAMaterialL?L?L?????????L??2 ????IM(/IMz1.tga\testTGA\z1.tgaCAl\MCACamera=B?A B?WOU6WOWorld??A@pATXdMtWTXtruedisp10-07-2003.py̏PtLdYtLtLpWDATA$̏PC:\testTGA\truedisp10-07-2003.pyREEDATAtLLYFREEDATALLtLY FREEDATALLLLFREEDATA@O 8O<@ODPFREEDATA 8O7O@OXFREEDATA7O47O 8O| YFREEDATA47O.O7O@RFREEDATA.O|7O47OPFREEDATA|7Oܟ.OP$FREEDATAܟ4|7O,P#FREEDATA4lQܟPDFREEDATAlQS4P#REEDATAStQlQTP@FREEDATAtQ4fSSP#FREEDATA4fSWtQ$P) *EDATAWOX4fSP#FREEDATAOXbWWP$FREEDATAbWOTOX= 16): DATA8N msgstring = "The image origin is not Bottom Left"; DATA $N return9DATAlN Blender.Draw.Draw(); DATA\UDATAUDATA(N#__ MAIN DISPLACEMENT MAPPING FUNCTIONDATA$ Ndef displaceTrue(filename,value):DATA,dN global msgstring, Pow, listUndo, objNameDATAN msgstring = "OK"EEDATAUDATAN #LETTURA DEL FILE TGADATA\N listByte = []DATAU DATAV try:DATAN f = open(filename,'rb') 1DATA$N except IOError,(errno,strerror):0)DATA8TN msgstring = "I/O error(%s): %s" % (errno, strerror); DATAN Blender.Draw.Draw()DATA N return DATATV DATALN fileRead = f.read();DATA,V DATA N msgstring = "Parsing tga..."; DATAN Blender.Draw.Draw()DATA\V _ DATA 4N for i in range(len(fileRead)):DATA(N listByte.append(ord(fileRead[i])) ")DATA N f.close()DATADV DATA,N #CHECK FOR LEGAL TGA IMAGEDATA$N checkImage(listByte, msgstring)REEDATAV elDATAN #LETTURA DELLA RISOLUZIONEDATA44N TGAXres = ( listByte[13] * 256 ) + listByte[12]REEDATA4N TGAYres = ( listByte[15] * 256 ) + listByte[14]REEDATAV DATA0N #CALCOLO DELLA LUNGHEZZA DELLE INTESTAZIONIl):DATAlN tgaFileHeader = 18DATAN imageID = listByte[0]DATAXN colorMap = ( ( listByte[5] * listByte[7] )/8 ) + ( ( listByte[6] * listByte[7] )/8 )emDATA4N lenghtTotal = tgaFileHeader + imageID + colorMapEEDATAVDATAN displaceFactor = valueDATA$4N print TGAXres,TGAYres,lenghtTotaloDATA V DATA N #__ GET THE SELECTED OBJECT 0:DATA P for v in objectData.verts:DATA$P v.co[0] =listUndo[v.index][0]DATA$4P v.co[1] =listUndo[v.index][1]DATA$P v.co[2] =listUndo[v.index][2]DATA V DATAP objectData.update()DATA,P msgstring = "Undo OK"; DATAP Blender.Draw.Draw()DATAQ else:DATA@P msgstring = "Please, select obj modified by this script!"; DATADP Blender.Draw.Draw()DATAXDATA| YDATA@R#__ DATAPdef drawAuthorInfo():DATA(P Blender.BGL.glColor3f(0.0,0.0,0.0) DATA$,P Blender.BGL.glRasterPos2i(10, 220)DATAHP Blender.Draw.Text("True Displacement vers. Beta 1 - 7 july 2003")DATA$P Blender.BGL.glRasterPos2i(10, 205)DATADTP Blender.Draw.Text("by Manuel Bastioni and Alessandro Braccili")REEDATA$P Blender.BGL.glRasterPos2i(10, 185)DATA,$P Blender.Draw.Text("get last version at")DATA$P Blender.BGL.glColor3f(0.0,0.0,0.6)DATA(P Blender.BGL.glRasterPos2i(120, 185) DATA(FREEDATA|W|Wl|WOZFREEDATA|WD}W|WOZ-FREEDATAD}W}W|WDPZ+FREEDATA}W}WD}WPZ0FREEDATA}W~W}WQZ>FREEDATA~Wd~W}WQZFREEDATAd~W~W~WQZFREEDATA~W~Wd~WRZFREEDATA~W<W~WTRZFREEDATA<WW~WRZWFREEDATAWW<W$SZ#FREEDATAWWW|SZFREEDATAW\WWSZFREEDATA\WWWSZJFREEDATAWW\WTZ:FREEDATAW4WWTZFREEDATA4W|WW4UZ2FREEDATA|WāW4WUZ'FREEDATAāW W|WUZFREEDATA WTWāW,VZ:FREEDATATWW WVZFREEDATAWWTWVZFREEDATAW,WW4WZBFREEDATA,WtWWWZ8FREEDATAtWW,W$XZ4FREEDATAWWtWXZ<FREEDATAWLWWYZ6FREEDATALWWWlYZ'FREEDATAW܄WLWYZFREEDATA܄W$WWYZ.FREEDATA$WlW܄WdZZNFREEDATAlWW$WZZ2FREEDATAWWlWT[ZDFREEDATAWDWW[ZFREEDATADWWW\Z.FREEDATAWԆWDWl\Z4FREEDATAԆWWW\ZFREEDATAWdWԆW ]Z.FREEDATAdWWWt]ZIFREEDATAWWdW]ZFREEDATAWFREEDATÄWWW_ZFREEDATAW\ẄW_ZIFREEDATA\WWWL`ZDATAWW\W`ZCFREEDATAW4WW aZ[FREEDATA4W|WWaZFREEDATA|WĊW4WaZ"FREEDATAĊW W|WTbZKFREEDATA WTWĊWbZQFREEDATATWW WdcZFREEDATAWWTWcZ DATAW,WWcZDATA,WtWWdZOFREEDATAtWW,WdZGFREEDATAWWtWeZUFREEDATAWLWWeZ/FREEDATALWWW fZ+FREEDATAW܍WLWtfZ(Z DATA܍W$WWfZ'۴DATA$WlW܍W4gZ&FREEDATAlWW$WgZ+FREEDATAWWlWgZ%eColDATAWDWWLhZ.texIDATADWWWhZ2exInDATAWԏWDWiZ-elf.DATAԏW$PXWiZ-ort DATA$PXlPXԏWiZ#oftnDATAlPXPX$PXDjZ!lorsDATAPXPXlPXjZositDATAPXDQXPXjZur VDATADQXQXPX,kZ.valDATAQXQXDQXtkZasteDATAQXRXQXkZ "UndDATARXdRXQXlZ,msgDATAdRXRXRXLlZo ObDATARXRXdRXlZDATARXDATAaXaXLaX\[.0DATAaX$bXaX['ȧ>DATA$bXlbXaX [antsDATAlbXbX$bXT[----DATAbXbXlbX[T----DATAbXDcXbX$[Z>DATADcXcXbX[W DATAcXcXDcXD[RleToDATAcXdXcX[VDATAdXddXcXT[PDATAddXdXdX[SDATAdXdXddXd[[DATAdXDATApX qX|pXlO0DATA qXTqXpXԬO=tDATATqXqX qXLO/DATAqXqXTqXODDATAqX,rXqX,OtDATA,rXtrXqXODoDATAtrXrX,rXODATArXsXtrXTO*4uDATAsXLsXrXOLoDATALsXsXsXDO DATAsXsXLsXOTY DATAsX$tXsXO8dW DATA$tXltXsXO DATAltXtX$tXԱOFREEDATAtXtXltX,O]FREEDATAX,XXlO A DEDATA,XtXXOODATAtXX,X DATAԬXXXZ Z DATAXdXԬX\ZutpuDATAdXXXZxDATAXXdXZ DATAX DisDATAYY\YZ#ow.vDATAY4YYZ5DATA4Y|YY|Z PatDATA|YY4YZHZ DATAY Y|YZforDATA YTYYdZ5DATATYY YZFREEDATAYYTYZM+DATAY,YYZ$DATA,YtYYZ4DATAtYY,YLZ/DATAYYtYZ) DATAYLYYZDATALYYYTZDATAYYLYZportDATAY$YYZDATADATA$YlYY\Z$0DATAlYY$YZLFREEDATAYYlY[DATAZZTZ>[DATAZ,ZZ>[VDATA,ZtZZ,?[DATAtZZ,Zt?[DATAZZtZ?['DATAZLZZ@["DATALZZZ\@[DATAZZLZ@[!DATAZ$ZZ@[DATA$ZlZZDA[DATAlZZ$Z|A[DATAZZlZA[?@DATAZDZZLB[DATADZZZB[.DATAZZDZB[3K?DATAZZZTC[DATAZdZZC[FDATAdZZZD[DATAZZdZ\D[DATAZ<ZZD[R 1.DATA<ZZZD[DATAZZ<Z$E[DATAZZZ|E[,DATAZ\ZZE[&DATA\ZZZZ=Z [1`DATAD>Z>Z=Zt[1DATA>Z>ZD>Z[DATA>Z?Z>Z$[ DATA?Zd?Z>Z|[DATAd?Z?Z?Z[DATA?Z?Zd?Z \?DATA?Z<@Z?Z\Mdy sDATA<@Z@Z?Z \*DATA@Z@Z<@Zt\ZDATA@ZAZ@Z \Zp=CDATAAZ\AZ@Z\ZDATA\AZAZAZ<\ZDATAAZAZ\AZ\ewDATAAZ4BZAZ\DATA4BZ|BZAZd\DATA|BZBZ4BZ\?DATABZ CZ|BZ\DATA CZTCZBZl\MDATATCZCZ CZ\(DATACZCZTCZ\\IDATACZ,DZCZ\DATA,DZtDZCZ,\DATAtDZDZ,DZt\DATADZEZtDZ\EDATAPdZZ# o Added Support For PointLight, SpotLight and DirectionalLight using Lamps)DATA4ZZ# o Creates multi singlesided or doublesided IFSEDATAHT[Z# o Creates IndexedLineSets if DrawTypes is WIRE instead of ShadedDATA[Z#. DATA0\Z# 2003-02-03 Rick Kimball EDATA8l\Z# o attempts to catch exceptions for empty objects|wDATA\Z#elDATA0 ]Z# 2003-02-04 Rick Kimball EDATALt]Z# o fixed file overwrite problem when blender filename is all uppercaseDATA]Z#elDATA04^Z# 2003-02-08 Rick Kimball EDATAD^Z# o cleanStr() creates valid VRML DEF names even if object.nameenDATA@_Z# is zero length or uses VRML reserved names or characterslDATA_Z#gaDATAL_Z#------------------------------------------------------------------------DATAL`Z# Known Issue:DATAD`Z# o doesn't handle multiple materials (don't use material indices)DATA\ aZ# o doesn't handle multiple UV textures on a single mesh. (create a mesh for each texture)DATA aZ# o material colors need workeDATA$aZ# o spotlight softness needs workEDATALTbZ# o can't get the texture array associated with material * not the UV onesDATATbZ# o can't set smoothing, crease angle and mesh smoothing * setting not accesibleW DATAdcZ#gaDATAcZ# Still Todo:DATAcZ#DATAPdZ# - Automatically Split IFS when multiple UV textures found * warning only nowDATAHdZ# - Automatically Split IFS when combination of single vs double sidedDATAXeZ# - Automatically Split IFS when face with only 2 vertices is found should be an ILSDATA0eZ# - Export common coordinate map for split IFSDATA, fZ# - Intelligent color array vs color indexDATA,tfZ# - Support more blender objects: WorldDATA(fZ# - Figure out how to output AnimationDATA(4gZ# - Add GUI to control the following:DATA,gZ# o All/Layer/Object output radio buttonDATA(gZ# o Color per vertex toggle yes/noDATA0LhZ# o Complex/Simple VRML output radio buttonDATA4hZ# o Compressed/Uncompressed output radio buttonEDATA0iZ# o Decimal precision dropdown 1,2,3,4,5,6DATA0iZ# o IFS/Elevation Grid output radio buttonDATA$iZ# o Normals output toggle yes/noDATA$DjZ# o Proto output toggle yes/no) DATA jZ# o Verbose console progressDATAjZDATA,kZimport BlenderADATAtkZfrom Blender import NMesh..DATA kZimport mathDATAlZDATALlZ#-- module constantsREEDATAlZradD=math.pi/180.0cDATA$lZrad90=90.0*radD # for rotationDATA,4mZrad30=30.0*radD # default crease angleDATAmZDATALmZ#------------------------------------------------------------------------DATA(\nZ#-- utility functions and classes --DATALnZ#------------------------------------------------------------------------l)DATA 0:ef DATA@O print "Info: exporting camera named="+object.name)DATAO #endifDATA ԹO elfDATAXO self.writeIndented("DEF %s Viewpoint {\n" % (self.cleanStr(object.name)), 1)DATA O xpoDATADO self.writeIndented("description \"%s\" \n" % (object.name))DATA dO aFiDATAXO # get the camera location, subtract 90 degress from X to orient like VRML doesuDATA44O loc = self.rotatePointForVRML(object.loc)EEDATA@O rot = [object.RotX - 1.57, object.RotY, object.RotZ]2]DATA,O nRot = self.rotatePointForVRML(rot)DATA |O DATA4ĽO # convert to Quaternion and to Angle AxisEEDATA@,O Q = self.eulerToQuaternions(nRot[0], nRot[1], nRot[2])DATA4O Q1 = self.multiplyQuaternions(Q[0], Q[1])EEDATA0 O Qf = self.multiplyQuaternions(Q1, Q[2])DATA4tO angleAxis = self.quaternionToAngleAxis(Qf)EDATA ܿO REEDATA($O # write orientation statementDATAH|O self.writeIndented("orientation %3.2f %3.2f %3.2f %3.2f\n" %DATAXO (angleAxis[0], angleAxis[1], -angleAxis[2], angleAxis[3]))DATA |O DATA$O # write position statementEDATA<O self.writeIndented("position %3.2f %3.2f %3.2f\n" %DATA8O (loc[0], loc[1], loc[2]))DATA O DATA4DO self.writeIndented("} # Viewpoint\n", -1)EEDATA O Z DATA$O self.writeIndented("\n")DATALODATAPO #------------------------------------------------------------------------oDATA8 O def writeIndexedFaceSet(self, object, normals = 0):DATA tO if self.verbose > 0:DATADO print "Info: exporting mesh named=["+object.name+"]" DATADO #endif DATAODATA,O imageMap={} # set of used imagesDATA0,O sided={} # 'one':cnt , 'two':cntEEDATA$O vColors={} # 'multi':1EEDATAOelsDATA $O mesh=object.getData()elDATA|O DATAHO nIFSCnt=self.countIFSSetsNeeded(mesh, imageMap, sided, vColors)DATA,O DATA0dO meshName = self.cleanStr(object.name)DATA O DATAO if nIFSCnt > 1:DATAL\O self.writeIndented("DEF %s%s Group {\n" % ("G_", meshName),1)EEDATA4O self.writeIndented("children [\n",1)DATALO #endifDATA O DATA O if self.verbose > 0: DATAL4O print "DEBUG: [%s] has %d UV Textures" % (object.name, nIFSCnt)DATAO #endifDATAO DATA8 0:DATAO bTwoSided=1DATAO else:DATA4O bTwoSided=0DATA|O DATA<O self.writeIndented("DEF %s Shape {\n" % meshName,1)DATA,O DATA(dO # show script debugging infot:DATA O if self.verbose > 1:DATA$O self.meshToString(mesh)DATA(lO print "DEBUG: mesh.faces["DATA$O for face in mesh.faces:DATA(O self.faceToString(face)DATAtO #endforDATA O print "DEBUG: ]"elsDATAO #endifEDATA \O DATA$O maters=mesh.getMaterials()EDATAO hasImageTexture=0DATATO DATA0O if len(maters) > 0 or mesh.hasFaceUV():DATA@O self.writeIndented("appearance Appearance {\n", 1)dDATAlO DATAPO # right now this script can only handle a single material per mesh.DATA$= 1:lseDATA< Z mat=Blender.Material.Get(maters[0].name)cteDATAPZ self.writeMaterial(mat, self.cleanStr(maters[0].name,'mat_')).DDATA$ Z if len(maters) > 1:DATAXdZ print "Warning: mesh named %s has multiple materials" % meshNamey DATALZ print "Warning: only one material per object handled" DATAtZ #endifDATAZ else:SODATA8Z self.writeIndented("material NULL\n")DATAlZ #endif DATA Z AZIDATAZ #-- texturesDATA$TZ if mesh.hasFaceUV():DATA(Z for face in mesh.faces:DATA@Z if (hasImageTexture == 0) and (face.image):DATA@|Z self.writeImageTexture(face.image.name)DATAHZ hasImageTexture=1 # keep track of face textureDATAlZ #endifDATAĆZ #endforDATA Z #endifIDATATZ DATA8Z self.writeIndented("} # Appearance\n", -1)DATAZ #endifiDATA 1:DATA8Z self.writeIndented("] # children\n", -1)DATA4lZ self.writeIndented("} # Group\n", -1)EEDATAԞZ #endifiDATAZDATA$TZ self.writeIndented("\n")REEDATAZDATAP$Z #------------------------------------------------------------------------ DATA8Z def writeCoordinates(self, object, mesh, meshName):DATAZ #-- verticesREEDATAX\Z self.writeIndented("coord DEF %s%s Coordinate {\n" % ("coord_",meshName), 1)= 0DATA,Z self.writeIndented("point [\n", 1) DATA(LZ meshVertexList = mesh.verticesDATAZDATADZ # create vertex list and pre rotate -90 degrees X for VRMLEDATA Z mm=object.getMatrix()reDATA(tZ for vertex in meshVertexList:DATA,̳Z v=self.rotVertex(mm, vertex); DATA04Z self.writeIndented("%s %s %s,\n" %DATA8Z (round(v[0],self.vp),CDATA8Z round(v[1],self.vp),DATA8lZ round(v[2],self.vp) ))DATAԵZ #endforDATA0Z self.writeIndented("] # point\n", -1)DATA4Z self.writeIndented("} # Coordinate\n", -1)DATAZDATA0$Z self.writeIndented("coordIndex [\n", 1)DATAZ coordIndexList=[] DATA Z for face in mesh.faces:DATADATAZ #endforDATA8dZ self.writeIndented("] # texCoordIndex\n", -1)DATAZREEDATAPZ #------------------------------------------------------------------------DATA(Z def writeFaceColors(self, mesh):'DATA8Z self.writeIndented("colorPerVertex FALSE\n")DATA0LZ self.writeIndented("color Color {\n",1)DATA,Z self.writeIndented("color [\n",1) DATAZREEDATA TZ for face in mesh.faces:DATAZ if face.col:DATA Z c=face.col[0]DATA(\Z if self.verbose > 1:2DATAPZ print "Debug: face.col r=%d g=%d b=%d" % (c.r, c.g, c.b)REEDATA 1: )DATATZ print "Debug: vertex[%d].col r=%d g=%d b=%d" % (i, c.r, c.g, c.b)DATAZ #endifDATA\ZDATA(Z aColor = self.rgbToFS(c)DATA4Z self.writeIndented("%s,\n" % aColor)REEDATATZ #endforDATAZce)DATA0Z self.writeIndented("] # color\n",-1)DATA0 1:DATAHdZ self.writeIndented("#generated visible spotlight cone\n")DATADZ self.writeIndented("Transform { # Spotlight Cone\n",1)DATATTZ self.writeIndented("translation %s %s %s\n" % (round(location[0],3),ealDATATZ round(location[1],3),DATATdZ round(location[2],3)))DATA<Z rot = [object.RotX, object.RotY, object.RotZ]MeDATA0dZ nRot = self.rotatePointForVRML(rot)DATAZ DATA8Z # convert to Quaternion and to Angle AxisDATAD|Z Q = self.eulerToQuaternions(nRot[0], nRot[1], nRot[2])DATA8Z Q1 = self.multiplyQuaternions(Q[0], Q[1])DATA4\Z Qf = self.multiplyQuaternions(Q1, Q[2])DATA8Z angleAxis = self.quaternionToAngleAxis(Qf)DATA,Z DATA,tZ # write orientation statementDATAH$[ self.writeIndented("rotation %3.2f %3.2f %3.2f %3.2f\n" %DATA\[ (angleAxis[0], angleAxis[1], -angleAxis[2], angleAxis[3]))DATAZ rDATA44[ self.writeIndented("children [\n",1)DATA[ CDATA[ ch=radiusDATA(,[ br=ch*math.sin(beamWidth)DATA4[ self.writeIndented("Transform {\n",1)DATAD[ self.writeIndented("translation 0 -%s 0\n" % (ch/2))REEDATA,d[ self.writeIndented("children ")DATA4[ self.writeIndented("Collision {\n",1)BDATAH4[ self.writeIndented("collide FALSE children Shape {\n",1)0DATA\[ self.writeIndented("geometry Cone { height %s bottomRadius %s }\n" % (ch, br))DATA@D[ self.writeIndented("appearance Appearance{\n",1)(0)DATA`[ self.writeIndented("material Material { diffuseColor 1 1 1 transparency .8 }\n")DATA8T[ self.writeIndented("} # Appearance\n",-1)DATA4[ self.writeIndented("} # Shape\n",-1)DATA8$[ self.writeIndented("} # Collision\n",-1)DATAD[ self.writeIndented("} # Transform visible cone \n",-1)DATA<[ self.writeIndented("] # Spot children\n",-1).pyDATAD|[ self.writeIndented("} # SpotLight Cone Transform\n",-1)DATA[ #endif debug coneDATA$L[ self.writeIndented("\n")DATA [ DATAP[ #------------------------------------------------------------------------?DATA4t[ def writeDirectionalLight(self, object, lamp):DATA0[ safeName = self.cleanStr(object.name)DATAD[DATAP|[ intensity=min(lamp.energy/1.5, 1.0) # TBD: figure out the right valueDATA4[ (dx,dy,dz)=self.computeDirection(object)DATAl[ʵDATAH[ self.writeIndented("DEF %s DirectionalLight {\n" % safeName,1)DATAP[ self.writeIndented("ambientIntensity %s\n" % self.ambientIntensity )DATA<[ self.writeIndented("intensity %s\n" % intensity )DATA\[ self.writeIndented("direction %s %s %s\n" % (round(dx,4),round(dy,4),round(dz,4)))DATA8[ self.writeIndented("} # DirectionalLight\n",-1)DATA$[ self.writeIndented("\n")uaDATAt[DATAP[ #------------------------------------------------------------------------DATA04 [ def writePointLight(self, object, lamp):DATA0 [ safeName = self.cleanStr(object.name)DATA![״DATA [ #endifDATA>[ #endifDATA>[ #endforDATA,?[ #endifDATAt?[DATA(?[ if sided.has_key(sidename):DATA$@[ sided[sidename]+=1DATA\@[ else:DATA$@[ sided[sidename]=1DATA@[ #endifDATADA[ttoDATA|A[ if face.image:DATA@A[ faceName="%s_%s" % (face.image.name, sidename);DATALB[)DATA0B[ if imageMap.has_key(faceName):DATA4B[ imageMap[faceName].append(face)DATATC[ else:DATAHC[ imageMap[faceName]=[face.image.name,sidename,face]DATAD[ #endifDATA\D[ #endifDATAD[ #endforDATAD[_BUDATA $E[ if self.verbose > 0:DATA0|E[ for faceName in imageMap.keys():DATA(E[ ifs=imageMap[faceName]DDATAH 0:DATA8[ self.indentLevel = self.indentLevel + incDATAd[ #endifDATA[DATA0[ # Converts a Euler to three new QuaternionsDATA0L[ # Angles of Euler are passed in as radiansCDATAP[ #------------------------------------------------------------------------DATA,<[ def eulerToQuaternions(self, x, y, z):DATA4[ Qx = [math.cos(x/2), math.sin(x/2), 0, 0]DATA4 [ Qy = [math.cos(y/2), 0, math.sin(y/2), 0]DATA4t[ Qz = [math.cos(z/2), 0, 0, math.sin(z/2)]CCDATA [ DATA$$[ quaternionVec=[Qx,Qy,Qz]DATA |[ return quaternionVecDATA[ X DATA@ \ # Multiply two Quaternions together to get a new QuaternionDATAP\ #------------------------------------------------------------------------DATA, \ def multiplyQuaternions(self, Q1, Q2):DATA\t\ result = [((Q1[0] * Q2[0]) - (Q1[1] * Q2[1]) - (Q1[2] * Q2[2]) - (Q1[3] * Q2[3])),DATA\ \ ((Q1[0] * Q2[1]) + (Q1[1] * Q2[0]) + (Q1[2] * Q2[3]) - (Q1[3] * Q2[2])),tDATA\\ ((Q1[0] * Q2[2]) + (Q1[2] * Q2[0]) + (Q1[3] * Q2[1]) - (Q1[1] * Q2[3])),DATA\<\ ((Q1[0] * Q2[3]) + (Q1[3] * Q2[0]) + (Q1[1] * Q2[2]) - (Q1[2] * Q2[1]))]DATA \ DATA\ return resultDATAd\ DATA@\ # Convert a Quaternion to an Angle Axis (ax, ay, az, angle)DATA\ # angle is in radiansDATAPl\ #------------------------------------------------------------------------DATA,\ def quaternionToAngleAxis(self, Qf):DATAL\\ scale = math.pow(Qf[1],2) + math.pow(Qf[2],2) + math.pow(Qf[3],2)DATA\ ax = Qf[1]DATA,\ ay = Qf[2]DATAt\ az = Qf[3]CDATA\DATA\ if scale > .0001:DATAL\ ax/=scaleDATA\ ay/=scaleDATA\ az/=scaleDATA$ \ #endifDATA l \ DATA( \ angle = 2 * math.acos(Qf[0])DATA \ DATA(T \ result = [ax, ay, az, angle]DATA \ return resultDATA \DATAL, \#------------------------------------------------------------------------DATA \# main routineDATAL \#------------------------------------------------------------------------DATA \DATA$ \if Blender.Get('version') < 225:DATAD \ print "Warning: VRML2 export failed, wrong blender version!"DATA@ \ print " You aren't running blender version 2.25 or greater"DATAP\ print " download a newer version from http://www.blender3d.org/Download/"DATA\else:DATA,\ baseFileName=Blender.Get('filename'))rDATA(,\ if baseFileName.find('.') != -1:%x3DATA8\ dots=Blender.Get('filename').split('.')[0:-1]DATA \ else:DATA4\ dots=[baseFileName]DATA \ #endifDATA\ dots+=["wrl"]DATA\ vrmlFile=".".join(dots)DATA t\ DATA$\ wrlexport=VRML2Export(vrmlFile)DATA(\ scene = Blender.Scene.getCurrent()DATA l\ wrlexport.export (scene)DATA\#endifTXd4\zWTXwrl2export228.py\\]\\^DATA\c:\wrl2export228.pyDATA\\\,]IFREEDATA\\\\]*FREEDATA\\\\]FREEDATA\4\\T]>FREEDATA4\|\\]FREEDATA|\\4\]-FREEDATA\ \|\l]+FREEDATA \T\\]0FREEDATAT\\ \<]>FREEDATA\\T\]FREEDATA\,\\]FREEDATA,\t\\D]FREEDATAt\\,\|]FREEDATA\\t\](FREEDATA\L\\, ]6FREEDATAL\\\ ];FREEDATA\\L\ !]$FREEDATA\$\\d!]FREEDATA$\l\\!]FREEDATAl\\$\!]JFREEDATA\\l\l"]:FREEDATA\D\\"]FREEDATAD\\\#]2FREEDATA\\D\#]'FREEDATA\\\#]FREEDATA\d\\$]:FREEDATAd\\\$]FREEDATA\\d\$]FREEDATA\< \\%]JFREEDATA< \ \\%]FREEDATA \ \< \%]BFREEDATA \!\ \T&]8FREEDATA!\\!\ \&]4FREEDATA\!\!\!\4']< DATA!\!\\!\']6FREEDATA!\4"\!\(]'DATA4"\|"\!\l(] 0 PDATA|"\"\4"\(]. 0 PDATA"\ #\|"\ )]N 0 uDATA #\T#\"\)]2 0 vDATAT#\#\ #\)]D 0 WDATA#\#\T#\t*] 0 wDATA#\,$\#\*].19 .DATA,$\t$\#\+]4DATAt$\$\,$\|+]DATA$\%\t$\+]. 0 yDATA%\L%\$\,]IDATAL%\%\%\,]DATA%\%\L%\,].DATA%\$&\%\D-]ADATA$&\l&\%\-]>DATAl&\&\$&\4.]DATA&\&\l&\l.]IDATA&\D'\&\.]XDATAD'\'\&\], s,DATA2\3\2\>]#(selDATA3\\3\2\>] DATA\3\3\3\?] #DATA3\3\\3\\?]----DATA3\44\3\?] DATA44\|4\3\?]0, 0DATA|4\4\44\4@]#a neDATA4\ 5\|4\@]5----DATA 5\T5\4\@]& reDATAT5\5\ 5\LA])] * DATA5\5\T5\A],2] *DATA5\,6\5\B][2] DATA,6\t6\5\TB]2] *DATAt6\6\,6\B]#---DATA6\7\t6\B]],2)DATA7\L7\6\,C]=scaDATAL7\7\7\tC]y, aDATA7\7\L7\C]----DATA7\$8\7\C]7d, wDATA$8\l8\7\\D]6n 2.DATAl8\8\$8\D]7der.DATA8\8\l8\,E]+NameDATA8\D9\8\E]*-1] DATAD9\9\8\E] vDATA9\9\D9\4F]Iort DATA9\:\9\F]tttDATA:\d:\9\G]IDATAd:\:\:\G]PPPDATA:\:\d:\G]MtttDATA:\<;\:\\H]!DATA<;\;\:\H],DATA;\;\<;\I]QDATA;\<\;\I]QDATA<\\<\;\,J]QDATA\<\<\<\J]QDATA<\<\\<\\|=\|L]*DATA >\T>\=\L]7DATAT>\>\ >\LM]7DATA>\>\T>\M]=DATA>\,?\>\,N]DATA,?\t?\>\N]'DATAt?\?\,?\N]CDATA?\@\t?\$O]DATA@\L@\?\lO]TDATAL@\@\@\O]ZDATA@\@\L@\P]WDATA@\$A\@\Q]RDATA$A\lA\@\Q]VDATAlA\A\$A\$R]PDATAA\A\lA\R]SDATAA\DB\A\4S][DATADB\B\A\S]\DATAB\B\DB\dT]XDATAB\C\B\T]UDATAC\dC\B\U]ZDATAdC\C\C\V]XDATAC\C\dC\V]'DATAC\DATAN\\N\M\d]0DATA\N\N\N\de]=DATAN\N\\N\e]/DATAN\4O\N\Df]DDATA4O\|O\N\f]DATA|O\O\4O\g]DDATAO\ P\|O\g]DATA P\TP\O\g]*DATATP\P\ P\Lh]LDATAP\P\TP\h]P$>DATAP\,Q\P\i]TW ?DATA,Q\tQ\P\i]8eb-0DATAtQ\Q\,Q\j]DATAQ\R\tQ\dj]DATAR\LR\Q\j]]DATALR\R\R\Tk]DATAR\R\LR\k]DATAR\$S\R\k]DATA$S\lS\R\,l]DATAlS\S\$S\dl]ADATAS\S\lS\l]ADATAS\DT\S\m]---DATADT\T\S\\m]ADATAT\T\DT\m]---DATAT\U\T\ n]CADATAU\dU\T\n]DATAdU\U\U\n]Mq)?DATAU\U\dU\Do]+6DATAU\DATAdg\g\g\|] >DATAg\g\dg\Ć]1>DATAg\DATA,l\tl\k\] 1 DATAtl\l\,l\]/Uu%?DATAl\m\tl\]>DATAm\Lm\l\] DATALm\m\m\D]ODATAm\m\Lm\̍] DATAm\$n\m\$]8DATA$n\ln\m\]MDATAln\n\$n\$]#DATAn\n\ln\|]TDATAn\Do\n\$]IDATADo\o\n\]DATAo\o\Do\]DATAo\$p\o\<]5DATA$p\lp\o\]DATAlp\p\$p\]DATAp\p\lp\4]DATAp\Dq\p\] DATADq\q\p\]'DATAq\q\Dq\<]?DATAq\r\q\]?DATAr\dr\q\,]GDATAdr\r\r\]DATAr\r\dr\]DATAr\DATAy\Dz\y\L]DATADz\z\y\]DATAz\z\Dz\ܮ]DATAz\{\z\$] DATA{\d{\z\l]DATAd{\{\{\į]5DATA{\{\d{\,]DATA{\<|\{\t]<DATA<|\|\{\]DATA|\|\<|\4]=DATA|\}\|\] DATA}\\}\|\](DATA\}\}\}\l]6DATA}\}\\}\Բ]0DATA}\4~\}\<]ADATA4~\|~\}\]DATA|~\~\4~\ ]DATA~\ \|~\T].DATA \T\~\]&DATAT\\ \]DATA\\T\l]DATA\,\\]6DATA,\t\\ ]DATAt\\,\d]0DATA\\t\̶]DDATA\L\\D]DATAL\\\]DDATA\܁\L\]DATA܁\$\\\]DATA$\l\܁\]DATAl\\$\ܸ] DATA\\l\4]@DATA\D\\](DATAD\\\]DATA\ԃ\D\\]DATAԃ\\\]"DATA\d\ԃ\]4DATAd\\\T]-DATA\\d\]DATA\<\\]DATA<\\\<]4DATA\̅\<\]1DATA̅\\\ ]DATA\\\̅\T]DATA\\\\] DATA\\\\]DATA\4\\]MDATA4\|\\]7DATA|\ć\4\ ]DATAć\ \|\T]TDATA \T\ć\ܿ]*DATAT\\ \D]#DATA\\T\]DATA\,\\]BDATA,\t\\L]DATAt\\,\]%DATA\\t\])DATA\L\\d].DATAL\\\]4DATA\܊\L\4]4DATA܊\$\\]6DATA$\l\܊\]DATAl\\$\L]-DATA\\l\]2DATA\D\\]DATAD\\\T]/DATA\Ԍ\D\]DATAԌ\\\]DATA\d\Ԍ\l]DATAd\\\]&DATA\\d\ ]2DATA\<\\t]1DATA<\\\]DATA\̎\<\$]1DATA̎\\\]DATA\\\̎\]2DATA\\\\<]DATA\\\\t]MDATA\4\\],DATA4\|\\d]DATA|\Đ\4\]DATAĐ\ \|\] DATA \T\Đ\L]DATAT\\ \]DATA\\T\]&DATA\,\\4]&DATA,\t\\]/DATAt\\,\]DATA\\t\<]DATA\L\\]#DATAL\\\]DATA\ܓ\L\$]DATAܓ\$\\\]?DATA$\l\ܓ\]*DATAl\\$\<]*DATA\\l\])DATA\D\\ ]CDATAD\\\]HDATA\ԕ\D\ ]DATAԕ\\\T]-DATA\d\ԕ\]0DATAd\\\$]DATA\\d\\]2DATA\<\\]DATA<\\\ ]*DATA\̗\<\t]>DATA̗\\\]#DATA\\\̗\D]5DATA\\\\]DATA\\\\]DATA\4\\L]DATA4\|\\]5DATA|\ę\4\]DATAę\ \|\4]MDATA \T\ę\]$DATAT\\ \]4DATA\\T\|]/DATA\,\\])DATA,\t\\L]DATAt\\,\]DATA\\t\]DATA\L\\4]DATAL\\\]$DATA\ܜ\L\]LDATAܜ\$\\l]DATA$\l\ܜ\]DATAl\\$\](DATA\\l\T]4DATA\D\\]DATAD\\\]DATA\Ԟ\D\<],DATAԞ\\\],DATA\d\Ԟ\ ]DATAd\\\D]MDATA\\d\]&DATA\<\\$]3DATA<\\\]/DATA\̠\<\])DATA̠\\\\]DATA\\\̠\](DATA\\\\]/DATA\\\\d] DATA\4\\]QDATA4\|\\D]DATA|\Ģ\4\]DATAĢ\ \|\]$DATA \T\Ģ\]0DATAT\\ \]DATA\\T\]DATA\,\\],DATA,\t\\l],DATAt\\,\]DATA\\t\ ]MDATA\L\\]*DATAL\\\]4DATA\ܥ\L\d]*DATAܥ\$\\]=DATA$\l\ܥ\D]%DATAl\\$\]DATA\\l\]DATA\D\\,]DATAD\\\d] DATA\ԧ\D\]DATAԧ\\\]DATA\d\ԧ\L]QDATAd\\\]UDATA\\d\\]"DATA\<\\]DATA<\\\ ]DATA\̩\<\d]DATA̩\\\]DATA\\\̩\]DATA\\\\L]GDATA\\\\]4DATA\4\\,]hDATA4\|\\] DATA|\ī\4\,]2DATAī\ \|\]4DATA \T\ī\] DATAT\\ \T]5DATA\\T\]_DATA\,\\T]!DATA,\t\\]6DATAt\\,\]_DATA\\t\]!DATA\L\\]+DATAL\\\l]7DATA\ܮ\L\]!DATAܮ\$\\,].DATA$\l\ܮ\]4DATAl\\$\] DATA\\l\T]/DATA\D\\]DATAD\\\]MDATA\԰\D\|]&DATA԰\\\]'DATA\d\԰\,]HDATAd\\\]$DATA\\d\ ]DATA\<\\T] DATA<\\\]ZDATA\̲\<\4]5DATA̲\\\]8DATA\\\̲\]#DATA\\\\l]DATA\\\\]DATA\4\\]MDATA4\|\\t]+DATA|\Ĵ\4\]-DATAĴ\ \|\D]DATA \T\Ĵ\|]&DATAT\\ \]LDATA\\T\\]DATA\,\\],DATA,\t\\]!DATAt\\,\T]DATA\\t\]0DATA\L\\]*DATAL\\\\]*DATA\ܷ\L\]*DATAܷ\$\\,]DATA$\l\ܷ\] DATAl\\$\]-DATA\\l\4].DATA\D\\]?DATAD\\\^3DATA\Թ\D\|^9DATAԹ\\\^]DATA\d\Թ\^bDATAd\\\$^TDATA\\d\^@DATA\<\\$^:DATA<\\\^:DATA\̻\<\^;DATA̻\\\^IDATA\\\̻\^IDATA\\\\^JDATA\\\\$^0DATA\4\\^DATA4\|\\^BDATA|\Ľ\4\<^DATAĽ\ \|\^EDATA \T\Ľ\ ^BDATAT\\ \^PDATA\\T\ ^PDATA\,\\ ^QDATA,\t\\ ^9DATAt\\,\ ^/DATA\\t\ ^ DATA\L\\D ^5DATAL\\\ ^CDATA\\L\$ ^5DATA\$\\ ^3DATA$\l\\ ^6DATAl\\$\\ ^ DATA\\l\ ^)DATA\D\\ ^EDATAD\\\^YDATA\\D\^ DATA\\\d^0DATA\d\\^ DATAd\\\^DATA\\d\\^%DATA\<\\^1DATA<\\\^@DATA\\<\^+DATA\\\^1DATA\\\\d^DDATA\\\\^ZDATA\\\\t^<DATA\4\\^\DATA4\|\\^5DATA|\\4\^0DATA\ \|\T^4DATA \T\\^BDATAT\\ \4^8DATA\\T\^CDATA\,\\$^DATA,\t\\|^ DATAt\\,\^DATA\\t\^MDATA\L\\^2DATAL\\\ ^-DATA\\L\t^DATA\$\\^MDATA$\l\\4^0DATAl\\$\^DATA\\l\^FDATA\D\\L^LDATAD\\\^9DATA\\D\L^ZDATA\\\^7DATA\d\\L^ DATAd\\\^DATA\\d\^MDATA\<\\d^,DATA<\\\^-DATA\\<\4^DATA\\\l^DATA\\\\^-DATA\\\\, ^LDATA\\\\ ^DATA\4\\ ^DATA4\|\\D!^@DATA|\\4\!^LDATA\ \|\D"^9DATA \T\\"^IDATAT\\ \D#^IDATA\\T\#^JDATA\,\\T$^3DATA,\t\\$^1DATAt\\,\$%^ DATA\\t\|%^DATA\L\\%^MDATAL\\\<&^"DATA\\L\&^2DATA\$\\&^/DATA$\l\\d'^=DATAl\\$\'^5DATA\\l\D(^ DATA\D\\(^DATAD\\\(^MDATA\\D\\)^DATA\\\)^MDATA\d\\<*^DATAd\\\t*^-DATA\\d\*^ZDATA\<\\t+^DATA<\\\+^DATA\\<\+^DATA\\\L,^DATA\\\\,^2DATA\\\\ -^DATA\\\\T-^(DATA\4\\-^-DATA4\|\\$.^DATA|\\4\l.^DATA\ \|\.^CDATA \T\\,/^*DATAT\\ \/^DATA\\T\/^DATA\,\\0^BDATA,\t\\0^,DATAt\\,\0^DATA\\t\<1^DATA\L\\t1^ADATAL\\\1^ DATA\\L\42^IDATA\$\\2^CDATA$\l\\43^8DATAl\\$\3^DATA\\l\3^0DATA\D\\\4^3DATAD\\\4^+DATA\\D\,5^PDATA\\\5^ DATA\d\\5^DATAd\\\D6^DATA\\d\6^DATA\<\\6^DATA<\\\7^DATA\\<\d7^DATA\\\7^DATA\\\\8^PDATA\\\\8^DATA\\\\8^DATA\4\\<9^DATA4\|\\9^DATA|\\4\9^DATA\ \|\:^,DATA \T\\|:^'DATAT\\ \:^ DATA\\T\,;^%DATA\,\\;^CDATA,\t\\;^.DATAt\\,\d<^DATA\\t\<^DATA\L\\=^DATAL\\\\=^DATA\\L\=^DATA\$\\=^'DATA$\l\\4>^"DATAl\\$\>^DATA\\l\>^!DATA\D\\,?^DATAD\\\t?^DATA\\D\?^DATA\\\p^?DATA\d\\p^DATAd\\\p^.DATA\\d\,q^3DATA\<\\q^DATA<\\\q^FDATA\\<\Tr^DATA\\\r^DATA\\\\r^DATA\\\\,s^DATA\\\\ds^DATA\4\\s^,DATA4\|\\$t^&DATA|\\4\|t^EDATA\ \|\t^<DATA \T\\lu^DATAT\\ \u^DATA\\T\u^DATA\,\\4v^#DATA,\t\\v^DATAt\\,\v^ DATA\\t\w^<DATA\L\\w^HDATAL\\\x^0DATA\\L\x^DATA\$\\x^DATA$\l\\y^<DATAl\\$\|y^LDATA\\l\z^-DATA\D\\lz^DATAD\\\z^DATA\\D\z^<DATA\$\\d{^6DATA$\l\\{^,DATAl\\$\4|^ DATA\\l\||^DATA\D\\|^DATAD\\\|^:DATA\\D\t}^DATA\\\}^ADATA\d\\4~^DATAd\\\l~^/DATA\\d\~^DATA\<\\,^DATA<\\\t^!DATA\\<\^(DATA\\\4^!DATA\\\\^DATA\\\\Ԁ^DATA\\\\^DATA\4\\d^DATA4\|\\^DATA|\\4\^DATA\ \|\,^ DATA \T\\^?DATAT\\ \^;DATA\\T\t^IDATA\,\\^6DATA,\t\\d^6DATAt\\,\̄^>DATA\\t\D^DATA\L\\|^DATAL\\\ԅ^DATA\\L\,^%DATA\$\\^%DATA$\l\\܆^%DATAl\\$\4^DATA\\l\|^DATA\D\\^'DATAD\\\ ^%DATA\\D\d^8DATA\\\܈^DATA\d\\^DATAd\\\\^ DATA\\d\^(DATA\<\\ ^(DATA<\\\t^DATA\\<\^DATA\\\^*DATA\\\\\^ DATA\\\\^*DATA\\\\ ^DATA\4\\D^DATA4\|\\^*DATA|\\4\^*DATA\ \|\\^ DATA \T\\^DATAT\\ \܍^DATA\\T\4^DATA\,]\|^DATA,]t]\^EDATAt]],],^MDATA]]t]^$DATA]L]]$^DATAL]]]l^DATA]]L]^DATA]$]]^DATA$]l]]D^DATAl]]$]^DATA]]l]^DATA]D]],^DATAD]]]^DATA]]D]ܢ^?DATA]]]T^@DATA]d]]̣^BDATAd]]]D^DATA]]d]^DATA]<]]^DATA<]]]^&DATA]]<]t^DATA]]]^5DATA]\]]$^DATA\]]]l^DATA]]\]^DATA]4]]^*DATA4]|]]T^#DATA|]]4]^DATA] ]|]^#DATA ]T]]L^DATAT]] ]^DATA]]T]̨^5DATA], ]]4^DATA, ]t ]]|^DATAt ] ], ]^/DATA ] ]t ]^.DATA ]L ] ]^MDATAL ] ] ] ^*DATA ] ]L ]t^1DATA ]$ ] ]ܫ^1DATA$ ]l ] ]D^1DATAl ] ]$ ]^DATA ] ]l ]^ DATA ]D ] ]L^DATAD ] ] ]^DATA ] ]D ]ܭ^?DATA ] ] ]T^MDATA ]d ] ]ܮ^*DATAd ] ] ]D^ZDATA ] ]d ]ܯ^ZDATA ]<] ]t^ZDATA<]] ] ^ZDATA]]<]^DATA]]]^DATA]\]]4^DATA\]]]l^?DATA]]\]^DATA]4]]<^MDATA4]|]]ij^(DATA|]]4],^IDATA] ]|]^DATA ]T]]^DATAT]] ]D^DATA]]T]^DATA],]]ĵ^DATA,]t]]^DATAt]],]d^DATA]]t]^DATA]L]]^DATAL]]]<^DATA]]L]^$DATA]$]]ܷ^DATA$]l]]$^$DATAl]]$]|^DATA]]l]ĸ^DATA]D]]^IDATAD]]]^DATA]]D]̹^IDATA]]]T^DATA]d]]^ DATAd]]]^@DATA]]d]\^?DATA]<]]Ի^>DATA<]]]L^DATA]]<]^(DATA]]]^$DATA]\]]D^5DATA\]]]^ DATA]]\]^DATA]4]]L^ DATA4]|]]^DATA|]]4]ܾ^DATA] ]|]4^DATA ]T]]|^#DATAT]] ]Կ^&DATA]]T],^DATA]]^DATAL,]#------------------------------------------------------------------------pDATA,]# VRML2 exporter for blender 2.25 or aboveaDATA]#DATA@T]# $Id: wrl2export.py,v 1.28 2003/07/19 23:42:22 kimballr Exp $DATA]#DATA0]# Authors: Rick Kimball with much inspirationDATA,l]# from the forum at www.elysiun.comDATA4]# and irc://irc.freenode.net/blenderchatREEDATA@<]# Ken Miller and Steve Matthews (Added Camera Support)rDATA]#DATA ]# Contact: rick@vrmlworld.netDATAD]#DATA|]# To use script:REEDATA,]# 1.) load this file in the text window.DATA8, ]# (press SHIFT+F11, Open New via Datablock button)DATA< ]# 2.) make sure your mouse is over the text edit window andDATA( !]# run this script. (press ALT+P)DATAd!]#20DATA !]# Notes:|\|DATAL!]# a.) output filename is same as current blender file with .wrl extension5DATA<l"]# b.) error messages go to the Blender DOS console windowuDATA"]#23DATA4#]# The latest version of this python export script:EDATA(#]# http://blender.kimballsoftware.com/DATA#]#DATA<$]# If you like this script, try using http://vrmlworld.net/uDATA $]# to show off your VRML world. DATA$]#23DATAL%]# 2003-07-19 by Rick Kimball - made compatible with new Python API in 2.288DATA%]#03DATAD%]# 2003-01-16 by Ken Miller - with math help from Steve Matthews :)FDATA<T&]# o Added support for exporting cameras out of Blender uDATA8&]# o Sets the name of the camera as the object nameDATA@4']# o sets the description of the camera as the object name,DATA8']# which should be modified to something meaningfulDATA((]# o sets the position and orientationDATAl(]#16DATA0(]# 2003-01-19 Rick Kimball DATAP )]# o Added Support For PointLight, SpotLight and DirectionalLight using LampsDATA4)]# o Creates multi singlesided or doublesided IFSEDATAH)]# o Creates IndexedLineSets if DrawTypes is WIRE instead of ShadedDATAt*]#04DATA0*]# 2003-02-03 Rick Kimball DATA8+]# o attempts to catch exceptions for empty objectsDATA|+]#DATA0+]# 2003-02-04 Rick Kimball DATAL,]# o fixed file overwrite problem when blender filename is all uppercaseDATA,]#DATA0,]# 2003-02-08 Rick Kimball DATADD-]# o cleanStr() creates valid VRML DEF names even if object.nameDATA@-]# is zero length or uses VRML reserved names or charactersDATA4.]#DATALl.]#------------------------------------------------------------------------DATA.]# Known Issue:DATAD]def rad2deg(v):DATA$>] return round(v*180.0/math.pi,4)DATA>] DATA?]def deg2rad(v):DATA \?] return (v*math.pi)/180.0;DATA?]Qy DATA?]class DrawTypes:turDATA$4@] """Object DrawTypes enum valuesDATA8@] BOUNDS - draw only the bounding box of the objectDATA(@] WIRE - draw object as a wire frameDATA,LA] SOLID - draw object with flat shadingDATA0A] SHADED - draw object with OpenGL shadingDATAB]"""DATATB] BOUNDBOX = 1onDATAB] WIRE = 2 DATAB] SOLID = 3 =DATA,C] SHADED = 4 DATAtC] TEXTURE = 5--DATAC]if DATA8C]#------------------------------------------------------DATA8\D]# the Blender.Object class seems to be missing this...DATA8D]#------------------------------------------------------DATA,,E]if not hasattr(Blender.Object,'DrawTypes'):DATA,E] Blender.Object.DrawTypes = DrawTypes()DATAE]porDATAL4F]#------------------------------------------------------------------------DATAF]#-- VRML2Export --DATALG]#------------------------------------------------------------------------DATAG]class VRML2Export:DATAPG] #------------------------------------------------------------------------DATA$\H] def __init__(self, filename):EEDATA0H] #--- public you can change these ---REEDATATI] self.verbose=1 # level of verbosity in console 0-none, 1-some, 2-mostDATATI] self.cp=3 # decimals for material color values 0.000 - 1.000DATAT,J] self.vp=3 # decimals for vertex coordinate values 0.000 - n.000DATATJ] self.tp=3 # decimals for texture coordinate values 0.000 - 1.000DATA$DATA<i] (object.name,object.getType())--DATAj] #endifDATA dj] except ValueError: DATA`j] print "object named %s has problem with accessing an attribute" % object.nameDATATk] #end try1:1DATAk] #endforDATAk] self.cleanup()2DATA,l]--DATAdl] def cleanup(self):rDATAl] self.file.close()DATAm] self.texNames={}DATA\m] self.matNames={}DATAm] self.indentLevel=0DATAD n] print "Info: finished VRML2 export to %s\n" % self.filenameDATAn]g-0DATAPn] #------------------------------------------------------------------------DATA,Do] # Writes out camera info as a viewpointDATA$o] # Handles orientation, positionDATA0p] # Use camera object name to set descriptionDATAPlp] #------------------------------------------------------------------------ADATA(p] def writeCameraInfo(self, object):>DATA Lq] if self.verbose > 0:DATA@q] print "Info: exporting camera named="+object.name:0DATAr] #endif5DATA dr] DATAXr] self.writeIndented("DEF %s Viewpoint {\n" % (self.cleanStr(object.name)), 1)DATA 4s] DATAD|s] self.writeIndented("description \"%s\" \n" % (object.name))DATA s] DATAX 0:DATAD\~] print "Info: exporting mesh named=["+object.name+"]"G3?DATA~] #endif?DATA]DATA,T] imageMap={} # set of used imagesDATA0] sided={} # 'one':cnt , 'two':cntDATA$$] vColors={} # 'multi':1>DATA|]DATA ] mesh=object.getData()>DATA ]DATAHD] nIFSCnt=self.countIFSSetsNeeded(mesh, imageMap, sided, vColors)DATA] DATA0] meshName = self.cleanStr(object.name)DATA \] DATA] if nIFSCnt > 1:DATAL] self.writeIndented("DEF %s%s Group {\n" % ("G_", meshName),1)>DATA4t] self.writeIndented("children [\n",1)DATA܃] #endifDATA $] DATA l] if self.verbose > 0:DATALĄ] print "DEBUG: [%s] has %d UV Textures" % (object.name, nIFSCnt)DATAL] #endif DATA]?DATA8̅] if sided.has_key('two') and sided['two'] > 0:DATA4] bTwoSided=1DATA|] else:DATAĆ] bTwoSided=0DATA ]DATA<D] self.writeIndented("DEF %s Shape {\n" % meshName,1)DATA] DATA(] # show script debugging infoDATA L] if self.verbose > 1:DATA$] self.meshToString(mesh)DATA(] print "DEBUG: mesh.faces[" DATA$T] for face in mesh.faces:DATA(] self.faceToString(face)DATA] #endforDATA L] print "DEBUG: ]"0:1DATA] #endif2DATA ] DATA 4] maters=mesh.materialsDATA] hasImageTexture=0DATA]DATA0] if len(maters) > 0 or mesh.hasFaceUV():DATA@] self.writeIndented("appearance Appearance {\n", 1)DATA] DATAPD] # right now this script can only handle a single material per mesh.DATA$̍] if len(maters) >= 1:DATA<$] mat=Blender.Material.Get(maters[0].name)DATAP] self.writeMaterial(mat, self.cleanStr(maters[0].name,'mat_'))DATA$$] if len(maters) > 1:DATAX|] print "Warning: mesh named %s has multiple materials" % meshNameDATAL$] print "Warning: only one material per object handled"DATA] #endifDATA] else:DATA8<] self.writeIndented("material NULL\n")DATA] #endifDATA ] DATA4] #-- texturesDATA$] if mesh.hasFaceUV():DATA(] for face in mesh.faces:DATA@<] if (hasImageTexture == 0) and (face.image):DATA@] self.writeImageTexture(face.image.name)DATAH,] hasImageTexture=1 # keep track of face textureDATA] #endifDATA] #endforDATAD] #endifDATA]DATA8ĥ] self.writeIndented("} # Appearance\n", -1)DATA,] #endifDATAt]DATAP] #-------------------------------------------------------------------DATA 4] #--DATA0|] #-- IndexedFaceSet or IndexedLineSetDATA ] #DATA,]DATA,d] # check if object is wireframe onlyDATA@̨] if object.drawType == Blender.Object.DrawTypes.WIRE:DATALD] # user selected WIRE=2 on the Drawtype=Wire on (F9) Edit pageDATA(̩] ifStyle="IndexedLineSet"DATA$] else:DATAHl] # user selected BOUNDS=1, SOLID=3, SHARED=4, or TEXTURE=5DATA(] ifStyle="IndexedFaceSet"DATA<] #endifDATA ] DATA<̫] self.writeIndented("geometry %s {\n" % ifStyle, 1)DATA@D] if object.drawType != Blender.Object.DrawTypes.WIRE:DATA ] if bTwoSided == 1:DATA@] self.writeIndented("solid FALSE # two sided\n")DATA] else:DATA@ԭ] self.writeIndented("solid TRUE # one sided\n")DATAL] #endifDATA] #endifDATA ܮ] DATA$] #---DATA l] #--- output coordinatesDATA8į] self.writeCoordinates(object, mesh, meshName)DATA ,] DATA@t] if object.drawType != Blender.Object.DrawTypes.WIRE:DATA] #---DATA@4] #--- output textureCoordinates if UV texture usedDATA$] if mesh.hasFaceUV():DATA,] if hasImageTexture == 1:DATA8l] self.writeTextureCoordinates(mesh)DATA4Բ] if vColors.has_key('multi'):REEDATAD<] self.writeVertexColors(mesh) # experimentDATA] #endifDATA ] else:DATA0T] self.writeFaceColors(mesh)DATA(] #endif hasImageTextureDATA ] #endif hasFaceUVDATAl]DATA8] # TBD: figure out how to get this properlyDATA ] if self.smooth:DATA4d] creaseAngle=self.defCreaseAngle;DATAH̶] self.writeIndented("creaseAngle %s\n" % creaseAngle)DATAD] else:DATAH] self.writeIndented("creaseAngle 0.0 # in radians\n")DATA ] #endif mesh.smoothDATA\] #endif WIREDATA]DATA$ܸ] #--- output vertexColorsDATAD4] if mesh.hasVertexColours() and vColors.has_key('multi'):DATA,] self.writeVertexColors(mesh)شDATA] #endifDATA\]DATA$] #--- output closing bracesDATA8] self.writeIndented("} # %s\n" % ifStyle, -1)DATA0T] self.writeIndented("} # Shape\n", -1)DATA]DATA] if nIFSCnt > 1:DATA8<] self.writeIndented("] # children\n", -1)DATA4] self.writeIndented("} # Group\n", -1)DATA ] #endifDATAT]DATA$] self.writeIndented("\n")DATA]DATAP] #------------------------------------------------------------------------DATA8] def writeCoordinates(self, object, mesh, meshName):DATA ] #-- verticesDATAXT] self.writeIndented("coord DEF %s%s Coordinate {\n" % ("coord_",meshName), 1)DATA,ܿ] self.writeIndented("point [\n", 1) DATA$D] meshVertexList = mesh.vertsDATA]DATAD] # create vertex list and pre rotate -90 degrees X for VRMLDATA L] mm=object.getMatrix()DATA(] for vertex in meshVertexList:DATA,] v=self.rotVertex(mm, vertex);DATA0d] self.writeIndented("%s %s %s,\n" %DATA8] (round(v[0],self.vp),DATA84] round(v[1],self.vp),\}DATA8] round(v[2],self.vp) ))DATA] #endforDATA0L] self.writeIndented("] # point\n", -1)DATA4] self.writeIndented("} # Coordinate\n", -1)DATA]DATA0T] self.writeIndented("coordIndex [\n", 1)DATA] coordIndexList=[] DATA ] for face in mesh.faces:DATAl] cordStr=""DATA(] for i in range(len(face)):DATA4 ] indx=meshVertexList.index(face[i])DATA4t] cordStr = cordStr + "%s, " % indxDATA] #endforDATA4$] self.writeIndented(cordStr + "-1,\n")DATA] #endforDATA4] self.writeIndented("] # coordIndex\n", -1)DATA<]DATAPt] #------------------------------------------------------------------------DATA0] def writeTextureCoordinates(self, mesh):DATAd] texCoordList=[] DATA] texIndexList=[]DATA ] j=0DATAL]DATA ] for face in mesh.faces:DATA(] for i in range(len(face)):DATA(4] texIndexList.append(j)DATA0] texCoordList.append(face.uv[i])DATA] j=j+1DATA<] #endforDATA$] texIndexList.append(-1)DATA] #endforDATA$]DATA@\] self.writeIndented("texCoord TextureCoordinate {\n", 1)DATA,] self.writeIndented("point [\n", 1) DATA,<] for i in range(len(texCoordList)):DATA,] self.writeIndented("%s %s," %W DATAD ] (round(texCoordList[i][0],self.tp), DATAL] round(texCoordList[i][1],self.tp))+"\n")DATA ] #endforDATA0T] self.writeIndented("] # point\n", -1)DATA4] self.writeIndented("} # texCoord\n", -1)DATA$]DATA4\] self.writeIndented("texCoordIndex [\n", 1)DATA] texIndxStr=""DATA, ] for i in range(len(texIndexList)):DATA@t] texIndxStr = texIndxStr + "%d, " % texIndexList[i]DATA$] if texIndexList[i]==-1:DATA8D] self.writeIndented(texIndxStr + "\n")}DATA ] texIndxStr=""DATA] #endifDATAL] #endforDATA8] self.writeIndented("] # texCoordIndex\n", -1)}DATA]DATAP4] #------------------------------------------------------------------------DATA(] def writeFaceColors(self, mesh):DATA8] self.writeIndented("colorPerVertex FALSE\n")\}DATA0|] self.writeIndented("color Color {\n",1)DATA,] self.writeIndented("color [\n",1)DATAL]DATA ] for face in mesh.faces:DATA] if face.col:DATA 4] c=face.col[0]DATA(] if self.verbose > 1:DATAP] print "Debug: face.col r=%d g=%d b=%d" % (c.r, c.g, c.b)DATAl] #endifDATA]DATA,] aColor = self.rgbToFS(c)DATA8T] self.writeIndented("%s,\n" % aColor)\}DATA] #endforDATA]DATA0<] self.writeIndented("] # color\n",-1)DATA0] self.writeIndented("} # Color\n",-1)DATA ]DATAPD] #------------------------------------------------------------------------DATA(] def writeVertexColors(self, mesh):DATA4$] self.writeIndented("colorPerVertex TRUE\n")DATA0] self.writeIndented("color Color {\n",1)DATA,] self.writeIndented("color [\n",1)DATA\]DATA,] for i in range(len(mesh.verts)):(DATA0] c=self.getVertexColorByIndx(mesh,i)DATA$d] if self.verbose > 1:DATAT] print "Debug: vertex[%d].col r=%d g=%d b=%d" % (i, c.r, c.g, c.b)DATAD] #endifDATA]DATA(] aColor = self.rgbToFS(c)DATA4] self.writeIndented("%s,\n" % aColor)REEDATA] #endforDATA]DATA0] self.writeIndented("] # color\n",-1)DATA0l] self.writeIndented("} # Color\n",-1)DATA]DATAP ] #------------------------------------------------------------------------DATA,] def writeMaterial(self, mat, matName):DATA8] # look up material name, use it if availableDATA,d] if self.matNames.has_key(matName):DATA@] self.writeIndented("material USE %s\n" % matName)DATA(D] self.matNames[matName]+=1DATA] return;DATA] #endifDATA,]DATA$d] self.matNames[matName]=1DATA]DATA] ambient = mat.ambDATATL] diffuseR, diffuseG, diffuseB = mat.rgbCol[0], mat.rgbCol[1],mat.rgbCol[2]DATAX] emisR, emisG, emisB = diffuseR*mat.emit, diffuseG*mat.emit, diffuseB*mat.emitDATA$\] shininess = mat.hard/255.0DATA ] specR = mat.specCol[0]DATA ] specG = mat.specCol[1]DATA d] specB = mat.specCol[2]DATA ] transp = 1-mat.alphaDATA]DATAHL] self.writeIndented("material DEF %s Material {\n" % matName, 1)DATA8] self.writeIndented("diffuseColor %s %s %s" %DATAl,] (round(diffuseR,self.cp), round(diffuseG,self.cp), round(diffuseB,self.cp)) +DATA$] "\n")DATA4,] self.writeIndented("ambientIntensity %s" %DATA8] (round(ambient,self.cp))+DATA$] "\n")DATA8T] self.writeIndented("specularColor %s %s %s" %DATA`] (round(specR,self.cp), round(specG,self.cp), round(specB,self.cp)) +DATA$T] "\n" )DATA8] self.writeIndented("emissiveColor %s %s %s" %DATA`] (round(emisR,self.cp), round(emisG,self.cp), round(emisB,self.cp)) +DATA$] "\n" )DATA,] self.writeIndented("shininess %s" %DATA8l] (round(shininess,self.cp)) +DATA$] "\n" )DATA0,] self.writeIndented("transparency %s" %DATA8] (round(transp,self.cp)) +DATA$] "\n")DATA0T] self.writeIndented("} # Material\n",-1)DATA]DATAP] #------------------------------------------------------------------------DATA(|] def writeImageTexture(self, name):DATA(] if self.texNames.has_key(name):DATAL,] self.writeIndented("texture USE %s\n" % self.cleanStr(name))DATA(] self.texNames[name] += 1DATA ] returnDATAT] else:DATA\] self.writeIndented("texture DEF %s ImageTexture {\n" % self.cleanStr(name), 1)DATA84] self.writeIndented("url \"%s\"\n" % name)DATA<] self.writeIndented("} # ImageTexture \n",-1)DATA$] self.texNames[name] = 1DATAl] #endifDATA]DATAP] #------------------------------------------------------------------------DATA,t] def writeSpotLight(self, object, lamp):DATA0] safeName = self.cleanStr(object.name)DATAD]DATA(|] # compute cutoff and beamwidthDATAP] intensity=min(lamp.energy/1.5,1.0) # TBD: figure out the right valueDATA\]DATA0] beamWidth=deg2rad(lamp.spotSize)*.5;DATA$] cutOffAngle=beamWidth*.99DATAT]DATA4] (dx,dy,dz)=self.computeDirection(object)DATA,] # note -dx seems to equal om[3][0]DATA,\] # note -dz seems to equal om[3][1]DATA,] # note dy seems to equal om[3][2]DATA ,] om = object.getMatrix()DATA] DATA0] location=self.rotVertex(om, (0,0,0));DATA04] radius = lamp.dist*math.cos(beamWidth)DATA@] self.writeIndented("DEF %s SpotLight {\n" % safeName,1)DATA4^ self.writeIndented("radius %s\n" % radius )DATA<|^ self.writeIndented("intensity %s\n" % intensity )DATA`^ self.writeIndented("beamWidth %s # lamp.spotSize %s\n" % (beamWidth, lamp.spotSize) )DATAd^ self.writeIndented("cutOffAngle %s # lamp.spotBlend %s\n" % (cutOffAngle, lamp.spotBlend))DATAX$^ self.writeIndented("direction %s %s %s # lamp.RotX=%s RotY=%s RotZ=%s\n" % \DATAD^ (round(dx,3),round(dy,3),round(dz,3),DATA<$^ round(rad2deg(object.RotX),3),DATA<^ round(rad2deg(object.RotY),3),DATA<^ round(rad2deg(object.RotZ),3)))DATAL^ self.writeIndented("location %s %s %s\n" % (round(location[0],3),DATAL^ round(location[1],3),DATAL^ round(location[2],3)))DATA4$^ self.writeIndented("} # SpotLight\n",-1)DATA^DATAD^ # export a cone that matches the spotlight in verbose modeDATA <^ if self.verbose > 1:DATAH^ self.writeIndented("#generated visible spotlight cone\n")DATAD ^ self.writeIndented("Transform { # Spotlight Cone\n",1)DATAT^ self.writeIndented("translation %s %s %s\n" % (round(location[0],3),DATAT ^ round(location[1],3),DATAT ^ round(location[2],3)))DATA< ^ rot = [object.RotX, object.RotY, object.RotZ]DATA0 ^ nRot = self.rotatePointForVRML(rot)DATA ^ DATA8D ^ # convert to Quaternion and to Angle AxisDATAD ^ Q = self.eulerToQuaternions(nRot[0], nRot[1], nRot[2])DATA8$ ^ Q1 = self.multiplyQuaternions(Q[0], Q[1])DATA4 ^ Qf = self.multiplyQuaternions(Q1, Q[2])DATA8 ^ angleAxis = self.quaternionToAngleAxis(Qf)DATA\ ^ DATA, ^ # write orientation statementDATAH ^ self.writeIndented("rotation %3.2f %3.2f %3.2f %3.2f\n" %DATA\^ (angleAxis[0], angleAxis[1], -angleAxis[2], angleAxis[3]))DATA^ DATA4d^ self.writeIndented("children [\n",1)DATA^ DATA^ ch=radiusDATA(\^ br=ch*math.sin(beamWidth) DATA4^ self.writeIndented("Transform {\n",1)DATAD^ self.writeIndented("translation 0 -%s 0\n" % (ch/2))DATA,^ self.writeIndented("children ")DATA4^ self.writeIndented("Collision {\n",1)DATAHd^ self.writeIndented("collide FALSE children Shape {\n",1)DATA\^ self.writeIndented("geometry Cone { height %s bottomRadius %s }\n" % (ch, br))DATA@t^ self.writeIndented("appearance Appearance{\n",1)DATA`^ self.writeIndented("material Material { diffuseColor 1 1 1 transparency .8 }\n")DATA8^ self.writeIndented("} # Appearance\n",-1)DATA4^ self.writeIndented("} # Shape\n",-1)DATA8T^ self.writeIndented("} # Collision\n",-1)DATAD^ self.writeIndented("} # Transform visible cone \n",-1)DATA<4^ self.writeIndented("] # Spot children\n",-1)DATAD^ self.writeIndented("} # SpotLight Cone Transform\n",-1)DATA$^ #endif debug coneDATA$|^ self.writeIndented("\n")DATA ^ DATAP^ #------------------------------------------------------------------------DATA4^ def writeDirectionalLight(self, object, lamp):DATA0 ^ safeName = self.cleanStr(object.name)DATAt^DATAP^ intensity=min(lamp.energy/1.5, 1.0) # TBD: figure out the right valueDATA44^ (dx,dy,dz)=self.computeDirection(object)DATA^DATAH^ self.writeIndented("DEF %s DirectionalLight {\n" % safeName,1)DATAPL^ self.writeIndented("ambientIntensity %s\n" % self.ambientIntensity )DATA<^ self.writeIndented("intensity %s\n" % intensity )DATA\L^ self.writeIndented("direction %s %s %s\n" % (round(dx,4),round(dy,4),round(dz,4)))DATA8^ self.writeIndented("} # DirectionalLight\n",-1)DATA$L^ self.writeIndented("\n")DATA^DATAP^ #------------------------------------------------------------------------DATA0d^ def writePointLight(self, object, lamp):DATA0^ safeName = self.cleanStr(object.name)DATA4^DATA l^ om = object.getMatrix()DATA0^ location=self.rotVertex(om, (0,0,0));DATAP, ^ intensity=min(lamp.energy/1.5,1.0) # TBD: figure out the right valueDATA ^DATA ^ radius = lamp.distDATADD!^ self.writeIndented("DEF %s PointLight {\n" % safeName,1)DATAP!^ self.writeIndented("ambientIntensity %s\n" % self.ambientIntensity )DATA<D"^ self.writeIndented("intensity %s\n" % intensity )DATAL"^ self.writeIndented("location %s %s %s\n" % (round(location[0],3),DATALD#^ round(location[1],3),DATAL#^ round(location[2],3)))DATA4T$^ self.writeIndented("radius %s\n" % radius )DATA4$^ self.writeIndented("} # PointLight\n",-1)DATA$$%^ self.writeIndented("\n")DATA|%^DATAP%^ #------------------------------------------------------------------------DATA$<&^ def writeNavigationInfo(self):DATA4&^ self.writeIndented("NavigationInfo {\n",1)DATA0&^ self.writeIndented("headlight FALSE\n")DATA@d'^ self.writeIndented("avatarSize [0.25, 1.75, 0.75]\n")DATA8'^ self.writeIndented("} # NavigationInfo\n",-1)DATA$D(^ self.writeIndented("\n")DATA(^DATAP(^ #------------------------------------------------------------------------DATA\)^ #--- Utility methodsDATAP)^ #------------------------------------------------------------------------DATA<*^DATA0t*^ def cleanStr(self, name, prefix='rsvd_'):DATA\*^ """cleanStr(name,prefix) - try to create a valid VRML DEF name from object name"""DATAt+^DATA+^ newName=name[:]DATA +^ if len(newName) == 0:DATAL,^ self.nNodeID+=1DATA4,^ return "%s%d" % (prefix, self.nNodeID)DATA -^ DATA,T-^ if newName in self.VRMLReserved:DATA0-^ newName='%s%s' % (prefix,newName)DATA$.^ #endifDATA l.^ DATAD.^ if newName[0] in ['0','1','2','3','4','5','6','7','8','9']:DATA,,/^ newName='%s%s' % ('_',newName)DATA/^ #endifDATA/^DATAD0^ for bad in [' ','"','#',"'",',','.','[','\\',']','{','}']:DATA00^ newName=newName.replace(bad,'_')DATA0^ return newNameDATA<1^DATADt1^ def countIFSSetsNeeded(self, mesh, imageMap, sided, vColors):DATA 1^ """DATAL42^ countIFFSetsNeeded() - should look at a blender mesh to determineDATAD2^ how many VRML IndexFaceSets or IndexLineSets are needed. ADATA<43^ new mesh created under the following conditions:DATA 3^ DATA43^ o - split by UV Textures / one per meshDATA4\4^ o - split by face, one sided and two sidedDATA,4^ o - split by smooth and flat facesDATAT,5^ o - split when faces only have 2 vertices * needs to be an IndexLineSetDATA 5^ """DATA 5^ DATAD6^ imageNameMap={}DATA6^ faceMap={}DATA6^ nFaceIndx=0DATA 7^ DATA d7^ for face in mesh.faces:DATA7^ sidename='';DATAT8^ if (face.mode & NMesh.FaceModes.TWOSIDE) == NMesh.FaceModes.TWOSIDE:DATA 8^ sidename='two'DATA8^ else:DATA <9^ sidename='one'DATA9^ #endifDATA9^DATA0:^ if not vColors.has_key('multi'):DATA(|:^ for face in mesh.faces:DATA$:^ if face.col:DATA(,;^ c=face.col[0]DATAD;^ if c.r != 255 and c.g != 255 and c.b !=255:DATA0;^ vColors['multi']=1DATA d<^ #endifDATA<^ #endifDATA=^ #endforDATA\=^ #endifDATA=^DATA(=^ if sided.has_key(sidename):DATA$4>^ sided[sidename]+=1DATA>^ else:DATA$>^ sided[sidename]=1DATA,?^ #endifDATAt?^DATA?^ if face.image:DATA@p^ faceName="%s_%s" % (face.image.name, sidename);DATAp^DATA0p^ if imageMap.has_key(faceName):DATA4,q^ imageMap[faceName].append(face)DATAq^ else:DATAHq^ imageMap[faceName]=[face.image.name,sidename,face]DATATr^ #endifDATAr^ #endifDATAr^ #endforDATA,s^DATA ds^ if self.verbose > 0:DATA0s^ for faceName in imageMap.keys():DATA($t^ ifs=imageMap[faceName]DATAH|t^ print "faceName=%s image=%s, solid=%s facecnt=%d" % \DATA@t^ (faceName, ifs[0], ifs[1], len(ifs)-2)DATAlu^ #endifDATAu^ #endifDATAu^DATA$4v^ return len(imageMap.keys())DATAv^ DATA$v^ def faceToString(self,face):DATA@w^ print "Debug: face.flag=0x%x (bitflags)" % face.flagDATALw^ if face.flag & NMesh.FaceFlags.SELECT == NMesh.FaceFlags.SELECT:DATA4x^ print "Debug: face.flag.SELECT=true"DATAx^ #endifDATAx^DATA@y^ print "Debug: face.mode=0x%x (bitflags)" % face.modeDATAP|y^ if (face.mode & NMesh.FaceModes.TWOSIDE) == NMesh.FaceModes.TWOSIDE:DATA0z^ print "Debug: face.mode twosided"DATAlz^ #endifDATAz^DATA@z^ print "Debug: face.transp=0x%x (enum)" % face.transpDATA8d{^ if face.transp == NMesh.FaceTranspModes.SOLID:DATA0{^ print "Debug: face.transp.SOLID"DATA 4|^ #DATA||^DATA|^ if face.image:DATA<|^ print "Debug: face.image=%s" % face.image.nameDATAt}^ #endifDATAD}^ print "Debug: face.materialIndex=%d" % face.materialIndexDATA4~^DATA0l~^ def getVertexColorByIndx(self, mesh, indx):DATA ~^ for face in mesh.faces:DATA,^ j=0DATA$t^ for vertex in face.v:DATA,^ if vertex.index == indx:DATA$4^ c=face.col[j]DATA^ #endifDATAԀ^ j=j+1DATA^ #endforDATAd^ #endforDATA^ return cDATA^DATA$,^ def meshToString(self,mesh):DATA@^ print "Debug: mesh.hasVertexUV=%d" % mesh.hasVertexUV()DATA<^ print "Debug: mesh.hasFaceUV=%d" % mesh.hasFaceUV()DATALt^ print "Debug: mesh.hasVertexColours=%d" % mesh.hasVertexColours()DATA8^ print "Debug: mesh.verts=%d" % len(mesh.verts)DATA8d^ print "Debug: mesh.faces=%d" % len(mesh.faces)DATA@̄^ print "Debug: mesh.materials=%d" % len(mesh.materials)DATAD^DATA|^ def rgbToFS(self, c):DATAԅ^ s="%s %s %s" % (DATA(,^ round(c.r/255.0,self.cp),DATA(^ round(c.g/255.0,self.cp),DATA(܆^ round(c.b/255.0,self.cp))DATA4^ return sDATA|^DATA(^ def computeDirection(self, object):DATA( ^ x,y,z=(0,-1.0,0) # point downDATA<d^ ax,ay,az = (object.RotX,object.RotZ,object.RotY)DATA܈^DATA^ # rot XDATA\^ x1=xDATA,^ y1=y*math.cos(ax)-z*math.sin(ax)DATA, ^ z1=y*math.sin(ax)+z*math.cos(ax)DATAt^DATA^ # rot YDATA,^ x2=x1*math.cos(ay)+z1*math.sin(ay)DATA\^ y2=y1DATA,^ z2=z1*math.cos(ay)-x1*math.sin(ay)DATA ^DATAD^ # rot ZDATA,^ x3=x2*math.cos(az)-y2*math.sin(az)DATA,^ y3=x2*math.sin(az)+y2*math.cos(az)DATA\^ z3=z2DATA^DATA܍^ return [x3,y3,z3]DATA 4^ DATA|^DATAH^ # swap Y and Z to handle axis difference between Blender and VRMLDATAP,^ #------------------------------------------------------------------------DATA(^ def rotatePointForVRML(self, v):DATA$^ x = v[0]DATAl^ y = v[2]DATA^ z = -v[1]DATA ^ DATAD^ vrmlPoint=[x, y, z]DATA^ return vrmlPointDATA^ DATA ,^ def rotVertex(self, mm, v):DATA ^ lx,ly,lz=v[0],v[1],v[2]DATA@ܢ^ gx=(mm[0][0]*lx + mm[1][0]*ly + mm[2][0]*lz) + mm[3][0]DATADT^ gy=((mm[0][2]*lx + mm[1][2]*ly+ mm[2][2]*lz) + mm[3][2])DATAḌ^ gz=-((mm[0][1]*lx + mm[1][1]*ly + mm[2][1]*lz) + mm[3][1])DATAD^ rotatedv=[gx,gy,gz]DATA^ return rotatedvDATA^DATA(^ def writeIndented(self, s, inc=0):DATAt^ if inc < 1:DATA8^ self.indentLevel = self.indentLevel + incDATA$^ #endifDATAl^DATA^ spaces=""DATA,^ for x in xrange(self.indentLevel):DATA$T^ spaces = spaces + " "DATA^ #endforDATA$^ self.file.write(spaces + s)DATAL^DATA^ if inc > 0:DATA8̨^ self.indentLevel = self.indentLevel + incDATA4^ #endifDATA|^DATA0^ # Converts a Euler to three new QuaternionsDATA0^ # Angles of Euler are passed in as radiansDATAP^ #------------------------------------------------------------------------DATA, ^ def eulerToQuaternions(self, x, y, z):DATA4t^ Qx = [math.cos(x/2), math.sin(x/2), 0, 0]DATA4ܫ^ Qy = [math.cos(y/2), 0, math.sin(y/2), 0]DATA4D^ Qz = [math.cos(z/2), 0, 0, math.sin(z/2)]DATA ^ DATA$^ quaternionVec=[Qx,Qy,Qz]DATA L^ return quaternionVecDATA^ DATA@ܭ^ # Multiply two Quaternions together to get a new QuaternionDATAPT^ #------------------------------------------------------------------------DATA,ܮ^ def multiplyQuaternions(self, Q1, Q2):DATA\D^ result = [((Q1[0] * Q2[0]) - (Q1[1] * Q2[1]) - (Q1[2] * Q2[2]) - (Q1[3] * Q2[3])),DATA\ܯ^ ((Q1[0] * Q2[1]) + (Q1[1] * Q2[0]) + (Q1[2] * Q2[3]) - (Q1[3] * Q2[2])),DATA\t^ ((Q1[0] * Q2[2]) + (Q1[2] * Q2[0]) + (Q1[3] * Q2[1]) - (Q1[1] * Q2[3])),DATA\ ^ ((Q1[0] * Q2[3]) + (Q1[3] * Q2[0]) + (Q1[1] * Q2[2]) - (Q1[2] * Q2[1]))]DATA ^ DATA^ return resultDATA4^ DATA@l^ # Convert a Quaternion to an Angle Axis (ax, ay, az, angle)DATA^ # angle is in radiansDATAP<^ #------------------------------------------------------------------------DATA,ij^ def quaternionToAngleAxis(self, Qf):DATAL,^ scale = math.pow(Qf[1],2) + math.pow(Qf[2],2) + math.pow(Qf[3],2)DATA^ ax = Qf[1]DATA^ ay = Qf[2]DATAD^ az = Qf[3]DATA^DATAĵ^ if scale > .0001:DATA^ ax/=scaleDATAd^ ay/=scaleDATA^ az/=scaleDATA^ #endifDATA <^ DATA(^ angle = 2 * math.acos(Qf[0])DATA ܷ^ DATA($^ result = [ax, ay, az, angle]DATA|^ return resultDATAĸ^DATAL^#------------------------------------------------------------------------DATA^# main routineDATAL̹^#------------------------------------------------------------------------DATAT^DATA$^if Blender.Get('version') < 225:DATAD^ print "Warning: VRML2 export failed, wrong blender version!"DATA@\^ print " You aren't running blender version 2.25 or greater"DATA@Ի^ print " download a newer version from http://blender.org/"DATAL^else:DATA,^ baseFileName=Blender.Get('filename')DATA(^ if baseFileName.find('.') != -1:DATA8D^ dots=Blender.Get('filename').split('.')[0:-1]DATA ^ else:DATA^ dots=[baseFileName]DATA L^ #endifDATA^ dots+=["wrl"]DATAܾ^ vrmlFile=".".join(dots)DATA 4^ DATA$|^ wrlexport=VRML2Export(vrmlFile)DATA(Կ^ scene = Blender.Scene.getCurrent()DATA ,^ wrlexport.export (scene)DATA^#endifGLOB PLDNA1E$ QSDNANAME*next*prev*first*lastxyzwxminxmaxyminymax*newid*libname[24]usflagpadid*idblock*filedataname[160]totcurvecurblocktypeshowkeypostotelemtypert*data*refkeyelemstr[32]elemsizecurvalblock*ipo*fromtotkeyslurphactkey**scripts*flagactscripttotscript*linelenblen*nameflagsnlineslines*curl*sellcurcselc*undo_bufundo_posundo_len*compiledsizeseekdrawzoomholdclipstaclipendnetstanetendlensdrawsizehololenhololen1scriptlink*anim*ibuf*mipmap[10]oklastframelastqualitytpageflagtotbindxrepyreptwstatwendbindcode*repbind*packedfilelastupdateanimspeedreserved1texcomaptomaptonegblendtype*object*texprojxprojyprojzmappingofs[3]size[3]texflagcolormodelrgbkdef_varcolfacnorfacvarfac*handle*pname*stnamesstypesvars*varstr*result*cfradata[32](*doit)()(*callback)()versionaipotypedata[16]*ima*cube[6]imat[4][4]stypenotlaycuberesnoisesizeturbulbrightcontrastrfacgfacbfacfiltersizenoisedepthnoisetypeimaflagcropxmincropymincropxmaxcropymaxxrepeatyrepeatextendframesoffsetsfrafie_ima*nor*plugin*coba*envfradur[4][2]modetotexenergydistspotsizespotblendhaintatt1att2bufsizesampshadspotsizebiassofttexactshadhalostep*mtex[8]layspecrspecgspecbmirrmirgmirbambrambbambgambemitangspectraalpharefspeczoffsaddkfacharseed1seed2mode2flarecstarclinecringchasizeflaresizesubsizeflareboostrgbselpr_typeseptexpr_backpr_lamppad1*renfrictionfhreflectfhdistxyfrictdynamodename[256]scaleselcolexpxexpyexpzradrad2smaxrad2*mat*imat*bbelemsdisp**mattotcolloc[3]rot[3]wiresizerendersizethreshvec[3][3]alfas[3][2]h1h2f1f2f3hidevec[4]s[2]mat_nrpntsupntsvresoluresolvorderuordervflaguflagv*knotsu*knotsv*bp*beztnurb*bevobj*textoncurve*path*keybev*orcopathlenbevresolwidthext1ext2spacemodespacinglinedistshearfsizexofyof*strfamily[24]*vfontmaxrcttotrctadrcodevartypetotvertipoextrapbitmaskv1v2v3v4punoedcode*tpageuv[4][2]col[4]transptiledef_nrweight*dwtotweightco[3]no[3]co[2]effect*mface*dface*tface*mvert*dvert*mcol*msticky*texcomesh*oc*sumohandletotfacesmoothreshsubdivsubdivrreserved2reserved3cubemapsizertfpntswtypeutypevtypew*defname[32]partypepar1par2par3parsubstr[32]*pardata*parent*track*action*pose*activeconconstraintChannelsnetworkdefbasedloc[3]orig[3]dsize[3]drot[3]quat[4]dquat[4]obmat[4][4]parentinv[4][4]colbitstransflagipoflagtrackflagupflagipowinscaflagscavisflagboundtypedupondupoffdupstadupendsfctimemassdampinginertiaformfactordummy_1rdampingsizefacdtdtxactcolpropsensorscontrollersactuatorsbbsize[3]dfrasactdefgameflaggameflag2anisotropicFriction[3]constraintsnlastripsmistypehorrhorghorbhorkzenrzengzenbzenkambkfastcolexposuregravityactivityBoxRadiusskytypemisimiststamistdistmisthistarrstargstarbstarkstarsizestarmindiststardiststarcolnoisedofstadofenddofmindofmaxhemiresmaxiterdrawtypesubshootpsubshootenodelimmaxsublamppamapamielmaelmimaxnodeconvergenceradfacgammasxsy*lpFormat*lpParmscbFormatcbParmsfccTypefccHandlerdwKeyFrameEverydwQualitydwBytesPerSeconddwFlagsdwInterleaveEveryavicodecname[128]*avicodecdatacfraefraimagesframaptoframelenblurfacedgeRedgeGedgeBfullscreenxplayyplayfreqplaydepthattribrt1rt2stereomodepad[3]maximsizexschyschxaspyaspxpartsypartssafetyborderwinposplanesimtypebufflagqualityscemodealphamodedogammaosafrs_secedgeintsame_mat_reduxpad_3[3]postmulpostgammapostaddpostigammabackbuf[160]pic[160]ftype[160]col[3]pad2pad3*camera*world*setbase*basact*groupcursor[3]*fcam*ed*radioframingzoomblendximyim*rectspacetype*areaviewmat[4][4]viewinv[4][4]persmat[4][4]persinv[4][4]viewquat[4]perspview*bgpic*localvdlocalviewlayactscenelockaroundcamzoomgridnearfarmxmymxomyogridlinesviewbutverthormaskmin[2]max[2]minzoommaxzoomscrollkeeptotkeepaspectkeepzoomrowbutv2d*editipoipokeytotipopinbutofschannelmenunrlockcursenscuractmainbmainbo*lockpointexnrtexfromshowgrouprectxrectycurymodeltypescriptblockpad3[7]*anim_linked_sipo*filelisttotfiletitle[24]dir[160]file[80]ofssortmaxnamelencollums*libfiledataretvalmenuact(*returnfunc)()*menupoopsvisiflag*imageimanrcurtile*texttopviewlinesfont_idlheightleftshowlinenrspix_per_linetxtscrolltxtbar*py_draw*py_event*py_button*py_globaldicttitle[28]fasesubfasemouse_move_redrawimafasedirslidirsli_linesdirsli_sxdirsli_eydirsli_exdirsli_himaslifileselmenuitemimasli_sximasli_eyimasli_eximasli_hdssxdssydsexdseydesxdesydeexdeeyfssxfssyfsexfseydsdhfsdhfesxfesyfeexfeeyinfsxinfsyinfexinfeydnsxdnsydnwdnhfnsxfnsyfnwfnhfole[128]dor[128]file[128]dir[128]*firstdir*firstfiletopdirtotaldirshilitetopfiletotalfilesimage_sliderslider_heightslider_spacetopimatotalimacurimaxcurimay*first_sel_ima*hilite_imatotal_selectedima_redraw*cmap*arg1dupflagsavetimetempdir[160]fontdir[160]renderdir[160]textudir[160]plugtexdir[160]plugseqdir[160]pythondir[160]sounddir[160]versionsvrmlflaggameflagswheellinescrolluiflaglanguageuserprefconsole_bufferconsole_outfontsizeencodingtransoptsfontname[64]vertbaseedgebaseareabase*scenestartxendxstartyendysizexsizeyscenenrscreennrfullmainwinwinakt*newvvec*v1*v2*v3*v4*fullwinmat[4][4]headrctwinrctheadwinwinheadertypebutspacetypewinxwinyhead_swaphead_equalwin_swapwin_equalheadbutlenheadbutofscursorspacedatauiblocks*curscreendisplaymodefileflagsname[40]*se1*se2*se3nrdone*stripdatadir[80]orxoryname[80]*newseqstartstartofsendofsstartstillendstillmachinestartdispenddispmulhandsize*strip*curelemfacf0facf1*seq1*seq2*seq3seqbase*seqbasepmetastackbuttypestaendlifetimetotpartseednormfacobfacrandfactexfacrandlifeforce[3]dampnablavectsizedefvec[3]mult[4]life[4]child[4]mat[4]texmapcurmultstaticstep*keysheightnarrowspeedminfactimeoffs*obpremat[4][4]postmat[4][4]vec[3]faclenoalphaoeff[2]iterlastfralimbbaseeff[3]effg[3]effn[3]memslowtotytotxxyconstrainttotdefdef_scrolllimb_scrolldxdy*idlinkotypedataold*poin*oldpoinresetdistlastval*makeyqualqual2targetName[32]toggleName[32]value[32]maxvalue[32]materialName[32]damptimeranglerangeaxisdelaypropname[32]matname[32]axisflag*fromObjectsubject[32]body[32]pulsefreqtotlinks**linksinvertfreq2str[128]*mynewinputstotslinks**slinksvalvalopad5time*actblendinprioritystridelengthstrideaxissndnr*soundmakecopycopymadepad[1]trackvolume*melinVelocity[3]localflagforceloc[3]forcerot[3]linearvelocity[3]angularvelocity[3]addedlinearvelocity[3]anotherpad[4]butstabutendminmaxvisifacminloc[3]maxloc[3]minrot[3]maxrot[3]distributionint_arg_1int_arg_2float_arg_1float_arg_2toPropName[32]*toObjectbodyTypefilename[64]loadaniname[64]goaccellerationmaxspeedmaxrotspeedmaxtiltspeedrotdamptiltdampspeeddamp*sample*newpackedfile*snd_soundpanningattenuationpitchmin_gainmax_gaindistanceloopstartloopendchannelshighpriopad[6]gaindopplerfactordopplervelocitynumsoundsblendernumsoundsgameengine*gkeypadfokeygobjectgkey*activechildbaserollhead[3]tail[3]parmat[4][4]defmat[4][4]irestmat[4][4]posemat[4][4]boneclassfiller1filler2filler3bonebasechainbaseres1res2res3chanbase*achan*pchanactnrname[30]enforceoffset[3]orient[3]roll[3]*tartoleranceiterationssubtarget[32]cacheeff[3]cachemat[4][4]zminzmaxactstartactendstridelenrepeatblendoutTYPEcharucharshortushortintlongulongfloatdoublevoidLinkListBasevec2svec2ivec2fvec2dvec3ivec3fvec3dvec4ivec4fvec4drctirctfIDLibraryFileDataIpoKeyBlockKeyScriptLinkTextLineTextPackedFileCameraImageanimImBufMTexObjectTexPluginTexCBDataColorBandEnvMapLampWaveMaterialVFontVFontDataMetaElemMetaBallBoundBoxBezTripleBPointNurbCurvePathIpoCurveMFaceMFaceIntTFaceMDeformWeightBoneMDeformVertMVertMColMStickyMeshOcInfoLatticebDeformGroupbActionbPosebConstraintChannelWorldRadioBaseAviCodecDataRenderDataGameFramingSceneGroupFreeCameraBGpicView3DSpaceLinkScrAreaView2DSpaceInfoSpaceIpoSpaceButsSpaceSeqSpaceFiledirentryBlendHandleSpaceOopsSpaceImageSpaceNlaSpaceTextSpaceImaSelImaDirOneSelectableImaUserDefbScreenScrVertScrEdgeFileGlobalStripElemStripPluginSeqSequenceEditingEffectBuildEffPartEffParticleWaveEffDeformLimbIkaOopsbPropertybNearSensorbMouseSensorbTouchSensorbKeyboardSensorbPropertySensorbCollisionSensorbRadarSensorbRandomSensorbRaySensorbMessageSensorbSensorbControllerbExpressionContbPythonContbActuatorbAddObjectActuatorbActionActuatorbSoundActuatorbSoundbCDActuatorbEditObjectActuatorbSceneActuatorbPropertyActuatorbObjectActuatorbIpoActuatorbCameraActuatorbConstraintActuatorbGroupActuatorbRandomActuatorbMessageActuatorbGameActuatorbVisibilityActuatorbSamplebSoundListenerSpaceSoundGroupKeyObjectKeyGroupObjectbArmaturebPoseChannelbActionChannelSpaceActionbConstraintbKinematicConstraintbTrackToConstraintbRotateLikeConstraintbLocateLikeConstraintbActionConstraintbFollowPathConstraintbRotationConstraintbActionStripTLEN  0Ptdl(PPx4@H<0P <  L,@,(D($pDhhd @l8(,@0,HhH,(lDLP< <@Lx0848l@0pP<`|,,,88STRC                     !"# $%&'()*+,-./0 123 456789:; <!=>2 "?@ABCDEFGH%I#$J%K%LMNOPQRSTUVW!XYZ[&\]^_'`(abcdefghijklmnopq) rstuv wxyz{ |}*jkl~+*, '`##ABMN(#/p%#)+,-ijklmAB&%I.%/:ijkl\]&%/I01!X222/34 %/hg5 6777   6 5 8&4  ''%9/ gh/4 !"0#:::6 5 $%&'()*  +#;,-./01<,-./01= 23456>78?@>9:[A;<B~jklC=D"4 > %/ ? @ AAB@CBDCEDFEG H(IhgJKL[MNOPF QRST6U%GGGV 'OWXYZ[ \']'^%94H_I` Ja b > c d/efgghijklmnopqrstuvwxyz{|}~I     H4  K+i%&ILMMM'`N  O7N{=PQ'KQ# MRS  L  HP OjIT #(a = U&VVW'TU !E"#$f%&'()*X +,-./012345VVVWYVVWZVVW6X7 8 9%&:;<=>?[[VVW@AX7B>;C DEFGHIJKLsMZN\ VVWX7B ]VVW^OPQRSTUVW_XYZ[ \]` VVWX7 ^;_ DaVVWX7#` ;ab ?bVV?WX7cVVW cde2>fghijkl m n o pdQVVWqrstu%&vwxyz{|}~eeff% \ gh   Qiiii jjjiiWWWiiiih%  k l%KlllMm mm/ln  rsv} wyz { |o ooo /     ml%Q$Jnooo p   qqqrrr/sss' !"#$%&'()*+,-./0t1uuu2345&6v '7WXYZ89:;w ww/<;=>xW?@ ABCDEFGHI%']XYZJvUKLy yyMNO Pz zzVQRS T U{VVW|}V/X~YZ[\]V^_V`a&VbcdVeVcfgh'ijkQlmnV o'7pqr cstnQuV ovwxyz'7 H{V|}~[MN  z'7DVQ'V^'7 eh V'72;d&F VRf'jk sQV '7S |!X! %2VVWX7 ?VWXYZ']'^%efgghijklnopqz{'7 R  ????] V8eggijk    gikV[I % bV[H  VVWX7H_;[?JJJ% %Q[z'['[M'['['H{'   [%H{|ENDB