Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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));
                }
            }
        }
Exemple #5
0
        /// <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);
        }
Exemple #6
0
        /// <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);
        }