private static OneIndexLineSearcher GetLineSearcher(DrawMode mode) { if (lineSearcherDict == null) { var triangle = new OneIndexLineInTriangleSearcher(); var quad = new OneIndexLineInQuadSearcher(); var polygon = new OneIndexLineInPolygonSearcher(); var dict = new Dictionary <DrawMode, OneIndexLineSearcher>(); dict.Add(DrawMode.Triangles, triangle); dict.Add(DrawMode.TrianglesAdjacency, triangle); dict.Add(DrawMode.TriangleStrip, triangle); dict.Add(DrawMode.TriangleStripAdjacency, triangle); dict.Add(DrawMode.TriangleFan, triangle); dict.Add(DrawMode.Quads, quad); dict.Add(DrawMode.QuadStrip, quad); dict.Add(DrawMode.Polygon, polygon); lineSearcherDict = dict; } OneIndexLineSearcher result = null; if (lineSearcherDict.TryGetValue(mode, out result)) { return(result); } else { return(null); } }
/// <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> /// /// </summary> /// <param name="arg"></param> /// <param name="stageVertexId"></param> /// <param name="primitiveInfo"></param> /// <param name="searcher"></param> /// <returns></returns> private PickedGeometry SearchLine(PickingEventArgs arg, uint stageVertexId, RecognizedPrimitiveInfo primitiveInfo, OneIndexLineSearcher searcher) { var vertexIds = searcher.Search(arg, primitiveInfo, this); vec3[] positions = FillPickedGeometrysPosition(vertexIds); var pickedGeometry = new PickedGeometry(GeometryType.Line, positions, vertexIds, stageVertexId, this.Renderer); return(pickedGeometry); }
private PickedGeometry SearchLine(RenderEventArgs arg, uint stageVertexId, int x, int y, uint lastVertexId, RecognizedPrimitiveIndex lastIndexId, OneIndexLineSearcher searcher) { PickedGeometry pickedGeometry = new PickedGeometry(); pickedGeometry.From = this; pickedGeometry.GeometryType = GeometryType.Line; pickedGeometry.StageVertexId = stageVertexId; pickedGeometry.Indexes = searcher.Search(arg, x, y, lastIndexId, this); pickedGeometry.Positions = FillPickedGeometrysPosition(pickedGeometry.Indexes); return(pickedGeometry); }
public override PickedGeometry Pick(RenderEventArgs arg, uint stageVertexId, int x, int y) { uint lastVertexId; if (!this.GetLastVertexIdOfPickedGeometry(stageVertexId, out lastVertexId)) { return(null); } // 找到 lastIndexId RecognizedPrimitiveIndex lastIndexId = this.GetLastIndexIdOfPickedGeometry( arg, lastVertexId, x, y); if (lastIndexId == null) { Debug.WriteLine( "Got lastVertexId[{0}] but no lastIndexId! Params are [{1}] [{2}] [{3}] [{4}]", lastVertexId, arg, stageVertexId, x, y); { return(null); } } GeometryType geometryType = arg.PickingGeometryType; DrawMode mode = this.indexBufferPtr.Mode; GeometryType typeOfMode = mode.ToGeometryType(); if (geometryType == GeometryType.Point) { // 获取pickedGeometry if (typeOfMode == GeometryType.Point) { return(PickWhateverItIs(stageVertexId, lastIndexId, typeOfMode)); } else if (typeOfMode == GeometryType.Line) { if (this.OnPrimitiveTest(lastVertexId, mode)) { return(PickPoint(stageVertexId, lastVertexId)); } else { return(null); } } else { OneIndexPointSearcher searcher = GetPointSearcher(mode); if (searcher != null)// line is from triangle, quad or polygon { return(SearchPoint(arg, stageVertexId, x, y, lastVertexId, lastIndexId, searcher)); } else { throw new Exception(string.Format("Lack of searcher for [{0}]", mode)); } } } else if (geometryType == GeometryType.Line) { // 获取pickedGeometry if (geometryType == typeOfMode) { return(PickWhateverItIs(stageVertexId, lastIndexId, typeOfMode)); } else { OneIndexLineSearcher searcher = GetLineSearcher(mode); if (searcher != null)// line is from triangle, quad or polygon { return(SearchLine(arg, stageVertexId, x, y, lastVertexId, lastIndexId, searcher)); } else if (mode == DrawMode.Points)// want a line when rendering GL_POINTS { return(null); } else { throw new Exception(string.Format("Lack of searcher for [{0}]", mode)); } } } else { if (typeOfMode == geometryType)// I want what it is { return(PickWhateverItIs(stageVertexId, lastIndexId, typeOfMode)); } else { return(null); } //{ throw new Exception(string.Format("Lack of searcher for [{0}]", mode)); } } }
/// <summary> /// /// </summary> /// <param name="arg"></param> /// <param name="stageVertexId"></param> /// <param name="x">mouse position(Left Down is (0, 0)).</param> /// <param name="y">mouse position(Left Down is (0, 0)).</param> /// <param name="lastVertexId"></param> /// <param name="primitiveInfo"></param> /// <param name="searcher"></param> /// <returns></returns> private PickedGeometry SearchLine(RenderEventArgs arg, uint stageVertexId, int x, int y, uint lastVertexId, RecognizedPrimitiveInfo primitiveInfo, OneIndexLineSearcher searcher) { var vertexIds = searcher.Search(arg, x, y, primitiveInfo, this); vec3[] positions = FillPickedGeometrysPosition(vertexIds); var pickedGeometry = new PickedGeometry(arg.UsingViewPort, PickingGeometryType.Line, positions, vertexIds, stageVertexId, this); return(pickedGeometry); }
private static OneIndexLineSearcher GetLineSearcher(DrawMode mode) { OneIndexLineSearcher result = null; switch (mode) { case DrawMode.Points: break; case DrawMode.Lines: break; case DrawMode.LineLoop: break; case DrawMode.LineStrip: break; case DrawMode.Triangles: result = lineInTriangle; break; case DrawMode.TriangleStrip: result = lineInTriangle; break; case DrawMode.TriangleFan: result = lineInTriangle; break; case DrawMode.Quads: result = lineInQuad; break; case DrawMode.QuadStrip: result = lineInQuad; break; case DrawMode.Polygon: result = lineInPolygon; break; case DrawMode.LinesAdjacency: break; case DrawMode.LineStripAdjacency: break; case DrawMode.TrianglesAdjacency: result = lineInTriangle; break; case DrawMode.TriangleStripAdjacency: result = lineInTriangle; break; case DrawMode.Patches: break; default: throw new NotDealWithNewEnumItemException(typeof(DrawMode)); } return(result); }
private static OneIndexLineSearcher GetLineSearcher(DrawMode mode) { OneIndexLineSearcher result = null; switch (mode) { case DrawMode.Points: break; case DrawMode.Lines: break; case DrawMode.LineLoop: break; case DrawMode.LineStrip: break; case DrawMode.Triangles: result = lineInTriangle; break; case DrawMode.TriangleStrip: result = lineInTriangle; break; case DrawMode.TriangleFan: result = lineInTriangle; break; case DrawMode.Quads: result = lineInQuad; break; case DrawMode.QuadStrip: result = lineInQuad; break; case DrawMode.Polygon: result = lineInPolygon; break; case DrawMode.LinesAdjacency: break; case DrawMode.LineStripAdjacency: break; case DrawMode.TrianglesAdjacency: result = lineInTriangle; break; case DrawMode.TriangleStripAdjacency: result = lineInTriangle; break; case DrawMode.Patches: break; default: break; } return(result); }
/// <summary> /// /// </summary> /// <param name="arg"></param> /// <param name="stageVertexId"></param> /// <param name="x">mouse position(Left Down is (0, 0)).</param> /// <param name="y">mouse position(Left Down is (0, 0)).</param> /// <param name="lastVertexId"></param> /// <param name="primitiveInfo"></param> /// <param name="searcher"></param> /// <returns></returns> private PickedGeometry SearchLine(RenderEventArgs arg, uint stageVertexId, int x, int y, uint lastVertexId, RecognizedPrimitiveInfo primitiveInfo, OneIndexLineSearcher searcher) { var vertexIds = searcher.Search(arg, x, y, primitiveInfo, this); vec3[] positions = FillPickedGeometrysPosition(vertexIds); var pickedGeometry = new PickedGeometry(arg.UsingViewPort, PickingGeometryType.Line, positions, vertexIds, stageVertexId, this); return pickedGeometry; }