BLENDER_v230REND 1SRd44xR[xSRscreen mD7x7xDATA=xU>x,=xRenderRender@>DATA>xU?x=xAnimRender>DATA?xUl@x>xFormatRender>DATAl@xUDATADATA BxUBxDATABxUCx BxPreviewLamp>DATACxU|DxBxLampLamp@>DATA|DxULExCxSpotLamp>DATALExUFx|DxTexture and InputLamp>DATAFxUFxLExMap ToLamp>LExDATAFxUGxFxLink and MaterialsEditing>DATAGxUFxMeshEditing@>DATAHxEIx333?D}GCHB? Ax B?=CXXDATAKxVLxD??% ??%`Cmq?yo?/xOY@o!Ӿ@^3M@?!?ޘ$s9 ޘ>?`Cmq??OY@o???ND?`?Cmq?>??!?x B?=C>`?Cmq? DATAxOxKPxMx Lxdx @DATAPxEQxOx333?LxDdCD1MCC(BDC??DATATQxGPxLxLOAD TEXT FILE/home/ingo/games/obj_io_modif228.py DATA SxVWxLx6x5x6x6x=ɲ=o?/E// E 0&NSx 0?7m?N>GdΝl=A?F&?6C?Y=-*?7>7m?l= N>A?0?LdG&?^F6? y=1)^ڴk=b<J&:L;l]=Ô=J";|C9?@,Az,?@h AzCǭ^F@6?=ɲ=o?7> 0?7m?N>GdΝl=A?F&?6C?Y=-*?>?hY:Ax B?=C=^F?/ ض DATATy"`2)k?̡> (>϶>Z?cH0?9? fLj>(k?+?y"Ρ>ө@8ϥ/@?@?Ҏ=Bp++ K?4?)"?y"?t2B@Ǿ̡ƾ?X?AZAo,!?y)? ` ڽ=MI>вm AYW[BןX&AvUA-)@?Ut(@AHMbH0? +?9?hLj>y"`2)k?̡> (>϶>Z?C?m d_Lg@x B?=C>4.> DATAZxEXx333?WxDdCD1MCC(BDC??SRd[xR44xSRscreen.001|\x<_x|_xcxcxwx}xDATA|\xS\xDATA\xS\x|\xDATA\xS<]x\xDATA<]xS|]x\xDATA|]xS]x<]xDATA]xS]x|]xDATA]xS<^x]xDATA<^xS|^x]xDATA|^xS^x<^xDATA^xS^x|^xDATA^xS<_x^xDATA<_xS^xDATA|_xT_x\x\xDATA_xT_x|_x|\x<]xDATA_xT<`x_x\x|]xDATA<`xT|`x_x\x]xDATA|`xT`x<`x|]x]xDATA`xT`x|`x|\x]xDATA`xT}GCHB? Ax B?=CXXDATA,hxVixcx|]x\x\x]xdDATAixVnx,hx]x|^x^x<^xg=Ρ>o?qqdixlxDATAixFjx333?zCAzCA A@FB= A DATAjxHlxix333?AA Y YCA A@CC #<@TlxTlxDATA,TlxdOB`AxDATA lx@jx333????55@??A0??5>5?g=Ρ>o$[;??cYAYJ@5>5??cYAx B? #<C55@DATAnxVwxix^x<_x]x^xg=S=o?w}w}5dox|uxDATAoxFpx333?zCAzCA A@FB= A DATApxEqxox333?DdCJRCۖzDGhICC(BDC??DATAqxDrxpx333?zC̽̌?zC@ #< #<`jFzD OBzC̽̌?DATArxIsxqx333??DATAsxH|uxrx333?AA>l>lBA A@CC #<@$ux$uxDATA,$uxdOBp=AxDATA |ux@sx333????55@??A0??5>5?g=S=o$s>?cYA~2bA5>5??cYAx B?=C55@DATAwxVnx|^x|]x<_x^xg=+=o?w}w}dxxzxDATAxxDyx333?zC̽̌?zC@@@ #< #<`jFzD OBzC̽̌?DATAyxEzxxx333?DdC@CdDGhICC(BDC??DATA zx@yx333????55@??A0??5>5?g=+=o$gV>?cYAL³90A5>5??cYAx B?=C55@SC(}x>SC1xoxov@@@MAdd??< K=fff?=fff?Z@??//backbuf//ftypeDDATAo8p*ԄxDATAp8wo*dxDATAw8xp*FuDATAx8,xw*pDATA,x8txx'txDATAtx8x,x*txDATAx8txxOBx5txOBCamera ,xө@9Υ/@????0O??dH0?9? gLj>)k?+?y"͡>ө@9Υ/@??????;=1D~?Mu2Uh#3ײ?4_!4f2?Dd??)d??>)d?????OBtx5txxOBMeshxooDx????N%N%???&$&&$=3?&$=3??????vR?n ?Z)?$Ċ?@ A@tWA?Dd?? #=?>=?@???DATADxOBtx5ptxOBCylinder$xlili#.@.@.@??.@.@.@#?????8>>nƲi)ӽ=>ez>N2n>? Sl%??Dd?? #=?>=?@???OBp5FutxOBMesh.001pnnx????N%N%???&$&&$=3?&$=3??????vR?n ?Z)?$Ċ?@ A@tWA?Dd?? #=?>=?@???DATAxOBFu5dxpOBMesh.002ԍpdodo\ m????N%N%???&$&&$=3?&$=3??????vR?n ?Z)?$Ċ?@ A@tWA?Dd?? #=?>=?@???DATA\ mOBdx5ԄxFuOBMesh.003,t~w~ww????N%N%???&$&&$=3?&$=3??????vR?n ?Z)?$Ċ?@ A@tWA?Dd?? #=?>=?@???DATAwOBԄx5dxOBMesh.004pxxp????N%N%???&$&&$=3?&$=3??????vR?n ?Z)?$Ċ?@ A@tWA?Dd?? #=?>=?@???DATApMEx2ppMEcarDb< p< pxtv:Rh,x=b?C?Zd@DATAx xDATAv/:볿q1>?\tn_??ft?n_??gGf?q1>?X\;Ŀq;T>{X@!\?ڵTh!?\?&JTh;?q;T>F\{X@|yac??"|4|ya!@~ v}>!@x4~/v?}>!@4~/•?&>!@~ |ya>!@|׿4E>!@wY5׿}ߙ=?I!W,׿}ߙ=t{Q?}ߙ=b{Q?}ߙ=?]!W,?4E>!@u[wY5O!@сqO?0~OO?}O??}~O?!@/~qOE&!@冕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@_| ׿4E>|o@!X~ O|o@z2 OE&|o@Æ؁ T~A|o@& Tl|o@a T0d|o@3I b|o@IY1} b姿|o@Χb?姿|o@r\Χb?|o@uY1} T?0d|o@t3I T?l|o@ T?~A|o@x O?E&|o@=y؁ O?|o@}2 ?4E>|o@[X~ v?}>|o@| •?&>|o@ \$\>@v}H*$>@z~=@t%T:w&<@-V^Mؿ)& @X'MؿE&@t{2Kο~A@rv7Kοl@98Kο0d@ 44σ߿@!/ /σ߿姿@D'σ?姿@WXD'σ?@Nm!/ /K?0d@g44K?l@r98K?~A@krv7M?E&@o{2M?)& @u'T:?w&<@QV^?~=@'$t%?*$>@z$=D@PQb%0*VAj{~wD@}/Dyk)& D@C3={E&D@WUoM~A~@)oMl~@uM0d~@99i2= @.k2姿= @poZ2?姿= @J+poZ2?= @y4.kM?0d~@]-99iM?l~@2uM?~A~@/eo?E&D@n5WUo?)& D@3={{~?wD@ /DykޫZ?c^D@Aj%0?*VT#Thv>TWcfNWxn_?To`A#c?T6{VWx?n_?T7ov?>TLcfN?_>TM`#ThO?T~O?E&TyT?~ATyT?lTT?0dTQu.3b?TQu.3b?姿TZb姿TbT.3T0dT.3TlTT~AT冕OE&T冕OTm׿_>X9dʢWv>X9d(yQ•&>X9d-|aǡ>X9d|O•?&>X9d-|v?>X9d&(yQ?_>X9d6]WO?X9d~7O?E&X9dyT?~AX9dyT?lX9dT?0dX9dQu.3b?X9dQu.3b?姿X9dZb姿X9dbX9d.3T0dX9d.3TlX9dT~AX9d冕OE&X9d冕OX9dm7׿}ߙ=ݢ^Qvq1>x•&>~]•?&>:~]v?q1>)#x?}ߙ=#]^QO?㾪y#nO?E&teT?~AoΦT?lxT?0dl9b?r1Hb?姿]R6b姿`R6b1HT0d9TlT~AΦOE&:eO㾪7#nS˾}ߙ=t'JIc&>t^ܪIc?&>t cS˾?}ߙ=t8XLp|?wAR|?E&w;a?~At4a?lt7Ȍa?0dt#/j|п{.@j].?S^kk@Nie?X־k@ ,@]e|?{.@R]?%w.@$>j%밾|=D@Jkg%>|=D@ Le(}]~@߬{~AD@۹z&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@gxv$_좠>Yw %?>ez&$_>좠>YU!w卾^>﬍s>^>﬍0s %|)>>Zeձ >+? >+%&>fБ%E?=K?וޕ:VTTLQ ?uY[^GlnO%P ?%YzTT>LQ ?uYe^G>K?ו"j:VБ%,?猘n1?-? cRtTT2?uZJlnO%#6?%wTT>2?u?]ZJ>?-? cYt%%??b A?p`$H?iU$9<%~M?ZIA2$>H?U$ >A?`bڿ%hv9?~Ygq&=?Ω5^}L?{N `9<%qT?Էqj}>L?{N `q&?=?4Ω5^bڿ%W?D4"q&ȵI?Bj;}ѕX?-x_Q9<%.b?͆t\X}>ѕX?-x_Qq&?ȵI?B T] :\?5PDYM?xL@<+NA?I? 4.P?ĔέH?YM?x@< ?:\?5PWG ?4.P?Ĕ2RH?+NA?IRDATAt*R @ @       @@  ~ @   @       @?  A@      RQ  SR ?S BA @@~@ @@QP@CB@@@@@@ @PO @DC@"!@#"@#@@%$@ &%@ ON&@!ED@"('!@#)("@#)@$@%+*$@&,+%@&NM,@'FE!@(.-'@)/.(@)/@*$@+10*@,21+@,ML2@-GF'@.43- /54. /5 0*@1760 2871 2LK8 3HG- 4:93@5;:4@5;@60 7=<6@8>=7@8KJ>@9IH3@;< <6@>JI9 ?ThS @UT? AVU@ BWVA CXWB@DYXC@EZYD@F[ZE@G\[F@H]\G I^]H@J_^I K`_J@La`K MbaL@NcbM@OdcN@PedO@QfeP@RgfQ ShgR VkjU WlkV Wl XW@YnmX@ZonY@[poZ@\qp[@]rq\ ^sr]@_ts^ `ut_@avu` bwva@cxwb@dyxc@ezyd@ez!feDg|{f h}|g i j kjlmlklmX,mlnmonqvwpruvq sturyxz{zyzz{f {z|{}|~@~        @@@@@ @ @ @@@@@        @@@@@ @ @ @@@@@           @@ @@ @ @ @@ @ !H!K(A)Ei } m  @@ @m @{@@             @ @       @@ % !  "! #"$#%$  &+% !'&  "('! #)(" $*)# %+*$ &,1+'-,&'43-(54'$)/.(*0/)*870+98* -./,)-32.!.25(01,/$0761"169+3452K7896H:;< :<= :=> :>9 Ti T} T}h Uj Ui UiT pwxpxpo@ @MEp2ԍpxMEcar.001dpwwmp xP\?U7p>^?^?DATAm xDATA@ x/P@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$ç @W5UCxDATAPp*\ !    /@ /.@.--,,+@+*@ *)  )(    (' @   '& @   &%    %$    $#@ #"@ !"  0?/@!10 @"21!@#32"@$43#@%54$@&65%@'76&@(87'@)98(@*:9)@+;:*@,<;+@-=<,@.>=-@/?>.@0@O? 1A@0 2BA1 3CB2 4DC35ED46FE57GF68HG7 9IH8 :JI9 ;KJ: <LK;=ML<>NM=?ON>@@@@@@@@@@@@@@ABC@ACD@ADE@AEF@AFG@AGH@AHI@AIJ@AJK@AKL@ALM@AMN@ANO@AO@@MEԍp2,tpMEcar.002lonnm̮uDuP\?Uף@@p>^?^?DATAm xDATA@Du/P@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@5UCxDATAP̮u*\ !    /@ /.@.--,,+@+*@ *)  )(    (' @   '& @   &%    %$    $#@ #"@ !"  0?/@!10 @"21!@#32"@$43#@%54$@&65%@'76&@(87'@)98(@*:9)@+;:*@,<;+@-=<,@.>=-@/?>.@0@O? 1A@0 2BA1 3CB2 4DC35ED46FE57GF68HG7 9IH8 :JI9 ;KJ: <LK;=ML<>NM=?ON>@@@@@@@@@@@@@@ABC@ACD@ADE@AEF@AFG@AGH@AHI@AIJ@AJK@AKL@ALM@AMN@ANO@AO@@ME,t2pԍpMEcar.003|p"x"xt4x$xwP\mۿUף@@p>^?^?DATAt xDATA@$xw/Pg,ڿף@@ѓ1ѿU@Ѫ-߉h@эsT0d.t@LVnUYx@mw9.t@Ѵ-Vn,_h@sTsTeU@Vn-jm=ף@@nweR+@VnL,_)?@sT9+ @Ѵ-U@0d+ @LҪ߉)?@э1ѿR+@ѪLxџg,ڿף@@5U~xџ1ѿU@5Uç$xџ߉h@5UwCxџ0d.t@5Us=XxџUYx@5U_xџ9.t@5U$=Xxџ_h@5UCCxџ8U@5U=X$xџk=ף@@5U_xџ8R+@5U=Xtxџ_)?@5UCwxџ9+ @5U$çxџU@5U~xџ0d+ @5Usçxџ߉)?@5Uwwxџ1ѿR+@5Uçs ſqS@s$ yͿף@@s ſ-@s$ =!@s \W>@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@˪ww4`a@˪sçUYid@˪~B!`a@˪$çW Y@˪CxDATAP4x*\ !"  ! / @./@-.,- +,@ *+@ )*    ()    '( @   &' @   %&   $%  #$ @ "#@ 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 @@@@@@@@@@@@@@@ON@@NM@@ML@@LK@@KJ@@JI@@IH@@HG@@GF@@FE@@ED@@DC@@CB@@BA@MEp2$x,tMEcar.0044pppplpCwP\mۿU7p>^?^?DATAp xDATA@Cw/Pg,ڿ7ѓ1ѿ}"Ѫ-߉+jэsT0dVLVnUmw9VѴ-Vn,_+jsTsTe}"Vn-jm=7nwe MVnL,_3_sT90GkѴ-U˄o0d0GkLҪ߉3_э1ѿ MѪLxџg,ڿ75U~xџ1ѿ}"5Uç$xџ߉+j5UwCxџ0dV5Us=XxџU5U_xџ9V5U$=Xxџ_+j5UCCxџ8}"5U=X$xџk=75U_xџ8 M5U=Xtxџ_3_5UCwxџ90Gk5U$çxџU˄o5U~xџ0d0Gk5Usçxџ߉3_5Uwwxџ1ѿ M5Uçs ſ%s$ yͿ7s ſJs$ =Zs \Y4es$ Uhs I Y4es$  Zs& .WJs2 _7s 7 .W%s2  #s&& I Yi s2 Uޫs 7 \Yi s2 =#s& @٬y*M K7T @٬9EM0  W"Qz;y; B!bX0 M U[[T 4bXߵM "Qy; ,9EK0  Ռ7 ,y*K ྐć 4PK UW  B!P0 K Wz;@٬y*˪=XsK7˪_@٬9E˪=X$W"Q˪CCB!bX˪$=XU[[˪_4bX˪s=X"Q˪wC,9E˪ç$Ռ7˪~,y*˪çtྐ˪ww4P˪sçUW ˪~B!P˪$çW˪CxDATAPlp*\ !"  ! / @./@-.,- +,@ *+@ )*    ()    '( @   &' @   %&   $%  #$ @ "#@ 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 @@@@@@@@@@@@@@@ON@@NM@@ML@@LK@@KJ@@JI@@IH@@HG@@GF@@FE@@ED@@DC@@CB@@BA@ME$x2pMECylinderDililidxxB`qu@qu@Z>DATA(x/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>DATAdx*`@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( x!MAdefault???????????L??2 ?????@?=?=?CAl,xCACamera2=B? A B?TXddxTXobj_io_modif228.pyxxDxDrDxDx|=zDATA$x/home/ingo/games/obj_io_modif228.pyDATADxxrJDATAxxDxr&DATAxxxLr5DATAxDxxrtesiDATADxxxrD ViDATAxxDx4r11|TDATAxxxdrttonDATAxDxxr2DATADxxxrDATAxxDx$rDATAxxxTrJDATAxDxxrECDATADxxxDATA6y7y6ylz7DATA7yD7y6y̓z<DATAD7y7y7y4zDATA7y7yD7ytzDATA7y8y7yzDATA8yD8y7yzPDATAD8y8y8y|z<?DATA8y8yD8yz?DATA8y9y8y$zDATA9yD9y8ydzDATAD9y9y9yzU<0DATA9y9yD9y,z;DATA9y:y9yzDATA:yD:y9yԗzDATAD:y:y:yzDATA:y:yD:y\z)DATA:y;y:yz;DATA;yD;y:yzDATAD;y;y;y\z DATA;y;yD;yzDATA;yy=yDz!DATA>yD>y=yz 0DATAD>y>y>y̜z!DATA>y>yD>yz!DATA>y?y>ylzDATA?yD?y>yz!B!DATAD?y?y?yz DATA?y?yD?y4zDATA?y@y?ydz!DATA@yD@y?yz&DATAD@y@y@yz(DATA@y@yD@y\zDATA@yAy@yzDATAAyDAy@yܟzDATADAyAyAy z DATAAyAyDAyDz#DATAAyByAyz DATAByDByAy̠z2DATADByByBy,z DATAByByDBydz DATAByCyByz DATACyDCyByzDATADCyCyCy4z.DATACyCyDCyz“?DATACyDyCy̢zDATADyDDyCy zDATADDyDyDyLzDATADyDyDDyzDATADyEyDỵzDATAEyDEyDy zDATADEyEyEyDATAyyDy7{>DATAyyy,8{>DATAyDyy8{-DATADyyy8{DATAyyDy9{DATAyyy\9{DATAyDyy9{DATADyyy9{DATAyyDy :{DATAyyy<:{<DATAyDyy:{8DATADyyy ;{=DATAyyDyt;{DATAyyy;{DATAyDyy;{DATADyyy<<{DATAyyDyl<{DATAyyy<{DATAyDyy<{DATADyyy={*DATAyyDyt={*DATAyyy={DATAyDyy={DATADyyyD>{DATAyyDy>{DATAyyy>{+DATAyDyy$?{DATADyyyl?{DATAyyDy?{0DATAyyy@{DATAyDyy4@{DATADyyyt@{DATAyyDy@{DATAyyyA{DATAyDyyDA{DATADyyyA{DATAyyDyA{#DATAyyyB{&DATAyDyylB{/DATADyyyB{)DATAyyDyC{@DATAyyyC{.DATAyDyyC{DATADyyy,D{ DATAyyDy|D{DATAyyyD{ DATAyDyyE{"DATADyyydE{+DATAyyDyE{DATAyyyF{0DATAyDyydF{DATADyyyF{DATAyyDyF{$DATAyyy,G{DATAyDyytG{DATADyyyG{DATAyyDyG{DATAyyy 0:DATALz gAlert = 3DATA z else:DATAĮz gAlert = 4DATAz FILE.flush()DATADz FILE.close()DATAzDATAz#=========================DATA(zdef ObjImport(file, Name, filename):DATA Lz#========================= DATAz vcount = 0DATA԰z vncount = 0DATAz vtcount = 0DATATz fcount = 0DATAz gcount = 0DATAԱz setcount = 0DATAz groupflag = 0DATATz objectflag = 0DATAz mtlflag = 0DATAԲz baseindex = 0DATAz basevtcount = 0DATATz basevncount = 0DATAz matindex = 0DATAԳzDATAz pointList = []DATADz uvList = []DATAz normalList = []DATAĴz faceList = []DATAz materialList = []DATADz uv = [] DATA |z lines = file.readlines()DATAĵz linenumber = 1DATAzDATA4z for line in lines:DATA tz words = line.split()DATA(z if words and words[0] == "#":DATA$ z pass # ignore commentsDATA(\z elif words and words[0] == "v":DATA z vcount = vcount + 1DATA z x = float(words[1])DATA 1 and vtn[1]:DATA,4z tindex = int(vtn[1])DATAHz if tindex < 0: tindex = basevtcount +tindex + 1DATA(z ti.append(tindex)DATALzDATA0|z if len(vtn) > 2 and vtn[2]:DATA,z nindex = int(vtn[2])DATAH,z if nindex < 0: nindex = basevncount +nindex + 1DATA(z ni.append(nindex)DATA4z faceList.append([vi, ti, ni, matindex])DATALzDATA(|z elif words and words[0] == "o":DATA$z ObjectName = words[1]DATAz objectflag = 1DATA0dz #print "Name is %s" % ObjectNameDATAzDATA(z elif words and words[0] == "g":DATA 1:DATA4z ObjectName = words[1].join("_")DATA4z GroupName = words[1].join("_") DATAdz else:DATA,z ObjectName = "Default" DATA,z GroupName = "Default" DATA8Tz #print "Object name is %s" % ObjectNameDATA8z #print "Group name is %s" % GroupNameDATAz else:DATA Tz if index > 1:DATA4z GroupName = join(words[1],"_") DATAz else:DATA, 0: DATA$z baseindex = vcountDATA(z basevncount = vncountDATA(Lz basevtcount = vtcountDATAzDATA0z elif words and words[0] == "mtllib":DATA($z # try to export materialsDATA4tz directory, dummy = os.split(filename)DATA4z filename = os.join(directory, words[1])DATA4z try:DATA,tz file = open(filename, "r")DATAz except:DATA8 z print "no material file %s" % filenameDATAlz else:DATAz mtlflag = 1DATA,z file = open(filename, "r")DATA(Lz line = file.readline()DATAz while line:DATA,z words = line.split()DATA8 0:DATA8$z material = matlist[matindex]DATA,z material.R = Kd[0]DATA,z material.G = Kd[1]DATA,4z material.B = Kd[2]DATA z try:DATA<z material.specCol[0] = Ks[0]DATA< 0:DATA z #mesh.hasFaceUV() = 1DATA,z print ("Object has uv coordinates")DATAtz DATA z if len(materialList) > 0:DATA z for m in materialList:DATA4z try:DATA lz M=Material.Get(m)DATA(z mesh.materials.append(M) DATAz except:DATADz passDATAzDATAz total = len(faceList)DATA z i = 0DATA4zDATAdz for f in faceList:DATAz if i%1000 == 0:DATA8z print ("Progress = "+ str(i)+"/"+ str(total))DATADzDATAtz i = i + 1DATA$z vi, ti, ni, matindex = fDATAz face=NMesh.Face()DATA$Lz if len(materialList) > 0:DATA z face.mat = matindexDATAzDATAz limit = len(vi)DATA(Tz setcount = setcount + len(vi)DATAz c = 0 DATAz DATAz while c < limit:DATA\z m = vi[c]-1DATA,z if vtcount > 0 and len(ti) > c:DATAz n = ti[c]-1DATA, 0 and len(ni) > c:DATAz p = ni[c]-1DATAzDATA z if vtcount > 0:DATATz try:DATA$z u, v = uvList[n]DATAz except:DATA$z pass DATAdzDATAz """ DATApz # multiply uv coordinates by 2 and add 1. Apparently blender uses uv range of 1 to 3 (not 0 to 1). DATA0lz mesh.verts[m].uvco[0] = (u*2)+1DATA0z mesh.verts[m].uvco[1] = (v*2)+1DATAz """DATATzDATAz if vncount > 0:DATA(z if p > len(normalList):DATAdz print("normal len = " +str(len(normalList))+ " vector len = " +str(len(pointList)))DATA(z print("p = " +str(p))DATA(z x, y, z = normalList[p] DATA(Lz mesh.verts[m].no[0] = xDATA(z mesh.verts[m].no[1] = yDATA(z mesh.verts[m].no[2] = zDATA 0: DATA z for index in ti:DATA(Lz u, v = uvList[index-1]DATA(z face.uv.append((u,v))DATAzDATAz if vcount>0:DATA\z face.smooth=1DATAzDATA$z mesh.faces.append(face) DATA${DATA0T{ print "all other (general) polygons ..."DATA{ for f in faceList:DATA${ vi, ti, ni, matindex = f DATA<{ if len(vi) > 4:DATA,|{ # export the polygon as edgesDATA<{ print ("Odd face, vertices = "+ str(len(vi)))DATA(<{ for i in range(len(vi)-2):DATA${ face = NMesh.Face()DATA,{ if len(materialList) > 0:DATA(4{ face.mat = matindexDATA4{ face.v.append(mesh.verts[vi[0]-1])DATA4{ face.v.append(mesh.verts[vi[i+1]-1])DATA4D{ face.v.append(mesh.verts[vi[i+2]-1])DATA{DATA { if vtcount > 0: DATA${ if len(ti) > i+2:DATA,l{ u, v = uvList[ti[0]-1]DATA,{ face.uv.append((u,v))DATA0{ u, v = uvList[ti[i+1]-1]DATA,t{ face.uv.append((u,v))DATA0{ u, v = uvList[ti[i+2]-1]DATA,${ face.uv.append((u,v))DATA|{DATA({ mesh.faces.append(face)DATA{ DATA ,{ NMesh.PutRaw(mesh, Name,1)DATAt{DATA8{ print ("Total number of vertices is "+ str(vcount))DATA< { print ("Total number of faces is "+ str(len(faceList)))DATA8l { print ("Total number of sets is "+ str(setcount))DATA {DATA {DATA4, { print("Finished importing " +str(Name)+ ".obj")DATA {DATA, {#=========================================DATA4 {def AddMeshMaterial(name, materialList, matindex):DATA,t {#=========================================DATA { DATA { index = 0DATA4 { found = 0 DATA l { limit = len(materialList)DATA {DATA { while index < limit:DATA($ { if materialList[index] == name:DATAt { matindex = index DATA { found = 1DATA { index = limitDATA<{ index = index + 1DATA|{ DATA{ if found == 0: DATA { materialList.append(name)DATA(4{ matindex = len(materialList)-1DATA { DATA{ return matindexDATA{DATA,,{#=========================================DATA({def AddGlobalMaterial (name, matindex):DATA,{#=========================================DATA,{ DATA\{ index = 0DATA{ found = 0DATA{ matindex = 0DATA { MatList = Material.Get()DATAT{ limit = len(MatList)DATA{DATA{ while index < limit:DATA({ if MatList[index].name == name:DATAT{ matindex = index DATA{ found = 1DATA{ index = limitDATA{ index = index + 1DATA\{DATA{ if found == 0:DATA${ material = Material.New(name)DATA{ matindex = indexDATA\{ DATA{ return matindexDATA{DATA${#================================DATA$L{def ObjExport(FILE, Name, type):DATA${#================================DATA{ global returncodeDATA,{ global vertexcountDATAl{ global uvcountDATA{ global TransformDATA{ global multiflagDATA,{ global exporttypeDATAl{DATA{ vertexcount = 0DATA{ uvcount = 0DATA{ returncode = 0DATA T{ print("Writing %s..." % Name)DATAX{ FILE.write("# Wavefront OBJ (1.0) exported by lynx's OBJ import/export script\n\n")DATA{DATA$L{ Objects = Object.GetSelected()DATA{ if Objects == []:DATA0{ print("You have not selected an object!")DATA4{ returncode = 4DATAt{ else:DATA{ for object in Objects:DATA{ MtlList = []DATA0,{ if len(Objects) > 1 or exporttype > 1:DATA8{ Transform = CreateMatrix(object, Transform)DATA{ multiflag = 1DATA ,{ DATA4d{ mesh = NMesh.GetRawFromObject(object.name)DATA{ ObjName = mesh.nameDATA( { has_uvco = mesh.hasVertexUV()DATA\{DATA4{ FILE.write("# Meshname:\t%s\n" % ObjName)DATA{DATA{ faces = mesh.facesDATA$d{ materials = mesh.materialsDATA { Vertices = mesh.vertsDATA,{ GlobalMaterials = Material.Get()DATAT {DATAL { if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 4:DATA4 { CreateMtlFile(Name, materials, MtlList)DATA\!{DATA<!{ # Total Vertices and faces; comment if not usefulDATAD!{ FILE.write("# Total number of Faces:\t%s\n" % len(faces))DATAHd"{ FILE.write("# Total number of Vertices:\t%s\n" % len(Vertices))DATA"{DATA#{ FILE.write("\n")DATAL#{DATA4|#{ # print first image map for uvcoords to useDATA@#{ # to be updated when we get access to other texturesDATATD${ if mesh.hasFaceUV(): FILE.write("# UV Texture:\t%s\n\n" % mesh.hasFaceUV())DATA${DATAL${ if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 3:DATAPl%{ UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATAL%{ elif len(materials) > 1 and len(GlobalMaterials) > 0 and type == 3:DATAL\&{ UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATA&{ else:DATA@ '{ Standard(faces, Vertices, has_uvco, FILE, ObjName)DATAt'{ DATA4'{#================================================DATA4({def CreateMtlFile (name, MeshMaterials, MtlList):DATA4d({#================================================DATA({ global gFilename DATA){DATA 4){ # try to export materialsDATA4|){ directory, mtlname = os.split(gFilename.val)DATA ){ mtlname = name + ".mtl"DATA0$*{ filename = os.join(directory, mtlname)DATA$|*{ file = open(filename, "w")DATA*{DATA<*{ file.write("# Materials for %s.\n" % (name + ".obj"))DATA,d+{ file.write("# Created by Blender.\n")DATAl+{ file.write("# These files must be in the same directory for the materials to be read correctly.\n\n")DATAT,{DATA ,{ MatList = Material.Get()DATA ,{ print str(MeshMaterials)DATA-{DATAD-{ MtlNList=[]DATA-{ for m in MatList:DATA$-{ MtlNList.append(m.name)DATA.{DATAL.{ counter = 1DATA.{ found = 0 DATA.{DATA(.{ for material in MeshMaterials:DATA L/{ for mtl in MtlList:DATA /{ if material == mtl:DATA/{ found = 1DATA$0{DATA$T0{ MtlList.append(material) DATA0{DATA0{ if found == 0:DATA81{ file.write("newmtl %s \n" % material.name)DATAt1{ index = 0DATA$1{ print material, MatListDATA(2{ while index < len(MatList):DATA8T2{ if material.name == MatList[index].name:DATA(2{ mtl = MatList[index]DATA(3{ index = len(MatList)DATAT3{ found = 1DATA$3{ index = index + 1DATA3{DATA4{ if found == 1:DATA(d4{ alpha = mtl.getAlpha()DATAl4{ file.write(" Ka %s %s %s \n" % (round(1-alpha,5), round(1-alpha,5), round(1-alpha,5)))DATAhL5{ file.write(" Kd %s %s %s \n" % (round(mtl.R,5), round(mtl.G,5), round(mtl.B,5)))DATA5{ file.write(" Ks %s %s %s \n" % (round(mtl.specCol[0],5), round(mtl.specCol[1],5), round(mtl.specCol[2],5)))DATA06{ file.write(" illum 1\n")DATA6{ DATA7{ else:DATA@\7{ file.write(" Ka %s %s %s \n" % (0, 0, 0))DATA@7{ file.write(" Kd %s %s %s \n" % (1, 1, 1))DATA@,8{ file.write(" Ks %s %s %s \n" % (1, 1, 1))DATA08{ file.write(" illum 1\n")DATA8{DATA9{ found = 0DATA\9{DATA9{ file.flush()DATA9{ file.close()DATA :{ DATA@<:{#===========================================================DATA<:{def Standard(faces, Vertices, has_uvco, FILE, ObjName): DATA@ ;{#=========================================================== DATAt;{ global vertexcountDATA;{ global uvcountDATA;{ global multiflagDATA<<{DATAl<{ uvPtrs = []DATA<{ uvList = []DATA<{DATA,={ FILE.write("o %s\n\n" % (ObjName)) DATA,t={ FILE.write("g %s\n\n" % (ObjName)) DATA={ DATA={ for v in Vertices: DATAD>{ vert = v.co DATA >{ if multiflag == 1:DATA,>{ vert = Alter(vert, Transform) DATA$?{ x, y, z = vertDATAl?{ DATA4?{ FILE.write("v %s %s %s\n" % (x, y, z))DATA@{DATA4@{ uv_flag = 0DATAt@{ for face in faces:DATA@{ for uv in face.uv:DATAA{ found = 0DATA DA{ index = len(uvList)DATAA{ limit = 0DATA$A{ if len(uvList)-200 > 0:DATA(B{ limit = len(uvList)-200DATA0lB{ while index > limit and found == 0:DATA,B{ uv_value = uvList[index-1]DATADC{ if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA0C{ uvPtrs.append(index+uvcount)DATAC{ found = 1DATA$,D{ index = index - 1DATA|D{ if found == 0:DATA$D{ uvList.append(uv)DATA$E{ index = len(uvList)DATA,dE{ uvPtrs.append(index+uvcount)DATAE{ u, v = uvDATA4F{ FILE.write("vt %s %s\n" % (u, v))DATAdF{ uv_flag = 1DATAF{DATA(F{ if has_uvco and uv_flag == 0:DATA,G{ for v in Vertices:DATA tG{ u, v, z = v.uvco DATAG{ u = (u-1)/2DATAG{ v = (v-1)/2DATA0 0:DATAHM{ FILE.write("%s/%s/%s " % (v+1, uvPtrs[uvindex], v+1))DATA$ N{ uvindex = uvindex+1DATA\N{ elif has_uvco:DATA<N{ FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA( O{ else: DATA4\O{ FILE.write("%s//%s " % (v+1, v+1))DATAO{ FILE.write("\n")DATAP{DATA44P{ vertexcount = vertexcount + len(Vertices)DATA(P{ uvcount = uvcount + len(uvList)DATAP{DATA@Q{ print("Export of " +str(ObjName)+ ".obj finished.\n")DATA|Q{DATAHQ{#=====================================================================DATALR{def UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): DATAHDy#===================================================================== DATAy global vertexcountDATAy global uvcountDATA 0:DATA0y limit = len(uvList)-200DATA8Dz while index > limit and found == 0:DATA4z uv_value = uvList[index-1]DATALz if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA8|z uvPtrs.append(index+uvcount)DATA$z found = 1DATA,,z index = index - 1DATA$z if found == 0:DATA,z uvList.append(uv)DATA,,z index = len(uvList)DATA4z uvPtrs.append(index+uvcount)DATA$z u, v = uvDATA<4z FILE.write("vt %s %s\n" % (u, v))DATA$z uv_flag = 1DATAzDATA(z if has_uvco and uv_flag == 0:DATAlz for v in Vertices:DATA z u, v, z = v.uvcoDATAz u = (u-1)/2DATA<z v = (v-1)/2DATA0|z FILE.write("vt %s %s\n" % (u, v))DATAzDATAz for v in Vertices: DATALz x, y, z = v.noDATA4z FILE.write("vn %s %s %s\n" % (x, y, z))DATAzDATA$z total = len(faces)DATAlz p = 0DATAz uvindex = 0DATA0z for m in range(len(MtlList)): DATA<< z FILE.write("usemtl %s\n" % (MtlList[m].name)) DATA z for face in faces:DATA z if face.mat == m:DATA4 z p = p+1DATA$t z if (p%1000) == 0:DATAP z print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATA< zDATA$l z FILE.write("f ")DATA4 z for index in range(len(face.v)):DATA< z v = face.v[index].index + vertexcount DATA( z if len(face.uv) > 0:DATAL z FILE.write("%s/%s/%s " % (v+1, uvPtrs[uvindex], v+1))DATA,L z uvindex = uvindex+1DATA$ z elif has_uvco:DATA@ z FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA\z else:DATA<z FILE.write("%s//%s " % (v+1, v+1))DATA$ z FILE.write("\n")DATA\zDATA4z vertexcount = vertexcount + len(Vertices) DATATz print("Export of " +str(ObjName)+ ".obj using material layers finished.\n")DATAlzDATADz#==================================================================DATAH zdef UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): DATAD|z#==================================================================DATAz global vertexcountDATA4z global multiflagDATAtzDATA8z FILE.write("mtllib %s\n\n" % (Name + ".mtl")) DATA,z FILE.write("o %s\n\n" % (ObjName))DATA\z DATAz index = 0DATAz VertexList = []DATA z for vertex in Vertices:DATA Tz VertexList.append(-1)DATAz index = index + 1DATA@z print("number of vertices is " +str(len(VertexList)))DATALzDATA|z Totalindex = 0DATAz ix = 0DATAz NewVertexList = []DATA<z NewVertexCo = []DATA(|z for m in range(len(MtlList)):DATA4z # Group name is the name of the mesh DATA,z if MtlList[m]:DATADtz FILE.write("g %s\n" % (MtlList[m].name+str(m+1))) DATAz else:DATA8$z FILE.write("g %s\n" % ("Null"+str(m+1)))DATA$z FILE.write("s off\n\n") DATA z DATA< z FILE.write("usemtl %s\n\n" % (MtlList[m].name)) DATAtz DATA z for face in faces:DATA z if face.mat == m:DATA(4z for vertex in face.v:DATA(z v = vertex.index DATA,z if VertexList[v] < 0:DATA4,z VertexList[v] = TotalindexDATA0z NewVertexList.append(v)DATA4z Totalindex = Totalindex + 1DATADz DATA(tz for v_old in NewVertexList:DATA(z vert = Vertices[v_old].coDATA$z if multiflag == 1:DATA0dz vert = Alter(vert, Transform)DATA z x, y, z = vertDATA8z FILE.write("v %s %s %s\n" % (x, y, z))DATA,dz NewVertexCo.append([x,y,z])DATAzDATAz if has_uvco:DATA,,z for v_old in NewVertexList:DATA0z u, v, z = Vertices[v_old].uvcoDATA z u = (u-1)/2DATA,$ z v = (v-1)/2 DATA4| z FILE.write("vt %s %s\n" % (u, v))DATA zDATA( !z for v_old in NewVertexList:DATA,\!z x, y, z = Vertices[v_old].noDATA8!z FILE.write("vn %s %s %s\n" % (x, y, z))DATA"z DATA D"z for face in faces:DATA "z if face.mat == m:DATA$"z FILE.write("f ")DATA4$#z for index in range(len(face.v)):DATA,#z v = face.v[index].indexDATA,#z v_new = VertexList[v] DATA 4$z if has_uvco:DATAL|$z FILE.write("%s/%s/%s " % (v_new+1, v_new+1, v_new+1))DATA$z else:DATAD<%z FILE.write("%s//%s " % (v_new+1, v_new+1))DATA$%z FILE.write("\n")DATA%zDATA,&z FILE.write("\n")DATAt&zDATA &z NewVertexList = []DATAP&z print("Group " +str(m+1)+ " of " +str(len(MtlList))+ " finished.")DATAd'z DATAL'z print("Export of " +str(ObjName)+ ".obj using groups finished.\n")DATA (zDATA,<(z#========================================DATA((zdef CreateMatrix(object, Transform):DATA,(z#========================================DATA <)z Mx = []DATA t)z My = []DATA )z Mz = []DATA )z T1 = []DATA*z Transform = []DATA\*zDATA*z angle = object.RotXDATA*z Mx.append([1, 0, 0])DATA +z y = math.cos(angle)DATAL+z z = -math.sin(angle)DATA+z Mx.append([0, y, z])DATA+z y = math.sin(angle)DATA ,z z = math.cos(angle)DATAL,z Mx.append([0, y, z])DATA,zDATA,z angle = object.RotYDATA,z x = math.cos(angle)DATA<-z z = math.sin(angle)DATA|-z My.append([x, 0, z])DATA-z My.append([0, 1, 0])DATA-z x = -math.sin(angle)DATA<.z z = math.cos(angle)DATA|.z My.append([x, 0, z])DATA.zDATA.z angle = object.RotZDATA,/z x = math.cos(angle)DATAl/z y = -math.sin(angle)DATA/z Mz.append([x, y, 0])DATA/z x = math.sin(angle)DATA,0z y = math.cos(angle)DATAl0z Mz.append([x, y, 0])DATA0z Mz.append([0, 0, 1])DATA0zDATA1z m0 = Mx[0]DATAT1z m1 = Mx[1]DATA1z m2 = Mx[2]DATA1z for row in My:DATA2z x, y, z = rowDATA(D2z nx = x*m0[0] + y*m1[0] + z*m2[0]DATA(2z ny = x*m0[1] + y*m1[1] + z*m2[1]DATA(2z nz = x*m0[2] + y*m1[2] + z*m2[2]DATA 43z T1.append([nx, ny, nz])DATA|3zDATA3z m0 = T1[0]DATA3z m1 = T1[1]DATA4z m2 = T1[2]DATAT4z for row in Mz:DATA4z x, y, z = rowDATA(4z nx = x*m0[0] + y*m1[0] + z*m2[0]DATA($5z ny = x*m0[1] + y*m1[1] + z*m2[1]DATA(t5z nz = x*m0[2] + y*m1[2] + z*m2[2]DATA$5z Transform.append([nx, ny, nz])DATA6zDATA@D6z Transform.append([object.SizeX, object.SizeY, object.SizeZ])DATA@6z Transform.append([object.LocX, object.LocY, object.LocZ])DATA7zDATAD7z return TransformDATA7zDATA(7z#======================================DATA8zdef Alter(vect, Transform):DATA(L8z#======================================DATA 8z v2 = []DATA 8z nv = []DATA 9zDATA<9z x, y, z = vectDATA |9z sx, sy, sz = Transform[3]DATA 9z lx, ly, lz = Transform[4]DATA :zDATA<:z v2.append(x*sx)DATA|:z v2.append(y*sy)DATA:z v2.append(z*sz)DATA:zDATA$,;z for index in range(len(vect)):DATA|;z t = Transform[index]DATA8;z nv.append(v2[0]*t[0] + v2[1]*t[1] +v2[2]*t[2])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 . /0????m 1 234Iujwyz{56789:;< = >?@A  jy{ ^I B( r ^H BCD XX)Y+ZXHo\^E`JJJ(F (^FGHIJ'KLMNO^P'K^^N'K^N'K^N'KoHN'KQN'KR   ST^(HoUVWXYENDB