BLENDER_v233REND 1@SRd{T{SRscreeno{{t{{{{^` DATAoU4{DATA4{Ut{o`DATAt{U{4{`DATA{U{t{DATA{U4{{FDATA4{Ut{{FDATAt{U{4{DATA{U{t{DATA{U4{{,DATA4{Ut{{,FDATAt{U{4{,DATA{Ut{DATA{V4{4{t{DATA4{Vt{{o{DATAt{V{4{4{{DATA{V{t{t{4{DATA{V4{{{4{DATA4{Vt{{ot{DATAt{V{4{{t{DATA{V{t{{{DATA{V4{{t{{DATA4{Vt{{t{{DATAt{V{4{{{DATA{V{t{{4{DATA{V4{{4{4{DATA4{Vt{{{4{DATAt{V{4{{t{DATA{V{t{4{t{DATA{V4{{4{{DATA4{Vt{{{{DATAt{V4{t{{DATA{X{ot{{{?FDz@PףO{{Tr}t{{DATA{Wl{OutputRender>DATAl{W<{{RenderRender@>DATA<{W {l{AnimRender>DATA {Wܼ{<{FormatRender>DATAܼ{W{ {Link and MaterialsEditing>DATA{W|{ܼ{MeshEditing@>DATA|{WL{{Texture faceEditing>L{DATAL{W{|{UV CalculationEditing>DATA{W{L{Mesh ToolsEditing>DATA{W{Mesh Tools 1Editing>DATA{F{333?{DdCI-DIeCC(BDC??<|DATA{A{333?{??? ???? A??FDz@PA Aj?I7>}GCHB? A4{ B?=CXXDATA{X{{{4{t{4{G`Ga``ooDATA{Xl{{{t{{{>>o?--- T{{jjDATA{J{333?{CCx?'?g?T<|@GDATA{A{{333?{??ND?4.> >?D$?N%% ??% 4.+?̺o>x>o!)s>o???ND?4.> >??g@4{H B?=C>4.>22 gDATA{F{{333?{DdCD1MCC(BDC??DATAT{H{333?{SELECT IMAGE/home/ingo/projects/tuxkart/bonusblock.png v$DATAl{X{{t{{4{{?&?n#?o?+E++E ,6NT{l{DATAT{A${333?l{?3?3<;#5v>??3?3#5>??&?nI2n;m#?ꉖv8;>l?~e?f3_?C#5>??&?n#?o??3?3<;#5v>?5?5]?4{ B?=C<;w#5 DATA ${M{T{333?l{DATAh{Ll{${ 333?l{|$/ ][@,.DATATl{H{333?l{SAVE FILEtle/home/ingo/projects/tuxkart/vs/models/bonusblock.blend.py}NDATA{Xl{t{4{4{{?y@ JL-E-+-,E TS{{ t tDATA{A{333?{%Z4}?s=`<􎭼?!Z4}2? >ȧ<}?A5?93?s=2x?m?VW>?BE=ۗ5D5C?sȰK393:>=7@sy$)@t|@N?,@?y@ JL%Z4}?s=`<􎭼?u>=12?4{ B?=C>4.>// DATA{F{333?{DdCD1MCC(BDC??SRd{T{SRscreen.001{d{{{${t{{DATA{U{DATA{U${{DATA${Ud{{DATAd{U{${DATA{U{d{DATA{U${{DATA${Ud{{DATAd{U{${DATA{U{d{DATA{U${{DATA${Ud{{DATAd{U${DATA{V{{${DATA{V${{{d{DATA${Vd{{{{DATAd{V{${${{DATA{V{d{{{DATA{V${{{${DATA${Vd{{d{d{DATAd{V{${${d{DATA{V{d{${{DATA{V${{{{DATA${Vd{{{{DATAd{V{${d{{DATA{V{d{{{DATA{V${{{${DATA${Vd{{{${DATAd{V{${{d{DATA{V{d{{d{DATA{V{${d{DATA${XL{{${d{d{?FDz@Pףd { {DATA {F {333?DdC˄3D(dCC(BDC??DATA {A {333???? ???? A??FDz@PA Aj?I7>}GCHB? A4{ B?=CXXDATAL{X4{${{{${{dDATA4{X\{L{${{{d{g=Ρ>o?qqd{{DATA{G{333?zCAzCA A@FB= A DATA{I{{333?AA Y YCA A@CC #<@{{DATA,{fOB`A4{DATA{A{333????55@??A0??5>5?g=Ρ>o$[;??cYAYJ@5>5??cYA4{ B? #<C55@DATA\{Xt{4{${d{{{g=S=o?w}w}5dD{4{DATAD{G{333?zCAzCA A@FB= A DATA{F{D{333?DdCJRCۖzDGhICC(BDC??DATA{E${{333?zC̽̌?zC@ #< #<`jFzD OBzC̽̌?DATA${J{{333??DATA{I4{${333?AA>l>lBA A@CC #<@{{DATA,{fOBp=A4{DATA4{A{333????55@??A0??5>5?g=S=o$s>?cYA~2bA5>5??cYA4{ B?=C55@DATAt{X\{{{d{${g=+=o?w}w}d\{l{DATA\{El{333?zC̽̌?zC@@@ #< #<`jFzD OBzC̽̌?DATAl{Fl{\{333?DdC@CdDGhICC(BDC??DATAl{Al{333????55@??A0??5>5?g=+=o$gV>?cYAL³90A5>5??cYA4{ B?=C55@SC{?SC14{\{{\{dd??< d=fff?=fff?Z@@???//backbuf//ftypeDDATA\{9{@,{DATA{9{\{/T|DATA{9{*4{OB4{6,{OBCamera |3&=??????w?w3&=?????Dd??)d??>)d?????OB,{6T|4{OBMesh.001<|$|{ ?gf>gf>gf>??gf>gf>gf>{ ??????Dd?? #=?>=?@???DATA$|OBT|6,{OBMeshL|?????????????Dd?? #=?>=?@???MEL|+<|MEbonusblockj]???ME<|+L|MEtestDj,|d| |\|???DATA,||DATA\|/!@!@??HԸ+p!@!@?HHp!@?!@?+Hp!@?!@??++p!@!@?HԸ+!@?!@?++!@?!@+H!@!@HH!@?!@?Hp+!@??!@?+p+!@??!@+pH!@?!@HpH!@!@HH!@!@?HԸ+!@?!@?++!@?!@+H?!@?!@?p++?!@!@?pHԸ+?!@!@pHH?!@?!@p+H!@?!@?++!@!@?H+!@!@HH!@?!@+HDATAd|,@ @ @@ @ @ @    @ @ @   @ @@ @ @@@@ @@@  @DATA |*<|=,?=}?<}?<,?=<|s?P=r?w?=v?=@==<|=,?=}?<}?<,?=<|=,?=}?<}?<,?=<|s?P=r?w?=v?=@==<|q??p?4?Y?4???<|=,?=}?<}?<,?=<|=,?=}?<}?<,?=<|s?P=r?w?=v?=@==<|q??p?4?Y?4???<|=,?=}?<}?<,?=<|=,?=}?<}?<,?=<|s?P=r?w?=v?=@==<|=,?=}?<}?<,??<|q??p?4?Y?4???<|=,?=}?<}?<,?=<|=,?=}?<}?<,?=<|q??p?4?Y?4???<|s?P=r?w?=v?=@==<|q??p?4?Y?4???<|q??p?4?Y?4???<|q??p?4?Y?4???<|=,?=}?<}?<,?=<|q??p?4?Y?4???<|s?P=r?w?=v?=@==<|=,?=}?<}?<,?=MA@|!MAdefault?????????????L????2 ?????@?=?=?IM(<|IMbonusblock.png/home/ingo/projects/tuxkart/bonusblock.pngTqCA\|CACamera2=B B?TXd|TXobj_io_modif228.py|x|Dv||,Y}DATA$|/share/download/obj_io_modif228.pyDATA|4|vJ DATA4|t||v&DATAt||4|Lv5DATA||t|vDATA|4||vDATA4|t||4vDATAt||4|dvcDATA||t|v2DATA|4||vDATA4|t||$vDATAt||4|TvJDATA||t|vEDATA|4|||=|}DATA4>|t>|=|}!DATAt>|>|4>|l}DATA>|>|t>|}!DATA>|4?|>|}DATA4?|t?|>|<}DATAt?|?|4?|}DATA?|?|t?|Ę}DATA?|4@|?|}DATA4@|t@|?|D}DATAt@|@|4@|}DATA@|@|t@|ę}DATA@|4A|@|}DATA4A|tA|@|<},DATAtA|A|4A|}DATAA|A|tA|ܚ}$DATAA|4B|A|,}DATA4B|tB|A|l}DATAtB|B|4B|}DATAB|B|tB|}DATAB|4C|B|<},DATA4C|tC|B|}DATAtC|C|4C|ܜ}#DATAC|C|tC|,}.DATAC|4D|C|}DATA4D|tD|C|ĝ}&DATAtD|D|4D|}DATAD|D|tD|T}DATAD|4E|D|} DATA4E|tE|D|}!DATAtE|E|4E|4}DATAE|E|tE|t}DATAE|4F|E|}$DATA4F|tF|E| }DATAtF|F|4F|L}#DATAF|F|tF|}DATAF|4G|F|ܠ}DATA4G|tG|F|}DATAtG|G|4G|d}DATAG|G|tG|}DATAG|4H|G|}DATA4H|tH|G|,}DATAtH|H|4H|l}DATAH|H|tH|}!DATAH|4I|H|}DATA4I|tI|H|$}!DATAtI|I|4I|t}DATAI|I|tI|}DATAI|4J|I|}DATA4J|tJ|I|4}DATAtJ|J|4J|d}"DATAJ|J|tJ|}#DATAJ|4K|J|}DATA4K|tK|J|4}DATAtK|K|4K|t}DATAK|K|tK|}DATAK|4L|K|}DATA4L|tL|K|<}DATAtL|L|4L|l}DATAL|L|tL|}0DATAL|4M|L| }DATA4M|tM|L|T}0DATAtM|M|4M|}DATAM|M|tM|}/DATAM|4N|M|T}DATA4N|tN|M|}vDATAtN|N|4N|$}5DATAN|N|tN|}6DATAN|4O|N|}DATA4O|tO|N|,}'DATAtO|O|4O||}fDATAO|O|tO| }JDATAO|4P|O|}1DATA4P|tP|O|}DATAtP|P|4P|,}DATAP|P|tP|t}QDATAP|4Q|P|}JDATA4Q|tQ|P|l}1DATAtQ|Q|4Q|̭}DATAQ|Q|tQ|}DATAQ|4R|Q|<}DATA4R|tR|Q|}>DATAtR|R|4R|}7DATAR|R|tR|L}<DATAR|4S|R|}DATA4S|tS|R|}DATAtS|S|4S|4}DATAS|S|tS||}PDATAS|4T|S|}<DATA4T|tT|S|d}DATAtT|T|4T|}DATAT|T|tT|}DATAT|4U|T|,}UDATA4U|tU|T|};DATAtU|U|4U|}DATAU|U|tU|T}DATAU|4V|U|}DATA4V|tV|U|ܳ})DATAtV|V|4V|4};DATAV|V|tV|}DATAV|4W|V|ܴ} DATA4W|tW|V|}DATAtW|W|4W|\}DDATAW|W|tW|̵}5DATAW|4X|W|,} DATA4X|tX|W|d}!DATAtX|X|4X|}DATAX|X|tX|}!DATAX|4Y|X|D}$DATA4Y|tY|X|}DATAtY|Y|4Y|ķ}!DATAY|Y|tY|} DATAY|4Z|Y|L}!DATA4Z|tZ|Y|}!DATAtZ|Z|4Z|}DATAZ|Z|tZ|,}!DATAZ|4[|Z||} DATA4[|t[|Z|}DATAt[|[|4[|}!DATA[|[|t[|4}&DATA[|4\|[|}(DATA4\|t\|[|ܺ}DATAt\|\|4\|}DATA\|\|t\|\}DATA\|4]|\|} DATA4]|t]|\|Ļ}#DATAt]|]|4]|} DATA]|]|t]|L}2DATA]|4^|]|} DATA4^|t^|]|} DATAt^|^|4^|} DATA^|^|t^|l}DATA^|4_|^|}.DATA4_|t_|^| }DATAt_|_|4_|L}DATA_|_|t_|}DATA_|4`|_|̾}DATA4`|t`|_| }DATAt`|`|4`|L}DATA`|`|t`|}DATA`|4a|`|}!DATA4a|ta|`| }&DATAta|a|4a|\}(DATAa|a|ta|}DATAa|4b|a|}DATA4b|tb|a|4}DATAtb|b|4b|d} DATAb|b|tb|}#DATAb|4c|b|}DATA4c|tc|b|,}DATAtc|c|4c|l}DATAc|c|tc|}DATAc|4d|c|}DATA4d|td|c|}2DATAtd|d|4d||}DATAd|d|td|} DATAd|4e|d|} DATA4e|te|d|4}.DATAte|e|4e|}DATAe|e|te|}DATAe|4f|e|}DATA4f|tf|e|D}DATAtf|f|4f|}DATAf|f|tf|}!DATAf|4g|f|}(DATA4g|tg|f|\}(DATAtg|g|4g|}DATAg|g|tg|}DATAg|4h|g|4}DATA4h|th|g|t}DATAth|h|4h|} DATAh|h|th|}DATAh|4i|h|$}/DATA4i|ti|h||}DATAti|i|4i|}DATAi|i|ti|}DATAi|4j|i|4}!DATA4j|tj|i|}DATAtj|j|4j|}DATAj|j|tj| } DATAj|4k|j|D}DATA4k|tk|j|}DATAtk|k|4k|}DATAk|k|tk|}DATAk|4l|k|4}DATA4l|tl|k||}$DATAtl|l|4l|}DATAl|l|tl|}DATAl|4m|l|T}DATA4m|tm|l|}DATAtm|m|4m|}DATAm|m|tm|}DATAm|4n|m|T}DATA4n|tn|m|}DATAtn|n|4n|}DATAn|n|tn|}DATAn|4o|n|T}DATA4o|to|n|}DATAto|o|4o|}DATAo|o|to|}DATAo|4p|o|T}DATA4p|tp|o|}DATAtp|p|4p|}DATAp|p|tp|}DATAp|4q|p|D}DATA4q|tq|p|}DATAtq|q|4q|} DATAq|q|tq|}DATAq|4r|q|D}DATA4r|tr|q|}DATAtr|r|4r|}DATAr|r|tr|}DATAr|4s|r|<}%DATA4s|ts|r|}"DATAts|s|4s|}'DATAs|s|ts|,}DATAs|4t|s|t}DATA4t|tt|s|}DATAtt|t|4t|}DATAt|t|tt|L}'DATAt|4u|t|}DATA4u|tu|t|}(DATAtu|u|4u|$}!DATAu|u|tu|t}DATAu|4v|u|}DATA4v|tv|u|}!DATAtv|v|4v|T}DATAv|v|tv|}(DATAv|4w|v|}!DATA4w|tw|v|,}DATAtw|w|4w|t}DATAw|w|tw|}DATAw|4x|w|}(DATA4x|tx|w|\}DATAtx|x|4x|}'DATAx|x|tx|}DATAx|4y|x|$}%DATA4y|ty|x|t}%DATAty|y|4y|}%DATAy|y|ty|}DATAy|4z|y|\}DATA4z|tz|y|}*DATAtz|z|4z|}0DATAz|z|tz|\}/DATAz|4{|z|}EDATA4{|t{|z|$}&DATAt{|{|4{|t}DATA{|{|t{|}1DATA{|4||{|}'DATA4||t||{|d}BDATAt||||4||}%DATA||||t||$} DATA||4}|||\}.DATA4}|t}|||}*DATAt}|}|4}| }EDATA}|}|t}||}'DATA}|4~|}|}DATA4~|t~|}|}.DATAt~|~|4~|T}*DATA~|~|t~|}EDATA~|4|~|}'DATA4|t|~|l}3DATAt||4|}DATA||t|}'DATA|4||L}!DATA4|t||}DATAt||4|},DATA||t|<}DATA|4||l}'DATA4|t||}DATAt||4|}DATA||t|L}DATA|4||}DATA4|t||}DATAt||4|$}1DATA||t|}1DATA|4||}DATA4|t||$})DATAt||4||}(DATA||t|}6DATA|4||4}4DATA4|t||}DATAt||4|}DATA||t|}1DATA|4|||}DATA4|t||}(DATAt||4|}4DATA||t|t}DATA|4||}DATA4|t||}KDATAt||4|d} DATA||t|}DATA|4||}DATA4|t||,}!DATAt||4||}$DATA||t|}$DATA|4||}DATA4|t||L},DATAt||4|}%DATA||t|}1DATA|4||T}3DATA4|t||}DATAt||4|}*DATA||t|L}DATA|4||}6DATA4|t||}DATAt||4|,}DATA||t|t}*DATA|4||}&DATA4|t||}DATAt||4|d}(DATA||t|}6DATA|4||}%DATA4|t||l}4DATAt||4|}*DATA||t|$}ZDATA|4||}6DATA4|t|| }.DATAt||4|d}*DATA||t|}.DATA|4||}.DATA4|t||l}.DATAt||4|}4DATA||t|$},DATA|4|||}*DATA4|t||}.DATAt||4|,}.DATA||t|}.DATA|4||}5DATA4|t||<},DATAt||4|}*DATA||t|}.DATA|4||D}.DATA4|t||}.DATAt||4|}DATA||t|$}CDATA|4||}DATA4|t||}/DATAt||4|}DATA||t|L}*DATA|4||}5DATA4|t||}+DATAt||4|\}+DATA||t|}+DATA|4|| }DATA4|t||T}9DATAt||4|}9DATA||t|$}9DATA|4||} DATA4|t||}"DATAt||4|,}DATA||t|t}ADATA|4||} DATA4|t||4}"DATAt||4|}DATA||t|}4DATA|4||,~ DATA4|t|||~"DATAt||4|~DATA||t|~$DATA|4||d~DATA4|t||~*DATAt||4|~DATA||t|4~DATA|4||d~,DATA4|t||~DATAt||4|~DATA||t|L~HDATA|4||~DATA4|t||~1DATAt||4|d~#DATA||t|~DATA|4||~DATA4|t||$~DATAt||4|d~DATA||t|~#DATA|4||~DATA4|t||,~DATAt||4|\~ DATA||t|~DATA|4||~DATA4|t||~DATAt||4|d~DATA||t|~ DATA|4||~DATA4|t||~DATAt||4|T~DATA||t|~*DATA|4||~DATA4|t||$ ~DATAt||4|l ~DATA||t| ~DATA|4|| ~DATA4|t||4 ~%DATAt||4| ~DATA||t| ~DATA|4|| ~DATA4|t||4 ~DATAt||4|| ~ DATA||t| ~DATA|4|| ~DATA4|t||$ ~DATAt||4|d ~7DATA||t| ~DATA|4|| ~DATA4|t||4 ~ DATAt||4| ~DATA||t| ~!DATA|4||~DATA4|t||d~DATAt||4|~DATA||t|~%DATA|4||$~DATA4|t||d~DATAt||4|~DATA||t|~DATA|4||~)DATA4|t||t~DATAt||4|~)DATA||t|~DATA|4||\~DATA4|t||~DATAt||4|~DATA||t|~"DATA|4||d~DATA4|t||~DATAt||4|~DATA||t|~DATA|4||T~lDATA4|t||~,DATAt||4|D~,DATA||t|~DATA|4||~DATA4|t||~DATAt||4|L~$DATA||t|~cDATA|4||,~%DATA4|t|||~&DATAt||4|~$DATA||t|~$DATA|4||l~$DATA4|t||~DATAt||4|~DATA||t|,~DATA|4||l~DATA4|t||~/DATAt||4| ~DATA||t|<~DATA|4||~DATA4|t||~%DATAt||4|~$DATA||t|l~DATA|4||~DATA4|t||~DATAt||4|$~DATA||t|T~"DATA|4||~DATA4|t||~,DATAt||4|,~DATA||t|l~!DATA|4||~DATA4|t||~)DATAt||4|T~9DATA||t|~&DATA|4|| ~"DATA4|t||\~(DATAt||4|~%DATA||t|~1DATA|4||d~3DATA4|t||~3DATAt||4|$ ~DATA||t|T ~DATA|4|| ~#DATA4|t|| ~+DATAt||4|D!~*DATA||t|!~-DATA|4||!~*DATA4|t||L"~-DATAt||4|"~*DATA||t|"~DATA|4||,#~&DATA4|t|||#~DATAt||4|#~DATA||t|#~DATA|4||$$~7DATA4|t||$~;DATAt||4|$~5DATA||t|L%~DATA|4|||%~DATA4|t||%~3DATAt||4| &~DATA||t|<&~*DATA|4||&~2DATA4|t||&~*DATAt||4|L'~DATA||t||'~ DATA|4||'~ DATA4|t||'~DATAt||4|4(~DATA||t|d(~DATA|4||(~$DATA4|t||(~DATAt||4|<)~DATA||t||)~DATA|4||)~DATA4|t||)~DATAt||4|,*~DATA||t|l*~DATA|4||*~$DATA4|t||+~DATAt||4|<+~DATA||t||+~DATA|4||+~*DATA4|t||,~'DATAt||4|T,~*DATA||t|,~DATA|4||,~ DATA4|t||-~ DATAt||4|L-~DATA||t|-~DATA|4||-~DATA4|t||.~DATAt||4|D.~DATA||t|.~$DATA|4||.~DATA4|t||/~DATAt||4|\/~DATA||t|/~DATA|4||/~DATA4|t|| 0~DATAt||4|L0~#DATA||t|0~DATA|4||0~DATA4|t|| 1~DATAt||4|L1~DATA||t||1~!DATA|4||1~ DATA4|t||2~!DATAt||4|l2~DATA||t|2~DATA|4||2~DATA4|t||,3~DATAt||4|l3~DATA||t|3~DATA|4||3~DATA4|t||4~DATAt||4|\4~ DATA||t|4~DATA|4||4~DATA4|t||5~UDATAt||4|5~DATA||t|5~ DATA|4||6~DATA4|t||\6~.DATAt||4|6~DATA||t|6~DATA|4||$7~DATA4|t||l7~DATAt||4|7~.DATA||t|8~6DATA|4||d8~DATA4|t||8~ DATAt||4|8~2DATA||t|D9~DATA|4||9~%DATA4|t||9~DATAt||4| :~1DATA||t|l:~DATA|4||:~DATA4|t||:~"DATAt||4|4;~DATA||t||;~(DATA|4||;~DATA4|t||<~HDATAt||4||<~2DATA||t|<~DATA|4|| =~9DATA4|t||t=~ADATAt||4|=~GDATA||t|T>~DATA|4||>~DATA4|t||>~DATAt||4|>~3DATA||t|\?~<DATA|4||?~SDATA4|t||D@~DATAt||4|t@~HDATA||t|@~MDATA|4||dA~KDATA4|t||A~JDATAt||4|TB~ DATA||t|B~=DATA|4||B~DATA4|t||$C~1DATAt||4|C~1DATA||t|C~1DATA|4||DD~DATA4|t||D~DATAt||4|D~DATA||t|D~2DATA|4||\E~DATA4|t||E~,DATAt||4|E~ DATA||t|LF~DATA|4|||F~;DATA4|t||F~+DATAt||4|DATA4|t||DS~>DATAt||4|S~>DATA||t|T~-DATA|4||lT~DATA4|t||T~DATAt||4|T~DATA||t| U~DATA|4||LU~DATA4|t||U~DATAt||4|U~<DATA||t|$V~8DATA|4||V~=DATA4|t||V~DATAt||4|}DATADvvv>} DATAvĭvDv>}0DATAĭvvv4?}*DATAvDvĭv?})DATADvvv?}DATAvĮvDv,@}KDATAĮvvv@}DATAvDvĮv@}@DATADvvv\A} DATAvįvDvA}DATAįvvvA}DATAvDvįv$B}DATADvvvTB}DATAvİvDvB}MDATAİvvvC}DATAvDvİvDC}IDATADvvvC}DATAvıvDvC})DATAıvvvDD}$DATAvDvıvD})DATADvvvD} DATAvIJvDv$E} DATAIJvvv\E} DATAvDvIJvE} DATADvvvE}DATAvijvDv F}DATAijvvv 0:DATA} gAlert = 3DATA } else:DATAD} gAlert = 4DATA} FILE.flush()DATA} FILE.close()DATA}DATA4}#=========================DATA(|}def ObjImport(file, Name, filename):DATA }#========================= DATA} vcount = 0DATAT} vncount = 0DATA} vtcount = 0DATA} fcount = 0DATA} gcount = 0DATAT} setcount = 0DATA} groupflag = 0DATA} objectflag = 0DATA} mtlflag = 0DATAT} baseindex = 0DATA} basevtcount = 0DATA} basevncount = 0DATA} matindex = 0DATAT}DATA} pointList = []DATA} uvList = []DATA} normalList = []DATAD} faceList = []DATA} materialList = []DATA} uv = [] DATA } lines = file.readlines()DATAD} linenumber = 1DATA}DATA} for line in lines:DATA } words = line.split()DATA(<} if words and words[0] == "#":DATA$} pass # ignore commentsDATA(} elif words and words[0] == "v":DATA ,} vcount = vcount + 1DATA t} x = float(words[1])DATA } y = float(words[2])DATA } z = float(words[3])DATA(L} pointList.append([x, y, z])DATA}DATA,} elif words and words[0] == "vt":DATA$$} vtcount = vtcount + 1DATA t} u = float(words[1])DATA } v = float(words[2])DATA$} uvList.append([u, v])DATAT}DATA,} elif words and words[0] == "vn":DATA$} vncount = vncount + 1DATA ,} i = float(words[1])DATA t} j = float(words[2])DATA } k = float(words[3])DATA,} normalList.append([i, j, k])DATA\}DATA(} elif words and words[0] == "f":DATA } fcount = fcount + 1DATA($} vi = [] # vertex indicesDATA(t} ti = [] # texture indicesDATA(} ni = [] # normal indicesDATA } words = words[1:]DATA \} lcount = len(words)DATA,} for index in (xrange(lcount)):DATA4} if words[index].find( "/") == -1:DATA0\} vindex = int(words[index])DATAH} if vindex < 0: vindex = baseindex + vindex + 1 DATA($} vi.append(vindex)DATAt} else:DATA4} vtn = words[index].split( "/")DATA(} vindex = int(vtn[0])DATADd} if vindex < 0: vindex = baseindex + vindex + 1 DATA(} vi.append(vindex) DATA$} DATA0\} if len(vtn) > 1 and vtn[1]:DATA,} tindex = int(vtn[1])DATAH } if tindex < 0: tindex = basevtcount +tindex + 1DATA(|} ti.append(tindex)DATA}DATA0} if len(vtn) > 2 and vtn[2]:DATA,T} nindex = int(vtn[2])DATAH} if nindex < 0: nindex = basevncount +nindex + 1DATA(} ni.append(nindex)DATA4l} faceList.append([vi, ti, ni, matindex])DATA}DATA(} elif words and words[0] == "o":DATA$L} ObjectName = words[1]DATA} objectflag = 1DATA0} #print "Name is %s" % ObjectNameDATA<}DATA(l} elif words and words[0] == "g":DATA} groupflag = 1DATA } index = len(words)DATA L} if objectflag == 0:DATA } objectflag = 1DATA } if index > 1:DATA4$} ObjectName = words[1].join("_")DATA4} GroupName = words[1].join("_") DATA} else:DATA,$} ObjectName = "Default" DATA,|} GroupName = "Default" DATA8} #print "Object name is %s" % ObjectNameDATA84} #print "Group name is %s" % GroupNameDATA} else:DATA } if index > 1:DATA4} GroupName = join(words[1],"_") DATA|} else:DATA,} GroupName = "Default" DATA8} #print "Group name is %s" % GroupNameDATAt} DATA } if mtlflag == 0:DATAL} matindex = AddMeshMaterial(GroupName,materialList, matindex)DATA$d} gcount = gcount + 1 DATA}DATA} if fcount > 0: DATA$,} baseindex = vcountDATA(|} basevncount = vncountDATA(} basevtcount = vtcountDATA}DATA0L} elif words and words[0] == "mtllib":DATA(} # try to export materialsDATA4} directory, dummy = os.split(filename)DATA4T} filename = os.join(directory, words[1])DATA} try:DATA,} file = open(filename, "r")DATAL} except:DATA8} print "no material file %s" % filenameDATA} else:DATA,} mtlflag = 1DATA,t} file = open(filename, "r")DATA(} line = file.readline()DATA} while line:DATA,d} words = line.split()DATA8} if words and words[0] == "newmtl":DATA(} name = words[1]DATA8l} line = file.readline() # Ns ?DATA,} words = line.split()DATA\$} while (words[0] != "Ka" and words[0] != "Kd" and words[0] != "Ks"): DATA8} line = file.readline() # KaDATA0 } words = line.split()DATA,d} if words[0] == "Ka":DATA0} Ka = [float(words[1]),DATA0} float(words[2]),DATA0l} float(words[3])]DATA8} line = file.readline() # KdDATA0$} words = line.split()DATA,|} if words[0] == "Kd":DATA0} Kd = [float(words[1]),DATA0,} float(words[2]),DATA0} float(words[3])]DATA8} line = file.readline() # Ks DATA0<} words = line.split()DATA,} if words[0] == "Ks":DATA0} Ks = [float(words[1]),DATA0D} float(words[2]),DATA0} float(words[3])]DATA}DATAD$} matindex = AddGlobalMaterial(name, matindex) DATA}DATA0} matlist = Material.Get() DATA}DATA,L} if len(matlist) > 0:DATA8} material = matlist[matindex]DATA,} material.R = Kd[0]DATA,\} material.G = Kd[1]DATA,} material.B = Kd[2]DATA } try:DATA<T} material.specCol[0] = Ks[0]DATA<} material.specCol[1] = Ks[1]DATA<$} material.specCol[2] = Ks[2]DATA$} except:DATA$} passDATA ,} try:DATADt} alpha = 1 - ((Ka[0]+Ka[1]+Ka[2])/3)DATA$} except:DATA$4} passDATA } try:DATA8} material.alpha = alphaDATA$,~ except:DATA$|~ passDATA~ else:DATA(~ mtlflag = 0DATAd~DATA,~ line = file.readline()DATA ~ file.close()DATA4~DATA0d~ elif words and words[0] == "usemtl":DATA ~ #if mtlflag == 1:DATA ~ name = words[1]DATALL~ matindex = AddMeshMaterial(name, materialList, matindex) DATA~ # elif words: DATA4~ # print "%s: %s" % (linenumber, words)DATA$d~ linenumber = linenumber + 1DATA~ file.close()DATA~DATA$~ # import in BlenderDATAd~ DATA$~ print "import into Blender ..."DATA ~ mesh = NMesh.GetRaw ()DATA,~DATA \~ i = 0DATA~ while i < vcount:DATA ~ x, y, z = pointList[i] DATA ~ vert=NMesh.Vert(x, y, z)DATA d~ mesh.verts.append(vert)DATA ~ i=i+1DATA~DATA~ if vtcount > 0:DATA T~ #mesh.hasFaceUV() = 1DATA,~ print ("Object has uv coordinates")DATA~ DATA $ ~ if len(materialList) > 0:DATA l ~ for m in materialList:DATA ~ try:DATA ~ M=Material.Get(m)DATA(4 ~ mesh.materials.append(M) DATA ~ except:DATA ~ passDATA ~DATA4 ~ total = len(faceList)DATA | ~ i = 0DATA ~DATA ~ for f in faceList:DATA$ ~ if i%1000 == 0:DATA8d ~ print ("Progress = "+ str(i)+"/"+ str(total))DATA ~DATA ~ i = i + 1DATA$4 ~ vi, ti, ni, matindex = fDATA ~ face=NMesh.Face()DATA$ ~ if len(materialList) > 0:DATA ~ face.mat = matindexDATAd~DATA~ limit = len(vi)DATA(~ setcount = setcount + len(vi)DATA$~ c = 0 DATAd~ DATA~ while c < limit:DATA~ m = vi[c]-1DATA,~ if vtcount > 0 and len(ti) > c:DATAt~ n = ti[c]-1DATA,~ if vncount > 0 and len(ni) > c:DATA~ p = ni[c]-1DATA\~DATA~ if vtcount > 0:DATA~ try:DATA$~ u, v = uvList[n]DATAd~ except:DATA~ pass DATA~DATA~ """ DATApT~ # multiply uv coordinates by 2 and add 1. Apparently blender uses uv range of 1 to 3 (not 0 to 1). DATA0~ mesh.verts[m].uvco[0] = (u*2)+1DATA0D~ mesh.verts[m].uvco[1] = (v*2)+1DATA~ """DATA~DATA~ if vncount > 0:DATA(L~ if p > len(normalList):DATAd~ print("normal len = " +str(len(normalList))+ " vector len = " +str(len(pointList)))DATA(,~ print("p = " +str(p))DATA(|~ x, y, z = normalList[p] DATA(~ mesh.verts[m].no[0] = xDATA(~ mesh.verts[m].no[1] = yDATA(l~ mesh.verts[m].no[2] = zDATA~ c = c+1 DATA~ DATA,~ if len(vi) < 5:DATAl~ for index in vi:DATA0~ face.v.append (mesh.verts[index-1])DATA ~ DATA<~ if vtcount > 0: DATA ~ for index in ti:DATA(~ u, v = uvList[index-1]DATA(~ face.uv.append((u,v))DATAl~DATA~ if vcount>0:DATA~ face.smooth=1DATA$~DATA$T~ mesh.faces.append(face) DATA~DATA0~ print "all other (general) polygons ..."DATA,~ for f in faceList:DATA$l~ vi, ti, ni, matindex = f DATA~ if len(vi) > 4:DATA,~ # export the polygon as edgesDATA<T~ 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(~ face.mat = matindexDATA4~ face.v.append(mesh.verts[vi[0]-1])DATA4d~ face.v.append(mesh.verts[vi[i+1]-1])DATA4~ face.v.append(mesh.verts[vi[i+2]-1])DATA$ ~DATA T ~ if vtcount > 0: DATA$ ~ if len(ti) > i+2:DATA, ~ u, v = uvList[ti[0]-1]DATA,D!~ face.uv.append((u,v))DATA0!~ u, v = uvList[ti[i+1]-1]DATA,!~ face.uv.append((u,v))DATA0L"~ 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)DATA#~DATA8$$~ print ("Total number of vertices is "+ str(vcount))DATA<$~ print ("Total number of faces is "+ str(len(faceList)))DATA8$~ print ("Total number of sets is "+ str(setcount))DATAL%~DATA|%~DATA4%~ print("Finished importing " +str(Name)+ ".obj")DATA &~DATA,<&~#=========================================DATA4&~def AddMeshMaterial(name, materialList, matindex):DATA,&~#=========================================DATAL'~ DATA|'~ index = 0DATA'~ found = 0 DATA '~ limit = len(materialList)DATA4(~DATAd(~ while index < limit:DATA((~ if materialList[index] == name:DATA(~ matindex = index DATA<)~ found = 1DATA|)~ index = limitDATA)~ index = index + 1DATA)~ DATA,*~ if found == 0: DATA l*~ materialList.append(name)DATA(*~ matindex = len(materialList)-1DATA +~ DATA<+~ return matindexDATA|+~DATA,+~#=========================================DATA(,~def AddGlobalMaterial (name, matindex):DATA,T,~#=========================================DATA,~ DATA,~ index = 0DATA-~ found = 0DATAL-~ matindex = 0DATA-~ MatList = Material.Get()DATA-~ limit = len(MatList)DATA.~DATAD.~ while index < limit:DATA(.~ if MatList[index].name == name:DATA.~ matindex = index DATA/~ found = 1DATA\/~ index = limitDATA/~ index = index + 1DATA/~DATA 0~ if found == 0:DATA$L0~ material = Material.New(name)DATA0~ matindex = indexDATA0~ DATA 1~ return matindexDATAL1~DATA$|1~#================================DATA$1~def ObjExport(FILE, Name, type):DATA$2~#================================DATAl2~ global returncodeDATA2~ global vertexcountDATA2~ global uvcountDATA,3~ global TransformDATAl3~ global multiflagDATA3~ global exporttypeDATA3~DATA4~ vertexcount = 0DATA\4~ uvcount = 0DATA4~ returncode = 0DATA 4~ print("Writing %s..." % Name)DATAX5~ FILE.write("# Wavefront OBJ (1.0) exported by lynx's OBJ import/export script\n\n")DATA5~DATA$5~ Objects = Object.GetSelected()DATA6~ if Objects == []:DATA0\6~ print("You have not selected an object!")DATA6~ returncode = 4DATA6~ else:DATA$7~ for object in Objects:DATAl7~ MtlList = []DATA07~ if len(Objects) > 1 or exporttype > 1:DATA88~ Transform = CreateMatrix(object, Transform)DATAd8~ multiflag = 1DATA 8~ DATA48~ mesh = NMesh.GetRawFromObject(object.name)DATAD9~ ObjName = mesh.nameDATA(9~ has_uvco = mesh.hasVertexUV()DATA9~DATA4 :~ FILE.write("# Meshname:\t%s\n" % ObjName)DATAl:~DATA:~ faces = mesh.facesDATA$:~ materials = mesh.materialsDATA 4;~ Vertices = mesh.vertsDATA,|;~ GlobalMaterials = Material.Get()DATA;~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 usefulDATADt=~ FILE.write("# Total number of Faces:\t%s\n" % len(faces))DATAH=~ FILE.write("# Total number of Vertices:\t%s\n" % len(Vertices))DATAT>~DATA>~ FILE.write("\n")DATA>~DATA4>~ # print first image map for uvcoords to useDATA@\?~ # to be updated when we get access to other texturesDATAT?~ if mesh.hasFaceUV(): FILE.write("# UV Texture:\t%s\n\n" % mesh.hasFaceUV())DATAD@~DATALt@~ if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 3:DATAP@~ UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATALdA~ elif len(materials) > 1 and len(GlobalMaterials) > 0 and type == 3:DATALA~ UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATATB~ else:DATA@B~ Standard(faces, Vertices, has_uvco, FILE, ObjName)DATAB~ DATA4$C~#================================================DATA4C~def CreateMtlFile (name, MeshMaterials, MtlList):DATA4C~#================================================DATADD~ global gFilename DATAD~DATA D~ # try to export materialsDATA4D~ directory, mtlname = os.split(gFilename.val)DATA \E~ mtlname = name + ".mtl"DATA0E~ filename = os.join(directory, mtlname)DATA$E~ file = open(filename, "w")DATALF~DATA<|F~ file.write("# Materials for %s.\n" % (name + ".obj"))DATA,F~ file.write("# Created by Blender.\n")DATAl 0:DATA(]~ limit = len(uvList)-200DATA0]~ while index > limit and found == 0:DATA,D^~ uv_value = uvList[index-1]DATAD^~ if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA0 _~ uvPtrs.append(index+uvcount)DATAd_~ found = 1DATA$_~ index = index - 1DATA_~ if found == 0:DATA$D`~ uvList.append(uv)DATA$`~ index = len(uvList)DATA,`~ uvPtrs.append(index+uvcount)DATA 0:DATAHi~ FILE.write("%s/%s/%s " % (v+1, uvPtrs[uvindex], v+1))DATA$i~ uvindex = uvindex+1DATAi~ elif has_uvco:DATA<$j~ FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA(j~ else: DATA4j~ FILE.write("%s//%s " % (v+1, v+1))DATA 0:DATA0} limit = len(uvList)-200DATA8} while index > limit and found == 0:DATA4T} uv_value = uvList[index-1]DATAL} if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA8,} uvPtrs.append(index+uvcount)DATA$} found = 1DATA,} index = index - 1DATA$4} if found == 0:DATA,} uvList.append(uv)DATA,} index = len(uvList)DATA44} uvPtrs.append(index+uvcount)DATA$} u, v = uvDATA<} FILE.write("vt %s %s\n" % (u, v))DATA$L } uv_flag = 1DATA }DATA( } if has_uvco and uv_flag == 0:DATA!} for v in Vertices:DATA d!} u, v, z = v.uvcoDATA!} u = (u-1)/2DATA!} v = (v-1)/2DATA0,"} FILE.write("vt %s %s\n" % (u, v))DATA"}DATA"} for v in Vertices: DATA"} x, y, z = v.noDATA4D#} FILE.write("vn %s %s %s\n" % (x, y, z))DATA#}DATA#} total = len(faces)DATA$} p = 0DATAT$} uvindex = 0DATA0$} for m in range(len(MtlList)): DATA<$} FILE.write("usemtl %s\n" % (MtlList[m].name)) DATA T%} for face in faces:DATA %} if face.mat == m:DATA%} p = p+1DATA$$&} if (p%1000) == 0:DATAPt&} print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATA&}DATA$'} FILE.write("f ")DATA4l'} for index in range(len(face.v)):DATA<'} v = face.v[index].index + vertexcount DATA(4(} if len(face.uv) > 0:DATAL(} FILE.write("%s/%s/%s " % (v+1, uvPtrs[uvindex], v+1))DATA,(} uvindex = uvindex+1DATA$T)} elif has_uvco:DATA@)} FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA *} else:DATA<T*} FILE.write("%s//%s " % (v+1, v+1))DATA$*} FILE.write("\n")DATA +}DATA4<+} vertexcount = vertexcount + len(Vertices) DATAT+} print("Export of " +str(ObjName)+ ".obj using material layers finished.\n")DATA,}DATADL,}#==================================================================DATAH,}def UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): DATAD,-}#==================================================================DATA-} global vertexcountDATA-} global multiflagDATA$.}DATA8T.} FILE.write("mtllib %s\n\n" % (Name + ".mtl")) DATA,.} FILE.write("o %s\n\n" % (ObjName))DATA /} DATA} if face.mat == m:DATA$>} FILE.write("f ")DATA4>} for index in range(len(face.v)):DATA,4?} v = face.v[index].indexDATA,?} v_new = VertexList[v] DATA ?} if has_uvco:DATAL,@} FILE.write("%s/%s/%s " % (v_new+1, v_new+1, v_new+1))DATA@} else:DATAD@} FILE.write("%s//%s " % (v_new+1, v_new+1))DATA$\A} FILE.write("\n")DATAA}DATAA} FILE.write("\n")DATA$B}DATA TB} NewVertexList = []DATAPB} print("Group " +str(m+1)+ " of " +str(len(MtlList))+ " finished.")DATAC} DATALDC} print("Export of " +str(ObjName)+ ".obj using groups finished.\n")DATAC}DATA,C}#========================================DATA(DD}def CreateMatrix(object, Transform):DATA,D}#========================================DATA D} Mx = []DATA $E} My = []DATA \E} Mz = []DATA E} T1 = []DATAE} Transform = []DATA F}DATA ?!@A5 " BCDEFG(H#$I%J%KLMNOPQRSTUV!WXYZ&[\]^'_(`abcdefghijklmnopqrs) tuvwx yz{|} ~*ijk+*,'_##DELMr(52o(#)+,-%hijklDE&(H.(/Ehijk[\&(/sH0  1!W2223   243   (/g f!"#$5 %&'()*+,-6.&/*-7770-123456789:6;5<8&3  = '>'?(9@A/ BC f!gDEFGH3427IJKLMNOPQ0R:::6;5<STUVWXY  Z&; [\]^_<"3  ` (A/ a b c=d>e?f@g<hCAi jWkg f!lmnopZqrBstuvw0xCyzD>C{|Z=}~0?ijk@E 126(AFFF AfG''T ''(9@3 HI J  `   / f!H     j]  KGGsL7h(&HMNNN'_O       P  sQRUOP !"#$%&'()@*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcSdrseT'fLgTh# iNjUklVm nMo jSpRiQqHW #(`NO@rstuvX+YYwxZyz{|}~'fWXFel[YYYwxZyz\YYwxZyz]YYwxZyzs[  ()^YYwxZyz[ vrs_ YYwxZyz[rs`YYwxZyzab c YYwxZyz[  dYYwxZyz[#rsNOe YYwxZyz[fYYwxZyz 5g YYwxZyhs5iQYYwxZy     jjkk !"s%#  $l%&'()*+,-./012345rsm6./789:;<=>?@ABCDEFGrnnn lHmImJmKmLmMmNmOmPmQmRmSmTmUo]V.p"WXYZ[\]^_`abcdefghijklmnopq rstuvowq x y zT{|}~rrrr sssrr2tttstZZZrrrrqTw   u 3v%JvvvLw ww2vx  tux y{| } ~y%yyy 2wv(T{$Ixyyy z{   |||}}}2~~~*|~F ' 2 (' -         rs /  s   r' !" #$%rs &''() *+% ,se &-./01' H2 3456Z78 9z:;<9=> 1'<? @AT{'f ' BC !DEFG  rHI'JKLMNO  rHIUkPQRSTU'V!Wrs"XY * Z 'V [\]^_`azb c!W!d e(>fghijk5lmnopqrstuvYYwxZy[z9NOs w''( f!x' yU z {|DDDD } ~z f     f ZI (  ZH YYwxZyz[HZsJJJ( ( Z1'Z'Z7'Z'Z'JH2'''rsk   Z(H23ENDB