Esempio n. 1
0
 public VirtualGroupGeometryComponent(PartGeometry3D part)
 {
     this.PartGeometry = part;
     Positions         = part.Positions.ToImmutableArray();
     Normals           = part.Positions.ToArray().CalculateNormals(part.Indices.ToArray()).ToImmutableArray();
     Indices           = part.Indices.ToImmutableArray();
     colors            = ImmutableArray <Vector4> .Empty;
 }
Esempio n. 2
0
        public void Read(Stream stream)
        {
            meshes = new Dictionary <string, PartGeometry3D>();

            var group   = new ReadOnlySpan <char>(new[] { 'g' });
            var vector  = new ReadOnlySpan <char>(new[] { 'v' });
            var texture = new ReadOnlySpan <char>(new[] { 'v', 't' });
            var face    = new ReadOnlySpan <char>(new[] { 'f' });
            var comm    = new ReadOnlySpan <char>(new[] { '#' });
            //Memory<byte> buffer = new Memory<byte>();
            var            groupname = "noname";
            PartGeometry3D current   = FullGeometry.CreatePart(groupname);

            using (var reader = new StreamReader(stream)) {
                while (!reader.EndOfStream)
                {
                    var span = reader.ReadLine().AsSpan();
                    if (span.StartsWith(comm) || span.IsWhiteSpace())
                    {
                        continue;
                    }
                    var part = span.Slice(2, span.Length - 2).Trim();
                    if (span.StartsWith(group))
                    {
                        var names = part.Trim().ToString().SplitOnWhitespace();
                        groupname = string.Join(" ", names);                      //[0].ToString();
                        var key = string.Join(" ", names.Take(names.Length - 1)); //[0].ToString();
                        current = FullGeometry.CreatePart(groupname);
                    }
                    else if (span.StartsWith(texture))
                    {
                    }
                    else if (span.StartsWith(vector))
                    {
                        try {
                            var val = SplitFloat(part, ' ');
                            var v   = new Vector3(val[0], val[1], val[2]);

                            FullGeometry1.Positions.Add(v);
                            current.AddPosition(ref v);
                        }catch (Exception ex) {
                            ex.ToString();
                        }
                    }
                    else if (span.StartsWith(face))
                    {
                        var val = SplitInt(part, ' ');

                        if (new HashSet <int>(val).Count != 3)
                        {
                        }

                        FullGeometry1.Indices.AddRange(val);
                        try {
                            current.AddTriangle(val);
                        }catch (Exception ex) {
                            //TODO collect info for displaing in output
                        }
                    }
                }
            }
        }