/// <summary>
        /// 遍历以<paramref name="lastVertexId"/>为最后一个顶点的图元,
        /// 瞄准每个图元的索引(例如1个三角形有3个索引)中的最后一个索引,
        /// 将此索引在<see cref="IndexBuffer"/>中的索引(位置)收集起来。
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="lastVertexId"></param>
        /// <returns></returns>
        private List <RecognizedPrimitiveInfo> GetLastIndexIdList(PickingEventArgs arg, uint lastVertexId)
        {
            var indexBuffer = this.Renderer.PickingRenderUnit.VertexArrayObject.IndexBuffer;
            PrimitiveRecognizer recognizer = PrimitiveRecognizerFactory.Create(
                (arg.GeometryType.Contains(GeometryType.Point) &&
                 indexBuffer.Mode.ToGeometryType() == GeometryType.Line) ?
                DrawMode.Points : indexBuffer.Mode);

            PrimitiveRestartState glState = GetPrimitiveRestartState();

            var    buffer  = indexBuffer as OneIndexBuffer;
            IntPtr pointer = buffer.MapBuffer(MapBufferAccess.ReadOnly);
            List <RecognizedPrimitiveInfo> primitiveInfoList = null;

            if (glState == null)
            {
                primitiveInfoList = recognizer.Recognize(lastVertexId, pointer, indexBuffer as OneIndexBuffer);
            }
            else
            {
                primitiveInfoList = recognizer.Recognize(lastVertexId, pointer, indexBuffer as OneIndexBuffer, glState.RestartIndex);
            }
            buffer.UnmapBuffer();

            return(primitiveInfoList);
        }
        /// <summary>
        /// 遍历以<see cref="lastVerteID"/>为最后一个顶点的图元,
        /// 瞄准每个图元的索引(例如1个三角形有3个索引)中的最后一个索引,
        /// 将此索引在<see cref="indexBufferPtr"/>中的索引(位置)收集起来。
        /// </summary>
        /// <param name="lastVertexId"></param>
        /// <returns></returns>
        private List <RecognizedPrimitiveIndex> GetLastIndexIdList(RenderEventArgs arg, uint lastVertexId)
        {
            PrimitiveRecognizer recognizer = PrimitiveRecognizerFactory.Create(
                (arg.RenderMode == RenderModes.ColorCodedPicking &&
                 arg.PickingGeometryType == GeometryType.Point &&
                 this.indexBufferPtr.Mode.ToGeometryType() == GeometryType.Line) ?
                DrawMode.Points : this.indexBufferPtr.Mode);

            PrimitiveRestartSwitch glSwitch = GetPrimitiveRestartSwitch();

            OpenGL.BindBuffer(BufferTarget.ElementArrayBuffer, this.indexBufferPtr.BufferId);
            IntPtr pointer = OpenGL.MapBuffer(BufferTarget.ElementArrayBuffer, MapBufferAccess.ReadOnly);
            List <RecognizedPrimitiveIndex> lastIndexIdList = null;

            if (glSwitch == null)
            {
                lastIndexIdList = recognizer.Recognize(lastVertexId, pointer, this.indexBufferPtr as OneIndexBufferPtr);
            }
            else
            {
                lastIndexIdList = recognizer.Recognize(lastVertexId, pointer, this.indexBufferPtr as OneIndexBufferPtr, glSwitch.RestartIndex);
            }
            OpenGL.UnmapBuffer(BufferTarget.ElementArrayBuffer);
            OpenGL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);

            return(lastIndexIdList);
        }
Exemple #3
0
        /// <summary>
        /// 遍历以<paramref name="lastVertexId"/>为最后一个顶点的图元,
        /// 瞄准每个图元的索引(例如1个三角形有3个索引)中的最后一个索引,
        /// 将此索引在<see cref="IndexBuffer"/>中的索引(位置)收集起来。
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="lastVertexId"></param>
        /// <returns></returns>
        private List <RecognizedPrimitiveInfo> GetLastIndexIdList(RenderEventArgs arg, uint lastVertexId)
        {
            PrimitiveRecognizer recognizer = PrimitiveRecognizerFactory.Create(
                (arg.PickingGeometryType == PickingGeometryType.Point &&
                 this.indexBuffer.Mode.ToGeometryType() == PickingGeometryType.Line) ?
                DrawMode.Points : this.indexBuffer.Mode);

            PrimitiveRestartState glState = GetPrimitiveRestartState();

            var    buffer  = this.indexBuffer as OneIndexBuffer;
            IntPtr pointer = buffer.MapBuffer(MapBufferAccess.ReadOnly);
            List <RecognizedPrimitiveInfo> primitiveInfoList = null;

            if (glState == null)
            {
                primitiveInfoList = recognizer.Recognize(lastVertexId, pointer, this.indexBuffer as OneIndexBuffer);
            }
            else
            {
                primitiveInfoList = recognizer.Recognize(lastVertexId, pointer, this.indexBuffer as OneIndexBuffer, glState.RestartIndex);
            }
            buffer.UnmapBuffer();

            return(primitiveInfoList);
        }
Exemple #4
0
        /// <summary>
        /// 遍历以<paramref name="lastVertexId"/>为最后一个顶点的图元,
        /// 瞄准每个图元的索引(例如1个三角形有3个索引)中的最后一个索引,
        /// 将此索引在<see cref="IndexBuffer"/>中的索引(位置)收集起来。
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="lastVertexId"></param>
        /// <returns></returns>
        private List <RecognizedPrimitiveInfo> GetLastIndexIdList(PickingEventArgs arg, uint lastVertexId)
        {
            var drawCmd = this.DrawCommand;
            PrimitiveRecognizer recognizer = PrimitiveRecognizerFactory.Create(
                (arg.GeometryType.Contains(GeometryType.Point) &&
                 drawCmd.Mode.ToGeometryType() == GeometryType.Line) ?
                DrawMode.Points : drawCmd.Mode);

            PrimitiveRestartState glState = GetPrimitiveRestartState();

            var    buffer  = (drawCmd as IHasIndexBuffer).IndexBufferObject;
            IntPtr pointer = buffer.MapBuffer(MapBufferAccess.ReadOnly);
            List <RecognizedPrimitiveInfo> primitiveInfoList = null;

            if (glState == null)
            {
                primitiveInfoList = recognizer.Recognize(lastVertexId, pointer, drawCmd as DrawElementsCmd);
            }
            else
            {
                primitiveInfoList = recognizer.Recognize(lastVertexId, pointer, drawCmd as DrawElementsCmd, glState.RestartIndex);
            }
            buffer.UnmapBuffer();

            return(primitiveInfoList);
        }
Exemple #5
0
        /// <summary>
        /// 遍历以<paramref name="flatColorVertexId"/>为最后一个顶点的图元,
        /// 瞄准每个图元的索引(例如1个三角形有3个索引)中的最后一个索引,
        /// 将此索引在<see cref="IndexBuffer"/>中的索引(位置)收集起来。
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="flatColorVertexId"></param>
        /// <returns></returns>
        private List <RecognizedPrimitiveInfo> GetPossiblePrimitives(PickingEventArgs arg, uint flatColorVertexId)
        {
            var                 drawCmd    = this.DrawCommand;
            DrawMode            mode       = drawCmd.CurrentMode;
            PrimitiveRecognizer recognizer = PrimitiveRecognizerFactory.Create(
                (arg.GeometryType.Contains(GeometryType.Point) &&
                 mode.ToGeometryType() == GeometryType.Line) ?
                DrawMode.Points : mode);

            List <RecognizedPrimitiveInfo> primitiveInfoList = recognizer.Recognize(flatColorVertexId, drawCmd);

            return(primitiveInfoList);
        }
        /// <summary>
        /// 遍历以<paramref name="lastVertexId"/>为最后一个顶点的图元,
        /// 瞄准每个图元的索引(例如1个三角形有3个索引)中的最后一个索引,
        /// 将此索引在<see cref="IndexBuffer"/>中的索引(位置)收集起来。
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="lastVertexId"></param>
        /// <returns></returns>
        private List <RecognizedPrimitiveInfo> GetLastIndexIdList(PickingEventArgs arg, uint lastVertexId)
        {
            var                 drawCmd    = this.DrawCommand;
            DrawMode            mode       = drawCmd.Mode;
            PrimitiveRecognizer recognizer = PrimitiveRecognizerFactory.Create(
                (arg.GeometryType.Contains(GeometryType.Point) &&
                 mode.ToGeometryType() == GeometryType.Line) ?
                DrawMode.Points : mode);

            PrimitiveRestartState glState = GetPrimitiveRestartState();

            List <RecognizedPrimitiveInfo> primitiveInfoList = null;

            if (glState == null)
            {
                primitiveInfoList = recognizer.Recognize(lastVertexId, drawCmd);
            }
            else
            {
                primitiveInfoList = recognizer.Recognize(lastVertexId, drawCmd, glState.RestartIndex);
            }

            return(primitiveInfoList);
        }
        public static PrimitiveRecognizer Create(DrawMode mode)
        {
            PrimitiveRecognizer recognizer = null;

            switch (mode)
            {
            case DrawMode.Points:
                recognizer = new PointsRecognizer();
                break;

            case DrawMode.LineStrip:
                recognizer = new LineStripRecognizer();
                break;

            case DrawMode.LineLoop:
                recognizer = new LineLoopRecognizer();
                break;

            case DrawMode.Lines:
                recognizer = new LinesRecognizer();
                break;

            case DrawMode.LineStripAdjacency:
                break;

            case DrawMode.LinesAdjacency:
                break;

            case DrawMode.TriangleStrip:
                recognizer = new TriangleStripRecognizer();
                break;

            case DrawMode.TriangleFan:
                recognizer = new TriangleFanRecognizer();
                break;

            case DrawMode.Triangles:
                recognizer = new TrianglesRecognizer();
                break;

            case DrawMode.TriangleStripAdjacency:
                break;

            case DrawMode.TrianglesAdjacency:
                break;

            case DrawMode.Patches:
                break;

            case DrawMode.QuadStrip:
                recognizer = new QuadStripRecognizer();
                break;

            case DrawMode.Quads:
                recognizer = new QuadsRecognizer();
                break;

            case DrawMode.Polygon:
                break;

            default:
                break;
            }

            if (recognizer == null)
            {
                throw new NotImplementedException(string.Format(
                                                      "尚未实现[{0}]的recognizer!", mode));
            }

            return(recognizer);
        }