141 lines
4.4 KiB
JavaScript
141 lines
4.4 KiB
JavaScript
// @ts-check
|
|
|
|
import defined from "../Core/defined.js";
|
|
import BufferPrimitiveCollection from "./BufferPrimitiveCollection.js";
|
|
import BufferPolyline from "./BufferPolyline.js";
|
|
import renderPolylines from "./renderBufferPolylineCollection.js";
|
|
import BufferPolylineMaterial from "./BufferPolylineMaterial.js";
|
|
|
|
/** @import { TypedArray } from "../Core/globalTypes.js"; */
|
|
/** @import Matrix4 from "../Core/Matrix4.js"; */
|
|
/** @import FrameState from "./FrameState.js" */
|
|
|
|
/**
|
|
* @typedef {object} BufferPolylineOptions
|
|
* @property {Matrix4} [modelMatrix=Matrix4.IDENTITY] Transforms geometry from model to world coordinates.
|
|
* @property {boolean} [show=true]
|
|
* @property {BufferPolylineMaterial} [material=BufferPolylineMaterial.DEFAULT_MATERIAL]
|
|
* @property {number} [featureId]
|
|
* @property {object} [pickObject]
|
|
* @property {TypedArray} [positions]
|
|
* @experimental This feature is not final and is subject to change without Cesium's standard deprecation policy.
|
|
*/
|
|
|
|
/**
|
|
* Collection of polylines held in ArrayBuffer storage for performance and memory optimization.
|
|
*
|
|
* <p>Default buffer memory allocation is arbitrary, and collections cannot be resized,
|
|
* so specific per-buffer capacities should be provided in the collection
|
|
* constructor when available.</p>
|
|
*
|
|
* @example
|
|
* const collection = new BufferPolylineCollection({
|
|
* primitiveCountMax: 1024,
|
|
* vertexCountMax: 4096,
|
|
* });
|
|
*
|
|
* const polyline = new BufferPolyline();
|
|
* const material = new BufferPolylineMaterial({color: Color.WHITE});
|
|
*
|
|
* // Create a new polyline, temporarily bound to 'polyline' local variable.
|
|
* collection.add({
|
|
* positions: new Float64Array([ ... ]),
|
|
* material,
|
|
* }, polyline);
|
|
*
|
|
* // Iterate over all polylines in collection, temporarily binding 'polyline'
|
|
* // local variable to each, and updating polyline material.
|
|
* for (let i = 0; i < collection.primitiveCount; i++) {
|
|
* collection.get(i, polyline);
|
|
* polyline.setMaterial(material);
|
|
* }
|
|
*
|
|
* @see BufferPolyline
|
|
* @see BufferPolylineMaterial
|
|
* @see BufferPrimitiveCollection
|
|
* @extends BufferPrimitiveCollection<BufferPolyline>
|
|
* @experimental This feature is not final and is subject to change without Cesium's standard deprecation policy.
|
|
*/
|
|
class BufferPolylineCollection extends BufferPrimitiveCollection {
|
|
_getCollectionClass() {
|
|
return BufferPolylineCollection;
|
|
}
|
|
|
|
_getPrimitiveClass() {
|
|
return BufferPolyline;
|
|
}
|
|
|
|
_getMaterialClass() {
|
|
return BufferPolylineMaterial;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COLLECTION LIFECYCLE
|
|
|
|
/**
|
|
* @param {BufferPolylineCollection} collection
|
|
* @returns {BufferPolylineCollection}
|
|
* @override
|
|
* @ignore
|
|
*/
|
|
static _cloneEmpty(collection) {
|
|
return new BufferPolylineCollection({
|
|
primitiveCountMax: collection.primitiveCountMax,
|
|
vertexCountMax: collection.vertexCountMax,
|
|
positionDatatype: collection.positionDatatype,
|
|
positionNormalized: collection.positionNormalized,
|
|
});
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// PRIMITIVE LIFECYCLE
|
|
|
|
/**
|
|
* Adds a new polyline to the collection, with the specified options. A
|
|
* {@link BufferPolyline} instance is linked to the new polyline, using
|
|
* the 'result' argument if given, or a new instance if not. For repeated
|
|
* calls, prefer to reuse a single BufferPolyline instance rather than
|
|
* allocating a new instance on each call.
|
|
*
|
|
* @param {BufferPolylineOptions} options
|
|
* @param {BufferPolyline} result
|
|
* @returns {BufferPolyline}
|
|
* @override
|
|
*/
|
|
add(options, result = new BufferPolyline()) {
|
|
super.add(options, result);
|
|
|
|
const vertexOffset = this._positionCount;
|
|
result._setUint32(BufferPolyline.Layout.POSITION_OFFSET_U32, vertexOffset);
|
|
result._setUint32(BufferPolyline.Layout.POSITION_COUNT_U32, 0);
|
|
|
|
if (defined(options.positions)) {
|
|
result.setPositions(options.positions);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// RENDER
|
|
|
|
/**
|
|
* @param {FrameState} frameState
|
|
* @ignore
|
|
*/
|
|
update(frameState) {
|
|
super.update(frameState);
|
|
|
|
const passes = frameState.passes;
|
|
if (this.show && (passes.render || passes.pick)) {
|
|
this._renderContext = renderPolylines(
|
|
this,
|
|
frameState,
|
|
this._renderContext,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
export default BufferPolylineCollection;
|