public void TestParseFace3()
        {
            // given
            var expected = new ObjFormat.Face();
            var obj      = new ObjFormat();

            expected.GeometricVertexReferences.AddRange(new List <int> {
                1, 2, 3, 4
            });
            expected.NormalVertexReferences.AddRange(new List <int> {
                1, 2, 3, 4
            });
            expected.TextureVertexReferences.AddRange(new List <int> {
                1, 2, 3, 4
            });
            var completeLayout = "1/1/1 2/2/2 3/3/3 4/4/4";

            // when
            var result = reader.ParseFace(completeLayout, obj);

            // then
            Assert.True(expected.GeometricVertexReferences.SequenceEqual(result.GeometricVertexReferences));
            Assert.True(expected.NormalVertexReferences.SequenceEqual(result.NormalVertexReferences));
            Assert.True(expected.TextureVertexReferences.SequenceEqual(result.TextureVertexReferences));
        }
        public void TestParseFace1()
        {
            // given
            var expected = new ObjFormat.Face();
            var obj      = new ObjFormat();

            expected.GeometricVertexReferences.AddRange(new List <int> {
                3, 4, 25, 26
            });
            var onlyVertexLayout = "3 4 25 26";

            // when
            var result = reader.ParseFace(onlyVertexLayout, obj);

            // then
            Assert.True(expected.GeometricVertexReferences.SequenceEqual(result.GeometricVertexReferences));
        }
        internal ObjFormat.Face ParseFace(string str, ObjFormat obj)
        {
            var faceLayout          = DetermineFaceLayout(str);
            var faceElementsPerLine = str.Split(' ');
            var result = new ObjFormat.Face();

            foreach (var faceElement in faceElementsPerLine)
            {
                if (faceLayout != null && faceLayout.IsMatch(faceElement))
                {
                    if (faceLayout == OnlyVertices)
                    {
                        var vertexRef = ParseFaceElement(faceElement, obj.GeometricVertices.Count);
                        result.GeometricVertexReferences.Add(vertexRef);
                    }
                    else if (faceLayout == Complete)
                    {
                        var elements = faceElement.Split('/');
                        result.GeometricVertexReferences.Add(ParseFaceElement(elements[0], obj.GeometricVertices.Count));
                        result.TextureVertexReferences.Add(ParseFaceElement(elements[1], obj.TextureVertices.Count));
                        result.NormalVertexReferences.Add(ParseFaceElement(elements[2], obj.VertexNormals.Count));
                    }
                    else if (faceLayout == VerticesAndNormals)
                    {
                        var elements = faceElement.Split('/');
                        result.GeometricVertexReferences.Add(ParseFaceElement(elements[0], obj.GeometricVertices.Count));
                        result.NormalVertexReferences.Add(ParseFaceElement(elements[2], obj.VertexNormals.Count));
                    }
                    else if (faceLayout == VerticesAndTexture)
                    {
                        var elements = faceElement.Split('/');
                        result.GeometricVertexReferences.Add(ParseFaceElement(elements[0], obj.GeometricVertices.Count));
                        result.TextureVertexReferences.Add(ParseFaceElement(elements[1], obj.TextureVertices.Count));
                    }
                }
                else
                {
                    throw new FormatException($"Not recognizable .obj face element layout: {faceElement}");
                }
            }

            return(result);
        }
        public void TestParseFace2()
        {
            // given
            var expected = new ObjFormat.Face();
            var obj      = new ObjFormat();

            expected.GeometricVertexReferences.AddRange(new List <int> {
                1, 2, 3, 4
            });
            expected.NormalVertexReferences.AddRange(new List <int> {
                1, 2, 3, 4
            });
            var vertexAndNormalLayout = "1//1 2//2 3//3 4//4";

            // when
            var result = reader.ParseFace(vertexAndNormalLayout, obj);

            // then
            Assert.True(expected.GeometricVertexReferences.SequenceEqual(result.GeometricVertexReferences));
            Assert.True(expected.NormalVertexReferences.SequenceEqual(result.NormalVertexReferences));
        }