From 220edf548720c2ee277a7f0175938e73b3f0b3de Mon Sep 17 00:00:00 2001 From: Wiehann Matthysen Date: Mon, 5 Sep 2016 09:35:27 +0200 Subject: [PATCH 1/6] Offset for GeographicText objects. - Modified the GeographicText interface by adding getter / setter methods to specify an offset. - Implemented the abovementioned getter / setter methods in the UserFacingText class. - Modified both the GeographicTextRenderer and DeclutteringTextRenderer classes by making use of the abovementioned offset property to offset the text of a GeographicText object relative to its position. --- .../render/DeclutteringTextRenderer.java | 11 ++++++++--- .../nasa/worldwind/render/GeographicText.java | 17 +++++++++++++++++ .../render/GeographicTextRenderer.java | 16 ++++++++++------ .../nasa/worldwind/render/UserFacingText.java | 12 ++++++++++++ 4 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java b/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java index 6028c63a65..a1803aff8a 100644 --- a/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java +++ b/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java @@ -245,17 +245,21 @@ protected Vec4 drawText(DrawContext dc, DeclutterableText uText, double scale, d if (color == null) color = DEFAULT_COLOR; color = this.applyOpacity(color, opacity); + + Offset offset = geographicText.getOffset(); + float xOffset = offset.getX().floatValue(); + float yOffset = offset.getY().floatValue(); Color background = geographicText.getBackgroundColor(); if (background != null) { background = this.applyOpacity(background, opacity); textRenderer.setColor(background); - textRenderer.draw3D(charSequence, drawPoint.x + 1, drawPoint.y - 1, 0, 1); + textRenderer.draw3D(charSequence, drawPoint.x + xOffset + 1, drawPoint.y + yOffset - 1, 0, 1); } textRenderer.setColor(color); - textRenderer.draw3D(charSequence, drawPoint.x, drawPoint.y, 0, 1); + textRenderer.draw3D(charSequence, drawPoint.x + xOffset, drawPoint.y + yOffset, 0, 1); textRenderer.flush(); if (scale != 1d) @@ -356,8 +360,9 @@ protected Rectangle2D computeTextBounds(DrawContext dc, DeclutterableText text) Rectangle2D textBound = textRenderer.getBounds(charSequence); double x = screenPoint.x - textBound.getWidth() / 2d; + Offset offset = geographicText.getOffset(); Rectangle2D bounds = new Rectangle2D.Float(); - bounds.setRect(x, screenPoint.y, textBound.getWidth(), textBound.getHeight()); + bounds.setRect(x + offset.x, screenPoint.y + offset.y, textBound.getWidth(), textBound.getHeight()); return bounds; } diff --git a/src/gov/nasa/worldwind/render/GeographicText.java b/src/gov/nasa/worldwind/render/GeographicText.java index da708f0d93..a4cb23e9ba 100644 --- a/src/gov/nasa/worldwind/render/GeographicText.java +++ b/src/gov/nasa/worldwind/render/GeographicText.java @@ -116,4 +116,21 @@ public interface GeographicText * @param d New priority. */ void setPriority(double d); + + /** + * Returns the text offset. The offset determines how to position the text relative to its geographic position. + * + * @return the text offset. + * + * @see #setOffset(Offset) + */ + Offset getOffset(); + + /** + * Specifies a location relative to the label position at which to align the label. The label text begins at the + * point indicated by the offset. + * + * @param offset Offset that controls where to position the label relative to its geographic location. + */ + void setOffset(Offset offset); } diff --git a/src/gov/nasa/worldwind/render/GeographicTextRenderer.java b/src/gov/nasa/worldwind/render/GeographicTextRenderer.java index 9d52742bc0..8d45710f68 100644 --- a/src/gov/nasa/worldwind/render/GeographicTextRenderer.java +++ b/src/gov/nasa/worldwind/render/GeographicTextRenderer.java @@ -678,6 +678,10 @@ protected Vec4 drawText(DrawContext dc, OrderedText uText, double scale, double if (color == null) color = DEFAULT_COLOR; color = this.applyOpacity(color, opacity); + + Offset offset = geographicText.getOffset(); + float xOffset = offset.getX().floatValue(); + float yOffset = offset.getY().floatValue(); Color background = geographicText.getBackgroundColor(); if (background != null) @@ -686,19 +690,19 @@ protected Vec4 drawText(DrawContext dc, OrderedText uText, double scale, double textRenderer.setColor(background); if (this.effect.equals(AVKey.TEXT_EFFECT_SHADOW)) { - textRenderer.draw3D(charSequence, drawPoint.x + 1, drawPoint.y - 1, 0, 1); + textRenderer.draw3D(charSequence, drawPoint.x + xOffset + 1, drawPoint.y + yOffset - 1, 0, 1); } else if (this.effect.equals(AVKey.TEXT_EFFECT_OUTLINE)) { - textRenderer.draw3D(charSequence, drawPoint.x + 1, drawPoint.y - 1, 0, 1); - textRenderer.draw3D(charSequence, drawPoint.x + 1, drawPoint.y + 1, 0, 1); - textRenderer.draw3D(charSequence, drawPoint.x - 1, drawPoint.y - 1, 0, 1); - textRenderer.draw3D(charSequence, drawPoint.x - 1, drawPoint.y + 1, 0, 1); + textRenderer.draw3D(charSequence, drawPoint.x + xOffset + 1, drawPoint.y + yOffset - 1, 0, 1); + textRenderer.draw3D(charSequence, drawPoint.x + xOffset + 1, drawPoint.y + yOffset + 1, 0, 1); + textRenderer.draw3D(charSequence, drawPoint.x + xOffset - 1, drawPoint.y + yOffset - 1, 0, 1); + textRenderer.draw3D(charSequence, drawPoint.x + xOffset - 1, drawPoint.y + yOffset + 1, 0, 1); } } textRenderer.setColor(color); - textRenderer.draw3D(charSequence, drawPoint.x, drawPoint.y, 0, 1); + textRenderer.draw3D(charSequence, drawPoint.x + xOffset, drawPoint.y + yOffset, 0, 1); textRenderer.flush(); if (scale != 1d) diff --git a/src/gov/nasa/worldwind/render/UserFacingText.java b/src/gov/nasa/worldwind/render/UserFacingText.java index 314c15d773..2cf28fd785 100644 --- a/src/gov/nasa/worldwind/render/UserFacingText.java +++ b/src/gov/nasa/worldwind/render/UserFacingText.java @@ -5,6 +5,7 @@ */ package gov.nasa.worldwind.render; +import gov.nasa.worldwind.avlist.AVKey; import gov.nasa.worldwind.geom.Position; import gov.nasa.worldwind.util.Logging; @@ -23,6 +24,7 @@ public class UserFacingText implements GeographicText private Color textBackgroundColor; // Can be null to indicate no background color. private boolean isVisible = true; double priority; //used for label culling + protected Offset offset = new Offset(0.0, 0.0, AVKey.FRACTION, AVKey.FRACTION); public UserFacingText(CharSequence text, Position textPosition) { @@ -63,6 +65,16 @@ public void setPriority(double priority) { this.priority = priority; } + + public Offset getOffset() + { + return this.offset; + } + + public void setOffset(Offset offset) + { + this.offset = offset; + } public Position getPosition() { From 4d472c30939c2885cb97dfaa07282f3d295ab7a7 Mon Sep 17 00:00:00 2001 From: Wiehann Matthysen Date: Mon, 5 Sep 2016 09:38:37 +0200 Subject: [PATCH 2/6] Text-effect added for DeclutteringTextRenderer. Modified the DeclutteringTextRenderer class by adding an additional field called effect. Also, changed this class' drawText() method to be similar to the GeographicTextRenderer class' method where the abovementioned effect field is read to determine if a shadow or an outline should be drawn. --- .../render/DeclutteringTextRenderer.java | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java b/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java index a1803aff8a..148c7ce982 100644 --- a/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java +++ b/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java @@ -6,6 +6,7 @@ package gov.nasa.worldwind.render; +import gov.nasa.worldwind.avlist.AVKey; import gov.nasa.worldwind.geom.*; import gov.nasa.worldwind.globes.Globe2D; import gov.nasa.worldwind.terrain.SectorGeometryList; @@ -32,6 +33,8 @@ public class DeclutteringTextRenderer protected static final Color DEFAULT_COLOR = Color.white; protected final GLU glu = new GLUgl2(); + + private String effect = AVKey.TEXT_EFFECT_SHADOW; // Flag indicating a JOGL text rendering problem. Set to avoid continual exception logging. protected boolean hasJOGLv111Bug = false; @@ -40,6 +43,35 @@ public Font getDefaultFont() { return DEFAULT_FONT; } + + /** + * Get the effect used to decorate the text. Can be one of {@link AVKey#TEXT_EFFECT_SHADOW} (default), {@link + * AVKey#TEXT_EFFECT_OUTLINE} or {@link AVKey#TEXT_EFFECT_NONE}. + * + * @return the effect used for text rendering. + */ + public String getEffect() + { + return this.effect; + } + + /** + * Set the effect used to decorate the text. Can be one of {@link AVKey#TEXT_EFFECT_SHADOW} (default), {@link + * AVKey#TEXT_EFFECT_OUTLINE} or {@link AVKey#TEXT_EFFECT_NONE}. + * + * @param effect the effect to use for text rendering. + */ + public void setEffect(String effect) + { + if (effect == null) + { + String msg = Logging.getMessage("nullValue.StringIsNull"); + Logging.logger().fine(msg); + throw new IllegalArgumentException(msg); + } + + this.effect = effect; + } /** * Returns either a cached or new text renderer for a specified font. @@ -255,7 +287,17 @@ protected Vec4 drawText(DrawContext dc, DeclutterableText uText, double scale, d { background = this.applyOpacity(background, opacity); textRenderer.setColor(background); - textRenderer.draw3D(charSequence, drawPoint.x + xOffset + 1, drawPoint.y + yOffset - 1, 0, 1); + if (this.effect.equals(AVKey.TEXT_EFFECT_SHADOW)) + { + textRenderer.draw3D(charSequence, drawPoint.x + xOffset + 1, drawPoint.y + yOffset - 1, 0, 1); + } + else if (this.effect.equals(AVKey.TEXT_EFFECT_OUTLINE)) + { + textRenderer.draw3D(charSequence, drawPoint.x + xOffset + 1, drawPoint.y + yOffset - 1, 0, 1); + textRenderer.draw3D(charSequence, drawPoint.x + xOffset + 1, drawPoint.y + yOffset + 1, 0, 1); + textRenderer.draw3D(charSequence, drawPoint.x + xOffset - 1, drawPoint.y + yOffset - 1, 0, 1); + textRenderer.draw3D(charSequence, drawPoint.x + xOffset - 1, drawPoint.y + yOffset + 1, 0, 1); + } } textRenderer.setColor(color); From 28f13d30b8bfdaf9ef0d3cd0349580ea02000db6 Mon Sep 17 00:00:00 2001 From: Wiehann Matthysen Date: Mon, 5 Sep 2016 09:44:00 +0200 Subject: [PATCH 3/6] Renamed GeographicTextRenderer. Renamed GeographicTextRenderer to BasicGeographicTextRenderer as we are going to introduce a new inteface called GeographicTextRenderer. --- .../nasa/worldwind/formats/vpf/VPFLayer.java | 2 +- .../worldwind/layers/GraticuleSupport.java | 2 +- ....java => BasicGeographicTextRenderer.java} | 32 +++++++++---------- .../render/DeclutteringTextRenderer.java | 4 +-- .../util/OpenStreetMapShapefileLoader.java | 2 +- 5 files changed, 21 insertions(+), 21 deletions(-) rename src/gov/nasa/worldwind/render/{GeographicTextRenderer.java => BasicGeographicTextRenderer.java} (95%) diff --git a/src/gov/nasa/worldwind/formats/vpf/VPFLayer.java b/src/gov/nasa/worldwind/formats/vpf/VPFLayer.java index 888c6bc14b..df93b3fe11 100644 --- a/src/gov/nasa/worldwind/formats/vpf/VPFLayer.java +++ b/src/gov/nasa/worldwind/formats/vpf/VPFLayer.java @@ -40,7 +40,7 @@ public class VPFLayer extends AbstractLayer protected ArrayList renderableObjects = new ArrayList(); // Renderers - protected GeographicTextRenderer textRenderer = new GeographicTextRenderer(); + protected BasicGeographicTextRenderer textRenderer = new BasicGeographicTextRenderer(); protected VPFSymbolSupport symbolSupport = new VPFSymbolSupport(GeoSymConstants.GEOSYM, "image/png"); // Threaded requests diff --git a/src/gov/nasa/worldwind/layers/GraticuleSupport.java b/src/gov/nasa/worldwind/layers/GraticuleSupport.java index ba980af0b6..b732d7dfb2 100644 --- a/src/gov/nasa/worldwind/layers/GraticuleSupport.java +++ b/src/gov/nasa/worldwind/layers/GraticuleSupport.java @@ -60,7 +60,7 @@ public int hashCode() private Map namedParams = new HashMap(); private Map namedShapeAttributes = new HashMap(); private AVList defaultParams; - private GeographicTextRenderer textRenderer = new GeographicTextRenderer(); + private BasicGeographicTextRenderer textRenderer = new BasicGeographicTextRenderer(); public GraticuleSupport() { diff --git a/src/gov/nasa/worldwind/render/GeographicTextRenderer.java b/src/gov/nasa/worldwind/render/BasicGeographicTextRenderer.java similarity index 95% rename from src/gov/nasa/worldwind/render/GeographicTextRenderer.java rename to src/gov/nasa/worldwind/render/BasicGeographicTextRenderer.java index 8d45710f68..18b6b1098f 100644 --- a/src/gov/nasa/worldwind/render/GeographicTextRenderer.java +++ b/src/gov/nasa/worldwind/render/BasicGeographicTextRenderer.java @@ -25,7 +25,7 @@ * @author dcollins * @version $Id: GeographicTextRenderer.java 2392 2014-10-20 20:02:44Z tgaskins $ */ -public class GeographicTextRenderer +public class BasicGeographicTextRenderer { private TextRenderer lastTextRenderer = null; private final GLU glu = new GLUgl2(); @@ -45,7 +45,7 @@ public class GeographicTextRenderer private boolean hasJOGLv111Bug = false; - public GeographicTextRenderer() + public BasicGeographicTextRenderer() { } @@ -369,14 +369,14 @@ public double getDistanceFromEye() return this.eyeDistance; } - private GeographicTextRenderer getRenderer() + private BasicGeographicTextRenderer getRenderer() { - return GeographicTextRenderer.this; + return BasicGeographicTextRenderer.this; } public void render(DrawContext dc) { - GeographicTextRenderer.this.beginRendering(dc); + BasicGeographicTextRenderer.this.beginRendering(dc); try { if (cullText) @@ -389,7 +389,7 @@ public void render(DrawContext dc) while (nextItem != null && nextItem instanceof OrderedText) { OrderedText ot = (OrderedText) nextItem; - if (ot.getRenderer() != GeographicTextRenderer.this) + if (ot.getRenderer() != BasicGeographicTextRenderer.this) break; textList.add(ot); @@ -402,14 +402,14 @@ public void render(DrawContext dc) ArrayList textBounds = new ArrayList(); for (OrderedText ot : textList) { - double[] scaleAndOpacity = GeographicTextRenderer.this.computeDistanceScaleAndOpacity(dc, ot); - Rectangle2D newBounds = GeographicTextRenderer.this.computeTextBounds(dc, ot, + double[] scaleAndOpacity = BasicGeographicTextRenderer.this.computeDistanceScaleAndOpacity(dc, ot); + Rectangle2D newBounds = BasicGeographicTextRenderer.this.computeTextBounds(dc, ot, scaleAndOpacity[0]); if (newBounds == null) continue; boolean overlap = false; - newBounds = GeographicTextRenderer.this.computeExpandedBounds(newBounds, cullTextMargin); + newBounds = BasicGeographicTextRenderer.this.computeExpandedBounds(newBounds, cullTextMargin); for (Rectangle2D rect : textBounds) { if (rect.intersects(newBounds)) @@ -419,24 +419,24 @@ public void render(DrawContext dc) if (!overlap) { textBounds.add(newBounds); - GeographicTextRenderer.this.drawText(dc, ot, scaleAndOpacity[0], scaleAndOpacity[1]); + BasicGeographicTextRenderer.this.drawText(dc, ot, scaleAndOpacity[0], scaleAndOpacity[1]); } } } else //just draw each label { - double[] scaleAndOpacity = GeographicTextRenderer.this.computeDistanceScaleAndOpacity(dc, this); - GeographicTextRenderer.this.drawText(dc, this, scaleAndOpacity[0], scaleAndOpacity[1]); + double[] scaleAndOpacity = BasicGeographicTextRenderer.this.computeDistanceScaleAndOpacity(dc, this); + BasicGeographicTextRenderer.this.drawText(dc, this, scaleAndOpacity[0], scaleAndOpacity[1]); // Draw as many as we can in a batch to save ogl state switching. Object nextItem = dc.peekOrderedRenderables(); while (nextItem != null && nextItem instanceof OrderedText) { OrderedText ot = (OrderedText) nextItem; - if (ot.getRenderer() != GeographicTextRenderer.this) + if (ot.getRenderer() != BasicGeographicTextRenderer.this) break; - scaleAndOpacity = GeographicTextRenderer.this.computeDistanceScaleAndOpacity(dc, ot); - GeographicTextRenderer.this.drawText(dc, ot, scaleAndOpacity[0], scaleAndOpacity[1]); + scaleAndOpacity = BasicGeographicTextRenderer.this.computeDistanceScaleAndOpacity(dc, ot); + BasicGeographicTextRenderer.this.drawText(dc, ot, scaleAndOpacity[0], scaleAndOpacity[1]); dc.pollOrderedRenderables(); // take it off the queue nextItem = dc.peekOrderedRenderables(); } @@ -452,7 +452,7 @@ public void render(DrawContext dc) } finally { - GeographicTextRenderer.this.endRendering(dc); + BasicGeographicTextRenderer.this.endRendering(dc); } } diff --git a/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java b/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java index 148c7ce982..1f0b36af04 100644 --- a/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java +++ b/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java @@ -21,8 +21,8 @@ import java.util.Iterator; /** - * A simplified version of {@link GeographicTextRenderer} that participates in globe text decluttering. See {@link - * ClutterFilter} for more information on decluttering. + * A simplified version of {@link BasicGeographicTextRenderer} that participates in globe text decluttering. + * See {@link ClutterFilter} for more information on decluttering. * * @author tag * @version $Id: DeclutteringTextRenderer.java 2392 2014-10-20 20:02:44Z tgaskins $ diff --git a/src/gov/nasa/worldwindx/examples/util/OpenStreetMapShapefileLoader.java b/src/gov/nasa/worldwindx/examples/util/OpenStreetMapShapefileLoader.java index 179c49732d..978d9c521a 100644 --- a/src/gov/nasa/worldwindx/examples/util/OpenStreetMapShapefileLoader.java +++ b/src/gov/nasa/worldwindx/examples/util/OpenStreetMapShapefileLoader.java @@ -239,7 +239,7 @@ public OSMShapes(Color color, double scale, double labelMaxAltitude) protected static class TextAndShapesLayer extends RenderableLayer { protected ArrayList labels = new ArrayList(); - protected GeographicTextRenderer textRenderer = new GeographicTextRenderer(); + protected BasicGeographicTextRenderer textRenderer = new BasicGeographicTextRenderer(); public TextAndShapesLayer() { From 9a10beb00b067cf63172931dfaf8ca2f9e765d45 Mon Sep 17 00:00:00 2001 From: Wiehann Matthysen Date: Mon, 5 Sep 2016 09:48:59 +0200 Subject: [PATCH 4/6] Added GeographicTextRenderer interface. - Added a new interface called GeographicTextRenderer. This interface contains methods that are shared between the DeclutteringTextRenderer and BasicGeographicTextRenderer such as getEffect(), setEffect() and the important render() method. - Modified the BasicGeographicTextRenderer class by changing its render() method's signature to correspond to the GeographicTextRenderer's method. Made some additional changes inside the method where Iterable was changed to Iterable. Changed the BasicGeographicTextRenderer class so that it implements the GeographicTextRenderer interface. - Changed the DeclutteringTextRenderer class to implement the GeographicTextRenderer interface. --- .../render/BasicGeographicTextRenderer.java | 8 ++++---- .../render/DeclutteringTextRenderer.java | 2 +- .../worldwind/render/GeographicTextRenderer.java | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 src/gov/nasa/worldwind/render/GeographicTextRenderer.java diff --git a/src/gov/nasa/worldwind/render/BasicGeographicTextRenderer.java b/src/gov/nasa/worldwind/render/BasicGeographicTextRenderer.java index 18b6b1098f..5d288dc386 100644 --- a/src/gov/nasa/worldwind/render/BasicGeographicTextRenderer.java +++ b/src/gov/nasa/worldwind/render/BasicGeographicTextRenderer.java @@ -25,7 +25,7 @@ * @author dcollins * @version $Id: GeographicTextRenderer.java 2392 2014-10-20 20:02:44Z tgaskins $ */ -public class BasicGeographicTextRenderer +public class BasicGeographicTextRenderer implements GeographicTextRenderer { private TextRenderer lastTextRenderer = null; private final GLU glu = new GLUgl2(); @@ -195,7 +195,7 @@ public void setDistanceMinOpacity(double opacity) this.distanceMinOpacity = opacity; } - public void render(DrawContext dc, Iterable text) + public void render(DrawContext dc, Iterable text) { this.drawMany(dc, text); } @@ -208,7 +208,7 @@ public void render(DrawContext dc, GeographicText text, Vec4 textPoint) this.drawOne(dc, text, textPoint); } - private void drawMany(DrawContext dc, Iterable textIterable) + private void drawMany(DrawContext dc, Iterable textIterable) { if (dc == null) { @@ -230,7 +230,7 @@ private void drawMany(DrawContext dc, Iterable textIterable) if (geos == null) return; - Iterator iterator = textIterable.iterator(); + Iterator iterator = textIterable.iterator(); if (!iterator.hasNext()) return; diff --git a/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java b/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java index 1f0b36af04..e2c9fd84a5 100644 --- a/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java +++ b/src/gov/nasa/worldwind/render/DeclutteringTextRenderer.java @@ -27,7 +27,7 @@ * @author tag * @version $Id: DeclutteringTextRenderer.java 2392 2014-10-20 20:02:44Z tgaskins $ */ -public class DeclutteringTextRenderer +public class DeclutteringTextRenderer implements GeographicTextRenderer { protected static final Font DEFAULT_FONT = Font.decode("Arial-PLAIN-12"); protected static final Color DEFAULT_COLOR = Color.white; diff --git a/src/gov/nasa/worldwind/render/GeographicTextRenderer.java b/src/gov/nasa/worldwind/render/GeographicTextRenderer.java new file mode 100644 index 0000000000..2d23555399 --- /dev/null +++ b/src/gov/nasa/worldwind/render/GeographicTextRenderer.java @@ -0,0 +1,15 @@ +/** + * Copyright (C) 2014, United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration, + * All Rights Reserved. + */ +package gov.nasa.worldwind.render; + +public interface GeographicTextRenderer +{ + String getEffect(); + + void setEffect(String effect); + + void render(DrawContext dc, Iterable textIterable); +} \ No newline at end of file From 2dd777bd4cc94ef7c4b670f1846e93b80eaeea45 Mon Sep 17 00:00:00 2001 From: Wiehann Matthysen Date: Mon, 5 Sep 2016 09:52:57 +0200 Subject: [PATCH 5/6] Added TextLayer class. Added missing (and useful) TextLayer class that can also be found in the videso3d project's sources (http://code.google.com/p/videso3d). This layer is primarily used to render GeographicText objects which includes user-facing text labels etc. --- src/gov/nasa/worldwind/layers/TextLayer.java | 120 +++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 src/gov/nasa/worldwind/layers/TextLayer.java diff --git a/src/gov/nasa/worldwind/layers/TextLayer.java b/src/gov/nasa/worldwind/layers/TextLayer.java new file mode 100644 index 0000000000..efdf4a0c10 --- /dev/null +++ b/src/gov/nasa/worldwind/layers/TextLayer.java @@ -0,0 +1,120 @@ +/** + * Copyright (C) 2014, United States Government as represented by the + * Administrator of the National Aeronautics and Space Administration, + * All Rights Reserved. + */ +package gov.nasa.worldwind.layers; + +import gov.nasa.worldwind.render.BasicGeographicTextRenderer; +import gov.nasa.worldwind.render.DrawContext; +import gov.nasa.worldwind.render.GeographicText; +import gov.nasa.worldwind.render.GeographicTextRenderer; +import gov.nasa.worldwind.util.Logging; + +import java.util.Collection; +import java.util.concurrent.ConcurrentLinkedQueue; + +/** + * Layer to support objects of type {@link GeographicText} + * + * @author Bruno Spyckerelle + * @version $Id$ + */ +public class TextLayer extends AbstractLayer +{ + protected GeographicTextRenderer textRenderer; + protected Collection geographicTexts; + + public TextLayer() + { + this.textRenderer = new BasicGeographicTextRenderer(); + this.geographicTexts = new ConcurrentLinkedQueue(); + } + + public GeographicTextRenderer getGeographicTextRenderer() + { + return this.textRenderer; + } + + public void setGeographicTextRenderer(GeographicTextRenderer textRenderer) + { + this.textRenderer = textRenderer; + } + + /** + * Adds the specified text to this layer's internal collection. + * @param text {@link GeographicText} to add. + * @throws IllegalArgumentException If text is null. + */ + public void addGeographicText(GeographicText text) + { + if (text == null) + { + String msg = "nullValue.GeographicTextIsNull"; + Logging.logger().severe(msg); + throw new IllegalArgumentException(msg); + } + this.geographicTexts.add(text); + } + + public void addGeographicTexts(Iterable texts) + { + if (texts == null) + { + String msg = Logging.getMessage("nullValue.IterableIsNull"); + Logging.logger().severe(msg); + throw new IllegalArgumentException(msg); + } + for (GeographicText text : texts) + { + if (text != null) + { + this.geographicTexts.add(text); + } + } + } + + public void removeGeographicText(GeographicText text) + { + if (text == null) + { + String msg = "nullValue.GeographicTextIsNull"; + Logging.logger().severe(msg); + throw new IllegalArgumentException(msg); + } + this.geographicTexts.remove(text); + } + + public void removeGeographicTexts(Iterable texts) + { + if (texts == null) + { + String msg = Logging.getMessage("nullValue.IterableIsNull"); + Logging.logger().severe(msg); + throw new IllegalArgumentException(msg); + } + for (GeographicText text : texts) + { + if (text != null) + { + this.geographicTexts.remove(text); + } + } + } + + public void removeAllGeographicTexts() + { + this.geographicTexts.clear(); + } + + public Iterable getActiveGeographicTexts() + { + return this.geographicTexts; + } + + @Override + protected void doRender(DrawContext dc) + { + this.textRenderer.render(dc, getActiveGeographicTexts()); + } +} \ No newline at end of file From 625d934c5f0764236e182d744a0f36c6f2de791c Mon Sep 17 00:00:00 2001 From: Wiehann Matthysen Date: Tue, 20 Dec 2016 11:59:37 +0200 Subject: [PATCH 6/6] Changed TextLayer to use DeclutteringTextRenderer. Changed the TextLayer class to use DeclutteringTextRenderer as its text-renderer. This allows all text that is added to this layer to participate in global decluttering. --- src/gov/nasa/worldwind/layers/TextLayer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gov/nasa/worldwind/layers/TextLayer.java b/src/gov/nasa/worldwind/layers/TextLayer.java index efdf4a0c10..917a02bf07 100644 --- a/src/gov/nasa/worldwind/layers/TextLayer.java +++ b/src/gov/nasa/worldwind/layers/TextLayer.java @@ -5,7 +5,7 @@ */ package gov.nasa.worldwind.layers; -import gov.nasa.worldwind.render.BasicGeographicTextRenderer; +import gov.nasa.worldwind.render.DeclutteringTextRenderer; import gov.nasa.worldwind.render.DrawContext; import gov.nasa.worldwind.render.GeographicText; import gov.nasa.worldwind.render.GeographicTextRenderer; @@ -27,7 +27,7 @@ public class TextLayer extends AbstractLayer public TextLayer() { - this.textRenderer = new BasicGeographicTextRenderer(); + this.textRenderer = new DeclutteringTextRenderer(); this.geographicTexts = new ConcurrentLinkedQueue(); }