/// <summary>
        /// Find object on screen
        /// </summary>
        /// <param name="findshader">The shader to use for the find</param>
        /// <param name="glstate">Render state</param>
        /// <param name="pos">Position on screen of find point</param>
        /// <param name="size">Screen size</param>
        /// <returns>Return tuple of set, render group, render index in group, z of find, or null</returns>
        public Tuple <int, int, int, float> Find(GLShaderPipeline findshader, GLRenderState glstate, Point pos, Size size)
        {
            var geo = findshader.GetShader <GLPLGeoShaderFindTriangles>(OpenTK.Graphics.OpenGL4.ShaderType.GeometryShader);

            geo.SetScreenCoords(pos, size);
            findshader.Start(null);     // this clears the buffer

            int setno = 0;

            foreach (var s in set)
            {
                geo.SetGroup(setno++ << 18);                                        // set the group marker for this group as a uniform (encoded in drawID in .W)
                s.ObjectRenderer.Execute(findshader, glstate, noshaderstart: true); // execute find over ever set, not clearing the buffer
            }

            findshader.Finish();    // finish shader

            var res = geo.GetResult();

            if (res != null)
            {
                System.Diagnostics.Debug.WriteLine("Set Found something"); for (int i = 0; i < res.Length; i++)
                {
                    System.Diagnostics.Debug.WriteLine(i + " = " + res[i]);
                }
                return(new Tuple <int, int, int, float>(((int)res[0].W) >> 18, ((int)res[0].W) & 0x3ffff, (int)res[0].Y, res[0].Z));
            }
            else
            {
                return(null);
            }
        }