[vtkusers] Bug in picker allows picking invisible/non-pickable props?

Eran Guendelman erang at stanford.edu
Fri Jun 15 22:16:11 EDT 2007


I'm finding in my program that even when I call SetVisibility(0) and 
SetPickable(0) on vtkActors in my scene, the vtkPropPicker is 
incorrectly allowing them to be picked.  I traced through the VTK code 
and believe I found the bug.  Here's basically what's happening.  Say my 
scene is:

A -> B -> C
        -> D

A: top level scene assembly
B: an assembly which is a part of A  (e.g. a model in the scene)
C and D: vtkActors which are part of assembly B (e.g. bodies in my model)

So now suppose I hide body C (SetVisibility(0), and also SetPickable(0) 
for good measure although I don't think that's necessary under usual 
circumstances).

vtkPropPicker::Pick() calls vtkRenderer::PickRender() down the line, 
which does the following:

(1) Goes through all the top-level vtkProps in the scene.  Namely A.  It 
  then adds A to a pickFrom list.

(2) A cullPicker (of type vtkPicker) is created to execute a pick 
against bounding boxes, to cull the bodies that will be rendered by the 
underlying DevicePickRender().  vtkPicker::Pick goes through each 
vtkProp in the pickFrom list (namely A), and goes through all paths of 
that prop (namely A->B->C and A->B->D).  It omits any paths whose leaf 
node is not visible (so it omits A->B->C but intersects against 
A->B->D).  In the situation where we do intersect D's bounding box, the 
top-level vtkProp is added to the vtkPicker's Prop3Ds list...  ***i.e. A 
is added th the Prop3Ds list... NOT the leaf node D***

(3) back in vtkRenderer::PickRender(), it fills PathArray with *ALL* of 
the paths of all of the vtkProps in the Prop3Ds list.  i.e. it fills 
PathArray with all of the paths of A, which are A->B->C and A->B->D. 
(THIS IS ALREADY BAD NEWS BECAUSE A->B->C IS BACK UNDER CONSIDERATION)

(4) vtkOpenGLRenderer::DevicePickRender() is called, which calls 
vtkRenderer::PickGeometry(), which renders everything in the PathArray, 
and makes this comment:
   // We can render everything because if it was
   // not visible it would not have been put in the
   // list in the first place, and if it was allocated
   // no time (culled) it would have been removed from
   // the list


So there's an obvious problem here.  When an intersection with D was 
found, the top-level vtkProp A was added to the Prop3Ds list... and then 
*all* of the paths of A were intersected against by the device pick 
render step.  Ignoring the fact that A->B->C is supposed to be invisible 
and not pickable!

So is this a bug?  And suggestions for getting around it?  (Yes, I could 
make a flat scene graph and put C and D as top-level actors in the 
scene, but that's not a satisfactory solution).

Thanks.



More information about the vtkusers mailing list