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); }