public override List <WidgetAndPosition> FindDescendants(IEnumerable <string> namesToSearchFor, List <WidgetAndPosition> foundChildren, RectangleDouble touchingBounds, SearchType seachType, bool allowInvalidItems = true)
        {
            foreach (var child in Scene.Children)
            {
                string object3DName = child.Name;
                if (object3DName == null && child.MeshPath != null)
                {
                    object3DName = Path.GetFileName(child.MeshPath);
                }

                bool nameFound = false;

                foreach (var nameToSearchFor in namesToSearchFor)
                {
                    if (seachType == SearchType.Exact)
                    {
                        if (object3DName == nameToSearchFor)
                        {
                            nameFound = true;
                        }
                    }
                    else
                    {
                        if (nameToSearchFor == "" ||
                            object3DName.Contains(nameToSearchFor))
                        {
                            nameFound = true;
                        }
                    }
                }

                if (nameFound)
                {
                    AxisAlignedBoundingBox bounds = child.GetBVHData().GetAxisAlignedBoundingBox();

                    RectangleDouble screenBoundsOfObject3D = RectangleDouble.ZeroIntersection;
                    for (int i = 0; i < 4; i++)
                    {
                        screenBoundsOfObject3D.ExpandToInclude(this.World.GetScreenPosition(bounds.GetTopCorner(i)));
                        screenBoundsOfObject3D.ExpandToInclude(this.World.GetScreenPosition(bounds.GetBottomCorner(i)));
                    }

                    if (touchingBounds.IsTouching(screenBoundsOfObject3D))
                    {
                        Vector3 renderPosition           = bounds.Center;
                        Vector2 objectCenterScreenSpace  = this.World.GetScreenPosition(renderPosition);
                        Point2D screenPositionOfObject3D = new Point2D((int)objectCenterScreenSpace.X, (int)objectCenterScreenSpace.Y);

                        foundChildren.Add(new WidgetAndPosition(this, screenPositionOfObject3D, object3DName));
                    }
                }
            }

            return(base.FindDescendants(namesToSearchFor, foundChildren, touchingBounds, seachType, allowInvalidItems));
        }
        public override void FindNamedChildrenRecursive(string nameToSearchFor, List <WidgetAndPosition> foundChildren, RectangleDouble touchingBounds, SearchType seachType, bool allowInvalidItems = true)
        {
            foreach (InteractionVolume child in interactionLayer.InteractionVolumes)
            {
                string object3DName = child.Name;

                bool nameFound = false;

                if (seachType == SearchType.Exact)
                {
                    if (object3DName == nameToSearchFor)
                    {
                        nameFound = true;
                    }
                }
                else
                {
                    if (nameToSearchFor == "" ||
                        object3DName.Contains(nameToSearchFor))
                    {
                        nameFound = true;
                    }
                }

                if (nameFound &&
                    child.CollisionVolume != null)
                {
                    AxisAlignedBoundingBox bounds = child.CollisionVolume.GetAxisAlignedBoundingBox();
                    bounds = bounds.NewTransformed(child.TotalTransform);

                    RectangleDouble screenBoundsOfObject3D = RectangleDouble.ZeroIntersection;
                    for (int i = 0; i < 4; i++)
                    {
                        screenBoundsOfObject3D.ExpandToInclude(this.World.GetScreenPosition(bounds.GetTopCorner(i)));
                        screenBoundsOfObject3D.ExpandToInclude(this.World.GetScreenPosition(bounds.GetBottomCorner(i)));
                    }

                    if (touchingBounds.IsTouching(screenBoundsOfObject3D))
                    {
                        Vector3 renderPosition           = bounds.Center;
                        Vector2 objectCenterScreenSpace  = this.World.GetScreenPosition(renderPosition);
                        Point2D screenPositionOfObject3D = new Point2D((int)objectCenterScreenSpace.X, (int)objectCenterScreenSpace.Y);

                        foundChildren.Add(new WidgetAndPosition(this, screenPositionOfObject3D, object3DName, child));
                    }
                }
            }

            foreach (var child in scene.Children)
            {
                string object3DName = child.Name;
                if (object3DName == null && child.MeshPath != null)
                {
                    object3DName = Path.GetFileName(child.MeshPath);
                }

                bool nameFound = false;

                if (seachType == SearchType.Exact)
                {
                    if (object3DName == nameToSearchFor)
                    {
                        nameFound = true;
                    }
                }
                else
                {
                    if (nameToSearchFor == "" ||
                        object3DName.Contains(nameToSearchFor))
                    {
                        nameFound = true;
                    }
                }

                if (nameFound)
                {
                    AxisAlignedBoundingBox bounds = child.TraceData().GetAxisAlignedBoundingBox();

                    RectangleDouble screenBoundsOfObject3D = RectangleDouble.ZeroIntersection;
                    for (int i = 0; i < 4; i++)
                    {
                        screenBoundsOfObject3D.ExpandToInclude(this.World.GetScreenPosition(bounds.GetTopCorner(i)));
                        screenBoundsOfObject3D.ExpandToInclude(this.World.GetScreenPosition(bounds.GetBottomCorner(i)));
                    }

                    if (touchingBounds.IsTouching(screenBoundsOfObject3D))
                    {
                        Vector3 renderPosition           = bounds.Center;
                        Vector2 objectCenterScreenSpace  = this.World.GetScreenPosition(renderPosition);
                        Point2D screenPositionOfObject3D = new Point2D((int)objectCenterScreenSpace.X, (int)objectCenterScreenSpace.Y);

                        foundChildren.Add(new WidgetAndPosition(this, screenPositionOfObject3D, object3DName, child));
                    }
                }
            }

            base.FindNamedChildrenRecursive(nameToSearchFor, foundChildren, touchingBounds, seachType, allowInvalidItems);
        }