package rescuecore2.standard.view; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.Rectangle2D; import java.util.Collection; import java.util.List; import java.util.ArrayList; import rescuecore2.misc.gui.ScreenTransform; import rescuecore2.view.RenderedObject; import rescuecore2.worldmodel.WorldModel; import rescuecore2.worldmodel.Entity; import rescuecore2.standard.entities.StandardEntity; /** An abstract base class for StandardWorldModel view layers that render standard entities. @param <T> The subclass of StandardEntity that this layer knows how to render. */ public abstract class StandardEntityViewLayer<T extends StandardEntity> extends StandardViewLayer { /** The entities this layer should render. */ protected List<T> entities; private Class<T> clazz; /** Construct a new StandardViewLayer. @param clazz The class of entity that this layer can render. */ protected StandardEntityViewLayer(Class<T> clazz) { this.clazz = clazz; entities = new ArrayList<T>(); } @Override public Rectangle2D view(Object... objects) { synchronized (entities) { entities.clear(); preView(); Rectangle2D result = super.view(objects); postView(); return result; } } @Override protected void viewObject(Object o) { super.viewObject(o); if (clazz.isAssignableFrom(o.getClass())) { entities.add(clazz.cast(o)); } if (o instanceof WorldModel) { WorldModel<? extends Entity> wm = (WorldModel<? extends Entity>)o; for (Entity next : wm) { viewObject(next); } } } @Override public Collection<RenderedObject> render(Graphics2D g, ScreenTransform transform, int width, int height) { synchronized (entities) { Collection<RenderedObject> result = new ArrayList<RenderedObject>(); for (T next : entities) { result.add(new RenderedObject(next, render(next, g, transform))); } return result; } } /** Render an entity and return the shape. This shape is used for resolving mouse-clicks so should represent a hit-box for the entity. @param entity The entity to render. @param graphics The graphics to render on. @param transform A helpful coordinate transformer. @return A Shape that represents the hit-box of the rendered entity. */ public abstract Shape render(T entity, Graphics2D graphics, ScreenTransform transform); /** Perform any pre-processing required before {@link #view} has been called. */ protected void preView() { } /** Perform any post-processing required after {@link #view} has been called. */ protected void postView() { } }