gH]kDwPtrueSpace7.5[VS_O93Ydoom3Export0L*I Clinton Reese, RUR`d8pM*#ͺOLLPNG  IHDR`s IDATx۳&qbp%WZAR\6IRM^_b)~r(a[%)-s2Uof1Hg2K+ů6@@Ӧ!Ȥ̔@ku3.My{+ "k(1mn"jD/3d@U& @)!Q f^H85q3K"ڪ>x13 6S K Iܬk2Mꪭ*b.!!b2 ^5P",%j Dq!#>\ {[WwpLHHDDڪjY4y><|wׇ{YY}NDR⭭53m9 njx~b x H|dbYEc\SutfNq "vkI=ݬ_cc SRbLǻw'8!xb7s!?ȩz91sy[{av>_kB01Q@&Dqrݝ%ݏf6wfVX !F"erkEcܽ_4[^;!3!Yj|gmZׇ RjĘB~<Ƕr!̽?Uke|1B[75v-j\ @@b;>3ߊ0^C͌c`,{6w\A)cWq3>`ϭlEMkYl,ED&@4VW/4RjF)hn4zD 2Y ;DfHjJRJ.,TjcYBXM"rLu|Vp7b~M"BBfL DDbD43kiu3@$b9eH[ku{p7UmT<&Wc;6kMUݭ[~&f)nDŎD 0ikk AI̥r9ֵ<ARx.qMC"&af ^[u A|c?j9Ls(.=Y(Ck A#11!;h-*67QMզxVtntWgjk-[]}nEJVWzا,O:l4yXPmr7w2C)aF㓧4KHFC9w$H4TG pEҀi|H"a<Jınq!1bPfyw$'ojfu}e vַ۟4m-Diy7u3QKLG\%G)UjFD)]g[kkDRܯG\uX ԉh^euK1evㅡ.NBĎ>HpV \I@b@̈YmK l+h :HD nP!.Ss1ņ}(P;Y PLэ ;R\tYB!!'Z[`9C[^VYhX`!rr3mm@a"RrV0\&)VHHCv- ukH"9dBKu 0a,Q$>jC$)̌985mjfb)$DLVW3ñO; yvm!&"@w DgLasÿVc;H .fH1EvY',0|2Nl6][%rkM[uleiZV+2!V[F!<ܛ t!!! SmýP1DH,{r-: !tTuq _#.K_o^~B.RtfM}t6.ok05p׼k H"u9 Sn4,i 4PnIS SMpiNӽ>4}ݥn  RAj;nx({RbjΰSȸԧn|\m\ J ]l-ݤi:?o=V;}ڠkA,eڹa; >S,\Aͯ `R pm*_`J%0-؎!D6anN 6 97s^)6B]԰-=0i}vr{\`vQtwuAN:n_6}{n;&ƣcvwf!bT (;jӺn."bةn{&Rwc 6|6Bp!yש:rh)b0|݌c"f{l}vYF%rIKf^1I|B;RAO51k3M.(a MJ9tA^iY|_h>V)Ow1ܰ㈔C 3gBtwUu@ Ѫn X|@İخJH<୮GUf@Oӝ2N+`n(<ѝu1S#d1wb!1t aF8tvTt,TSt ~|LJOjl%AClo 2MM͚7ϗڼO4XwϻIW$U[}(BMׯ̴rPtFLtSevsÎD(p.`2V jsi'܁D({q,qc%ܿf!"Tmî@[Fsvm]"p{t3~,R>ֆo4& gCB7>`xBI#"8v ¶Sz6(dNDH8llRSDb<ϯ>\hWELĒ>#eT DhG<$ L1H:T^C#Q'k-V;lvteW1L Ki`ck+ܻH4Ms(9t8G(t&^]J)z#c I|=f5M{d iDx b&u9$gޯiۮ$$)A03ttkMm1S]#eIx{F%ܭժitE@0n8Jbikn t&$xzu]1L(>6~%L VwA@iB-@xXD*9V=63mI/>/FwkuGl)wbܴm@y8 [ws1@E0wg%w{)Pu3>XL{:$,Lb/q0bfnm .E9^[a7PR|xI,ڎ˨ Z@czIn `ZCNǚ 2IAUYVLȞϑJjR22\ེ2SbǞ3՞h dLf^cW VHWzci }/uSeK B#ZwθL" 8avGA$ë%@~}`,)]id [[cI遠e _fpWX TØJ15bHM VDLRAAx@ww@`"DHcBN/uY2Cs4wU$`LPAHY|񘿨jf*Ywuc\r@ױ~z=յk` BfZ۫-Y 4u]C1TmhyhkqD\4bڪڵxN9ou"RtBkպ ;ު{ZzkMw92%u]v&MGrB$SxښvK ߻n&$BԾц)NL,=m7V 3G$ 4CwUa!4?wHwF(R c[,rމ1G c#1)"EM(CIFf$bXqtUMK`gA9$JF3o!9-($`@;}C0? iHDž들 =pi~˻`e::tq}|i"⸠t?Bg.S?<)eQHzzɣe `FO {P`eprṃC=s)<TAG4F,2ٻr=\J[Shd zVT'")}A!Sgt9y,&Ff ҇ gc5d] ,I]Sm=vvMc$F2;?^d`ܽadX@>4 O.5DD2ط6,QznRtwf&3ƴ5aӂ>`6ܜN{Ci,?'Ḍb 꺄I$jnt39;SnZ9`0UvM]KGRAw7I_h{Ne!aث2mFItUH)4}{k?IIJnZnGק}g2P`7+7k>ܵ`tQ(p1w#Q)H|C; !9oDww2Et^`Sq3SRf[T. e"Ce/yccQ)E75DDx70R&Ļ-R8҆-Ă}D35=MD6&JŖUk@-!-;`J4 R1fDADJ5K_$r Nn٧fgdn3㿆ſxKK؀Iv;SH[r┥ő2F7Lnٿl!apbKٝM:i HCo'Lw$(>XmuyƆ4x7(r%1df/0Kk计1k r@O8tk*neo'1L10󩇥~WM!d}$q7kG`D ]\ -k<5fGGihA.}OV0-l%9saTm9 t2Crum#O,RXh.qo{P/3% j뢦B]+_u z/P[SpKv*)p8mؗH  ' LGPA}cL YcEa~>{a*~jG/?u yDž/5:؞8`KҶ MkYq\RO{M" Gg}޶z0޽- 0 $<{1xL }sM ,KהHJն.ሌ/z*tm]<(r/~r*efnpϴi`< T}~/} L)nO_=?~WnH#S !B:'79-y0̉X I"MCs#e=~qK۞iq@3eyvs?1(' "v4]92BrdjL$?Z8@JVYwe*eͬgV0 ?;|/{γC(%=?_~? P[p썄y Ż0˨cf \Xn^E3.7NI]n2"EpAc:M=*r:~qܽ}.\8榝=P~ Dǹ`:d!@!)=B{ÄԽ0݋托: !wGpu|* 23-MW?G~1X]ؙl1ӘZuqD1r c3k @sn]3Hebd.f'|gG@m`?#d="El]o|!nr]QD1lbnNp&d_=?^hhӱ8aBaΉW!jAN\b3m!K7BDIz/ۙP޵q[rY(IDd`e16cV[.Kd 6F6 lw#dZ ܹVm^h] @E1po[:K]RT[]ba 6h IDATP!u]uWxYf!e/'¾ǵ3"%_ iҺfk8aL!Cmn 5ZER@E̼;sg=AGJv PU5E><2Hd9x9e:!R`VkPx_#QnHE M;c>2meNN2`RKDr7u3!Ӏ½ *l}HVjfadBI.Imɐ=`]bM%DŽݯ%7<|DGfYC;C]6& r VE|dVb)O1yF `*EZ Hf" " BueT0TuKDWRF[Dӛ([ DrP8B)e:@8}T"e>-lq_sDRRܭ-kXw҃;5;JLLhĒmAUϳו4E0C`>T6zZ2n5k:BOH@̨6 5G3ј#paf>|R"E58#ΜBj!d$F4 B;oOʼnH겺g.3vީ8K*%L*;3:(CvwX^rcDTƦK;Sk@ miFgNT=eD4g8ϳV]ڪ)b73eumK- b_ۣt׼eUEPvkjR2M`31fvnq6(=}!.Ek̊nrAH"=K\|@GLELpx""5zE&uL,f@Z5epe;8DE7 6}~{z=,D<5ƞ!hR&9ܙ5vEl/#Ȍ\Dʔ%O*SkieT1=,8`iuncQ]S#p<Ȏ?Caw޳PU-R[0y*!4e>B"2Mϟ?zk==g8)̲,ϣqz#NbRx_|&މ 1Dzһ? k4>.ݎ2?z =Upv>e3$,mq@jR&kJLomHa)!s2maxihM|epl֖%zlDpTUBiFv0PbTșIdf{F: UUX)Cmnq)֏y|[?>NrhZuU.Sؐ{|qDeWH]?qN5Qp7ȅ{;`t1A-_aFڠ9D!!(Gv U Kэ"EVI6Qf.f(yf[^͔p]Զ HjJcg#y `U](ri659Go."0ak_4ЏR&eD5Ֆd] kG o-f;Le=v#zv vE\+#(UY#Ӱ. W Kw?V|@  Ad?R ͜zy`n52jUBsqR EJX֢ Cƿ<g `]>ݎ.Zo<~8wZ56F؅7yѷMQoټQ$(sNv|n@J "\HBu]Q']͔txYki - H -LvN۠r:"A~4j_3<#d`C(sSk09  s/]r)GEo2$GUO7;\+y4Ȼ!2D~Z8jˋgI;[*8)LSb޻%>K_(>g*f()=7ut[=pfPsSܡ9FfA&1X9N &a]n )<(<"Ɨ.#;.ͪG\ZͅѴ]z#/տF EE3*Vh+L|LQVU8h/$\s׶AkF6"puLP_92Mn^#bG '|VR&V: ,8mX:wqq{Ϙuy ^(5LQ^ 4d8qmOjе,L"h/[c&a~}?$jjk97WbK,$Rk]u3yu]2ĢZӺi>.3neS-k U9Ujx_].5u7)]rv*C4nS D1OϪNbTYvJԦ~}A:*El}JS-"ǯ4."R`f^D wIqhȨѸu3@OUmDHL"@N27~:Dw2J2M,%~ 9B)@T9mIZ~ahۡ)q173cs΢$3Μ=irDD (!* R&)Pvۇ\ ^q_;< {֏?|?/ 3`#D胟_|:ik$eSw܇5鑙g_@2"֖!'8DӄD5v[CrF~9@]Su˓'|(ʈ,E[ksZ&PUR#]p!ܓ )%ZHZ#13baa]>2O^~˃38߾/_ymȈ4Yk//WeRw:;&6FѻǥOY`pP㱒,6"\[×Z_|_OOp?h˯|ZwFį_?kp`awG՝NL3!u9wHK!p}/W8҂9wZ]T:-C{lPwGRχ۽|Q;H"\ac^mpfpyW@! _~ḢrݸF| ][m;}J"e]H7qC}g<~O~g~8wӟg?wy0t|05$*24𳧇0;{t!7޷Иq),EG)` o3R8W+nxd`4ݴQ2f˖C\".GHGrIǷj4Zֱ88!⹕߽go7tn_#FN,obj˽#3lC{[Wi.><}bZhUleuHF8cwFqThnj|Z"z|/eK CpEDDF#+7ǮℹZՈK/Ս^/f%jAS12b{{˯G_ß飅?E/v_i[bVQ]׺< a{52@[W"${گ{rFStoN U H"QC$NѐX7NOG@ṫb4m5y:>4E0HJ4vmm!ǝg@vyn}8pR%"xnPN ?zJF,˿{_m]G \xj$Z#A0qG/ 5:w E[_y"#ԩoo|_?|U肀B`:Mz7_lo e^jyr}(bj. Wp}\\~%|5hzG*>¶FĩmJ6xo|wۺ$x#=(fQI9w@bSӛ-Ҹ΅'O\>'齔epꝻI׫_}؛C]70}MD#BuY[F맓$ϳcιm դl_0jFicLk EmI1ˀkoJ>7>6LIU[k]t==y>n>5ޢȯeHa)vѺJޔ;p#_I~l45#ǝĿ',mY̌U7[BU]8)qBZߛ]Ӑp:-wUXו1+9x4&l/Dyo c]2|pGɾhy.fB]h vYdE!q޶of o腗,,d?I=ۦ'CUd(эBlWfoh1o֏`§yd8` t ^i1Y "ECkF/%Д2kZK.M |<1KVr퇫AuIe|ݕQ!va c69^YJ${D}]RYʭr|avKyr ivӶ O+@F.ۍ{#K-H t';0DAbPu]̵ ‰&8f/;-$ke-uWq+{2`_ѭ3np7D֭eM1K.\t8 ݾޑyـѽti_3޸.dS!D `N. 9D%woCYT7Ow Vʮ 3<%!1+y53ybLDtuQb6)oyE^zAyԽoG;cW~=s<λ8 { 5gѶުUS"?AbBvNJk M. L1! op밈n{9Vkfkm$|Hk BIY)< 逾9: J  GE8m73hX@)ՇەF~L4ߵe2Pk o28%No:lϬ9L,oIw$`Uu=eft9yև{Ӷ;6o^+eSl#Q<}X_m(w|ii[W!)ÎC5D܊ޚ?D[>8cGL3ϥޒ Go?@,u]6}x v.\@NxS=߆-ޏܛ@m]!7d(PD"KxachȾ}.ev˙2gZ]ݡ[p1MQZk.O5x(rQ 'H7cvSUH~li< Lʄz[/=]xy\W^$fUz kIDAT鮵J s*]{#GEa[5vlѴS>\'*?ڔ|`2.&ZN]^858TH)fr}\םM5\=f y#tA2D]d0G4QWAL[#]9 g8žu(Z8NNSm9ZVȻyfPKv:9"<2]x6J>ݴC"G,HU{cN7~vvpb/^z=èoԻ׆uV-L&J?:,{3pnp0lUI9v36y,<"ETo0׮$Zp;=CD+O"`t | {s'?Cv#M (8;Q ?:18c/S9@lm or0J6t-+?"\{ o@;w/Usp3ѻr]zt9ȏL [{Y;vd] @xzGܵ)!">1[ L$U"K\yz#mumc9#v;GA}6GQv-9ݡa7l=F)hP`d<d W "F HW.v-܃-U "ݘ @؄[QqBIn4xQ7zu)osγu]yWoAqJqNr 2,bo}|zXZ%n"{Jܬ!=yTJLΝU;f TwնHT{=/^d6y .u]x>E.GMb`H>R$iuYKw?;<'xɋx黶co)Z[A*ON%}|& ãZpl?qYOM;f9\ǾU V2~x|HD.. |~~77k}lcoc4wZϸ v` `r}r !"O[\閔YJ|z'!{n4D?wZ?;~k_%B hʂXp8I*D@)^`-=|L_|+_}@eS?=?xqGD][oE3xMǭ%-Q" ~bhPypyiSѦ"iloחxw.<ڢ4<ۧݝ9}1o/xNcGeg(/\ZL)ǯbeQ]`5„kWVbrY&8JͯOHXo6R@fyFJqYõ4I! nj %W* V*.Vl:8='YL>!ߪ]?׬T.kE;X`80 HѺxUa$_0i_gBO_ϨB<ss/?)k!ˢ(ZR.g'JNjn*pt ceZU@䑧rceZU@䑧r$_scriptData*Internal Script data [җJs@ %@ 4W}@O{4W}@O{$ Owner4Owner of the Encapsulator$Ыk y(XFҦV(XFҦV"LE2Data$LE2 Data for node >g'JNjn*pLE2Data, 1#yJ@#QLJ@#QLLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 3yMT^RwL~YYTMT^RwL~YYTޢLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 2@y GFI_|k GFI_|kDMyFileNameDm 2|=Bynj2|=Bynj Control OutTransitionOutym z@Hoz@Ho Control InTransitionIn 2|=Bynj2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ >MNewCommandPL// Doom3 md5mesh export // april 15 2006 save transformed vertices // IT WORKS! TODO: test import to doom3 // reactivate mtr texture file // need way to "save file" dialog // // april 14 2006 try build so can have fewer uv's than vertices and will also do multiple uv per vertices // // march 25 2006 almost works - strange file problem and mesh not right indicated by import // test is square object made of 2 triangles // runs w/crash and seems to read uv info ok // // feb 5 2006 // clinton reese // // md5mesh FILE FORMAT // // MD5 header // numJoints // numMeshes // joint - list of joints // name // parent index - -1 means no parent // xyz position - absolute position // quaternion xyz - get w by calcualtion // mesh // header? // numverts // vert // index // u,v // start index for weight // number of weights // numtris // tri // index // vert index ijk - triangle definition by vert indices // numweights // weight // index // joint index // value // xyz - offset position from joint // // The position of a vertex is found from the sum of the weighted offset from joints // the weights add to 1.0 // // NOTE: need parseInt(), parseFloat() in some cases to make sure saved as a number // any time you add 2 things they both must be numbers or they add as strings // // PLAN: // start with simple header write // single bone at origin, single mesh // //// Execute // Called to execute the command function Execute(params) { // TODO: put your action code here var myScale = 10.0; // 1 inch in doom3 = 0.1 meter in trueSpace //make sure mesh is selected scene = Space.CurrentScene(); selName = Node.FirstSelected(); System.Trace(selName); shortName = Node.ShortName(selName); if(!Node.ConExists(selName, 'Mesh')) { System.Alert("No mesh selected"); return; } dM = System.CreateDO("Space 3D Package/Mesh Data"); dV = System.CreateDO("Space 3D Package/Vertex Stream Data"); dF = System.CreateDO("Space 3D Package/Triangle Vertices Stream Data"); dT = System.CreateDO("Space 3D Package/UV Coordinate Stream Data"); bM = System.CreateDO("Common Data Package/Bitmap Data"); dM = Node.Value(selName, 'Mesh'); dV = dM.GetVertices(); dF = dM.GetTriangles(); dT = dM.GetCustStreamByName("UV Coordinate Stream Data"); UVTri = System.CreateDO("Space 3D Package/UV Triangle Stream Data"); UVTri = dM.GetTrianglesStreamByName("UV Triangle Stream Data"); //april UVTriWork = System.CreateDO("Space 3D Package/UV Triangle Stream Data"); theMatrix = System.CreateDO("Math Package/Matrix Float Data"); theMatrix = Node.Value(selName, 'WldMatrix'); e00 = theMatrix.GetAt(0,0); e10 = theMatrix.GetAt(1,0); e20 = theMatrix.GetAt(2,0); e30 = theMatrix.GetAt(3,0); e01 = theMatrix.GetAt(0,1); e11 = theMatrix.GetAt(1,1); e21 = theMatrix.GetAt(2,1); e31 = theMatrix.GetAt(3,1); e02 = theMatrix.GetAt(0,2); e12 = theMatrix.GetAt(1,2); e22 = theMatrix.GetAt(2,2); e32 = theMatrix.GetAt(3,2); e03 = theMatrix.GetAt(0,3); e13 = theMatrix.GetAt(1,3); e23 = theMatrix.GetAt(2,3); e33 = theMatrix.GetAt(3,3); var numverts; numverts = dM.GetNumVertices(); var numtris; numtris = dM.GetNumFaces(); var numUV; numUV = dT.GetNumUVCoords(); numUVTri = UVTri.GetNumUVTripleIndices(); //april UVTriWork.SetNumUVTripleIndices(7000); //file dialog only good for openning files // no good for creating new files so just type in text box till something better comes along MyFileName = params.conValue('MyFileName'); //MyFileName = shortName + ".md5mesh"; var forReading = 1, forWriting = 2, forAppending = 8; fs = new ActiveXObject("Scripting.FileSystemObject"); fs.CreateTextFile(MyFileName,true); f = fs.GetFile(MyFileName); var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0; connToFile = f.OpenAsTextStream( forWriting, TristateUseDefault); //Header connToFile.WriteLine("MD5Version 10"); connToFile.WriteLine("commandline"); connToFile.WriteBlankLines(1); connToFile.WriteLine("numJoints 1"); connToFile.WriteLine("numMeshes 1"); connToFile.WriteBlankLines(1); connToFile.WriteLine("joints {"); //now do single bone connToFile.WriteLine('\t"origin"\t-1 ( 0 0 0 ) ( 0 0 0 )\t\t//'); connToFile.WriteLine("}"); connToFile.WriteBlankLines(1); connToFile.WriteLine("mesh {"); connToFile.WriteLine("\t// meshes: " + shortName); connToFile.WriteLine('\tshader "dummy"'); connToFile.WriteBlankLines(1); // build xyz uv table // april 14 - xyz and uv pointer arrays xyzPoint = new Array(); uvPoint = new Array(); countPoint = 0; var i; for(uvTriI = 0; uvTriI < numUVTri; uvTriI++) { UVpointIndex = UVTri.i(uvTriI); XYZpointIndex = dF.i(uvTriI); matchFound = 0; if(uvTriI ==0) { xyzPoint[countPoint] = XYZpointIndex; uvPoint[countPoint] = UVpointIndex; UVTriWork.i(uvTriI) = 0; countPoint++; } else { for(i=0;i<countPoint;i++) { if(XYZpointIndex == xyzPoint[i] && UVpointIndex == uvPoint[i]) { matchFound = 1; UVTriWork.i(uvTriI) = i; } } if (matchFound == 0) { xyzPoint[countPoint] = XYZpointIndex; uvPoint[countPoint] = UVpointIndex; UVTriWork.i(uvTriI) = countPoint; countPoint++; } } UVpointIndex = UVTri.j(uvTriI); XYZpointIndex = dF.j(uvTriI); matchFound = 0; for(i=0;i<countPoint;i++) { if(XYZpointIndex == xyzPoint[i] && UVpointIndex == uvPoint[i]) { matchFound = 1; UVTriWork.j(uvTriI) = i; } } if (matchFound == 0) { xyzPoint[countPoint] = XYZpointIndex; uvPoint[countPoint] = UVpointIndex; UVTriWork.j(uvTriI) = countPoint; countPoint++; } UVpointIndex = UVTri.k(uvTriI); XYZpointIndex = dF.k(uvTriI); matchFound = 0; for(i=0;i<countPoint;i++) { if(XYZpointIndex == xyzPoint[i] && UVpointIndex == uvPoint[i]) { matchFound = 1; UVTriWork.k(uvTriI) = i; } } if (matchFound == 0) { xyzPoint[countPoint] = XYZpointIndex; uvPoint[countPoint] = UVpointIndex; UVTriWork.k(uvTriI) = countPoint; countPoint++; } } connToFile.WriteLine("\tnumverts " + countPoint); // var tu, tv; for(xyzuvi = 0; xyzuvi< countPoint; xyzuvi++) { tu = dT.u(uvPoint[xyzuvi]); tv = dT.v(uvPoint[xyzuvi]); connToFile.WriteLine("\tvert " + xyzuvi + " ( " + tu.toFixed(10) + " " + tv.toFixed(10) + " ) " + xyzPoint[xyzuvi] + " 1"); //dummy num weights 1 } connToFile.WriteBlankLines(1); connToFile.WriteLine("\tnumtris " + numtris); for(fi = 0; fi< numtris; fi++) { connToFile.WriteLine("\ttri " + fi + " " + UVTriWork.k(fi) + " " + UVTriWork.j(fi) + " " + UVTriWork.i(fi) ); } connToFile.WriteBlankLines(1); connToFile.WriteLine("\tnumweights " + numverts); var tx, ty, tz; for(vi = 0; vi< numverts; vi++) { //april save transformed points newX = dV.x(vi)*e00 + dV.y(vi)*e10 + dV.z(vi)*e20 + e30; newY = dV.x(vi)*e01 + dV.y(vi)*e11 + dV.z(vi)*e21 + e31; newZ = dV.x(vi)*e02 + dV.y(vi)*e12 + dV.z(vi)*e22 + e32; dV.x(vi) = newX; dV.y(vi) = newY; dV.z(vi) = newZ; tx = dV.x(vi) * myScale; ty = dV.y(vi) * myScale; tz = dV.z(vi) * myScale; connToFile.WriteLine("\tweight " + vi + " 0 1 ( " + tx.toFixed(10) + " " + ty.toFixed(10) + " " + tz.toFixed(10) + " )"); } connToFile.WriteLine("}"); connToFile.Close(); //return; // md5mesh done writing now write the mtr file MyFileName = shortName + ".mtr"; fs.CreateTextFile(MyFileName,true); f = fs.GetFile(MyFileName); connToFile = f.OpenAsTextStream( forWriting, TristateUseDefault); connToFile.WriteLine("models/TSdoom3/Textures/mysurface"); connToFile.WriteLine("{"); //search for material textures //if has children and //if color_shader, normal_shader or model_shader then write _d, _local _s ExploreNode(selName, connToFile); connToFile.WriteLine("}"); connToFile.Close(); } function ExploreNode(thePath, fp) { //must declare or will get global scope var curIndex; var curnumObj; var childPath, MyObj; //if oBitmap and owner has color_shader then do _d theOwner = Node.Owner(thePath); if(Node.ConExists(thePath,'oBitmap')) { bM = Node.Value(thePath,'oBitmap'); bmpName = bM.GetFileName(); nameIndex = bmpName.lastIndexOf("\\") + 1; picName = bmpName.substr(nameIndex); //picName = "test"; if(Node.ConExists(theOwner,'Color_shader')) { System.Trace("diffuse found " + "models/TSdoom3/Textures/" +picName); fp.WriteLine("\tdiffusemap " + "models/TSdoom3/Textures/" + picName); } if(Node.ConExists(theOwner,'Normal_shader')) { System.Trace("normal found"); fp.WriteLine("\tbumpmap " + "models/TSdoom3/Textures/" + picName); //if new normal map //inbitmap.SaveToFile(0,"mytest.bmp"); } if(Node.ConExists(theOwner,'Model_shader')) { System.Trace("specular found"); fp.WriteLine("\tspecularmap " + "models/TSdoom3/Textures/" + picName); } } //get first child curIndex = 0; curnumObj = Node.SubObjectCount(thePath); if(curnumObj > 0) { MyObj = Node.SubObject(thePath, 0); childPath = thePath + '/' + MyObj; } //while can still get child do recursive call while(curnumObj > 0) { ExploreNode(childPath, fp); curIndex = curIndex + 1; if(curIndex < curnumObj) { MyObj = Node.SubObject(thePath, curIndex); childPath = thePath + '/' + MyObj; } else { curnumObj = 0; } } }NScript Object Package/jScript languagestringMyFileName GFI_|k4W}@O{ GFI_|k~C:\Documents and Settings\Clinton\My Documents\testing.md5mesh(XFҦV>g'JNjn*pnCw@ c@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їDefaultControl  GFʠN=PnK1 }}z@HoZ`Ez]UO1釥GP>aPnK<Ez@HoZ`Ez]UO GFʠN=F nK1 }} GFI_|kZ`Ez]UO1釥GP>aH nK<g GFI_|kZ`Ez]UO GFʠN= P0nK1 }}2|=BynjZ`Ez]UO1釥GP>aP 0nK<E2|=BynjZ`Ez]UO#nKSM20`PnK4` \VV GFI_|kZ`Ez]UOOˁ CRih[ PӁ q 8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0PӁ q:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO1釥GP>a0xPPӁ <x GFI_|kZ`Ez]UO GFʠN=PxxPӁ }}Click "..." then choose a file or rt click to create a new text file with an "md5mesh" extension instead of "txt". Click Start to save the md5mesh.Z`Ez]UO#nKSM2 PӁ 4 \VV GFI_|kZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho! 8ʯȥJH|o7 gH]kDwP`d8pM*#ͺOL/tfѭ8Lwb"qtM]4