示例#1
0
        internal static int InternalBinarySearch(SegmentedArray <T> array, int index, int length, T value, IComparer <T> comparer)
        {
            LorettaDebug.Assert(index >= 0 && length >= 0 && (array.Length - index >= length), "Check the arguments in the caller!");

            int lo = index;
            int hi = index + length - 1;

            while (lo <= hi)
            {
                int i     = lo + ((hi - lo) >> 1);
                int order = comparer.Compare(array[i], value);

                if (order == 0)
                {
                    return(i);
                }
                if (order < 0)
                {
                    lo = i + 1;
                }
                else
                {
                    hi = i - 1;
                }
            }

            return(~lo);
        }
 private static void ResetToSequence(SegmentedArray <IntPtr> array)
 {
     for (var i = 0; i < array.Length; i++)
     {
         array[i] = (IntPtr)i;
     }
 }
示例#3
0
 private IEnumerable <Point3D> Point3DFromLinearCoordinates(SegmentedArray <STL_Showcase.Logic.Rendering.Mesh3D.Vertexh> vertices)
 {
     for (int i = 0; i < vertices.Length; i++)
     {
         yield return(new Point3D(vertices[i].x, vertices[i].y, vertices[i].z));
     }
 }
示例#4
0
 public UnalignedSegmentEnumerable(
     SegmentedArray <T> first,
     SegmentedArray <T> second,
     int length
     ) : this(first, 0, second, 0, length)
 {
 }
示例#5
0
 public void GlobalSetup()
 {
     _values                = new int[Count];
     _valuesObject          = new object?[Count];
     _segmentedValues       = new SegmentedArray <int>(Count);
     _segmentedValuesObject = new SegmentedArray <object?>(Count);
 }
示例#6
0
 private IEnumerable <Point3D> Point3DFromLinearCoordinates(SegmentedArray <Half> vertices)
 {
     for (int i = 0; i + 2 < vertices.Length; i += 3)
     {
         yield return(new Point3D(vertices[i], vertices[i + 1], vertices[i + 2]));
     }
 }
示例#7
0
        public TokenStream(TreeData treeData, SyntaxFormattingOptions options, TextSpan spanToFormat, AbstractTriviaDataFactory factory)
        {
            using (Logger.LogBlock(FunctionId.Formatting_TokenStreamConstruction, CancellationToken.None))
            {
                // initialize basic info
                _factory  = factory;
                _treeData = treeData;
                _options  = options;

                // use some heuristics to get initial size of list rather than blindly start from default size == 4
                var sizeOfList = spanToFormat.Length / MagicTextLengthToTokensRatio;
                _tokens = new SegmentedList <SyntaxToken>(sizeOfList);
                _tokens.AddRange(_treeData.GetApplicableTokens(spanToFormat));

                Debug.Assert(this.TokenCount > 0);

                // initialize trivia related info
                _cachedOriginalTriviaInfo = new SegmentedArray <TriviaData>(this.TokenCount - 1);

                // Func Cache
                _getTriviaData         = this.GetTriviaData;
                _getOriginalTriviaData = this.GetOriginalTriviaData;
            }

            DebugCheckTokenOrder();
        }
        public void TestIndexer(int length)
        {
            var data = new SegmentedArray <IntPtr>(length);

            ResetToSequence(data);

            for (var i = 0; i < length; i++)
            {
                data[i] = (IntPtr)i;
            }

            for (var i = 0; i < length; i++)
            {
                Assert.Equal((IntPtr)i, data[i]);
            }

            for (var i = 0; i < length; i++)
            {
                ref var value = ref data[i];
                Assert.Equal((IntPtr)i, data[i]);
                value = IntPtr.Add(value, 1);

                Assert.Equal((IntPtr)(i + 1), value);
                Assert.Equal((IntPtr)(i + 1), data[i]);
            }
示例#9
0
 public UnalignedSegmentEnumerable(SegmentedArray <T> first, int firstOffset, SegmentedArray <T> second, int secondOffset, int length)
 {
     _first        = first;
     _firstOffset  = firstOffset;
     _second       = second;
     _secondOffset = secondOffset;
     _length       = length;
 }
示例#10
0
            public SegmentEnumerable(SegmentedArray<T> array, int offset, int length)
            {
                if (offset < 0 || length < 0 || (uint)(offset + length) > (uint)array.Length)
                    ThrowHelper.ThrowArgumentOutOfRangeException();

                _array = array;
                _offset = offset;
                _length = length;
            }
示例#11
0
        public Mesh3D(SegmentedArray <Vertexh> vertices, SegmentedArray <int> triangles, Half[] faceNormals = null)
        {
            this.Vertices      = vertices;
            this.Triangles     = triangles;
            this.vertexNormals = faceNormals;

            Scale   = 1f;
            OffsetX = 0f;
            OffsetY = 0f;
            OffsetZ = 0f;
        }
示例#12
0
        public void GlobalSetup()
        {
            _values                = new List <int>(Count);
            _valuesObject          = new List <object?>(Count);
            _segmentedValues       = new Microsoft.CodeAnalysis.Collections.SegmentedList <int>(Count);
            _segmentedValuesObject = new Microsoft.CodeAnalysis.Collections.SegmentedList <object?>(Count);

            _insertValues                = new int[100];
            _insertValuesObject          = new object?[100];
            _segmentedInsertValues       = new SegmentedArray <int>(100);
            _segmentedInsertValuesObject = new SegmentedArray <object?>(100);
        }
示例#13
0
        static Mesh3D ParseSTLASCII(ModelFileData fileData)
        {
            // STL ASCII Format: https://en.wikipedia.org/wiki/STL_(file_format)#Binary_STL

            if (!fileData.HasBytes())
            {
                return(null);
            }

            List <Mesh3D.Vertexh> vertices = new List <Mesh3D.Vertexh>();

            try
            {
                Stream fileDataStream = fileData.GetStream();
                fileDataStream.Position = 0;
                StreamReader reader = new StreamReader(fileDataStream);
                while (!reader.EndOfStream)
                {
                    string line = reader.ReadLine().TrimStart();
                    if (!line.StartsWith("vertex"))
                    {
                        continue;
                    }

                    for (int i = 0; i < 3; i++)
                    {
                        var matches = Regex.Matches(line, FloatStringPattern);
                        vertices.Add(new Mesh3D.Vertexh(
                                         Half.Parse(matches[0].Value),
                                         Half.Parse(matches[1].Value),
                                         Half.Parse(matches[2].Value)
                                         ));
                        line = reader.ReadLine().TrimStart();
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Trace(ex, "Exception when processing file: {FileName}, {FileSizeKB}, {FileType}", fileData.FileName, fileData.FileSizeKB, fileData.FileType.ToString());
                return(null);
            }

            SegmentedArray <Mesh3D.Vertexh> verticesArray  = new SegmentedArray <Mesh3D.Vertexh>(vertices.Count);
            SegmentedArray <int>            trianglesArray = new SegmentedArray <int>(vertices.Count);

            for (int i = 0; i < vertices.Count; i++)
            {
                verticesArray[i]  = vertices[i];
                trianglesArray[i] = i;
            }
            return(new Mesh3D(verticesArray, trianglesArray));
        }
示例#14
0
 public static int BinarySearch(SegmentedArray <T> array, int index, int length, T value, IComparer <T>?comparer)
 {
     try
     {
         comparer ??= Comparer <T> .Default;
         return(InternalBinarySearch(array, index, length, value, comparer));
     }
     catch (Exception e)
     {
         ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_IComparerFailed, e);
         return(0);
     }
 }
示例#15
0
        public Mesh3DExtended(SegmentedArray <Half> vertices) : base(vertices)
        {
            this.Triangles = new Triangle[TriangleCount];

            for (int i = 0, j = 0; i < TriangleCount; i++, j += 9)
            {
                Triangles[i] = new Triangle(
                    new Vertex(Vertices[j], Vertices[j + 1], Vertices[j + 2]),
                    new Vertex(Vertices[j + 3], Vertices[j + 4], Vertices[j + 5]),
                    new Vertex(Vertices[j + 6], Vertices[j + 7], Vertices[j + 8])
                    );
            }
        }
        public void TestBasicProperties(int length)
        {
            var data = new SegmentedArray <IntPtr>(length);

            Assert.True(data.IsFixedSize);
            Assert.False(data.IsReadOnly);
            Assert.False(data.IsSynchronized);
            Assert.Equal(length, data.Length);
            Assert.Same(data.GetTestAccessor().Items, data.SyncRoot);

            Assert.Equal(length, ((ICollection)data).Count);
            Assert.Equal(length, ((ICollection <IntPtr>)data).Count);
            Assert.Equal(length, ((IReadOnlyCollection <IntPtr>)data).Count);
        }
        private void ApplyTokenOperations(
            FormattingContext context,
            NodeOperations nodeOperations,
            SegmentedArray <TokenPairWithOperations> tokenOperations,
            CancellationToken cancellationToken)
        {
            var applier = new OperationApplier(context, _formattingRules);

            ApplySpaceAndWrappingOperations(context, tokenOperations, applier, cancellationToken);

            ApplyAnchorOperations(context, tokenOperations, applier, cancellationToken);

            ApplySpecialOperations(context, nodeOperations, applier, cancellationToken);
        }
示例#18
0
        protected override StreamArray build_stream()
        {
            const int src_length = 3;
            var       a          = new SegmentedArray <short>(this._items.Count, src_length);

            for (int i = 0; i < this._items.Count; i++)
            {
                var src  = this._items[i];
                var item = a[i];
                item[0] = src.Section;
                item[1] = src.Row;
                item[2] = src.Cell;
            }
            return(new StreamArray(a.Array, Streams.StreamType.Src, this.Count));
        }
        public void TestConstructor2(int length)
        {
            var data = new SegmentedArray <IntPtr>(length);

            Assert.Equal(length, data.Length);

            var items = data.GetTestAccessor().Items;

            Assert.Equal(length, items.Sum(item => item.Length));

            for (var i = 0; i < items.Length - 1; i++)
            {
                Assert.Equal(SegmentedArray <IntPtr> .TestAccessor.SegmentSize, items[i].Length);
                Assert.True(items[i].Length <= SegmentedArray <IntPtr> .TestAccessor.SegmentSize);
            }
        }
        private SegmentedArray <TokenPairWithOperations> CreateTokenOperation(
            TokenStream tokenStream,
            CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            using (Logger.LogBlock(FunctionId.Formatting_CollectTokenOperation, cancellationToken))
            {
                // pre-allocate list once. this is cheaper than re-adjusting list as items are added.
                var list = new SegmentedArray <TokenPairWithOperations>(tokenStream.TokenCount - 1);

                foreach (var(index, currentToken, nextToken) in tokenStream.TokenIterator)
                {
                    cancellationToken.ThrowIfCancellationRequested();

                    var spaceOperation = _formattingRules.GetAdjustSpacesOperation(currentToken, nextToken);
                    var lineOperation  = _formattingRules.GetAdjustNewLinesOperation(currentToken, nextToken);

                    list[index] = new TokenPairWithOperations(tokenStream, index, spaceOperation, lineOperation);
                }

                return(list);
            }
        }
示例#21
0
        static Mesh3D ParseSTLBinary(ModelFileData fileData)
        {
            // STL Binary Format: https://en.wikipedia.org/wiki/STL_(file_format)#Binary_STL

            if (!fileData.HasBytes())
            {
                return(null);
            }

            byte[] byteBuffer      = new byte[4 * 9];
            int    index           = 80;
            int    byteBufferIndex = 0;

            fileData.ReadBytes(byteBuffer, index, 0, 4);
            int triangleAmount = (int)System.BitConverter.ToUInt32(byteBuffer, 0); index += 4;

            if (triangleAmount <= 0 || fileData.BytesLength < 80 + triangleAmount * 50)
            {
                return(null);
            }

            try
            {
                if (triangleAmount <= 0 || triangleAmount > 10000000)
                {
                    throw new Exception("The STLBinary file has too many triangles.");
                }

                SegmentedArray <int>            triangles = new SegmentedArray <int>(triangleAmount * 3);
                SegmentedArray <Mesh3D.Vertexh> vertices  = new SegmentedArray <Mesh3D.Vertexh>(triangleAmount * 3);

                for (int i = 0; i < triangles.Length;)
                {
                    // Skip reading the facet normal (why STL come with normals???).
                    index += 4 * 3;

                    // Triangle vertices
                    {
                        fileData.ReadBytes(byteBuffer, index, 0, byteBuffer.Length); byteBufferIndex = 0;
                        index += 4 * 9;

                        vertices[i] = new Mesh3D.Vertexh(
                            (Half)System.BitConverter.ToSingle(byteBuffer, byteBufferIndex),
                            (Half)System.BitConverter.ToSingle(byteBuffer, byteBufferIndex += 4),
                            (Half)System.BitConverter.ToSingle(byteBuffer, byteBufferIndex += 4)
                            );
                        triangles[i] = i++;

                        vertices[i] = new Mesh3D.Vertexh(
                            (Half)System.BitConverter.ToSingle(byteBuffer, byteBufferIndex += 4),
                            (Half)System.BitConverter.ToSingle(byteBuffer, byteBufferIndex += 4),
                            (Half)System.BitConverter.ToSingle(byteBuffer, byteBufferIndex += 4)
                            );
                        triangles[i] = i++;

                        vertices[i] = new Mesh3D.Vertexh(
                            (Half)System.BitConverter.ToSingle(byteBuffer, byteBufferIndex += 4),
                            (Half)System.BitConverter.ToSingle(byteBuffer, byteBufferIndex += 4),
                            (Half)System.BitConverter.ToSingle(byteBuffer, byteBufferIndex += 4)
                            );
                        triangles[i] = i++;
                    }

                    // Skip the remaining bytes.
                    index += 2;
                }

                return(new Mesh3D(vertices, triangles));
            }
            catch (Exception ex)
            {
                logger.Trace(ex, "Exception when processing file: {FileName}, {FileSizeKB}, {FileType}", fileData.FileName, fileData.FileSizeKB, fileData.FileType.ToString());
                return(null);
            }
        }
示例#22
0
        static Mesh3D ParseWavefront(ModelFileData fileData)
        {
            // Wavefront OBJ Format: https://en.wikipedia.org/wiki/Wavefront_.obj_file
            if (!fileData.HasBytes())
            {
                return(null);
            }

            List <Mesh3D.Vertexh> vertices  = new List <Mesh3D.Vertexh>();
            List <int>            triangles = new List <int>();

            try
            {
                Stream fileDataStream = fileData.GetStream();
                fileDataStream.Position = 0;
                StreamReader reader = new StreamReader(fileDataStream);
                while (!reader.EndOfStream)
                {
                    string line = reader.ReadLine().TrimStart();
                    if (string.IsNullOrWhiteSpace(line))
                    {
                        continue;
                    }

                    if (line.StartsWith("v "))
                    {
                        var matches = Regex.Matches(line, FloatStringPattern);
                        if (matches.Count >= 6)
                        {   // Dodge the vertex color (or is it supposed to come after x y z? Wikipedia is not clear about it).
                            vertices.Add(new Mesh3D.Vertexh(
                                             Half.Parse(matches[0].Value),
                                             Half.Parse(matches[2].Value),
                                             Half.Parse(matches[4].Value)
                                             ));
                        }
                        else
                        {
                            vertices.Add(new Mesh3D.Vertexh(
                                             Half.Parse(matches[0].Value),
                                             Half.Parse(matches[1].Value),
                                             Half.Parse(matches[2].Value)
                                             ));
                        }
                    }
                    else if (line.StartsWith("f"))
                    {
                        IEnumerable <string> faceIndexes = line.Split(' ').Where(s => s != "f" && !string.IsNullOrWhiteSpace(s));

                        int index0 = triangles.Count; // First index added for this line.
                        for (int i = 0; i < faceIndexes.Count(); i++)
                        {
                            int.TryParse(faceIndexes.ElementAt(i).Split('/').First(), out int parsedIndex);

                            // Handle the face as a triangle fan to support faces with more than 3 vertex (idea from https://notes.underscorediscovery.com/obj-parser-easy-parse-time-triangulation/).
                            if (i >= 3)
                            {
                                triangles.Add(triangles[index0]);
                                triangles.Add(triangles[triangles.Count - 2]);
                            }
                            triangles.Add(parsedIndex - 1); // -1 because our array starts at 0 while the OBJ starts at 1.
                        }
                    }
                    else
                    {
                        continue;
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Trace(ex, "Exception when processing file: {FileName}, {FileSizeKB}, {FileType}", fileData.FileName, fileData.FileSizeKB, fileData.FileType.ToString());
                return(null);
            }

            SegmentedArray <Mesh3D.Vertexh> verticesArray  = new SegmentedArray <Mesh3D.Vertexh>(vertices.Count);
            SegmentedArray <int>            trianglesArray = new SegmentedArray <int>(triangles.Count);

            for (int i = 0; i < vertices.Count; i++)
            {
                verticesArray[i] = vertices[i];
            }

            for (int i = 0; i < triangles.Count; i++)
            {
                trianglesArray[i] = triangles[i];
            }

            return(new Mesh3D(verticesArray, trianglesArray));
        }
 public Enumerator(SegmentedArray <T> array)
 {
     _items           = array._items;
     _nextItemSegment = 0;
     _nextItemIndex   = 0;
     _current         = default !;
示例#24
0
        static Mesh3D Parse3MF(ModelFileData filedData)
        {
#if !X64
            // The library is not supported for no x64 builds.
            return(null);
#else
            // 3MF (3D Manufacturing Format): https://github.com/3MFConsortium/spec_core/blob/master/3MF%20Core%20Specification.md
            // File loading using Lib3MF: https://github.com/3MFConsortium/lib3mf

            List <int>            trianglesList = new List <int>();
            List <Mesh3D.Vertexh> vertexList    = new List <Mesh3D.Vertexh>();

            Lib3MF.CModel model = Lib3MF.Wrapper.CreateModel();
            model.QueryReader("3mf").ReadFromFile(filedData.FileFullPath);

            var meshIterator        = model.GetMeshObjects();
            int lastMeshVertexIndex = 0;

            while (meshIterator.MoveNext())
            {
                var resource = meshIterator.GetCurrent();

                Lib3MF.CMeshObject meshobject = model.GetMeshObjectByID(resource.GetResourceID());

                int triangleAmount = (int)meshobject.GetTriangleCount();
                if (triangleAmount == 0)
                {
                    continue;
                }

                for (int i = 0; i < triangleAmount; i++)
                {
                    var triangle = meshobject.GetTriangle((uint)i);

                    int index0 = trianglesList.Count;
                    for (int j = 0; j < triangle.Indices.Length; j++)
                    {
                        if (j >= 3)
                        {  // Trick to triangulate polygons with more than 3 vertex.
                            trianglesList.Add(trianglesList[index0]);
                            trianglesList.Add(trianglesList[trianglesList.Count - 2]);
                        }
                        trianglesList.Add(lastMeshVertexIndex + (int)triangle.Indices[j]);
                    }
                }

                var vertexAmount = meshobject.GetVertexCount();
                for (int i = 0; i < vertexAmount; i++)
                {
                    var vertex = meshobject.GetVertex((uint)i);
                    vertexList.Add(new Mesh3D.Vertexh((Half)vertex.Coordinates[0], (Half)vertex.Coordinates[1], (Half)vertex.Coordinates[2]));
                }

                lastMeshVertexIndex = vertexList.Count;
            }

            if (trianglesList.Count == 0 || vertexList.Count == 0)
            {
                return(null);
            }

            SegmentedArray <Mesh3D.Vertexh> verticesArray  = new SegmentedArray <Mesh3D.Vertexh>(vertexList.Count);
            SegmentedArray <int>            trianglesArray = new SegmentedArray <int>(trianglesList.Count);
            for (int i = 0; i < vertexList.Count; i++)
            {
                verticesArray[i] = vertexList[i];
            }

            for (int i = 0; i < trianglesList.Count; i++)
            {
                trianglesArray[i] = trianglesList[i];
            }

            return(new Mesh3D(verticesArray, trianglesArray));
#endif
        }
 public SegmentedArraySegment(SegmentedArray <T> array, int start, int length)
 {
     Array  = array;
     Start  = start;
     Length = length;
 }
示例#26
0
 public SegmentEnumerable(SegmentedArray <T> array)
 {
     _array  = array;
     _offset = 0;
     _length = array.Length;
 }