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; }
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 } } } } }