Example #1
0
        Mesh GenerateMesh(MafiaFormats.Mesh mafiaMesh, GameObject ent, MafiaFormats.LOD firstMafiaLOD, MafiaFormats.Model model, out Material[] materials)
        {
            var mesh = new Mesh();

            List <Material> mats = new List <Material>();

            List <Vector3> unityVerts   = new List <Vector3>();
            List <Vector3> unityNormals = new List <Vector3>();
            List <Vector2> unityUV      = new List <Vector2>();

            foreach (var vert in firstMafiaLOD.vertices)
            {
                unityVerts.Add(vert.pos);
                unityNormals.Add(vert.normal);
                unityUV.Add(new Vector2(vert.uv.x, -1 * vert.uv.y));
            }

            mesh.name = mafiaMesh.meshName;

            mesh.SetVertices(unityVerts);
            mesh.SetUVs(0, unityUV);
            mesh.SetNormals(unityNormals);

            mesh.subMeshCount = firstMafiaLOD.faceGroups.Count;

            var faceGroupId = 0;

            foreach (var faceGroup in firstMafiaLOD.faceGroups)
            {
                List <int> unityIndices = new List <int>();
                foreach (var face in faceGroup.faces)
                {
                    unityIndices.Add(face.a);
                    unityIndices.Add(face.b);
                    unityIndices.Add(face.c);
                }

                mesh.SetTriangles(unityIndices.ToArray(), faceGroupId);

                var matId = (int)Mathf.Max(0, Mathf.Min(model.materials.Count - 1, faceGroup.materialID - 1));

                if (model.materials.Count > 0)
                {
                    var mafiaMat = model.materials[matId];

                    Material mat;

                    if (mafiaMat.flags.HasFlag(MafiaFormats.MaterialFlag.Colorkey))
                    {
                        //mat = new Material(Shader.Find("Legacy Shaders/Transparent/Cutout/Diffuse"));
                        mat = new Material(Shader.Find("Mafia/Cutout"));
                        mat.SetFloat("_Cutoff", 0.9f);
                    }
                    else if (mafiaMat.transparency < 1f)
                    {
                        mat             = new Material(Shader.Find("Legacy Shaders/Transparent/Diffuse"));
                        mat.renderQueue = 2005;
                    }
                    else if (mafiaMat.flags.HasFlag(MafiaFormats.MaterialFlag.AlphaTexture))
                    {
                        mat             = new Material(Shader.Find("Legacy Shaders/Transparent/Diffuse"));
                        mat.renderQueue = 2005;
                    }
                    else
                    {
                        mat = new Material(Shader.Find("Mafia/Diffuse"));
                    }

                    if ((mafiaMat.diffuseMapName != null && mafiaMat.diffuseMapName.Trim().Length > 0) ||
                        (mafiaMat.alphaMapName != null && mafiaMat.alphaMapName.Trim().Length > 0))
                    {
                        if ((mafiaMat.flags & MafiaFormats.MaterialFlag.Colorkey) != 0)
                        {
                            bmp.useTransparencyKey = true;
                        }

                        bool useColorKey = mafiaMat.flags.HasFlag(MafiaFormats.MaterialFlag.Colorkey);

                        Texture2D tex      = LoadTexture(mafiaMat.diffuseMapName, useColorKey, mafiaMat.transparency < 1f);
                        Texture2D alphaTex = LoadTexture(mafiaMat.alphaMapName, useColorKey, true);

                        if (tex != null)
                        {
                            mat.SetTexture("_MainTex", tex);

                            if (GameAPI.instance.cvarManager.Get("filterMode", "1") == "0")
                            {
                                tex.filterMode = FilterMode.Point;
                            }
                        }

                        if (alphaTex != null && mafiaMat.flags.HasFlag(MafiaFormats.MaterialFlag.AlphaTexture))
                        {
                            mat.SetTexture("_MainTex", alphaTex);
                        }

                        if (mafiaMat.flags.HasFlag(MafiaFormats.MaterialFlag.Animated_Texture_Diffuse) || mafiaMat.flags.HasFlag(MafiaFormats.MaterialFlag.Animated_Texture_Alpha))
                        {
                            List <Texture2D> frames = new List <Texture2D>();

                            string fileName = null;

                            if ((mafiaMat.flags & MafiaFormats.MaterialFlag.Animated_Texture_Diffuse) != 0)
                            {
                                fileName = mafiaMat.diffuseMapName;
                            }
                            else
                            {
                                fileName = mafiaMat.alphaMapName;
                            }

                            if ((mafiaMat.flags & MafiaFormats.MaterialFlag.Colorkey) != 0)
                            {
                                bmp.useTransparencyKey = true;
                            }

                            if (fileName != null && fileName.Trim().Length > 0)
                            {
                                var    path     = fileName.Split('.');
                                string baseName = path[0];
                                string ext      = path[1];

                                baseName = baseName.Substring(0, baseName.Length - 2);

                                for (int k = 0; k < mafiaMat.animSequenceLength; k++)
                                {
                                    try
                                    {
                                        var animPath   = Path.Combine("maps", baseName + k.ToString("D2") + "." + ext);
                                        var frameImage = bmp.LoadBMP(GameAPI.instance.fileSystem.GetStreamFromPath(animPath));

                                        if (frameImage == null)
                                        {
                                            continue;
                                        }

                                        var frame = frameImage.ToTexture2D();
                                        frames.Add(frame);
                                    }
                                    catch (Exception ex)
                                    {
                                        Debug.LogError(ex.ToString());
                                    }
                                }

                                var framePlayer = ent.AddComponent <TextureAnimationPlayer>();

                                framePlayer.frames      = frames;
                                framePlayer.framePeriod = mafiaMat.framePeriod;
                                framePlayer.material    = mat;
                            }

                            bmp.useTransparencyKey = false;
                        }
                    }

                    mats.Add(mat);
                }

                faceGroupId++;
            }

            materials = mats.ToArray();

            return(mesh);
        }
        Mesh GenerateMesh(MafiaFormats.Mesh mafiaMesh, GameObject ent, MafiaFormats.LOD firstMafiaLOD, MafiaFormats.Model model, out Material[] materials)
        {
            var mesh = new Mesh();

            var             bmp  = new BMPLoader();
            List <Material> mats = new List <Material>();

            List <Vector3> unityVerts   = new List <Vector3>();
            List <Vector3> unityNormals = new List <Vector3>();
            List <Vector2> unityUV      = new List <Vector2>();

            foreach (var vert in firstMafiaLOD.vertices)
            {
                unityVerts.Add(vert.pos);
                unityNormals.Add(vert.normal);
                unityUV.Add(new Vector2(vert.uv.x, -1 * vert.uv.y));
            }

            mesh.name = mafiaMesh.meshName;

            mesh.SetVertices(unityVerts);
            mesh.SetUVs(0, unityUV);
            mesh.SetNormals(unityNormals);

            mesh.subMeshCount = firstMafiaLOD.faceGroups.Count;

            var faceGroupId = 0;

            foreach (var faceGroup in firstMafiaLOD.faceGroups)
            {
                List <int> unityIndices = new List <int>();
                foreach (var face in faceGroup.faces)
                {
                    unityIndices.Add(face.a);
                    unityIndices.Add(face.b);
                    unityIndices.Add(face.c);
                }

                mesh.SetTriangles(unityIndices.ToArray(), faceGroupId);

                var matId = (int)Mathf.Max(0, Mathf.Min(model.materials.Count - 1, faceGroup.materialID - 1));

                if (model.materials.Count > 0)
                {
                    var mafiaMat = model.materials[matId];

                    Material mat;

                    if ((mafiaMat.flags & MafiaFormats.MaterialFlag.Colorkey) != 0)
                    {
                        mat = new Material(Shader.Find("Standard"));
                        mat.SetFloat("_Mode", 1f); // Set rendering mode to Cutout
                        mat.SetFloat("_Glossiness", 0f);
                        mat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
                        mat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
                        mat.SetInt("_ZWrite", 1);
                        mat.DisableKeyword("_ALPHATEST_ON");
                        mat.EnableKeyword("_ALPHABLEND_ON");
                        mat.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                        mat.renderQueue = 3000;
                    }
                    else if (mafiaMat.transparency < 1)
                    {
                        mat = new Material(Shader.Find("Standard"));
                        mat.SetFloat("_Mode", 3f); // Set rendering mode to Transparent
                        mat.SetFloat("_Glossiness", 0f);
                        mat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
                        mat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
                        mat.SetInt("_ZWrite", 1);
                        mat.DisableKeyword("_ALPHATEST_ON");
                        mat.EnableKeyword("_ALPHABLEND_ON");
                        mat.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                        mat.renderQueue = 3000;
                    }
                    else
                    {
                        mat = new Material(Shader.Find("Standard"));
                        mat.SetFloat("_Glossiness", 0f);
                    }

                    //if (matId > 0)
                    {
                        // TODO support more types as well as transparency

                        if (mafiaMat.diffuseMapName != null ||
                            mafiaMat.alphaMapName != null)
                        {
                            if ((mafiaMat.flags & MafiaFormats.MaterialFlag.Colorkey) != 0)
                            {
                                BMPLoader.useTransparencyKey = true;
                            }

                            BMPImage image = null;

                            if ((mafiaMat.flags & MafiaFormats.MaterialFlag.Textured_Diffuse) != 0)
                            {
                                image = bmp.LoadBMP(GameManager.instance.fileSystem.GetPath(Path.Combine("maps", mafiaMat.diffuseMapName)));
                            }
                            else if (mafiaMat.alphaMapName != null)
                            {
                                image = bmp.LoadBMP(GameManager.instance.fileSystem.GetPath(Path.Combine("maps", mafiaMat.alphaMapName)));
                            }

                            BMPLoader.useTransparencyKey = false;

                            if (image != null)
                            {
                                Texture2D tex = image.ToTexture2D();

                                if ((mafiaMat.flags & MafiaFormats.MaterialFlag.Textured_Diffuse) != 0)
                                {
                                    tex.name = mafiaMat.diffuseMapName;
                                }
                                else if (mafiaMat.alphaMapName != null)
                                {
                                    tex.name = mafiaMat.alphaMapName;
                                }

                                mat.SetTexture("_MainTex", tex);

                                if (GameManager.instance.cvarManager.Get("filterMode", "1") == "0")
                                {
                                    tex.filterMode = FilterMode.Point;
                                }
                            }

                            if (mafiaMat.transparency < 1)
                            {
                                mat.SetColor("_Color", new Color32(255, 255, 255, (byte)(mafiaMat.transparency * 255)));
                            }

                            if ((mafiaMat.flags & (MafiaFormats.MaterialFlag.Animated_Texture_Diffuse | MafiaFormats.MaterialFlag.Animated_Texture_Alpha)) != 0)
                            {
                                List <Texture2D> frames = new List <Texture2D>();

                                string fileName = null;

                                if ((mafiaMat.flags & MafiaFormats.MaterialFlag.Animated_Texture_Diffuse) != 0)
                                {
                                    fileName = mafiaMat.diffuseMapName;
                                }
                                else
                                {
                                    fileName = mafiaMat.alphaMapName;
                                }

                                if ((mafiaMat.flags & MafiaFormats.MaterialFlag.Colorkey) != 0)
                                {
                                    BMPLoader.useTransparencyKey = true;
                                }

                                if (fileName != null)
                                {
                                    var    path     = fileName.Split('.');
                                    string baseName = path[0];
                                    string ext      = path[1];

                                    baseName = baseName.Substring(0, baseName.Length - 2);

                                    for (int k = 0; k < mafiaMat.animSequenceLength; k++)
                                    {
                                        try
                                        {
                                            var animPath   = Path.Combine("maps", baseName + k.ToString("D2") + "." + ext);
                                            var frameImage = bmp.LoadBMP(GameManager.instance.fileSystem.GetPath(animPath));

                                            if (frameImage == null)
                                            {
                                                continue;
                                            }

                                            var frame = frameImage.ToTexture2D();
                                            frames.Add(frame);
                                        }
                                        catch (Exception ex)
                                        {
                                            Debug.LogError(ex.ToString());
                                        }
                                    }

                                    var framePlayer = ent.AddComponent <TextureAnimationPlayer>();

                                    framePlayer.frames      = frames;
                                    framePlayer.framePeriod = mafiaMat.framePeriod;
                                    framePlayer.material    = mat;
                                }

                                BMPLoader.useTransparencyKey = false;
                            }
                        }
                    }

                    mats.Add(mat);
                }

                faceGroupId++;
            }

            materials = mats.ToArray();

            return(mesh);
        }