/// <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); } }