public void MapOptions_Turbulence3_Valid() { var mtl = new ObjMaterialFile(); var material = new ObjMaterial("a"); mtl.Materials.Add(material); material.AmbientMap = new ObjMaterialMap("b.b"); material.AmbientMap.Turbulence = new ObjVector3(2.0f, 3.0f, 4.0f); string text = WriteMtl(mtl); string expected = @"newmtl a illum 2 d 1.000000 Ns 0.000000 sharpness 60 Ni 1.000000 map_aat off map_Ka -t 2.000000 3.000000 4.000000 b.b "; AssertExtensions.TextEqual(expected, text); }
public void MapOptions_TextureResolution_Valid() { var mtl = new ObjMaterialFile(); var material = new ObjMaterial("a"); mtl.Materials.Add(material); material.AmbientMap = new ObjMaterialMap("b.b"); material.AmbientMap.TextureResolution = 2; string text = WriteMtl(mtl); string expected = @"newmtl a illum 2 d 1.000000 Ns 0.000000 sharpness 60 Ni 1.000000 map_aat off map_Ka -texres 2 b.b "; AssertExtensions.TextEqual(expected, text); }
public void MapOptions_Clamping_Valid() { var mtl = new ObjMaterialFile(); var material = new ObjMaterial("a"); mtl.Materials.Add(material); material.AmbientMap = new ObjMaterialMap("b.b"); material.AmbientMap.IsClampingEnabled = true; string text = WriteMtl(mtl); string expected = @"newmtl a illum 2 d 1.000000 Ns 0.000000 sharpness 60 Ni 1.000000 map_aat off map_Ka -clamp on b.b "; AssertExtensions.TextEqual(expected, text); }
public void MapOptions_ScalarChannel_Valid(string value, ObjMapChannel channel) { var mtl = new ObjMaterialFile(); var material = new ObjMaterial("a"); mtl.Materials.Add(material); material.AmbientMap = new ObjMaterialMap("b.b"); material.AmbientMap.ScalarChannel = channel; string text = WriteMtl(mtl); string expected = @"newmtl a illum 2 d 1.000000 Ns 0.000000 sharpness 60 Ni 1.000000 map_aat off map_Ka -imfchan " + value + @" b.b "; AssertExtensions.TextEqual(expected, text); }
public void MapOptions_BumpMultiplier_Valid() { var mtl = new ObjMaterialFile(); var material = new ObjMaterial("a"); mtl.Materials.Add(material); material.AmbientMap = new ObjMaterialMap("b.b"); material.AmbientMap.BumpMultiplier = 2.0f; string text = WriteMtl(mtl); string expected = @"newmtl a illum 2 d 1.000000 Ns 0.000000 sharpness 60 Ni 1.000000 map_aat off map_Ka -bm 2.000000 b.b "; AssertExtensions.TextEqual(expected, text); }
public void Write_NullStream_Throws() { var mtl = new ObjMaterialFile(); Assert.Throws <ArgumentNullException>("stream", () => mtl.WriteTo((Stream)null)); }
public void Read_NullStream_Throws() { Assert.Throws <ArgumentNullException>("stream", () => ObjMaterialFile.FromStream(null)); }
public void Read_NullFile_Throws() { Assert.Throws <ArgumentNullException>("path", () => ObjMaterialFile.FromFile(null)); }
private static void WriteObj(Int32Rect[][] tiles, BitmapSource[][][] imagedata, ConvertOptions options) { var positions = new Dictionary <Vector3, int>(); var normals = new Dictionary <Vector3, int>(); var uvs = new Dictionary <Vector2, int>(); var normal = new Vector3(0, 0, 1); var xcount = (options.ImageWidth.Value + options.TileWidth - 1) / options.TileWidth; var ycount = (options.ImageHeight.Value + options.TileHeight - 1) / options.TileHeight; var folder = Path.GetDirectoryName(options.InputFileName); var filename = Path.GetFileNameWithoutExtension(options.InputFileName); var mtl = new ObjMaterialFile(); var obj = new ObjFile(); obj.MaterialLibraries.Add($"{filename}.mtl"); for (var y = 0; y < ycount; y++) { for (var x = 0; x < xcount; x++) { var tile = tiles[y][x]; var texture = imagedata[0][y][x]; var encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(texture)); var matname = $"{filename}_{y:D3}_{x:D3}"; using (var outfile = File.Open(Path.Combine(folder, $"{matname}.png"), FileMode.Create, FileAccess.Write, FileShare.None)) { encoder.Save(outfile); } var material = new ObjMaterial(matname); material.DiffuseMap = new ObjMaterialMap($"{matname}.png"); mtl.Materials.Add(material); var face = new ObjFace(); face.MaterialName = matname; face.Vertices.Add(new ObjTriplet( positions.AddUniqueIndex(new Vector3(tile.X, -(tile.Y), 0)), uvs.AddUniqueIndex(new Vector2(0, (float)tile.Height / texture.PixelHeight)), normals.AddUniqueIndex(normal) )); face.Vertices.Add(new ObjTriplet( positions.AddUniqueIndex(new Vector3(tile.X + tile.Width, -(tile.Y), 0)), uvs.AddUniqueIndex(new Vector2((float)tile.Width / texture.PixelWidth, (float)tile.Height / texture.PixelHeight)), normals.AddUniqueIndex(normal) )); face.Vertices.Add(new ObjTriplet( positions.AddUniqueIndex(new Vector3(tile.X + tile.Width, -(tile.Y + tile.Height), 0)), uvs.AddUniqueIndex(new Vector2((float)tile.Width / texture.PixelWidth, 0)), normals.AddUniqueIndex(normal) )); face.Vertices.Add(new ObjTriplet( positions.AddUniqueIndex(new Vector3(tile.X, -(tile.Y + tile.Height), 0)), uvs.AddUniqueIndex(new Vector2(0, 0)), normals.AddUniqueIndex(normal) )); obj.Faces.Add(face); } } (from x in positions orderby x.Value select x.Key).ToList().ForEach(x => obj.Vertices.Add(x.ToObjVertex())); (from x in normals orderby x.Value select x.Key).ToList().ForEach(x => obj.VertexNormals.Add(x.ToObjVector3())); (from x in uvs orderby x.Value select x.Key).ToList().ForEach(x => obj.TextureVertices.Add(x.ToObjVector3())); mtl.WriteTo(Path.Combine(folder, $"{filename}.mtl")); obj.WriteTo(Path.Combine(folder, $"{filename}.obj")); }