ModelVisualizer.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /*global define*/
  2. define([
  3. '../Core/AssociativeArray',
  4. '../Core/Cartesian3',
  5. '../Core/defined',
  6. '../Core/destroyObject',
  7. '../Core/DeveloperError',
  8. '../Core/Matrix4',
  9. '../Scene/Model',
  10. '../Scene/ModelAnimationLoop',
  11. './Property'
  12. ], function(
  13. AssociativeArray,
  14. Cartesian3,
  15. defined,
  16. destroyObject,
  17. DeveloperError,
  18. Matrix4,
  19. Model,
  20. ModelAnimationLoop,
  21. Property) {
  22. "use strict";
  23. var defaultScale = 1.0;
  24. var defaultMinimumPixelSize = 0.0;
  25. /**
  26. * A {@link Visualizer} which maps {@link Entity#model} to a {@link Model}.
  27. * @alias ModelVisualizer
  28. * @constructor
  29. *
  30. * @param {Scene} scene The scene the primitives will be rendered in.
  31. * @param {EntityCollection} entityCollection The entityCollection to visualize.
  32. */
  33. var ModelVisualizer = function(scene, entityCollection) {
  34. //>>includeStart('debug', pragmas.debug);
  35. if (!defined(scene)) {
  36. throw new DeveloperError('scene is required.');
  37. }
  38. if (!defined(entityCollection)) {
  39. throw new DeveloperError('entityCollection is required.');
  40. }
  41. //>>includeEnd('debug');
  42. entityCollection.collectionChanged.addEventListener(ModelVisualizer.prototype._onCollectionChanged, this);
  43. this._scene = scene;
  44. this._primitives = scene.primitives;
  45. this._entityCollection = entityCollection;
  46. this._modelHash = {};
  47. this._entitiesToVisualize = new AssociativeArray();
  48. this._modelMatrixScratch = new Matrix4();
  49. this._onCollectionChanged(entityCollection, entityCollection.entities, [], []);
  50. };
  51. /**
  52. * Updates models created this visualizer to match their
  53. * Entity counterpart at the given time.
  54. *
  55. * @param {JulianDate} time The time to update to.
  56. * @returns {Boolean} This function always returns true.
  57. */
  58. ModelVisualizer.prototype.update = function(time) {
  59. //>>includeStart('debug', pragmas.debug);
  60. if (!defined(time)) {
  61. throw new DeveloperError('time is required.');
  62. }
  63. //>>includeEnd('debug');
  64. var context = this._scene.context;
  65. var entities = this._entitiesToVisualize.values;
  66. var modelHash = this._modelHash;
  67. var primitives = this._primitives;
  68. var scene = this._scene;
  69. for (var i = 0, len = entities.length; i < len; i++) {
  70. var entity = entities[i];
  71. var modelGraphics = entity._model;
  72. var uri;
  73. var modelData = modelHash[entity.id];
  74. var show = entity.isAvailable(time) && Property.getValueOrDefault(modelGraphics._show, time, true);
  75. var modelMatrix;
  76. if (show) {
  77. modelMatrix = entity._getModelMatrix(time, this._modelMatrixScratch);
  78. uri = Property.getValueOrUndefined(modelGraphics._uri, time);
  79. show = defined(modelMatrix) && defined(uri);
  80. }
  81. if (!show) {
  82. if (defined(modelData)) {
  83. modelData.modelPrimitive.show = false;
  84. }
  85. continue;
  86. }
  87. var model = defined(modelData) ? modelData.modelPrimitive : undefined;
  88. if (!defined(model) || uri !== modelData.uri) {
  89. if (defined(model)) {
  90. primitives.removeAndDestroy(model);
  91. delete modelHash[entity.id];
  92. }
  93. model = Model.fromGltf({
  94. url : uri
  95. });
  96. model.readyToRender.addEventListener(readyToRender, this);
  97. model.id = entity;
  98. primitives.add(model);
  99. modelData = {
  100. modelPrimitive : model,
  101. uri : uri
  102. };
  103. modelHash[entity.id] = modelData;
  104. }
  105. model.show = true;
  106. model.scale = Property.getValueOrDefault(modelGraphics._scale, time, defaultScale);
  107. model.minimumPixelSize = Property.getValueOrDefault(modelGraphics._minimumPixelSize, time, defaultMinimumPixelSize);
  108. model.modelMatrix = Matrix4.clone(modelMatrix, model.modelMatrix);
  109. }
  110. return true;
  111. };
  112. /**
  113. * Returns true if this object was destroyed; otherwise, false.
  114. *
  115. * @returns {Boolean} True if this object was destroyed; otherwise, false.
  116. */
  117. ModelVisualizer.prototype.isDestroyed = function() {
  118. return false;
  119. };
  120. /**
  121. * Removes and destroys all primitives created by this instance.
  122. */
  123. ModelVisualizer.prototype.destroy = function() {
  124. this._entityCollection.collectionChanged.removeEventListener(ModelVisualizer.prototype._onCollectionChanged, this);
  125. var entities = this._entitiesToVisualize.values;
  126. var modelHash = this._modelHash;
  127. var primitives = this._primitives;
  128. for (var i = entities.length - 1; i > -1; i--) {
  129. removeModel(this, entities[i], modelHash, primitives);
  130. }
  131. return destroyObject(this);
  132. };
  133. /**
  134. * @private
  135. */
  136. ModelVisualizer.prototype._onCollectionChanged = function(entityCollection, added, removed, changed) {
  137. var i;
  138. var entity;
  139. var entities = this._entitiesToVisualize;
  140. var modelHash = this._modelHash;
  141. var primitives = this._primitives;
  142. for (i = added.length - 1; i > -1; i--) {
  143. entity = added[i];
  144. if (defined(entity._model) && defined(entity._position)) {
  145. entities.set(entity.id, entity);
  146. }
  147. }
  148. for (i = changed.length - 1; i > -1; i--) {
  149. entity = changed[i];
  150. if (defined(entity._model) && defined(entity._position)) {
  151. entities.set(entity.id, entity);
  152. } else {
  153. removeModel(this, entity, modelHash, primitives);
  154. entities.remove(entity.id);
  155. }
  156. }
  157. for (i = removed.length - 1; i > -1; i--) {
  158. entity = removed[i];
  159. removeModel(this, entity, modelHash, primitives);
  160. entities.remove(entity.id);
  161. }
  162. };
  163. function removeModel(visualizer, entity, modelHash, primitives) {
  164. var modelData = modelHash[entity.id];
  165. if (defined(modelData)) {
  166. var model = modelData.modelPrimitive;
  167. model.readyToRender.removeEventListener(readyToRender, visualizer);
  168. primitives.removeAndDestroy(model);
  169. delete modelHash[entity.id];
  170. }
  171. }
  172. function readyToRender(model) {
  173. model.activeAnimations.addAll({
  174. loop : ModelAnimationLoop.REPEAT
  175. });
  176. }
  177. return ModelVisualizer;
  178. });