gH]kDwP&trueSpaceBeta 7.61[VS_O93YJClinton Reese, Clintons 3D Creations`d8pM*#ͺO2PNG  IHDR@@% IDATxُ]וÙ\YUdLjEInm +F$@$O~_txl$(DR*|V{ϸ@e5٦vq}ƍoo9MRv73 D՛oIuמyz㝋oO'Ӽ,VwwmnX\ʲ j%Y+4u}ww{[\\xm]`ƫHuJk`U43ñ$ϹQʟ5kz1`w߹x믽l֍Q`o_>3g\򲎣h?kڽ)-Fe$QGJ Dd "֫zt$*kEM#DXCv l{~)b)BV23 "" >`  d(iMxw?_\ZW2Y<㓢;k)jLΛ94T"bT(MUr+3!_w#"& &pi ~vБq!C+KDr`jE5Y@MS8 tDVK< >/ [ RHMtW.@, (msɬ+H2V9v!`$N fDF} qQL8q$PDD;@D`6^uU$T2GJG_RB/\JI0n4E,xSRRt,JӘ>P`]R $y v.kW9\{gBp"%@BJGQe R<瞹JHF D(E^8?}WWPR88NRj@`,|PHHL{(umۜNr"T"/K%4{DR@Iq8M=02GJGQ9 3 `:wܙف>$^zO@a_΃=ꏂ1Vˆy $gyk ᜣf;\aLU@k3;3K_t{_?bNt0;Gfgg]m+So?nGR3m:@$ieQ2@}&e_~koǕ+R򩲪"%Sb=>:\X]]}x</--f.nC+KQ# $0J@[|:yB"JڑcGD%U]*ғ;:~p8ŭ57FQܛQ~(jT_zg}͛e4nomn+936&uρYC!{}DB8MpX;rĝՏ[}+?~ݭvUk_uB!x2YX?ѧb| 0L0#37u (E&J*^J6@X?\COl^\Xw;OmÞ)>kPnzGRÇ;3yɫǏlo Xbzkuʓ++ `vнrh~ocgkwv0c}u烊Bؘ;8ËgduwYs#+)mmL:O85-&,`os?ï9wv{{s<>RJ""(jg{78888wtvov1,KQ o.MH%JHJ眎#"_WnɭQ1|`vowXZ;ٴq2>V&LQLO_:-8Ļy_t婫W=19w-G fB`ݾP$B*@@U] A'0{f@彃êtf?9mDvƵ{d09܁Ψv[[= o{e5\xpm%gdʘ"n۸uV+ŒNy{ʣyQĭ#I7HmM3\Ǻ*\~xgo:ћ1DuC:U_GC7WօVB`D9;8:ϧyయe1`SׯJǎt(kTii_޻~wMitـDN5;P^^MFyqh:98::" $(Sԭ}`po۬Yju9$J  NPP׾^yg7nLN&?lwEG+ '##o7M7WS'GSb|hǁA)e3ޝGU] 0 C(A+ٲ,bb N$wv_+5NWw_֍tBe<5M@ {o?)]v'qQz"&|4HƐT+_}t'2EɁ )BIa/KO]/XG)Yo_xwo^VWyzQt U;Q։N'-j{W.J/éj/.,[`eqGY(0 t$i4px`yy%Mu}l~.8gϟɫbt8/|s)88M$RJDcau\8:tfaqӗN.?۷N[o%#罐 Lc==`&vuŏR+ҝS`TUӬ>ޝ݋wa:g4NS -!0֢ےbjOW/_xB.|w*({&Fm|` Xqnn{F:ZS~X:[3+ F*˻"vgNi!ePG2(gVN_?__RD-^Zg(jLDJVi! ,JE{!0#Uu 3Ky x|4uNGRJm@SOç:y$NTlON uOά|G^UU>ZF)cj!&Ӊ*y"PJ@c)AR30sf=Gɥ,ͦImLEՔ!: xzJ͝rѝnUm۲N| VuQjRJ23 |R#29됁XDT(}D@@y:cB =J}ȔMmRF}MpToܾ+)Rp?37"3 K%tDVOTRB9HB8? Yb'R{S U`<+,,~hwf"!ToNU($K)bD<64UDGY#FȰgdJ "~'SF'Z#,OARD,Bg=إn!XiEq@(4&P`4RH9P>Eiєi+inw>=rkFQֽAOhc}#sQ'q W9c}N cm~=3ΗSIxRc (2xRQ<7;R ^+)Um!}ft*n !|rzR:/,8 CD)!;[["Nqs4AFc=oE`:e$)T QJRx)LDYTC]{ODNxk1z{{^fƙA9d86&Zk-'E:w‹Q~Zg1`.Ѿ5u 6VODR:.EJZYUkS(UUy88rb䣏9{XY[ke]9wQJn (CP$ibwD\j-~QvPT)@ .QGёcOBx@(/Q=ԇ{̠dt4_L3_W>ևO?Nӟ޼yʕg}w/_{擪 "}IENDB`/tfѭ8Lwb"q[܂dKu=D>install ASE Export Button v1.5X+.;]kI 忞@.;]kI 忞@"SubObject*Encapsulated objects"X RHqX)4W}@O{4W}@O{$ Owner4Owner of the Encapsulator$(XFҦV(XFҦV"LE2Data$LE2 Data for node >g'JNjn*p" zFAa| zFAa|DhelpText\vRm)EC!avRm)EC!aD leftClickScript\1V {E!Y1V {E!YD name\!K0}q!K0}qD"rightClickScript\-1OSM n-1OSM n"LayoutLayout 럆L<_ї"1V {E!YsayHello!K0}q2System.Alert("goodbye");(XFҦV>g'JNjn*pFCCr@@P@@?vRm)EC!a<System.Alert("hello there!"); zFAa|say hello-1OSM n 럆L<_ї%DefaultOˁ CRih[  h }}LActivity.Run('%THIS_NAME%' + "/doIt")8install buttons and scriptsZ`Ez]UO}}D`._E#ބ6ܤCustomFrame(X!.;]kI 忞@"X4W}@O{$*O΢C}*O΢C} WinIDWindow IDآ-pϗO 0)t-pϗO 0)PositionShelf Position mz!OHwcXʶXʶ>-MD'zZt>-MD'zZRectangle"Screen Rectangle THj6F 2s*XRÒGbDeC tRÒGbDeC  WidthWindow widthXʶX^[FB%n*jt[FB%n*jHeightWindow heightXʶ [GDJM [GDJMMin Width$Min. Window width%]GJ7ψ%]GJ7ψMin Height&Min. Window height^^Dy^^DyMax Width$Max. Window widthv43N tv43N tMax Height&Max. Window height~൱D@ j#^c~൱D@ j#^cMaximized(Window Is Maximized 9@'s9@'sRootNodeRootNode{Q !aOt {Q !aOt  TitleTitle Text6*Mv46*Mv4View Index$View window indexf$I `7f$I `7Frame TypeFrame Typej^G@!,j^G@!,"ViewersViewers array 2bOdA)f "I)LL !I)LL ! Def1D Default 1D GUID8M0cry8M0cry Def2D Default 2D GUIDF L$3F L$3 Def3D Default 3D GUIDobFFJL}obFFJL}SnappedTo$Snapped To WindowBXPjKɸtEBXPjKɸtE SnappedToTarget@Snapped To Window Target CornerkJHx(V@WkJHx(V@W SnappedToSource@Snapped To Window Source CornerKTLA7~fKTLA7~f"SnappedToOffsetX6Snapped To Window Offset XK8Y8O#=gtMK8Y8O#=gtM"SnappedToOffsetY6Snapped To Window Offset Ymk~_Lb.mk~_Lb.SnappedToWidth0Snapped To Window Width|7EId |7EId  SnappedToHeight2Snapped To Window HeightKXtO LKXtO L,StartSnappedToOffsetXBStart Snapped To Window Offset XVG))jHETVG))jHET,StartSnappedToOffsetYBStart Snapped To Window Offset Y?V{N7l?V{N7lSnappedToRatio,Snapped To Ratio Mode 86*n^HD9t 86*n^HD9t OwnedByOwned By|_ D|_ DTabsAsButtons Tabs As Buttons _N>G1_N>G1HiddenHidden Flag \q^2FII3w\q^2FII3wPreference,View Preference Panel >=жaMpT>=жaMpT&HideDockedTitlebarJHide Title bar when window is docked N'D)L-N'D)L-MinimizedBHJWindow Is Minimized into Blue Handle ϕ`&FSx9wϕ`&FSx9wSizeLockPrevent horizontal and/or vertical size change. 0x01 - horizontal, 0x02 - vertical˽OS˽OSDispTitleText,Display Titlebar Text Ī8mݧC>!7Ī8mݧC>!7SmallerTabs*Display smaller Tabs (XFҦV"&BXPjKɸtEkJHx(V@W|_ D8M0cryN{485B725E-A69D-4AD5-A876-B3BBA72D2C0A}mk~_Lb.[FB%n*jRÒGbDeC 1 [GDJM6*Mv4K8Y8O#=gtM\q^2FII3w{Q !aOt f$I `7v43N t I)LL !obFFJL}Ī8mݧC>!7^^Dy(XFҦV>g'JNjn*pFBCX@1@?*O΢C}N{5FDDFE6E-518F-464A-B4B9-8D24B556E36C}9@'s_N>G1-pϗO 0)mz!OHwc ˽OSF L$3>=жaMpTϕ`&FSx9w>-MD'zZ%]GJ7ψj^G@!,2bOdA)f 6^r[HJv-, ^r[HJv-, KXtO LVG))jHET?V{N7l ~൱D@ j#^cKTLA7~f|7EId 86*n^HD9t N'D)L-^r[HJv-, ԧToolbar.;]kI 忞@"X4W}@O{$n_<&KES Qn_<&KES Q NameItem nameo(K ]p do(K ]p dHelpTextHelp text8Cechg8Cechg RowsToolbar RowsNL {NL {$Dimension$Toolbar dimension$Z_IFL!OSZ_IFL!OSHorizontal Horizontal Flag .S)A2UЍc.S)A2UЍcIsSubToolbar$IsSubToolbar Flag =JM@hM Q3=JM@hM Q3IsImportant2IsImportant Toolbar Flag .UuwO e.UuwO eIDToolbar ID'0#ԪC'X/9}'0#ԪC'X/9}$ IndexItem Index$_N>G1JdWJc~JdWJc~PrototypePrototype name<9BH@b\<9BH@b\IsMinimizedPTrue/False flag if toolbar is minimized m O1Wwm O1Ww$IsAspectT(Aspect Toolbar Flag $(XFҦV".UuwO e'0#ԪC'X/9}=JM@hM Q3 m O1Ww(XFҦV>g'JNjn*pFBCb@ f@?NL {Z_IFL!OS _N>G18CechgJdWJc~n_<&KES Q.S)A2UЍc o(K ]p d<9BH@b\ R/$ķKniaWexportASE'0#ԪC'X/9}]8teO?s]8teO?s"MaxItemTxtHeight.Maximal item text size% sH?DC sH?DCTagTag%IlfāA>ˁwIlfāA>ˁwTagAliasTag Alias%/ru|GF0/ru|GF0AgentIDUpdate agentID(XFҦVLE2Data, 1"-1OSM n".;]kI 忞@"X 4W}@O{$n_<&KES Qo(K ]p dQm6l3Ll/V^Qm6l3Ll/V^CommandAction commandN="QEj%:N="QEj%:RClickCommand,RClick Action Command$ܿORE bi$ܿORE biPreview2D8Item preview 2D resource id*S]?G[~x;*S]?G[~x;Preview3D8Item preview 3D resource idSr)B8Sr)B8Package"Package class idDNOQsP'ѭDNOQsP'ѭBitmap.Item preview 3D bitmap eSBgciDsL[wiDsL[wRadio Group(Radio buttons group4E*4E*ControlID2D&User Control ID 2Dh>ǑJ]@<h>ǑJ]@<ControlID3D&User Control ID 3D+fyOA7XC+fyOA7XC MaxItemBmpWidth2Maximal item bitmap sizeTl@fC.^&GZTl@fC.^&GZ"MaxItemBmpHeight2Maximal item bitmap sizeh0OY~ C h0OY~ C  MaxItemTxtWidth.Maximal item text size%?Aυ D)7t?Aυ D)7tGrayPercentxGray icon about specified percents if it is not highlighted][D+Iv(][D+Iv( MenuAct As Menu 8{Nm(!8{Nm(!IsMenuButtonIs Menu Button ko6g'JNjn*pceZU@䑧rceZU@䑧r$_scriptData*Internal Script data [җJs@ %R4W}@O{$(XFҦVLE2Data, 1#J@#QLJ@#QLLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 3MT^RwL~YYTMT^RwL~YYTޢLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 22|=Bynj2|=Bynj Control OutTransitionOutz@Hoz@Ho Control InTransitionIn 2|=Bynj2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommand // Execute // Called to execute the command function Execute(params) { // TODO: put your action code here owner = System.ThisOwner(); button1 = "exportASE"; theScript = "ase object export"; // if(Node.Exists("/Project/Windows Manager Space/CustomFrame/Toolbar/" + button1)) { replaceLeft = System.Question(button1 + " button already exists in the toolbar. Would you like to replace it?"); if(replaceLeft) Node.Delete("/Project/Windows Manager Space/CustomFrame/Toolbar/" + button1); else return; } //check for and create customframe if(!Node.Exists("/Project/Windows Manager Space/CustomFrame")) Node.Copy(owner + "/CustomFrame","/Project/Windows Manager Space"); //copy buttons to custom frame oldButt = Node.Copy(owner + "/" + button1,"/Project/Windows Manager Space/CustomFrame/Toolbar"); //copy script to custom commands //create CustomCommands if(!Node.Exists("/Scripts/CustomCommands")) { temp = Node.Create("Kernel Package/Object","/Scripts"); custcom = Node.Rename(temp,"CustomCommands"); } if(Node.Exists("/Scripts/CustomCommands/" + theScript)) { replaceLeft = System.Question(theScript + " script already exists. Would you like to replace it?"); if(replaceLeft) Node.Delete("/Scripts/CustomCommands/" + theScript); else return; } Node.Copy(owner + "/" + theScript,"/Scripts/CustomCommands"); //activate it WindowsManager.Activate(); WindowsManager.UpdateWindowsStructure(); //reset the toolbar //1D Aspect WindowsManager.SetWindowAspect('/Project/Windows Manager Space/CustomFrame', 1); //2D Aspect WindowsManager.SetWindowAspect('/Project/Windows Manager Space/CustomFrame', 2); } NScript Object Package/jScript language(XF쥄 V4W}@O{(XFҦV>g'JNjn*pn7C`b@H@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_їjControlOˁ CRih[ Ca8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 0 Ca:Activity.Stop('%THIS_NAME%') StopZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho48@J g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ NewCommandثfunction writeGeometry(theSelection) { System.Trace(theSelection); theMatrix = Node.Value(theSelection, "WldMatrix"); dM = Node.Value(theSelection, 'Mesh'); dV = dM.GetVertices(); dF = dM.GetTriangles(); dT = dM.GetCustStreamByName("UV Coordinate Stream Data"); dT2 = dM.GetCustStreamByName("UV Coordinate Stream 2 Data"); UVTri = dM.GetTrianglesStreamByName("UV Triangle Stream Data"); UVTri2 = dM.GetTrianglesStreamByName("UV Triangle Stream 2 Data"); matStrm = dM.GetTrianglesStreamByName("Material Index Stream Data"); //dN= dM.GetNormals(); dNTri = dM.GetTrianglesStreamByName('Triangle Normals Stream Data'); dN = dM.GetCustStreamByName('Normals Stream Data'); numverts = dM.GetNumVertices(); numtri = dM.GetNumTriangles(); if(dT) numuv = dT.GetNumUVCoords(); if(dT2) numuv2 = dT2.GetNumUVCoords(); objName = Node.ShortName(theSelection); connToFile.WriteLine("*GEOMOBJECT {"); connToFile.WriteLine("\t*NODE_NAME \"" + objName + "\""); connToFile.WriteLine("\t*NODE_TM {"); connToFile.WriteLine("\t\t*NODE_NAME \"" + objName + "\""); connToFile.WriteLine("\t\t*INHERIT_POS 0 0 0"); connToFile.WriteLine("\t\t*INHERIT_ROT 0 0 0"); connToFile.WriteLine("\t\t*INHERIT_SCL 0 0 0"); connToFile.WriteLine("\t\t*TM_ROW0 1.0000\t0.0000\t0.0000"); connToFile.WriteLine("\t\t*TM_ROW1 0.0000\t0.0000\t1.0000"); connToFile.WriteLine("\t\t*TM_ROW2 0.0000\t-1.0000\t0.0000"); connToFile.WriteLine("\t\t*TM_ROW3 -0.4249\t-0.0000\t151.1419"); connToFile.WriteLine("\t\t*TM_POS -0.4249\t-0.0000\t151.1419"); connToFile.WriteLine("\t\t*TM_ROTAXIS -1.0000\t0.0000\t0.0000"); connToFile.WriteLine("\t\t*TM_ROTANGLE 1.5708"); connToFile.WriteLine("\t\t*TM_SCALE 1.0000\t1.0000\t1.0000"); connToFile.WriteLine("\t\t*TM_SCALEAXIS 0.0000\t0.0000\t0.0000"); connToFile.WriteLine("\t\t*TM_SCALEAXISANG 0.0000"); connToFile.WriteLine("\t}");// close node tm connToFile.WriteLine("\t*MESH {"); connToFile.WriteLine("\t\t*TIMEVALUE 0"); // vertices connToFile.WriteLine("\t\t*MESH_NUMVERTEX " + numverts); connToFile.WriteLine("\t\t*MESH_NUMFACES " + numtri); connToFile.WriteLine("\t\t*MESH_VERTEX_LIST {"); myVector = System.CreateDO('Math Package/Point Data'); transVect = System.CreateDO('Math Package/Point Data'); for(curvert = 0; curvert < numverts; curvert++) { myVector.x = dV.x(curvert); myVector.y = dV.y(curvert); myVector.z = dV.z(curvert); transVect = theMatrix.TransformPoint(myVector); //**** ut3 seems to like -Y but may prefer -X for some cases //need further experimentation //july 2009 // //xval = -transVect.x * myScale; //xval = transVect.x * myScale;//ut3 build in Y //yval = transVect.y * myScale; //yval = -transVect.y * myScale;//try make match ut3 //zval = transVect.z * myScale; // //July 25 2009 - flip one axis to convert right to left handed coord // xval = xflip * transVect.x * myScale; yval = yflip * transVect.y * myScale; zval = zflip * transVect.z * myScale; connToFile.WriteLine("\t\t\t*MESH_VERTEX " + curvert + " " + xval.toFixed(4) + "\t" + yval.toFixed(4) + "\t" + zval.toFixed(4) ); } connToFile.WriteLine("\t\t}");// close mesh vertex list // // faces - triangles // matsmooth = System.CreateDO("Space 3D Package/Material Index Stream Data"); dMsmooth = System.CreateDO("Space 3D Package/Mesh Data"); smoothGrpFlag = false; if(Node.Exists(scene + "/smoothingGroups")) { dMsmooth = Node.Value(scene + "/smoothingGroups", "Mesh"); matsmooth = dMsmooth.GetTrianglesStreamByName("Material Index Stream Data"); smoothGrpFlag = true; } if(theSelection != firstSel) smoothGrpFlag = false; // truespace faces are clockwise, ase is counter cw connToFile.WriteLine("\t\t*MESH_FACE_LIST {"); for(curface=0; curface<numtri; curface++) { if(smoothGrpFlag) { smoothGrp = matsmooth.index(curface); } else smoothGrp = 0; //theory: 1 1 1 for AB BC CA is edge visibility same as truespace definition of faces if(numMat > 1) connToFile.WriteLine("\t\t\t*MESH_FACE " + curface + ": A: " + dF.k(curface) + " B: " + dF.j(curface) + " C: " + dF.i(curface) + " AB: 1 BC: 1 CA: 1\t *MESH_SMOOTHING " + smoothGrp + "\t*MESH_MTLID " + matStrm.index(curface)); else connToFile.WriteLine("\t\t\t*MESH_FACE " + curface + ": A: " + dF.k(curface) + " B: " + dF.j(curface) + " C: " + dF.i(curface) + " AB: 1 BC: 1 CA: 1\t *MESH_SMOOTHING " + smoothGrp + "\t*MESH_MTLID 0"); //connToFile.WriteLine("\t\t\t*MESH_FACE " + curface + ": A: " + dF.k(curface) + " B: " + dF.j(curface) + " C: " + dF.i(curface) + " AB: 1 BC: 1 CA: 1\t *MESH_SMOOTHING " + curface + "\t*MESH_MTLID 0"); } connToFile.WriteLine("\t\t}");//close mesh face list // //texture vertices uv set 1 // connToFile.WriteLine("\t\t*MESH_NUMTVERTEX " + numuv); connToFile.WriteLine("\t\t*MESH_TVERTLIST {"); for(curuv=0; curuv<numuv;curuv++) { //july 2009 - v upside down in unreal editor //connToFile.WriteLine("\t\t\t*MESH_TVERT " + curuv + "\t" + dT.u(curuv).toFixed(4) + "\t" + dT.v(curuv).toFixed(4) + "\t0.5000"); vval = 1.0 - dT.v(curuv); connToFile.WriteLine("\t\t\t*MESH_TVERT " + curuv + "\t" + dT.u(curuv).toFixed(4) + "\t" + vval.toFixed(4) + "\t0.5000"); } connToFile.WriteLine("\t\t}");// close tmesh vertex list // //texture faces // // texture faces same as faces connToFile.WriteLine("\t\t*MESH_NUMTVFACES " + numtri); connToFile.WriteLine("\t\t*MESH_TFACELIST {"); for(curface=0; curface<numtri; curface++) { connToFile.WriteLine("\t\t\t*MESH_TFACE " + curface + "\t" + UVTri.k(curface) + "\t" + UVTri.j(curface) + "\t" + UVTri.i(curface)); } connToFile.WriteLine("\t\t}");// close mesht face list // //second uv set export // // //texture vertices uv set 2 // if(dT2) { connToFile.WriteLine("\t\t*MESH_MAPPINGCHANNEL 2 {"); connToFile.WriteLine("\t\t\t*MESH_NUMTVERTEX " + numuv2); connToFile.WriteLine("\t\t\t*MESH_TVERTLIST {"); for(curuv=0; curuv<numuv2;curuv++) { //july 2009 - v upside down in unreal editor //connToFile.WriteLine("\t\t\t*MESH_TVERT " + curuv + "\t" + dT.u(curuv).toFixed(4) + "\t" + dT.v(curuv).toFixed(4) + "\t0.5000"); vval = 1.0 - dT2.v(curuv); connToFile.WriteLine("\t\t\t\t*MESH_TVERT " + curuv + "\t" + dT2.u(curuv).toFixed(4) + "\t" + vval.toFixed(4) + "\t0.5000"); } connToFile.WriteLine("\t\t\t}");// close tmesh vertex list // //texture faces // // texture faces same as faces connToFile.WriteLine("\t\t\t*MESH_NUMTVFACES " + numtri); connToFile.WriteLine("\t\t\t*MESH_TFACELIST {"); for(curface=0; curface<numtri; curface++) { connToFile.WriteLine("\t\t\t\t*MESH_TFACE " + curface + "\t" + UVTri2.k(curface) + "\t" + UVTri2.j(curface) + "\t" + UVTri2.i(curface)); } connToFile.WriteLine("\t\t\t}");// close mesht face list connToFile.WriteLine("\t\t}");// close mesh mappingchannel 2 } // //normals face and vertex // myVector2 = System.CreateDO('Math Package/Point Data'); myVector3 = System.CreateDO('Math Package/Point Data'); myVectorT = System.CreateDO('Math Package/Point Data'); myNorm = System.CreateDO('Math Package/Point Data'); myNormT = System.CreateDO('Math Package/Point Data'); jumdN = dN.GetNumVertexNormals(); jumdNTri = dNTri.GetNumTripleIndices(); connToFile.WriteLine("\t\t*MESH_NORMALS {"); for(curface=0; curface<numtri; curface++) { //TODO: read and transform the face normal //myVector.x = dN.x(dF.i(curface)); //myVector.y = dN.y(dF.i(curface)); //myVector.z = dN.z(dF.i(curface)); //myVector2.x = dN.x(dF.j(curface)); //myVector2.y = dN.y(dF.j(curface)); //myVector2.z = dN.z(dF.j(curface)); //myVector3.x = dN.x(dF.k(curface)); //myVector3.y = dN.y(dF.k(curface)); //myVector3.z = dN.z(dF.k(curface)); myVector.x = dN.x(dNTri.i(curface)); myVector.y = dN.y(dNTri.i(curface)); myVector.z = dN.z(dNTri.i(curface)); myVector2.x = dN.x(dNTri.j(curface)); myVector2.y = dN.y(dNTri.j(curface)); myVector2.z = dN.z(dNTri.j(curface)); myVector3.x = dN.x(dNTri.k(curface)); myVector3.y = dN.y(dNTri.k(curface)); myVector3.z = dN.z(dNTri.k(curface)); myNorm.x = myVector.x + myVector2.x + myVector3.x; myNorm.y = myVector.y + myVector2.y + myVector3.y; myNorm.z = myVector.z + myVector2.z + myVector3.z; myNormT = theMatrix.TransformPoint(myNorm); myNormT.Normalize(); // //July 25 2009 //flip based on right to left coordinate choice //xval = -myNormT.x ; yval = myNormT.y ; zval = myNormT.z ; xval = xflip*myNormT.x ; yval = yflip*myNormT.y ; zval = zflip*myNormT.z ; // connToFile.WriteLine("\t\t\t*MESH_FACENORMAL " + curface + " " + xval.toFixed(4) + "\t" + yval.toFixed(4) + "\t" + zval.toFixed(4)); //TODO: read and transform vertex normal myVectorT = theMatrix.TransformPoint(myVector3); myVectorT.Normalize(); // //July 25 2009 //flip based on right to left coordinate choice //xval = -myVectorT.x ; yval = myVectorT.y ; zval = myVectorT.z ; xval = xflip*myVectorT.x ; yval = yflip*myVectorT.y ; zval = zflip*myVectorT.z ; // connToFile.WriteLine("\t\t\t\t*MESH_VERTEXNORMAL "+ dF.k(curface) + " "+ xval.toFixed(4) + "\t" + yval.toFixed(4) + "\t" + zval.toFixed(4)); myVectorT = theMatrix.TransformPoint(myVector2); myVectorT.Normalize(); // //July 25 2009 //flip based on right to left coordinate choice //xval = -myVectorT.x ; yval = myVectorT.y ; zval = myVectorT.z ; xval = xflip*myVectorT.x ; yval = yflip*myVectorT.y ; zval = zflip*myVectorT.z ; // connToFile.WriteLine("\t\t\t\t*MESH_VERTEXNORMAL "+ dF.j(curface) + " "+ xval.toFixed(4) + "\t" + yval.toFixed(4) + "\t" + zval.toFixed(4)); myVectorT = theMatrix.TransformPoint(myVector); myVectorT.Normalize(); // //July 25 2009 //flip based on right to left coordinate choice //xval = -myVectorT.x ; yval = myVectorT.y ; zval = myVectorT.z ; xval = xflip*myVectorT.x ; yval = yflip*myVectorT.y ; zval = zflip*myVectorT.z ; // connToFile.WriteLine("\t\t\t\t*MESH_VERTEXNORMAL "+ dF.i(curface) + " "+ xval.toFixed(4) + "\t" + yval.toFixed(4) + "\t" + zval.toFixed(4)); } connToFile.WriteLine("\t\t}");// close normal face list connToFile.WriteLine("\t}");// close mesh connToFile.WriteLine("\t*PROP_MOTIONBLUR 0"); connToFile.WriteLine("\t*PROP_CASTSHADOW 1"); connToFile.WriteLine("\t*PROP_RECVSHADOW 1"); connToFile.WriteLine("\t*MATERIAL_REF 0"); connToFile.WriteLine("}"); //close geom object } // Execute // Called to execute the command function Execute(params) { var MyFileName = params.ConValue('MyFileName'); var flipAxis = params.ConValue('flipAxis'); //choose flip axis to convert tS right handed to left handed xflip = 1; yflip = 1; zflip = 1; //flipAxis == 0 no flip if(flipAxis == 1) xflip = -1; if(flipAxis == 2) yflip = -1;//ut3 matches this if(flipAxis == 3) zflip = -1; //flipAxis == myScale = 10.0; // 1 inch in doom3 = 0.1 meter in trueSpace meshFound = false; meshCount = 0; meshes = new Array(); scene = Space.CurrentScene(); firstSel = Node.FirstSelected();//full path to selection //System.Trace(firstSel); childCount = Node.SubObjectCount(firstSel); for(i=0;i<childCount;i++) { curNode = Node.SubObject(firstSel,i);//short name of child //System.Trace(curNode); if(Node.ConExists(firstSel + "/" + curNode,"Mesh")) { meshFound = true; meshes[meshCount] = curNode; meshCount++; } } if(!meshFound) { System.Alert("No mesh found inside selected node"); return; } if(meshCount > 1) { System.Alert("Mesh too complex. Only single mesh objects allowed"); return; } 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); // //file header // connToFile.WriteLine("*3DSMAX_ASCIIEXPORT\t200"); connToFile.WriteLine("*COMMENT \"AsciiExport Version 2.00 - Truespace Export Script for Unreal\""); connToFile.WriteLine("*SCENE {"); connToFile.WriteLine("\t*SCENE_FILENAME \"Truespace.scn\""); connToFile.WriteLine("\t*SCENE_FIRSTFRAME 0"); connToFile.WriteLine("\t*SCENE_LASTFRAME 1"); connToFile.WriteLine("\t*SCENE_FRAMESPEED 30"); connToFile.WriteLine("\t*SCENE_TICKSPERFRAME 160"); connToFile.WriteLine("\t*SCENE_BACKGROUND_STATIC 0.0000\t0.0000\t0.0000"); connToFile.WriteLine("\t*SCENE_AMBIENT_STATIC 0.3373\t0.3373\t0.3373}"); connToFile.WriteLine("*MATERIAL_LIST {"); // // dummy material to hold submaterials // connToFile.WriteLine("\t*MATERIAL_COUNT 1"); connToFile.WriteLine("\t*MATERIAL 0 {"); connToFile.WriteLine("\t\t*MATERIAL_NAME \"dummy\""); connToFile.WriteLine("\t\t*MATERIAL_CLASS \"Multi/Sub-Object\""); connToFile.WriteLine("\t\t*MATERIAL_AMBIENT 0.5\t0.5\t0.5"); connToFile.WriteLine("\t\t*MATERIAL_DIFFUSE 0.5\t0.5\t0.5"); connToFile.WriteLine("\t\t*MATERIAL_SPECULAR 0.5\t0.5\t0.5"); connToFile.WriteLine("\t\t*MATERIAL_SHINE 0.2500"); connToFile.WriteLine("\t\t*MATERIAL_SHINESTRENGTH 0.0500"); connToFile.WriteLine("\t\t*MATERIAL_TRANSPARENCY 0.0000"); connToFile.WriteLine("\t\t*MATERIAL_WIRESIZE 1.0000"); //get material count // check each node inside the mesh object to find the material encapsulator subObjCnt = Node.SubObjectCount(firstSel); for(i=0;i<subObjCnt;i++) { testMat = Node.SubObject(firstSel, i); if(Node.ConExists(firstSel + "/" + testMat, "Material List")) matSubObj = firstSel + "/" + testMat; } numMat = Node.SubObjectCount(matSubObj) - 1;//dont include material list manager // submaterials connToFile.WriteLine("\t*NUMSUBMTLS " + numMat ); // // //use it's inputs to find the materials in order by name // //array to hold material names shortMatName = new Array(); // find material list manager for(val=0;val<numMat+1;val++) { subObj = Node.SubObject(matSubObj, val); //not a material so must be material list if(!Node.ConExists( matSubObj + "/" + subObj,"Material Chunk")) matList = matSubObj + "/" + subObj; } //get material names for(val=0;val<numMat;val++) { conName = "Mat Chunk " + val; if(Node.ConExists(matList, conName)) { fullMatName = Node.LinkedInputNode(matList, conName, 0); shortMatName[val] = Node.ShortName(fullMatName); } } // // // indOffset = 0; for(curmat=0;curmat<numMat;curmat++) { val = indOffset + curmat; subObj = Node.SubObject(matSubObj, val); //not a material so skip to next material - ignore material list manager node if(!Node.ConExists( matSubObj + "/" + subObj,"Material Chunk")) { indOffset=1; val = indOffset + curmat; subObj = Node.SubObject( matSubObj, val); } //which material is it for(i=0;i<numMat;i++) if(subObj == shortMatName[i]) { matIndex = i; rawMatName = shortMatName[i]; } bitmapname = "changeThisBitmap" + matIndex; //find bitmap file name if any - D3D material node if(Node.Exists(matSubObj + "/" + subObj + "/D3D material")) { //search for a node with a filenamw input matNodeCount = Node.SubObjectCount(matSubObj + "/" + subObj + "/D3D material"); //System.Trace("num nodes to examine = " + matNodeCount); for(curMind=0;curMind<matNodeCount;curMind++) { subMatNode = Node.SubObject(matSubObj + "/" + subObj + "/D3D material", curMind); //System.Trace(subMatNode); if(Node.ConExists(matSubObj + "/" + subObj + "/D3D material/" + subMatNode, "FileName")) { //does it connect to a node with a color shader output? //System.Trace("filename found"); if(Node.ConExists(matSubObj + "/" + subObj + "/D3D material/" + subMatNode, "Bitmap")) { numBMcon = Node.LinkedOutputNodeCount(matSubObj + "/" + subObj + "/D3D material/" + subMatNode,"Bitmap"); //System.Trace("bitmap con found " + numBMcon); for(curSMind=0;curSMind<numBMcon;curSMind++) { colShaderNode = Node.LinkedOutputNode(matSubObj + "/" + subObj + "/D3D material/" + subMatNode,"Bitmap",curSMind); //System.Trace("node found " + colShaderNode); if(Node.ConExists(colShaderNode, "Color_shader")) { //match found set filename of bitmap //System.Trace("match found"); bitmapname = Node.Value(matSubObj + "/" + subObj + "/D3D material/" + subMatNode, "FileName"); } } } } } } //convert % to / for doom3 style materials re = /%/g; rawMatName = rawMatName.replace(re,"/"); //remove spaces from the name //re = / /g; //rawMatName = rawMatName.replace(re,""); //remove comma from the name //re = /,/g; //rawMatName = rawMatName.replace(re,""); //connToFile.WriteLine("\t\t*SUBMATERIAL " + curmat + " {"); connToFile.WriteLine("\t\t*SUBMATERIAL " + matIndex + " {"); //connToFile.WriteLine("\t\t\t*MATERIAL_NAME " + "\"material" + curmat + "\""); connToFile.WriteLine("\t\t\t*MATERIAL_NAME \"" + rawMatName + "\""); connToFile.WriteLine("\t\t\t*MATERIAL_CLASS \"Standard\""); connToFile.WriteLine("\t\t\t*MATERIAL_AMBIENT 0.8\t0.8\t0.8"); connToFile.WriteLine("\t\t\t*MATERIAL_DIFFUSE 0.8\t0.8\t0.8"); connToFile.WriteLine("\t\t\t*MATERIAL_SPECULAR 0.8\t0.8\t0.8"); connToFile.WriteLine("\t\t\t*MATERIAL_SHINE 0.2500"); connToFile.WriteLine("\t\t\t*MATERIAL_SHINESTRENGTH 0.0500"); connToFile.WriteLine("\t\t\t*MATERIAL_TRANSPARENCY 0.0000"); connToFile.WriteLine("\t\t\t*MATERIAL_WIRESIZE 1.0000"); connToFile.WriteLine("\t\t\t*MATERIAL_SHADING Blinn"); connToFile.WriteLine("\t\t\t*MATERIAL_XP_FALLOFF 0.0000"); connToFile.WriteLine("\t\t\t*MATERIAL_SELFILLUM 0.0000"); connToFile.WriteLine("\t\t\t*MATERIAL_FALLOFF In"); connToFile.WriteLine("\t\t\t*MATERIAL_XP_TYPE Filter"); connToFile.WriteLine("\t\t\t*MAP_DIFFUSE {"); connToFile.WriteLine("\t\t\t\t*MAP_NAME \"Map #" + curmat + "\""); connToFile.WriteLine("\t\t\t\t*MAP_CLASS \"Bitmap\""); connToFile.WriteLine("\t\t\t\t*MAP_SUBNO 1"); connToFile.WriteLine("\t\t\t\t*MAP_AMOUNT 1.0000"); //connToFile.WriteLine("\t\t\t\t*BITMAP \"changeThisBitmap" + curmat + "\""); connToFile.WriteLine("\t\t\t\t*BITMAP \"" + bitmapname + "\""); connToFile.WriteLine("\t\t\t\t*MAP_TYPE Screen"); connToFile.WriteLine("\t\t\t\t*UVW_U_OFFSET 0.0000"); connToFile.WriteLine("\t\t\t\t*UVW_V_OFFSET 0.0000"); connToFile.WriteLine("\t\t\t\t*UVW_U_TILING 1.0000"); connToFile.WriteLine("\t\t\t\t*UVW_V_TILING 1.0000"); connToFile.WriteLine("\t\t\t\t*UVW_ANGLE 0.0000"); connToFile.WriteLine("\t\t\t\t*UVW_BLUR 1.0000"); connToFile.WriteLine("\t\t\t\t*UVW_BLUR_OFFSET 0.0000"); connToFile.WriteLine("\t\t\t\t*UVW_NOUSE_AMT 1.0000"); connToFile.WriteLine("\t\t\t\t*UVW_NOISE_SIZE 1.0000"); connToFile.WriteLine("\t\t\t\t*UVW_NOISE_LEVEL 1"); connToFile.WriteLine("\t\t\t\t*UVW_NOISE_PHASE 0.0000"); connToFile.WriteLine("\t\t\t\t*BITMAP_FILTER Pyramidal"); connToFile.WriteLine("\t\t\t}");// close map diffuse connToFile.WriteLine("\t\t}");// close current sub material } connToFile.WriteLine("\t}");// close dummy material connToFile.WriteLine("}");// close material list // //write geometry // theMatrix = System.CreateDO("Math Package/Matrix Float Data"); 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"); UVTri = System.CreateDO("Space 3D Package/UV Triangle Stream Data"); UVTriWork = System.CreateDO("Space 3D Package/UV Triangle Stream Data"); matStrm = System.CreateDO("Space 3D Package/Material Index Stream Data"); //gives diff result but faceted and smooth versions still the same dN = System.CreateDO('Space 3D Package/Vertex Normal Stream Data'); //dN = System.CreateDO("Space 3D Package/Normals Stream Data"); dNTri = System.CreateDO('Space 3D Package/Triangle Normals Stream Data'); writeGeometry(firstSel); // //for(i=0;i<jumdN;i++) //{ // connToFile.WriteLine(dN.x(i) + " " + dN.y(i) + " " + dN.z(i)); //} // //TODO: do the collision objects in the scene more or less same as above //search scene for collision objects numObj = Node.SubObjectCount(scene); //July 2009 numMat = 1; // for(curobji=0;curobji<numObj;curobji++) { //if name fits call writecoll curObj = Node.SubObject(scene, curobji); //UBX - box - ut3 if(curObj.substr(0,4) == "UBX_") writeGeometry(scene + "/" + curObj); //USP - sphere - ut3 if(curObj.substr(0,4) == "USP_") writeGeometry(scene + "/" + curObj); //UCX - mesh - ut3 if(curObj.substr(0,4) == "UCX_") writeGeometry(scene + "/" + curObj); //MCDBX - box - ut2004 if(curObj.substr(0,6) == "MCDBX_") writeGeometry(scene + "/" + curObj); //MCDSP - sphere - ut2004 if(curObj.substr(0,6) == "MCDSP_") writeGeometry(scene + "/" + curObj); //MCDCY - cylindar - ut2004 if(curObj.substr(0,6) == "MCDCY_") writeGeometry(scene + "/" + curObj); //MCDCX - mesh - ut2004 if(curObj.substr(0,6) == "MCDCX_") writeGeometry(scene + "/" + curObj); } //match names //MCDBX - box //MCDSP - sphere //MCDCY - cylindar //MCDCX - mesh //may also be UBX, USP and UCX see http://udn.epicgames.com/Three/CollisionReference.html#Collision_Models // //close the file // connToFile.Close(); } NScript Object Package/jScript language~൱D@ j#^cstringMyFileNamedJEmNMD^intflipAxis"#rT&K#\"#rT&K#\4W}@O{(XFҦV>g'JNjn*pn CnCj@q@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї[ Control Notes GFʠN=8cd}}CInvert one axis to convert right handed to left handed. Y default.Z`Ez]UO GFʠN=8pc}}bMaterial names come from material nodes inside the mesh. % is changed to / for doom3 ase files.Z`Ez]UO GFʠN=pc}}If the ImportBitmap node from the System-Import library is connected to a node with the Color_shader output, the bitmap filename will be used in the exported file.Z`Ez]UO GFʠN=c,}} Version 1.5Z`Ez]UOOˁ CRih[0c5}}try { sadata = System.CreateDO('Clintons3d Package/File Save As data'); } catch(err) { sadata = false; } if(sadata) { sadata.SetName("3DS ASCII Scene Files (*.ase)~*.ASE~All Files (*.*)~*.*~~"); safile = sadata.GetName(); if(safile != "") { Node.Value('%THIS_NAME%',"MyFileName") = safile; Activity.Run('%THIS_NAME%'); } } else Activity.Run('%THIS_NAME%'); StartZ`Ez]UO#nKSM20c$}}dJEmNMD^ӱZ`Ez]UO GFʠN=0Pc6}}Click Start to ExportZ`Ez]UO1釥GP>aPhc0 }}dJEmNMD^Z`Ez]UO GFʠN=pcC }}No axis conversion"#rT&K#\Z`Ez]UO[~K^3spc2 }}0"#rT&K#\Z`Ez]UO[~K^3spc2 }}1"#rT&K#\Z`Ez]UO[~K^3spc2 }}2"#rT&K#\Z`Ez]UO[~K^3spc2 }}3"#rT&K#\Z`Ez]UO GFʠN=pc> }} Invert X axis"#rT&K#\Z`Ez]UO GFʠN=pc> }} Invert Y axis"#rT&K#\Z`Ez]UO GFʠN=pc> }} Invert Z axis"#rT&K#\Z`Ez]UO GFʠN=xcd}}CInvert one axis to convert right handed to left handed. Y default.Z`Ez]UO}}}}MT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@HoD8ʯȥJH|o7 gH]kDwPz`d8pM*#ͺO2/tfѭ8Lwb"q[5/