BLENDER_v231REND 1SRd$_bRsbSRscreen_btbbbb4gbtgbtbdb^ DATA_bS_bDATA_bS4`b_bDATA4`bSt`b_bDATAt`bS`b4`bDATA`bS`bt`btDATA`bS4ab`btDATA4abStab`bDATAtabSab4abDATAabSabtab8DATAabS4bbab8tDATA4bbStbbab8PDATAtbbS4bbPDATAbbTbb_b4`bDATAbbT4cbbb_bt`bDATA4cbTtcbbb_b`bDATAtcbTcb4cb4`b`bDATAcbTcbtcb`b`bDATAcbT4dbcb_b4abDATA4dbTtdbcb`b4abDATAtdbTdb4dbt`btabDATAdbTdbtdb4abtabDATAdbT4ebdb4ababDATA4ebTtebdbtababDATAtebTeb4eb`babDATAebTebteb`babDATAebT4fbebababDATA4fbTtfbebab4bbDATAtfbTfb4fbab4bbDATAfbTfbtfb`btbbDATAfbT4gbfbtabtbbDATA4gbTfb4bbtbbDATAtgbVkb_b4abtabt`b?FDz@Pף\hb\ib,_~ |ht>gzDATAt>gULgOutputRender>DATALgU|gt>gRenderRender@>DATA|gU,gLgAnimRender>DATA,gU "n|gFormatRender>DATA "nU|v,gAnim settingsObject>DATA|vUo "nDrawObject@>DATAoU||vConstraintsObject>DATA|U|oPreviewLamp>DATA|U4||LampLamp@>DATA4|U%j|SpotLamp>DATA%jUb~4|Texture and InputLamp>DATAb~U|%jMap ToLamp>%jDATA|Uzb~Link and MaterialsEditing>DATAzU|MeshEditing@>DATA\hbE\ib333?tgbDhCñD;hCC(BDC??dbzDATA \ib@\hb333?tgb??? ???? A??FDz@PA Aj?I7>}GCHB? ADb B?=CXXDATAkbVlbtgb`b_b4`b`buuffDATAlbVpbkbab4bbtbbtab?k|Q@o?9O9+9,O [$Mtmbp\:|:|DATA tmb@Lf333?lbN???N`?Cmq?>??N%i' ??N%`Cmq?7磥o?;k|Q@ Ӿ@E@?!?|$R,L k>ɩ`Cmq??k|Q@o?N???N`?Cmq?>??!?Db B?=C>`?Cmq? DATAxLfKobtmb lb h @ HgDATAobEp\Lf333?lbDdCD1MCC(BDC??DATATp\GoblbxiLOAD TEXT FILE/home/ingo/games/obj_io_modif228.py 4DATApbVtblb4ab`babab@:K=ߨE=o?7s7+7,s 8HDqb4RhDATA qb@4Rh333?pbn[?=E=狝>ۅrO?LN?->c,>!8>t>?o[?E=O?狝>LN?=څr->^F6?[x.=Ǽ*`09;,IsۅrO?LN?->c,>!8>t>?`I??>oAy"`2)k?̡> (>϶>Z?cH0?9? fLj>(k?+?y"Ρ>ө@8ϥ/@?@?`3Bp++ K?*?)"?y"?t2\@Ǿ̡ƾ??AZA,!?])?054N=>hm AYW[BןX&AvUA-)@?@AHMbH0? +?9?hLj>y"`2)k?̡> (>϶>Z?C?m d_Lg@Db B?=C>4.> DATAxbEub333?tbDdCD1MCC(BDC??SRdsbR$_bSRscreen.001|tb{b{bb\b$bdbDATA|tbSybDATAybS\yb|tbDATA\ybSybybDATAybSyb\ybDATAybSzbybDATAzbS\zbybDATA\zbSzbzbDATAzbSzb\zbDATAzbS{bzbDATA{bS\{bzbDATA\{bS{b{bDATA{bS\{bDATA{bT|byb\ybDATA|bT\|b{b|tbybDATA\|bT|b|bybybDATA|bT|b\|b\ybzbDATA|bT}b|bybzbDATA}bT\}b|b|tb\zbDATA\}bT}b}bybzbDATA}bT}b\}b\zbzbDATA}bT~b}b\zbzbDATA~bT\~b}bybzbDATA\~bT~b~bzb{bDATA~bT~b\~bzb{bDATA~bTb~bzb{bDATAbT\b~bzb\{bDATA\bTbb{b\{bDATAbTb\byb{bDATAbTbbzb{bDATAbTb\{b{bDATA\bVb|tb\zbzbyb?FDz@PףdDbDbDATADbEDb333?DdC˄3D(dCC(BDC??DATA Db@Db333???? ???? A??FDz@PA Aj?I7>}GCHB? ADb B?=CXXDATAbVtb\bybyb\ybzbdDATAtbVTbb\zbzb{bzbg=Ρ>o?qqd\b bDATA\bF,b333?zCAzCA A@FB= A DATA,bH b\b333?AA Y YCA A@CC #<@bbDATA,bd\bOBbDATA,\bdbbME|AbDATA,bd\bOB`ADbDATA  b@,b333????55@??A0??5>5?g=Ρ>o$[;??cYAYJ@5>5??cYADb B? #<C55@DATATbV$btb\{b{bzb{bg=S=o?w}w}5dl>lBA A@CC #<@ԐbbDATA,Ԑbd,bOBq= @bDATA,,bdbԐbME|AbDATA,bd,bOBp=ADbDATA ܑb@b333????55@??A0??5>5?g=S=o$s>?cYA~2bA5>5??cYADb B?=C55@DATA$bVTbzbyb{b\{bg=+=o?w}w}d bbDATA bDb333?zC̽̌?zC@@@ #< #<`jFzD OBzC̽̌?DATAbEb b333?DdC@CdDGhICC(BDC??DATA b@b333????55@??A0??5>5?g=+=o$gV>?cYAL³90A5>5??cYADb B?=C55@SC(db>SC1DbԧRbbv@@@MAdd??< K=fff?=fff?Z@??//backbuf//ftypeDDATAԧR8H~>}DATAH~8[|ԧR@{DATA[|8bH~q&nDATAb8}y[|L2{DATA}y8bb'DyyDATAb8}ykDbOBDb5@{OBCamera bө@9Υ/@????0O??dH0?9? gLj>)k?+?y"͡>ө@9Υ/@??????;=1D~?Mu2Uh#3ײ?4_!4f2?Dd??)d??>)d?????OB@{5>}DbOBLamp.001 "~-dT4A???#?#D???26?(/?">Wɾ:3M>e??Y3.>-dT4A?????,z|?C}tܽN>}?Y<:=d+h~?!@d#@?Dd?? #=?>=?@???OB>}5Dyy@{OBLamp.002 nv@@@MA???#?#D???26?(/?">Wɾ:3M>e??Y3.>v@@@MA?????.z|?C}tܽN>}?uY<:=f+h~?/) "@?Dd?? #=?>=?@???OBDyy5L2{>}OBMesh|y}}D~y????N%N%???&$&&$=3?&$=3??????vR?n ?Z)?$Ċ?@ A@tWA?Dd?? #=?>=?@???DATAD~yOBL2{5&nDyyOBCylinder&jT}}T}}#.@.@.@??.@.@.@#?????8>>nƲi)ӽ=>ez>N2n>? Sl%??Dd?? #=?>=?@???OB&n5L2{OBLamp 9}<(4[d9A???NN%???N%N%N?Nj'?<(4[d9A?????dH0?9?u2 gLj>)k?+?y"Ρ>@8z ?Dd?? #=?>=?@???ME|y2&jbMEcar}yDf~Df~yTyyz@s# U܀@s I W>@s$  !@s& .W-@s2 _ף@@s 7 .WqS@s2  bc@s&& I W n@s2 Uq@s 7 \W n@s2 =bc@s& @٬7TN@M Kף@@T @٬w2@M0 WX'@z;y; B!N@0 M UU@T 4N@ߵM ྎX'@y; ,w2@K0 Ռף@@ ,7TN@K Y@ć 4`a@K UYid@ B!`a@0 K W Y@z;@٬7TN@˪=XsKף@@˪_@٬w2@˪=X$WX'@˪CCB!N@˪$=XUU@˪_4N@˪s=XྎX'@˪wC,w2@˪ç$Ռף@@˪~,7TN@˪çt Y@˪wx4`a@˪sçUYid@˪~B!`a@˪$çW Y@˪Cx@g,ڿ7 .@1ѿ}" .-@߉+j .rT@0dV .LVn@U .mw@9V .-Vn@,_+j .sTsT@e}" .Vn-@jm=7 .nw@e M .VnL@,_3_ .sT@90Gk .-@U˄o .@0d0Gk .LҪ@߉3_ .@1ѿ M .L`?g,ڿ7˪~`?1ѿ}"˪ç$`?߉+j˪wC`?0dV˪s=X`?U˪_`?9V˪$=X`?_+j˪CC`?8}"˪=X$`?k=7˪_`?8 M˪=Xt`?_3_˪Cw`?90Gk˪$ç`?U˄o˪~`?0d0Gk˪sç`?߉3_˪ww`?1ѿ M˪çsL@ſ%s$L@yͿ7sL@ſJs$L@=ZsL@\Y4es$L@UhsL@I Y4es$L@ Zs&L@.WJs2L@_7s 7L@.W%s2L@ #s&&L@I Yi s2L@Uޫs 7L@\Yi s2L@=#s&L@@٬y*z`ML@K7z`TL@@٬9Ez`M0 L@W"Qz`z;y;L@B!bXz`0 ML@U[[z`TL@4bXz`ߵML@"Qz`y;L@,9Ez`K0 L@Ռ7z`L@,y*z`KL@ྐz`ćL@4Pz`KL@UW z`L@B!Pz`0 KL@Wz`z; @@٬y*5U=Xs @K75U_ @@٬9E5U=X$ @W"Q5UCC @B!bX5U$=X @U[[5U_ @4bX5Us=X @"Q5UwC @,9E5Uç$ @Ռ75U~ @,y*5Uçt @ྐ5Uwx @4P5Usç @UW 5U~ @B!P5U$ç @W5UCx@g,ڿף@@ .@1ѿU@ .-@߉h@ .rT@0d.t@ .LVn@UYx@ .mw@9.t@ .-Vn@,_h@ .sTsT@eU@ .Vn-@jm=ף@@ .nw@eR+@ .VnL@,_)?@ .sT@9+ @ .-@U@ .@0d+ @ .LҪ@߉)?@ .@1ѿR+@ .L`?g,ڿף@@˪~`?1ѿU@˪ç$`?߉h@˪wC`?0d.t@˪s=X`?UYx@˪_`?9.t@˪$=X`?_h@˪CC`?8U@˪=X$`?k=ף@@˪_`?8R+@˪=Xt`?_)?@˪Cw`?9+ @˪$ç`?U@˪~`?0d+ @˪sç`?߉)?@˪ww`?1ѿR+@˪çsL@ſqS@s$L@yͿף@@sL@ſ-@s$L@=!@sL@\W>@s$L@U܀@sL@I W>@s$L@ !@s&L@.W-@s2L@_ף@@s 7L@.WqS@s2L@ bc@s&&L@I W n@s2L@Uq@s 7L@\W n@s2L@=bc@s&L@@٬7TN@z`ML@Kף@@z`TL@@٬w2@z`M0 L@WX'@z`z;y;L@B!N@z`0 ML@UU@z`TL@4N@z`ߵML@ྎX'@z`y;L@,w2@z`K0 L@Ռף@@z`L@,7TN@z`KL@ Y@z`ćL@4`a@z`KL@UYid@z`L@B!`a@z`0 KL@W Y@z`z; @@٬7TN@5U=Xs @Kף@@5U_ @@٬w2@5U=X$ @WX'@5UCC @B!N@5U$=X @UU@5U_ @4N@5Us=X @ྎX'@5UwC @,w2@5Uç$ @Ռף@@5U~ @,7TN@5Uçt @ Y@5Uwx @4`a@5Usç @UYid@5U~ @B!`a@5U$ç @W Y@5UCx볿q1>?բWtn_??6~ft?n_??Gf?q1>?U_+;Ŀq;T>9'YR!\?6j`!?\?Fj$;?q;T>lR~a- |yac??!|7|ya!@4~ v}>!@;U~Xv?}>!@i~b•?&>!@~ |ya>!@|׿4E>!@ޥZ׿}ߙ=?S+׿}ߙ=yM\?}ߙ=]V??}ߙ=?[LY#?4E>!@\+XO!@O?gOÁO?@~O??}O?!@X~~OE&!@冕OE&?冕OE&冕O?E&yO?E&?yO?E&!@yT~A!@冕T~A?冕T~A冕T?~AyT?~A?yT?~A!@yTl!@Tl?TlT?lT?l?T?l!@T0d!@.3T0d?.3T0d.3T?0dQu.3T?0d?Qu.3T?0d!@Qu.3b!@.3b?.3b.3b?Qu.3b??Qu.3b?!@Qu.3b姿!@b姿?b姿b?姿Zb?姿?Zb?姿!@Z\> >|o@•&>|o@~ v}>|o@u{{ ׿4E>|o@Yq O|o@ OE&|o@~y T~A|o@؆w Tl|o@a T0d|o@)2 b|o@}0 b姿|o@Χb?姿|o@r\Χb?|o@v0l T?0d|o@bu/27 T?l|o@ T?~A|o@%yת O?E&|o@yب O?|o@%}t ?4E>|o@ZYgv?}>|o@q{ •?&>|o@S~$\>@u}>*$>@wL!~=@p)T:w&<@%a&Mؿ)& @W.MؿE&@2Kο~A@ 6Kοl@98Kο0d@^72σ߿@>0-σ߿姿@D'σ?姿@WXD'σ?@l0{.K?0d@fJ8 4K?l@r98K?~A@kC 6M?E&@oٟ1M?)& @7uW'!T:?w&<@XwS(?~=@X,rd%?*$>@x$=D@PQb%0*VTVv>TҚvWxn_?Tdv `A#c?T6{UWx?n_?T'zyv?>T}+1x?_>T^VO?T~O?E&TyT?~ATyT?lTT?0dTQu.3b?TQu.3b?姿TZb姿TbT.3T0dT.3TlTT~AT冕OE&T冕OT7~׿_>X9d3Xv>X9d 8|•&>X9d.zaǡ>X9dz •?&>X9dV~v?>X9dC}}?_>X9d[XO?X9d@~O?E&X9dyT?~AX9dyT?lX9dT?0dX9dQu.3b?X9dQu.3b?姿X9dZb姿X9dbX9d.3T0dX9d.3TlX9dT~AX9d冕OE&X9d冕OX9dÁ׿}ߙ=Tvq1>1uQ•&>US|•?&>4O|8v?q1>.ut?}ߙ=[YTO?㾪yuO?E&$sLT?~A*mjT?lxT?0dkE<|b?q3b?姿]R6b姿`R6b%L4T0d4==TlT~AɐOE&ҶO㾪S˾}ߙ=tJIc&>t^ܪIc?&>t cS˾?}ߙ=tr9M9|?wCeQ|?E&w8:™a?~At.>Ta?lt7Ȍa?0dt.>.9?w<2g.9?姿w2G.9޿姿wG.9޿wa2aͿ0dt&5>aͿltBȌaͿ~At$͟|ֿE&wľN|ֿwO9ےʉ羨Ƴ@kԯ9i7!vVƳ@$R~šT:w&<@{ Mؿ)& @:JA<7?!vVƳ@'+xʉ?羨Ƴ@N@M?)& @T:?w&<@mAX־k@Cc.S^kk@i䷿%w.@l|п{.@#].?S^kk@PEc?X־k@V([=h|?{.@S^>?%w.@0ts%밾|=D@Jkg%>|=D@ Le(}]~@{~AD@Nz&D@.0żD@Q*9Un2e[D@s'sZ/D@˅jpw}:D@Mat*sCD@{}e+$}vD@ځz*s>CD@*{}w>}:D@2atZ>/D@u4jp2>e[D@%'s.=0żD@*9UnHL$^` Ƚ@{843k)b@|y o@@֧<@©m/mX о@ {p+@#,@s/mX> о@7{p@@>֧<@=m)>b@5y o` >Ƚ@.843kD=C|@*9UnkLO$Vϼ@vJh<ھD@HsDdD@v}+D@ 9ܺD@o>dD@A ><ھD@ sD9?ܺD@uov?}+D@80vqӾ@,vs@ֳwElhA@ xvㄿr@2'x>s@ֳw0>vqӾ@Y,v?r@E2'xEl?hA@gyv$_좠>Yw %?>ez&$_>좠>YU!w卾^>﬍s>^>﬍0s %|)>>Zeձ >+f? >+%&>fБ%E?=K?וޕ:VTTLQ ?uY[^GlnO%P ?%YzTT>LQ ?uYe^G>K?ו"j9VБ%,?猘n1?-? cRtTT2?uYJlnO%#6?%wTT>2?u?]ZJ>?-? cYu%%??b A?p`$H?̋ +9<%~M?Zڌ7$>H?-" >A?`bڿ%hv9?gq&=?%}L?{Na9<%qT?Է/ m}>L?{N= 6`q&?=?]bڿ%W?D4U%q&ȵI?B`}ѕX?-x`9<%.b?͆GCd}>ѕX?-xa`tPq&?ȵI?B2 TZ :\?5O.EYM?xK@ͯ+NA?I@# 4.P?ĔὔH?YM?x33@< ?:\?5PiG ?4.P?ĔRQ`I?+NA?H|nSDATA!Ty* !"  ! / @./@-.,- +,@ *+@ )*    ()    '( @   &' @   %&   $%  #$ @ "#@ 01!@!12"@"23#@#34$@$45%@%56&@&67'@'78(@(89)@)9:*@*:;+@+;<,@,<=-@-=>.@.>?/@/?0 @0@A1 1AB2 2BC3 3CD44DE55EF66FG77GH8 8HI9 9IJ: :JK; ;KL<<LM==MN>>NO??O@0 P`aQ Pqr_ QabR QpqP RbcSRpQ@ScdTS~R@TdeUT}~SUefVU|}TVfgW V{|U@WghX Wz{V@XhiY XyzW YijZ YxyX Zjk[ZwxY@[kl\[vwZ@\lm]\uv[]mn^]tu\^no_ ^st]@_o`P _rs^@pq@qr@rs@st@tu@uv@vw@wx@xy@yz@z{@{|@|}@}~@~@p@           @ @@@     @ @@@  @@@@@@@@@@@@@@@@           @ @@@      @   @      @ @   /@! @"!@#"@$#@%$@&%@'&@('@)(@*)@+*@,+@-,@.-@/.@ 0?/ !10  "21! #32" $43#%54$&65%'76&(87' )98( *:9) +;:* ,<;+-=<,.>=-/?>.@JA@@POK AED@@AIE AJNH BIH BMC@CGFB@CSRG DQP@ DQ ED@FIB FI GF@HIA HNMB IE J@K JN KJ LCM LTSC LT ML NM OK PVUO@QWVP@QW@RG SYXR@TZYS@TZ@UO@V\[U@W]\V@W]@XR@Y_^X@Z`_Y@Z`@[U@\ba[@]cb\@]c@^X@_ed^@`fe_@`f@a[@bhga@cihb@ci@d^@ekjd@flke@fl@ga@hnmg@ionh@io@jd@kqpj@lrqk@lr@mg@ntsm outn ou pj@qwvp rxwq rx sm tzys@u{zt@u{@vp w}|v@x~}w@x~@ys@{| |v@~y     @@@@@@@ @@@@@@@     D@ @@ @ @ @@@@)D  .-$#%$&%=<&>=!" ! ! "!)("A@)BA+*,+@ I  I     @@@@@ @ @ @@@@@  LNQ Q@R   @@@@@ @ @ @@@@ @   KPS QNK SPM    @@ @@ @ @    @  @     @       AC A)G#.-,"('#/:. $0/# %10$@&21%@&<;''32&@';>(43')54()@?**65)@*?B+76*@,87+@-98, .:9- ;CF> <DC;=ED<>FE=?GJB@HG?AIH@ BJIADEFCHIJGKUTPLWVNMYXO@NVUK@ORM OXWLPTYMROL TZ_YU[ZTV\[U@W]\VX^]WY_^X@Z`e_ [a`Z \ba[ ]cb\^dc]_ed^ `fke agf` bhga cihb djic ekjd flqkgmlfgtsmhutg$ionhjpoijxwpkyxj mnol/msrn)nruhpqlo,pwvq"qvyksturKwxyvH@@@@@@@@@@@@@@@ON@@NM@@ML@@LK@@KJ@@JI@@IH@@HG@@GF@@FE@@ED@@DC@@CB@@BA@`on@`nm@`ml@`lk@`kj@`ji@`ih@`hg@`gf@`fe@`ed@`dc@`cb@`ba@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @  @  @  @  @ @@@123@134@145@156@167@178@189@19:@1:;@1;<@1<=@1=>@1>?@1?0@z{| z|} z}~ z~y         S@         01202303404505606707808909:0:/@ME&j2|yMECylinder,{$~$~}}B`qu@qu@Z>DATA(}/B;-@:-@ZǾAA<mL@\@ZǾwM3<b@ڻ?ZǾV#<p@??ZǾ`[-<qu@r4ZǾ*]<p@?ZǾ`[<b@ڻZǾVY<mL@\ZǾwM><;-@;-ZǾA <\@mLZǾ3<ڻ?bZǾ#<??pZǾ-<͸quZǾ֢<1?~pZǾ<ڻbZǾY<\hLZǾ>̉<B-4-ZǾ <sL\ZǾ><bڻZǾY<p?ZǾ<qux6ZǾ֢<}pY??ZǾ-<bۻ?ZǾ#<aL\@ZǾ3<,-J-@ZǾ A<\xL@ZǾ>wM<ڻb@ZǾYV<?p@ZǾ`[<R6qu@ZǾ*]<??zp@ZǾ-`[<#ۻ?b@ZǾ#V<\@\L@ZǾ3wM<Q-@%-@Z>AAWL@\@Z>wM3Wb@ڻ?Z>V#Wp@??Z>`[,Wqu@ptZ>*]Wzp@?Z>`[Wb@ۻZ>VYWbL@\Z>wM>W4-@B-Z>A W\@oLZ>3Wڻ?bZ>YVW:??~pZ>-WxNo6quZ>֢WĈ?pZ>WڻbZ>YW\LZ>>̉W-W-Z> WRL\Z>>WbQۻZ>YWtp?Z>Wqu Z>֢Wp??Z>,Wb]ڻ?Z>#WLT\@Z>3W|--@Z>AW\6L@Z>>wMWۻb@Z>YVWʊ?jp@Z>`[W1qu@Z>*]W4??p@Z>,`[Wڻ?b@Z>#VW*\@L@Z>3wMWZǾZ>DATA}*`@A! @A"!@A#"@A$#@A%$@A&%@A'&@A('@ A)(@ A*)@ A+*@ A,+@ A-,@ A.-@A/.@A0/@A10@A21@A32@A43@A54@A65@A76@A87@A98@A:9@A;:@A<;@A=<@A>=@A?>@A ? !@!"@"#@#$@$%@%&@&'@'(@()  )* $ *+ " +,  ,-  -. ./ /0 01@12@23@34@45@56@67@78@89 9: :; ;< <= => >?  ? MA(tm!bMAdefault???????????L??2 ?????@?=?=?TELbTETex>@????????CAlbCACamera2=B? A B?LA9}"~LALamp!????A4B>??? B4B?@@LA"~ n9}LALamp.001????A4B>??? B4B?@@LA n"~LALamp.002????A4B>??? B4B?@@TXd hTXobj_io_modif228.pyhxj$ljjԞjxDATA$h/home/ingo/games/obj_io_modif228.pyDATAjDhhJDATADhhjDATA|j$jjj7DATA$jj|jdj<DATAjLj$j jDATALjjjjDATAjdjLjjDATAdj$jjjPDATA$jjdjdj<?DATAjLj$j j?DATALjjjjDATAjdjLjjDATAdj$jjjU<0DATA$jjdjdj;DATAjLj$j jDATALjjjjDATAjdjLjjDATAdjjjj)DATAjjdjk=k=k4DATAT>k>k=k>kDATA>kL?kT>k?kDATAL?k@k>k?kKDATA@k@kL?kD@k DATA@kAk@k@kDATAAkAk@kDAkDATAAkBkAkAk!DATABkBkAk\Bk$DATABkDATAl,lll>DATA,lllll>DATAlll,ll-DATAlllllDATAl\llllDATA\llllDATAlLl\l lDATALllllDATAl<lLl lDATA<lll|l<DATAll<l$l8DATAl4 lll=DATA4 l llt lDATA l< l4 l lDATA< l l l| lDATA l4 l< l lDATA4 l l lt lDATA l4 l4 l lDATA4 l l lt lDATA l< l4 l l*DATA< l l l| l*DATA lDl< llDATADll llDATAlLlDl lDATALllllDATAlllLll+DATAlllllDATAltlll4lDATAtllll0DATAlltlTlDATAllllDATAlllDlDATAllllDATAlllTlDATAl$lllDATA$llldlDATAl4l$ll#DATA4llltl&DATAldl4ll/DATAdllll)DATAlldl<l@DATAlDlll.DATADllllDATAl\lDl l DATA\llllDATAltl\l$l DATAtllll"DATAlltlDl+DATAl$lllDATA$llldl0DATAlLl$llDATALllllDATAlLlLll$DATALllllDATAl\ lLl lDATA\ l ll lDATA ll!l\ l$!lDATAl!l"l l!l-DATA"lt"ll!lD"lDATAt"l"l"l"lDATA"l#lt"l<#lDATA#l$$l"l#l1DATA$$l$l#ld$lDATA$l %l$$l$l DATA %l%l$lL%lDATA%l&l %l%lDATA&l&l%lT&lDATA&l 'l&l&lDATA 'l'l&lL'lDATA'l(l 'l'lDATA(l(l'lT(lIDATA(l<)l(l )lDATA<)l)l(l|)lDATA)l\*l<)l*l*DATA\*l*l)l*l2DATA*l+l\*l<+l!DATA+l<,l*l+lEDATA<,l,l+l|,l#DATA,lT-l<,l -lDATAT-l-l,l-l9DATA-l.lT-l<.l'DATA.l4/l-l.l2DATA4/l/l.lt/lDATA/l,0l4/l/lDATA,0l0l/ll0l0DATA0l\1l,0l 1l&DATA\1l1l0l1lDATA1lt2l\1l 2l<DATAt2l2l1l2lDATA2l3lt2l$3lFDATA3lL4l2l3lHDATAL4l5l3l4lGDATA5l5lL4lD5lDATA5l 6l5l5lDATA 6l6l5lL6lDATA6l7l 6l6lDATA7l7l6lD7lDATA7l8l7l7lDATA8lt8l7lD8lDATAt8l9l8l8l4DATA9l9lt8lT9l*DATA9l:l9l9lDATA:l:l9l\:lDATA:l$;l:l:lDATA$;l;l:ld;lDATA;lDll=l>lDATA\>l>l=l>l$DATA>lt?l\>l,?lDATAt?l@l>l?lDATA@l@lt?lD@l#DATA@lAl@l@lDATAAlAl@l\Al'DATAAl 0:DATAk gAlert = 3DATA k else:DATAk gAlert = 4DATA|k FILE.flush()DATAk FILE.close()DATA|kDATAk#=========================DATA(tkdef ObjImport(file, Name, filename):DATA k#========================= DATAk vcount = 0DATA k vncount = 0DATAk vtcount = 0DATA k fcount = 0DATA k gcount = 0DATA k setcount = 0DATA k groupflag = 0DATA k objectflag = 0DATA k mtlflag = 0DATA k baseindex = 0DATA k basevtcount = 0DATA k basevncount = 0DATA k matindex = 0DATA kDATA|k pointList = []DATAk uvList = []DATA|k normalList = []DATAk faceList = []DATA|k materialList = []DATAk uv = [] DATA tk lines = file.readlines()DATAk linenumber = 1DATA|kDATAk for line in lines:DATA lk words = line.split()DATA(k if words and words[0] == "#":DATA$k pass # ignore commentsDATA(k elif words and words[0] == "v":DATA k vcount = vcount + 1DATA <k x = float(words[1])DATA k y = float(words[2])DATA \k z = float(words[3])DATA(k pointList.append([x, y, z])DATAkDATA,k elif words and words[0] == "vt":DATA$k vtcount = vtcount + 1DATA k u = float(words[1])DATA k v = float(words[2])DATA$<k uvList.append([u, v])DATAkDATA,<k elif words and words[0] == "vn":DATA$k vncount = vncount + 1DATA dk i = float(words[1])DATA k j = float(words[2])DATA k k = float(words[3])DATA,k normalList.append([i, j, k])DATAkDATA( k elif words and words[0] == "f":DATA k fcount = fcount + 1DATA(D!k vi = [] # vertex indicesDATA(!k ti = [] # texture indicesDATA(d"k ni = [] # normal indicesDATA "k words = words[1:]DATA |#k lcount = len(words)DATA, $k for index in (xrange(lcount)):DATA4$k if words[index].find( "/") == -1:DATA0D%k vindex = int(words[index])DATAH%k if vindex < 0: vindex = baseindex + vindex + 1 DATA(&k vi.append(vindex)DATA$'k else:DATA4'k vtn = words[index].split( "/")DATA(D(k vindex = int(vtn[0])DATAD(k if vindex < 0: vindex = baseindex + vindex + 1 DATA()k vi.append(vindex) DATA*k DATA0*k if len(vtn) > 1 and vtn[1]:DATA,,+k tindex = int(vtn[1])DATAH+k if tindex < 0: tindex = basevtcount +tindex + 1DATA(t,k ti.append(tindex)DATA -kDATA0|-k if len(vtn) > 2 and vtn[2]:DATA,.k nindex = int(vtn[2])DATAH.k if nindex < 0: nindex = basevncount +nindex + 1DATA(\/k ni.append(nindex)DATA4/k faceList.append([vi, ti, ni, matindex])DATA0kDATA(1k elif words and words[0] == "o":DATA$1k ObjectName = words[1]DATA,2k objectflag = 1DATA02k #print "Name is %s" % ObjectNameDATAL3kDATA(3k elif words and words[0] == "g":DATAT4k groupflag = 1DATA 4k index = len(words)DATA d5k if objectflag == 0:DATA 5k objectflag = 1DATA |6k if index > 1:DATA47k ObjectName = words[1].join("_")DATA47k GroupName = words[1].join("_") DATAD8k else:DATA,8k ObjectName = "Default" DATA,\9k GroupName = "Default" DATA89k #print "Object name is %s" % ObjectNameDATA8:k #print "Group name is %s" % GroupNameDATA4;k else:DATA ;k if index > 1:DATA4<k DATA ?k if mtlflag == 0:DATAL?k matindex = AddMeshMaterial(GroupName,materialList, matindex)DATA$D@k gcount = gcount + 1 DATA@kDATADAk if fcount > 0: DATA$Ak baseindex = vcountDATA(\Bk basevncount = vncountDATA(Bk basevtcount = vtcountDATA|CkDATA0Ck elif words and words[0] == "mtllib":DATA(Dk # try to export materialsDATA4Ek directory, dummy = os.split(filename)DATA4Ek filename = os.join(directory, words[1])DATATFk try:DATA,Fk file = open(filename, "r")DATAlGk except:DATA8Gk print "no material file %s" % filenameDATAHk else:DATA Ik mtlflag = 1DATA,Ik file = open(filename, "r")DATA(,Jk line = file.readline()DATAJk while line:DATA,DKk words = line.split()DATA8Kk if words and words[0] == "newmtl":DATA(|Lk name = words[1]DATA8 Mk line = file.readline() # Ns ?DATA,Mk words = line.split()DATA\DNk while (words[0] != "Ka" and words[0] != "Kd" and words[0] != "Ks"): DATA8 Ok line = file.readline() # KaDATA0Ok words = line.split()DATA,DPk if words[0] == "Ka":DATA0Pk Ka = [float(words[1]),DATA0tQk float(words[2]),DATA0 Rk float(words[3])]DATA8Rk line = file.readline() # KdDATA0DSk words = line.split()DATA,Sk if words[0] == "Kd":DATA0tTk Kd = [float(words[1]),DATA0 Uk float(words[2]),DATA0Uk float(words[3])]DATA8 0:DATA8 ]k material = matlist[matindex]DATA,]k material.R = Kd[0]DATA,D^k material.G = Kd[1]DATA,^k material.B = Kd[2]DATA t_k try:DATA<_k material.specCol[0] = Ks[0]DATA<`k material.specCol[1] = Ks[1]DATA<Lak material.specCol[2] = Ks[2]DATA$ak except:DATA$bk passDATA ck try:DATADck alpha = 1 - ((Ka[0]+Ka[1]+Ka[2])/3)DATA$Ldk except:DATA$dk passDATA lek try:DATA8ek material.alpha = alphaDATA$fk except:DATA$$gk passDATAgk else:DATA( 0:DATA Lvk #mesh.hasFaceUV() = 1DATA,vk print ("Object has uv coordinates")DATAlwk DATA wk if len(materialList) > 0:DATA dxk for m in materialList:DATAxk try:DATA dyk M=Material.Get(m)DATA(yk mesh.materials.append(M) DATA|zk except:DATAzk passDATA|{kDATA{k total = len(faceList)DATA t|k i = 0DATA|kDATA\}k for f in faceList:DATA}k if i%1000 == 0:DATA8d~k print ("Progress = "+ str(i)+"/"+ str(total))DATA kDATA|k i = i + 1DATA$k vi, ti, ni, matindex = fDATAk face=NMesh.Face()DATA$k if len(materialList) > 0:DATA k face.mat = matindexDATA,kDATAk limit = len(vi)DATA($k setcount = setcount + len(vi)DATAk c = 0 DATA4k DATAk while c < limit:DATA,k m = vi[c]-1DATA,k if vtcount > 0 and len(ti) > c:DATADk n = ti[c]-1DATA,̆k if vncount > 0 and len(ni) > c:DATAdk p = ni[c]-1DATAkDATA\k if vtcount > 0:DATAk try:DATA$dk u, v = uvList[n]DATAk except:DATAtk pass DATAkDATAlk """ DATApk # multiply uv coordinates by 2 and add 1. Apparently blender uses uv range of 1 to 3 (not 0 to 1). DATA0Čk mesh.verts[m].uvco[0] = (u*2)+1DATA0\k mesh.verts[m].uvco[1] = (v*2)+1DATAk """DATAtkDATAk if vncount > 0:DATA(lk if p > len(normalList):DATAdk print("normal len = " +str(len(normalList))+ " vector len = " +str(len(pointList)))DATA(̐k print("p = " +str(p))DATA(\k x, y, z = normalList[p] DATA(k mesh.verts[m].no[0] = xDATA(|k mesh.verts[m].no[1] = yDATA( k mesh.verts[m].no[2] = zDATAk c = c+1 DATAk DATAk if len(vi) < 5:DATAk for index in vi:DATA0k face.v.append (mesh.verts[index-1])DATA 0: DATA 4k for index in ti:DATA(k u, v = uvList[index-1]DATA(Lk face.uv.append((u,v))DATAܘkDATALk if vcount>0:DATA̙k face.smooth=1DATATkDATA$Ěk mesh.faces.append(face) DATATkDATA0ěk print "all other (general) polygons ..."DATA\k for f in faceList:DATA$ܜk vi, ti, ni, matindex = f DATAlk if len(vi) > 4:DATA,k # export the polygon as edgesDATA<k print ("Odd face, vertices = "+ str(len(vi)))DATA(4k for i in range(len(vi)-2):DATA$ğk face = NMesh.Face()DATA,Tk if len(materialList) > 0:DATA(k face.mat = matindexDATA4|k face.v.append(mesh.verts[vi[0]-1])DATA4k face.v.append(mesh.verts[vi[i+1]-1])DATA4k face.v.append(mesh.verts[vi[i+2]-1])DATA\kDATA ̣k if vtcount > 0: DATA$\k if len(ti) > i+2:DATA,k u, v = uvList[ti[0]-1]DATA,k face.uv.append((u,v))DATA0k u, v = uvList[ti[i+1]-1]DATA,k face.uv.append((u,v))DATA0Lk u, v = uvList[ti[i+2]-1]DATA,k face.uv.append((u,v))DATA|kDATA(k mesh.faces.append(face)DATA|k DATA k NMesh.PutRaw(mesh, Name,1)DATAtkDATA8k print ("Total number of vertices is "+ str(vcount))DATA<k print ("Total number of faces is "+ str(len(faceList)))DATA84k print ("Total number of sets is "+ str(setcount))DATAԬkDATADkDATA4k print("Finished importing " +str(Name)+ ".obj")DATATkDATA,Įk#=========================================DATA4\kdef AddMeshMaterial(name, materialList, matindex):DATA,k#=========================================DATAk DATAk index = 0DATA|k found = 0 DATA k limit = len(materialList)DATA|kDATAk while index < limit:DATA(tk if materialList[index] == name:DATAk matindex = index DATAk found = 1DATA k index = limitDATAk index = index + 1DATA k DATA|k if found == 0: DATA k materialList.append(name)DATA(k matindex = len(materialList)-1DATA $k DATAk return matindexDATAkDATA,k#=========================================DATA($kdef AddGlobalMaterial (name, matindex):DATA,k#=========================================DATATk DATAĻk index = 0DATA 1 or exporttype > 1:DATA8k Transform = CreateMatrix(object, Transform)DATAlk multiflag = 1DATA k DATA4lk mesh = NMesh.GetRawFromObject(object.name)DATA k ObjName = mesh.nameDATA(k has_uvco = mesh.hasVertexUV()DATA$kDATA4k FILE.write("# Meshname:\t%s\n" % ObjName)DATA4kDATAk faces = mesh.facesDATA$,k materials = mesh.materialsDATA k Vertices = mesh.vertsDATA,Dk GlobalMaterials = Material.Get()DATAkDATALLk if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 4:DATA4k CreateMtlFile(Name, materials, MtlList)DATAkDATA<k # Total Vertices and faces; comment if not usefulDATADk FILE.write("# Total number of Faces:\t%s\n" % len(faces))DATAHlk FILE.write("# Total number of Vertices:\t%s\n" % len(Vertices))DATA$kDATAk FILE.write("\n")DATAkDATA4k # print first image map for uvcoords to useDATA@,k # to be updated when we get access to other texturesDATATk if mesh.hasFaceUV(): FILE.write("# UV Texture:\t%s\n\n" % mesh.hasFaceUV())DATAkDATALk if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 3:DATAPk UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATALtk elif len(materials) > 1 and len(GlobalMaterials) > 0 and type == 3:DATAL,k UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATAk else:DATA@\k Standard(faces, Vertices, has_uvco, FILE, ObjName)DATAk DATA4tk#================================================DATA4kdef CreateMtlFile (name, MeshMaterials, MtlList):DATA4k#================================================DATATk global gFilename DATAkDATA Lk # try to export materialsDATA4k directory, mtlname = os.split(gFilename.val)DATA tk mtlname = name + ".mtl"DATA0k filename = os.join(directory, mtlname)DATA$k file = open(filename, "w")DATA$kDATA<k file.write("# Materials for %s.\n" % (name + ".obj"))DATA, 0:DATA(tl limit = len(uvList)-200DATA0l while index > limit and found == 0:DATA,l uv_value = uvList[index-1]DATAD<l if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA0l uvPtrs.append(index+uvcount)DATAl found = 1DATA$ l index = index - 1DATAl if found == 0:DATA$$l uvList.append(uv)DATA$l index = len(uvList)DATA,Dl uvPtrs.append(index+uvcount)DATAl u, v = uvDATA4dl FILE.write("vt %s %s\n" % (u, v))DATAl uv_flag = 1DATAlDATA(l if has_uvco and uv_flag == 0:DATAl for v in Vertices:DATA  l u, v, z = v.uvco DATA l u = (u-1)/2DATA$!l v = (v-1)/2DATA0!l FILE.write("vt %s %s\n" % (u, v))DATAD"lDATA"l for v in Vertices: DATA<#l x, y, z = v.noDATA4#l FILE.write("vn %s %s %s\n" % (x, y, z))DATAd$lDATA$l p = 0DATAL%l uvindex = 0DATA%l total = len(faces)DATAT&lDATA&l for face in faces:DATAL'l p = p+1DATA'l if (p%1000) == 0:DATALT(l print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATA )lDATA|)l FILE.write("f ")DATA,*l for index in range(len(face.v)):DATA4*l v = face.v[index].index + vertexcountDATA$<+l if len(face.uv) > 0:DATAH+l FILE.write("%s/%s/%s " % (v+1, uvPtrs[uvindex], v+1))DATA$|,l uvindex = uvindex+1DATA -l elif has_uvco:DATA<-l FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA(<.l else: DATA4.l FILE.write("%s//%s " % (v+1, v+1))DATAt/l FILE.write("\n")DATA/lDATA4l0l vertexcount = vertexcount + len(Vertices)DATA( 1l uvcount = uvcount + len(uvList)DATA1lDATA@ 2l print("Export of " +str(ObjName)+ ".obj finished.\n")DATA2lDATAH$3l#=====================================================================DATAL3ldef UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): DATAH4l#===================================================================== DATAD5l global vertexcountDATA5l global uvcountDATAL6l global multiflagDATA6lDATAD7l uvPtrs = []DATA7l uvList = []DATAD8lDATA88l FILE.write("mtllib %s\n\n" % (Name + ".mtl"))DATA,T9l FILE.write("g %s\n\n" % (ObjName)) DATA9lDATA\:l for v in Vertices: DATA:l vert = v.co DATA d;l if multiflag == 1:DATA0;l vert = Alter(vert, Transform) DATAl uv_flag = 0DATA(>l for m in range(len(MtlList)):DATA ,?l for face in faces:DATA ?l if face.mat == m:DATA$D@l for uv in face.uv:DATA @l found = 0DATA(\Al index = len(uvList)DATA Al limit = 0DATA,|Bl if len(uvList)-200 > 0:DATA0Cl limit = len(uvList)-200DATA8Cl while index > limit and found == 0:DATA4TDl uv_value = uvList[index-1]DATALDl if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA8El uvPtrs.append(index+uvcount)DATA$LFl found = 1DATA,Fl index = index - 1DATA$tGl if found == 0:DATA,Hl uvList.append(uv)DATA,Hl index = len(uvList)DATA44Il uvPtrs.append(index+uvcount)DATA$Il u, v = uvDATA<dJl FILE.write("vt %s %s\n" % (u, v))DATA$ Kl uv_flag = 1DATAKlDATA( Ll if has_uvco and uv_flag == 0:DATALl for v in Vertices:DATA $Ml u, v, z = v.uvcoDATAMl u = (u-1)/2DATA4Nl v = (v-1)/2DATA0Nl FILE.write("vt %s %s\n" % (u, v))DATATOlDATAOl for v in Vertices: DATALPl x, y, z = v.noDATA4Pl FILE.write("vn %s %s %s\n" % (x, y, z))DATAtQlDATAQl total = len(faces)DATAlRl p = 0DATARl uvindex = 0DATA0dSl for m in range(len(MtlList)): DATA<Sl FILE.write("usemtl %s\n" % (MtlList[m].name)) DATA Tl for face in faces:DATA ,Ul if face.mat == m:DATAUl p = p+1DATA$DVl if (p%1000) == 0:DATAPVl print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATAWlDATA$Wl FILE.write("f ")DATA4Xl for index in range(len(face.v)):DATA<,Yl v = face.v[index].index + vertexcount DATA(Yl if len(face.uv) > 0:DATALlZl FILE.write("%s/%s/%s " % (v+1, uvPtrs[uvindex], v+1))DATA,$[l uvindex = uvindex+1DATA$[l elif has_uvco:DATA@L\l FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA\l else:DATA<]l FILE.write("%s//%s " % (v+1, v+1))DATA$,^l FILE.write("\n")DATA^lDATA4,_l vertexcount = vertexcount + len(Vertices) DATAT_l print("Export of " +str(ObjName)+ ".obj using material layers finished.\n")DATA`lDATAD`l#==================================================================DATAHaldef UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): DATAD\bl#==================================================================DATA cl global vertexcountDATAcl global multiflagDATAdlDATA8dl FILE.write("mtllib %s\n\n" % (Name + ".mtl")) DATA,,el FILE.write("o %s\n\n" % (ObjName))DATAel DATA ?!@A5 "BCDEFGHIJK(L#$M%N%OPQRSTUVWXYZ![\]^&_`ab'c(defghijklmnopqrst) uvwxy z{|}~ *mno+*,'c##DEPQ(#2s(#)+,-lmnopDE&(L.(/>lmno_`&(/L01![2223243 (/kj5      6 777658&3  ' '!(9"#/ $%jk&'()*27+,-./012304:::6556789:;  <&;=>?@AB<=>?@AB= CDEFG>HI?@>JK^ALMBmnoCND"3 O (#/ P Q RAS@TBUCVDW%EX Y9Zkj[\]^^_`aF bcde6f(#GGG 'Oghijk l'm'n(9"3HoIp Jq r O s t/uvjwxyz{|}~L     YE  K+l(&LLMMM'cN  O  PQ8NO@     RS'KS# MTU L! YR"QmP#LV #(d01@$%&'(W-XX)*Y+,-./012345'V6W789:;<H=>?i@ABCDEFGHIZJKLMNOPQRSTUVXXX)*Y+,[XX)*Y+,\XX)*Y+,WZX Y Z()[\]^_`a]XX)*Y+,bcdeZXf_\g hijklm(nopqr^ XX)*Y+,ZXf$_XX)*Y+,`stuvwxyz{a|}~ b XX)*Y+,ZX \ hcXX)*Y+,ZX#$\01`d XX)*Y+,_`ZXeXX)*Y+, 5_    fQXX)*Y+@Agghh%  ijkkk ijjjjjjjjjjj j j lE m!  !"#$%& '()*+l,n - . /S0123456789:;oooo< =pppo>o?qqq@ABC56DEFGqHYYYo>o?oIoJnKL6MNOPQ)RSTUVWXYZ[ \ ] ^r _`absc%NsdsesfPgt tt2hsijklu m uvy z|} ~ v%vvvn 2opqrstuvwxtysz(S0$M{|uv}v~v wx   yyyzzz2{{{*|}}}13(~ 'ghij 2g ('mhij~f        /     ' '  H' H ^_ w 'D S0' ' ux  '  T  '     'U w ![! ( 5!"#$%&'()*+XX)Y+ZXw01` ,ghij'm'n(uvjwxyz{|~-' .T / 01????m 2 345Iujwyz{6789:;<= > ?@AB  jy{ ^I C( r ^H CDE XX)Y+ZXHo\^F`JJJ(G (^GHIJK'LMNOP^Q'L^_O'L^O'L^O'LoHO'LRO'LS   TU^(HoVWXYZENDB