Example #1
0
    private static void LoadStandartMesh(OBJECTINFO objMainInfo, string uniqueMeshName)
    {
        if (BinaryReader.ReadUInt16() == 0)
        {
            numLODs = BinaryReader.ReadByte();

            for (int i = 0; i < numLODs; i++)
            {
                float relativeDistance = BinaryReader.ReadSingle();
                int   numVertices      = BinaryReader.ReadUInt16();

                List <Vector3> positionOfPoint   = new List <Vector3>();
                List <Vector3> normalVector      = new List <Vector3>();
                List <Vector2> textureCoordinate = new List <Vector2>();

                List <int[]> meshTriangles = new List <int[]>();
                List <int>   materialsId   = new List <int>();

                for (int l = 0; l < numVertices; l++)
                {
                    positionOfPoint.Add(CustomReader.ReadType <Vector3>());
                    normalVector.Add(CustomReader.ReadType <Vector3>());
                    textureCoordinate.Add(CustomReader.ReadType <Vector2>());
                }

                int numFaceGroups = BinaryReader.ReadByte();

                for (int l = 0; l < numFaceGroups; l++)
                {
                    List <int> faceTriangles = new List <int>();
                    int        numTriangles  = BinaryReader.ReadUInt16();

                    for (int n = 0; n < numTriangles * 3; n++)
                    {
                        faceTriangles.Add(BinaryReader.ReadUInt16());
                    }

                    int materialId = BinaryReader.ReadUInt16();

                    meshTriangles.Add(faceTriangles.ToArray());
                    materialsId.Add(materialId);
                }

                if (i == rootLod)
                {
                    SMeshInfo sMeshInfo = new SMeshInfo();
                    sMeshInfo.name = uniqueMeshName;
                    sMeshInfo.texs = materialsId.ToArray();

                    sMeshInfo.triangles = meshTriangles.ToArray();
                    sMeshInfo.vertices  = positionOfPoint.ToArray();
                    sMeshInfo.normals   = normalVector.ToArray();
                    sMeshInfo.uv        = textureCoordinate.ToArray();

                    CreateMesh(sMeshInfo, objMainInfo);
                }
            }
        }
    }
Example #2
0
    private static void CreateMesh(SMeshInfo sMeshInfo, OBJECTINFO objMainInfo)
    {
        UniqueMesh.transform.position   = objMainInfo.positionMesh * WorldController.WorldScale;
        UniqueMesh.transform.localScale = objMainInfo.scaleMesh;

        Quaternion fixedRotation = new Quaternion(objMainInfo.rotationMesh.y, objMainInfo.rotationMesh.z, objMainInfo.rotationMesh.w, -objMainInfo.rotationMesh.x);

        UniqueMesh.transform.rotation = fixedRotation;

        MeshRenderer meshRenderer = UniqueMesh.AddComponent <MeshRenderer>();

        meshRenderer.materials = new Material[sMeshInfo.triangles.Length];

        MeshFilter meshFilter = UniqueMesh.AddComponent <MeshFilter>();

        meshFilter.sharedMesh = new Mesh();

        for (int i = 0; i < sMeshInfo.vertices.Length; i++)
        {
            sMeshInfo.vertices[i] = sMeshInfo.vertices[i] * WorldController.WorldScale;
        }

        meshFilter.sharedMesh.subMeshCount = sMeshInfo.triangles.Length;

        meshFilter.sharedMesh.vertices = sMeshInfo.vertices;
        meshFilter.sharedMesh.normals  = sMeshInfo.normals;
        meshFilter.sharedMesh.uv       = sMeshInfo.uv;

        for (int i = 0; i < sMeshInfo.triangles.Length; i++)
        {
            meshRenderer.materials[i].shader      = Shader.Find("Mobile/Diffuse");
            meshRenderer.materials[i].mainTexture = TextureLoader.LoadTexture(_4DSTextures[sMeshInfo.texs[i] - 1]);

            meshFilter.sharedMesh.SetTriangles(sMeshInfo.triangles[i], i);
        }

        meshFilter.sharedMesh.Optimize();
    }