/// <summary> /// Returns last vertex's id of picked geometry if the geometry represented by <paramref name="stageVertexID"/> belongs to this <paramref name="element"/> instance. /// <para>Returns false if <paramref name="stageVertexID"/> the primitive is in some other element.</para> /// </summary> /// <param name="element"></param> /// <param name="stageVertexID"></param> /// <param name="lastVertexID"></param> /// <returns></returns> public static bool GetLastVertexIDOfPickedGeometry(this IColorCodedPicking element, uint stageVertexID, out uint lastVertexID) { lastVertexID = uint.MaxValue; bool result = false; if (element != null) { if (stageVertexID < element.PickingBaseID) // ID is in some previous element. { return(false); } uint vertexCount = element.GetVertexCount(); uint id = stageVertexID - element.PickingBaseID; if (id < vertexCount) { lastVertexID = id; result = true; } else // ID is in some subsequent element. { result = false; } } return(result); }
/// <summary> /// Render the element that inherts <see cref="IColorCodedPicking"/> for color coded picking. /// </summary> /// <param name="pickable"></param> /// <param name="gl"></param> /// <param name="renderMode"></param> public virtual void RenderForPicking(IColorCodedPicking pickable, RenderEventArgs e) { if (pickable != null) { pickable.PickingBaseID = this.RenderedVertexCount; // render the element. pickable.Render(e); uint rendered = this.RenderedVertexCount + pickable.GetVertexCount(); if (this.RenderedVertexCount <= rendered) { this.RenderedVertexCount = rendered; } else { throw new OverflowException( string.Format("Too many geometries({0} + {1} > {2}) for color coded picking.", this.RenderedVertexCount, pickable.GetVertexCount(), uint.MaxValue)); } } }
/// <summary> /// Render the element that inherts <see cref="IColorCodedPicking"/> for color coded picking. /// </summary> /// <param name="pickable"></param> /// <param name="gl"></param> /// <param name="renderMode"></param> public virtual void RenderForPicking(IColorCodedPicking pickable, RenderEventArgs e) { if (pickable != null) { pickable.PickingBaseID = this.RenderedVertexCount; // render the element. IRenderable renderable = pickable; renderable.Render(e); uint rendered = this.RenderedVertexCount + pickable.GetVertexCount(); if (this.RenderedVertexCount <= rendered) { this.RenderedVertexCount = rendered; } else { throw new OverflowException( string.Format("Too many geometries({0} + {1} > {2}) for color coded picking.", this.RenderedVertexCount, pickable.GetVertexCount(), uint.MaxValue)); } } }
/// <summary> /// Render the element that inherts <see cref="IColorCodedPicking"/> for color coded picking. /// </summary> /// <param name="picking"></param> /// <param name="gl"></param> /// <param name="renderMode"></param> public virtual void RenderForPicking(IColorCodedPicking picking, OpenGL gl, SceneGraph.Core.RenderMode renderMode) { if (picking != null) { picking.PickingBaseID = this.RenderedVertexCount; // render the element. SharpGL.SceneGraph.Core.IRenderable renderable = picking; renderable.Render(gl, renderMode); uint rendered = this.RenderedVertexCount + picking.GetVertexCount(); if (this.RenderedVertexCount <= rendered) { this.RenderedVertexCount = rendered; } else { throw new OverflowException( string.Format("Too many geometries({0} + {1} > {2}) for color coded picking.", this.RenderedVertexCount, picking.GetVertexCount(), uint.MaxValue)); } } }
/// <summary> /// Get geometry's count according to specified <paramref name="mode"/>. /// <para>Returns false if the <paramref name="element"/> is null.</para> /// </summary> /// <param name="element"></param> /// <param name="mode"></param> /// <param name="count"></param> /// <returns></returns> public static bool GetGeometryCount(this IColorCodedPicking element, PrimitiveModes mode, out uint count) { bool result = false; count = uint.MaxValue; if (element != null) { uint vertexCount = element.GetVertexCount(); switch (mode) { case PrimitiveModes.Points: count = vertexCount; break; case PrimitiveModes.Lines: count = vertexCount / 2; break; case PrimitiveModes.LineLoop: count = vertexCount; break; case PrimitiveModes.LineStrip: count = vertexCount - 1; break; case PrimitiveModes.Triangles: count = vertexCount / 3; break; case PrimitiveModes.TriangleStrip: count = vertexCount - 2; break; case PrimitiveModes.TriangleFan: count = vertexCount - 2; break; case PrimitiveModes.Quads: count = vertexCount / 4; break; case PrimitiveModes.QuadStrip: count = vertexCount / 2 - 1; break; case PrimitiveModes.Polygon: count = 1; break; default: throw new NotImplementedException(); } result = true; } return(result); }
/// <summary> /// Get geometry's index(start from 0) according to <paramref name="lastVertexID"/> and <paramref name="mode"/>. /// <para>Returns false if failed.</para> /// </summary> /// <param name="element"></param> /// <param name="mode"></param> /// <param name="lastVertexID">Refers to the last vertex that constructs the primitive. /// <para>Ranges from 0 to (<paramref name="element"/>'s vertices' count - 1).</para></param> /// <param name="index"></param> /// <returns></returns> public static bool GetGeometryIndex(this IColorCodedPicking element, PrimitiveModes mode, uint lastVertexID, out uint index) { index = uint.MaxValue; if (element == null) { return(false); } uint vertexCount = element.GetVertexCount(); if (lastVertexID < vertexCount) { switch (mode) { case PrimitiveModes.Points: // vertexID should range from 0 to vertexCount - 1. index = lastVertexID; break; case PrimitiveModes.Lines: // vertexID should range from 0 to vertexCount - 1. index = lastVertexID / 2; break; case PrimitiveModes.LineLoop: // vertexID should range from 0 to vertexCount. if (lastVertexID == 0) // This is the last primitive. { index = vertexCount - 1; } else { index = lastVertexID - 1; } break; case PrimitiveModes.LineStrip: index = lastVertexID - 1; // If lastVertexID is 0, this returns -1. break; case PrimitiveModes.Triangles: index = lastVertexID / 3; break; case PrimitiveModes.TriangleStrip: index = lastVertexID - 2; // if lastVertexID is 0 or 1, this returns -2 or -1. break; case PrimitiveModes.TriangleFan: index = lastVertexID - 2; // if lastVertexID is 0 or 1, this returns -2 or -1. break; case PrimitiveModes.Quads: index = lastVertexID / 4; break; case PrimitiveModes.QuadStrip: index = lastVertexID / 2 - 1; // If lastVertexID is 0 or 1, this returns -1. break; case PrimitiveModes.Polygon: index = 0; break; default: throw new NotImplementedException(); } } return(true); }