public static void ReadMesh(string path, string filename, string texturepath) { if (File.Exists(path + "/" + filename)) { const Assimp.PostProcessSteps flags = ( // Assimp.PostProcessSteps.MakeLeftHanded | Assimp.PostProcessSteps.OptimizeMeshes | Assimp.PostProcessSteps.OptimizeGraph | Assimp.PostProcessSteps.RemoveRedundantMaterials | Assimp.PostProcessSteps.SortByPrimitiveType | Assimp.PostProcessSteps.SplitLargeMeshes | Assimp.PostProcessSteps.Triangulate | Assimp.PostProcessSteps.CalculateTangentSpace | Assimp.PostProcessSteps.GenerateUVCoords | Assimp.PostProcessSteps.GenerateSmoothNormals | Assimp.PostProcessSteps.RemoveComponent | Assimp.PostProcessSteps.JoinIdenticalVertices ); var config = Assimp.aiCreatePropertyStore(); Assimp.aiSetImportPropertyFloat(config, Assimp.AI_CONFIG_PP_CT_MAX_SMOOTHING_ANGLE, 60.0f); // IntPtr scene = Assimp.aiImportFile(path + "/" + filename, (uint)flags); var scene = Assimp.aiImportFileWithProperties(path + "/" + filename, (uint)flags, config); Assimp.aiReleasePropertyStore(config); if (scene == null) { Debug.LogWarning("failed to read file: " + path + "/" + filename); return; } else { var nm = Path.GetFileNameWithoutExtension(filename); var importingAssetsDir = "Assets/Prefabs/" + nm + "/"; if (_SaveAssets) { if (!Directory.Exists(importingAssetsDir)) { Directory.CreateDirectory(importingAssetsDir); } AssetDatabase.Refresh(); } var objectRoot = new GameObject(nm); var meshContainer = new GameObject(nm + "_Mesh"); meshContainer.transform.parent = objectRoot.transform; var materials = new List <Material>(); var meshList = new List <AssimpMesh>(); for (var i = 0; i < Assimp.aiScene_GetNumMaterials(scene); i++) { var matName = Assimp.aiMaterial_GetName(scene, i); matName = nm + "_mat" + i; // string fname = Path.GetFileNameWithoutExtension(Assimp.aiMaterial_GetTexture(scene, i, (int)Assimp.TextureType.Diffuse)); var file_name = Path.GetFileName(Assimp.aiMaterial_GetTexture(scene, i, (int)Assimp.TextureType.Diffuse)); Debug.Log("texture " + file_name + "Material :" + matName); var ambient = Assimp.aiMaterial_GetAmbient(scene, i); var diffuse = Assimp.aiMaterial_GetDiffuse(scene, i); var specular = Assimp.aiMaterial_GetSpecular(scene, i); var emissive = Assimp.aiMaterial_GetEmissive(scene, i); var mat = new Material(Shader.Find("Diffuse")) { name = matName }; var textureName = path + "/" + file_name; var tex = Utils.LoadTex(textureName); //Texture2D tex = Resources.Load(texturename) as Texture2D; //Texture2D tex = (Texture2D)AssetDatabase.LoadAssetAtPath(texturename, typeof(Texture2D)); if (tex != null) { Debug.Log("LOAD (" + textureName + ") texture"); mat.SetTexture("_MainTex", tex); } else { Debug.LogError("Fail LOAD (" + textureName + ") error"); } if (_SaveAssets) { var materialAssetPath = AssetDatabase.GenerateUniqueAssetPath(importingAssetsDir + mat.name + ".asset"); AssetDatabase.CreateAsset(mat, materialAssetPath); } materials.Add(mat); } AssetDatabase.Refresh(); if (Assimp.aiScene_HasMeshes(scene)) { for (var i = 0; i < Assimp.aiScene_GetNumMeshes(scene); i++) { var name = "Mesh_"; name += i.ToString(); var hasNormals = Assimp.aiMesh_HasNormals(scene, i); var hasTexCoord = Assimp.aiMesh_HasTextureCoords(scene, i, 0); var hasFaces = Assimp.aiMesh_HasFaces(scene, i); var mesh = new AssimpMesh(meshContainer, objectRoot, name); mesh.SetMaterial(materials[Assimp.aiMesh_GetMaterialIndex(scene, i)]); meshList.Add(mesh); for (var v = 0; v < Assimp.aiMesh_GetNumVertices(scene, i); v++) { var vertex = Assimp.aiMesh_Vertex(scene, i, v); var n = Assimp.aiMesh_Normal(scene, i, v); var x = Assimp.aiMesh_TextureCoordX(scene, i, v, 0); var y = Assimp.aiMesh_TextureCoordY(scene, i, v, 0); var binormalf = Assimp.aiMesh_Bitangent(scene, i, v); var tangentf = Assimp.aiMesh_Tangent(scene, i, v); var outputTangent = new Vector4(tangentf.x, tangentf.y, tangentf.z, 0.0F); var dp = Vector3.Dot(Vector3.Cross(n, tangentf), binormalf); if (dp > 0.0F) { outputTangent.w = 1.0F; } else { outputTangent.w = -1.0F; } mesh.AddVertex(vertex, n, new Vector2(x, y), outputTangent); //mesh.addVertex(vertex, new Vector3(1 * -n.x, n.y, n.z), new Vector2(x, y), outputTangent); } for (var f = 0; f < Assimp.aiMesh_GetNumFaces(scene, i); f++) { var a = Assimp.aiMesh_Indice(scene, i, f, 0); var b = Assimp.aiMesh_Indice(scene, i, f, 1); var c = Assimp.aiMesh_Indice(scene, i, f, 2); mesh.AddFace(a, b, c); } //********** mesh.Build(); if (_SaveAssets) { var meshAssetPath = AssetDatabase.GenerateUniqueAssetPath(importingAssetsDir + mesh._Name + ".asset"); AssetDatabase.CreateAsset(mesh._Geometry, meshAssetPath); } mesh.Dispose(); } } if (_SaveAssets) { var prefabPath = AssetDatabase.GenerateUniqueAssetPath(importingAssetsDir + filename + ".prefab"); var prefab = PrefabUtility.CreateEmptyPrefab(prefabPath); PrefabUtility.ReplacePrefab(objectRoot, prefab, ReplacePrefabOptions.ConnectToPrefab); AssetDatabase.Refresh(); } meshList.Clear(); } Assimp.aiReleaseImport(scene); Debug.LogWarning(path + "/" + filename + " Imported ;) "); } }