RCSB Viewers:Viewer Framework:Picking
Notes
This is an interesting mechanism, but is fiddly and subject to rendering errors if the back buffer happens to get swapped and still has the picking colors - you get the odd 'red-shift' effect. A normal redraw fixes it.
</li> </ul> Questions ———
Where does the dummy context get set up? - I'm conjecturing this happens, because it's the only possible
solution in my comprehension, but I haven't tracked it down.
What is the action that is forwarded on successful pick?
Should this be replaced with an actual ray-pick? I doubt if it would be any more expensive than
the 'glReadPixel' calls (which are quite expensive), and would avoid the afore-mentioned 'red-shift'
effect.
Relevent Classes
- GlGeometryViewer
Explanation
Picking is achieved by intercepting mouse movements and then initiating a redraw, after setting a flag, indicating that the requested draw is actually a pick request.
The technique is based on a ‘unique-color’ mechanism, rather than a ‘ray-pick’ mechanism (See OpenGL Programming Guide, Sixth Ed. - Object Selection Using the Back Buffer)
On the redraw event, the action is forwarded to several layers of ‘PickOrRedraw’ functions. If picking, the execution path sets up a ‘unique color’ scheme - essentially, the material for each pickable object type is set to a unique color (starting with 1, 0, 0 - dark red) and that association is set in a lookup table by color (color -> StructureComponent.)
After rendering to the back buffer, the pixel at the mouse location is read (with a glReadPixel) and the color looked up in the table. If it is found and is associated with a StructureComponent object, that object is set as the currently picked object.