LabelVisualizer.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*global define*/
  2. define([
  3. '../Core/AssociativeArray',
  4. '../Core/Cartesian2',
  5. '../Core/Cartesian3',
  6. '../Core/Color',
  7. '../Core/defined',
  8. '../Core/destroyObject',
  9. '../Core/DeveloperError',
  10. '../Core/NearFarScalar',
  11. '../Scene/HorizontalOrigin',
  12. '../Scene/LabelCollection',
  13. '../Scene/LabelStyle',
  14. '../Scene/VerticalOrigin',
  15. './Property'
  16. ], function(
  17. AssociativeArray,
  18. Cartesian2,
  19. Cartesian3,
  20. Color,
  21. defined,
  22. destroyObject,
  23. DeveloperError,
  24. NearFarScalar,
  25. HorizontalOrigin,
  26. LabelCollection,
  27. LabelStyle,
  28. VerticalOrigin,
  29. Property) {
  30. "use strict";
  31. var defaultScale = 1.0;
  32. var defaultFont = '30px sans-serif';
  33. var defaultStyle = LabelStyle.FILL;
  34. var defaultFillColor = Color.WHITE;
  35. var defaultOutlineColor = Color.BLACK;
  36. var defaultOutlineWidth = 1;
  37. var defaultPixelOffset = Cartesian2.ZERO;
  38. var defaultEyeOffset = Cartesian3.ZERO;
  39. var defaultHorizontalOrigin = HorizontalOrigin.CENTER;
  40. var defaultVerticalOrigin = VerticalOrigin.CENTER;
  41. var position = new Cartesian3();
  42. var fillColor = new Color();
  43. var outlineColor = new Color();
  44. var eyeOffset = new Cartesian3();
  45. var pixelOffset = new Cartesian2();
  46. var translucencyByDistance = new NearFarScalar();
  47. var pixelOffsetScaleByDistance = new NearFarScalar();
  48. var EntityData = function(entity) {
  49. this.entity = entity;
  50. this.label = undefined;
  51. this.index = undefined;
  52. };
  53. /**
  54. * A {@link Visualizer} which maps the {@link LabelGraphics} instance
  55. * in {@link Entity#label} to a {@link Label}.
  56. * @alias LabelVisualizer
  57. * @constructor
  58. *
  59. * @param {Scene} scene The scene the primitives will be rendered in.
  60. * @param {EntityCollection} entityCollection The entityCollection to visualize.
  61. */
  62. var LabelVisualizer = function(scene, entityCollection) {
  63. //>>includeStart('debug', pragmas.debug);
  64. if (!defined(scene)) {
  65. throw new DeveloperError('scene is required.');
  66. }
  67. if (!defined(entityCollection)) {
  68. throw new DeveloperError('entityCollection is required.');
  69. }
  70. //>>includeEnd('debug');
  71. entityCollection.collectionChanged.addEventListener(LabelVisualizer.prototype._onCollectionChanged, this);
  72. this._scene = scene;
  73. this._unusedIndexes = [];
  74. this._labelCollection = undefined;
  75. this._entityCollection = entityCollection;
  76. this._items = new AssociativeArray();
  77. this._onCollectionChanged(entityCollection, entityCollection.entities, [], []);
  78. };
  79. /**
  80. * Updates the primitives created by this visualizer to match their
  81. * Entity counterpart at the given time.
  82. *
  83. * @param {JulianDate} time The time to update to.
  84. * @returns {Boolean} This function always returns true.
  85. */
  86. LabelVisualizer.prototype.update = function(time) {
  87. //>>includeStart('debug', pragmas.debug);
  88. if (!defined(time)) {
  89. throw new DeveloperError('time is required.');
  90. }
  91. //>>includeEnd('debug');
  92. var items = this._items.values;
  93. var unusedIndexes = this._unusedIndexes;
  94. for (var i = 0, len = items.length; i < len; i++) {
  95. var item = items[i];
  96. var entity = item.entity;
  97. var labelGraphics = entity._label;
  98. var text;
  99. var label = item.label;
  100. var show = entity.isAvailable(time) && Property.getValueOrDefault(labelGraphics._show, time, true);
  101. if (show) {
  102. position = Property.getValueOrUndefined(entity._position, time, position);
  103. text = Property.getValueOrUndefined(labelGraphics._text, time);
  104. show = defined(position) && defined(text);
  105. }
  106. if (!show) {
  107. //don't bother creating or updating anything else
  108. returnLabel(item, unusedIndexes);
  109. continue;
  110. }
  111. if (!defined(label)) {
  112. var labelCollection = this._labelCollection;
  113. if (!defined(labelCollection)) {
  114. labelCollection = new LabelCollection();
  115. this._labelCollection = labelCollection;
  116. this._scene.primitives.add(labelCollection);
  117. }
  118. var length = unusedIndexes.length;
  119. if (length > 0) {
  120. var index = unusedIndexes.pop();
  121. item.index = index;
  122. label = labelCollection.get(index);
  123. } else {
  124. label = labelCollection.add();
  125. item.index = labelCollection.length - 1;
  126. }
  127. label.id = entity;
  128. item.label = label;
  129. }
  130. label.show = true;
  131. label.position = position;
  132. label.text = text;
  133. label.scale = Property.getValueOrDefault(labelGraphics._scale, time, defaultScale);
  134. label.font = Property.getValueOrDefault(labelGraphics._font, time, defaultFont);
  135. label.style = Property.getValueOrDefault(labelGraphics._style, time, defaultStyle);
  136. label.fillColor = Property.getValueOrDefault(labelGraphics._fillColor, time, defaultFillColor, fillColor);
  137. label.outlineColor = Property.getValueOrDefault(labelGraphics._outlineColor, time, defaultOutlineColor, outlineColor);
  138. label.outlineWidth = Property.getValueOrDefault(labelGraphics._outlineWidth, time, defaultOutlineWidth);
  139. label.pixelOffset = Property.getValueOrDefault(labelGraphics._pixelOffset, time, defaultPixelOffset, pixelOffset);
  140. label.eyeOffset = Property.getValueOrDefault(labelGraphics._eyeOffset, time, defaultEyeOffset, eyeOffset);
  141. label.horizontalOrigin = Property.getValueOrDefault(labelGraphics._horizontalOrigin, time, defaultHorizontalOrigin);
  142. label.verticalOrigin = Property.getValueOrDefault(labelGraphics._verticalOrigin, time, defaultVerticalOrigin);
  143. label.translucencyByDistance = Property.getValueOrUndefined(labelGraphics._translucencyByDistance, time, translucencyByDistance);
  144. label.pixelOffsetScaleByDistance = Property.getValueOrUndefined(labelGraphics._pixelOffsetScaleByDistance, time, pixelOffsetScaleByDistance);
  145. }
  146. return true;
  147. };
  148. /**
  149. * Returns true if this object was destroyed; otherwise, false.
  150. *
  151. * @returns {Boolean} True if this object was destroyed; otherwise, false.
  152. */
  153. LabelVisualizer.prototype.isDestroyed = function() {
  154. return false;
  155. };
  156. /**
  157. * Removes and destroys all primitives created by this instance.
  158. */
  159. LabelVisualizer.prototype.destroy = function() {
  160. this._entityCollection.collectionChanged.removeEventListener(LabelVisualizer.prototype._onCollectionChanged, this);
  161. if (defined(this._labelCollection)) {
  162. this._scene.primitives.remove(this._labelCollection);
  163. }
  164. return destroyObject(this);
  165. };
  166. LabelVisualizer.prototype._onCollectionChanged = function(entityCollection, added, removed, changed) {
  167. var i;
  168. var entity;
  169. var unusedIndexes = this._unusedIndexes;
  170. var items = this._items;
  171. for (i = added.length - 1; i > -1; i--) {
  172. entity = added[i];
  173. if (defined(entity._label) && defined(entity._position)) {
  174. items.set(entity.id, new EntityData(entity));
  175. }
  176. }
  177. for (i = changed.length - 1; i > -1; i--) {
  178. entity = changed[i];
  179. if (defined(entity._label) && defined(entity._position)) {
  180. if (!items.contains(entity.id)) {
  181. items.set(entity.id, new EntityData(entity));
  182. }
  183. } else {
  184. returnLabel(items.get(entity.id), unusedIndexes);
  185. items.remove(entity.id);
  186. }
  187. }
  188. for (i = removed.length - 1; i > -1; i--) {
  189. entity = removed[i];
  190. returnLabel(items.get(entity.id), unusedIndexes);
  191. items.remove(entity.id);
  192. }
  193. };
  194. function returnLabel(item, unusedIndexes) {
  195. if (defined(item)) {
  196. var label = item.label;
  197. if (defined(label)) {
  198. unusedIndexes.push(item.index);
  199. label.show = false;
  200. item.label = undefined;
  201. item.index = -1;
  202. }
  203. }
  204. }
  205. return LabelVisualizer;
  206. });