private static void BuildMesh(D3D10.Device d, string meshArgs) { string name = meshArgs.Split(',')[0]; InputElement[] layout = (InputElement[])typeof(MeshInputElements10).GetField(meshArgs.Split(',')[1]).GetValue(typeof(MeshInputElements10)); string fileName = ConfigurationSettings.AppSettings["ExportsFolder"] + name; AssimpImporter importer = new AssimpImporter(); LogStream logstream = new LogStream(delegate(String msg, String userData) { Console.WriteLine(msg); }); importer.AttachLogStream(logstream); importer.Scale = 0; importer.XAxisRotation = 0; importer.YAxisRotation = 0; importer.ZAxisRotation = 0; importer.VerboseLoggingEnabled = true; importer.RemoveConfigs(); Scene model = importer.ImportFile(fileName, PostProcessSteps.CalculateTangentSpace // calculate tangents and bitangents if possible | PostProcessSteps.JoinIdenticalVertices // join identical vertices/ optimize indexing CAUSES A PROBLEM //| PostProcessSteps.ValidateDataStructure // perform a full validation of the loader's output | PostProcessSteps.ImproveCacheLocality // improve the cache locality of the output vertices | PostProcessSteps.RemoveRedundantMaterials // remove redundant materials //| PostProcessSteps.FindDegenerates // remove degenerated polygons from the import CAUSES A PROBLEM //| PostProcessSteps.FindInvalidData // detect invalid model data, such as invalid normal vectors | PostProcessSteps.GenerateUVCoords // convert spherical, cylindrical, box and planar mapping to proper UVs | PostProcessSteps.TransformUVCoords // preprocess UV transformations (scaling, translation ...) //| PostProcessSteps.FindInstances // search for instanced meshes and remove them by references to one master //| PostProcessSteps.LimitBoneWeights // limit bone weights to 4 per vertex | PostProcessSteps.OptimizeMeshes // join small meshes, if possible; | PostProcessSteps.GenerateSmoothNormals // generate smooth normal vectors if not existing | PostProcessSteps.Triangulate // triangulate polygons with more than 3 edges | PostProcessSteps.SortByPrimitiveType // make 'clean' meshes which consist of a single typ of primitives | PostProcessSteps.FlipUVs // common DirectX issue (Xna also) | PostProcessSteps.FixInFacingNormals | PostProcessSteps.MakeLeftHanded | PostProcessSteps.FlipWindingOrder ); MeshHelper.BuildMeshTextures(d, model); Mesh3D m = MeshHelper.LoadFromFile(d, model, layout); importer.Dispose(); Stream stream = File.Open(ConfigurationSettings.AppSettings["ExportsFolder"] + name.Replace(".X", ".mesh"), FileMode.Create); BinaryFormatter bFormatter = new BinaryFormatter(); if (m != null) { bFormatter.Serialize(stream, m); } stream.Close(); }
public void TestImportFromFile() { String path = Path.Combine(TestHelper.RootPath, "TestFiles\\sphere.obj"); AssimpImporter importer = new AssimpImporter(); importer.SetConfig(new NormalSmoothingAngleConfig(55.0f)); importer.Scale = .5f; importer.XAxisRotation = 25.0f; importer.YAxisRotation = 50.0f; importer.VerboseLoggingEnabled = true; Assert.IsTrue(importer.ContainsConfig(NormalSmoothingAngleConfig.NormalSmoothingAngleConfigName)); importer.RemoveConfigs(); Assert.IsFalse(importer.ContainsConfig(NormalSmoothingAngleConfig.NormalSmoothingAngleConfigName)); importer.SetConfig(new NormalSmoothingAngleConfig(65.0f)); importer.SetConfig(new NormalSmoothingAngleConfig(22.5f)); importer.RemoveConfig(NormalSmoothingAngleConfig.NormalSmoothingAngleConfigName); Assert.IsFalse(importer.ContainsConfig(NormalSmoothingAngleConfig.NormalSmoothingAngleConfigName)); importer.SetConfig(new NormalSmoothingAngleConfig(65.0f)); Scene scene = importer.ImportFile(path, PostProcessPreset.TargetRealTimeMaximumQuality); Assert.IsNotNull(scene); Assert.IsTrue((scene.SceneFlags & SceneFlags.Incomplete) != SceneFlags.Incomplete); }