/// <summary>
        /// Handle a RenderGroup action in the RenderOrder.
        /// </summary>
        /// <param name="action"></param>
        private void HandleRenderOrderAction_RenderGroup(
            RenderOrder.RenderGroup action, RenderableHandler renderAction)
        {
            var group = AllRenderables.GetSubnode(action.Name);

            group.Render(action.Options, renderAction, SeenRenderables, SeenGroups, action.SkipDuplicates);
        }
        /// <summary>
        /// Handle a RenderItem action in the RenderOrder.
        /// </summary>
        /// <param name="action"></param>
        private void HandleRenderOrderAction_RenderItem(
            RenderOrder.RenderItem action, RenderableHandler renderAction)
        {
            var renderable = AllRenderables.GetItem(action.Name);

            if (!(action.SkipDuplicates && SeenRenderables.Contains(renderable)))
            {
                renderAction(renderable);
            }
        }
 /// <summary>
 /// Add an anonymous item to this layer.
 /// </summary>
 /// <param name="item"></param>
 public void AddAnonymousItem(RenderableObject item)
 {
     if (MidRender)
     {
         renderablesToAdd.Add(new RenderableToAdd {
             Name = null, Object = item, Anonymous = true
         });
     }
     else
     {
         AllRenderables.AddAnonymousItem(item);
     }
     item.Layer = this;
 }
 /// <summary>
 /// Add an anonymous item to the renderable group with the given name in this layer.
 /// </summary>
 /// <param name="groupName"></param>
 /// <param name="item"></param>
 public void AddAnonymousItem(string groupName, RenderableObject item)
 {
     if (MidRender)
     {
         renderablesToAdd.Add(new RenderableToAdd {
             Name = groupName, Object = item, Anonymous = true
         });
     }
     else
     {
         AllRenderables.AddAnonymousItem(groupName, item);
     }
     item.Layer = this;
     targetChangeListeners.Add(item);
 }
 /// <summary>
 /// Add a RenderableObject to this render layer.
 /// </summary>
 /// <param name="name"></param>
 /// <param name="item"></param>
 public void AddItem(string name, RenderableObject item)
 {
     if (MidRender)
     {
         renderablesToAdd.Add(new RenderableToAdd {
             Name = name, Object = item
         });
     }
     else
     {
         AllRenderables.InsertItem(name, item);
     }
     item.Layer = this;
     targetChangeListeners.Add(item);
 }
Esempio n. 6
0
        /// <summary>
        /// Get the list of all RenderableObjects visible to the Camera.
        /// </summary>
        /// <returns></returns>
        private IEnumerable <RenderableObject> GetCameraVisibleRenderables()
        {
            if (Camera is NullCamera)
            {
                return(AllRenderables.RetrieveAll());
            }

            var renderables = new HashSet <RenderableObject>();
            var aabb        = Camera.ViewAABB;

            _world.QueryAABB(f =>
            {
                var obj = (RenderableObject)f.Body.UserData;

                renderables.Add(obj); // A renderable object might have multiple fixtures, but
                // we only want to render the object itself once.
                return(true);
            }, ref aabb);

            return(renderables);
        }
        /// <summary>
        /// Actually render the RenderableObjects.
        /// </summary>
        protected override void RenderItems()
        {
            var renderableHandler = GetRenderableHandler();

            SeenRenderables.Clear();
            SeenGroups.Clear();

            // If no RenderOrder was set, just render everything.
            if (RenderOrder == null)
            {
                AllRenderables.Render(
                    GlobalTraversalOptions, renderableHandler, SeenRenderables, SeenGroups);
            }
            // Otherwise, render in the order specified by the RenderOrder.
            else
            {
                /* TODO: Make this faster (somehow).
                 *
                 * The problem with this is that we're iterating through EVERY RenderableObject and checking
                 * if the camera can see it, then rendering it. Ideally what we should be doing instead is
                 * iterating through every RenderableObject returned by the QueryAABB and somehow rendering
                 * only THOSE in order.
                 *
                 * For large worlds, the number of renderables visible to the camera can be MUCH less than the
                 * total number of RenderableObjects, which is a problem.
                 *
                 * Most likely what will be done is upon setting the layer's RenderOrder, some sort of mapping
                 * is created which assigns each RenderableObject a number indicating it's position in the sorted
                 * list of objects to render.
                 */
                foreach (var item in RenderOrder.Actions)
                {
                    switch (item.ActionType)
                    {
                    case RenderOrder.RenderOrderActionType.RenderItem:
                        HandleRenderOrderAction_RenderItem((RenderOrder.RenderItem)item, renderableHandler);
                        break;

                    case RenderOrder.RenderOrderActionType.RenderGroup:
                        HandleRenderOrderAction_RenderGroup((RenderOrder.RenderGroup)item, renderableHandler);
                        break;

                    case RenderOrder.RenderOrderActionType.SetRenderProperties:
                        HandleRenderOrderAction_SetRenderProperties((RenderOrder.SetRenderProperties)item);
                        break;

                    case RenderOrder.RenderOrderActionType.RenderLayer:
                        throw new RenderOrderException(
                                  String.Format(
                                      "The RenderOrderAction `RenderLayer` cannot be used in the " +
                                      "RenderOrder for layer '{0}'. This RenderOrderAction can only " +
                                      "be used in a LayerManager's render order.", FullName));

                    default:
                        var handled = false;
                        if (UnknownRenderOrderActionHandlers.Count > 0)
                        {
                            var type = item.GetType();
                            if (UnknownRenderOrderActionHandlers.ContainsKey(type))
                            {
                                UnknownRenderOrderActionHandlers[type](this, item, renderableHandler);
                                handled = true;
                            }
                        }
                        if (!handled)
                        {
                            HandleUnknownRenderOrderAction(item, renderableHandler);
                        }
                        break;
                    }
                }
            }
        }
 /// <summary>
 /// Add the renderable group with the given name to the layer.
 /// </summary>
 /// <param name="name"></param>
 /// <param name="group"></param>
 public void AddGroup(string name, RenderableGroup group)
 {
     AllRenderables.AddSubnode(name, group);
 }
 /// <summary>
 /// Add the renderable group to the layer.
 /// </summary>
 /// <param name="group"></param>
 public void AddGroup(RenderableGroup group)
 {
     AllRenderables.AddSubnode(group.Name, group);
 }
 /// <summary>
 /// Add an empty group with the given name to the layer.
 /// </summary>
 /// <param name="name"></param>
 public void AddGroup(string name)
 {
     AllRenderables.AddSubnode(name, new RenderableGroup(UriUtilities.GetLastPart(name)));
 }