renderablelayer.java
来自「world wind java sdk 源码」· Java 代码 · 共 376 行
JAVA
376 行
/*Copyright (C) 2001, 2006 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved.*/package gov.nasa.worldwind.layers;import gov.nasa.worldwind.*;import gov.nasa.worldwind.pick.PickSupport;import gov.nasa.worldwind.render.*;import gov.nasa.worldwind.util.Logging;import javax.media.opengl.GL;/** * The <code>RenderableLayer</code> class manages a collection of {@link gov.nasa.worldwind.render.Renderable} objects * for rendering, picking, and disposal. * * @author tag * @version $Id: RenderableLayer.java 10048 2009-04-09 03:58:38Z dcollins $ * @see gov.nasa.worldwind.render.Renderable */public class RenderableLayer extends AbstractLayer{ private java.util.Collection<Renderable> renderables = new java.util.concurrent.ConcurrentLinkedQueue<Renderable>(); private Iterable<Renderable> renderablesOverride; protected PickSupport pickSupport = new PickSupport(); protected Layer delegateOwner; /** * Creates a new <code>RenderableLayer</code> with a null <code>delegateOwner</code> */ public RenderableLayer() { this.delegateOwner = null; } /** * Creates a new <code>RenderableLayer</code> with the specified <code>delegateOwner</code>. * * @param delegateOwner Layer that is this layer's delegate owner. */ public RenderableLayer(Layer delegateOwner) { this.delegateOwner = delegateOwner; } /** * Adds the specified <code>renderable</code> to this layer's internal collection. If this layer's internal * collection has been overriden with a call to {@link #setRenderables}, this will throw an exception. * * @param renderable Renderable to add. * @throws IllegalArgumentException If <code>renderable</code> is null. * @throws IllegalStateException If a custom Iterable has been specified by a call to <code>setRenderables</code>. */ public void addRenderable(Renderable renderable) { if (renderable == null) { String msg = Logging.getMessage("nullValue.RenderableIsNull"); Logging.logger().severe(msg); throw new IllegalArgumentException(msg); } if (this.renderablesOverride != null) { String msg = Logging.getMessage("generic.LayerIsUsingCustomIterable"); Logging.logger().severe(msg); throw new IllegalStateException(msg); } this.renderables.add(renderable); } /** * Adds the contents of the specified <code>renderables</code> to this layer's internal collection. If this layer's * internal collection has been overriden with a call to {@link #setRenderables}, this will throw an exception. * * @param renderables Renderables to add. * @throws IllegalArgumentException If <code>renderables</code> is null. * @throws IllegalStateException If a custom Iterable has been specified by a call to <code>setRenderables</code>. */ public void addRenderables(Iterable<? extends Renderable> renderables) { if (renderables == null) { String msg = Logging.getMessage("nullValue.IterableIsNull"); Logging.logger().severe(msg); throw new IllegalArgumentException(msg); } if (this.renderablesOverride != null) { String msg = Logging.getMessage("generic.LayerIsUsingCustomIterable"); Logging.logger().severe(msg); throw new IllegalStateException(msg); } for (Renderable renderable : renderables) { // Internal list of renderables does not accept null values. if (renderable != null) this.renderables.add(renderable); } } /** * Removes the specified <code>renderable</code> from this layer's internal collection, if it exists. If this * layer's internal collection has been overriden with a call to {@link #setRenderables}, this will throw an * exception. * * @param renderable Renderable to remove. * @throws IllegalArgumentException If <code>renderable</code> is null. * @throws IllegalStateException If a custom Iterable has been specified by a call to <code>setRenderables</code>. */ public void removeRenderable(Renderable renderable) { if (renderable == null) { String msg = Logging.getMessage("nullValue.RenderableIsNull"); Logging.logger().severe(msg); throw new IllegalArgumentException(msg); } if (this.renderablesOverride != null) { String msg = Logging.getMessage("generic.LayerIsUsingCustomIterable"); Logging.logger().severe(msg); throw new IllegalStateException(msg); } this.renderables.remove(renderable); } /** * Clears the contents of this layer's internal Renderable collection. If this layer's internal collection has been * overriden with a call to {@link #setRenderables}, this will throw an exception. * * @throws IllegalStateException If a custom Iterable has been specified by a call to <code>setRenderables</code>. */ public void removeAllRenderables() { if (this.renderablesOverride != null) { String msg = Logging.getMessage("generic.LayerIsUsingCustomIterable"); Logging.logger().severe(msg); throw new IllegalStateException(msg); } this.clearRenderables(); } protected void clearRenderables() { if (this.renderables != null && this.renderables.size() > 0) this.renderables.clear(); } public int getNumRenderables() { if (this.renderablesOverride != null) { int size = 0; //noinspection UnusedDeclaration for (Renderable r : this.renderablesOverride) ++size; return size; } else { return this.renderables.size(); } } /** * Returns the Iterable of Renderables currently in use by this layer. If the caller has specified a custom Iterable * via {@link #setRenderables}, this will returns a reference to that Iterable. If the caller passed * <code>setRenderables</code> a null parameter, or if <code>setRenderables</code> has not been called, this returns * a view of this layer's internal collection of Renderables. * * @return Iterable of currently active Renderables. */ public Iterable<Renderable> getRenderables() { return this.getActiveRenderables(); } /** * Returns the Iterable of currently active Renderables. If the caller has specified a custom Iterable via {@link * #setRenderables}, this will returns a reference to that Iterable. If the caller passed * <code>setRenderables</code> a null parameter, or if <code>setRenderables</code> has not been called, this returns * a view of this layer's internal collection of Renderables. * * @return Iterable of currently active Renderables. */ protected Iterable<Renderable> getActiveRenderables() { if (this.renderablesOverride != null) { return this.renderablesOverride; } else { // Return an unmodifiable reference to the internal list of renderables. // This prevents callers from changing this list and invalidating any invariants we have established. return java.util.Collections.unmodifiableCollection(this.renderables); } } /** * Overrides the collection of currently active Renderables with the specified <code>renderableIterable</code>. This * layer will maintain a reference to <code>renderableIterable</code> strictly for picking and rendering. This layer * will not modify the reference, or dispose of its contents. This will also clear and dispose of the internal * collection of Renderables, and will prevent any modification to its contents via <code>addRenderable, * addRenderables, removeRenderables, or dispose</code>. * <p/> * If the specified <code>renderableIterable</code> is null, this layer will revert to maintaining its internal * collection. * * @param renderableIterable Iterable to use instead of this layer's internal collection, or null to use this * layer's internal collection. */ public void setRenderables(Iterable<Renderable> renderableIterable) { this.renderablesOverride = renderableIterable; // Dispose of the internal collection of Renderables. this.disposeRenderables(); // Clear the internal collection of Renderables. this.clearRenderables(); } /** * Returns this layer's delegate owner, or null if none has been specified. * * @return Layer that is this layer's delegate owner. */ public Layer getDelegateOwner() { return this.delegateOwner; } /** * Opacity is not applied to layers of this type because each renderable typically has its own opacity control. * * @param opacity the current opacity value, which is ignored by this layer. */ @Override public void setOpacity(double opacity) { super.setOpacity(opacity); } /** * Returns the layer's opacity value, which is ignored by this layer because each of its renderables typiically has * its own opacity control. * * @return The layer opacity, a value between 0 and 1. */ @Override public double getOpacity() { return super.getOpacity(); } /** * Disposes the contents of this layer's internal Renderable collection, but does not remove any elements from that * collection. * * @throws IllegalStateException If a custom Iterable has been specified by a call to <code>setRenderables</code>. */ public void dispose() { if (this.renderablesOverride != null) { String msg = Logging.getMessage("generic.LayerIsUsingCustomIterable"); Logging.logger().severe(msg); throw new IllegalStateException(msg); } this.disposeRenderables(); } protected void disposeRenderables() { if (this.renderables != null && this.renderables.size() > 0) { for (Renderable renderable : this.renderables) { if (renderable instanceof Disposable) ((Disposable) renderable).dispose(); } } } protected void doPreRender(DrawContext dc) { this.doPreRender(dc, this.getActiveRenderables()); } protected void doPick(DrawContext dc, java.awt.Point pickPoint) { this.doPick(dc, this.getActiveRenderables(), pickPoint); } protected void doRender(DrawContext dc) { this.doRender(dc, this.getActiveRenderables()); } protected void doPreRender(DrawContext dc, Iterable<? extends Renderable> renderables) { for (Renderable renderable : renderables) { // If the caller has specified their own Iterable, // then we cannot make any guarantees about its contents. if (renderable != null && renderable instanceof PreRenderable) ((PreRenderable) renderable).preRender(dc); } } protected void doPick(DrawContext dc, Iterable<? extends Renderable> renderables, java.awt.Point pickPoint) { this.pickSupport.clearPickList(); this.pickSupport.beginPicking(dc); for (Renderable renderable : renderables) { // If the caller has specified their own Iterable, // then we cannot make any guarantees about its contents. if (renderable != null) { float[] inColor = new float[4]; dc.getGL().glGetFloatv(GL.GL_CURRENT_COLOR, inColor, 0); java.awt.Color color = dc.getUniquePickColor(); dc.getGL().glColor3ub((byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue()); renderable.render(dc); dc.getGL().glColor4fv(inColor, 0); if (renderable instanceof Locatable) { this.pickSupport.addPickableObject(color.getRGB(), renderable, ((Locatable) renderable).getPosition(), false); } else { this.pickSupport.addPickableObject(color.getRGB(), renderable); } } } this.pickSupport.resolvePick(dc, pickPoint, this.delegateOwner != null ? this.delegateOwner : this); this.pickSupport.endPicking(dc); } protected void doRender(DrawContext dc, Iterable<? extends Renderable> renderables) { for (Renderable renderable : renderables) { // If the caller has specified their own Iterable, // then we cannot make any guarantees about its contents. if (renderable != null) renderable.render(dc); } } @Override public String toString() { return Logging.getMessage("layers.RenderableLayer.Name"); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?