private void RenderPickableObject(SceneObject sceneObject, RenderEventArgs arg, ref uint renderedVertexCount, List<IPickable> pickedRendererList)
{
if ((sceneObject == null) || (!sceneObject.Enabled)) { return; }
// global switches on.
GLState[] switchArray = sceneObject.GroupStateList.ToArray();
for (int i = 0; i < switchArray.Length; i++)
{
switchArray[i].On();
}
// render self.
var pickable = sceneObject.Renderer as IPickable;
if ((pickable != null) && (sceneObject.Renderer.Enabled))
{
pickable.PickingBaseId = renderedVertexCount;
pickable.Render4Picking(arg);
uint rendered = renderedVertexCount + pickable.GetVertexCount();
if (renderedVertexCount <= rendered)
{
renderedVertexCount = rendered;
}
else
{
throw new Exception(string.Format(
"Too many geometries({0} + {1} > {2}) for color coded picking.",
renderedVertexCount, pickable.GetVertexCount(), uint.MaxValue));
}
pickedRendererList.Add(pickable);
}
// render children.
{
SceneObject[] array = sceneObject.Children.ToArray();
foreach (SceneObject child in array)
{
RenderPickableObject(child, arg, ref renderedVertexCount, pickedRendererList);
}
}
// global switches off.
for (int i = switchArray.Length - 1; i >= 0; i--)
{
switchArray[i].Off();
}
}