コード例 #1
0
 protected override void RecognizeByte(uint lastVertexId, IntPtr pointer, OneIndexBufferPtr oneIndexBufferPtr, List<RecognizedPrimitiveIndex> lastIndexIdList, uint primitiveRestartIndex)
 {
     int length = oneIndexBufferPtr.Length;
     unsafe
     {
         var array = (byte*)pointer.ToPointer();
         long nearestRestartIndex = -1;
         uint i = 0;
         while (i < length && array[i] == primitiveRestartIndex)
         { nearestRestartIndex = i; i++; }
         for (i = i + 2; i < length; i++)
         {
             var value = array[i];
             if (value == primitiveRestartIndex)
             {
                 // try the loop back line.
                 nearestRestartIndex = i;
             }
             else if (value == lastVertexId
                 && array[i - 1] != primitiveRestartIndex
                 && array[nearestRestartIndex + 1] != primitiveRestartIndex
                 && nearestRestartIndex + 2 < i)
             {
                 var item = new RecognizedPrimitiveIndex(lastVertexId, i);
                 item.IndexIdList.Add(array[nearestRestartIndex + 1]);
                 item.IndexIdList.Add(array[i - 1]);
                 item.IndexIdList.Add(value);
                 lastIndexIdList.Add(item);
             }
         }
     }
 }
コード例 #2
0
        internal override uint[] Search(RenderEventArgs arg,
                                        int x, int y,
                                        uint lastVertexId, ZeroIndexRenderer modernRenderer)
        {
            OneIndexBufferPtr indexBufferPtr = null;

            using (var buffer = new OneIndexBuffer(IndexElementType.UInt, DrawMode.Lines, BufferUsage.StaticDraw))
            {
                buffer.Create(6);
                unsafe
                {
                    var array = (uint *)buffer.Header.ToPointer();
                    array[0] = lastVertexId - 2; array[1] = lastVertexId - 0;
                    array[2] = lastVertexId - 4; array[3] = lastVertexId - 2;
                    array[4] = lastVertexId - 0; array[5] = lastVertexId - 4;
                }

                indexBufferPtr = buffer.GetBufferPtr() as OneIndexBufferPtr;
            }

            modernRenderer.Render4InnerPicking(arg, indexBufferPtr);
            uint id = ColorCodedPicking.ReadPixel(x, arg.CanvasRect.Height - y - 1);

            indexBufferPtr.Dispose();

            if (id + 4 == lastVertexId)
            {
                return(new uint[] { id + 4, id, });
            }
            else
            {
                return(new uint[] { id - 2, id, });
            }
        }
コード例 #3
0
 protected override void RecognizeUInt(uint lastVertexId, IntPtr pointer, OneIndexBufferPtr oneIndexBufferPtr, List<RecognizedPrimitiveIndex> lastIndexIdList, uint primitiveRestartIndex)
 {
     int length = oneIndexBufferPtr.Length;
     unsafe
     {
         var array = (uint*)pointer.ToPointer();
         for (uint i = 0; i < length; i++)
         {
             var value = array[i];
             if (value == lastVertexId)
             {
                 var item = new RecognizedPrimitiveIndex(lastVertexId, i);
                 item.IndexIdList.Add(value);
                 lastIndexIdList.Add(item);
             }
         }
     }
 }
コード例 #4
0
 protected override void RecognizeByte(uint lastVertexId, IntPtr pointer, OneIndexBufferPtr oneIndexBufferPtr, List<RecognizedPrimitiveIndex> lastIndexIdList)
 {
     int length = oneIndexBufferPtr.Length;
     unsafe
     {
         var array = (byte*)pointer.ToPointer();
         uint i = 0;
         for (i = i + 2; i < length; i++)
         {
             var value = array[i];
             if (value == lastVertexId)
             {
                 var item = new RecognizedPrimitiveIndex(lastVertexId, i);
                 item.IndexIdList.Add(array[0]);
                 item.IndexIdList.Add(array[i - 1]);
                 item.IndexIdList.Add(value);
                 lastIndexIdList.Add(item);
             }
         }
     }
 }
コード例 #5
0
        /// <summary>
        /// 识别出以<see cref="lastVertexId"/>结尾的图元。
        /// </summary>
        /// <param name="lastVertexId"></param>
        /// <param name="pointer"></param>
        /// <param name="oneIndexBufferPtr"></param>
        /// <returns></returns>
        public List<RecognizedPrimitiveIndex> Recognize(
         uint lastVertexId, IntPtr pointer, OneIndexBufferPtr oneIndexBufferPtr)
        {
            var lastIndexIdList = new List<RecognizedPrimitiveIndex>();
            switch (oneIndexBufferPtr.Type)
            {
                case IndexElementType.UnsignedByte:
                    RecognizeByte(lastVertexId, pointer, oneIndexBufferPtr, lastIndexIdList);
                    break;
                case IndexElementType.UnsignedShort:
                    RecognizeUShort(lastVertexId, pointer, oneIndexBufferPtr, lastIndexIdList);
                    break;
                case IndexElementType.UnsignedInt:
                    RecognizeUInt(lastVertexId, pointer, oneIndexBufferPtr, lastIndexIdList);
                    break;
                default:
                    throw new NotImplementedException();
            }

            return lastIndexIdList;
        }
コード例 #6
0
 protected override void RecognizeUInt(uint lastVertexId, IntPtr pointer, OneIndexBufferPtr oneIndexBufferPtr, List<RecognizedPrimitiveIndex> lastIndexIdList)
 {
     int length = oneIndexBufferPtr.Length;
     unsafe
     {
         var array = (uint*)pointer.ToPointer();
         long nearestRestartIndex = -1;
         uint i = 0;
         for (i = i + 2; i < length; i++)
         {
             var value = array[i];
             if (value == lastVertexId
                 && (i - nearestRestartIndex) % 3 == 0)
             {
                 var item = new RecognizedPrimitiveIndex(lastVertexId, i);
                 item.IndexIdList.Add(array[i - 2]);
                 item.IndexIdList.Add(array[i - 1]);
                 item.IndexIdList.Add(value);
                 lastIndexIdList.Add(item);
             }
         }
     }
 }
コード例 #7
0
 public OneIndexBufferPtrController(OneIndexBufferPtr ptr)
 {
     // TODO: Complete member initialization
     this.ptr = ptr;
 }
コード例 #8
0
 protected override void RecognizeUShort(uint lastVertexId, IntPtr pointer, OneIndexBufferPtr oneIndexBufferPtr, List<RecognizedPrimitiveIndex> lastIndexIdList, uint primitiveRestartIndex)
 {
     int length = oneIndexBufferPtr.Length;
     unsafe
     {
         var array = (ushort*)pointer.ToPointer();
         long nearestRestartIndex = -1;
         uint i = 0;
         while (i < length && array[i] == primitiveRestartIndex)
         { nearestRestartIndex = i; i++; }
         for (i = i + 1; i < length; i++)
         {
             var value = array[i];
             if (value == primitiveRestartIndex)
             {
                 nearestRestartIndex = i;
             }
             else if (value == lastVertexId
                 && array[i - 1] != primitiveRestartIndex
                 && (i - nearestRestartIndex) % 2 == 0)
             {
                 var item = new RecognizedPrimitiveIndex(lastVertexId, i);
                 item.IndexIdList.Add(array[i - 1]);
                 item.IndexIdList.Add(value);
                 lastIndexIdList.Add(item);
             }
         }
     }
 }
コード例 #9
0
        /// <summary>
        /// 将共享点前移,然后重新渲染、拾取
        /// </summary>
        /// <param name="recognizedPrimitiveIndex0"></param>
        /// <param name="recognizedPrimitiveIndex1"></param>
        /// <param name="drawMode"></param>
        /// <param name="oneIndexBufferPtr"></param>
        /// <param name="lastIndex0"></param>
        /// <param name="lastIndex1"></param>
        private void AssembleIndexBuffer(
            RecognizedPrimitiveIndex recognizedPrimitiveIndex0,
            RecognizedPrimitiveIndex recognizedPrimitiveIndex1,
            DrawMode drawMode,
            out OneIndexBufferPtr oneIndexBufferPtr,
            out uint lastIndex0, out uint lastIndex1)
        {
            List<uint> indexArray = ArrangeIndexes(
                recognizedPrimitiveIndex0, recognizedPrimitiveIndex1, drawMode,
                out lastIndex0, out lastIndex1);
            if (indexArray.Count !=
                recognizedPrimitiveIndex0.IndexIdList.Count
                + 1
                + recognizedPrimitiveIndex1.IndexIdList.Count)
            { throw new Exception(); }

            using (var indexBuffer = new OneIndexBuffer<uint>(drawMode, BufferUsage.StaticDraw))
            {
                indexBuffer.Alloc(
                    recognizedPrimitiveIndex0.IndexIdList.Count
                    + 1
                    + recognizedPrimitiveIndex1.IndexIdList.Count);
                unsafe
                {
                    var array = (uint*)indexBuffer.Header.ToPointer();
                    for (int i = 0; i < indexArray.Count; i++)
                    {
                        array[i] = indexArray[i];
                    }
                }

                oneIndexBufferPtr = indexBuffer.GetBufferPtr() as OneIndexBufferPtr;
            }
        }
コード例 #10
0
 public OneIndexBufferPtrController(OneIndexBufferPtr ptr)
 {
     // TODO: Complete member initialization
     this.ptr = ptr;
 }
コード例 #11
0
 protected abstract void RecognizeUShort(uint lastVertexId, IntPtr pointer, OneIndexBufferPtr oneIndexBufferPtr, List<RecognizedPrimitiveIndex> lastIndexIdList, uint primitiveRestartIndex);
コード例 #12
0
 protected abstract void RecognizeUInt(uint lastVertexId, IntPtr pointer, OneIndexBufferPtr oneIndexBufferPtr, List<RecognizedPrimitiveIndex> lastIndexIdList);