gH]kDwPxtrueSpace7.6[VS_O93Y&Clinton Reese, RUR`d8pM*#ͺOI)PNG  IHDRXIDATxoEzvkqI;j( !T! $ n='.*$8 DOGQi{wf88M*QJ}j<4MJ)!}4$i8 0zm;DZmۢ(2ƒ$!vvv f0Uzhi' Cڿ,c!L,˔w@!̥w 7ᵪgkHF0 eYvw&?1~A P s+{zz 9?x7"r3( E@JR&P^@23py~$m|bU;D̩s@ಯ^|3;BzĔ7> Xk{pXIENDB`/tfѭ8Lwb"qf48@J g'JNjn*pceZU@䑧rceZU@䑧r$_scriptData*Internal Script data [җJs@ %(4W}@O{4W}@O{$ Owner4Owner of the Encapsulator$(XFҦV(XFҦV"LE2Data$LE2 Data for node >g'JNjn*pLE2Data, 1#J@#QLJ@#QLLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 3MT^RwL~YYTMT^RwL~YYTޢLE2Data$LE2 Data for node >g'JNjn*pLE2Data, 2dJEmNMD^dJEmNMD^DMyFileNameD2|=Bynj2|=Bynj Control OutTransitionOutz@Hoz@Ho Control InTransitionIn 2|=BynjdJEmNMD^PC:\Doom3\mymod\models\mymodels\cube.ase2AEHM'>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"); UVTri = dM.GetTrianglesStreamByName("UV Triangle Stream 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(); numuv = dT.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); xval = -transVect.x * myScale; yval = transVect.y * myScale; zval = 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 // connToFile.WriteLine("\t\t*MESH_NUMTVERTEX " + numuv); connToFile.WriteLine("\t\t*MESH_TVERTLIST {"); for(curuv=0; curuv<numuv;curuv++) { connToFile.WriteLine("\t\t\t*MESH_TVERT " + curuv + "\t" + dT.u(curuv).toFixed(4) + "\t" + dT.v(curuv).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 // //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(); xval = -myNormT.x ; yval = myNormT.y ; zval = 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(); xval = -myVectorT.x ; yval = myVectorT.y ; zval = 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(); xval = -myVectorT.x ; yval = myVectorT.y ; zval = 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(); xval = -myVectorT.x ; yval = myVectorT.y ; zval = 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'); // TODO: put your action code here myScale = 10.0; // 1 inch in doom3 = 0.1 meter in trueSpace //myScale = 0.1;//doom3 ? test 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("}"); 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 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 ); indOffset = 0; for(curmat=0;curmat<numMat;curmat++) { val = indOffset + curmat; subObj = Node.SubObject(matSubObj, val); //not a material if(!Node.ConExists( matSubObj + "/" + subObj,"Material Chunk")) { indOffset=1; val = indOffset + curmat; subObj = Node.SubObject( matSubObj, val); } connToFile.WriteLine("\t\t*SUBMATERIAL " + curmat + " {"); connToFile.WriteLine("\t\t\t*MATERIAL_NAME " + "\"material" + curmat + "\""); 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*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); 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 languagestringMyFileNamedJEmNMD^4W}@O{(XFҦV>g'JNjn*pn|DBh@e@2|=Bynj|?z@Hoۙ>?J@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї  Control Notes Oˁ CRih[ 1a8Activity.Run('%THIS_NAME%') StartZ`Ez]UOOˁ CRih[ 01a:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO#nKSM201$\VVdJEmNMD^ӱZ`Ez]UO GFʠN=0p1}}Click "..." then choose a file or rt click to create a new text file with an "ase" extension instead of "txt". Click Start to save the ase.Z`Ez]UO1釥GP>ap1,dJEmNMD^Z`Ez]UO GFʠN=@0\e}}Click "..." then choose a file or rt click to create a new text file with an "ase" extension instead of "txt". Click Start to save the ase.Z`Ez]UO GFʠN=@P0\eEohh$1 meter in tS => 10 units ase exportƄvR^I҂{iks GFʠN=P`0\eK}}*only single mesh object - no encapsulationZ`Ez]UO GFʠN=`p0\eDrmm#Unrealed collision objects exportedƄvR^I҂{iks GFʠN=p0\e}}Smoothing groups are simulated by copy the mesh and name the copy "smoothingGroups". Each unique material applied to the faces will create smoothing groups in the ase file.Z`Ez]UO GFʠN=0\e~wqq]Only material indices are exported. ASE file must be manually edited to assign bitmap files.ƄvR^I҂{iksMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@HolR l 8ʯȥJH|o7 gH]kDwPx`d8pM*#ͺOxI/tfѭ8Lwb"qf'