/// <summary> /// /// </summary> /// <param name="arg"></param> /// <param name="stageVertexId">The last vertex's id that constructs the picked primitive. /// <para>This id is in scene's all <see cref="IPickable"/>s' order.</para></param> /// <param name="baseId">Index of first vertex of the buffer that The geometry belongs to. /// <para>This id is in scene's all <see cref="IPickable"/>s' order.</para></param> /// <returns></returns> public override PickedGeometry GetPickedGeometry(PickingEventArgs arg, uint stageVertexId, uint baseId) { if (stageVertexId < baseId) { return(null); } uint singleNodeVertexId = stageVertexId - baseId; if (this.PositionBuffer.Length <= singleNodeVertexId) { return(null); } PickableNode node = this.Node; // Find primitiveInfo RecognizedPrimitiveInfo primitiveInfo = this.GetPrimitiveInfoOfPickedGeometry(arg, singleNodeVertexId, baseId); if (primitiveInfo == null) { Debug.WriteLine(string.Format( "Got singleNodeVertexId[{0}] but no primitiveInfo! Params are [{1}] [{2}]", singleNodeVertexId, arg, stageVertexId)); { return(null); } } PickingGeometryTypes geometryType = arg.GeometryType; DrawMode drawMode = this.DrawCommand.CurrentMode; GeometryType typeOfMode = drawMode.ToGeometryType(); if ((geometryType & PickingGeometryTypes.Point) == PickingGeometryTypes.Point) { // 获取pickedGeometry if (typeOfMode == GeometryType.Point) { return(PickWhateverItIs(arg, stageVertexId, primitiveInfo, typeOfMode)); } else { DrawElementsPointSearcher searcher = GetPointSearcher(drawMode); if (searcher != null)// line is from triangle, quad or polygon { return(SearchPoint(arg, singleNodeVertexId, stageVertexId, primitiveInfo, searcher)); } else { throw new Exception(string.Format("Lack of searcher for [{0}]", drawMode)); } } } else if ((geometryType & PickingGeometryTypes.Line) == PickingGeometryTypes.Line) { // 获取pickedGeometry if (typeOfMode == GeometryType.Point) // want a line when rendering GL_POINTS { return(null); } if (typeOfMode == GeometryType.Line) { return(PickWhateverItIs(arg, stageVertexId, primitiveInfo, typeOfMode)); } else { DrawElementsLineSearcher searcher = GetLineSearcher(drawMode); if (searcher != null)// line is from triangle, quad or polygon { return(SearchLine(arg, singleNodeVertexId, stageVertexId, primitiveInfo, searcher)); } else { throw new Exception(string.Format("Lack of searcher for [{0}]", drawMode)); } } } else { if (geometryType.Contains(typeOfMode)) // I want what it is { return(PickWhateverItIs(arg, stageVertexId, primitiveInfo, typeOfMode)); } else { return(null); } //{ throw new Exception(string.Format("Lack of searcher for [{0}]", mode)); } } }
/// <summary> /// Get picked geometry from a <see cref="PickableNode"/> with <see cref="ZeroIndexBuffer"/> as index buffer. /// </summary> /// <param name="node"></param> public ZeroIndexPicker(PickableNode node) : base(node) { }
/// <summary> /// Get picked geometry from a <see cref="PickableNode"/> with <see cref="DrawArraysCmd"/> as index buffer. /// </summary> /// <param name="node"></param> /// <param name="positionBuffer"></param> /// <param name="drawCommand"></param> public DrawElementsPicker(PickableNode node, VertexBuffer positionBuffer, DrawElementsCmd drawCommand) : base(node, positionBuffer) { this.DrawCommand = drawCommand; }
/// <summary> /// Get picked geometry from a <see cref="PickableNode"/> with <see cref="ZeroIndexBuffer"/> as index buffer. /// </summary> /// <param name="node"></param> public OneIndexPicker(PickableNode node) : base(node) { }
/// <summary> /// /// </summary> /// <param name="arg"></param> /// <param name="stageVertexId"></param> /// <returns></returns> public override PickedGeometry GetPickedGeometry(PickingEventArgs arg, uint stageVertexId) { PickableNode node = this.Renderer; uint lastVertexId; if (!node.GetLastVertexIdOfPickedGeometry(stageVertexId, out lastVertexId)) { return(null); } // 找到 lastIndexId RecognizedPrimitiveInfo lastIndexId = this.GetLastIndexIdOfPickedGeometry( arg, lastVertexId); if (lastIndexId == null) { Debug.WriteLine(string.Format( "Got lastVertexId[{0}] but no lastIndexId! Params are [{1}] [{2}]", lastVertexId, arg, stageVertexId)); { return(null); } } PickingGeometryTypes geometryType = arg.GeometryType; DrawMode drawMode = node.PickingRenderUnit.VertexArrayObject.IndexBuffer.Mode; GeometryType typeOfMode = drawMode.ToGeometryType(); if ((geometryType & PickingGeometryTypes.Point) == PickingGeometryTypes.Point) { // 获取pickedGeometry if (typeOfMode == GeometryType.Point) { return(PickWhateverItIs(arg, stageVertexId, lastIndexId, typeOfMode)); } else if (typeOfMode == GeometryType.Line) { if (this.OnPrimitiveTest(lastVertexId, drawMode)) { return(PickPoint(arg, stageVertexId, lastVertexId)); } else { return(null); } } else { OneIndexPointSearcher searcher = GetPointSearcher(drawMode); if (searcher != null)// line is from triangle, quad or polygon { return(SearchPoint(arg, stageVertexId, lastVertexId, lastIndexId, searcher)); } else { throw new Exception(string.Format("Lack of searcher for [{0}]", drawMode)); } } } else if ((geometryType & PickingGeometryTypes.Line) == PickingGeometryTypes.Line) { // 获取pickedGeometry if (typeOfMode == GeometryType.Point) // want a line when rendering GL_POINTS { return(null); } if (typeOfMode == GeometryType.Line) { return(PickWhateverItIs(arg, stageVertexId, lastIndexId, typeOfMode)); } else { OneIndexLineSearcher searcher = GetLineSearcher(drawMode); if (searcher != null)// line is from triangle, quad or polygon { return(SearchLine(arg, stageVertexId, lastIndexId, searcher)); } else { throw new Exception(string.Format("Lack of searcher for [{0}]", drawMode)); } } } else { if (geometryType.Contains(typeOfMode)) // I want what it is { return(PickWhateverItIs(arg, stageVertexId, lastIndexId, typeOfMode)); } else { return(null); } //{ throw new Exception(string.Format("Lack of searcher for [{0}]", mode)); } } }
/// <summary> /// Get picked geometry. /// </summary> /// <param name="node"></param> public PickerBase(PickableNode node) { this.Renderer = node; }
/// <summary> /// Get picked geometry. /// </summary> /// <param name="node"></param> /// <param name="positionBuffer"></param> public PickerBase(PickableNode node, VertexBuffer positionBuffer) { this.Node = node; this.PositionBuffer = positionBuffer; }
/// <summary> /// Get picked geometry. /// </summary> /// <param name="node"></param> public PickerBase(PickableNode node) { this.Node = node; }
/// <summary> /// Get picked geometry from a <see cref="PickableNode"/> with <see cref="DrawArraysCmd"/> as index buffer. /// </summary> /// <param name="node"></param> /// <param name="positionBuffer"></param> /// <param name="drawCommand"></param> public DrawElementsPicker(PickableNode node, VertexBuffer positionBuffer, IDrawCommand drawCommand) : base(node, positionBuffer, drawCommand) { }
/// <summary> /// Get picked geometry. /// </summary> /// <param name="node"></param> /// <param name="positionBuffer"></param> /// <param name="drawCommand"></param> public PickerBase(PickableNode node, VertexBuffer positionBuffer, IDrawCommand drawCommand) { this.Node = node; this.PositionBuffer = positionBuffer; this.DrawCommand = drawCommand; }