123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829 |
- /* This file is automatically rebuilt by the Cesium build process. */
- define(['exports', './defined-26bd4a03', './Check-da037458', './defaultValue-f2e68450', './Cartesian2-2a723276', './defineProperties-6f7a50f2', './Transforms-65aba0a4', './ComponentDatatype-69643096', './GeometryAttribute-ed359d71', './GeometryAttributes-eecc9f43', './GeometryPipeline-f0b16df6', './IndexDatatype-3de60176', './WebMercatorProjection-f2dc467d'], function (exports, defined, Check, defaultValue, Cartesian2, defineProperties, Transforms, ComponentDatatype, GeometryAttribute, GeometryAttributes, GeometryPipeline, IndexDatatype, WebMercatorProjection) { 'use strict';
- /**
- * Value and type information for per-instance geometry attribute that determines the geometry instance offset
- *
- * @alias OffsetGeometryInstanceAttribute
- * @constructor
- *
- * @param {Number} [x=0] The x translation
- * @param {Number} [y=0] The y translation
- * @param {Number} [z=0] The z translation
- *
- * @private
- *
- * @see GeometryInstance
- * @see GeometryInstanceAttribute
- */
- function OffsetGeometryInstanceAttribute(x, y, z) {
- x = defaultValue.defaultValue(x, 0);
- y = defaultValue.defaultValue(y, 0);
- z = defaultValue.defaultValue(z, 0);
- /**
- * The values for the attributes stored in a typed array.
- *
- * @type Float32Array
- */
- this.value = new Float32Array([x, y, z]);
- }
- defineProperties.defineProperties(OffsetGeometryInstanceAttribute.prototype, {
- /**
- * The datatype of each component in the attribute, e.g., individual elements in
- * {@link OffsetGeometryInstanceAttribute#value}.
- *
- * @memberof OffsetGeometryInstanceAttribute.prototype
- *
- * @type {ComponentDatatype}
- * @readonly
- *
- * @default {@link ComponentDatatype.FLOAT}
- */
- componentDatatype : {
- get : function() {
- return ComponentDatatype.ComponentDatatype.FLOAT;
- }
- },
- /**
- * The number of components in the attributes, i.e., {@link OffsetGeometryInstanceAttribute#value}.
- *
- * @memberof OffsetGeometryInstanceAttribute.prototype
- *
- * @type {Number}
- * @readonly
- *
- * @default 3
- */
- componentsPerAttribute : {
- get : function() {
- return 3;
- }
- },
- /**
- * When <code>true</code> and <code>componentDatatype</code> is an integer format,
- * indicate that the components should be mapped to the range [0, 1] (unsigned)
- * or [-1, 1] (signed) when they are accessed as floating-point for rendering.
- *
- * @memberof OffsetGeometryInstanceAttribute.prototype
- *
- * @type {Boolean}
- * @readonly
- *
- * @default false
- */
- normalize : {
- get : function() {
- return false;
- }
- }
- });
- /**
- * Creates a new {@link OffsetGeometryInstanceAttribute} instance given the provided an enabled flag and {@link DistanceDisplayCondition}.
- *
- * @param {Cartesian3} offset The cartesian offset
- * @returns {OffsetGeometryInstanceAttribute} The new {@link OffsetGeometryInstanceAttribute} instance.
- */
- OffsetGeometryInstanceAttribute.fromCartesian3 = function(offset) {
- //>>includeStart('debug', pragmas.debug);
- Check.Check.defined('offset', offset);
- //>>includeEnd('debug');
- return new OffsetGeometryInstanceAttribute(offset.x, offset.y, offset.z);
- };
- /**
- * Converts a distance display condition to a typed array that can be used to assign a distance display condition attribute.
- *
- * @param {Cartesian3} offset The cartesian offset
- * @param {Float32Array} [result] The array to store the result in, if undefined a new instance will be created.
- * @returns {Float32Array} The modified result parameter or a new instance if result was undefined.
- *
- * @example
- * var attributes = primitive.getGeometryInstanceAttributes('an id');
- * attributes.modelMatrix = Cesium.OffsetGeometryInstanceAttribute.toValue(modelMatrix, attributes.modelMatrix);
- */
- OffsetGeometryInstanceAttribute.toValue = function(offset, result) {
- //>>includeStart('debug', pragmas.debug);
- Check.Check.defined('offset', offset);
- //>>includeEnd('debug');
- if (!defined.defined(result)) {
- result = new Float32Array([offset.x, offset.y, offset.z]);
- }
- result[0] = offset.x;
- result[1] = offset.y;
- result[2] = offset.z;
- return result;
- };
- function transformToWorldCoordinates(instances, primitiveModelMatrix, scene3DOnly) {
- var toWorld = !scene3DOnly;
- var length = instances.length;
- var i;
- if (!toWorld && (length > 1)) {
- var modelMatrix = instances[0].modelMatrix;
- for (i = 1; i < length; ++i) {
- if (!Transforms.Matrix4.equals(modelMatrix, instances[i].modelMatrix)) {
- toWorld = true;
- break;
- }
- }
- }
- if (toWorld) {
- for (i = 0; i < length; ++i) {
- if (defined.defined(instances[i].geometry)) {
- GeometryPipeline.GeometryPipeline.transformToWorldCoordinates(instances[i]);
- }
- }
- } else {
- // Leave geometry in local coordinate system; auto update model-matrix.
- Transforms.Matrix4.multiplyTransformation(primitiveModelMatrix, instances[0].modelMatrix, primitiveModelMatrix);
- }
- }
- function addGeometryBatchId(geometry, batchId) {
- var attributes = geometry.attributes;
- var positionAttr = attributes.position;
- var numberOfComponents = positionAttr.values.length / positionAttr.componentsPerAttribute;
- attributes.batchId = new GeometryAttribute.GeometryAttribute({
- componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
- componentsPerAttribute : 1,
- values : new Float32Array(numberOfComponents)
- });
- var values = attributes.batchId.values;
- for (var j = 0; j < numberOfComponents; ++j) {
- values[j] = batchId;
- }
- }
- function addBatchIds(instances) {
- var length = instances.length;
- for (var i = 0; i < length; ++i) {
- var instance = instances[i];
- if (defined.defined(instance.geometry)) {
- addGeometryBatchId(instance.geometry, i);
- } else if (defined.defined(instance.westHemisphereGeometry) && defined.defined(instance.eastHemisphereGeometry)) {
- addGeometryBatchId(instance.westHemisphereGeometry, i);
- addGeometryBatchId(instance.eastHemisphereGeometry, i);
- }
- }
- }
- function geometryPipeline(parameters) {
- var instances = parameters.instances;
- var projection = parameters.projection;
- var uintIndexSupport = parameters.elementIndexUintSupported;
- var scene3DOnly = parameters.scene3DOnly;
- var vertexCacheOptimize = parameters.vertexCacheOptimize;
- var compressVertices = parameters.compressVertices;
- var modelMatrix = parameters.modelMatrix;
- var i;
- var geometry;
- var primitiveType;
- var length = instances.length;
- for (i = 0; i < length; ++i) {
- if (defined.defined(instances[i].geometry)) {
- primitiveType = instances[i].geometry.primitiveType;
- break;
- }
- }
- //>>includeStart('debug', pragmas.debug);
- for (i = 1; i < length; ++i) {
- if (defined.defined(instances[i].geometry) && instances[i].geometry.primitiveType !== primitiveType) {
- throw new Check.DeveloperError('All instance geometries must have the same primitiveType.');
- }
- }
- //>>includeEnd('debug');
- // Unify to world coordinates before combining.
- transformToWorldCoordinates(instances, modelMatrix, scene3DOnly);
- // Clip to IDL
- if (!scene3DOnly) {
- for (i = 0; i < length; ++i) {
- if (defined.defined(instances[i].geometry)) {
- GeometryPipeline.GeometryPipeline.splitLongitude(instances[i]);
- }
- }
- }
- addBatchIds(instances);
- // Optimize for vertex shader caches
- if (vertexCacheOptimize) {
- for (i = 0; i < length; ++i) {
- var instance = instances[i];
- if (defined.defined(instance.geometry)) {
- GeometryPipeline.GeometryPipeline.reorderForPostVertexCache(instance.geometry);
- GeometryPipeline.GeometryPipeline.reorderForPreVertexCache(instance.geometry);
- } else if (defined.defined(instance.westHemisphereGeometry) && defined.defined(instance.eastHemisphereGeometry)) {
- GeometryPipeline.GeometryPipeline.reorderForPostVertexCache(instance.westHemisphereGeometry);
- GeometryPipeline.GeometryPipeline.reorderForPreVertexCache(instance.westHemisphereGeometry);
- GeometryPipeline.GeometryPipeline.reorderForPostVertexCache(instance.eastHemisphereGeometry);
- GeometryPipeline.GeometryPipeline.reorderForPreVertexCache(instance.eastHemisphereGeometry);
- }
- }
- }
- // Combine into single geometry for better rendering performance.
- var geometries = GeometryPipeline.GeometryPipeline.combineInstances(instances);
- length = geometries.length;
- for (i = 0; i < length; ++i) {
- geometry = geometries[i];
- // Split positions for GPU RTE
- var attributes = geometry.attributes;
- var name;
- if (!scene3DOnly) {
- for (name in attributes) {
- if (attributes.hasOwnProperty(name) && attributes[name].componentDatatype === ComponentDatatype.ComponentDatatype.DOUBLE) {
- var name3D = name + '3D';
- var name2D = name + '2D';
- // Compute 2D positions
- GeometryPipeline.GeometryPipeline.projectTo2D(geometry, name, name3D, name2D, projection);
- if (defined.defined(geometry.boundingSphere) && name === 'position') {
- geometry.boundingSphereCV = Transforms.BoundingSphere.fromVertices(geometry.attributes.position2D.values);
- }
- GeometryPipeline.GeometryPipeline.encodeAttribute(geometry, name3D, name3D + 'High', name3D + 'Low');
- GeometryPipeline.GeometryPipeline.encodeAttribute(geometry, name2D, name2D + 'High', name2D + 'Low');
- }
- }
- } else {
- for (name in attributes) {
- if (attributes.hasOwnProperty(name) && attributes[name].componentDatatype === ComponentDatatype.ComponentDatatype.DOUBLE) {
- GeometryPipeline.GeometryPipeline.encodeAttribute(geometry, name, name + '3DHigh', name + '3DLow');
- }
- }
- }
- // oct encode and pack normals, compress texture coordinates
- if (compressVertices) {
- GeometryPipeline.GeometryPipeline.compressVertices(geometry);
- }
- }
- if (!uintIndexSupport) {
- // Break into multiple geometries to fit within unsigned short indices if needed
- var splitGeometries = [];
- length = geometries.length;
- for (i = 0; i < length; ++i) {
- geometry = geometries[i];
- splitGeometries = splitGeometries.concat(GeometryPipeline.GeometryPipeline.fitToUnsignedShortIndices(geometry));
- }
- geometries = splitGeometries;
- }
- return geometries;
- }
- function createPickOffsets(instances, geometryName, geometries, pickOffsets) {
- var offset;
- var indexCount;
- var geometryIndex;
- var offsetIndex = pickOffsets.length - 1;
- if (offsetIndex >= 0) {
- var pickOffset = pickOffsets[offsetIndex];
- offset = pickOffset.offset + pickOffset.count;
- geometryIndex = pickOffset.index;
- indexCount = geometries[geometryIndex].indices.length;
- } else {
- offset = 0;
- geometryIndex = 0;
- indexCount = geometries[geometryIndex].indices.length;
- }
- var length = instances.length;
- for (var i = 0; i < length; ++i) {
- var instance = instances[i];
- var geometry = instance[geometryName];
- if (!defined.defined(geometry)) {
- continue;
- }
- var count = geometry.indices.length;
- if (offset + count > indexCount) {
- offset = 0;
- indexCount = geometries[++geometryIndex].indices.length;
- }
- pickOffsets.push({
- index : geometryIndex,
- offset : offset,
- count : count
- });
- offset += count;
- }
- }
- function createInstancePickOffsets(instances, geometries) {
- var pickOffsets = [];
- createPickOffsets(instances, 'geometry', geometries, pickOffsets);
- createPickOffsets(instances, 'westHemisphereGeometry', geometries, pickOffsets);
- createPickOffsets(instances, 'eastHemisphereGeometry', geometries, pickOffsets);
- return pickOffsets;
- }
- /**
- * @private
- */
- var PrimitivePipeline = {};
- /**
- * @private
- */
- PrimitivePipeline.combineGeometry = function(parameters) {
- var geometries;
- var attributeLocations;
- var instances = parameters.instances;
- var length = instances.length;
- var pickOffsets;
- var offsetInstanceExtend;
- var hasOffset = false;
- if (length > 0) {
- geometries = geometryPipeline(parameters);
- if (geometries.length > 0) {
- attributeLocations = GeometryPipeline.GeometryPipeline.createAttributeLocations(geometries[0]);
- if (parameters.createPickOffsets) {
- pickOffsets = createInstancePickOffsets(instances, geometries);
- }
- }
- if (defined.defined(instances[0].attributes) && defined.defined(instances[0].attributes.offset)) {
- offsetInstanceExtend = new Array(length);
- hasOffset = true;
- }
- }
- var boundingSpheres = new Array(length);
- var boundingSpheresCV = new Array(length);
- for (var i = 0; i < length; ++i) {
- var instance = instances[i];
- var geometry = instance.geometry;
- if (defined.defined(geometry)) {
- boundingSpheres[i] = geometry.boundingSphere;
- boundingSpheresCV[i] = geometry.boundingSphereCV;
- if (hasOffset) {
- offsetInstanceExtend[i] = instance.geometry.offsetAttribute;
- }
- }
- var eastHemisphereGeometry = instance.eastHemisphereGeometry;
- var westHemisphereGeometry = instance.westHemisphereGeometry;
- if (defined.defined(eastHemisphereGeometry) && defined.defined(westHemisphereGeometry)) {
- if (defined.defined(eastHemisphereGeometry.boundingSphere) && defined.defined(westHemisphereGeometry.boundingSphere)) {
- boundingSpheres[i] = Transforms.BoundingSphere.union(eastHemisphereGeometry.boundingSphere, westHemisphereGeometry.boundingSphere);
- }
- if (defined.defined(eastHemisphereGeometry.boundingSphereCV) && defined.defined(westHemisphereGeometry.boundingSphereCV)) {
- boundingSpheresCV[i] = Transforms.BoundingSphere.union(eastHemisphereGeometry.boundingSphereCV, westHemisphereGeometry.boundingSphereCV);
- }
- }
- }
- return {
- geometries : geometries,
- modelMatrix : parameters.modelMatrix,
- attributeLocations : attributeLocations,
- pickOffsets : pickOffsets,
- offsetInstanceExtend : offsetInstanceExtend,
- boundingSpheres : boundingSpheres,
- boundingSpheresCV : boundingSpheresCV
- };
- };
- function transferGeometry(geometry, transferableObjects) {
- var attributes = geometry.attributes;
- for (var name in attributes) {
- if (attributes.hasOwnProperty(name)) {
- var attribute = attributes[name];
- if (defined.defined(attribute) && defined.defined(attribute.values)) {
- transferableObjects.push(attribute.values.buffer);
- }
- }
- }
- if (defined.defined(geometry.indices)) {
- transferableObjects.push(geometry.indices.buffer);
- }
- }
- function transferGeometries(geometries, transferableObjects) {
- var length = geometries.length;
- for (var i = 0; i < length; ++i) {
- transferGeometry(geometries[i], transferableObjects);
- }
- }
- // This function was created by simplifying packCreateGeometryResults into a count-only operation.
- function countCreateGeometryResults(items) {
- var count = 1;
- var length = items.length;
- for (var i = 0; i < length; i++) {
- var geometry = items[i];
- ++count;
- if (!defined.defined(geometry)) {
- continue;
- }
- var attributes = geometry.attributes;
- count += 7 + 2 * Transforms.BoundingSphere.packedLength + (defined.defined(geometry.indices) ? geometry.indices.length : 0);
- for (var property in attributes) {
- if (attributes.hasOwnProperty(property) && defined.defined(attributes[property])) {
- var attribute = attributes[property];
- count += 5 + attribute.values.length;
- }
- }
- }
- return count;
- }
- /**
- * @private
- */
- PrimitivePipeline.packCreateGeometryResults = function(items, transferableObjects) {
- var packedData = new Float64Array(countCreateGeometryResults(items));
- var stringTable = [];
- var stringHash = {};
- var length = items.length;
- var count = 0;
- packedData[count++] = length;
- for (var i = 0; i < length; i++) {
- var geometry = items[i];
- var validGeometry = defined.defined(geometry);
- packedData[count++] = validGeometry ? 1.0 : 0.0;
- if (!validGeometry) {
- continue;
- }
- packedData[count++] = geometry.primitiveType;
- packedData[count++] = geometry.geometryType;
- packedData[count++] = defaultValue.defaultValue(geometry.offsetAttribute, -1);
- var validBoundingSphere = defined.defined(geometry.boundingSphere) ? 1.0 : 0.0;
- packedData[count++] = validBoundingSphere;
- if (validBoundingSphere) {
- Transforms.BoundingSphere.pack(geometry.boundingSphere, packedData, count);
- }
- count += Transforms.BoundingSphere.packedLength;
- var validBoundingSphereCV = defined.defined(geometry.boundingSphereCV) ? 1.0 : 0.0;
- packedData[count++] = validBoundingSphereCV;
- if (validBoundingSphereCV) {
- Transforms.BoundingSphere.pack(geometry.boundingSphereCV, packedData, count);
- }
- count += Transforms.BoundingSphere.packedLength;
- var attributes = geometry.attributes;
- var attributesToWrite = [];
- for (var property in attributes) {
- if (attributes.hasOwnProperty(property) && defined.defined(attributes[property])) {
- attributesToWrite.push(property);
- if (!defined.defined(stringHash[property])) {
- stringHash[property] = stringTable.length;
- stringTable.push(property);
- }
- }
- }
- packedData[count++] = attributesToWrite.length;
- for (var q = 0; q < attributesToWrite.length; q++) {
- var name = attributesToWrite[q];
- var attribute = attributes[name];
- packedData[count++] = stringHash[name];
- packedData[count++] = attribute.componentDatatype;
- packedData[count++] = attribute.componentsPerAttribute;
- packedData[count++] = attribute.normalize ? 1 : 0;
- packedData[count++] = attribute.values.length;
- packedData.set(attribute.values, count);
- count += attribute.values.length;
- }
- var indicesLength = defined.defined(geometry.indices) ? geometry.indices.length : 0;
- packedData[count++] = indicesLength;
- if (indicesLength > 0) {
- packedData.set(geometry.indices, count);
- count += indicesLength;
- }
- }
- transferableObjects.push(packedData.buffer);
- return {
- stringTable : stringTable,
- packedData : packedData
- };
- };
- /**
- * @private
- */
- PrimitivePipeline.unpackCreateGeometryResults = function(createGeometryResult) {
- var stringTable = createGeometryResult.stringTable;
- var packedGeometry = createGeometryResult.packedData;
- var i;
- var result = new Array(packedGeometry[0]);
- var resultIndex = 0;
- var packedGeometryIndex = 1;
- while (packedGeometryIndex < packedGeometry.length) {
- var valid = packedGeometry[packedGeometryIndex++] === 1.0;
- if (!valid) {
- result[resultIndex++] = undefined;
- continue;
- }
- var primitiveType = packedGeometry[packedGeometryIndex++];
- var geometryType = packedGeometry[packedGeometryIndex++];
- var offsetAttribute = packedGeometry[packedGeometryIndex++];
- if (offsetAttribute === -1) {
- offsetAttribute = undefined;
- }
- var boundingSphere;
- var boundingSphereCV;
- var validBoundingSphere = packedGeometry[packedGeometryIndex++] === 1.0;
- if (validBoundingSphere) {
- boundingSphere = Transforms.BoundingSphere.unpack(packedGeometry, packedGeometryIndex);
- }
- packedGeometryIndex += Transforms.BoundingSphere.packedLength;
- var validBoundingSphereCV = packedGeometry[packedGeometryIndex++] === 1.0;
- if (validBoundingSphereCV) {
- boundingSphereCV = Transforms.BoundingSphere.unpack(packedGeometry, packedGeometryIndex);
- }
- packedGeometryIndex += Transforms.BoundingSphere.packedLength;
- var length;
- var values;
- var componentsPerAttribute;
- var attributes = new GeometryAttributes.GeometryAttributes();
- var numAttributes = packedGeometry[packedGeometryIndex++];
- for (i = 0; i < numAttributes; i++) {
- var name = stringTable[packedGeometry[packedGeometryIndex++]];
- var componentDatatype = packedGeometry[packedGeometryIndex++];
- componentsPerAttribute = packedGeometry[packedGeometryIndex++];
- var normalize = packedGeometry[packedGeometryIndex++] !== 0;
- length = packedGeometry[packedGeometryIndex++];
- values = ComponentDatatype.ComponentDatatype.createTypedArray(componentDatatype, length);
- for (var valuesIndex = 0; valuesIndex < length; valuesIndex++) {
- values[valuesIndex] = packedGeometry[packedGeometryIndex++];
- }
- attributes[name] = new GeometryAttribute.GeometryAttribute({
- componentDatatype : componentDatatype,
- componentsPerAttribute : componentsPerAttribute,
- normalize : normalize,
- values : values
- });
- }
- var indices;
- length = packedGeometry[packedGeometryIndex++];
- if (length > 0) {
- var numberOfVertices = values.length / componentsPerAttribute;
- indices = IndexDatatype.IndexDatatype.createTypedArray(numberOfVertices, length);
- for (i = 0; i < length; i++) {
- indices[i] = packedGeometry[packedGeometryIndex++];
- }
- }
- result[resultIndex++] = new GeometryAttribute.Geometry({
- primitiveType : primitiveType,
- geometryType : geometryType,
- boundingSphere : boundingSphere,
- boundingSphereCV : boundingSphereCV,
- indices : indices,
- attributes : attributes,
- offsetAttribute: offsetAttribute
- });
- }
- return result;
- };
- function packInstancesForCombine(instances, transferableObjects) {
- var length = instances.length;
- var packedData = new Float64Array(1 + (length * 19));
- var count = 0;
- packedData[count++] = length;
- for (var i = 0; i < length; i++) {
- var instance = instances[i];
- Transforms.Matrix4.pack(instance.modelMatrix, packedData, count);
- count += Transforms.Matrix4.packedLength;
- if (defined.defined(instance.attributes) && defined.defined(instance.attributes.offset)) {
- var values = instance.attributes.offset.value;
- packedData[count] = values[0];
- packedData[count + 1] = values[1];
- packedData[count + 2] = values[2];
- }
- count += 3;
- }
- transferableObjects.push(packedData.buffer);
- return packedData;
- }
- function unpackInstancesForCombine(data) {
- var packedInstances = data;
- var result = new Array(packedInstances[0]);
- var count = 0;
- var i = 1;
- while (i < packedInstances.length) {
- var modelMatrix = Transforms.Matrix4.unpack(packedInstances, i);
- var attributes;
- i += Transforms.Matrix4.packedLength;
- if (defined.defined(packedInstances[i])) {
- attributes = {
- offset : new OffsetGeometryInstanceAttribute(packedInstances[i], packedInstances[i + 1], packedInstances[i + 2])
- };
- }
- i += 3;
- result[count++] = {
- modelMatrix : modelMatrix,
- attributes : attributes
- };
- }
- return result;
- }
- /**
- * @private
- */
- PrimitivePipeline.packCombineGeometryParameters = function(parameters, transferableObjects) {
- var createGeometryResults = parameters.createGeometryResults;
- var length = createGeometryResults.length;
- for (var i = 0; i < length; i++) {
- transferableObjects.push(createGeometryResults[i].packedData.buffer);
- }
- return {
- createGeometryResults : parameters.createGeometryResults,
- packedInstances : packInstancesForCombine(parameters.instances, transferableObjects),
- ellipsoid : parameters.ellipsoid,
- isGeographic : parameters.projection instanceof Transforms.GeographicProjection,
- elementIndexUintSupported : parameters.elementIndexUintSupported,
- scene3DOnly : parameters.scene3DOnly,
- vertexCacheOptimize : parameters.vertexCacheOptimize,
- compressVertices : parameters.compressVertices,
- modelMatrix : parameters.modelMatrix,
- createPickOffsets : parameters.createPickOffsets
- };
- };
- /**
- * @private
- */
- PrimitivePipeline.unpackCombineGeometryParameters = function(packedParameters) {
- var instances = unpackInstancesForCombine(packedParameters.packedInstances);
- var createGeometryResults = packedParameters.createGeometryResults;
- var length = createGeometryResults.length;
- var instanceIndex = 0;
- for (var resultIndex = 0; resultIndex < length; resultIndex++) {
- var geometries = PrimitivePipeline.unpackCreateGeometryResults(createGeometryResults[resultIndex]);
- var geometriesLength = geometries.length;
- for (var geometryIndex = 0; geometryIndex < geometriesLength; geometryIndex++) {
- var geometry = geometries[geometryIndex];
- var instance = instances[instanceIndex];
- instance.geometry = geometry;
- ++instanceIndex;
- }
- }
- var ellipsoid = Cartesian2.Ellipsoid.clone(packedParameters.ellipsoid);
- var projection = packedParameters.isGeographic ? new Transforms.GeographicProjection(ellipsoid) : new WebMercatorProjection.WebMercatorProjection(ellipsoid);
- return {
- instances : instances,
- ellipsoid : ellipsoid,
- projection : projection,
- elementIndexUintSupported : packedParameters.elementIndexUintSupported,
- scene3DOnly : packedParameters.scene3DOnly,
- vertexCacheOptimize : packedParameters.vertexCacheOptimize,
- compressVertices : packedParameters.compressVertices,
- modelMatrix : Transforms.Matrix4.clone(packedParameters.modelMatrix),
- createPickOffsets : packedParameters.createPickOffsets
- };
- };
- function packBoundingSpheres(boundingSpheres) {
- var length = boundingSpheres.length;
- var bufferLength = 1 + (Transforms.BoundingSphere.packedLength + 1) * length;
- var buffer = new Float32Array(bufferLength);
- var bufferIndex = 0;
- buffer[bufferIndex++] = length;
- for (var i = 0; i < length; ++i) {
- var bs = boundingSpheres[i];
- if (!defined.defined(bs)) {
- buffer[bufferIndex++] = 0.0;
- } else {
- buffer[bufferIndex++] = 1.0;
- Transforms.BoundingSphere.pack(boundingSpheres[i], buffer, bufferIndex);
- }
- bufferIndex += Transforms.BoundingSphere.packedLength;
- }
- return buffer;
- }
- function unpackBoundingSpheres(buffer) {
- var result = new Array(buffer[0]);
- var count = 0;
- var i = 1;
- while (i < buffer.length) {
- if (buffer[i++] === 1.0) {
- result[count] = Transforms.BoundingSphere.unpack(buffer, i);
- }
- ++count;
- i += Transforms.BoundingSphere.packedLength;
- }
- return result;
- }
- /**
- * @private
- */
- PrimitivePipeline.packCombineGeometryResults = function(results, transferableObjects) {
- if (defined.defined(results.geometries)) {
- transferGeometries(results.geometries, transferableObjects);
- }
- var packedBoundingSpheres = packBoundingSpheres(results.boundingSpheres);
- var packedBoundingSpheresCV = packBoundingSpheres(results.boundingSpheresCV);
- transferableObjects.push(packedBoundingSpheres.buffer, packedBoundingSpheresCV.buffer);
- return {
- geometries : results.geometries,
- attributeLocations : results.attributeLocations,
- modelMatrix : results.modelMatrix,
- pickOffsets : results.pickOffsets,
- offsetInstanceExtend: results.offsetInstanceExtend,
- boundingSpheres : packedBoundingSpheres,
- boundingSpheresCV : packedBoundingSpheresCV
- };
- };
- /**
- * @private
- */
- PrimitivePipeline.unpackCombineGeometryResults = function(packedResult) {
- return {
- geometries : packedResult.geometries,
- attributeLocations : packedResult.attributeLocations,
- modelMatrix : packedResult.modelMatrix,
- pickOffsets : packedResult.pickOffsets,
- offsetInstanceExtend: packedResult.offsetInstanceExtend,
- boundingSpheres : unpackBoundingSpheres(packedResult.boundingSpheres),
- boundingSpheresCV : unpackBoundingSpheres(packedResult.boundingSpheresCV)
- };
- };
- exports.PrimitivePipeline = PrimitivePipeline;
- });
|