| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 | 
							- /*global define*/
 
- define([
 
-         '../Core/AssociativeArray',
 
-         '../Core/Color',
 
-         '../Core/ColorGeometryInstanceAttribute',
 
-         '../Core/defined',
 
-         '../Core/ShowGeometryInstanceAttribute',
 
-         '../Scene/PerInstanceColorAppearance',
 
-         '../Scene/Primitive'
 
-     ], function(
 
-         AssociativeArray,
 
-         Color,
 
-         ColorGeometryInstanceAttribute,
 
-         defined,
 
-         ShowGeometryInstanceAttribute,
 
-         PerInstanceColorAppearance,
 
-         Primitive) {
 
-     "use strict";
 
-     var Batch = function(primitives, translucent, width) {
 
-         this.translucent = translucent;
 
-         this.primitives = primitives;
 
-         this.createPrimitive = false;
 
-         this.primitive = undefined;
 
-         this.oldPrimitive = undefined;
 
-         this.geometry = new AssociativeArray();
 
-         this.updaters = new AssociativeArray();
 
-         this.updatersWithAttributes = new AssociativeArray();
 
-         this.attributes = new AssociativeArray();
 
-         this.itemsToRemove = [];
 
-         this.width = width;
 
-     };
 
-     Batch.prototype.add = function(updater, instance) {
 
-         var id = updater.entity.id;
 
-         this.createPrimitive = true;
 
-         this.geometry.set(id, instance);
 
-         this.updaters.set(id, updater);
 
-         if (!updater.hasConstantOutline || !updater.outlineColorProperty.isConstant) {
 
-             this.updatersWithAttributes.set(id, updater);
 
-         }
 
-     };
 
-     Batch.prototype.remove = function(updater) {
 
-         var id = updater.entity.id;
 
-         this.createPrimitive = this.geometry.remove(id) || this.createPrimitive;
 
-         this.updaters.remove(id);
 
-         this.updatersWithAttributes.remove(id);
 
-     };
 
-     var colorScratch = new Color();
 
-     Batch.prototype.update = function(time) {
 
-         var show = true;
 
-         var isUpdated = true;
 
-         var removedCount = 0;
 
-         var primitive = this.primitive;
 
-         var primitives = this.primitives;
 
-         if (this.createPrimitive) {
 
-             this.attributes.removeAll();
 
-             if (defined(primitive)) {
 
-                 if (primitive.ready) {
 
-                     this.oldPrimitive = primitive;
 
-                 } else {
 
-                     primitives.remove(primitive);
 
-                 }
 
-                 show = false;
 
-             }
 
-             var geometry = this.geometry.values;
 
-             if (geometry.length > 0) {
 
-                 primitive = new Primitive({
 
-                     asynchronous : true,
 
-                     geometryInstances : geometry,
 
-                     appearance : new PerInstanceColorAppearance({
 
-                         flat : true,
 
-                         translucent : this.translucent,
 
-                         renderState : {
 
-                             lineWidth : this.width
 
-                         }
 
-                     })
 
-                 });
 
-                 primitives.add(primitive);
 
-                 isUpdated = false;
 
-                 primitive.show = show;
 
-             }
 
-             this.primitive = primitive;
 
-             this.createPrimitive = false;
 
-         } else if (defined(primitive) && primitive.ready) {
 
-             if (defined(this.oldPrimitive)) {
 
-                 primitives.remove(this.oldPrimitive);
 
-                 this.oldPrimitive = undefined;
 
-                 primitive.show = true;
 
-             }
 
-             var updatersWithAttributes = this.updatersWithAttributes.values;
 
-             var length = updatersWithAttributes.length;
 
-             for (var i = 0; i < length; i++) {
 
-                 var updater = updatersWithAttributes[i];
 
-                 var instance = this.geometry.get(updater.entity.id);
 
-                 var attributes = this.attributes.get(instance.id.id);
 
-                 if (!defined(attributes)) {
 
-                     attributes = primitive.getGeometryInstanceAttributes(instance.id);
 
-                     this.attributes.set(instance.id.id, attributes);
 
-                 }
 
-                 if (!updater.outlineColorProperty.isConstant) {
 
-                     var outlineColorProperty = updater.outlineColorProperty;
 
-                     outlineColorProperty.getValue(time, colorScratch);
 
-                     if (!Color.equals(attributes._lastColor, colorScratch)) {
 
-                         attributes._lastColor = Color.clone(colorScratch, attributes._lastColor);
 
-                         attributes.color = ColorGeometryInstanceAttribute.toValue(colorScratch, attributes.color);
 
-                         if ((this.translucent && attributes.color[3] === 255) || (!this.translucent && attributes.color[3] !== 255)) {
 
-                             this.itemsToRemove[removedCount++] = updater;
 
-                         }
 
-                     }
 
-                 }
 
-                 if (!updater.hasConstantOutline) {
 
-                     show = updater.isOutlineVisible(time);
 
-                     if (show !== attributes._lastShow) {
 
-                         attributes._lastShow = show;
 
-                         attributes.show = ShowGeometryInstanceAttribute.toValue(show, attributes.show);
 
-                     }
 
-                 }
 
-             }
 
-         } else if (defined(primitive) && !primitive.ready) {
 
-             isUpdated = false;
 
-         }
 
-         this.itemsToRemove.length = removedCount;
 
-         return isUpdated;
 
-     };
 
-     Batch.prototype.removeAllPrimitives = function() {
 
-         var primitive = this.primitive;
 
-         if (defined(primitive)) {
 
-             this.primitives.remove(primitive);
 
-             this.primitive = undefined;
 
-             this.geometry.removeAll();
 
-             this.updaters.removeAll();
 
-         }
 
-     };
 
-     /**
 
-      * @private
 
-      */
 
-     var StaticOutlineGeometryBatch = function(primitives, scene) {
 
-         this._primitives = primitives;
 
-         this._scene = scene;
 
-         this._solidBatches = new AssociativeArray();
 
-         this._translucentBatches = new AssociativeArray();
 
-     };
 
-     StaticOutlineGeometryBatch.prototype.add = function(time, updater) {
 
-         var instance = updater.createOutlineGeometryInstance(time);
 
-         var width = this._scene.clampLineWidth(updater.outlineWidth);
 
-         var batches;
 
-         var batch;
 
-         if (instance.attributes.color.value[3] === 255) {
 
-             batches = this._solidBatches;
 
-             batch = batches.get(width);
 
-             if (!defined(batch)) {
 
-                 batch = new Batch(this._primitives, false, width);
 
-                 batches.set(width, batch);
 
-             }
 
-             batch.add(updater, instance);
 
-         } else {
 
-             batches = this._translucentBatches;
 
-             batch = batches.get(width);
 
-             if (!defined(batch)) {
 
-                 batch = new Batch(this._primitives, true, width);
 
-                 batches.set(width, batch);
 
-             }
 
-             batch.add(updater, instance);
 
-         }
 
-     };
 
-     StaticOutlineGeometryBatch.prototype.remove = function(updater) {
 
-         var i;
 
-         var solidBatches = this._solidBatches.values;
 
-         var solidBatchesLength = solidBatches.length;
 
-         for (i = 0; i < solidBatchesLength; i++) {
 
-             if (solidBatches[i].remove(updater)) {
 
-                 return;
 
-             }
 
-         }
 
-         var translucentBatches = this._translucentBatches.values;
 
-         var translucentBatchesLength = translucentBatches.length;
 
-         for (i = 0; i < translucentBatchesLength; i++) {
 
-             if (translucentBatches.remove(updater)) {
 
-                 return;
 
-             }
 
-         }
 
-     };
 
-     StaticOutlineGeometryBatch.prototype.update = function(time) {
 
-         var i;
 
-         var x;
 
-         var updater;
 
-         var batch;
 
-         var solidBatches = this._solidBatches.values;
 
-         var solidBatchesLength = solidBatches.length;
 
-         var translucentBatches = this._translucentBatches.values;
 
-         var translucentBatchesLength = translucentBatches.length;
 
-         var itemsToRemove;
 
-         var isUpdated = true;
 
-         var needUpdate = false;
 
-         do {
 
-             needUpdate = false;
 
-             for (x = 0; x < solidBatchesLength; x++) {
 
-                 batch = solidBatches[x];
 
-                 //Perform initial update
 
-                 isUpdated = batch.update(time);
 
-                 //If any items swapped between solid/translucent, we need to
 
-                 //move them between batches
 
-                 itemsToRemove = batch.itemsToRemove;
 
-                 var solidsToMoveLength = itemsToRemove.length;
 
-                 if (solidsToMoveLength > 0) {
 
-                     needUpdate = true;
 
-                     for (i = 0; i < solidsToMoveLength; i++) {
 
-                         updater = itemsToRemove[i];
 
-                         batch.remove(updater);
 
-                         this.add(time, updater);
 
-                     }
 
-                 }
 
-             }
 
-             for (x = 0; x < translucentBatchesLength; x++) {
 
-                 batch = translucentBatches[x];
 
-                 //Perform initial update
 
-                 isUpdated = batch.update(time);
 
-                 //If any items swapped between solid/translucent, we need to
 
-                 //move them between batches
 
-                 itemsToRemove = batch.itemsToRemove;
 
-                 var translucentToMoveLength = itemsToRemove.length;
 
-                 if (translucentToMoveLength > 0) {
 
-                     needUpdate = true;
 
-                     for (i = 0; i < translucentToMoveLength; i++) {
 
-                         updater = itemsToRemove[i];
 
-                         batch.remove(updater);
 
-                         this.add(time, updater);
 
-                     }
 
-                 }
 
-             }
 
-         } while (needUpdate);
 
-         return isUpdated;
 
-     };
 
-     StaticOutlineGeometryBatch.prototype.removeAllPrimitives = function() {
 
-         var i;
 
-         var solidBatches = this._solidBatches.values;
 
-         var solidBatchesLength = solidBatches.length;
 
-         for (i = 0; i < solidBatchesLength; i++) {
 
-             solidBatches[i].removeAllPrimitives();
 
-         }
 
-         var translucentBatches = this._translucentBatches.values;
 
-         var translucentBatchesLength = translucentBatches.length;
 
-         for (i = 0; i < translucentBatchesLength; i++) {
 
-             translucentBatches[i].removeAllPrimitives();
 
-         }
 
-     };
 
-     return StaticOutlineGeometryBatch;
 
- });
 
 
  |