Esempio n. 1
0
        public void Triangulating_polygons()
        {
            var content =
                @"v -1 1 0
v -1 0 0
v 1 0 0
v 1 1 0
v 0 2 0

f 1 2 3 4 5";
            var result = ObjFileParser.Parse(content);

            result.DefaultGroup.Shapes.Count.Should().Be(3);

            var triangle1 = (Triangle)result.DefaultGroup.Shapes[0];

            triangle1.P1.Should().Be(result.Vertices[1]);
            triangle1.P2.Should().Be(result.Vertices[2]);
            triangle1.P3.Should().Be(result.Vertices[3]);

            var triangle2 = (Triangle)result.DefaultGroup.Shapes[1];

            triangle2.P1.Should().Be(result.Vertices[1]);
            triangle2.P2.Should().Be(result.Vertices[3]);
            triangle2.P3.Should().Be(result.Vertices[4]);

            var triangle3 = (Triangle)result.DefaultGroup.Shapes[2];

            triangle3.P1.Should().Be(result.Vertices[1]);
            triangle3.P2.Should().Be(result.Vertices[4]);
            triangle3.P3.Should().Be(result.Vertices[5]);
        }
        public void TrianglesInGroups()
        {
            var input  = @"
v -1 1 0
v -1 0 0
v 1 0 0
v 1 1 0

g FirstGroup
f 1 2 3

g SecondGroup
f 1 3 4
";
            var reader = new StringReader(input);
            var parser = new ObjFileParser(reader);

            var g1 = parser["FirstGroup"];
            var g2 = parser["SecondGroup"];

            var t1 = g1[0] as Triangle;
            var t2 = g2[0] as Triangle;

            Assert.AreEqual(t1.P1, parser.Vertices[0]);
            Assert.AreEqual(t1.P2, parser.Vertices[1]);
            Assert.AreEqual(t1.P3, parser.Vertices[2]);
            Assert.AreEqual(t2.P1, parser.Vertices[0]);
            Assert.AreEqual(t2.P2, parser.Vertices[2]);
            Assert.AreEqual(t2.P3, parser.Vertices[3]);
        }
Esempio n. 3
0
        public void FacesWithNormals()
        {
            var content =
                @"v 0 1 0
v -1 0 0
v 1 0 0

vn -1 0 0
vn 1 0 0
vn 0 1 0

f 1//3 2//1 3//2
f 1/0/3 2/102/1 3/14/2";

            var parser = ObjFileParser.Parse(content);
            var g      = parser.DefaultGroup;
            var t1     = (SmoothTriangle)g.Shapes[0];
            var t2     = (SmoothTriangle)g.Shapes[1];

            t1.P1.Should().Be(parser.Vertices[1]);
            t1.P2.Should().Be(parser.Vertices[2]);
            t1.P3.Should().Be(parser.Vertices[3]);
            t1.N1.Should().Be(parser.Normals[3]);
            t1.N2.Should().Be(parser.Normals[1]);
            t1.N3.Should().Be(parser.Normals[2]);

            t2.P1.Should().Be(parser.Vertices[1]);
            t2.P2.Should().Be(parser.Vertices[2]);
            t2.P3.Should().Be(parser.Vertices[3]);
            t2.N1.Should().Be(parser.Normals[3]);
            t2.N2.Should().Be(parser.Normals[1]);
            t2.N3.Should().Be(parser.Normals[2]);
        }
Esempio n. 4
0
        public SceneBuilder(string input, int width, int height, string floor, double rX, double rY, double rZ)
        {
            bool withFloor = !string.IsNullOrWhiteSpace(floor);

            world = new World();
            world.Lights.Add(new PointLight(new Point(0, 0, 10), Color.White));

            var parser = new ObjFileParser(input);
            var obj    = parser.ObjToGroup;

            obj.Transform = Matrix.Translation(0, withFloor ? parser.Center.y - parser.Min.y : 0, 0)
                            * Matrix.RotationZ(rZ)
                            * Matrix.RotationX(rX)
                            * Matrix.RotationY(rY);
            world.Objects.Add(obj);

            double fov = Math.PI / 3;
            double fromX, fromY, fromZ;
            double toX, toY, toZ;

            if (withFloor)
            {
                var flr = new Plane();
                flr.Material.Color      = GetObjColor(floor);
                flr.Material.Diffuse    = 0.1;
                flr.Material.Specular   = 0.9;
                flr.Material.Shininess  = 300;
                flr.Material.Reflective = 0.5;

                world.Objects.Add(flr);

                fromX = 0.0;
                fromY = 0.1;
                fromZ = 10;
                toX   = 0.0;
                toY   = 0.5;
                toZ   = 0.0;
            }
            else
            {
                var hght   = Math.Max(parser.Max.x - parser.Min.x, Math.Max(parser.Max.y - parser.Min.y, parser.Max.z - parser.Min.z));
                var dist   = Math.Abs(hght / Math.Sin(fov / 2));
                var center = parser.Center;

                fromX = center.x;
                fromY = center.y;
                fromZ = dist + hght;
                toX   = center.x;
                toY   = center.y;
                toZ   = center.z;
            }

            camera           = new Camera(width, height, fov);
            camera.Transform = Matrix.ViewTransform(new Point(fromX, fromY, fromZ),
                                                    new Point(toX, toY, toZ),
                                                    Vector.VectorY);

            ObjFile = true;
        }
        public void TestObjFileNormalVertex()
        {
            var parser = new ObjFileParser(@"..\..\..\..\..\ObjFiles\NormalVertexTest.obj");

            Assert.AreEqual(parser.Normals[1], new Vector(0, 0, 1));
            Assert.AreEqual(parser.Normals[2], new Vector(0.707, 0, -0.707));
            Assert.AreEqual(parser.Normals[3], new Vector(1, 2, 3));
        }
        public void TestObjFileConvertToGroup()
        {
            var parser = new ObjFileParser(@"..\..\..\..\..\ObjFiles\TrianglesTest.obj");
            var g      = parser.ObjToGroup;

            Assert.IsTrue(g.Contains(parser.Groups[0]));
            Assert.IsTrue(g.Contains(parser.Groups[1]));
        }
        public void TestObjFileVertexRecords()
        {
            var parser = new ObjFileParser(@"..\..\..\..\..\ObjFiles\VertexTest.obj");

            Assert.AreEqual(parser.Vertices[1], new Point(-1, 1, 0));
            Assert.AreEqual(parser.Vertices[2], new Point(-1, 0.5, 0));
            Assert.AreEqual(parser.Vertices[3], new Point(1, 0, 0));
            Assert.AreEqual(parser.Vertices[4], new Point(1, 1, 0));
        }
Esempio n. 8
0
        private RTObject BuildAddObj(Values item)
        {
            var file   = item["file"];
            var parser = new ObjFileParser(file.String);
            var obj    = parser.ObjToGroup;

            BuildShape(obj, item);
            return(obj);
        }
Esempio n. 9
0
        public void Converting_an_OBJ_file_to_a_group()
        {
            var path   = Path.Combine(_objFilesDir, "triangles.obj");
            var parser = ObjFileParser.ParseFromFile(path);

            var bundlingGroup = parser.BundlingGroup;

            bundlingGroup.Shapes.Should().Contain(parser.GetGroup("FirstGroup"));
            bundlingGroup.Shapes.Should().Contain(parser.GetGroup("SecondGroup"));
        }
Esempio n. 10
0
        public void Vertex_normal_records()
        {
            var content =
                @"vn 0 0 1
vn 0.707 0 -0.707
vn 1 2 3";
            var parser = ObjFileParser.Parse(content);

            parser.Normals[1].Should().Be(Tuple.Vector(0, 0, 1));
            parser.Normals[2].Should().Be(Tuple.Vector(0.707, 0, -0.707));
            parser.Normals[3].Should().Be(Tuple.Vector(1, 2, 3));
        }
Esempio n. 11
0
        public void Ignoring_unrecognized_lines()
        {
            var gibberish =
                @"There was a young lady named Bright
who traveled much faster than light.
She set out one day
in a relative way,
and came back the previous night.";
            var result = ObjFileParser.Parse(gibberish);

            result.NumberIgnoredLines.Should().Be(5);
        }
        public void VertexNormalRecords()
        {
            var input = @"
vn 0 0 1
vn 0.707 0 -0.707
vn 1 2 3";

            var reader = new StringReader(input);
            var parser = new ObjFileParser(reader);

            Assert.AreEqual(new Vector(0, 0, 1), parser.Normals[0]);
            Assert.AreEqual(new Vector(0.707, 0, -0.707), parser.Normals[1]);
            Assert.AreEqual(new Vector(1, 2, 3), parser.Normals[2]);
        }
        public void IgnoringUnrecognizedLines()
        {
            var input  = @"
There was a young lady named Bright
Who travelled much faster than light
She set out one day
In a relative way
And returned home the previous night
            ";
            var reader = new StringReader(input);
            var parser = new ObjFileParser(reader);

            Assert.AreEqual(5, parser.Ignored);
        }
Esempio n. 14
0
        public void TestObjFileFaces()
        {
            var   parser = new ObjFileParser(@"..\..\..\..\..\ObjFiles\FacesTest.obj");
            Group g      = parser.DefaultGroup;
            var   t1     = g[0] as Triangle;
            var   t2     = g[1] as Triangle;

            Assert.AreEqual(t1.P1, parser.Vertices[1]);
            Assert.AreEqual(t1.P2, parser.Vertices[2]);
            Assert.AreEqual(t1.P3, parser.Vertices[3]);
            Assert.AreEqual(t2.P1, parser.Vertices[1]);
            Assert.AreEqual(t2.P2, parser.Vertices[3]);
            Assert.AreEqual(t2.P3, parser.Vertices[4]);
        }
Esempio n. 15
0
        public void TestObjFileNormalFaces()
        {
            var   parser = new ObjFileParser(@"..\..\..\..\..\ObjFiles\NormalFacesTest.obj");
            Group g      = parser.DefaultGroup;
            var   t1     = g[0] as SmoothTriangle;
            var   t2     = g[1] as SmoothTriangle;

            Assert.AreEqual(t1.P1, parser.Vertices[1]);
            Assert.AreEqual(t1.P2, parser.Vertices[2]);
            Assert.AreEqual(t1.P3, parser.Vertices[3]);
            Assert.AreEqual(t1.N1, parser.Normals[3]);
            Assert.AreEqual(t1.N2, parser.Normals[1]);
            Assert.AreEqual(t1.N3, parser.Normals[2]);
            Assert.AreEqual(t2, t1);
        }
Esempio n. 16
0
        public void Vertex_records()
        {
            var content =
                @"v -1 1 0
v -1.0000 0.5000 0.0000
v 1 0 0
v 1 1 0";
            var result = ObjFileParser.Parse(content);

            result.Vertices.Count.Should().Be(5); // One dummy a index 0
            result.Vertices[1].Should().Be(Tuple.Point(-1, 1, 0));
            result.Vertices[2].Should().Be(Tuple.Point(-1, 0.5, 0));
            result.Vertices[3].Should().Be(Tuple.Point(1, 0, 0));
            result.Vertices[4].Should().Be(Tuple.Point(1, 1, 0));
        }
        public void VertexData()
        {
            var input  = @"
v -1 1 0
v -1.000 0.5000 0.000
v 1 0 0
v 1 1 0
            ";
            var reader = new StringReader(input);
            var parser = new ObjFileParser(reader);

            Assert.AreEqual(new Point(-1, 1, 0), parser.Vertices[0]);
            Assert.AreEqual(new Point(-1, 0.5, 0), parser.Vertices[1]);
            Assert.AreEqual(new Point(1, 0, 0), parser.Vertices[2]);
            Assert.AreEqual(new Point(1, 1, 0), parser.Vertices[3]);
        }
Esempio n. 18
0
        //___________________________________________________________________
        #region cilindro
        public ObjetoGrafico crearCilindro()
        {
            DoublyConectedEdgeList l;
            String        ubicacion;
            ObjFileParser parserPrueba;
            ObjetoGrafico obj;
            Vector3       traslacion = new Vector3(0.0f, 1.0f, 1.0f);

            traslaciones.Add(traslacion);
            l         = new DoublyConectedEdgeList();
            ubicacion = "C:/Users/Agus/Documents/Ejercicio1/cubo2.obj";

            parserPrueba = new ObjFileParser(l, ubicacion);
            l.mostrarfigura();
            Vector3 color = new Vector3(0.0f, 0.0f, 1.0f);

            obj = new ObjetoGrafico(l, color);
            return(obj);
        }
Esempio n. 19
0
        public void Triangles_in_named_groups()
        {
            var path   = Path.Combine(_objFilesDir, "triangles.obj");
            var parser = ObjFileParser.ParseFromFile(path);

            var group1    = parser.GetGroup("FirstGroup");
            var triangle1 = (Triangle)group1.Shapes[0];

            triangle1.P1.Should().Be(parser.Vertices[1]);
            triangle1.P2.Should().Be(parser.Vertices[2]);
            triangle1.P3.Should().Be(parser.Vertices[3]);

            var group2    = parser.GetGroup("SecondGroup");
            var triangle2 = (Triangle)group2.Shapes[0];

            triangle2.P1.Should().Be(parser.Vertices[1]);
            triangle2.P2.Should().Be(parser.Vertices[3]);
            triangle2.P3.Should().Be(parser.Vertices[4]);
        }
Esempio n. 20
0
        public ObjetoGrafico crear(string u, Vector3 posicion, Vector3 rotacion, Vector3 c)
        {
            DoublyConectedEdgeList l;
            String        ubicacion;
            ObjFileParser parserPrueba;
            ObjetoGrafico obj;

            Vector3 traslacion = posicion;

            l         = new DoublyConectedEdgeList();
            ubicacion = u;

            parserPrueba = new ObjFileParser(l, u);
            l.setTraslacion(posicion);
            l.setRotacion(rotacion);
            Vector3 color = c;

            l.setColor(color);
            obj = new ObjetoGrafico(l, color);
            return(obj);
        }
Esempio n. 21
0
        public void Parsing_triangle_faces()
        {
            var content =
                @"v -1 1 0
v -1 0 0
v 1 0 0
v 1 1 0

f 1 2 3
f 1 3 4";
            var result = ObjFileParser.Parse(content);

            var triangle1 = (Triangle)result.DefaultGroup.Shapes[0];

            triangle1.P1.Should().Be(result.Vertices[1]);
            triangle1.P2.Should().Be(result.Vertices[2]);
            triangle1.P3.Should().Be(result.Vertices[3]);

            var triangle2 = (Triangle)result.DefaultGroup.Shapes[1];

            triangle2.P1.Should().Be(result.Vertices[1]);
            triangle2.P2.Should().Be(result.Vertices[3]);
            triangle2.P3.Should().Be(result.Vertices[4]);
        }
Esempio n. 22
0
        public void TestObjFileIgnoreGibberish()
        {
            var parser = new ObjFileParser(@"..\..\..\..\..\ObjFiles\GibberishTest.obj");

            Assert.AreEqual(parser.Ignored, 5);
        }
Esempio n. 23
0
        static void Main(string[] args)
        {
            // True puts object on floor; False centers camera on object without floor.
            bool withFloor = true;

            Console.WriteLine("Generating an ObjFile Rendering!");

            var dt = DateTime.Now;

            Console.WriteLine($"Starting: {dt}");

            // Floor
            var floor = new Plane();

            floor.Material.Color      = Color.Red;
            floor.Material.Diffuse    = 0.1;
            floor.Material.Specular   = 0.9;
            floor.Material.Shininess  = 300;
            floor.Material.Reflective = 0.5;

            var parser = new ObjFileParser(@"..\..\..\..\..\..\ObjFiles\teapot.obj", withFloor);

            var group = parser.ObjToGroup;

            group.Transform = Matrix.Translation(0, withFloor ? parser.Center.y - parser.Min.y : 0, 0)
                              //* Matrix.RotationZ(Math.PI / 2)
                              //* Matrix.RotationX(-Math.PI / 2)
                              //* Matrix.RotationY(Math.PI / 2)
            ;

            int threshold = (int)group.Count / 4;

            if (threshold < 1)
            {
                threshold = 1;
            }
            //group.Divide(1500);

            var time = DateTime.Now - dt;

            Console.WriteLine($"Loading: {time.Hours}:{time.Minutes}:{time.Seconds}");

            var world = new World();

            world.Lights.Add(new PointLight(new Point(0, 0, 10), Color.White));
            world.Objects.Add(group);

            double fov = Math.PI / 3;
            double fromX, fromY, fromZ;
            double toX, toY, toZ;

            if (withFloor)
            {
                world.Objects.Add(floor);

                fromX = 0.0;
                fromY = 0.1;
                fromZ = 10;
                toX   = 0.0;
                toY   = 0.5;
                toZ   = 0.0;
            }
            else
            {
                var height = Math.Max(parser.Max.x - parser.Min.x, Math.Max(parser.Max.y - parser.Min.y, parser.Max.z - parser.Min.z));
                var dist   = Math.Abs(height / Math.Sin(fov / 2));
                var center = parser.Center;

                fromX = center.x;
                fromY = center.y;
                fromZ = dist + height;
                toX   = center.x;
                toY   = center.y;
                toZ   = center.z;
            }

            var camera = new Camera(400, 200, fov);

            camera.Transform = Matrix.ViewTransform(new Point(fromX, fromY, fromZ),
                                                    new Point(toX, toY, toZ),
                                                    Vector.VectorY);

            Console.WriteLine();
            Console.WriteLine($"Minimum: {parser.Min}");
            Console.WriteLine($"Maximum: {parser.Max}");
            Console.WriteLine($"Center: {parser.Center}");
            Console.WriteLine();

            dt = DateTime.Now;
            var c = camera.Render(world);

            time = DateTime.Now - dt;
            Console.WriteLine($"Rendering: {time.Hours}:{time.Minutes}:{time.Seconds}");
            Console.WriteLine($"Finished: {DateTime.Now}");

            System.IO.File.WriteAllText("ObjFile.ppm", c.GetPPM());

            Console.WriteLine("Done!");
            Console.ReadLine();
        }
Esempio n. 24
0
        internal static StaticObject ReadObject(string FileName)
        {
            currentFolder = System.IO.Path.GetDirectoryName(FileName);
            currentFile   = FileName;

#if !DEBUG
            try
            {
#endif
            ObjFileParser parser = new ObjFileParser(System.IO.File.ReadAllLines(currentFile), null, System.IO.Path.GetFileNameWithoutExtension(currentFile), currentFile);
            Model model          = parser.GetModel();

            StaticObject obj    = new StaticObject(Plugin.currentHost);
            MeshBuilder builder = new MeshBuilder(Plugin.currentHost);

            List <Vertex> allVertices = new List <Vertex>();
            foreach (var vertex in model.Vertices)
            {
                allVertices.Add(new Vertex(vertex));
            }

            List <Vector2> allTexCoords = new List <Vector2>();
            foreach (var texCoord in model.TextureCoord)
            {
                allTexCoords.Add(new Vector2(texCoord.X, texCoord.Y));
            }

            List <Vector3> allNormals = new List <Vector3>();
            foreach (var normal in model.Normals)
            {
                allNormals.Add(new Vector3(normal.X, normal.Y, normal.Z));
            }

            foreach (AssimpNET.Obj.Mesh mesh in model.Meshes)
            {
                foreach (Face face in mesh.Faces)
                {
                    int nVerts = face.Vertices.Count;
                    if (nVerts == 0)
                    {
                        throw new Exception("nVertices must be greater than zero");
                    }
                    int v = builder.Vertices.Length;
                    Array.Resize(ref builder.Vertices, v + nVerts);
                    for (int i = 0; i < nVerts; i++)
                    {
                        builder.Vertices[v + i] = allVertices[(int)face.Vertices[i]];
                    }

                    int f = builder.Faces.Length;
                    Array.Resize(ref builder.Faces, f + 1);
                    builder.Faces[f]          = new MeshFace();
                    builder.Faces[f].Vertices = new MeshFaceVertex[nVerts];
                    for (int i = 0; i < nVerts; i++)
                    {
                        builder.Faces[f].Vertices[i].Index = (ushort)i;
                    }
                    builder.Faces[f].Material = 1;

                    int m = builder.Materials.Length;
                    Array.Resize(ref builder.Materials, m + 1);
                    builder.Materials[m] = new OpenBveApi.Objects.Material();
                    uint materialIndex = mesh.MaterialIndex;
                    if (materialIndex != AssimpNET.Obj.Mesh.NoMaterial)
                    {
                        AssimpNET.Obj.Material material = model.MaterialMap[model.MaterialLib[(int)materialIndex]];
                        builder.Materials[m].Color = new Color32((byte)(255 * material.Diffuse.R), (byte)(255 * material.Diffuse.G), (byte)(255 * material.Diffuse.B), (byte)(255 * material.Diffuse.A));
#pragma warning disable 0219
                        //Current openBVE renderer does not support specular color
                        Color24 mSpecular = new Color24((byte)material.Specular.R, (byte)material.Specular.G, (byte)material.Specular.B);
#pragma warning restore 0219
                        builder.Materials[m].EmissiveColor        = new Color24((byte)(255 * material.Emissive.R), (byte)(255 * material.Emissive.G), (byte)(255 * material.Emissive.B));
                        builder.Materials[m].EmissiveColorUsed    = true;                              //TODO: Check exact behaviour
                        builder.Materials[m].TransparentColor     = new Color24((byte)(255 * material.Transparent.R), (byte)(255 * material.Transparent.G), (byte)(255 * material.Transparent.B));
                        builder.Materials[m].TransparentColorUsed = true;

                        if (material.Texture != null)
                        {
                            builder.Materials[m].DaytimeTexture = OpenBveApi.Path.CombineFile(currentFolder, material.Texture);
                            if (!System.IO.File.Exists(builder.Materials[m].DaytimeTexture))
                            {
                                Plugin.currentHost.AddMessage(MessageType.Error, true, "Texure " + builder.Materials[m].DaytimeTexture + " was not found in file " + currentFile);
                                builder.Materials[m].DaytimeTexture = null;
                            }
                        }
                    }

                    int nCoords = face.TexturCoords.Count;
                    for (int i = 0; i < nCoords; i++)
                    {
                        builder.Vertices[i].TextureCoordinates = allTexCoords[(int)face.TexturCoords[i]];
                    }

                    int       nNormals = face.Normals.Count;
                    Vector3[] normals  = new Vector3[nNormals];
                    for (int i = 0; i < nNormals; i++)
                    {
                        normals[i] = allNormals[(int)face.Normals[i]];
                        normals[i].Normalize();
                    }
                    for (int i = 0; i < nNormals; i++)
                    {
                        builder.Faces[0].Vertices[i].Normal = normals[i];
                    }

                    builder.Apply(ref obj);
                    builder = new MeshBuilder(Plugin.currentHost);
                }
            }
            obj.Mesh.CreateNormals();
            return(obj);

#if !DEBUG
        }

        catch (Exception e)
        {
            Plugin.currentHost.AddMessage(MessageType.Error, false, e.Message + " in " + FileName);
            return(null);
        }
#endif
        }
Esempio n. 25
0
        protected override void CreateScenery()
        {
            var parser = ObjFileParser.ParseFromFile("ObjFileParsing\\ObjFiles\\cow-nonormals.obj");

            AddShapesToWorld(parser.BundlingGroup);
        }