public LogPipe(LogStore logStore) { _logStore = logStore; _stream = new LogStream(LogStreamCallback); _stream.Attach(); }
public static Mesh CreateFromFile(string filePath, bool rotateYZ = false, bool convertToLeftHanded = false, float scale = 1) { Func<Assimp.Vector3D, Vector3> _MakeVector3 = v => new Vector3(v.X, v.Y, v.Z); Func<Assimp.Vector3D, Vector2> _MakeTexCoord = v => { var x = v.X; while (x > 1) x -= 1; while (x < 0) x += 1; var y = v.Y; while (y > 1) y -= 1; while (y < 0) y += 1; return new Vector2(x, y); }; using (var importer = new AssimpImporter()) { if (Config.LoadMeshPrintLog) { LogStream logStream = new LogStream((msg, data) => { Console.WriteLine(string.Format("Assimp: {0}", msg)); }); importer.AttachLogStream(logStream); } PostProcessSteps options = PostProcessSteps.None; if(Config.LoadMeshComputeTangent) options |= PostProcessSteps.CalculateTangentSpace; if(convertToLeftHanded) options |= PostProcessSteps.MakeLeftHanded; var scene = importer.ImportFile(filePath, options); if (!scene.HasMeshes) return null; var builder = new MeshBuilder(); Matrix mat = Matrix.Identity; if(rotateYZ) mat = Matrix.RotationX(-MathUtil.PiOverTwo); foreach (var aiMesh in scene.Meshes) { builder.BeginSubmesh(); for (int i = 0; i < aiMesh.VertexCount; ++i) { var v = new MeshVertex(); v.Position = _MakeVector3(aiMesh.Vertices[i]) * scale; v.Position = Vector3.TransformCoordinate(v.Position, mat); if (aiMesh.HasNormals) { v.Normal = _MakeVector3(aiMesh.Normals[i]); v.Normal = Vector3.TransformNormal(v.Normal, mat); } if (aiMesh.HasTangentBasis) { v.Tangent = _MakeVector3(aiMesh.Tangents[i]); v.Tangent = Vector3.TransformNormal(v.Tangent, mat); } if (aiMesh.HasTextureCoords(0)) { var texCoords = aiMesh.GetTextureCoords(0); v.TexCoord = _MakeTexCoord(texCoords[i]); } builder.Vertex(v); } //aiMesh.GetIntIndices().ToList().ForEach(builder.Index); for (int i = 0; i < aiMesh.FaceCount; ++i) { var face = aiMesh.Faces[i]; for (int j = 1; j < face.IndexCount - 1;++j ) { builder.Index((uint) face.Indices[0]); builder.Index((uint) face.Indices[j]); builder.Index((uint) face.Indices[j+1]); } } //if (scene.HasMaterials) //{ // var folder = System.IO.Path.GetDirectoryName(filePath); // var materialIndex = aiMesh.MaterialIndex; // if (materialIndex >= 0 && materialIndex < scene.Materials.Length) // { // var material = scene.Materials[materialIndex]; // var textures = material.GetTextures(TextureType.Diffuse); // if (textures != null) // { // builder.Texture(0, System.IO.Path.Combine(folder, textures[0].FilePath)); // } // textures = material.GetTextures(TextureType.Ambient); // if (textures != null) // builder.Texture(1, System.IO.Path.Combine(folder, textures[0].FilePath)); // textures = material.GetTextures(TextureType.Specular); // if (textures != null) // builder.Texture(2, System.IO.Path.Combine(folder, textures[0].FilePath)); // } //} builder.EndSubmesh(); } return builder.Complete(); } }