GameObject CreateObjectWithID(int idx, Vector3 position, Quaternion rotation, string name) { Parser.Tr2Mesh tr2mesh = m_leveldata.Meshes[idx]; Mesh objmesh = MeshBuilder.CreateObjectMesh(tr2mesh, m_leveldata); return(CreateObject(objmesh, position, rotation, name)); }
public static Mesh CreateObjectMesh(Parser.Tr2Mesh tr2mesh, Parser.Tr2Level leveldata) { Vector3[] sharedVertices = null; if (tr2mesh.NumVertices > 0) { sharedVertices = new Vector3[tr2mesh.NumVertices]; for (int vertAttribCount = 0; vertAttribCount < tr2mesh.NumVertices; vertAttribCount++) { float x = tr2mesh.Vertices[vertAttribCount].x; float y = tr2mesh.Vertices[vertAttribCount].y; float z = tr2mesh.Vertices[vertAttribCount].z; ////print("chk vtx x y z:" +x+ " " +y + " " +z); sharedVertices[vertAttribCount].x = x; sharedVertices[vertAttribCount].y = -y; sharedVertices[vertAttribCount].z = z; } //uv = new Vector2[leveldata.Rooms[chkRoom].RoomData.NumVertices]; } //warning: a variable lengh array in a structure can cause access violence //selected_texObjectIdx = leveldata.Rooms[chkRoom].RoomData.Rectangles[0].Texture; //selected_texObj = leveldata.ObjectTextures[selected_texObjectIdx]; //selected_texTileIdx = selected_texObj.Tile; int NumTexturedTriangles = tr2mesh.NumTexturedTriangles; int NumTexturedRectangles = tr2mesh.NumTexturedRectangles; int numNonsharedVertices = (NumTexturedRectangles * 4) + (NumTexturedTriangles * 3); int numNonsharedTris = (NumTexturedRectangles * 3 * 2) + (NumTexturedTriangles * 3); Vector3[] nonSharedVertices = new Vector3[numNonsharedVertices]; Vector2[] nonSharedUVs = new Vector2[numNonsharedVertices]; int[] nonSharedTris = new int[numNonsharedTris]; //triangles = new int[leveldata.Rooms[chkRoom].RoomData.NumRectangles * 3 * 2]; Parser.Tr2Face4[] TexturedRectangles = tr2mesh.TexturedRectangles; for (int rectCount = 0; rectCount < NumTexturedRectangles; rectCount++) { int Idx0 = TexturedRectangles[rectCount].Vertices0; int Idx1 = TexturedRectangles[rectCount].Vertices1; int Idx2 = TexturedRectangles[rectCount].Vertices2; int Idx3 = TexturedRectangles[rectCount].Vertices3; int vertOrUVIdx0 = rectCount * 4 + 0; int vertOrUVIdx1 = rectCount * 4 + 1; int vertOrUVIdx2 = rectCount * 4 + 2; int vertOrUVIdx3 = rectCount * 4 + 3; nonSharedVertices[vertOrUVIdx0] = sharedVertices[Idx0]; nonSharedVertices[vertOrUVIdx1] = sharedVertices[Idx1]; nonSharedVertices[vertOrUVIdx2] = sharedVertices[Idx2]; nonSharedVertices[vertOrUVIdx3] = sharedVertices[Idx3]; ushort texObjectIdx = TexturedRectangles[rectCount].Texture; if (texObjectIdx >= leveldata.ObjectTextures.Length) { continue; //fixed: outof bound exception for Parser.Tr2Level.ObjectTextures } Parser.Tr2ObjectTexture texObj = leveldata.ObjectTextures[texObjectIdx]; ushort texTileIdx = texObj.Tile; //bind this textile in material? //if(texTileIdx != prevTexture) //{ //newMatCount +=1; //prevTexture = texTileIdx; ////print("newMatCount:"+ newMatCount); //} SetFaceUVs(nonSharedUVs, vertOrUVIdx0, vertOrUVIdx1, vertOrUVIdx2, vertOrUVIdx3, texObj); ////print("uv[Idx0]"+ uv[Idx0].x + " " + uv[Idx0].y); ////print("uv[Idx1]"+ uv[Idx1].x + " " + uv[Idx1].y); //ushort opacity = texObj.TransparencyFlags; //isItOpacq nonSharedTris[rectCount * 6 + 0] = vertOrUVIdx0; nonSharedTris[rectCount * 6 + 1] = vertOrUVIdx1; nonSharedTris[rectCount * 6 + 2] = vertOrUVIdx2; nonSharedTris[rectCount * 6 + 3] = vertOrUVIdx2; nonSharedTris[rectCount * 6 + 4] = vertOrUVIdx3; nonSharedTris[rectCount * 6 + 5] = vertOrUVIdx0; } Parser.Tr2Face3[] TexturedTriangles = tr2mesh.TexturedTriangles; for (int triCount = 0; triCount < NumTexturedTriangles; triCount++) { int Idx0 = TexturedTriangles[triCount].Vertices0; int Idx1 = TexturedTriangles[triCount].Vertices1; int Idx2 = TexturedTriangles[triCount].Vertices2; int vertOrUVIdx0 = triCount * 3 + 0; int vertOrUVIdx1 = triCount * 3 + 1; int vertOrUVIdx2 = triCount * 3 + 2; int strideVertIdx = (NumTexturedRectangles * 4); int strideTriIdx = (NumTexturedRectangles * 3 * 2); nonSharedVertices[strideVertIdx + vertOrUVIdx0] = sharedVertices[Idx0]; nonSharedVertices[strideVertIdx + vertOrUVIdx1] = sharedVertices[Idx1]; nonSharedVertices[strideVertIdx + vertOrUVIdx2] = sharedVertices[Idx2]; ushort texObjectIdx = tr2mesh.TexturedTriangles[triCount].Texture; if (texObjectIdx >= leveldata.ObjectTextures.Length) { continue; //fixed: outof bound exception for Parser.Tr2Level.ObjectTextures } Parser.Tr2ObjectTexture texObj = leveldata.ObjectTextures[texObjectIdx]; //if(texTileIdx != prevTexture) //{ //newMatCount +=1; //prevTexture = texTileIdx; ////print("newMatCount:"+ newMatCount); //} SetFaceUVs(nonSharedUVs, strideVertIdx + vertOrUVIdx0, strideVertIdx + vertOrUVIdx1, strideVertIdx + vertOrUVIdx2, texObj); ////print("uv[Idx0]"+ uv[Idx0].x + " " + uv[Idx0].y); ////print("uv[Idx1]"+ uv[Idx1].x + " " + uv[Idx1].y); //ushort opacity = texObj.TransparencyFlags; //isItOpacq nonSharedTris[strideTriIdx + vertOrUVIdx0] = strideVertIdx + vertOrUVIdx0; nonSharedTris[strideTriIdx + vertOrUVIdx1] = strideVertIdx + vertOrUVIdx1; nonSharedTris[strideTriIdx + vertOrUVIdx2] = strideVertIdx + vertOrUVIdx2; } for (int i = 0; i < nonSharedVertices.Length; i++) { nonSharedVertices[i] = nonSharedVertices[i] * Settings.SceneScaling; } Mesh mesh = new Mesh(); mesh.Clear(); mesh.vertices = nonSharedVertices; mesh.uv = nonSharedUVs; mesh.triangles = nonSharedTris; MeshModifier.VertexWeild(mesh); #if UNITY_EDITOR Vector4[] tangents = new Vector4[mesh.vertices.Length]; computeTangentsAndBinormals(mesh.vertices, mesh.normals, mesh.uv, mesh.triangles, tangents); mesh.tangents = tangents; tangents = null; #endif //free some memory nonSharedVertices = null; nonSharedUVs = null; nonSharedTris = null; return(mesh); }