private static int Main(string[] args) { ComputeTemplatePath(); bool overrideFile = false; List <string> files = new List <string>(); foreach (var arg in args) { if (IsOverrideArg(arg)) { overrideFile = true; } else { FileInfo xml = new FileInfo(arg); if (!xml.Exists) { Console.WriteLine("File not found: " + xml.FullName); return(-1); } files.Add(arg); } } if (files.Count < 1) { Console.WriteLine("Model# " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); Console.WriteLine(""); Console.WriteLine("Use:"); Console.WriteLine(" ModelSharp [-override] <model.ms>"); return(1); } int ret = 0; foreach (var file in files) { var modelProcessor = new ModelProcessor(templatesPath, file, overrideFile); modelProcessor.Logger = new Logger(); var result = modelProcessor.Process(); if (!result.Success) { ret = -1; } } if (ret != 0) { Console.WriteLine("Finished with error(s)"); } return(ret); }
public void BasicMeshTests() { var input = CreateBasicMesh(); var processorContext = new TestProcessorContext(TargetPlatform.Windows, "dummy.xnb"); var processor = new ModelProcessor { RotationX = 10, RotationY = 20, RotationZ = 30 }; var output = processor.Process(input, processorContext); // The transform the processor above is applying to the model. var processorXform = Matrix.CreateRotationZ(MathHelper.ToRadians(30))* Matrix.CreateRotationX(MathHelper.ToRadians(10))* Matrix.CreateRotationY(MathHelper.ToRadians(20)); // Test some basics. Assert.NotNull(output); Assert.NotNull(output.Meshes); Assert.AreEqual(2, output.Meshes.Count); Assert.NotNull(output.Bones); Assert.AreEqual(3, output.Bones.Count); Assert.NotNull(output.Root); Assert.AreEqual(output.Root, output.Bones[0]); // Stuff to make the tests below cleaner. var inputMesh1 = input.Children[0] as MeshContent; Assert.NotNull(inputMesh1); var inputMesh2 = input.Children[1] as MeshContent; Assert.NotNull(inputMesh2); // Test the bones. Assert.AreEqual("Root", output.Bones[0].Name); Assert.That(input.Transform, Is.EqualTo(output.Bones[0].Transform).Using(MatrixComparer.Epsilon)); Assert.AreEqual("Mesh1", output.Bones[1].Name); Assert.That(Matrix.Identity, Is.EqualTo(output.Bones[1].Transform).Using(MatrixComparer.Epsilon)); Assert.AreEqual("Mesh2", output.Bones[2].Name); Assert.That(Matrix.Identity, Is.EqualTo(output.Bones[2].Transform).Using(MatrixComparer.Epsilon)); // Test the first mesh. { var mesh = output.Meshes[0]; Assert.AreEqual("Mesh1", mesh.Name); Assert.AreEqual(output.Bones[1], mesh.ParentBone); Assert.AreEqual(inputMesh1, mesh.SourceMesh); Assert.AreEqual(new BoundingSphere(Vector3.Zero, 0), mesh.BoundingSphere); Assert.NotNull(mesh.MeshParts); Assert.AreEqual(1, mesh.MeshParts.Count); var part = mesh.MeshParts[0]; Assert.NotNull(part); Assert.IsNull(part.IndexBuffer); Assert.IsNull(part.VertexBuffer); Assert.AreEqual(0, part.NumVertices); Assert.AreEqual(0, part.PrimitiveCount); Assert.AreEqual(0, part.StartIndex); Assert.AreEqual(0, part.VertexOffset); Assert.IsAssignableFrom<BasicMaterialContent>(part.Material); var material = part.Material as BasicMaterialContent; Assert.NotNull(material); Assert.IsNotEmpty(material.OpaqueData); Assert.IsNull(material.Name); Assert.IsNull(material.Identity); Assert.IsNull(material.Alpha); Assert.IsNull(material.DiffuseColor); Assert.IsNull(material.EmissiveColor); Assert.IsNull(material.SpecularColor); Assert.IsNull(material.SpecularPower); Assert.IsNull(material.Texture); Assert.IsEmpty(material.Textures); Assert.IsTrue(material.OpaqueData.ContainsKey("VertexColorEnabled")); Assert.IsNotNull(material.VertexColorEnabled); Assert.IsFalse(material.VertexColorEnabled.Value); } // Test the second mesh. { var mesh = output.Meshes[1]; Assert.AreEqual("Mesh2", mesh.Name); Assert.AreEqual(output.Bones[2], mesh.ParentBone); Assert.AreEqual(inputMesh2, mesh.SourceMesh); Assert.That(new BoundingSphere(new Vector3(0.3809527f, 0.5858122f, 0.5115654f), 0.8660253f), Is.EqualTo(mesh.BoundingSphere).Using(BoundingSphereComparer.Epsilon)); Assert.NotNull(mesh.MeshParts); Assert.AreEqual(1, mesh.MeshParts.Count); var part = mesh.MeshParts[0]; Assert.NotNull(part); Assert.AreEqual(1, part.PrimitiveCount); Assert.AreEqual(0, part.StartIndex); Assert.AreEqual(0, part.VertexOffset); Assert.AreEqual(3, part.NumVertices); Assert.NotNull(part.IndexBuffer); Assert.AreEqual(3, part.IndexBuffer.Count); Assert.AreEqual(0, part.IndexBuffer[0]); Assert.AreEqual(1, part.IndexBuffer[1]); Assert.AreEqual(2, part.IndexBuffer[2]); Assert.NotNull(part.VertexBuffer); Assert.NotNull(part.VertexBuffer.VertexData); var vertexData = part.VertexBuffer.VertexData; Assert.AreEqual(36, vertexData.Length); var positionArray = ArrayUtil.ConvertTo<Vector3>(vertexData); Assert.AreEqual(3, positionArray.Length); Assert.AreEqual(Vector3.Transform(new Vector3(0, 0, 0), processorXform), positionArray[0]); Assert.AreEqual(Vector3.Transform(new Vector3(1, 0, 0), processorXform), positionArray[1]); Assert.AreEqual(Vector3.Transform(new Vector3(1, 1, 1), processorXform), positionArray[2]); Assert.IsAssignableFrom<BasicMaterialContent>(part.Material); var material = part.Material as BasicMaterialContent; Assert.NotNull(material); Assert.IsNotEmpty(material.OpaqueData); Assert.AreEqual("Material1", material.Name); Assert.IsNull(material.Identity); Assert.IsTrue(material.OpaqueData.ContainsKey("Alpha")); Assert.NotNull(material.Alpha); Assert.AreEqual(0.5f, material.Alpha.Value); Assert.IsTrue(material.OpaqueData.ContainsKey("DiffuseColor")); Assert.NotNull(material.DiffuseColor); Assert.AreEqual(Color.Red.ToVector3(), material.DiffuseColor.Value); Assert.IsNull(material.EmissiveColor); Assert.IsNull(material.SpecularColor); Assert.IsNull(material.SpecularPower); Assert.IsNull(material.Texture); Assert.IsEmpty(material.Textures); Assert.IsTrue(material.OpaqueData.ContainsKey("VertexColorEnabled")); Assert.IsNotNull(material.VertexColorEnabled); Assert.IsFalse(material.VertexColorEnabled.Value); } }
public void DefaultEffectTest() { NodeContent input; { input = new NodeContent(); var mesh = new MeshContent() { Name = "Mesh1" }; mesh.Positions.Add(new Vector3(0, 0, 0)); mesh.Positions.Add(new Vector3(1, 0, 0)); mesh.Positions.Add(new Vector3(1, 1, 1)); var geom = new GeometryContent(); geom.Vertices.Add(0); geom.Vertices.Add(1); geom.Vertices.Add(2); geom.Indices.Add(0); geom.Indices.Add(1); geom.Indices.Add(2); geom.Vertices.Channels.Add(VertexChannelNames.TextureCoordinate(0), new[] { new Vector2(0,0), new Vector2(1,0), new Vector2(1,1), }); var wieghts = new BoneWeightCollection(); wieghts.Add(new BoneWeight("bone1", 0.5f)); geom.Vertices.Channels.Add(VertexChannelNames.Weights(0), new[] { wieghts, wieghts, wieghts }); mesh.Geometry.Add(geom); input.Children.Add(mesh); var bone1 = new BoneContent { Name = "bone1", Transform = Matrix.CreateTranslation(0,1,0) }; input.Children.Add(bone1); var anim = new AnimationContent() { Name = "anim1", Duration = TimeSpan.Zero }; input.Animations.Add(anim.Name, anim); } var processorContext = new TestProcessorContext(TargetPlatform.Windows, "dummy.xnb"); var processor = new ModelProcessor { DefaultEffect = MaterialProcessorDefaultEffect.SkinnedEffect, }; var output = processor.Process(input, processorContext); // TODO: Not sure why, but XNA always returns a BasicMaterialContent // even when we specify SkinnedEffect as the default. We need to fix // the test first before we can enable the assert here. //Assert.IsInstanceOf(typeof(SkinnedMaterialContent), output.Meshes[0].MeshParts[0].Material); }
public void DefaultEffectTest() { NodeContent input; { input = new NodeContent(); var mesh = new MeshContent() { Name = "Mesh1" }; mesh.Positions.Add(new Vector3(0, 0, 0)); mesh.Positions.Add(new Vector3(1, 0, 0)); mesh.Positions.Add(new Vector3(1, 1, 1)); var geom = new GeometryContent(); geom.Vertices.Add(0); geom.Vertices.Add(1); geom.Vertices.Add(2); geom.Indices.Add(0); geom.Indices.Add(1); geom.Indices.Add(2); geom.Vertices.Channels.Add(VertexChannelNames.TextureCoordinate(0), new[] { new Vector2(0, 0), new Vector2(1, 0), new Vector2(1, 1), }); var wieghts = new BoneWeightCollection(); wieghts.Add(new BoneWeight("bone1", 0.5f)); geom.Vertices.Channels.Add(VertexChannelNames.Weights(0), new[] { wieghts, wieghts, wieghts }); mesh.Geometry.Add(geom); input.Children.Add(mesh); var bone1 = new BoneContent { Name = "bone1", Transform = Matrix.CreateTranslation(0, 1, 0) }; input.Children.Add(bone1); var anim = new AnimationContent() { Name = "anim1", Duration = TimeSpan.Zero }; input.Animations.Add(anim.Name, anim); } var processorContext = new ProcessorContext(TargetPlatform.Windows, "dummy.xnb"); var processor = new ModelProcessor { DefaultEffect = MaterialProcessorDefaultEffect.SkinnedEffect, }; var output = processor.Process(input, processorContext); // TODO: Not sure why, but XNA always returns a BasicMaterialContent // even when we specify SkinnedEffect as the default. We need to fix // the test first before we can enable the assert here. //Assert.IsInstanceOf(typeof(SkinnedMaterialContent), output.Meshes[0].MeshParts[0].Material); }
public void BasicMeshTests() { var input = CreateBasicMesh(); var processorContext = new ProcessorContext(TargetPlatform.Windows, "dummy.xnb"); var processor = new ModelProcessor { RotationX = 10, RotationY = 20, RotationZ = 30 }; var output = processor.Process(input, processorContext); // The transform the processor above is applying to the model. var processorXform = Matrix.CreateRotationZ(MathHelper.ToRadians(30)) * Matrix.CreateRotationX(MathHelper.ToRadians(10)) * Matrix.CreateRotationY(MathHelper.ToRadians(20)); // Test some basics. Assert.NotNull(output); Assert.NotNull(output.Meshes); Assert.AreEqual(2, output.Meshes.Count); Assert.NotNull(output.Bones); Assert.AreEqual(3, output.Bones.Count); Assert.NotNull(output.Root); Assert.AreEqual(output.Root, output.Bones[0]); // Stuff to make the tests below cleaner. var inputMesh1 = input.Children[0] as MeshContent; Assert.NotNull(inputMesh1); var inputMesh2 = input.Children[1] as MeshContent; Assert.NotNull(inputMesh2); // Test the bones. Assert.AreEqual("Root", output.Bones[0].Name); Assert.That(input.Transform, Is.EqualTo(output.Bones[0].Transform).Using(MatrixComparer.Epsilon)); Assert.AreEqual("Mesh1", output.Bones[1].Name); Assert.That(Matrix.Identity, Is.EqualTo(output.Bones[1].Transform).Using(MatrixComparer.Epsilon)); Assert.AreEqual("Mesh2", output.Bones[2].Name); Assert.That(Matrix.Identity, Is.EqualTo(output.Bones[2].Transform).Using(MatrixComparer.Epsilon)); // Test the first mesh. { var mesh = output.Meshes[0]; Assert.AreEqual("Mesh1", mesh.Name); Assert.AreEqual(output.Bones[1], mesh.ParentBone); Assert.AreEqual(inputMesh1, mesh.SourceMesh); Assert.AreEqual(new BoundingSphere(Vector3.Zero, 0), mesh.BoundingSphere); Assert.NotNull(mesh.MeshParts); Assert.AreEqual(1, mesh.MeshParts.Count); var part = mesh.MeshParts[0]; Assert.NotNull(part); Assert.IsNull(part.IndexBuffer); Assert.IsNull(part.VertexBuffer); Assert.AreEqual(0, part.NumVertices); Assert.AreEqual(0, part.PrimitiveCount); Assert.AreEqual(0, part.StartIndex); Assert.AreEqual(0, part.VertexOffset); Assert.IsAssignableFrom <BasicMaterialContent>(part.Material); var material = part.Material as BasicMaterialContent; Assert.NotNull(material); Assert.IsNotEmpty(material.OpaqueData); Assert.IsNull(material.Name); Assert.IsNull(material.Identity); Assert.IsNull(material.Alpha); Assert.IsNull(material.DiffuseColor); Assert.IsNull(material.EmissiveColor); Assert.IsNull(material.SpecularColor); Assert.IsNull(material.SpecularPower); Assert.IsNull(material.Texture); Assert.IsEmpty(material.Textures); Assert.IsTrue(material.OpaqueData.ContainsKey("VertexColorEnabled")); Assert.IsNotNull(material.VertexColorEnabled); Assert.IsFalse(material.VertexColorEnabled.Value); } // Test the second mesh. { var mesh = output.Meshes[1]; Assert.AreEqual("Mesh2", mesh.Name); Assert.AreEqual(output.Bones[2], mesh.ParentBone); Assert.AreEqual(inputMesh2, mesh.SourceMesh); Assert.That(new BoundingSphere(new Vector3(0.3809527f, 0.5858122f, 0.5115654f), 0.8660253f), Is.EqualTo(mesh.BoundingSphere).Using(BoundingSphereComparer.Epsilon)); Assert.NotNull(mesh.MeshParts); Assert.AreEqual(1, mesh.MeshParts.Count); var part = mesh.MeshParts[0]; Assert.NotNull(part); Assert.AreEqual(1, part.PrimitiveCount); Assert.AreEqual(0, part.StartIndex); Assert.AreEqual(0, part.VertexOffset); Assert.AreEqual(3, part.NumVertices); Assert.NotNull(part.IndexBuffer); Assert.AreEqual(3, part.IndexBuffer.Count); Assert.AreEqual(0, part.IndexBuffer[0]); Assert.AreEqual(1, part.IndexBuffer[1]); Assert.AreEqual(2, part.IndexBuffer[2]); Assert.NotNull(part.VertexBuffer); Assert.NotNull(part.VertexBuffer.VertexData); var vertexData = part.VertexBuffer.VertexData; Assert.AreEqual(36, vertexData.Length); var positionArray = ArrayUtil.ConvertTo <Vector3>(vertexData); Assert.AreEqual(3, positionArray.Length); Assert.AreEqual(Vector3.Transform(new Vector3(0, 0, 0), processorXform), positionArray[0]); Assert.AreEqual(Vector3.Transform(new Vector3(1, 0, 0), processorXform), positionArray[1]); Assert.AreEqual(Vector3.Transform(new Vector3(1, 1, 1), processorXform), positionArray[2]); Assert.IsAssignableFrom <BasicMaterialContent>(part.Material); var material = part.Material as BasicMaterialContent; Assert.NotNull(material); Assert.IsNotEmpty(material.OpaqueData); Assert.AreEqual("Material1", material.Name); Assert.IsNull(material.Identity); Assert.IsTrue(material.OpaqueData.ContainsKey("Alpha")); Assert.NotNull(material.Alpha); Assert.AreEqual(0.5f, material.Alpha.Value); Assert.IsTrue(material.OpaqueData.ContainsKey("DiffuseColor")); Assert.NotNull(material.DiffuseColor); Assert.AreEqual(Color.Red.ToVector3(), material.DiffuseColor.Value); Assert.IsNull(material.EmissiveColor); Assert.IsNull(material.SpecularColor); Assert.IsNull(material.SpecularPower); Assert.IsNull(material.Texture); Assert.IsEmpty(material.Textures); Assert.IsTrue(material.OpaqueData.ContainsKey("VertexColorEnabled")); Assert.IsNotNull(material.VertexColorEnabled); Assert.IsFalse(material.VertexColorEnabled.Value); } }
private void GenerateCode(object sender, GenerationEventArgs e) { e.OutputFileExtension = ".dot"; string templatesDir = GetInstallPath("templates"); if (!Directory.Exists(templatesDir)) { e.GenerateError("Missing templates from install: " + templatesDir); return; } string libDll = GetInstallPath(GetInstallPath(@"lib\ModelSharp.Lib.dll")); if (!Directory.Exists(templatesDir)) { e.GenerateError("Missing dll from install: " + libDll); return; } string tempFile = Path.GetTempFileName(); string tempDir = null; try { tempDir = Directory.CreateDirectory(tempFile + "_dir").FullName; var modelProcessor = new ModelProcessor(templatesDir, e.InputFilePath, true); modelProcessor.BaseOutputPath = tempDir; modelProcessor.GlobalConfig.ProjectNamespace = e.Namespace; var result = modelProcessor.Process(); // Output to console // foreach (var msg in result.Messages) // { // string txt; // if (msg.Line > 0) // txt = String.Format("[{0}] [{1:0000} : {2:000}] {3}", // msg.Error ? "ERROR" : "INFO ", msg.Line, msg.Column, // msg.Description); // else // txt = String.Format("[{0}] {1}", msg.Error ? "ERROR" : "INFO ", msg.Description); // // Console.WriteLine(txt); // } if (!result.Success) { e.GenerateError("Error generating model"); foreach (var msg in result.Messages) { if (msg.Error) { if (msg.Line > 0) { e.GenerateError(msg.Description, msg.Line - 1, msg.Column); } else { e.GenerateError(msg.Description); } } } return; } //string filename = Path.Combine(tempDir, names.First()); //foreach (var line in File.ReadLines(filename)) //{ // e.OutputCode.AppendLine(line); //} string inputDir = new FileInfo(e.InputFilePath).DirectoryName; MergeFiles(result.NotToChangeFilenames, tempDir, inputDir, false); MergeFiles(result.EditableFilenames, tempDir, inputDir, true); SetSubItems(e, inputDir, result.NotToChangeFilenames); AddToProject(e, inputDir, result.EditableFilenames); EnsureDllIsInProject(e, libDll); } finally { if (tempDir != null) { foreach (var file in Directory.GetFiles(tempDir)) { if (file == "." || file == "..") { continue; } DeleteFile(Path.Combine(tempDir, file), e); } DeleteDir(tempDir, e); } DeleteFile(tempFile, e); } }