@cesium/engine 23.0.0 → 24.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Build/Workers/{chunk-QTOHIXGF.js → chunk-2N4KDHS3.js} +10 -10
- package/Build/Workers/{chunk-SQTRWKO2.js → chunk-44EMEGKW.js} +5 -5
- package/Build/Workers/{chunk-OHBM4YG4.js → chunk-4TIG36AW.js} +12 -12
- package/Build/Workers/{chunk-BNBD2YZK.js → chunk-5A2SW66E.js} +16 -16
- package/Build/Workers/{chunk-52K3GJKG.js → chunk-5GXYJQ2K.js} +3 -3
- package/Build/Workers/{chunk-NQCAZU7S.js → chunk-63SIWPLS.js} +13 -13
- package/Build/Workers/{chunk-UEEGWJJP.js → chunk-6MPGQEHA.js} +2 -2
- package/Build/Workers/{chunk-PQVNT5CJ.js → chunk-6RMS4S72.js} +6 -6
- package/Build/Workers/{chunk-HYTFXWMY.js → chunk-6WLHJFD3.js} +7 -7
- package/Build/Workers/{chunk-DT5SJBKA.js → chunk-72VYSVEW.js} +9 -9
- package/Build/Workers/{chunk-JUGY5AZN.js → chunk-7MDYBRYJ.js} +4 -4
- package/Build/Workers/{chunk-6SLGTBB2.js → chunk-7O5XJTVE.js} +5 -5
- package/Build/Workers/{chunk-4UNQX2MP.js → chunk-7QRFIKWQ.js} +2 -2
- package/Build/Workers/{chunk-GN5NEUDT.js → chunk-7TYLCBGK.js} +8 -8
- package/Build/Workers/{chunk-SGKTBHFQ.js → chunk-7X322WP2.js} +13 -13
- package/Build/Workers/{chunk-T43FXHNC.js → chunk-A47HVBC5.js} +7 -7
- package/Build/Workers/{chunk-FSDVXW7M.js → chunk-AF3MU2RL.js} +5 -5
- package/Build/Workers/{chunk-3B65YFXC.js → chunk-AJLTU6PF.js} +1 -1
- package/Build/Workers/{chunk-OQ3EAJNW.js → chunk-AMIHNSST.js} +2 -2
- package/Build/Workers/{chunk-N4AWE7TZ.js → chunk-B6SCUUFP.js} +10 -10
- package/Build/Workers/{chunk-OMXN7YF4.js → chunk-BJD6QGXZ.js} +12 -12
- package/Build/Workers/{chunk-APDKMX7W.js → chunk-C6P4IG5P.js} +6 -6
- package/Build/Workers/{chunk-QA24Q62E.js → chunk-D4EJ2NXG.js} +17 -17
- package/Build/Workers/{chunk-HYLEKKO5.js → chunk-DHKPFLSJ.js} +1 -1
- package/Build/Workers/{chunk-MQJG522T.js → chunk-DVB56LG7.js} +6 -6
- package/Build/Workers/{chunk-Y5AJSEEN.js → chunk-EDXL4W76.js} +2 -2
- package/Build/Workers/{chunk-QQX7S5QT.js → chunk-EV3VGO6Y.js} +17 -17
- package/Build/Workers/{chunk-IFA7VHHP.js → chunk-GOQBUCXH.js} +10 -10
- package/Build/Workers/{chunk-5A7YSAXT.js → chunk-GQUNK2XC.js} +14 -14
- package/Build/Workers/{chunk-36LBFITA.js → chunk-HKUES6UG.js} +12 -12
- package/Build/Workers/{chunk-OC6X22PG.js → chunk-HRHRYFHS.js} +9 -9
- package/Build/Workers/{chunk-L7RDJ4V7.js → chunk-HXJMS2ZI.js} +1 -1
- package/Build/Workers/{chunk-NAYRNPEP.js → chunk-ILMFADZA.js} +4 -4
- package/Build/Workers/{chunk-AA33B6PU.js → chunk-ISY4EZCA.js} +4 -4
- package/Build/Workers/{chunk-7KRN6JPQ.js → chunk-J6AW5YHS.js} +14 -14
- package/Build/Workers/{chunk-OQBPOKPZ.js → chunk-JCI63T3K.js} +6 -6
- package/Build/Workers/{chunk-2WI4HGJU.js → chunk-KLPGTXS3.js} +6 -6
- package/Build/Workers/{chunk-5R7SBUTW.js → chunk-LIB2H534.js} +10 -10
- package/Build/Workers/{chunk-IYVDOB5V.js → chunk-LXMCPFFS.js} +4 -4
- package/Build/Workers/{chunk-NUYLNQKV.js → chunk-MKM27KGV.js} +2 -2
- package/Build/Workers/{chunk-R7M4XNPP.js → chunk-N65BAKSH.js} +8 -8
- package/Build/Workers/{chunk-4LGFX2P5.js → chunk-NKT5K3K3.js} +11 -11
- package/Build/Workers/{chunk-NNHU33JK.js → chunk-NPF7SSHZ.js} +7 -7
- package/Build/Workers/{chunk-LDQWNMEC.js → chunk-PVV64VFW.js} +1 -1
- package/Build/Workers/{chunk-WKXDCVBO.js → chunk-Q3C6VQH6.js} +4 -4
- package/Build/Workers/{chunk-ARCFIOKA.js → chunk-RQNJD3O4.js} +12 -12
- package/Build/Workers/{chunk-G3YT7M7A.js → chunk-UIGVOKKI.js} +1 -1
- package/Build/Workers/{chunk-ZIW5FCIW.js → chunk-UQU4RXLT.js} +27 -19
- package/Build/Workers/{chunk-MT5M7RLZ.js → chunk-VLDEUTOP.js} +2 -2
- package/Build/Workers/{chunk-5JP5FG7U.js → chunk-VMVOUQ5J.js} +7 -7
- package/Build/Workers/{chunk-2GL2EUEE.js → chunk-XJRBB253.js} +11 -11
- package/Build/Workers/{chunk-ESD4IEOU.js → chunk-XY6HMDGI.js} +5 -5
- package/Build/Workers/{chunk-56OHFSLH.js → chunk-Y7HNNPNK.js} +10 -10
- package/Build/Workers/{chunk-6FVFM2KB.js → chunk-YAOZMOFL.js} +5 -5
- package/Build/Workers/{chunk-AP6XWET5.js → chunk-YJZGW74L.js} +8 -8
- package/Build/Workers/{chunk-KPYU6YZG.js → chunk-YQFTYQMZ.js} +1 -1
- package/Build/Workers/{chunk-5VKZVPO5.js → chunk-ZBZRTRJB.js} +10 -10
- package/Build/Workers/combineGeometry.js +24 -24
- package/Build/Workers/createBoxGeometry.js +18 -18
- package/Build/Workers/createBoxOutlineGeometry.js +16 -16
- package/Build/Workers/createCircleGeometry.js +26 -26
- package/Build/Workers/createCircleOutlineGeometry.js +19 -19
- package/Build/Workers/createCoplanarPolygonGeometry.js +33 -33
- package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -31
- package/Build/Workers/createCorridorGeometry.js +29 -29
- package/Build/Workers/createCorridorOutlineGeometry.js +28 -28
- package/Build/Workers/createCylinderGeometry.js +20 -20
- package/Build/Workers/createCylinderOutlineGeometry.js +18 -18
- package/Build/Workers/createEllipseGeometry.js +26 -26
- package/Build/Workers/createEllipseOutlineGeometry.js +19 -19
- package/Build/Workers/createEllipsoidGeometry.js +19 -19
- package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -18
- package/Build/Workers/createFrustumGeometry.js +18 -18
- package/Build/Workers/createFrustumOutlineGeometry.js +18 -18
- package/Build/Workers/createGeometry.js +24 -24
- package/Build/Workers/createGroundPolylineGeometry.js +22 -22
- package/Build/Workers/createPlaneGeometry.js +16 -16
- package/Build/Workers/createPlaneOutlineGeometry.js +15 -15
- package/Build/Workers/createPolygonGeometry.js +32 -32
- package/Build/Workers/createPolygonOutlineGeometry.js +30 -30
- package/Build/Workers/createPolylineGeometry.js +25 -25
- package/Build/Workers/createPolylineVolumeGeometry.js +31 -31
- package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -27
- package/Build/Workers/createRectangleGeometry.js +27 -27
- package/Build/Workers/createRectangleOutlineGeometry.js +20 -20
- package/Build/Workers/createSimplePolylineGeometry.js +23 -23
- package/Build/Workers/createSphereGeometry.js +19 -19
- package/Build/Workers/createSphereOutlineGeometry.js +18 -18
- package/Build/Workers/createTaskProcessorWorker.js +3 -3
- package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
- package/Build/Workers/createVectorTileGeometries.js +24 -24
- package/Build/Workers/createVectorTilePoints.js +13 -13
- package/Build/Workers/createVectorTilePolygons.js +22 -22
- package/Build/Workers/createVectorTilePolylines.js +14 -14
- package/Build/Workers/createVerticesFromCesium3DTilesTerrain.js +25 -25
- package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -22
- package/Build/Workers/createVerticesFromHeightmap.js +22 -22
- package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +20 -20
- package/Build/Workers/createWallGeometry.js +25 -25
- package/Build/Workers/createWallOutlineGeometry.js +24 -24
- package/Build/Workers/decodeDraco.js +10 -10
- package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
- package/Build/Workers/decodeI3S.js +12 -12
- package/Build/Workers/gaussianSplatSorter.js +4 -4
- package/Build/Workers/gaussianSplatTextureGenerator.js +4 -4
- package/Build/Workers/incrementallyBuildTerrainPicker.js +10 -10
- package/Build/Workers/transcodeKTX2.js +6 -6
- package/Build/Workers/transferTypedArrayTest.js +1 -1
- package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -22
- package/Build/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +25 -25
- package/Source/Core/BoundingSphere.js +1 -1
- package/Source/Core/Cartesian2.js +7 -5
- package/Source/Core/Cartesian3.js +8 -6
- package/Source/Core/Cartesian4.js +8 -6
- package/Source/Core/Color.js +5 -3
- package/Source/Core/DeveloperError.js +2 -1
- package/Source/Core/ITwinPlatform.js +1 -0
- package/Source/Core/Ion.js +1 -1
- package/Source/Core/S2Cell.js +2 -2
- package/Source/Core/TerrainMesh.js +10 -1
- package/Source/Core/TerrainPicker.js +1 -0
- package/Source/Core/WallGeometry.js +1 -1
- package/Source/Core/WallOutlineGeometry.js +1 -1
- package/Source/Core/assert.js +27 -0
- package/Source/Core/globalTypes.js +4 -0
- package/Source/DataSources/CzmlDataSource.js +9 -0
- package/Source/DataSources/PathGraphics.js +13 -0
- package/Source/DataSources/PathVisualizer.js +330 -18
- package/Source/DataSources/StaticGeometryColorBatch.js +7 -2
- package/Source/DataSources/StaticGeometryPerMaterialBatch.js +7 -2
- package/Source/DataSources/StaticGroundGeometryPerMaterialBatch.js +3 -1
- package/Source/DataSources/StaticGroundPolylinePerMaterialBatch.js +3 -1
- package/Source/Renderer/Context.js +1 -1
- package/Source/Renderer/RenderState.js +2 -2
- package/Source/Renderer/VertexArray.js +80 -0
- package/Source/Scene/ArcGisMapService.js +1 -1
- package/Source/Scene/BillboardCollection.js +65 -364
- package/Source/Scene/BufferPoint.js +148 -0
- package/Source/Scene/BufferPointCollection.js +135 -0
- package/Source/Scene/BufferPointMaterial.js +95 -0
- package/Source/Scene/BufferPolygon.js +516 -0
- package/Source/Scene/BufferPolygonCollection.js +368 -0
- package/Source/Scene/BufferPolygonMaterial.js +41 -0
- package/Source/Scene/BufferPolyline.js +185 -0
- package/Source/Scene/BufferPolylineCollection.js +136 -0
- package/Source/Scene/BufferPolylineMaterial.js +93 -0
- package/Source/Scene/BufferPrimitive.js +347 -0
- package/Source/Scene/BufferPrimitiveCollection.js +702 -0
- package/Source/Scene/BufferPrimitiveMaterial.js +140 -0
- package/Source/Scene/Cesium3DTileContent.js +5 -1
- package/Source/Scene/Cesium3DTileContentFactory.js +9 -0
- package/Source/Scene/Cesium3DTileStyle.js +22 -0
- package/Source/Scene/Cesium3DTileset.js +1 -0
- package/Source/Scene/ClippingPolygonCollection.js +270 -101
- package/Source/Scene/CubeMapPanorama.js +4 -4
- package/Source/Scene/GaussianSplat3DTileContent.js +40 -46
- package/Source/Scene/GaussianSplatPrimitive.js +413 -70
- package/Source/Scene/GetFeatureInfoFormat.js +3 -3
- package/Source/Scene/GltfLoader.js +227 -34
- package/Source/Scene/GltfSpzLoader.js +109 -0
- package/Source/Scene/ITwinData.js +1 -0
- package/Source/Scene/Label.js +32 -0
- package/Source/Scene/LabelCollection.js +14 -13
- package/Source/Scene/Material.js +2 -0
- package/Source/Scene/Megatexture.js +1 -0
- package/Source/Scene/MetadataClassProperty.js +24 -10
- package/Source/Scene/MetadataComponentType.js +115 -23
- package/Source/Scene/Model/CustomShaderPipelineStage.js +3 -1
- package/Source/Scene/Model/EdgeVisibilityPipelineStage.js +761 -263
- package/Source/Scene/Model/MaterialPipelineStage.js +147 -0
- package/Source/Scene/Model/MetadataPipelineStage.js +3 -3
- package/Source/Scene/Model/ModelDrawCommand.js +6 -0
- package/Source/Scene/Model/ModelReader.js +1 -1
- package/Source/Scene/Model/ModelUtility.js +3 -1
- package/Source/Scene/Model/createVectorTileBuffersFromModelComponents.js +330 -0
- package/Source/Scene/ModelComponents.js +1632 -1542
- package/Source/Scene/PickedMetadataInfo.js +1 -0
- package/Source/Scene/ScreenSpaceCameraController.js +13 -0
- package/Source/Scene/SkyBox.js +17 -8
- package/Source/Scene/TileBoundingRegion.js +1 -1
- package/Source/Scene/TileBoundingS2Cell.js +1 -1
- package/Source/Scene/TileBoundingSphere.js +1 -1
- package/Source/Scene/TweenCollection.js +7 -0
- package/Source/Scene/VectorGltf3DTileContent.js +382 -0
- package/Source/Scene/VertexAttributeSemantic.js +14 -0
- package/Source/Scene/WebMapServiceImageryProvider.js +2 -2
- package/Source/Scene/WebMapTileServiceImageryProvider.js +366 -131
- package/Source/Scene/parseStructuralMetadata.js +97 -37
- package/Source/Scene/renderBufferPointCollection.js +334 -0
- package/Source/Scene/renderBufferPolygonCollection.js +386 -0
- package/Source/Scene/renderBufferPolylineCollection.js +529 -0
- package/Source/Shaders/BillboardCollectionFS.glsl +2 -77
- package/Source/Shaders/BillboardCollectionFS.js +2 -77
- package/Source/Shaders/BillboardCollectionVS.glsl +2 -60
- package/Source/Shaders/BillboardCollectionVS.js +2 -60
- package/Source/Shaders/BufferPointMaterialFS.glsl +27 -0
- package/Source/Shaders/BufferPointMaterialFS.js +29 -0
- package/Source/Shaders/BufferPointMaterialVS.glsl +48 -0
- package/Source/Shaders/BufferPointMaterialVS.js +50 -0
- package/Source/Shaders/BufferPolygonMaterialFS.glsl +13 -0
- package/Source/Shaders/BufferPolygonMaterialFS.js +15 -0
- package/Source/Shaders/BufferPolygonMaterialVS.glsl +30 -0
- package/Source/Shaders/BufferPolygonMaterialVS.js +32 -0
- package/Source/Shaders/BufferPolylineMaterialFS.glsl +13 -0
- package/Source/Shaders/BufferPolylineMaterialFS.js +15 -0
- package/Source/Shaders/BufferPolylineMaterialVS.glsl +49 -0
- package/Source/Shaders/BufferPolylineMaterialVS.js +51 -0
- package/Source/Shaders/Model/EdgeVisibilityStageFS.glsl +34 -48
- package/Source/Shaders/Model/EdgeVisibilityStageFS.js +34 -49
- package/Source/Shaders/Model/EdgeVisibilityStageVS.glsl +98 -0
- package/Source/Shaders/Model/EdgeVisibilityStageVS.js +100 -0
- package/Source/Shaders/Model/ModelFS.glsl +15 -0
- package/Source/Shaders/Model/ModelFS.js +15 -0
- package/Source/Shaders/Model/ModelVS.glsl +8 -0
- package/Source/Shaders/Model/ModelVS.js +8 -0
- package/Source/Shaders/PolygonSignedDistanceFS.glsl +64 -33
- package/Source/Shaders/PolygonSignedDistanceFS.js +64 -33
- package/Source/Shaders/PrimitiveGaussianSplatVS.glsl +9 -2
- package/Source/Shaders/PrimitiveGaussianSplatVS.js +9 -2
- package/Source/Shaders/Voxels/VoxelFS.glsl +1 -1
- package/Source/Shaders/Voxels/VoxelFS.js +1 -1
- package/Source/Workers/decodeDraco.js +3 -0
- package/Source/Workers/decodeI3S.js +5 -2
- package/index.d.ts +1007 -111
- package/index.js +368 -343
- package/package.json +2 -2
|
@@ -0,0 +1,702 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BoundingSphere from "../Core/BoundingSphere.js";
|
|
4
|
+
import Cartesian3 from "../Core/Cartesian3.js";
|
|
5
|
+
import DeveloperError from "../Core/DeveloperError.js";
|
|
6
|
+
import Frozen from "../Core/Frozen.js";
|
|
7
|
+
import Matrix4 from "../Core/Matrix4.js";
|
|
8
|
+
import assert from "../Core/assert.js";
|
|
9
|
+
import ComponentDatatype from "../Core/ComponentDatatype.js";
|
|
10
|
+
import defined from "../Core/defined.js";
|
|
11
|
+
import Check from "../Core/Check.js";
|
|
12
|
+
|
|
13
|
+
/** @import { Destroyable, TypedArray, TypedArrayConstructor } from "../Core/globalTypes.js"; */
|
|
14
|
+
/** @import BufferPrimitive from "./BufferPrimitive.js"; */
|
|
15
|
+
/** @import BufferPrimitiveMaterial from "./BufferPrimitiveMaterial.js"; */
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @typedef {object} BufferPrimitiveOptions
|
|
19
|
+
* @property {boolean} [show=true]
|
|
20
|
+
* @property {BufferPrimitiveMaterial} [material]
|
|
21
|
+
* @experimental This feature is not final and is subject to change without Cesium's standard deprecation policy.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Collection of primitives held in ArrayBuffer storage for performance and memory optimization.
|
|
26
|
+
*
|
|
27
|
+
* <p>To get the full performance benefit of using a BufferPrimitiveCollection containing "N" primitives,
|
|
28
|
+
* be careful to avoid allocating "N" instances of any related JavaScript object. {@link BufferPrimitive},
|
|
29
|
+
* {@link Color}, {@link Cartesian3}, and other objects can all be reused when working with large collections,
|
|
30
|
+
* using the {@link https://en.wikipedia.org/wiki/Flyweight_pattern|flyweight pattern}.</p>
|
|
31
|
+
*
|
|
32
|
+
* @abstract
|
|
33
|
+
* @template T extends BufferPrimitive
|
|
34
|
+
* @experimental This feature is not final and is subject to change without Cesium's standard deprecation policy.
|
|
35
|
+
*
|
|
36
|
+
* @see BufferPrimitive
|
|
37
|
+
* @see BufferPrimitiveMaterial
|
|
38
|
+
* @see BufferPointCollection
|
|
39
|
+
* @see BufferPolylineCollection
|
|
40
|
+
* @see BufferPolygonCollection
|
|
41
|
+
*/
|
|
42
|
+
class BufferPrimitiveCollection {
|
|
43
|
+
/**
|
|
44
|
+
* Default capacity of buffers on new collections. A quantity of elements:
|
|
45
|
+
* number of vertices in the vertex buffer, primitives in the primitive
|
|
46
|
+
* buffer, etc. This value is arbitrary, and collections cannot be resized,
|
|
47
|
+
* so specific per-buffer capacities should be provided in the collection
|
|
48
|
+
* constructor when available.
|
|
49
|
+
*
|
|
50
|
+
* @type {number}
|
|
51
|
+
* @readonly
|
|
52
|
+
* @static
|
|
53
|
+
*/
|
|
54
|
+
static DEFAULT_CAPACITY = 1024;
|
|
55
|
+
|
|
56
|
+
/** @ignore */
|
|
57
|
+
static Error = {
|
|
58
|
+
ERR_RESIZE: "BufferPrimitive range cannot be resized after initialization.",
|
|
59
|
+
ERR_CAPACITY: "BufferPrimitiveCollection capacity exceeded.",
|
|
60
|
+
ERR_MULTIPLE_OF_FOUR:
|
|
61
|
+
"BufferPrimitive byte length must be a multiple of 4.",
|
|
62
|
+
ERR_OUT_OF_RANGE: "BufferPrimitive buffer access out of range.",
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Resources managed by the collection's renderer. Collections may have multiple renderer
|
|
67
|
+
* implementations, so the collection should be ignorant of the renderer's implementation
|
|
68
|
+
* and context data. A collection only has one renderer active at a time.
|
|
69
|
+
*
|
|
70
|
+
* @type {Destroyable|null}
|
|
71
|
+
* @ignore
|
|
72
|
+
*/
|
|
73
|
+
_renderContext = null;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @param {object} options
|
|
77
|
+
* @param {Matrix4} [options.modelMatrix=Matrix4.IDENTITY] Transforms geometry from model to world coordinates.
|
|
78
|
+
* @param {number} [options.primitiveCountMax=BufferPrimitiveCollection.DEFAULT_CAPACITY]
|
|
79
|
+
* @param {number} [options.vertexCountMax=BufferPrimitiveCollection.DEFAULT_CAPACITY]
|
|
80
|
+
* @param {boolean} [options.show=true]
|
|
81
|
+
* @param {ComponentDatatype} [options.positionDatatype=ComponentDatatype.DOUBLE]
|
|
82
|
+
* @param {boolean} [options.allowPicking=false] When <code>true</code>, primitives are pickable with {@link Scene#pick}. When <code>false</code>, memory and initialization cost are lower.
|
|
83
|
+
* @param {boolean} [options.debugShowBoundingVolume=false]
|
|
84
|
+
*/
|
|
85
|
+
constructor(options = Frozen.EMPTY_OBJECT) {
|
|
86
|
+
/**
|
|
87
|
+
* Determines if primitives in this collection will be shown.
|
|
88
|
+
* @type {boolean}
|
|
89
|
+
* @default true
|
|
90
|
+
*/
|
|
91
|
+
this.show = options.show ?? true;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Transforms geometry from model to world coordinates.
|
|
95
|
+
* @type {Matrix4}
|
|
96
|
+
* @default Matrix4.IDENTITY
|
|
97
|
+
*/
|
|
98
|
+
this.modelMatrix = Matrix4.clone(options.modelMatrix ?? Matrix4.IDENTITY);
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Local bounding volume for all primitives in the collection, including both
|
|
102
|
+
* shown and hidden primitives.
|
|
103
|
+
* @type {BoundingSphere}
|
|
104
|
+
*/
|
|
105
|
+
this.boundingVolume = new BoundingSphere();
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* World bounding volume for all primitives in the collection, including both
|
|
109
|
+
* shown and hidden primitives.
|
|
110
|
+
* @type {BoundingSphere}
|
|
111
|
+
*/
|
|
112
|
+
this.boundingVolumeWC = new BoundingSphere();
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* When <code>true</code>, primitives are pickable with {@link Scene#pick}.
|
|
116
|
+
* When <code>false</code>, memory and initialization cost are lower.
|
|
117
|
+
* @type {boolean}
|
|
118
|
+
* @readonly
|
|
119
|
+
* @ignore
|
|
120
|
+
* @default false
|
|
121
|
+
*/
|
|
122
|
+
this._allowPicking = options.allowPicking ?? false;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* This property is for debugging only; it is not for production use nor is it optimized.
|
|
126
|
+
* <p>
|
|
127
|
+
* Draws the bounding sphere for each draw command in the primitive.
|
|
128
|
+
* </p>
|
|
129
|
+
*
|
|
130
|
+
* @type {boolean}
|
|
131
|
+
* @default false
|
|
132
|
+
*/
|
|
133
|
+
this.debugShowBoundingVolume = options.debugShowBoundingVolume ?? false;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* @type {number}
|
|
137
|
+
* @protected
|
|
138
|
+
* @ignore
|
|
139
|
+
*/
|
|
140
|
+
this._primitiveCount = 0;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* @type {number}
|
|
144
|
+
* @protected
|
|
145
|
+
* @ignore
|
|
146
|
+
*/
|
|
147
|
+
this._primitiveCountMax =
|
|
148
|
+
options.primitiveCountMax ?? BufferPrimitiveCollection.DEFAULT_CAPACITY;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* @type {DataView<ArrayBuffer>}
|
|
152
|
+
* @ignore
|
|
153
|
+
*/
|
|
154
|
+
this._primitiveView = null;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* @type {number}
|
|
158
|
+
* @ignore
|
|
159
|
+
*/
|
|
160
|
+
this._positionCount = 0;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* @type {number}
|
|
164
|
+
* @protected
|
|
165
|
+
* @ignore
|
|
166
|
+
*/
|
|
167
|
+
this._positionCountMax =
|
|
168
|
+
options.vertexCountMax ?? BufferPrimitiveCollection.DEFAULT_CAPACITY;
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @type {TypedArray}
|
|
172
|
+
* @ignore
|
|
173
|
+
*/
|
|
174
|
+
this._positionView = null;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @type {DataView<ArrayBuffer>}
|
|
178
|
+
* @ignore
|
|
179
|
+
*/
|
|
180
|
+
this._materialView = null;
|
|
181
|
+
|
|
182
|
+
// Potentially-dirty primitives are tracked as a contiguous range, with
|
|
183
|
+
// 'clean' primitives potentially within the range. Individual primitive
|
|
184
|
+
// 'dirty' flags are source-of-truth.
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* @type {number}
|
|
188
|
+
* @ignore
|
|
189
|
+
*/
|
|
190
|
+
this._dirtyOffset = 0;
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* @type {number}
|
|
194
|
+
* @ignore
|
|
195
|
+
*/
|
|
196
|
+
this._dirtyCount = 0;
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* @type {boolean}
|
|
200
|
+
* @ignore
|
|
201
|
+
*/
|
|
202
|
+
this._dirtyBoundingVolume = false;
|
|
203
|
+
|
|
204
|
+
this._allocatePrimitiveBuffer();
|
|
205
|
+
this._allocatePositionBuffer(
|
|
206
|
+
// @ts-expect-error Requires https://github.com/CesiumGS/cesium/pull/13203.
|
|
207
|
+
options.positionDatatype ?? ComponentDatatype.DOUBLE,
|
|
208
|
+
);
|
|
209
|
+
this._allocateMaterialBuffer();
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Accessing `this.constructor` can cause JSDoc builds to fail, so use this
|
|
214
|
+
* protected getter function instead.
|
|
215
|
+
* @protected
|
|
216
|
+
* @return {*}
|
|
217
|
+
* @ignore
|
|
218
|
+
*/
|
|
219
|
+
_getCollectionClass() {
|
|
220
|
+
DeveloperError.throwInstantiationError();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* @protected
|
|
225
|
+
* @return {*}
|
|
226
|
+
* @ignore
|
|
227
|
+
*/
|
|
228
|
+
_getPrimitiveClass() {
|
|
229
|
+
DeveloperError.throwInstantiationError();
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* @return {*}
|
|
234
|
+
* @ignore
|
|
235
|
+
*/
|
|
236
|
+
_getMaterialClass() {
|
|
237
|
+
DeveloperError.throwInstantiationError();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
241
|
+
// COLLECTION LIFECYCLE
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* @private
|
|
245
|
+
* @ignore
|
|
246
|
+
*/
|
|
247
|
+
_allocatePrimitiveBuffer() {
|
|
248
|
+
const layout = this._getPrimitiveClass().Layout;
|
|
249
|
+
|
|
250
|
+
//>>includeStart('debug', pragmas.debug);
|
|
251
|
+
const { ERR_MULTIPLE_OF_FOUR } = BufferPrimitiveCollection.Error;
|
|
252
|
+
assert(layout.__BYTE_LENGTH % 4 === 0, ERR_MULTIPLE_OF_FOUR);
|
|
253
|
+
//>>includeEnd('debug');
|
|
254
|
+
|
|
255
|
+
this._primitiveView = new DataView(
|
|
256
|
+
new ArrayBuffer(this._primitiveCountMax * layout.__BYTE_LENGTH),
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* @param {ComponentDatatype} datatype
|
|
262
|
+
* @private
|
|
263
|
+
* @ignore
|
|
264
|
+
*/
|
|
265
|
+
_allocatePositionBuffer(datatype) {
|
|
266
|
+
// @ts-expect-error Requires https://github.com/CesiumGS/cesium/pull/13203.
|
|
267
|
+
this._positionView = ComponentDatatype.createTypedArray(
|
|
268
|
+
datatype,
|
|
269
|
+
this._positionCountMax * 3,
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* @private
|
|
275
|
+
* @ignore
|
|
276
|
+
*/
|
|
277
|
+
_allocateMaterialBuffer() {
|
|
278
|
+
const MaterialClass = this._getMaterialClass();
|
|
279
|
+
this._materialView = new DataView(
|
|
280
|
+
new ArrayBuffer(this._primitiveCountMax * MaterialClass.packedLength),
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Returns true if this object was destroyed; otherwise, false.
|
|
286
|
+
*
|
|
287
|
+
* @returns {boolean} True if this object was destroyed; otherwise, false.
|
|
288
|
+
*/
|
|
289
|
+
isDestroyed() {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** Destroys collection and its GPU resources. */
|
|
294
|
+
destroy() {
|
|
295
|
+
if (defined(this._renderContext)) {
|
|
296
|
+
this._renderContext.destroy();
|
|
297
|
+
this._renderContext = undefined;
|
|
298
|
+
this._dirtyOffset = 0;
|
|
299
|
+
this._dirtyCount = this.primitiveCount;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Sorts primitives of the collection.
|
|
305
|
+
*
|
|
306
|
+
* Because sorting changes the indices (but not the feature IDs) of primitives
|
|
307
|
+
* in the collection, the function also returns an array mapping from previous
|
|
308
|
+
* index to new index. When sorting repeatedly, the array can be reused and
|
|
309
|
+
* passed as the 'result' argument for each call.
|
|
310
|
+
*
|
|
311
|
+
* @param {Function} sortFn
|
|
312
|
+
* @param {Uint32Array} result
|
|
313
|
+
* @returns {Uint32Array} Mapping from previous index to new index.
|
|
314
|
+
*/
|
|
315
|
+
sort(sortFn, result = new Uint32Array(this.primitiveCount)) {
|
|
316
|
+
const PrimitiveClass = this._getPrimitiveClass();
|
|
317
|
+
const CollectionClass = this._getCollectionClass();
|
|
318
|
+
|
|
319
|
+
const { primitiveCount } = this;
|
|
320
|
+
|
|
321
|
+
const a = new PrimitiveClass();
|
|
322
|
+
const b = new PrimitiveClass();
|
|
323
|
+
|
|
324
|
+
// Mapping from NEW index to PREVIOUS index.
|
|
325
|
+
const dstSrcMap = new Uint32Array(primitiveCount);
|
|
326
|
+
for (let i = 0; i < primitiveCount; i++) {
|
|
327
|
+
dstSrcMap[i] = i;
|
|
328
|
+
}
|
|
329
|
+
dstSrcMap.sort((indexA, indexB) =>
|
|
330
|
+
sortFn(this.get(indexA, a), this.get(indexB, b)),
|
|
331
|
+
);
|
|
332
|
+
|
|
333
|
+
// Mapping from PREVIOUS index to NEW index.
|
|
334
|
+
for (let i = 0; i < primitiveCount; i++) {
|
|
335
|
+
result[dstSrcMap[i]] = i;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Copy primitives to temporary collection, in sort order.
|
|
339
|
+
const tmp = CollectionClass._cloneEmpty(this);
|
|
340
|
+
for (let i = 0; i < primitiveCount; i++) {
|
|
341
|
+
const src = this.get(dstSrcMap[i], a);
|
|
342
|
+
const dst = tmp.add({}, b);
|
|
343
|
+
PrimitiveClass.clone(src, dst);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Assign buffers from temporary collection onto this one.
|
|
347
|
+
CollectionClass._replaceBuffers(tmp, this);
|
|
348
|
+
this._dirtyOffset = 0;
|
|
349
|
+
this._dirtyCount = primitiveCount;
|
|
350
|
+
|
|
351
|
+
return result;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Duplicates the contents of this collection into the result collection.
|
|
356
|
+
* Result collection is not resized, and must contain enough space for all
|
|
357
|
+
* primitives in the source collection. Existing primitives in the result
|
|
358
|
+
* collection will be overwritten.
|
|
359
|
+
*
|
|
360
|
+
* <p>Useful when allocating more space for a collection that has reached its
|
|
361
|
+
* capacity, and efficiently transferring features to the new collection.</p>
|
|
362
|
+
*
|
|
363
|
+
* @example
|
|
364
|
+
* const result = new BufferPrimitiveCollection({ ... }); // allocate larger 'result' collection
|
|
365
|
+
* BufferPrimitiveCollection.clone(collection, result); // copy primitives from 'collection' into 'result'
|
|
366
|
+
*
|
|
367
|
+
* @param {BufferPrimitiveCollection<T>} collection
|
|
368
|
+
* @param {BufferPrimitiveCollection<T>} result
|
|
369
|
+
* @template T extends BufferPrimitive
|
|
370
|
+
*/
|
|
371
|
+
static clone(collection, result) {
|
|
372
|
+
//>>includeStart('debug', pragmas.debug);
|
|
373
|
+
const { ERR_CAPACITY } = BufferPrimitiveCollection.Error;
|
|
374
|
+
assert(collection.primitiveCount <= result.primitiveCountMax, ERR_CAPACITY);
|
|
375
|
+
assert(collection.vertexCount <= result.vertexCountMax, ERR_CAPACITY);
|
|
376
|
+
//>>includeEnd('debug');
|
|
377
|
+
|
|
378
|
+
const layout = collection._getPrimitiveClass().Layout;
|
|
379
|
+
const MaterialClass = collection._getMaterialClass();
|
|
380
|
+
const PrimitiveClass = collection._getPrimitiveClass();
|
|
381
|
+
|
|
382
|
+
this._copySubDataView(
|
|
383
|
+
collection._primitiveView,
|
|
384
|
+
result._primitiveView,
|
|
385
|
+
collection.primitiveCount * layout.__BYTE_LENGTH,
|
|
386
|
+
);
|
|
387
|
+
|
|
388
|
+
this._copySubArray(
|
|
389
|
+
collection._positionView,
|
|
390
|
+
result._positionView,
|
|
391
|
+
collection.vertexCount * 3,
|
|
392
|
+
);
|
|
393
|
+
|
|
394
|
+
this._copySubDataView(
|
|
395
|
+
collection._materialView,
|
|
396
|
+
result._materialView,
|
|
397
|
+
collection.primitiveCount * MaterialClass.packedLength,
|
|
398
|
+
);
|
|
399
|
+
|
|
400
|
+
result.show = collection.show;
|
|
401
|
+
result.debugShowBoundingVolume = collection.debugShowBoundingVolume;
|
|
402
|
+
result._primitiveCount = collection._primitiveCount;
|
|
403
|
+
result._positionCount = collection._positionCount;
|
|
404
|
+
|
|
405
|
+
// Unset PickIds.
|
|
406
|
+
const primitive = new PrimitiveClass();
|
|
407
|
+
for (let i = 0, il = result.primitiveCount; i < il; i++) {
|
|
408
|
+
result.get(i, primitive)._pickId = 0;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
result._dirtyOffset = 0;
|
|
412
|
+
result._dirtyCount = result.primitiveCount;
|
|
413
|
+
|
|
414
|
+
collection.boundingVolume.clone(result.boundingVolume);
|
|
415
|
+
|
|
416
|
+
return result;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Returns an empty collection with the same buffer sizes as this collection.
|
|
421
|
+
* Internal utility for operations requiring a working copy of memory.
|
|
422
|
+
*
|
|
423
|
+
* @param {BufferPrimitiveCollection<T>} collection
|
|
424
|
+
* @returns {BufferPrimitiveCollection<T>}
|
|
425
|
+
* @template T extends BufferPrimitive
|
|
426
|
+
* @protected
|
|
427
|
+
* @abstract
|
|
428
|
+
* @ignore
|
|
429
|
+
*/
|
|
430
|
+
static _cloneEmpty(collection) {
|
|
431
|
+
DeveloperError.throwInstantiationError();
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Assigns buffers from source collection to target collection, without
|
|
436
|
+
* validation or side effects. Callers must handle any validation, dirty
|
|
437
|
+
* flag updates, etc.
|
|
438
|
+
*
|
|
439
|
+
* @param {BufferPrimitiveCollection<T>} src
|
|
440
|
+
* @param {BufferPrimitiveCollection<T>} dst
|
|
441
|
+
* @template T extends BufferPrimitive
|
|
442
|
+
* @protected
|
|
443
|
+
* @ignore
|
|
444
|
+
*/
|
|
445
|
+
static _replaceBuffers(src, dst) {
|
|
446
|
+
dst._primitiveView = src._primitiveView;
|
|
447
|
+
dst._positionView = src._positionView;
|
|
448
|
+
dst._materialView = src._materialView;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Rebuilds collection bounding volume.
|
|
453
|
+
* @protected
|
|
454
|
+
* @ignore
|
|
455
|
+
*/
|
|
456
|
+
_updateBoundingVolume() {
|
|
457
|
+
const TypedArray = /** @type {TypedArrayConstructor} */ (
|
|
458
|
+
this._positionView.constructor
|
|
459
|
+
);
|
|
460
|
+
|
|
461
|
+
// Exclude unused space in the position buffer.
|
|
462
|
+
const vertices = new TypedArray(
|
|
463
|
+
/** @type {ArrayBuffer} */ (this._positionView.buffer),
|
|
464
|
+
this._positionView.byteOffset,
|
|
465
|
+
this._positionCount * 3,
|
|
466
|
+
);
|
|
467
|
+
|
|
468
|
+
BoundingSphere.fromVertices(
|
|
469
|
+
vertices,
|
|
470
|
+
Cartesian3.ZERO,
|
|
471
|
+
3,
|
|
472
|
+
this.boundingVolume,
|
|
473
|
+
);
|
|
474
|
+
BoundingSphere.transform(
|
|
475
|
+
this.boundingVolume,
|
|
476
|
+
this.modelMatrix,
|
|
477
|
+
this.boundingVolumeWC,
|
|
478
|
+
);
|
|
479
|
+
this._dirtyBoundingVolume = false;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
483
|
+
// PRIMITIVE LIFECYCLE
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Makes the given {@link BufferPrimitive} a view onto this collection's
|
|
487
|
+
* primitive at the given index, for use when reading/writing primitive
|
|
488
|
+
* properties. When iterating over a large collection, prefer to reuse
|
|
489
|
+
* the same BufferPrimitive instance throughout the loop — rebinding
|
|
490
|
+
* an existing instance to a different primitive is cheap, and avoids
|
|
491
|
+
* allocating in-memory objects for every object.
|
|
492
|
+
*
|
|
493
|
+
* @example
|
|
494
|
+
* const primitive = new BufferPrimitive();
|
|
495
|
+
* for (let i = 0; i < collection.primitiveCount; i++) {
|
|
496
|
+
* collection.get(i, primitive);
|
|
497
|
+
* primitive.setColor(Color.RED);
|
|
498
|
+
* }
|
|
499
|
+
*
|
|
500
|
+
* @param {number} index
|
|
501
|
+
* @param {BufferPrimitive} result
|
|
502
|
+
* @returns {BufferPrimitive} The BufferPrimitive instance passed as the
|
|
503
|
+
* 'result' argument, now bound to the specified primitive index.
|
|
504
|
+
*/
|
|
505
|
+
get(index, result) {
|
|
506
|
+
//>>includeStart('debug', pragmas.debug);
|
|
507
|
+
Check.typeOf.number.greaterThanOrEquals("index", index, 0);
|
|
508
|
+
Check.typeOf.number.lessThan("index", index, this._primitiveCount);
|
|
509
|
+
//>>includeEnd('debug');
|
|
510
|
+
|
|
511
|
+
result._collection = this;
|
|
512
|
+
result._index = index;
|
|
513
|
+
result._byteOffset = index * this._getPrimitiveClass().Layout.__BYTE_LENGTH;
|
|
514
|
+
return result;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/**
|
|
518
|
+
* Adds a new primitive to the collection, with the specified options. A
|
|
519
|
+
* {@link BufferPrimitive} instance is linked to the new primitive, using
|
|
520
|
+
* the 'result' argument if given, or a new instance if not. For repeated
|
|
521
|
+
* calls, prefer to reuse a single BufferPrimitive instance rather than
|
|
522
|
+
* allocating a new instance on each call.
|
|
523
|
+
*
|
|
524
|
+
* @param {BufferPrimitiveOptions} options
|
|
525
|
+
* @param {BufferPrimitive} result
|
|
526
|
+
* @returns {BufferPrimitive}
|
|
527
|
+
*/
|
|
528
|
+
add(options = Frozen.EMPTY_OBJECT, result) {
|
|
529
|
+
//>>includeStart('debug', pragmas.debug);
|
|
530
|
+
const { ERR_CAPACITY } = BufferPrimitiveCollection.Error;
|
|
531
|
+
assert(this.primitiveCount < this.primitiveCountMax, ERR_CAPACITY);
|
|
532
|
+
//>>includeEnd('debug');
|
|
533
|
+
|
|
534
|
+
const MaterialClass = this._getMaterialClass();
|
|
535
|
+
|
|
536
|
+
result = this.get(this._primitiveCount++, result);
|
|
537
|
+
result.featureId = this._primitiveCount - 1;
|
|
538
|
+
result.show = options.show ?? true;
|
|
539
|
+
result.setMaterial(options.material ?? MaterialClass.DEFAULT_MATERIAL);
|
|
540
|
+
result._pickId = 0; // unset
|
|
541
|
+
result._dirty = true;
|
|
542
|
+
return result;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* Marks primitive at given index as 'dirty', to be updated on next render.
|
|
547
|
+
* @param {number} index
|
|
548
|
+
* @ignore
|
|
549
|
+
*/
|
|
550
|
+
_makeDirty(index) {
|
|
551
|
+
if (this._dirtyCount === 0) {
|
|
552
|
+
this._dirtyCount = 1;
|
|
553
|
+
this._dirtyOffset = index;
|
|
554
|
+
} else if (index < this._dirtyOffset) {
|
|
555
|
+
this._dirtyCount += this._dirtyOffset - index;
|
|
556
|
+
this._dirtyOffset = index;
|
|
557
|
+
} else if (index + 1 > this._dirtyOffset + this._dirtyCount) {
|
|
558
|
+
this._dirtyCount = index + 1 - this._dirtyOffset;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* Marks collection bounding volume as 'dirty', to be updated on next render.
|
|
564
|
+
* @ignore
|
|
565
|
+
*/
|
|
566
|
+
_makeDirtyBoundingVolume() {
|
|
567
|
+
this._dirtyBoundingVolume = true;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
571
|
+
// RENDER
|
|
572
|
+
|
|
573
|
+
/** @param {object} frameState */
|
|
574
|
+
update(frameState) {
|
|
575
|
+
if (this._dirtyBoundingVolume) {
|
|
576
|
+
this._updateBoundingVolume();
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
581
|
+
// ACCESSORS
|
|
582
|
+
|
|
583
|
+
/**
|
|
584
|
+
* Number of primitives in collection. Must be <= {@link primitiveCountMax}.
|
|
585
|
+
*
|
|
586
|
+
* @type {number}
|
|
587
|
+
* @readonly
|
|
588
|
+
*/
|
|
589
|
+
get primitiveCount() {
|
|
590
|
+
return this._primitiveCount;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* Maximum number of primitives this collection can contain. Must be >=
|
|
595
|
+
* {@link primitiveCount}.
|
|
596
|
+
*
|
|
597
|
+
* @type {number}
|
|
598
|
+
* @readonly
|
|
599
|
+
* @default {@link BufferPrimitiveCollection.DEFAULT_CAPACITY}
|
|
600
|
+
*/
|
|
601
|
+
get primitiveCountMax() {
|
|
602
|
+
return this._primitiveCountMax;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
/**
|
|
606
|
+
* Total byte length of buffers owned by this collection. Includes any unused
|
|
607
|
+
* space allocated by {@link primitiveCountMax}, even if no primitives have
|
|
608
|
+
* yet been added in that space.
|
|
609
|
+
*
|
|
610
|
+
* @type {number}
|
|
611
|
+
* @readonly
|
|
612
|
+
*/
|
|
613
|
+
get byteLength() {
|
|
614
|
+
return (
|
|
615
|
+
this._primitiveView.byteLength +
|
|
616
|
+
this._positionView.byteLength +
|
|
617
|
+
this._materialView.byteLength
|
|
618
|
+
);
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Number of vertices in collection. Must be <= {@link vertexCountMax}.
|
|
623
|
+
*
|
|
624
|
+
* @type {number}
|
|
625
|
+
* @readonly
|
|
626
|
+
*/
|
|
627
|
+
get vertexCount() {
|
|
628
|
+
return this._positionCount;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
/**
|
|
632
|
+
* Maximum number of vertices this collection can contain. Must be >=
|
|
633
|
+
* {@link vertexCount}.
|
|
634
|
+
*
|
|
635
|
+
* @type {number}
|
|
636
|
+
* @readonly
|
|
637
|
+
* @default {@link BufferPrimitiveCollection.DEFAULT_CAPACITY}
|
|
638
|
+
*/
|
|
639
|
+
get vertexCountMax() {
|
|
640
|
+
return this._positionCountMax;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
644
|
+
// UTILS
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* @param {TypedArray} src
|
|
648
|
+
* @param {TypedArray} dst
|
|
649
|
+
* @param {number} count
|
|
650
|
+
* @protected
|
|
651
|
+
* @ignore
|
|
652
|
+
*/
|
|
653
|
+
static _copySubArray(src, dst, count) {
|
|
654
|
+
for (let i = 0; i < count; i++) {
|
|
655
|
+
dst[i] = src[i];
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
/**
|
|
660
|
+
* @param {DataView} src
|
|
661
|
+
* @param {DataView} dst
|
|
662
|
+
* @param {number} byteLength
|
|
663
|
+
* @protected
|
|
664
|
+
* @ignore
|
|
665
|
+
*/
|
|
666
|
+
static _copySubDataView(src, dst, byteLength) {
|
|
667
|
+
// No need to match the original array type, just copy in 4-byte chunks.
|
|
668
|
+
this._copySubArray(
|
|
669
|
+
new Uint32Array(src.buffer, src.byteOffset, src.byteLength / 4),
|
|
670
|
+
new Uint32Array(dst.buffer, dst.byteOffset, dst.byteLength / 4),
|
|
671
|
+
byteLength / 4,
|
|
672
|
+
);
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
/////////////////////////////////////////////////////////////////////////////
|
|
676
|
+
// DEBUG
|
|
677
|
+
|
|
678
|
+
/**
|
|
679
|
+
* Returns a JSON-serializable array representing the collection. This encoding
|
|
680
|
+
* is not memory-efficient, and should generally be used for debugging and
|
|
681
|
+
* testing.
|
|
682
|
+
*
|
|
683
|
+
* @example
|
|
684
|
+
* console.table(collection.toJSON());
|
|
685
|
+
*
|
|
686
|
+
* @returns {Array<Object>} List of JSON-serializable objects, one for each
|
|
687
|
+
* primitive in the collection.
|
|
688
|
+
*/
|
|
689
|
+
toJSON() {
|
|
690
|
+
const PrimitiveClass = this._getPrimitiveClass();
|
|
691
|
+
const primitive = new PrimitiveClass();
|
|
692
|
+
|
|
693
|
+
const results = [];
|
|
694
|
+
for (let i = 0, il = this.primitiveCount; i < il; i++) {
|
|
695
|
+
results.push(this.get(i, primitive).toJSON());
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
return results;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
export default BufferPrimitiveCollection;
|