Example #1
0
    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));
    }
Example #2
0
    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);
    }