BLENDER_v242REND xcƿSceneSRttSR1-Animation8x08 DATA8uxDATAxu8 DATAux DATAu8DATA8uxDATAxu8DATAuxDATAu8DATA8uxDATAxu8DATAuxDATAu8DATA8uxDATAxu8DATAvxDATAvH8DATAHvxxDATAvHDATAv xDATA vh8DATAhv 8DATAvh8DATAv@8DATA@v8xDATAv@8DATAvDATAv`xDATA`vDATAv`x8DATAv888DATA8v8DATAv8xxDATAvxDATAvX8DATAXvxDATAvXxxDATAv8xDATA0x08xO(DATA(wLink and MaterialsEditing>DATAw(MeshEditingF>DATAwAnim settingsObject>DATAwhDrawObjectF>DATAhw8ConstraintsObject>DATA8whEffectsObjectDATAw8HooksObjectF>DATAwParticle InteractionObject>hDATAwxSoftbodyObject>hDATAxwHOutputRender>DATAHwxRenderRenderF>DATAwHAnimRender>DATAwFormatRender>DATAd333?V,@DhCDhCC(BDC?z?DATATf333?V,/9DATA0x(0xx !  DATA(x@088G==o? DATA wTransform PropertiesView3d>DATAw 3D Viewport propertiesView3d>"DATA_333?V<????????G==o? A*A?G==o??????*AN  B??=C ݢM@ݢM@ݢM@?DATATf333?V</9DATA@x(88??PףHx88DATA8wTransform PropertiesIpo!>DATA(c`333?V\zC̽̌?zC@ #< #<`jFzD OBzC̽̌?DATA`gP333?V\CC|||??l|DATAP ` 333?V\zCCHBC|||?CFC= ADATAx j P 333?V\ =rttDATA i   333?V\?zDzDBCl||ll|zDzD=HB DATA x   333?V\BCBCl|llFzD #<HB DATAx _x 333?V\??? ???? A???PA A!O?j?}GCHB? AN  B? #<CDATATxfx 333?V\/9DATAx@x8 DATAwLink and MaterialsEditing>DATAwMeshEditingF>DATAlP333?VLzCB{ µCB ?BFB= ADATAP  333?VLzCCHBC$?CFC= ADATA dP333?VL#DhC`DpJgChCC(BDC?z?DATATf 333?VL/9DATAxxx8x} ?=o?.0`DATAw`Transform PropertiesView3d>DATA`w3D Viewport propertiesView3d>"DATA0g333?YDATA(wp)'LampLampF>DATAp)w@*(SpotLamp>DATA@*w+p)Texture and InputLamp>DATA+w+@*Map ToLamp>@*DATA+w,+PreviewMaterial>DATA,w-+MaterialMaterialF>DATA-wP.,PreviewWorld>DATAP.w /-WorldWorldF>DATA /w/P.Mist Stars PhysicsWorld>DATA/w0 /Texture and InputWorld>DATA0w1/Map ToWorld>/DATA1w`20OutputRender>DATA`2w031RenderRenderF>DATA03w4`2AnimRender>DATA4w403FormatRender>DATA4w54Link and MaterialsEditing>DATA5wp64MeshEditingF>DATAp6w@75Mesh ToolsEditing>DATA@7w8p6Mesh Tools 1Editing>DATA8w8@7CameraEditingF>DATA8w98ShadersMaterial>DATA9w:8TextureMaterial>DATA:wP;9Anim settingsObject>DATAP;w <:DrawObjectF>DATA <w<P;ConstraintsObject>DATA<w= <ScriptlinksScript>DATA=w><EffectsObject <DATA>w`?=Map InputMaterial>9DATA`?w0@>Map ToMaterial>9DATA0@wA`?AnimAnim>DATAAwA0@SoundSound>DATAAwBAListenerSoundF>DATABwpCASequencerSound>DATApCw@DBArmatureEditingF>DATA@DwEpCRampsMaterialF>,DATAEwE@DMirror TranspMaterial>8DATAEwFEMist / Stars / PhysicsWorld>DATAFwGEAmb OccWorld>EDATAGwPHFShadow and SpotLamp>DATAPHw IGModifiersEditing>DATA IwIPHShapesEditing>PHDATAIwJ ICurve and SurfaceEditingF>DATAJwKICurve ToolsEditing>DATAKw`LJCurve Tools1Editing>DATA`LwKLinks and PipelineMaterial>DATA0Md(N333?&p(DhCO[DgXzCC(BDC?z?&mDATA(N_(Q0M333?&??? ???? A??@PA Aj?c3>}GCHB? AN  B? #<CDATA(QgR(N333?&@̌AR|B1@lA A@CC #<@DATATRf(Q333?&/9DATASxT&!`  !%A %A DATATxp`S "`"!`!? +?AHM---  T(W^XGXGUXVDATAUwXVTransform PropertiesView3d,>DATAXVwUView PropertiesView3dT>"DATAx(WjW 333?T, l>@DATAW_Z(W333?Tݕ/?V~'?3F:?>T8175e?4>Z& 4?ߕ/?7F:?81X~>75e?'?T3>ne@>N@?L*\?e''_i?p>?T?7^<5? l4{پs}11A 4A ?̎?c "e<b>!?4xkBˇ֟&B{`eA(@? +?AHMݕ/?V~'?3F:?>T8175e?4>Z& 4?H?N+Z#KBAN  B??c/;=C7?X<@@@?DATA(Zc(\W333?TzC̽̌?zC@22 #< #<`jFzD OBzC̽̌?DATA(\g]Z333?TAffzAK_tK_tB33 33 B22 A@CC #<@2DATA]](\ 333?T?zDzDBD22FzD #<HB DATA]d^]333?TDdC8CnD fCC(BDC?z?DATAT^f]333?TOpen Text FileICTURES/home/nine/Proj/VRM/vrm/lends/../ender.app/Contents/Resources/vrm-0.3.pyblend UDATAp`xT !!`" "<m0<o?+++ ,c0k88ha8bDATAhaw8bTransform PropertiesView3d,>DATA8bwhaView PropertiesView3dT>"DATAc_f333?p`?3?3@Z@Oi@??3?4Pi@Z?<50n;l0<Ћ8>(=޼?8BNiY65*<55?B7zCNi@Z?<m0<o??3?3@Z@Oi@?5?58B?N  B?? >=C@PiZ@7?X<Rx"ARx"ARx"AfRӿ?DATA(fc`gc333?p`zC̽̌?zC@22 #< #<`jFzD OBzC̽̌?DATA`ggXif333?p`AffzAK_tK_tB33 33 B22 A@CC #<@2PhiDATA,PhhBO`AQ DATA,hiPhBOp=AN DATA,ihCS@ff8DATAXi8j`g 333?p`?zDzDBD22FzD #<HB DATA8jd0kXi333?p`DdC8CnD fCC(BDC?z?DATAT0kf8j333?p` Save FileNT PICTURES/home/nine/public_html/vrm/img/r/ender.app/Contents/Resources/silhouette.blend oSRtltPSR3-Materialodel SingPmppwHw8 DATAPmumDATAmumPm DATAmunm DATAnuPnmDATAPnunn<DATAnunPn<DATAnuonDATAouPonDATAPouoo,<DATAouoPo,DATAoupoDATApuPpo,DATAPpuppDATApuPpDATApvqmmDATAqv`qpPmnDATA`qvqqPmPnDATAqvq`qnnDATAqv8rqPnnDATA8rvrqmnDATArvr8rmoDATArvsrnoDATAsvXsrnoDATAXsvssPnPoDATAsvsXsnPoDATAsv0tsooDATA0tvxtsPooDATAxtvt0tPnoDATAtvuxtnoDATAuvPutopDATAPuvuuPopDATAuvuPuopDATAuv(vuoPpDATA(vvpvupPpDATApvvv(vnpDATAvvwpvopDATAwvvPppDATAHwxxPmPnnn?@Pף;;!{@xzDATA@xwyOutputRender>DATAywy@xRenderRenderF>DATAywzyAnimRender>DATAzwyFormatRender>DATA{l@|333?V\~CA~CA!?AFA= ADATA@|}{ 333?V\zCCHBC ?CFC= ADATA}d~@|333?V\DhC?DhCC(BDC?z?mDATA~_}333?V\??? ???? A??@PA Aj?c3>}GCHB? AN  B? #<CDATAg~333?V\@̌AR|B1@lA A@CC #<@DATATf333?V\/9DATAxxpHwnmmo !  DATApxxPooonG@? JL-=-=W-X~(xhXDATAhw8OutputRender>DATA8whRenderRender>DATAw؇8AnimRender0>DATA؇wFormatRenderH>DATAwx؇PreviewMaterial>DATAxwHMaterialMaterial>DATAHwxShadersMaterial0>DATAwHTextureMaterialD>DATAwMap InputMaterial\>DATAwMap ToMaterial`>DATAwXRampsMaterial>xDATAXwMirror TranspMaterialH>DATA(d 333?VChCCvgCC(BDC?z?DATA _ (333?VJ>H!?)xu?i6>Pbܗ=(?^L?a?滎z?J>#xu?ܗ=Hi6>(? ?Pb^L?\FAA?4[?[!?@jG>gb>Pb>4Im>k&?]M^L<0@AzA=>Kc<2֍7&> ?:x¸A1vB,jB~@G@? JLJ>H!?)xu?i6>Pbܗ=(?^L?a?滎z?@?$$OAN  B?=Ch?j(4?t'>dDATA( cx 333?VzC AzC A #< #<`jFzD OBDATATxf 333?V;SAVE FILE/usr/home/intrr/blender/blend/untitled.blendDATAxpPnopPoU.=w=o?+=+=W+X,X@DATA_333?W???h?j(4?t'>????hj(4t'?U.=w=o??OAN  B??=Ch?j(4?t'>dEh@Eh@Eh@?DATAd333?WDdC>9C,DeCC(BDC?z?DATA(c@333?WzC AzC A #< #<`jFzD OBDATAT@f333?W SAVE FILE/Users/ton/Desktop/der/blend/untitled.blendDATAxPppope?B$?AHM+++USDATA_333?W |ݕ/?U~'?3F:?>T8165e?2>Z& 4?ߕ/?7F:?81W~>85e?'?T2>ne@>M@?4z?'''䷄?K??T?v|@?l211A 4Atp>?@@FC>G ?4xB֟&BĭeA(@e?B$?AHMݕ/?U~'?3F:?>T8165e?2>Z& 4?H?N,Z#OAN  B??=Ch?j(4?t'>dA@A@A@?DATAd333?W |DdC>9C,DeCC(BDC?z?DATA(c333?W |zC AzC A #< #<`jFzD OBDATATf333?W | SAVE FILE/Users/ton/Desktop/der/blend/untitled.blendDATAxonpPp&=+=o?USЫDATA_333?W ?3?3:-vk(4??3?3;@k(40v@?&=PU1n;+=ꉖø;ZO{:?JXA54U0AC;@j(40v@?&=+=o??3?3:-vk(4?5?5IXAN  B??=C:j(4?.vdٚ@ٚ@ٚ@?DATAdx333?W DdC>9C,DeCC(BDC?z?DATA(xcЫ333?W zC AzC A #< #<`jFzD OBDATATЫfx333?W SAVE FILE/Users/ton/Desktop/der/blend/untitled.blendSRtPtlSR4-Sequence0pX@8 DATAu0DATA0up DATApu0 DATAupDATAu0DATA0upDATApu0DATAupDATAu0DATA0upDATApu0TDATAupTDATAu0DATA0uDATApv0pDATAvpDATAvHDATAHv0DATAvزH0DATAزv 0pDATA vhزpDATAhv pDATAvhpDATAv@0DATA@v0DATAvд@pDATAдv0pDATAv`дpDATA`vDATAv`pDATAv8DATA8vDATAvȶ800DATAȶv00DATAvȶ0DATAXx0PDATAPw OutputRender>DATA wPRenderRenderF>DATAw AnimRender>DATAwFormatRender>DATAd333?WDhCvDhCC(BDC?z?DATATf333?W/9DATAxXp0p !  DATAx008=i>o? DATAl333?W&~CB~CB ?BFB= ADATAe333?W&zCAzCA  A@FB= A DATA_333?W&????????8=i>o?fffAD&@??fffAN  B? #<CDATATf333?W&AVE TARGA/t1.blend9DATAxpp08=H>o?UUU DATAe333?W*zCAzCA1||1 A@FB= A DATA_333?W*????????8=H>o?fffA*@??fffAN  B? #<CDATATf333?W*AVE TARGA/t1.blend9DATApx@pp8=>o?SSSThDATA(hc333?W.B̽̌?B̽̌? #< #<`jFzD SQB̽̌?DATA_h333?W.????????8=>o?fffA@??fffAN  B? #<CDATATf333?W.OAD FILE/9DATA@xp008=i>o? 8DATA8e333?W1zCAzCA A@FB= A DATA_8333?W1????????8=i>o?fffAD&@??fffAN  B? #<CDATATf333?W1AVE TARGA/t1.blend9SRttPSR5-Scripting8xh8 DATA8uxDATAxu8 DATAux DATAu8DATA8uxDATAxu8DATAuxDATAu8DATA8uxDATAxu8DATAvxDATAvHxxDATAHvDATAvHxDATAv 8DATA vhx8DATAhv 8DATAvh8DATAv@8xDATA@v88DATAv@8xDATAvxDATAv`xDATA`v8xDATAv`DATAxxx !  DATAx8x8z==o?DATAwTransform PropertiesView3d>DATAw3D Viewport propertiesView3d>"DATA_333?Y.|????????z==o?&A*A?z==o??????*AN  B??=C ?@?@?@?DATATf333?Y.|/9DATAxhx8??Pף LDATAwTransform PropertiesIpo!>DATAxjp 333?Y/|> =DATAphp333?Y/|CCx??|?DATA(pcp333?Y/|zC̽̌?zC@;; #< #<`jFzD OBzC̽̌?DATAghp333?Y/|CC|||??l|DATA,BO`AQ DATA,BOp=AN DATAh8 333?Y/|zCCHBC|||?CFC= ADATA8ih 333?Y/|?zDzDBCl||ll|zDzD=HB DATA8 333?Y/|BCBCl|llFzD #<HB DATA_333?Y/|??? ???? A???PA A!O?j?}GCHB? AN  B? #<CDATATf333?Y/|/9DATAhx88xO`DATA`w0Link and MaterialsEditing>DATA0w`MeshEditingF>DATAw0Anim settingsObject>DATAwDrawObjectF>DATAwpConstraintsObject>DATApw@EffectsObjectDATA@wpHooksObjectF>DATAw@Particle InteractionObject>DATAwSoftbodyObject>DATAwOutputRender>DATAwPRenderRenderF>DATAPw AnimRender>DATA wPFormatRender>DATAw ScriptlinksScript>DATAd333?Y0|ChC#DhCC(BDC?z?DATATf333?Y0|/9SC\8]SCScenetageainN @'P 'AW@oofRӿfRӿfRӿ=  dd??< d XddZ ??P P @????L?fff??@ A//backbuf/tmp///ftype@&#@^@&^#D DATA'S # DATA S 'H(U DATA SP  mSQ DATAP S ON DATA( R,d'=A@DATA0 \Z ?o: ??8DATA4P X1 RenderLayerCU4 ,CUSurfDonut.001  L44P @+H @o?d?????L=DATALhX DATA8 ) x DATAx (@2Կˤ>?q ><>yǏ>$>?\z->O^?>¿}=;kH??{}y<2?>{>$/>?4퐿ـ>赾>E砿!>^"HۿTj=fj>gr!>=qWbw>>딿D>=㝿fi>YڦT M=kܻlS?FӾ:l>$i"&~̾?3 >>c?Wؿ8h>?^Ͻ;>> i/!&~L?#w1p9>?ֿE>o?LoG=?V=>?2O\=~?$M:>!v?vS>=d?Sѽ>2#R?w6e=?}˽;kH?[z@-O^>@kǏ$?q @Ⱦ<>>4?ˤ>?5?ـ>>?i~$/?{}?2>s?[b?w>g@?r!=@i?j=>^"@H?Xj?=?I?%?>Yڦ?Y M??=?mi?*<>??<=c?>W?8h?1> @>i>"@-~>?F>:?l?>k>ܻ?lS??"w>4p?9?>!i/>#?+~L>?^=?;>$M?<>@GO\>=@X=?>qۿI@pG?=?H?>5#Rw?1e?=d?[ѽ>>"v?jS=DATA<?@@@@@@@AA A0A@APA`ADATA<?@@@@@@@AA A0A@APA`ACAtxCACameraamera.001L>=B B@?LA!&LASpot ????AB>??.?A4B?@@@ ???LA&!LASpot.001 ?????AB>??.?A4B?@@@ ???WO @QWOWorldg=pb>>===??A@pA A?L=TXdTXText    hDATA EERFDATATXdTXvrm-0.3.py(#x  xxJ DATA$(/home/nine/Proj/VRM/vrm/vrm-0.3.pyDATAxh h9DATAx 8DATAP ( l llDATAP 8 llllDATAPH 0QDATA(  ؤ)կ DATA( p  `FREEDATAp  (  pDATA !p @ P####DATA!H!  6llllDATAH!!! P####DATA!!H!8 ,DATA! "!h DATA "h"! :####DATAh"" " 0####DATA""h"@ ȋ####DATA"@#"p G@?DATA@##" &####DATA##@#@ (####DATA#$#p I####DATA$`$# hIFREEDATA`$$$` XFyDATA$$`$ Ц(DATA$8%$0 ####DATA8%%$` DDATA%%8% CjDATA%&%H BDATA&X&% 1IUsDATAX&&& xIDATA&&X&H Fe8DATA&0'& 0@DATA0'x'&0 ODATAx''0'  DATA'(x' nGDDATA(P('X PDATAP((( nC DATA((P( nL DATA(()(P HoHg8DATA()p)( oCDATAp))()8 8pJDATA)*p) pDATA*H*) pGDATAH***X XqDATA**H* (!n@DATA* +* q9kCDATA +h+*@ qCs>DATA,,@,` tJDATA,-, t/DATA-`-,8 tFqDATA`--- huKDATA--`-( u9DATA-8.- PvN(DATA8..- v& DATA..8.h (wADATA./. w>DATA/X/.H xKDATAX/// xODATA//X/@ y(0DATA/00/ `yDATA00x0/ yGDATAx0000@ z DATA01x0p 8z DATA1P10 xzd8DATAP111 zDATA11P10 z-DATA1(21 X{<DATA(2p21! {)DATAp22(2X! |0DATA23p2! P|G DATA3H32" | DATAH3330" |`DATA33H3p" 8}FDATA3 43" }ADATA 4h438# ~ DATAh44 4x# @~DATA44h4# p~DATA4@54# ~DATA@554 $ ~DATA55@5P$  DATA565$ XDATA6`65$ DATA`666 %  DATA66`6p% @ WGDATA6876% &^ѿDATA8776& *DATA7787H& q.>DATA787& XDATA8X87&  DDATA88X8p' @6DATA8098'  1DATA09x98( ؂t^DATAx99098( H?DATA9:x9x( PDATA:P:9( WDATAP:::) !e~?DATA::P:h) @at>DATA:(;:) pq3,?DATA(;p;:) Bq?DATAp;;(;) ЄGʜ>DATA;<p;p* H >DATA<H<;* x4U?DATAH<<<* Y>DATA<<H<+ GFE?DATA< =<+ hq>DATA =h=<+  7DATAh== =, ؆)c=DATA==h=X, 02aDATA=@>=, JdYDATA@>>=, H`>DATA>>@>`- 8 ;Q+DATA>?>- xm%?DATA?`?>- UDATA`???. '?DATA??`?`. @5eDATA?8@?. &+DATA8@@? / Cp?DATA@@8@P/ 0@DATA@A@/ [?DATAAXA@/ DATAXAAA0 .?DATAAAXA`0 H ǿDATAA0BA0 xJ+ ?DATA0BxBA1 K DATAxBB0B1 p2DATABCxB1 Ќ DATACPCB2 DATAPCCCH2 @@DATACCPC2 DATAC(DC2 $DATA(DpDC@3 8DATApDD(D3 DATADEpD3 =DATAEHED(4 DATAHEEEX4 P$DATAEEHE4 DATAE FE4  DATA FhFE85 0DATAhFF F5 xDATAFFhF5 "DATAF@GF6 $DATA@GGFX6 PDATAGG@G6 EDATAGHG7 LiBDATAH`HG7 x BDATA`HHH7  "NBDATAHH`H7 DATAH8IH(8 (@DATA8IIH8 ####DATAII8I8 ȓHDATAIJI@9 @)DATAJXJI9 ?####DATAXJJJ: ####DATAJJXJH: HFREEDATAJ0KJ:  DATA0KxKJ: Е####DATAxKK0K; @?DATAKLxKP; DATALPLK; `FREEDATAPLLL; FREEDATALLPL< Ж$DATAL(MLX< PHDATA(MpML< DATApMM(M= ؗ@?DATAMNpMP= &@?DATANHNM= p)DATAHNNN> ȘDATANNHNP> 0DATAN ON> HDATA OhON> 8DATAhOO O> @DATAOOhO@? @?DATAO@PO? PllllDATA@PPO? 5DATAPP@P? qqqqDATAPQP(@ DATAQ`QPX@ =bbb DATA`QQQ@ )@?DATAQQ`Q A 5 DATAQ8RQA P+qqqqDATA8RRQA qDATARR8RB G@?DATARSRB XFREEDATASXSRB DATAXSSSC НzCDATASSXS0C GDATAS0TSC x@?DATA0TxTSC DATAxTT0TD DATATUxT`D 8@?DATAUPUTD xqqqqDATAPUUUD FREEDATAUUPUE DATAU(VUPE 0DATA(VpVUE `$DATApVV(VE FREEDATAVWpVF FREEDATAWHWV0F qqqqDATAHWWWxF XDATAWWHWF DATAW XWF ȡFREEDATA XhXW8G P8DATAhXX XG CDATAXXhXG ТDATAX@YX0H &qqqDATA@YYXH h) ll DATAYY@YH DATAYZY0I qqqqDATAZ`ZY`I @q qqDATA`ZZZI DATAZZ`ZI DATAZ8[Z J .DATA8[[ZhJ HxDATA[[8[J xFREEDATA[\[J @?DATA\X\[K qDATAX\\\XK 8##DATA\\X\K xDATA\0]\K 0DATA0]x]\L FREEDATAx]]0]XL 8####DATA]^x]L hDATA^P^]L +DATAP^^^M % DATA^^P^hM P1FREEDATA^(_^M /DATA(_p_^(N /DATAp__(_N pDATA_`p_N @?DATA`H`_N Щ,DATAH```O GXDATA``H`O x0DATA` a`O XDATA aha`P FREEDATAhaa a8P GqqqqDATAaahaP DATAa@baP ȫFREEDATA@bba Q > DATAbb@bQ xDATAbcbQ LDATAc`cbHR 0-DATA`cccR DATAcc`cR ȭHDATAc8dcXS @DATA8ddcS DATAdd8dS DATAdedT /DATAeXed`T P+DATAXeeeT DATAeeXeT LDATAe0fehU `HDATA0fxfeU ذ DATAxff0fV DATAfgxfHV H$d2DATAgPgfV d2DATAPgggV б<DATAggPg@W @d2DATAg(hgW d2DATA(hphgW DATAphh(hX #d2DATAhiph`X hd2DATAiHihX 0DATAHiiiX DATAiiHi@Y HDATAi jixY %DATA jhjiY شDATAhjj j Z (FDATAjjhjZ DATAj@kjZ GDATA@kkj`[ hDATAkk@k[ DATAklk[ 2DATAl`lkH\ PDATA`lll\ DATAll`l\ зDATAl8ml] DATA8mml@] H"d2DATAmm8m] DATAmnm] ȸDATAnXnm] DATAXnnn@^ HDATAnnXnx^ d2DATAn0on^ d2DATA0oxon^ /DATAxoo0oX_ `DATAopxo_ LDATApPpo` DATAPpppH` P DATAppPp` DATAp(qp` ȻODATA(qpqp8a H8DATApqq(qa DATAqrpqa DATArHrq b 0DATAHrrrhb xDATArrHrb ȽDATAr src DATA shsrXc hDATAhss sc d2DATAsshsc DATAs@tsd DATA@ttsXd hd2DATAtt@td DATAtutd ؿDATAu`utd DATA`uuu(e 8d2DATAuu`u`e pDATAu8vue DATA8vvue DATAvv8vf (>DATAvwvf 2DATAwXwvf  DATAXwww g 8DATAwwXwXg p+DATAw0xwg DATA0xxxwg DATAxxx0xHh hDATAxyxxh 'DATAyPyxh 'DATAPyyy@i `'DATAyyPyi )d2DATAy(zyi 'd2DATA(zpzyHj h'DATApzz(zj DATAz{pzj DATA{H{zk @)DATAH{{{pk )DATA{{H{k )DATA{ |{ l H)DATA |h|{xl DATAh|| |l d2DATA||h|l DATA|@}|m @@DATA@}}|m 2DATA}}@}m  DATA}~} n PDATA~`~}Xn 5DATA`~~~n :DATA~~`~(o XDATA~8~po DATA8~o DATA8p @DATAPp DATAXp DATAXp DATAX0q hDATA0q DATA0xq DATAx0r 8DATAx@r .DATAPr .DATAPs @.DATAP`s .DATA(s DATA(ps 8DATAp(8t xDATApht DATAHt DATAHt GDATA؄H@u DATA؄ pu !DATA h؄u DATAh u ؕ GDATAhhv P DATA@v GDATA@w )DATAІ@hw P ͓A DATAІw A DATA`Іw GFA DATA`@x ( A DATA`px X )A DATA8x A DATA8x И GA DATAȈ8`y H ;A DATAȈy x kA DATAXȈy A DATAXz MA DATAX@z 8 >A DATA0xz p 6A DATA0xz ؚ vA DATAx0{  IA DATAx{ ӭA DATAP{ Л A DATAP| KbA DATAP| ޳A DATA(| `A DATA(p}  aA DATAp(P} P "vA DATAp} MA DATAH ~ |A DATAHX~ X A DATA؍H~ !iA DATA؍ ~ ;A DATA h؍H P jA DATAh x &A DATAh ؟ DATA@ DATA@P X :DATAЏ@ HDATAЏ0 8 DATA`Џ` h DATA` DATA` DATA8@ P DATA8p DATAȑ8 DATAȑ؂ DATAXȑ 0 DATAXX h ^/DATAX -DATA0 "V+DATA0x@ P (rrrDATAx0 $J%DATAx !QQQDATAP@ P QQQDATAPp 2DATAPЅ 4DATA(8 H DATA(ph x DATAp( DATAp؆ DATAH 0 DATAHh x DATAؖH DATAؖ ؇ JDATA hؖP ` #DATAh  ADATAh ( DATA@H h DATA@ DATAИ@ DATAИ  DATA`И0 P DATA`` $DATA` ت /DATA8 8 DATA8P p DATAȚ8 !DATAȚЋ -DATAXȚ0 P DATAXh -DATAXȌ DATA0 DATA0x( P DATAx0` DATAx Э >>>.DATAP  DATAP 8 -DATAPp -DATA(Ў zzzDATA(p 8 5DATAp(p DATAp DATAH >>>.DATAH0 h *DATA؟H DATA؟  DATA h؟ P zzzDATAh 8 9DATAh DATA@ 8 DATA@ h DATAС@X JDATAСВ  #DATA`С p 3DATA` س DATA`  DATA8 H %DATA8@ DATAȣ8p д -DATAȣД 0 ,DATAXȣ0 DATAX` DATAXx> 'DATA0>` DATA0x? (DATAx0h? DATAx?0 MDATAP @ =DATAP@ +DATAP@ DATA(A DATA(pHA DATAp(A0 DATApA` (DATAHB DATAH`B DATAبHB0 >DATAب C DATA hب0Cк &DATAh C( DATAhCX DATA@D )DATA@`D DATAЪ@D0 DATAЪD 7DATA`ЪHE DATA`E( %DATA`E DATA8F !DATA8`F DATAȬ8F0 DATAȬFh ?DATAXȬG f?DATAXHG {pDATAXG ;r:ADATA0GX "DATA0xH ED?DATAx0H dt$ADATAxH` 2$DATAPH lDATAP8I @4?DATAPpI *?DATA(Ip *DATA(p J DATAp(PJ ld>DATApJH 03DATAHJ &ADATAH@K  DATAرHK0 8ADATAر Kh EDATA hر8L &@.?DATAh L8 DATAhL #U.ADATA@ M DATA@XM >DATAг@MP DATAгM $$DATA`гN $$DATA``N ##DATA`NP 4DATA8N MDATA8xO8 TDATAȵ8P 1DATAȵ`P CDATAXȵP QDATAXPQ DATAXQh DATA0Q DATA0xR DATAx0HR 2DATAxRp H=DATAPR r+DATAPHS DATAPxS@ LDATA(S 79DATA(p`T( "оDATAp(Tx DATApT DATAH0U DATAHpU8 SDATAغHU WDATAغ xVH DATA hغVx "DATAh V DATAh8W DATA@WP DATA@W DATAм@W 6DATAмXX( DATA`мXh &DATA`X DATA`0Y DATA8pY@ DATA8Y #DATAȾ8Z DATAȾ@Z 9DATAXȾZ qqqqDATAXZ 5 DATAXP[( %@?DATA0[ `QDATA0x[ bbb DATAx0(\  DATAxx\P Gqqq DATAP\ FREEDATAP0] @?DATAPx]X #####DATA(] ####DATA(p] % DATAp(P^8 $DATAp^h $$DATAH^ 1YDATAH8_ DATAHp_` ADATA _ DATA h_  DATAh 0` DATAh``P ####DATA@` DATA@` @?DATA@0a DATAap FREEDATA`a >DATA`a ) DATA`Pb@ `! DATA8bp 4DATA8b 8 DATA8Pc@ DATAcp $@# DATAXc ,DATAX8d( 8@?DATAXd X& DATA0d C' DATA0xPeH "hDATAx0e #llllDATAxe lq lDATAP0f0 7 DATAPf 1DATAPf @?DATA(@g@ "@DATA(pg 8 lllDATAp(g ####DATAp8h8 ,bb qDATAHh DATAHh 3qqqqDATAH(i0 FlllDATA i DATA hi P DATAh PjX :FREEDATAhj G DATA@0k8  DATA@k DATA@k ) DATAl @?DATA`Xl` qqDATA`l /B DATA`m jDATA8m @?DATA8m >q q DATA8@nH +DATAn 2@?DATAXn MDATAXxo N$DATAXo %hDATA0Pp` DATA0xp !qqqqDATAx0p DATAxq 7qqqqDATAPhqx 0@?DATAPq FREEDATAPr XDATA(0rH ,DATA(pr * qqqDATAp(r qqnqDATAp s8 bbb DATAHps J DATAHs q q DATAHs DATA 0tH $DATA ht d8DATAh t `DATAhu( ,ll lDATA@pu @?DATA@u FREEDATA@v EqqqqDATAv DATA`v ,####DATA`w( ,@?DATA`pw FREEDATA8w MqqqDATA80xH 6DATA8x yqqqqDATA@yX EqqqqDATAXy J@?DATAX0zH 0b DATAXz %DATA0z DATA0x{0 !@?DATAx0h{ $DATAx{ DATAP{ DATAP{ G lllDATAPp| ####DATA(|  DATA(p| qqqqDATAp(}0 Gq bbDATAp} DATAH} 9l llDATAH(~@ llllDATAHp~ l llDATA ~ ll lDATA h( DATAh @X 6DATAh FREEDATA@ )@?DATA@@` 5####DATA@ DATA؀ 6!GDATA`@` pw DATA` &qqqqDATA` FREEDATA80 DATA8@` DATA8 4qqqqDATA DATAX @ J####DATAX G q qDATAX0 ####DATA0@` H##DATA0x ####DATAx0 DATAx @ FREEDATAPh L8DATAP DATAP8 Q0DATA( $DATA(p DATAp((P DATApX GDATAHЇ (qqqqDATAH(P lll DATAH` =llllDATA Ј 3 DATA h0` DATAh ` NqqqqDATAh Gqq qDATA@X 9DATA@ qqqqDATA@@ ####DATA@p 2DATA` 7DATA`8 DATA`8h *FREEDATA8 @DATA80 B lllDATA8p 4 DATA؍ ?lll DATAXHx qqqqDATAXx *DATAXЎ +z?DATA0(` DqqqDATA0x DATAx0Џ C DATAx@ 3 DATAP !####DATAP8  qq lDATAP@  %qqqqDATA(  )qqqqDATA(p8  DATAp(8  $FREEDATAp  DATAH  @?DATAH8  FREEDATAH(p   DATA p  q q DATA h  DATAh ؓ  9llllDATAh@  8qqqqDATA@  DATA@(  q q DATA@(x  L@?DATA  JFREEDATA` p  DATA`p DATA` @?DATA88 3qqqqDATA8@ 1llllDATA8 qqqqDATAЗ0 #qDATAX  @?DATAXh )DATAX( !qqqqDATA0x QDATA0x` FREEDATAx0 -DATAxh )DATAPX 3DATAP( DATAP` 1DATA(P if oDATA(p /DATAp(p #PDATApP FREEDATAH D.DATAHp ,DATAHX ,getTDATA 0 :or(cDATA h  DATAh P DATAhU  >cts.DATA@HV x FREEDATA@V  5DATA@V ( lendDATAHW x +QDATA`W  DATA`W  )DATA`(X ` ('BigDATA8X  DATA8X  DATA8Y P DATAHY  3r?"DATAXY  >DATAXZ X ;DATAXZ  Bw('RDATA0Z 8 DATA0x0[ x &lt mDATAx0[  %n meDATAx[ ( (DATAP8\  ransDATAP\  `DATAP\  DATA(] P  DATA(pP]  .DATAp(]  DDATAp] ( DATAH^ X 'rendDATAHh^  )= DATAH^   esh.DATA ^ @  KDATA hp_  Gt_obDATAh _ 8! f._gDATAh ` x! e caDATA@X` ! (DATA@` " DATA@` 8" (DATA8a " 0DATA`ha " 4DATA`a (# )DATA`b X# )DATA8Xb # 3(N*LDATA8b $ @DATA8b H$ ,(a0 DATAHc $ DATAXc $  DATAXc 0% PDATAXd `% )DATA0Xd % == 'DATA0xd & DATAx0d 8& 'DATA x(e & L# EmDATA P e ' DATAP   e X' DATA  P  f ' . 0 aDATA (  f ' DATA( p  f ( &FREEDATAp  ( g p( DATA  p 8g ( < DATA H  g ) DATAH   g @) )`DATA  H 0h ) DATA   `h ) +ra mDATA h  h (* DATAh   h X* BDATA  h Xi * ,dingDATA @  i (+ /DATA@   j + icesDATA  @ Hj + -FREEDATA  j , 9DATA` j H, * DATA`0k , ngthDATA``k , GDATA8k H- o)-VDATA8l x- 8DATA8Hl - 3DATAl . ngthDATAXl h. We sDATAX m . h.faDATAXhm . t viDATA0m / jDATA0xm @/ DATAx0n x/ 0DATAxHn / FREEDATAPn / (DATAPn (0 PDATAPn p0 = f.DATA((o 0 #DATA(pxo 0 8DATAp(o `1 DATApp 1 +oDATAHpp 2 DATAHp 02 op oDATAHp 2 9_isFDATA Xq 2 DATA hq (3 :ms:DATAh q 3 DATAh(r 3 ouetDATA@Xr 3 DATA@r 84 DATA@r h4 #e inDATAs 4 OHDATA`s @5 ----DATA`s x5 MDATA`Pt 5 LDATA8t x6 #! DATA8 u 6 utWrDATA8Pu 7 HDATAu x7 M DATAXHv 7 NPDATAXv x8 JDATAX@w 8 -tyleDATA0w P9 DATA0xw 9 Sr noDATAx0Px : C0DATAxx : evtSDATAPx : JhDATAPhy (; <DATAPy ; PDATA(z ; FREEDATA(p@z < 0]/2DATAp(z X< 5tonDATApz < 9DATAH@{ = DATAHp{ 8= KDATAH{ = pt."DATA 0| > .DATA h| `> 0 ForDATAh | > utMeDATAh } > EXDATA@} h? Ew.ToDATA@~ ? A0DATA@~ P@ .FREEDATA ~ @ bDATA ` p @A DATA`    A DATA  `  A ToggDATA 8!   A 6FREEDATA8!!  XB QDATA!!8!؀ B for DATA!"! B DATA"X"!P C 8, GDATAX""" hC DATA""X"؁ C le,DATA"0#"  C DATA0#x#"P D DATAx##0# PD dge DATA#$x# D "|%sDATA$P$# D &pDATAP$$$H E 7FREEDATA$$P$ E 8, GDATA$(%$ E JDATA(%p%$X 0F l, "DATAp%%(% pF DATA%&p% F 3ggleDATA&H&%  G ,DATAH&&& hG DATA&&H& G , == DATA& '& G *FREEDATA 'h'&h PH YDATAh'' ' H F@DATA''h' H = CoDATA'@(' hI DATA@(('Ї I DATA((@( I % DATA()(X @J DATA)`)( J /FREEDATA`))) J DATA))`)0 K =ol(GDATA)8*) K DATA8**)Љ K " DATA**8*  L 9DATA*+* pL DATA+X+*Ȋ L E# ShDATAX+++@ (M 9DATA++X+ M DATA+0,+ M DATA0,x,+( N 2DATAx,,0, pN 8DATA,-x, N DATA-P-,( O =DATAP--- O DATA--P-ȍ O %DATA-(.-  P L DATA(.p.- P $DATAp..(. P PDATA./p.0 (Q 0P DATA/H/. Q DATAH///؏ Q !DATA//H/( (R DATA/ 0/X XR tputDATA 0h0/ R GPDATAh00 0 S HDATA00h0x xS %DATA0@10Б S 6DATA@1108 8T (DATA11@1 T -q)DATA121 T -DATA2`21P PU DATA`222 #DATA22`2 x"DATA2832@ d8DATA8332  DATA3383 HDATA343 x*DATA4X43@ %DATAX444 (HDATA44X4ȕ XEd8DATA4054@  DATA05x54x  DATAx5505 @0DATA56x5  DATA6P658 'PDATAP666 ( GDATA66P6 BDATA6(76x !BDATA(7p76 ! DATAp77(7( !DATA78p7X !PpdDATA8H87ؙ p"E DATAH888P "DATA88H8 U DATA8 98К 0#%d8DATA 9h98( ##HDATAh99 9x #DATA99h9 $DATA9@:9 `$DATA@::9@ $DATA::@: $DATA:;:М @%XDATA;`;: p%-DATA`;;;` %KDATA;;`;؝ P& DATA;8<; &PrDATA8<<;@ &GiDATA<<8< 8'DATA<=< h'H0uDATA=X=<` 'QDATAX=== 0(d8DATA==X= p(DATA=0>= (! DATA0>=h (-DATAH0>Ƞ P)d8DATAH )d8DATAH@ )DATA  *DATA h @* `oDATAh  *DATAhH *`oDATA@ +5yDATA@ + DATA@P +d8DATA ,DATA`أ `,'DATA`0 ,DATA`h ,DATA8 8-DATA8 -qDATA8( -DATAp .DATAX 0. DATAXХ `.DATAX  . DATA0P .+ DATA0x @/:d8DATAx0 / DATAxH /-DATAP H0%DATAP 0DATAP0 0>d8DATA( @1 DATA(p 1 DATAp( 1?0DATAp (2pDATAHة x2+DATAH0 2)DATAH 03DATA  `3/ DATA h 3DATAh H 3 DATAh 84 DATA@ h46DATA@( 4=DATA@ @5PDATAȬ p5IDATA`@ 5- DATA` H6 DATA`ح 6K"DATA8P 7)DATA8 `7DDATA8  7Gd2DATA P8d8DATAXȯ 8$DATAX  8DATAXP 9' DATA0 `9+0%DATA0x 9 DATAx08 9JDATAx p:7d8DATAP : 1DATAPP ;)DATAP P;M DATA( ;DATA(pH <p2DATAp( `<DATAp <DATAH <+DATAHp @=DATAH =DATA  =d8DATA hP >&d8DATAh  x>x9DATAh >P:DATA@  >)DATA@x H?ADATA@ ?DATA ??DATA` X@LDATA` @DATA`X (A <DATA8 hADATA8 A:X=DATA8( B9CDATA hBDATAX B@DATAX  BDATAXp HC(BDATA0 xC")DATA0x C DATAx0( D-DATAx `D"DATAPػ D3FDATAP8 EDATAP hEHDATA( E5DATA(p  FDATAp(P 0FM DATApн FJDATAHH (G(d8DATAH G4XSDATAH GDATA X 8HPDATA h HQDATAh  HpRDATAh HiDATA@` @IDATA@ I&DATA@ IDATA0 J$(DATA` hJ DATA` J,DATA`0 K 9DATA8p XK-`DATA8 KDATA8 K=4DATAp XLDATAX L( DATAX LH`DATAX( M!QDATA0x `M DATA0x M9XeDATAx0 M(DATAxh PN>DATAP N3DATAP8 (OqqqqDATAPh XOd8DATA( ODATA(p O7DATAp(h XP DATAp P DATAH PYDATAH@ 0Q7 DATAH Q'd8DATA  Q%qDATA hX HRiDATAh  xR"DATAh R @tDATA@ S4DATA@ pS/ DATA@ S6DATAH 8T<DATA` TDATA` T6 DATA`P @U9d8DATA8 U"DATA8 U4 DATA8p `Vd8DATA V DATAX V*DATAXH 8Wd8DATAXx hW+DATA0 WyDATA0x WDATAx00 (X!xDATAx xXDATAP X$DATAP  YDATAPP HY, DATA( Y'DATA(p Z'hDATAp(` XZ DATAp Z2DATAH Z2 DATAHP H[DATAH x[ DATA  [ DATA h \ @DATAh h h\ DATAh \ kDATA@ ] DATA@8 8]-DATA@ ]7 DATA ^ d8DATA8 @^FREEDATA8h p^d8DATA8 ^,DATAȟ8 _dDATAȟ` h_)cDATAXȟ _QbDATAX _yaDATAX  (`2DATA0 `3_DATA0x `6`oDATAx0H Xa&XDATAx ad8DATAP a%DATAP( 8b(DATAP b DATA( b$DATA(p( 8c1XDATAp(X hc+DATAp c/DATAH (d DATAHH hd DATAؤHx d&DATAؤ  d=!SDATA hؤ@ `ed8DATAh  eDATAh e DATA@ fDATA@@ `f DATAЦ@ fNDATAЦ f(DATA`Ц (g#FREEDATA`X gd8DATA` gHDATA8 (h*DATA8X h DATAȨ8 h DATAȨ id8DATAXȨ  PiDATAXP i1 DATAX iDATA0 j DATA0x  PjCDATAx0h jABDATAx j"DATAP khDATAP HkBDATAP k*>DATA( lGDATA(pX lHqextDATAp( md8DATAp 8mBDATAHx m*DATAH nG DATAحHH xnHDATAح  nDATA hح (oBDATAh h o*DATAh oOY3DATA@@ ppPDATA@ pd8DATAЯ@ qDATAЯ  PqADATA`Я q'DATA` r*DATA`@ prDATA8 ry+DATA8 rDATAȱ8 8sDATAȱ8 hs$ YDATAXȱ sd8DATAX sDATAX (t7&DATA0` tDATA0x t* DATAx0 u(^DATAx@ pu!d8DATAP u%DATAP v%'DATAP@ pv4 DATA( v d8DATA(p (w DATAp(H xw DATAp w T;DATAH xDATAH Hx3DATAضHx xCd8DATAض  (yDATA hض Xy0kDATAh h yDATAh y DATA@ zMDATA@X z2DATAи@ z DATAи ({@DATA`и0 p{JDATA` {?DATA` X| DATA8P |HvDATA8 |+9DATAȺ8 (}DATAȺ X}DATAXȺX }d8DATAX }DATAX ~(DATA0( x~FREEDATA0xp ~ DATAx0 0DATAx 0,DATAP `GFREEDATAP rokeDATAP DATA( Xges=DATA(p8 GFREEDATAp( DATAp 0h.edDATAH ` DATAH` DATAؿH hiddDATAؿ  ( f._cDATA hؿ `DATAh H  DATAh ؂(strDATA@ DATA@ X/DATA@h CDATA 06yDATA`@  fferDATA` ingSDATA` !le mDATA8 h@TE']DATA8 ؅DATA8 (xDATA X$DATAXX GDATAX (!DATAX  x on DATA0P  DATA0x ADATAx0 hlf._DATAx@ zeX(DATAP 2floaDATAP HChDATAP` 9r waDATA( ($DATA(p  DATAp(P ! 'LaDATAp Aat hDATAH pXDATAH@ HDATAH ?HDATA  `"DATA hP DATAh   to DATAh 0LDATA@P (on cDATA@ FREEDATA@ 8DATA  *outpDATA`x ؎=t "SDATA` H6 DATA`P  FREEDATA8  DATA8 0DATA8 @DATA "DATAX @doPrDATAX pDATAXP !8WDATA0 Mx.DATA0x  #FREEDATAx0p   DATAx  ed tDATAP  `DATAP8  DATAPh  4DATA(  (oDATA(p  xDATAp(0  FREEDATApp  etTyDATAH  #DATAH  pDATAH0  DATA `  $" fiDATA h  @ 0DATAh    DATAhX  9DATA@  HDATA@ ,rn wDATA@p DATA (&xDATA` DATA`H И.lf):DATA` 0*ze3DDATA8 &DATA8X 4DATA8 HJDATA8 TviewDATAX H facDATAX xsincDATAX8 DDATA0 85FREEDATA0x 1DATAx0x  DATAx 0DATAP OposiDATAPx 9co))DATAP h4raDATA(H ОDATA(px DATAp( HIDATAp8 "sforDATAH NXDATAH @UDATAH8 DATA  DATA h X%d8DATAh ( XDATAhX DATA@ (RDATA@  :DATA@ )DATA hselfDATA` 'd8DATA`h _DATA` #DATA8 x7 DATA8P *d8DATA8 8SbDATA( ] DATAX P@ DATAX( /DATAX  EDATA0 PDATA0x xDATAx00 ȧO@DATAx H; DATAP ' DATAPp DATAP @(>DATA(  DATA(p8  ة DATAp(  1 DATAp  'DATAH8! تMDATAH! XTDATAH@" =xDATA " P,T;DATA h# DATAh @# DATAh# (PDATA@$ ?DATA@x$ 6DATA@$ DATA% xDATA`X% JxDATA`% pS-DATA`P& DATA8& (+DATA8& xH DATA8H' 1DATA' PE DATAX ( ȱ:XDATAX( 0DATAX( `DATA0) ,$DATA0xh) DATAx0) @#DATAx) )"DATAP* 2DATAPp* y DATAP* ` DATA(* DATA(p8+ DATAp(h+ DATAp+ XDATAH+  DATAH(, е DATAHX, $HDATA , XqDATA h, DATAh (- ж)DATAh- ()DATA@- < DATA@H. DATA@x. &N DATA. xAd8DATA`@/  DATA`p/ *HDATA`/ pHqDATA8@0 DATA8p0 *T DATA80 pBd8DATA81  DATAXh1 ,DATAX1 p,DATAX(2 л@ethoDATA02 @@DATA0x2 p+FREEDATAx0 3 м@----DATAx3 @buteDATAP3 p1DATAP 4 нMDATAP4 P4DATA(4 )DATA(p(5 ؾ)ion,DATAp(5 080DATAp5 DATAH6 ȿ+itteDATAHp6 (B----DATAH6 FREEDATA 7 +bettDATA hh7 (SxDATAh 7  donDATAh8 (ent DATA@p8 87e adDATA@8 $DATA@09 ativDATA9 HEDATA`9 DATA`(:  t caDATA`h: 00DATA8: DATA8: 1DATA88; DATA; HpolyDATAX; DATAX< gDATAXH< !DATA0< `DATA0x< DATAx00= ----DATAx= H----DATAP= def DATAP> DATAPP> DATA(> h.v) DATA(p> -ce_lDATAp(P? )QDATAp? p4DATAH? 0DATAH8@ DATAH@ H-if fDATA @ DATA hA .DATAh xA @ shaDATAhA DATA@ A centDATA@   B acenDATA  @ hB 0+es[0DATA  B DATA ` C ~DATA`   0C 1 lDATA  ` C P DATA 8  C #DATA8   D DATA  8 PD (9FREEDATA   D #XDATA X  E ing DATAX   @E DATA  X E h<ns cDATA 0  E FREEDATA0 x  (F $DATAx  0 F `DATA  x F DATA P  F DATAP   G DATA  P hG HectoDATA (  G DATA( p  G <DATAp  ( PH 8FREEDATA  p H cpi=DATA H  (I  DATAH   XI H$ar, DATA  H I FREEDATA    J  DATA   8J (<DATAh #!BPYEEDATA """DATA  Name: 'VRM'DATA Blender: 242lllDATAH Group: 'Render'DATA, Tooltip: 'Vector Rendering Method script'uDATA """DATA DATA @ __author__ = "Antonio Ospite"DATA8 __url__ = ["http://projects.blender.org/projects/vrm"]EDATA __version__ = "0.3"DATA8 lllDATAh __bpydoc__ = """\x1DATA<  Render the scene and save the result in vector format.DATA """DATA@ DATAHp # ---------------------------------------------------------------------DATA( # Copyright (c) 2006 Antonio OspiteDATA@ #DATALp # This program is free software; you can redistribute it and/or modify##DATAL # it under the terms of the GNU General Public License as published byEEDATAH` # the Free Software Foundation; either version 2 of the License, orDATA, # (at your option) any later version.tDATA0 ###DATAH` # This program is distributed in the hope that it will be useful,DATAD # but WITHOUT ANY WARRANTY; without even the implied warranty ofDATADH # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theDATA4 # GNU General Public License for more details.DATA #DATAHH # You should have received a copy of the GNU General Public License#DATAD # along with this program; if not, write to the Free Software###DATAP0 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USADATA #DATAH # ---------------------------------------------------------------------DATAX #DATA # Additional credits:C DATAP # Thanks to Emilio Aguirre for S2flender from which I took inspirations :)DATALP # Thanks to Nikola Radovanovic, the author of the original VRM script,DATAD # the code you read here has been rewritten _almost_ entirelyDATAL8 # from scratch but Nikola gave me the idea, so I thank him publicly.DATA #DATAH # ---------------------------------------------------------------------DATAX # BDATA$ # Things TODO for a next release:ADATA< # - Use multiple lighting sources in color calculation,BDATAD@ # (this is part of the "shading refactor") and use light color!DATAD # - FIX the issue with negative scales in object tranformations!=DATA,  # - Use a better depth sorting algorithmiDATALx # - Implement clipping of primitives and do handle object intersections.DATA@ # (for now only clipping away whole objects is supported).DATAL` # - Review how selections are made (this script uses selection states ofDATA0 # primitives to represent visibility infos)DATAH8 # - Use a data structure other than Mesh to represent the 2D image? DATAL # Think to a way to merge (adjacent) polygons that have the same color.DATA<( # Or a way to use paths for silhouettes and contours.yDATAP # - Consider SMIL for animation handling instead of ECMA Script? (Firefox doDATA( # not support SMIL for animations)DATADh # - Switch to the Mesh structure, should be considerably fasteryDATA@ # (partially done, but with Mesh we cannot sort faces, yet)DATALH # - Implement Edge Styles (silhouettes, contours, etc.) (partially done).DATAP # - Implement Shading Styles? (for now we use Flat Shading) (partially done).DATA,@ # - Add Vector Writers other than SVG.DATA #DATAH # ---------------------------------------------------------------------DATA@ #DATAp # Changelog:DATA #EEDATA  # vrm-0.3.py - 2006-05-19DATA00 # * First release after code restucturing.DATA@ # Now the script offers a useful set of functionalitiesDATA,! # and it can render animations, too.DATAX! # DATAH! # ---------------------------------------------------------------------DATA" yDATA0" import BlendernDATAHp" from Blender import Scene, Object, Mesh, NMesh, Material, Lamp, CameraDATA " from Blender.Mathutils import *DATA8# from math import *DATAx# DATA# DATA# # Some global settingsDATA $ DATAP$ class config: DATA$  polygons = dict()DATA$  polygons['SHOW'] = TrueDATA$ %  polygons['SHADING'] = 'TOON'DATA$p%  # Hidden to the user for nowo0DATA(%  polygons['EXPANSION_TRICK'] = TrueDATA& 3\?DATAH&  edges = dict()DATA&  edges['SHOW'] = TrueT>DATA$&  edges['SHOW_HIDDEN'] = FalsefDATA$ '  edges['STYLE'] = 'SILHOUETTE'?DATAp'  edges['WIDTH'] = 2@DATA '  edges['COLOR'] = [0, 0, 0]>DATA( 5 DATA8(  output = dict()DATA x(  output['FORMAT'] = 'SVG'?DATA (  output['ANIMATION'] = FalseDATA$)  output['JOIN_OBJECTS'] = True?DATAh) v?DATA) DATA) c?DATAH) # ---------------------------------------------------------------------DATAp* #?DATA* ## Mesh Utility classL?DATA* #?DATAH+ # ---------------------------------------------------------------------DATA+ class MeshUtils:N?DATA+ L;DATA,,  def getEdgeAdjacentFaces(edge, mesh):ȽDATA4X,  """Get the faces adjacent to a given edge.DATA, UDATAL,  There can be 0, 1 or more (usually 2) faces adjacent to an edge.\?DATA `-  """DATA-  adjface_list = []?DATA- }DATA .  for f in mesh.faces:Ti=DATA8`.  if (edge.v1 in f.v) and (edge.v2 in f.v):?DATA(.  adjface_list.append(f)DATA / fDATAP/  return adjface_listDATA/ ?DATA /  def isMeshEdge(e, mesh):ZDATA0  """Mesh edge rule.DATA`0 oDATAL0  A mesh edge is visible if _any_ of its adjacent faces is selected.DATAL1  Note: if the edge has no adjacent faces we want to show it as well,DATA41  useful for "edge only" portion of objects.DATA 1  """DATA2 DATADH2  adjacent_faces = MeshUtils.getEdgeAdjacentFaces(e, mesh)DATA2 DATA(2  if len(adjacent_faces) == 0:DATA@3  return TrueDATA3 DATA@3  selected_faces = [f for f in adjacent_faces if f.sel]DATA(4 DATA(X4  if len(selected_faces) != 0:DATA4  return TrueDATA4  else:DATA85  return FalseDATA5 DATA$5  def isSilhouetteEdge(e, mesh):DATA(6  """Silhuette selection rule.DATAX6 DATAH6  An edge is a silhuette edge if it is shared by two faces withDATAP7  different selection status or if it is a boundary edge of a selectedM @DATA7  face.BDATA 7  """DATA7 DATAD(8  adjacent_faces = MeshUtils.getEdgeAdjacentFaces(e, mesh)33DATA8 \DATAL8  if ((len(adjacent_faces) == 1 and adjacent_faces[0].sel == 1) or###DATA,@9  (len(adjacent_faces) == 2 andDATA@9  adjacent_faces[0].sel != adjacent_faces[1].sel)DATA:  ):#DATAH:  return TrueDATA:  else:##DATA:  return FalseREEDATA;  DATAP;  def toonShading(u):DATA; ###DATA;  levels = 2DATA <  texels = 2*levels - 1DATATX<  map = [0.0] + [(i)/float(texels-1) for i in range(1, texels-1) ] + [1.0]gDATA <  lllDATA=  v = 1.0DATA(P=  for i in range(0, len(map)-1):DATA,=  pivot = (map[i]+map[i+1])/2.0 qDATA >  j = int(u>pivot)DATAP> DATA>  v = map[i+j]###DATA> DATA>  if vpivot)qqqDATA0I DATA`I  v = map[i+j]REEDATAI qqqDATAI  if v framestyle = "display:none"DATA> else:DATA,? framestyle = "display:block"DATA h? DATAP? # Assign an id to this group so we can set properties on it using DOMDATA@ @ self.file.write("\n" %DATA,@ (framenumber, framestyle) )DATA@DATAADATAHA for obj in Objects:DATAADATA,A if(obj.getType() != 'Mesh'):DATAB continueDATA`BDATA@B self.file.write("\n" % obj.getName())DATACDATA(0C mesh = obj.getData(mesh=1)DATACDATA C if doPrintPolygons:DATA,D self._printPolygons(mesh)DATA`DDATA D if doPrintEdges:DATA8D self._printEdges(mesh, showHiddenEdges)DATAHE DATA(E self.file.write("\n")DATAEDATA$F self.file.write("\n")DATA`FDATAF DATA F ## XDATAG # Private Methods DATAHG #iDATAG 7ADATA$G def _calcCanvasCoord(self, v):DATAHH """Convert vertex in scene coordinates to canvas coordinates.DATA H """DATAHU(?DATA H pt = Vector([0, 0, 0])>DATA 8I >DATA,pI mW = float(self.canvasSize[0])/2.0DATA,I mH = float(self.canvasSize[1])/2.0ADATA J^zDATA$PJ # rescale to canvas sizeDATA J pt[0] = v.co[0]*mW + mWDATA J pt[1] = v.co[1]*mH + mHDATA@K pt[2] = v.co[2]DATA K DATAHK # For now we want (0,0) in the top-left corner of the canvas.>DATA(8L # Mirror and translate along y=DATAL pt[1] *= -1DATA$L pt[1] += self.canvasSize[1]DATA M MDATAXM return pt?DATAMDATAM def _printHeader(self):DATA N """Print SVG header."""DATA`N!DATA8N self.file.write("\n")!DATAPN self.file.write("\n")DATA4P self.file.write("\n\n" %��DATA$���PQ������� self.canvasSize)��DATA���Q���������DATA���Q������� if self.animation:�DATA���R��������REEDATA4���HR������� self.file.write("""\n\n�qqqDATAH���x\������� \n""" % (self.startFrame, self.endFrame, self.startFrame) )�DATA���\������� �qqqDATA���0]������� def _printFooter(self):�DATA$���x]������� """Print the SVG footer."""�DATA���]��������REEDATA(���]������� self.file.write("\n\n") DATAP^qqqDATA(^ def _printPolygons(self, mesh): ?DATA4^ """Print the selected (visible) polygons.DATA 8_ """DATAp_qqqDATA$_ if len(mesh.faces) == 0:uDATA_ returnEDATA0`YDATA$`` self.file.write("\n") DATA`REEDATA ` for face in mesh.faces:DATA 0a if not face.sel: DATAa continueDATAa DATA,a self.file.write("\n")=DATAPp DATA$p self.file.write("\n")qqDATApREEDATA8q def _printEdges(self, mesh, showHiddenEdges=False):DATA4hq """Print the wireframe using mesh edges. DATA q """DATAr qqDATA00r stroke_width = config.edges['WIDTH']DATA,r stroke_col = config.edges['COLOR']DATA r DATA$ s self.file.write("\n")REEDATApsDATA s for e in mesh.edges:DATAs DATA(0t hidden_stroke_style = ""DATAt DATAt if e.sel == 0:lDATA0u if showHiddenEdges == False:DATA pu continueDATAu else:llDATAHv hidden_stroke_style = ";\n stroke-dasharray:3, 3"DATAvY DATA0v p1 = self._calcCanvasCoord(e.v1)qqqDATA0w p2 = self._calcCanvasCoord(e.v2)REEDATApw qqqDATAPw self.file.write("\n")DATAzREEDATA${ self.file.write("\n")uDATAh{qqqDATA{qqqDATA{ DATAH{# ---------------------------------------------------------------------DATAp|#EEDATA|## Rendering ClassesDATA|# DATAH}# ---------------------------------------------------------------------DATA}qqqDATA<}# A dictionary to collect different shading style methods DATA(~shadingStyles = dict()lDATA p~shadingStyles['FLAT'] = NoneDATA ~shadingStyles['TOON'] = NonelllDATAREEDATA8@# A dictionary to collect different edge style methodsDATAedgeStyles = dict()DATA,edgeStyles['MESH'] = MeshUtils.isMeshEdge##DATA8@edgeStyles['SILHOUETTE'] = MeshUtils.isSilhouetteEdgeDATAbbbDATA8؀# A dictionary to collect the supported output formatsDATA@outputWriters = dict()DATA(outputWriters['SVG'] = SVGVectorWriterDATADATAqqlDATA@class Renderer:DATA8 """Render a scene viewed from the active camera.qqqDATA qqqDATAL  This class is responsible of the rendering process, transformation andDATAH projection of the objects in the scene are invoked by the renderer.DATADATAL@ The rendering is done using the active camera for the current scene.DATA """DATADATA  def __init__(self):DATAPh """Make the rendering process only for the current scene by default.DATAqqqDATAT We will work on a copy of the scene, to be sure that the current scene doEEDATA( not get modified in any way.DATA  """DATA(DATAHX # Render the current Scene, this should be a READ-ONLY propertyDATA,Ї self._SCENE = Scene.GetCurrent()nq DATA ( DATA@` # Use the aspect ratio of the scene rendering contextDATA4Ј context = self._SCENE.getRenderingContext()DATA0REEDATAP` aspect_ratio = float(context.imageSizeX())/float(context.imageSizeY())lDATAH self.canvasRatio = (float(context.aspectRatioX())*aspect_ratio,DATA<X float(context.aspectRatioY())EEDATA  ) DATAREEDATA4@ # Render from the currently active camera qDATA8 self.cameraObj = self._SCENE.getCurrentCamera()DATAI DATA,8 # Get a projector for this camera.qDATAD # NOTE: the projector wants object in world coordinates,REEDATAD # so we should remember to apply modelview transformationsDATA8p # _before_ we do projection transformations.DATA@؍ self.proj = Projector(self.cameraObj, self.canvasRatio)DATAHuDATA,x # Get the list of lighting sourcesEDATA,Ў obj_lst = self._SCENE.getChildren()DATAH( self.lights = [ o for o in obj_lst if o.getType() == 'Lamp']qqqDATAqqqDATADЏ # When there are no lights we use a default lighting sourceDATA4@ # that have the same position of the cameraDATA$ if len(self.lights) == 0:qqDATA$ l = Lamp.New('Lamp')DATA(@ lobj = Object.New('Lamp')DATA, lobj.loc = self.cameraObj.loc lDATA lobj.link(l) llDATA(8 self.lights.append(lobj)DATADATADATA ##DATA( # Public MethodsREEDATAp #DATA DATA<ؓ def doRendering(self, outputWriter, animation=False):DATA<@ """Render picture or animation and write it out. DATA  uDATA The parameters are:DATAP( - a Vector writer object that will be used to output the result.qqqDATAL - a flag to tell if we want to render an animation or only theEDATA  current frame.DATA p """DATA  REEDATA4 context = self._SCENE.getRenderingContext()DATA4@ origCurrentFrame = context.currentFrame()##DATAqqqDATA$З # Handle the animation caseDATA  if not animation:uDATA,h startFrame = origCurrentFrameq DATA$ endFrame = startFrameqqDATA  outputWriter.open()DATA` else:qqDATA0 startFrame = context.startFrame()peDATA, endFrame = context.endFrame()EEDATA4X outputWriter.open(startFrame, endFrame)DATA  DATA4 # Do the rendering process frame by frameMODATA$P print "Start Rendering!"REEDATA0 for f in range(startFrame, endFrame+1):DATA$ context.currentFrame(f)DATAPdoSDATAH # Use some temporary workspace, a full copy of the scenertiDATA0 inputScene = self._SCENE.copy(2)DATA0X # And Set our camera accordinglyDATA< self.cameraObj = inputScene.getCurrentCamera()DATA hanDATAP try: DATA@U  renderedScene = self.doRenderScene(inputScene)DATAHV  except :REEDATA8V  print "There was an error! Aborting." MDATA$V  import traceback DATA,HW  print traceback.print_exc()DATAW ntaDATA,W  self._SCENE.makeCurrent()DATA,(X  Scene.unlink(inputScene)DATA X  del inputSceneDATAX  returnbDATAY REEDATA4HY  outputWriter.printCanvas(renderedScene,DATA@Y  doPrintPolygons = config.polygons['SHOW'],DATA<Z  doPrintEdges = config.edges['SHOW'],DATADZ  showHiddenEdges = config.edges['SHOW_HIDDEN'])EDATAZ  DATA(0[  # clear the rendered scene DATA([  self._SCENE.makeCurrent()DATA,[  #Scene.unlink(renderedScene)DATA 8\  #del renderedSceneDATA\ d rDATA \  outputWriter.close()rigDATA]  print "Done!"DATA0P]  context.currentFrame(origCurrentFrame)TDATA] inaDATA] ng DATA(^  def doRenderScene(self, workScene):DATA,h^  """Control the rendering process.DATA ^  REEDATAL^  Here we control the entire rendering process invoking the operationDATAHp_  needed to transform and project the 3D scene in two dimensions.DATA _  """DATA `  REEDATA,X`  # global processing of the scene DATA` :DATA,`  self._doSceneClipping(workScene)I DATA8a yDATA8ha  self._doConvertGeometricObjToMesh(workScene)l.NDATAa }DATA,b  if config.output['JOIN_OBJECTS']: DATA4Xb  self._joinMeshObjectsInScene(workScene)DATAb .v[DATA0b  self._doSceneDepthSorting(workScene)DATA Hc  REEDATA c  # Per object activitiesDATAc ligDATA,d  Objects = workScene.getChildren() DATAXd  for obj in Objects:DATAd G DATA(d  if obj.getType() != 'Mesh':DATAP(e  print "Only Mesh supported! - Skipping type:", obj.getType()DATAe  continue AlDATAe DATA0 f  print "Rendering: ", obj.getName()DATAf betDATA(f  mesh = obj.getData(mesh=1)DATAg N DATA@8g  self._doModelingTransformation(mesh, obj.matrix)DATAg P DATA,g  self._doBackFaceCulling(mesh)DATA0h ]DATA,`h  self._doPerVertexLighting(mesh)DATAh DATADh  # Do "projection" now so we perform further processingCDATA0Xi  # in Normalized View CoordinatesDATA0i  self._doProjection(mesh, self.proj)DATAj W DATA0Hj  self._doViewFrustumClipping(mesh)DATAj  soDATA,j  self._doMeshDepthSorting(mesh)DATA0k yDATAH`k  self._doEdgesStyle(mesh, edgeStyles[config.edges['STYLE']])DATAk REEDATAl  DATA4Hl  # Update the object data, important! :)DATAl  mesh.update()yDATAl yDATA m  return workScene DATAhm REEDATAm  vfDATAm  ##DATAn  # Private MethodsDATAHn  #shDATAn .seDATAn  # Utility methodsEEDATAn REEDATA$(o  def _getObjPosition(self, obj):DATA<xo  """Return the obj position in World coordinates.estDATA o  """DATA,p  return obj.matrix.translationPart()DATApp yDATA$p  def _cameraViewVector(self):es:DATA<p  """Get the View Direction form the camera matrix. DATA Xq  """DATA<q  return Vector(self.cameraObj.matrix[2]).resize3D()tDATAq eleDATA(r REEDATAXr  # Faces methodsDATAr s['DATA$r  def _isFaceVisible(self, face):DATAPs  """Determine if a face of an object is visible from the current camera.DATA s  DATAPs  The view vector is calculated from the camera location and one of theDATAPPt  vertices of the face (expressed in World coordinates, after applyingDATA$t  modelview transformations).DATA u REEDATALPu  After those transformations we determine if a face is visible byy DATAPu  computing the angle between the face normal and the view vector, thisDATAPHv  angle has to be between -90 and 90 degrees for the face to be visible.DATALv  This corresponds somehow to the dot product between the two, if itEDATA0@w  results > 0 then the face is visible.auDATAw gglDATATw  There is no need to normalize those vectors since we are only interested inDATADPx  the sign of the cross product and not in the product value.DATAx  DATALx  NOTE: here we assume the face vertices are in WorldCoordinates, soaDATA@hy  please transform the object _before_ doing the test.DATA y  """DATAz  = DATA$@z  normal = Vector(face.no) DATA8z  camPos = self._getObjPosition(self.cameraObj)DATAz  view_vect = None DATA@{  DATALp{  # View Vector in orthographics projections is the view Direction ofDATA{  # the camera(10DATA00|  if self.cameraObj.data.getType() == 1:DATA4|  view_vect = self._cameraViewVector()"DATA|  DATAH }  # View vector in perspective projections can be considered asDATAH}  # the difference between the camera position and one point of18DATAD~  # the face, we choose the farthest point from the camera.I.DATA0~  if self.cameraObj.data.getType() == 0:DATAd~  vv = max( [ ((camPos - Vector(v.co)).length, (camPos - Vector(v.co))) for v in face] )eDATA p  view_vect = vv[1]DATA  DATA nsTDATA8   # if d > 0 the face is visible from the cameraDATA   d = view_vect * normalDATA ؀  yDATA  if d > 0:ngDATAP  return TrueDATA  else:erDATA؁  return False 16DATA   DATAP REEDATA  # Scene methodsDATA yDATA(  def _doSceneClipping(self, scene):uDATA8H  """Clip whole objects against the View Frustum.DATA  DATAL  For now clip away only objects according to their center position.EDATA X  """DATA le(DATA4  cpos = self._getObjPosition(self.cameraObj)DATA0   view_vect = self._cameraViewVector()DATA I DATA0  near = self.cameraObj.data.clipStart$DATA,  far = self.cameraObj.data.clipEnd DATAh  GUDATAH  aspect = float(self.canvasRatio[0])/float(self.canvasRatio[1])EDATA@  fovy = atan(0.5/aspect/(self.cameraObj.data.lens/32))vtDATA   fovy = fovy * 360.0/piODATAЇ  DATA(  Objects = scene.getChildren()DATAX  for o in Objects: DATA0  if o.getType() != 'Mesh': continue;DATA vtSDATA@0  obj_vect = Vector(cpos) - self._getObjPosition(o)DATA tylDATA$Љ  d = obj_vect*view_vect DATA<   theta = AngleBetweenVecs(obj_vect, view_vect) DATA  DATAHȊ  # if the object is outside the view frustum, clip it awayDATA<@  if (d < near) or (d > far) or (theta > fovy):anDATA   scene.unlink(o)DATA romDATA4(  def _doConvertGeometricObjToMesh(self, scene):EDATA<  """Convert all "geometric" objects to mesh ones. DATA   """DATA@(  geometricObjTypes = ['Mesh', 'Surf', 'Curve', 'Text']DATA  DATA(ȍ  Objects = scene.getChildren()DATAP   objList = [ o for o in Objects if o.getType() in geometricObjTypes ]DATA  for obj in objList:DATA  old_obj = objDATA40  obj = self._convertToRawMeshObj(obj)DATA  scene.link(obj)DATA$؏  scene.unlink(old_obj)fiDATA( DATAX yDATAH  # XXX Workaround for Text and Curve which have some normalsDATAL  # inverted when they are converted to Mesh, REMOVE that whenDATA(x  # blender will fix that!!DATA8Б  if old_obj.getType() in ['Curve', 'Text']:DATA,8  me = obj.getData(mesh=1)DATA0  for f in me.faces: f.sel = 1;DATA0  for v in me.verts: v.sel = 1;DATA$P  me.remDoubles(0)DATA$  me.triangleToQuad()DATA$  me.recalcNormals()DATA@  me.update()DATA DATA yDATA,  def _doSceneDepthSorting(self, scene):DATA(@  """Sort objects in the scene.DATA DATAHȕ  The object sorting is done accordingly to the object centers.DATA @  """DATAx DATA4  c = self._getObjPosition(self.cameraObj)DATA DATA(8  by_center_pos = (lambda o1, o2:DATAH  (o1.getType() == 'Mesh' and o2.getType() == 'Mesh') andDATAD  cmp((self._getObjPosition(o1) - Vector(c)).length,DATADx  (self._getObjPosition(o2) - Vector(c)).length)DATA  )DATA( DATATX  # TODO: implement sorting by bounding box, if obj1.bb is inside obj2.bb,DATAHؙ  # then ob1 goes farther than obj2, useful when obj2 has holesDATAP  by_bbox = NoneDATA   REEDATA(К  Objects = scene.getChildren()DATA$(  Objects.sort(by_center_pos)DATA x  DATA  # update the sceneDATA  for o in Objects:DATA@  scene.unlink(o)DATA  scene.link(o)DATAМ yDATA0  def _joinMeshObjectsInScene(self, scene):DATAL`  """Merge all the Mesh Objects in a scene into a single Mesh Object.DATA ؝  """DATA REEDATAH@  oList = [o for o in scene.getChildren() if o.getType()=='Mesh']DATA DATAL  # FIXME: Object.join() do not work if the list contains 1 objectREEDATA`  if len(oList) == 1:DATA  returnDATA DATA$  mesh = Mesh.New('BigOne')EEDATA0h  bigObj = Object.New('Mesh', 'BigOne')DATAȠ  bigObj.link(mesh)DATA REEDATA@  scene.link(bigObj)DATA DATA  try:~DATA   bigObj.join(oList)DATA H  except RuntimeError:DATA8  print "\nWarning! - Can't Join Objects\n"DATA$  scene.unlink(bigObj)DATAP  returnDATA  except TypeError:DATA(أ  print "Objects Type error?"DATA 0  DATAh  for o in oList:DATA  scene.unlink(o)DATA DATA(  scene.update()DATAp DATA  EEDATA Х  # Per object/mesh methods8DATA  DATA,P  def _convertToRawMeshObj(self, object):DATA<  """Convert geometry based object to a mesh object.DATA   """DATA0H  me = Mesh.New('RawMesh_'+object.name)DATA(  me.getFromObject(object.name)DATA DATA@0  newObject = Object.New('Mesh', 'RawMesh_'+object.name)DATA  newObject.link(me)DATA DATA@  # If the object has no materials set a default materialDATA   if not me.materials:MDATA,ة  me.materials = [Material.New()]DATA,0  #for f in me.faces: f.mat = 0DATA DATA0  newObject.setMatrix(object.getMatrix())DATA DATAH  return newObjectyDATA DATA8  def _doModelingTransformation(self, mesh, matrix):DATA@(  """Transform object coordinates to world coordinates.DATA yDATALȬ  This step is done simply applying to the object its tranformationDATA0@  matrix and recalculating its normals.DATA   """DATALح  # XXX FIXME: blender do not transform normals in the right way whenDATA,P  # there are negative scale valuesyDATAH  if matrix[0][0] < 0 or matrix[1][1] < 0 or matrix[2][2] < 0:d8DATAH   print "WARNING: Negative scales, expect incorrect results!"DATA REEDATA(ȯ  mesh.transform(matrix, True)#DATA   DATA(P  def _doBackFaceCulling(self, mesh):DATA,  """Simple Backface Culling routine.DATA   DATAL8  At this level we simply do a visibility test face by face and thenDATA8  select the vertices belonging to visible faces.DATA   """DATA P  0DATAP  # Select all vertices, so edges can be displayed even if there are noDATA  # facesDATA H  for v in mesh.verts:-DATA  v.sel = 1DATA   DATA,  Mesh.Mode(Mesh.SelectModes['FACE'])DATAp  # Loop on facesDATA   for f in mesh.faces:DATA  f.sel = 08DATA(P  if self._isFaceVisible(f):DATA  f.sel = 1 DATA yDATA,   def _doPerVertexLighting(self, mesh):DATADx  """Apply an Illumination and shading model to the object.DATA =DATA@  The model used is the Phong one, it may be inefficient,DATAP  but I'm just learning about rendering and starting from Phong seemed:DATA   the most natural way.DATA X  """DATA DATA<  # If the mesh has vertex colors already, use them,DATA<(  # otherwise turn them on and do some calculationsDATA   if mesh.vertexColors:DATA  return DATA   mesh.vertexColors = 1DATAp REEDATA$  materials = mesh.materialsDATA   DATA0(  # TODO: use multiple lighting sources8DATA$  light_obj = self.lights[0] DATA4ػ  light_pos = self._getObjPosition(light_obj)DATA 8  light = light_obj.dataDATA REEDATA8  camPos = self._getObjPosition(self.cameraObj)DATA  & DATAPP  # We do per-face color calculation (FLAT Shading), we can easily turnDATALн  # to a per-vertex calculation if we want to implement some shadingDATA,H  # technique. For an example see:REEDATA8  # http://www.miralab.unige.ch/papers/368.pdfDATA   for f in mesh.faces:TDATAX  if not f.sel:DATA  continueDATA REEDATA  mat = NoneDATA`  if materials:DATA(  mat = materials[f.mat]DATA [DATA(0  # A new default materialDATA  if mat == None:DATA0  mat = Material.New('defMat')YDATA0  DATA0p  L = Vector(light_pos).normalize()8DATA `DATA@  V = (Vector(camPos) - Vector(f.cent)).normalize()DATAp : DATA,  N = Vector(f.no).normalize()cDATA REEDATA$(  R = 2 * (N*L) * N - LDATAx DATA<  # TODO: Attenuation factor (not used for now)DATA,  a0 = 1.0; a1 = 0.0; a2 = 1.0DATA@h  d = (Vector(f.v[0].co) - Vector(light_pos)).lengthDATA4  fd = min(1, 1.0/(a0 + a1*d + a2*(d*d)))DATA8 jDATA h  # Ambient componentDATA  Ia = 1.0DATA8  ka = mat.getAmb() * Vector([0.1, 0.1, 0.1])DATAh  Iamb = Ia * kaDATA  d8DATA   # Diffuse componentDATA8@  kd = mat.getRef() * Vector(mat.getRGBCol())DATA(  for i in range(0, len(kd)):DATA(  kd[i] *= light.col[i]DATAX DATA$  Ip = light.getEnergy()DATA  DATA8  if config.polygons['SHADING'] == 'FLAT':DATA0  Idiff = Ip * kd * max(0, (N*L))DATA8  elif config.polygons['SHADING'] == 'TOON':DATA@H  Idiff = Ip * kd * MeshUtils.toonShading(N*L)DATA DATA8  # Specular component (consider spec color)DATA<P  ks = mat.getSpec() * Vector(mat.getSpecCol())DATA$  ns = mat.getHardness()DATA8  Ispec = Ip * ks * pow(max(0, (V*R)), ns)~DATAp REEDATA$  # Emissive componentDATA,  ki = Vector([mat.getEmit()]*3)DATAH REEDATA,x  I = ki + Iamb + (Idiff + Ispec)DATA DATA DATA$0  # Set Alpha componentEEDATA  I = list(I)DATA(  I.append(mat.getAlpha())d8DATA  DATA0P  # Clamp I values between 0 and 1tDATA(  I = [ min(c, 1) for c in I]DATA(  I = [ max(0, c) for c in I]DATA` DATA4  # Convert to a value between 0 and 255DATA4  tmp_col = [ int(c * 255.0) for c in I]DATAP DATA  for c in f.col:DATA$  c.r = tmp_col[0]DATA$  c.g = tmp_col[1]DATA$h  c.b = tmp_col[2]DATA$  c.a = tmp_col[3]DATA DATA08  def _doProjection(self, mesh, projector):DATA8  """Apply Viewing and Projection tranformations.DATA   """DATA8 DATA h  for v in mesh.verts:DATA0  p = projector.doProjection(v.co)DATA  v.co[0] = p[0]DATA`  v.co[1] = p[1]DATA  v.co[2] = p[2]DATA DATA4   # We could reeset Camera matrix, since nowDATA4  # we are in Normalized Viewing Coordinates,DATA8  # but doung that would affect World CoordinateDATA(H  # processing for other objectsDATA REEDATA(  #self.cameraObj.data.type = 1DATA,(  #self.cameraObj.data.scale = 2.0DATA$  #m = Matrix().identity()DATA(  #self.cameraObj.setMatrix(m)DATA( DATA,X  def _doViewFrustumClipping(self, mesh):DATA0  """Clip faces against the View Frustum.DATA   """DATAH DATA(x  def test_extensions(self, f1, f2):DATA@  for v1, v2 in [ (v1, v2) for v1 in f1 for v2 in f2 ]:DATA@  passDATA 2DATA$  def depth_sort(self, faces):REEDATA  returnDATA@  d8DATA DATA,  def _doMeshDepthSorting(self, mesh):6DATA$  """Sort faces in an object.DATAX REEDATAL  The faces in the object are sorted following the distance of theDATA,  vertices from the camera position.DATA X  """DATA$  if len(mesh.faces) == 0:DATA  returnDATA  =DATA4P  #c = self._getObjPosition(self.cameraObj)DATA ?DATA  # In NVCDATA   c = [0, 0, 1]DATAh DATA$  # hackish sorting of facesDATA yDATAD  # Sort faces according to the max distance from the cameraDATA,  by_max_vert_dist = (lambda f1, f2:DATAH  cmp(max([(Vector(v.co)-Vector(c)).length for v in f2]),DATALX  max([(Vector(v.co)-Vector(c)).length for v in f1])))DATA   DATAD  # Sort faces according to the min distance from the cameraDATA,x  by_min_vert_dist = (lambda f1, f2:DATAH  cmp(min([(Vector(v.co)-Vector(c)).length for v in f1]),DATALH  min([(Vector(v.co)-Vector(c)).length for v in f2])))yDATA   DATAD  # Sort faces according to the avg distance from the cameraDATA,h  by_avg_vert_dist = (lambda f1, f2:EDATAP  cmp(sum([(Vector(v.co)-Vector(c)).length for v in f1])/len(f1),DATAT@  sum([(Vector(v.co)-Vector(c)).length for v in f2])/len(f2)))REEDATA REEDATA DATAD   # FIXME: using NMesh to sort faces. We should avoid that!EEDATA(  nmesh = NMesh.GetRaw(mesh.name)DATA,  nmesh.faces.sort(by_max_vert_dist) DATA @  #nmesh.faces.reverse()DATA DATA  # Depth sort testsEDATA DATA(8  self.depth_sort(nmesh.faces)DATA REEDATA   yDATA8  mesh.faces.delete(1, range(0, len(mesh.faces)))DATA`  DATA,  for i,f in enumerate(nmesh.faces):DATA,  fv = [v.index for v in f.v] DATA$@  mesh.faces.extend(fv)yDATA(  mesh.faces[i].mat = f.matDATA(  mesh.faces[i].sel = f.selDATA8@  for i,c in enumerate(mesh.faces[i].col):cDATA$  c.r = f.col[i].ryDATA$  c.g = f.col[i].gDATA$H  c.b = f.col[i].bDATA$  c.a = f.col[i].aDATA DATA4  def _doEdgesStyle(self, mesh, edgestyleSelect):DATADx  """Process Mesh Edges accroding to a given selection style.DATA DATA   Examples of algorithms:DATAh , DATA  Contours:DATAP  given an edge if its adjacent faces have the same normal (that isDATA4X  they are complanar), than deselect it.DATA DATA  Silhouettes:DATAL0  given an edge if one its adjacent faces is frontfacing and theDATA@  other is backfacing, than select it, else deselect.DATA   """DATAP REEDATA,  Mesh.Mode(Mesh.SelectModes['EDGE'])DATA yDATA   for e in mesh.edges: DATAX REEDATA  e.sel = 0DATA,  if edgestyleSelect(e, mesh):e_wDATA(  e.sel = 1EEDATAp  yDATA DATA te(DATAH # ---------------------------------------------------------------------DATA #DATA  ## GUI Class and Main Programe(DATA #EEDATAH8 # ---------------------------------------------------------------------DATA DATA REEDATA  from Blender import BGL, DrawDATA` from Blender.BGL import *EEDATA REEDATA  class GUI:DATA  DATAH  def _init():REEDATA yDATA   # Output Format menu joDATA0  output_format = config.output['FORMAT']DATADh  default_value = outputWriters.keys().index(output_format)+1DATA8  GUI.outFormatMenu = Draw.Create(default_value)-DATA$@  GUI.evtOutFormatMenu = 0yleDATA DATA$  # Animation toggle buttonDATAD  GUI.animToggle = Draw.Create(config.output['ANIMATION'])yDATA   GUI.evtAnimToggle = 1DATA wedDATA(  # Join Objects toggle buttonREEDATAHX  GUI.joinObjsToggle = Draw.Create(config.output['JOIN_OBJECTS'])DATA$  GUI.evtJoinObjsToggle = 2 cDATA  ne DATA$P  # Render filled polygonsDATAD  GUI.polygonsToggle = Draw.Create(config.polygons['SHOW']) DATA DATA @  # Shading Style menu DATA4  shading_style = config.polygons['SHADING'] DATAD  default_value = shadingStyles.keys().index(shading_style)+1DATA<`  GUI.shadingStyleMenu = Draw.Create(default_value)emDATA(  GUI.evtShadingStyleMenu = 21LDATA  ChiDATA$P  GUI.evtPolygonsToggle = 3DATAD  # We hide the config.polygons['EXPANSION_TRICK'], for nowuDATA locDATA @  # Render polygon edgesDATA@  GUI.showEdgesToggle = Draw.Create(config.edges['SHOW'])DATA$  GUI.evtShowEdgesToggle = 4DATAP ectDATA   # Render hidden edgesDATAP  GUI.showHiddenEdgesToggle = Draw.Create(config.edges['SHOW_HIDDEN'])DATA,P  GUI.evtShowHiddenEdgesToggle = 5HDATA  DATA  # Edge Style menu DATA,   edge_style = config.edges['STYLE']#DATA@x  default_value = edgeStyles.keys().index(edge_style)+1:DATA8  GUI.edgeStyleMenu = Draw.Create(default_value)DATA$P  GUI.evtEdgeStyleMenu = 6ndeDATA REEDATA  # Edge Width sliderDATAD  GUI.edgeWidthSlider = Draw.Create(config.edges['WIDTH'])el DATA$  GUI.evtEdgeWidthSlider = 7DATA REEDATA  # Edge Color PickerDATA$P  c = config.edges['COLOR']DATAP  GUI.edgeColorPicker = Draw.Create(c[0]/255.0, c[1]/255.0, c[2]/255.0)DATA$   GUI.evtEdgeColorPicker = 71DATAp  ontDATA   # Render ButtonDATA   GUI.evtRenderButton = 8DATA8  REEDATAh   # Exit ButtonceDATA   GUI.evtExitButton = 9DATA  DATA0   def draw():DATAp  REEDATA$   # initialize static membersDATA   GUI._init()DATA0  DATA(`   glClear(GL_COLOR_BUFFER_BIT)DATA$   glColor3f(0.0, 0.0, 0.0) DATA    glRasterPos2i(10, 350)DATA<X   Draw.Text("VRM: Vector Rendering Method script.")esDATA   glRasterPos2i(10, 335)DATA0  Draw.Text("Press Q or ESC to quit.")DATAp >DATA(  # Build the output format menuPDATA   glRasterPos2i(10, 310)oDATA0H  Draw.Text("Select the output Format:")rDATA,  outMenuStruct = "Output Format %t"EDATA(  for t in outputWriters.keys():DATA8X  outMenuStruct = outMenuStruct + "|%s" % t qDATAL  GUI.outFormatMenu = Draw.Menu(outMenuStruct, GUI.evtOutFormatMenu,EDATAX8  10, 285, 160, 18, GUI.outFormatMenu.val, "Choose the Output Format") viDATA yDATA  # Animation toggle DATAH8  GUI.animToggle = Draw.Toggle("Animation", GUI.evtAnimToggle,DATA8  10, 260, 160, 18, GUI.animToggle.val,DATA4  "Toggle rendering of animations")hiDATAx DATA   # Join Objects toggle vDATAP  GUI.joinObjsToggle = Draw.Toggle("Join objects", GUI.evtJoinObjsToggle,DATA<x  10, 235, 160, 18, GUI.joinObjsToggle.val, DATA8  "Join objects in the rendered file")DATAH lseDATAx  # Render ButtonDATAL  Draw.Button("Render", GUI.evtRenderButton, 10, 210-25, 75, 25+18,DATA$8  "Start Rendering")DATAP  Draw.Button("Exit", GUI.evtExitButton, 95, 210-25, 75, 25+18, "Exit!")DATA yDATA8  # Rendering StylesDATA   glRasterPos2i(200, 310)DATA(  Draw.Text("Rendering Style:")DATA( yDATAX  # Render PolygonsDATAT  GUI.polygonsToggle = Draw.Toggle("Filled Polygons", GUI.evtPolygonsToggle,DATA<   200, 285, 160, 18, GUI.polygonsToggle.val,DATA,  "Render filled polygons") DATA ^DATA(  if GUI.polygonsToggle.val == 1:DATAh yDATA$  # Polygon Shading StyleDATA8  shadingStyleMenuStruct = "Shading Style %t"DATA,P  for t in shadingStyles.keys():EDATAT  shadingStyleMenuStruct = shadingStyleMenuStruct + "|%s" % t.lower()DATA`(  GUI.shadingStyleMenu = Draw.Menu(shadingStyleMenuStruct, GUI.evtShadingStyleMenu,DATAD  200, 260, 160, 18, GUI.shadingStyleMenu.val,REEDATA0(  "Choose the shading style")DATA DATA  DATA  # Render EdgesDATAP0  GUI.showEdgesToggle = Draw.Toggle("Show Edges", GUI.evtShowEdgesToggle,DATA<  200, 235, 160, 18, GUI.showEdgesToggle.val,DATA(  "Render polygon edges")DATAp REEDATA,  if GUI.showEdgesToggle.val == 1:yDATA  DATA8   # Edge StyleyDATA4   edgeStyleMenuStruct = "Edge Style %t" DATA(   for t in edgeStyles.keys():DATAP8!  edgeStyleMenuStruct = edgeStyleMenuStruct + "|%s" % t.lower()8DATAX!  GUI.edgeStyleMenu = Draw.Menu(edgeStyleMenuStruct, GUI.evtEdgeStyleMenu,DATA@@"  200, 210, 160, 18, GUI.edgeStyleMenu.val,DATA0"  "Choose the edge style")d8DATA# xDATA@#  # Edge sizeDATAT#  GUI.edgeWidthSlider = Draw.Slider("Width: ", GUI.evtEdgeWidthSlider, DATA@$  200, 185, 140, 18, GUI.edgeWidthSlider.val,DATA8x$  0.0, 10.0, 0, "Change Edge Width")DATA$  DATA%  # Edge ColorDATALX%  GUI.edgeColorPicker = Draw.ColorPicker(GUI.evtEdgeColorPicker,EDATAT%  342, 185, 18, 18, GUI.edgeColorPicker.val, "Choose Edge Color")DATAP& REEDATA &  # Show Hidden EdgesDATAL&  GUI.showHiddenEdgesToggle = Draw.Toggle("Show Hidden Edges",DATA4H'  GUI.evtShowHiddenEdgesToggle,DATAH'  200, 160, 160, 18, GUI.showHiddenEdgesToggle.val,DATA< (  "Render hidden edges as dashed lines") DATA( DATA (  glRasterPos2i(10, 160)DATA0)  Draw.Text("Antonio Ospite (c) 2006")DATAh) REEDATA)  def event(evt, val): DATA) DATA4*  if evt == Draw.ESCKEY or evt == Draw.QKEY:DATAp*  Draw.Exit()DATA*  else:DATA*  returnDATA8+ yDATAh+  Draw.Redraw(1)DATA+  DATA+  def button_event(evt):DATA(, DATA(X,  if evt == GUI.evtExitButton:---DATA,  Draw.Exit()DATA, DATA,(-  elif evt == GUI.evtOutFormatMenu: DATA,-  i = GUI.outFormatMenu.val - 1 DATA@-  config.output['FORMAT']= outputWriters.keys()[i]REEDATAH.  DATA(x.  elif evt == GUI.evtAnimToggle:DATAD.  config.outpur['ANIMATION'] = bool(GUI.animToggle.val)DATA@/ DATA,p/  elif evt == GUI.evtJoinObjsToggle:EDATAL/  config.output['JOIN_OBJECTS'] = bool(GUI.joinObjsToggle.val)DATA@0  DATA,p0  elif evt == GUI.evtPolygonsToggle:DATAD0  config.polygons['SHOW'] = bool(GUI.polygonsToggle.val)DATA81 DATA0h1  elif evt == GUI.evtShadingStyleMenu:DATA01  i = GUI.shadingStyleMenu.val - 1DATAD(2  config.polygons['SHADING'] = shadingStyles.keys()[i]DATA2 3"DATA,2  elif evt == GUI.evtShowEdgesToggle:DATAD 3  config.edges['SHOW'] = bool(GUI.showEdgesToggle.val)rigDATA3 yDATA43  elif evt == GUI.evtShowHiddenEdgesToggle:DATAP 4  config.edges['SHOW_HIDDEN'] = bool(GUI.showHiddenEdgesToggle.val)DATA4 iceDATA,4  elif evt == GUI.evtEdgeStyleMenu:EEDATA,(5  i = GUI.edgeStyleMenu.val - 1DATA<5  config.edges['STYLE'] = edgeStyles.keys()[i]REEDATA5 he DATA,6  elif evt == GUI.evtEdgeWidthSlider:DATADp6  config.edges['WIDTH'] = float(GUI.edgeWidthSlider.val)DATA6 tiaDATA,7  elif evt == GUI.evtEdgeColorPicker:DATATh7  config.edges['COLOR'] = [int(c*255.0) for c in GUI.edgeColorPicker.val]DATA7  DATA,8  elif evt == GUI.evtRenderButton:REEDATA8p8  label = "Save %s" % config.output['FORMAT']DATA(8  # Show the File SelectorDATA 09  global outputfileDATAH9  Blender.Window.FileSelector(vectorize, label, outputfile)DATA9 w tDATA(:  else:DATA4h:  print "Event: %d not handled!" % evtendDATA: DATA:  if evt:DATA8;  Draw.Redraw(1)sDATA ;  #GUI.conf_debug()HiDATA; REEDATA<  def conf_debug():DATA$H<  from pprint import pprintDATA<  print "\nConfig"REEDATA <  pprint(config.output)EEDATA 0=  pprint(config.polygons)DATA =  pprint(config.edges)DATA= REEDATA >  _init = staticmethod(_init)DATA P>  draw = staticmethod(draw)EEDATA >  event = staticmethod(event)DATA0>  button_event = staticmethod(button_event)DATA,P?  conf_debug = staticmethod(conf_debug)ceDATA? onlDATA4? # A wrapper function for the vectorizing processeAdDATA8@ def vectorize(filename):DATA0@  """The vectorizing process is as follows:DATA@  DATA0A  - Instanciate the writer and the rendereruDATAxA  - Render!DATA A  """REEDATAA lllDATA B  if filename == "":DATA,hB  print "\nERROR: invalid file name!"DATAB  returnDATAC DATA 0C  from Blender import WindowtDATA$C  editmode = Window.EditMode()ranDATA$C  if editmode: Window.EditMode(0)DATA D DATA<PD  actualWriter = outputWriters[config.output['FORMAT']] DATA$D  writer = actualWriter(filename)DATAE  DATA@E  renderer = Renderer()--DATA@E  renderer.doRendering(writer, config.output['ANIMATION'])---DATAE lcuDATA((F  if editmode: Window.EditMode(1) ct DATAF DATAF DATAF # Here the mainDATA G if __name__ == "__main__":iDATAhG  DATAG  outputfile = ""DATA@G  basename = Blender.sys.basename(Blender.Get('filename'))DATAPH  if basename != "":DATAdH  outputfile = Blender.sys.splitext(basename)[0] + "." + str(config.output['FORMAT']).lower()DATA(I == DATA(XI  if Blender.mode == 'background':DATA I  vectorize(outputfile)DATA J  else: DATA@8J  Draw.Register(GUI.draw, GUI.event, GUI.button_event)OBN KQ OBCameraamera.001 xne@>N@???*?91<"P???ޕ/?5F:?81V~>75e?'?T3>ne@>N@??????8573I)?ar0LZ?2^ڜT??OBd8?)d??>)d?????OBQ KN OBLamp p@Rp@???{&?W+b=???6씾t? bfE9L"?%?_>oK?p@Rp@?????>M.8 ?Ʈ>89?ۘ?_Lc?bP??DOBd8? #=?>=?@???OBKU Q OBLamp.001 &fRӿ???{&?W+b=???6씾t? bfE9L"?%?_>oK?fRӿ?????>M.8 ?Ʈ>89?ژ?_Lc?Гfp fA?DOBd?? #=?>=?@???OBU KOBSurfDonut 8X ?????????????ޕ/?8F:?81W~>85e?'?T2>me@>M@?DOBd8? #=?>=??@???>DATA8X MAhX #MAMaterial????????????fff???B?AA ???????@?=?==????GLOBxcƿy8 DNA1To)A SDNANAME_*next*prev*first*lastxyzwxminxmaxyminymax*newid*libname[24]usflagicon_idid*idblock*filedataname[240]filename[240]totpadcurvecurblocktypeshowkeyposcurvaltypeadrcodetotelem*data*weightsname[32]vgroup[32]sliderminslidermax*refkeyelemstr[32]elemsizeblock*ipo*fromtotkeyslurph**scripts*flagactscripttotscript*line*formatlenblen*nameflagsnlineslines*curl*sellcurcselc*undo_bufundo_posundo_len*compiledsizeseekpassepartalphapad1clipstaclipendlensortho_scaledrawsizeYF_dofdistYF_apertureYF_bkhtypeYF_bkhbiasYF_bkhrotscriptlinkh*rectname[160]*anim*ibuf*mipmap[10]oklastframetpageflagtotbindxrepyreptwstatwendbindcode*repbind*packedfile*previewlastupdatelastusedanimspeedreserved1reserved2texcomaptomaptonegblendtype*object*texprojxprojyprojzmappingofs[3]size[3]texflagcolormodelrgbkdef_varcolfacnorfacvarfacdispfacwarpfac*handle*pname*stnamesstypesvars*varstr*result*cfradata[32](*doit)()(*callback)()versionaipotypedata[16]*ima*cube[6]imat[4][4]obimat[3][3]stypeviewscalenotlaycuberesdepthrecalclastsizenoisesizeturbulbrightcontrastrfacgfacbfacfiltersizemg_Hmg_lacunaritymg_octavesmg_offsetmg_gaindist_amountns_outscalevn_w1vn_w2vn_w3vn_w4vn_mexpvn_distmvn_coltypenoisedepthnoisetypenoisebasisnoisebasis2imaflagcropxmincropymincropxmaxcropymaxxrepeatyrepeatextendfie_imacheckerdistnablaframesoffsetsfra*plugin*coba*envfradur[4][2]loc[3]rot[3]mat[4][4]min[3]max[3]*obmodetotexenergydistspotsizespotblendhaintatt1att2shadspotsizebiassoftbufsizesampbuffersfiltertyperay_sampray_sampyray_sampzray_samp_typearea_shapearea_sizearea_sizeyarea_sizeztexactshadhalostepYF_numphotonsYF_numsearchYF_phdepthYF_useqmcYF_bufsizeYF_padYF_causticblurYF_ltradiusYF_glowintYF_glowofsYF_glowtypeYF_pad2*mtex[10]specrspecgspecbmirrmirgmirbambrambbambgambemitangspectraray_mirroralpharefspeczoffsaddtranslucencyfresnel_mirfresnel_mir_ifresnel_trafresnel_tra_ifiltertx_limittx_falloffray_depthray_depth_traharseed1seed2mode_lflarecstarclinecringchasizeflaresizesubsizeflarebooststrand_stastrand_endstrand_easesbiasrgbselpr_typeuse_nodespr_backpr_lampseptexml_flagdiff_shaderspec_shaderroughnessrefracparam[4]rmsdarkness*ramp_col*ramp_specrampin_colrampin_specrampblend_colrampblend_specramp_showpad3rampfac_colrampfac_spec*nodetree*groupfrictionfhreflectfhdistxyfrictdynamodepad2YF_arYF_agYF_abYF_dscaleYF_dpwrYF_dsmpYF_presetYF_djitname[256]scale*bbi1j1k1i2j2k2selcol1selcol2quat[4]expxexpyexpzradrad2s*mat*imatelemsdisp**mattotcolwiresizerendersizethreshvec[3][3]alfaweighth1h2f1f2f3hidevec[4]mat_nrpntsupntsvresoluresolvorderuordervflaguflagv*knotsu*knotsv*bp*beztcharidxkernnurb*bevobj*taperobj*textoncurve*path*keybevpathlenbevresolwidthext1ext2resolu_renresolv_renspacemodespacinglinedistshearfsizewordspaceulposulheightxofyoflinewidth*strfamily[24]*vfont*vfontb*vfonti*vfontbisepchartotboxactbox*tbselstartselend*strinfocurinfoname[128]maxrcttotrctvartypetotvertipoextraprtbitmask*driver*tpageuv[4][2]col[4]transptileunwrapeffect*mface*tface*dface*mvert*medge*dvert*mcol*msticky*texcomesh*mselect*oc*sumohandletotedgetotfacetotselectcubemapsizesmoothreshsubdivsubdivrsubsurftypev1v2v3v4edcodecreasedef_nr*dwtotweightco[3]no[3]co[2]index*errormodifiersubdivTypelevelsrenderLevels*emCache*mCachestartlengthrandomizeseed*curve_ob*offset_oboffset[3]scale[3]merge_distfit_typeoffset_typecountaxistolerancepercentfaceCountstartxstartyheightnarrowspeeddamptimeoffslifetimedeformflagparentinv[4][4]cent[3]falloff*indexartotindexforceoperationpntswopntsuopntsvopntswtypeutypevtypewfufvfwdudvdw*defvec[8][3]dvec[3]max**obpartypepar1par2par3parsubstr[32]*pardata*parent*track*action*poseconstraintChannelsnetworkdefbasemodifiersdloc[3]orig[3]dsize[3]drot[3]dquat[4]obmat[4][4]laycolbitstransflagipoflagtrackflagupflagnlaflagprotectflagipowinscaflagscavisflagboundtypedupondupoffdupstadupendsfctimemassdampinginertiaformfactorsofttimerdampingsizefacdtdtxactcolempty_drawtypepad1[3]empty_drawsizepropsensorscontrollersactuatorsbbsize[3]dfrasactdefgameflaggameflag2softflaganisotropicFriction[3]constraintsnlastripshooks*pd*soft*dup_groupfluidsimFlagshapenrshapeflagpad4*fluidsimSettings*derivedDeform*derivedFinalcurindexactivedeflectforcefieldpdef_damppdef_rdamppdef_permf_strengthf_powermaxdistpdef_sbdamppdef_sbiftpdef_sbofttotpointtotspring*bpoint*bspringnodemassgravmediafrictrklimitphysics_speedgoalspringgoalfrictmingoalmaxgoaldefgoalvertgroupinspringinfrictefraintervallocal**keystotpointkeyshow_advancedoptionsresolutionxyzpreviewresxyzrealsizeguiDisplayModerenderDisplayModeviscosityValueviscosityModeviscosityExponentgravxgravygravzanimStartanimEndgstarmaxRefineiniVelxiniVelyiniVelz*orgMesh*meshSurface*meshBBsurfdataPath[240]bbStart[3]bbSize[3]typeFlagsdomainNovecgenvolumeInitTypepartSlipValuegenerateTracersgenerateParticlessurfaceSmoothingparticleInfSizeparticleInfAlphafarFieldSize*meshSurfNormalsmistypehorrhorghorbhorkzenrzengzenbzenkambkfastcolexposureexprangelinfaclogfacgravityactivityBoxRadiusskytypephysicsEnginemisimiststamistdistmisthistarrstargstarbstarkstarsizestarmindiststardiststarcolnoisedofstadofenddofmindofmaxaodistaodistfacaoenergyaobiasaomodeaosampaomixaocolor*aospherehemiresmaxiterdrawtypesubshootpsubshootenodelimmaxsublamppamapamielmaelmimaxnodeconvergenceradfacgammaselcolsxsy*lpFormat*lpParmscbFormatcbParmsfccTypefccHandlerdwKeyFrameEverydwQualitydwBytesPerSeconddwFlagsdwInterleaveEveryavicodecname[128]*cdParms*padcdSizeqtcodecname[128]codecaudio_codecvideo_bitrateaudio_bitrategop_sizerc_min_raterc_max_raterc_buffer_sizemux_packet_sizemux_ratemixratemainpad[3]*scenelayflagpassflag*avicodecdata*qtcodecdataffcodecdatacfraimagesframaptoframelenblurfacedgeRedgeGedgeBfullscreenxplayyplayfreqplayattribrt1rt2stereomodedimensionspresetmaximsizexschyschxaspyaspxpartsypartswinposplanesimtypesubimtypebufflagqualityscemoderendererocresrpad[2]alphamodedogammaosafrs_secedgeintsame_mat_reduxsafetyborderdisprectlayersactlaygausspostmulpostgammapostaddpostigammaposthuepostsatdither_intensityzminfocuszgammazsigmazblurGIqualityGIcacheGImethodGIphotonsGIdirectYF_AAYFexportxmlYF_nobumpYF_clamprgbyfpad1GIdepthGIcausdepthGIpixelspersampleGIphotoncountGImixphotonsGIphotonradiusYF_numprocsYF_raydepthYF_AApassesYF_AAsamplesGIshadowqualityGIrefinementGIpowerGIindirpowerYF_gammaYF_exposureYF_raybiasYF_AApixelsizeYF_AAthresholdbackbuf[160]pic[160]ftype[160]col[3]framename[64]cornertypeeditbutflagdegrstepturnextr_offsdoublimitsegmentsringsverticesunwrapperuvcalc_radiusuvcalc_cubesizeuvcalc_mapdiruvcalc_mapalignuvcalc_flagselect_thresh*camera*world*setbase*basactcursor[3]twcent[3]twmin[3]twmax[3]editbutsizeselectmodeproportionalprop_mode*ed*radioframing*toolsettingsaudiomarkersjumpframe*theDagdagisvaliddagflagszoomblendximyimspacetypeblockscale*areablockhandler[8]viewmat[4][4]viewinv[4][4]persmat[4][4]persinv[4][4]winmat1[4][4]viewmat1[4][4]viewquat[4]zfacpad0perspview*bgpic*localvd*rilocalviewlayactscenelockaroundcamzoomgridgridviewpixsizenearfarcamdxcamdygridlinesviewbutgridflagmodeselectmenunrtexnrtwtypetwmodetwflagtwdrawflagtwmat[4][4]clip[4][4]*clipbbafterdrawzbufxrayflag2pad2[3]verthormaskmin[2]max[2]minzoommaxzoomscrollkeeptotkeepaspectkeepzoomoldwinxoldwinyrowbutv2d*editipoipokeyactname[32]constname[32]totipopinbutofschannellockmedian[3]cursenscuractaligntabomainbmainbo*lockpointexfromshowgroupmodeltypescriptblockre_alignoldkeypresstab[7]chanshown*filelisttotfiletitle[24]dir[160]file[80]ofssortmaxnamelencollums*libfiledataretvalmenuact(*returnfunc)()*menupoopsvisiflagtree*treestoreoutlinevisstoreflagdeps_flags*image*cumapimanrcurtilecentxcenty*info_str*texttopviewlinesfont_idlheightleftshowlinenrstabnumbercurrtab_setshowsyntaxunused_paddpix_per_linetxtscrolltxtbar*scriptredraws*idaspect*curfont*edittreetreetypetitle[28]fasesubfasemouse_move_redrawimafasemxmydirslidirsli_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*arg1outline[4]neutral[4]action[4]setting[4]setting1[4]setting2[4]num[4]textfield[4]textfield_hi[4]popup[4]text[4]text_hi[4]menu_back[4]menu_item[4]menu_hilite[4]menu_text[4]menu_text_hi[4]but_drawtypeback[4]header[4]panel[4]shade1[4]shade2[4]hilite[4]grid[4]wire[4]select[4]lamp[4]active[4]group[4]group_active[4]transform[4]vertex[4]vertex_select[4]edge[4]edge_select[4]edge_seam[4]edge_facesel[4]face[4]face_select[4]face_dot[4]normal[4]bone_solid[4]bone_pose[4]strip[4]strip_select[4]vertex_sizefacedot_sizebpad[2]syntaxl[4]syntaxn[4]syntaxb[4]syntaxv[4]syntaxc[4]movie[4]image[4]scene[4]audio[4]effect[4]plugin[4]transition[4]meta[4]tuitbutstv3dtfiletipotinfotsndtacttnlatseqtimatimaseltexttoopsttimetnodebpad[4]bpad1[4]spec[4]dupflagsavetimetempdir[160]fontdir[160]renderdir[160]textudir[160]plugtexdir[160]plugseqdir[160]pythondir[160]sounddir[160]yfexportdir[160]versionsvrmlflaggameflagswheellinescrolluiflaglanguageuserprefviewzoomconsole_bufferconsole_outmixbufsizefontsizeencodingtransoptsmenuthreshold1menuthreshold2fontname[256]themesundostepscurssizetb_leftmousetb_rightmouselight[3]tw_hotspottw_flagtw_handlesizetw_sizetextimeouttexcollectratememcachelimitframeserverportobcenter_diarvisizervibrightvertbaseedgebaseareabaseendxendysizexsizeyscenenrscreennrfullmainwinwinakthandler[8]*newvvec*v1*v2panelname[64]tabname[64]ofsxofsycontrolsnapold_ofsxold_ofsysortcounter*paneltab*v3*v4*fullwinmat[4][4]headrctwinrctheadwinwinheadertypebutspacetypewinxwinyhead_swaphead_equalwin_swapwin_equalheadbutlenheadbutofscursorspacedatauiblockspanels*curscreen*curscenedisplaymodefileflagsglobalfname[80]*se1*se2*se3isneedednrdone*stripdataorxory*instance_private_data**current_private_data*newseqstartofsendofsstartstillendstillmachinestartdispenddispmulhandsize*strip*curelemfacf0facf1*seq1*seq2*seq3seqbase*sound*hdaudiolevelpancurposstrobe*effectdataanim_preseek*oldbasep*parseq*seqbasepmetastackedgeWidthangleforwardwipetypefMinifClampfBoostdDistdQualitybNoCompbuttypeuserjitstaendtotpartnormfacobfacrandfactexfacrandlifeforce[3]vectsizedefvec[3]mult[4]life[4]child[4]mat[4]texmapcurmultstaticstepomattimetexspeedtexflag2negvertgroup_vvgroupname[32]vgroupname_v[32]*keysminfacusedusedelemdxdylinkotypedataold*poin*oldpoinresetdistlastval*makeyqualqual2targetName[32]toggleName[32]value[32]maxvalue[32]materialName[32]damptimerdelaypropname[32]matname[32]axisflag*fromObjectsubject[32]body[32]pulsefreqtotlinks**linksinvertfreq2axisfbuttonbuttonfhathatfprecisionstr[128]*mynewinputstotslinks**slinksvalvalopad5time*actblendinprioritystrideaxisstridelengthsndnrpad1[2]makecopycopymadepad2[1]trackvolume*melinVelocity[3]localflagforceloc[3]forcerot[3]linearvelocity[3]angularvelocity[3]addedlinearvelocity[3]anotherpad[4]butstabutendminfacvisifacslowminloc[3]maxloc[3]minrot[3]maxrot[3]distributionint_arg_1int_arg_2float_arg_1float_arg_2toPropName[32]*toObjectbodyTypefilename[64]loadaniname[64]goaccellerationmaxspeedmaxrotspeedmaxtiltspeedrotdamptiltdampspeeddamp*sample*stream*newpackedfile*snd_soundpanningattenuationpitchmin_gainmax_gaindistancestreamlenloopstartloopendchannelshighpriopad[10]gaindopplerfactordopplervelocitynumsoundsblendernumsoundsgameengine*lamprengobjectchildbaserollhead[3]tail[3]bone_mat[3][3]arm_head[3]arm_tail[3]arm_mat[4][4]xwidthzwidthease1ease2rad_headrad_taillayerbonebasechainbaseghostepghostsizeconstflagikflag*bone*childiktree*b_bone_matschan_mat[4][4]pose_mat[4][4]pose_head[3]pose_tail[3]limitmin[3]limitmax[3]stiffness[3]ikstretch*customchanbasestride_offset[3]actnrtimeslidename[30]enforce*tariterationsrootbonesubtarget[32]orientweightgrabtarget[3]minmaxflagstickystuckcache[3]lockflagfollowflagzmaxvolmodeplaneorglengthbulgestride_axisactstartactendactoffspadfstridelenrepeatblendoutstridechannel[32]hasinputhasoutputdatatypenslimitstack_indexinternstack_index_extlocxlocyown_indexto_index*tosock*link*newlastyoutputs*storageminiwidthcustom1custom2need_execexectotrbutrprvr*typeinfo*fromnode*tonode*fromsocknodeslinks*stack*stack1initstacksizecur_index**alltypes*owntype(*timecursor)()(*stats_draw)()(*test_break)()cyclicmoviesamplesminspeedbokehhuesatshortymintablemaxtable*curve*table*premultablecurrcliprcm[4]black[3]white[3]bwmul[3]TYPEcharucharshortushortintlongulongfloatdoublevoidLinkListBasevec2svec2ivec2fvec2dvec3ivec3fvec3dvec4ivec4fvec4drctirctfIDLibraryFileDataIpoKeyBlockKeyScriptLinkTextLineTextPackedFileCameraPreviewImageImageanimImBufMTexObjectTexPluginTexCBDataColorBandEnvMapTexMappingLampWaveMaterialbNodeTreeGroupVFontVFontDataMetaElemBoundBoxMetaBallBezTripleBPointNurbCharInfoTextBoxCurvePathIpoDriverIpoCurveTFaceMeshMFaceMVertMEdgeMDeformVertMColMStickyMSelectOcInfoMDeformWeightModifierDataSubsurfModifierDataLatticeModifierDataCurveModifierDataBuildModifierDataArrayModifierDataMirrorModifierDataDecimateModifierDataWaveModifierDataArmatureModifierDataHookModifierDataSoftbodyModifierDataBooleanModifierDataLatticebDeformGroupLBufbActionbPosePartDeflectSoftBodyFluidsimSettingsDerivedMeshObHookSBVertexBodyPointBodySpringWorldRadioBaseAviCodecDataQuicktimeCodecDataFFMpegCodecDataAudioDataSceneRenderLayerSceneRenderDataGameFramingTimeMarkerToolSettingsDagForestBGpicView3DSpaceLinkScrAreaRenderInfoView2DSpaceInfoSpaceIpoSpaceButsSpaceSeqSpaceFiledirentryBlendHandleSpaceOopsTreeStoreSpaceImageCurveMappingSpaceNlaSpaceTextSpaceScriptScriptSpaceTimeSpaceNodeSpaceImaSelImaDirOneSelectableImaThemeUIThemeSpacebThemeSolidLightUserDefbScreenScrVertScrEdgePanelFileGlobalStripElemStripPluginSeqSequencebSoundhdaudioMetaStackEditingWipeVarsGlowVarsEffectBuildEffPartEffParticleWaveEffTreeStoreElemOopsbPropertybNearSensorbMouseSensorbTouchSensorbKeyboardSensorbPropertySensorbCollisionSensorbRadarSensorbRandomSensorbRaySensorbMessageSensorbSensorbControllerbJoystickSensorbExpressionContbPythonContbActuatorbAddObjectActuatorbActionActuatorbSoundActuatorbCDActuatorbEditObjectActuatorbSceneActuatorbPropertyActuatorbObjectActuatorbIpoActuatorbCameraActuatorbConstraintActuatorbGroupActuatorbRandomActuatorbMessageActuatorbGameActuatorbVisibilityActuatorFreeCamerabSamplebSoundListenerSpaceSoundGroupObjectBonebArmaturebPoseChannelbActionChannelSpaceActionbConstraintChannelbConstraintbKinematicConstraintbTrackToConstraintbRotateLikeConstraintbLocateLikeConstraintbMinMaxConstraintbSizeLikeConstraintbActionConstraintbLockTrackConstraintbFollowPathConstraintbDistanceLimitConstraintbRotationConstraintbStretchToConstraintbActionStripbNodeStackbNodeSocketbNodeLinkbNodebNodePreviewbNodeTypeNodeImageAnimNodeBlurDataNodeHueSatCurveMapPointCurveMapTLEN  0 Phtdt 4XP4l8@l`884T< 4DXXDl<<\@4@l( 8,d| (04\pP0($x$(T x H 8th  08 ,@0,HhH,(lDLP@< <@Lx48<8l(@PH<,4L,,,<,@,<4d$t STRC                   ! "#$%&' ()* +,-./01234567 89: ;<=>?@AB C!DE9 ""FGHIJKLMNOPQ,R#ST$U%V&W&XYZ[\]^_`ab!c#defghi'jklm(n)opqrstuvwxyz{|}~*U   +xyz,+-(n$$HIYZ)46~,$*,-.u(/3wxyz{HI',R0,1cwxyz      !"#$%&'()*+,-./jk,0,123456789'2:,3;<=>?@ABCDEFGHIJR4KL5"!c6667MNOPQRSTUVWXYZ[\6]^87M _ `,1abvucde9 fghijklmn:oghkn;;;pnqrstuvwxyz:{9|}<~pB=S>97M  `(((,?1a uvbstB6;4444=<<@( AAA:{9|   @B C#7M ,1aDB EFGHICJK BvubDpFLhGLEpHxyzIJMMM$NM9  OM(n$PM(n$QMR M((9SMTMU MVMGB(nW M(n$XMYM(nZqrB   : ,[[[$7 Ku\((b ((,?7M]^ "    `  1a u!"V#$%&'()*+,-./0123456789:;<=>?b@ABCR D E F G HIJKLMN O P Q_R`S3TU7VWXaYbZb[ccc($\]_ ^_`abcdefghdo`ijekfl6mnopqrstuvwGxyz{|Bd}~.a&CCC,Eg8w,'Rhiii%(nj  k  Bl 9mnnn$o%pjjklz7G6     D !"#$%&'()*+,-./ 01B23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^q_GB7rrr`asbcdefGghijklmnopqBro$(sgtou$ viwxyz{%|}~$2: h qspxmR GB7tXu $&W)oDTv<wwx(suvy%GJtx7 zwwwx{wwx|wwxBz  ,-}wwxyz .~wwxzBwwx wwxz   wwxz$GB wwxzwwx 9      wwxB9wwxzwwxz- 2:2Qwwx !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^B&_  `abcdefghijklmnopqrB.skltuvwxyz{|}~$o0 G   o .]xxx    R      &WY 6 K     )! 6"#$%&'()*+,,o%V-./01 2345678 9: ;< = 2 >?@ABCDEFGHII6+IwJKLM.NOPQRSTUVWXYZ[\]^_``abcd3;Ief!g" >nhi j $klm n o$pqGB$1rstuvw$xy$z{B$@$|$}~G(kGB$ "( $ kB7$ "( ]KL$ KL3KL (C$o(s$x( " KL$G( KL$3;}(GBKL k$ "( 7U !c! ,9wwxz3B( 3  $hui    O$G,B  uV(^ , $h] wwxz], "h (   h  B(hi (h (h ( (h  (|L] () ()*( GB   :( ,](nL !o ""#$$%&'()G*+,-./0$51'  2 3*+456789:;d<=>?.2 @ ABCDEFGH I JKLM NOGPBQRSiTUVWX YZ[\]^ENDB