Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        public void Write_NullStream_Throws()
        {
            var mtl = new ObjMaterialFile();

            Assert.Throws <ArgumentNullException>("stream", () => mtl.WriteTo((Stream)null));
        }
Esempio n. 7
0
 public void Read_NullStream_Throws()
 {
     Assert.Throws <ArgumentNullException>("stream", () => ObjMaterialFile.FromStream(null));
 }
Esempio n. 8
0
 public void Read_NullFile_Throws()
 {
     Assert.Throws <ArgumentNullException>("path", () => ObjMaterialFile.FromFile(null));
 }
Esempio n. 9
0
        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"));
        }