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); } } } }
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, }); } }
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); } } } }
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); } } } }
/// <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; }
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); } } } }
public OneIndexBufferPtrController(OneIndexBufferPtr ptr) { // TODO: Complete member initialization this.ptr = ptr; }
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); } } } }
/// <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; } }
protected abstract void RecognizeUShort(uint lastVertexId, IntPtr pointer, OneIndexBufferPtr oneIndexBufferPtr, List<RecognizedPrimitiveIndex> lastIndexIdList, uint primitiveRestartIndex);
protected abstract void RecognizeUInt(uint lastVertexId, IntPtr pointer, OneIndexBufferPtr oneIndexBufferPtr, List<RecognizedPrimitiveIndex> lastIndexIdList);