easy-three-utils 0.0.1
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/package.json +12 -0
- package/src/common/index.ts +24 -0
- package/src/common/useLine2.ts +87 -0
- package/src/common/useLoader.ts +184 -0
- package/src/common/useLocationCalculator.ts +145 -0
- package/src/common/useMark.ts +42 -0
- package/src/common/useTween.ts +86 -0
- package/src/core/basic/camera.ts +28 -0
- package/src/core/basic/clock.ts +11 -0
- package/src/core/basic/control.ts +32 -0
- package/src/core/basic/index.ts +35 -0
- package/src/core/basic/labelRenderer.ts +26 -0
- package/src/core/basic/light.ts +63 -0
- package/src/core/basic/renderer.ts +37 -0
- package/src/core/basic/scene.ts +11 -0
- package/src/core/basic/stats.ts +16 -0
- package/src/core/event.ts +74 -0
- package/src/core/index.ts +11 -0
- package/src/core/main.ts +389 -0
- package/src/draco/README.md +32 -0
- package/src/draco/draco_decoder.js +34 -0
- package/src/draco/draco_decoder.wasm +0 -0
- package/src/draco/draco_encoder.js +33 -0
- package/src/draco/draco_wasm_wrapper.js +117 -0
- package/src/draco/gltf/draco_decoder.js +33 -0
- package/src/draco/gltf/draco_decoder.wasm +0 -0
- package/src/draco/gltf/draco_encoder.js +33 -0
- package/src/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/src/tileRenderer/base/Tile.d.ts +50 -0
- package/src/tileRenderer/base/TileBase.d.ts +76 -0
- package/src/tileRenderer/base/TileInternal.d.ts +36 -0
- package/src/tileRenderer/base/TilesRendererBase.d.ts +35 -0
- package/src/tileRenderer/base/TilesRendererBase.js +847 -0
- package/src/tileRenderer/base/Tileset.d.ts +66 -0
- package/src/tileRenderer/base/constants.d.ts +6 -0
- package/src/tileRenderer/base/constants.js +16 -0
- package/src/tileRenderer/base/loaders/B3DMLoaderBase.d.ts +18 -0
- package/src/tileRenderer/base/loaders/B3DMLoaderBase.js +85 -0
- package/src/tileRenderer/base/loaders/CMPTLoaderBase.d.ts +22 -0
- package/src/tileRenderer/base/loaders/CMPTLoaderBase.js +61 -0
- package/src/tileRenderer/base/loaders/I3DMLoaderBase.d.ts +21 -0
- package/src/tileRenderer/base/loaders/I3DMLoaderBase.js +130 -0
- package/src/tileRenderer/base/loaders/LoaderBase.d.ts +10 -0
- package/src/tileRenderer/base/loaders/LoaderBase.js +73 -0
- package/src/tileRenderer/base/loaders/PNTSLoaderBase.d.ts +17 -0
- package/src/tileRenderer/base/loaders/PNTSLoaderBase.js +82 -0
- package/src/tileRenderer/base/plugins/ImplicitTilingPlugin.js +12 -0
- package/src/tileRenderer/base/traverseFunctions.js +468 -0
- package/src/tileRenderer/gltf.js +144 -0
- package/src/tileRenderer/index.d.ts +41 -0
- package/src/tileRenderer/index.js +44 -0
- package/src/tileRenderer/plugins/README.md +578 -0
- package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.d.ts +2 -0
- package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.js +84 -0
- package/src/tileRenderer/plugins/base/SUBTREELoader.js +876 -0
- package/src/tileRenderer/plugins/index.d.ts +17 -0
- package/src/tileRenderer/plugins/index.js +17 -0
- package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.d.ts +9 -0
- package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.js +175 -0
- package/src/tileRenderer/plugins/three/DebugTilesPlugin.d.ts +29 -0
- package/src/tileRenderer/plugins/three/DebugTilesPlugin.js +677 -0
- package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.d.ts +18 -0
- package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.js +86 -0
- package/src/tileRenderer/plugins/three/GoogleAttributionsManager.js +62 -0
- package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.d.ts +5 -0
- package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.js +200 -0
- package/src/tileRenderer/plugins/three/ReorientationPlugin.d.ts +12 -0
- package/src/tileRenderer/plugins/three/ReorientationPlugin.js +136 -0
- package/src/tileRenderer/plugins/three/TileCompressionPlugin.d.ts +18 -0
- package/src/tileRenderer/plugins/three/TileCompressionPlugin.js +223 -0
- package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.d.ts +5 -0
- package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.js +87 -0
- package/src/tileRenderer/plugins/three/fade/FadeManager.js +370 -0
- package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.d.ts +9 -0
- package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.js +318 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.d.ts +5 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.js +27 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.d.ts +30 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.js +76 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.d.ts +49 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.js +147 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/ClassProperty.js +149 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/MeshFeatures.js +215 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyAttributeAccessor.js +107 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertySetAccessor.js +45 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTableAccessor.js +209 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTextureAccessor.js +244 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/StructuralMetadata.js +202 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/math/Matrix2.js +55 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/utilities/ClassPropertyHelpers.js +495 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TexCoordUtilities.js +72 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TextureReadUtility.js +154 -0
- package/src/tileRenderer/plugins/three/objects/EllipsoidRegionHelper.js +186 -0
- package/src/tileRenderer/plugins/three/objects/SphereHelper.js +55 -0
- package/src/tileRenderer/r3f/README.md +238 -0
- package/src/tileRenderer/r3f/components/CameraControls.jsx +132 -0
- package/src/tileRenderer/r3f/components/CameraTransition.jsx +177 -0
- package/src/tileRenderer/r3f/components/CanvasDOMOverlay.jsx +54 -0
- package/src/tileRenderer/r3f/components/CompassGizmo.jsx +260 -0
- package/src/tileRenderer/r3f/components/TilesAttributionOverlay.jsx +110 -0
- package/src/tileRenderer/r3f/components/TilesRenderer.jsx +239 -0
- package/src/tileRenderer/r3f/index.jsx +6 -0
- package/src/tileRenderer/r3f/utilities/useForceUpdate.jsx +8 -0
- package/src/tileRenderer/r3f/utilities/useObjectDep.jsx +59 -0
- package/src/tileRenderer/r3f/utilities/useOptions.jsx +143 -0
- package/src/tileRenderer/three/DebugTilesRenderer.d.ts +28 -0
- package/src/tileRenderer/three/DebugTilesRenderer.js +58 -0
- package/src/tileRenderer/three/TilesGroup.d.ts +9 -0
- package/src/tileRenderer/three/TilesGroup.js +91 -0
- package/src/tileRenderer/three/TilesRenderer.d.ts +37 -0
- package/src/tileRenderer/three/TilesRenderer.js +1049 -0
- package/src/tileRenderer/three/controls/CameraTransitionManager.js +305 -0
- package/src/tileRenderer/three/controls/EnvironmentControls.js +1295 -0
- package/src/tileRenderer/three/controls/GlobeControls.js +684 -0
- package/src/tileRenderer/three/controls/PivotPointMesh.js +104 -0
- package/src/tileRenderer/three/controls/PointerTracker.js +257 -0
- package/src/tileRenderer/three/controls/utils.js +113 -0
- package/src/tileRenderer/three/loaders/B3DMLoader.d.ts +26 -0
- package/src/tileRenderer/three/loaders/B3DMLoader.js +85 -0
- package/src/tileRenderer/three/loaders/CMPTLoader.d.ts +19 -0
- package/src/tileRenderer/three/loaders/CMPTLoader.js +97 -0
- package/src/tileRenderer/three/loaders/GLTFExtensionLoader.d.ts +11 -0
- package/src/tileRenderer/three/loaders/GLTFExtensionLoader.js +68 -0
- package/src/tileRenderer/three/loaders/I3DMLoader.d.ts +26 -0
- package/src/tileRenderer/three/loaders/I3DMLoader.js +256 -0
- package/src/tileRenderer/three/loaders/PNTSLoader.d.ts +25 -0
- package/src/tileRenderer/three/loaders/PNTSLoader.js +202 -0
- package/src/tileRenderer/three/loaders/gltf/GLTFCesiumRTCExtension.js +12 -0
- package/src/tileRenderer/three/loaders/gltf/GLTFMeshFeaturesExtension.js +12 -0
- package/src/tileRenderer/three/loaders/gltf/GLTFStructuralMetadataExtension.js +12 -0
- package/src/tileRenderer/three/math/Ellipsoid.d.ts +31 -0
- package/src/tileRenderer/three/math/Ellipsoid.js +337 -0
- package/src/tileRenderer/three/math/EllipsoidRegion.d.ts +23 -0
- package/src/tileRenderer/three/math/EllipsoidRegion.js +178 -0
- package/src/tileRenderer/three/math/ExtendedFrustum.js +65 -0
- package/src/tileRenderer/three/math/GeoConstants.d.ts +4 -0
- package/src/tileRenderer/three/math/GeoConstants.js +5 -0
- package/src/tileRenderer/three/math/GeoUtils.d.ts +9 -0
- package/src/tileRenderer/three/math/GeoUtils.js +106 -0
- package/src/tileRenderer/three/math/OBB.js +179 -0
- package/src/tileRenderer/three/math/TileBoundingVolume.js +272 -0
- package/src/tileRenderer/three/plugins/CesiumIonAuthPlugin.js +12 -0
- package/src/tileRenderer/three/plugins/DebugTilesPlugin.js +26 -0
- package/src/tileRenderer/three/plugins/GoogleCloudAuthPlugin.js +12 -0
- package/src/tileRenderer/three/raycastTraverse.js +178 -0
- package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.d.ts +14 -0
- package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.js +21 -0
- package/src/tileRenderer/three/renderers/GoogleTilesRenderer.d.ts +43 -0
- package/src/tileRenderer/three/renderers/GoogleTilesRenderer.js +48 -0
- package/src/tileRenderer/three/utilities.js +54 -0
- package/src/tileRenderer/utilities/BatchTable.d.ts +24 -0
- package/src/tileRenderer/utilities/BatchTable.js +82 -0
- package/src/tileRenderer/utilities/BatchTableHierarchyExtension.js +127 -0
- package/src/tileRenderer/utilities/FeatureTable.d.ts +30 -0
- package/src/tileRenderer/utilities/FeatureTable.js +159 -0
- package/src/tileRenderer/utilities/LRUCache.d.ts +8 -0
- package/src/tileRenderer/utilities/LRUCache.js +385 -0
- package/src/tileRenderer/utilities/PriorityQueue.d.ts +16 -0
- package/src/tileRenderer/utilities/PriorityQueue.js +137 -0
- package/src/tileRenderer/utilities/arrayToString.js +7 -0
- package/src/tileRenderer/utilities/readMagicBytes.js +29 -0
- package/src/tileRenderer/utilities/rgb565torgb.js +22 -0
- package/src/tileRenderer/utilities/urlExtension.js +34 -0
- package/tsconfig.json +42 -0
- package/tsconfig.node.json +11 -0
- package/typings/three.d.ts +27 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import {
|
|
2
|
+
initializeFromProperty,
|
|
3
|
+
adjustValueScaleOffset,
|
|
4
|
+
getField,
|
|
5
|
+
isNumericType,
|
|
6
|
+
resolveDefaultElement,
|
|
7
|
+
resolveNoData,
|
|
8
|
+
resolveDefault,
|
|
9
|
+
} from '../utilities/ClassPropertyHelpers.js';
|
|
10
|
+
|
|
11
|
+
export class ClassProperty {
|
|
12
|
+
|
|
13
|
+
constructor( enums, property, accessorProperty = null ) {
|
|
14
|
+
|
|
15
|
+
// initialize defaults for class property info
|
|
16
|
+
this.name = property.name || null;
|
|
17
|
+
this.description = property.description || null;
|
|
18
|
+
this.type = property.type;
|
|
19
|
+
this.componentType = property.componentType || null;
|
|
20
|
+
this.enumType = property.enumType || null;
|
|
21
|
+
this.array = property.array || false;
|
|
22
|
+
this.count = property.count || 0;
|
|
23
|
+
this.normalized = property.normalized || false;
|
|
24
|
+
this.offset = property.offset || 0;
|
|
25
|
+
this.scale = getField( property, 'scale', 1 );
|
|
26
|
+
this.max = getField( property, 'max', Infinity );
|
|
27
|
+
this.min = getField( property, 'min', - Infinity );
|
|
28
|
+
this.required = property.required || false;
|
|
29
|
+
this.noData = getField( property, 'noData', null );
|
|
30
|
+
this.default = getField( property, 'default', null );
|
|
31
|
+
this.semantic = getField( property, 'semantic', null );
|
|
32
|
+
this.enumSet = null;
|
|
33
|
+
this.accessorProperty = accessorProperty;
|
|
34
|
+
|
|
35
|
+
// accessor properties can override min, max, offset, and scale values
|
|
36
|
+
if ( accessorProperty ) {
|
|
37
|
+
|
|
38
|
+
this.offset = getField( accessorProperty, 'offset', this.offset );
|
|
39
|
+
this.scale = getField( accessorProperty, 'scale', this.scale );
|
|
40
|
+
this.max = getField( accessorProperty, 'max', this.max );
|
|
41
|
+
this.min = getField( accessorProperty, 'min', this.min );
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// get the component type for the provided enum
|
|
46
|
+
if ( property.type === 'ENUM' ) {
|
|
47
|
+
|
|
48
|
+
this.enumSet = enums[ this.enumType ];
|
|
49
|
+
if ( this.componentType === null ) {
|
|
50
|
+
|
|
51
|
+
this.componentType = getField( this.enumSet, 'valueType', 'UINT16' );
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// shape the given target to match the data type of the property
|
|
60
|
+
// enums are set to their integer value
|
|
61
|
+
shapeToProperty( target, countOverride = null ) {
|
|
62
|
+
|
|
63
|
+
return initializeFromProperty( this, target, countOverride );
|
|
64
|
+
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// resolve the given object to the default value for the property for a single element
|
|
68
|
+
// enums are set to a default string
|
|
69
|
+
resolveDefaultElement( target ) {
|
|
70
|
+
|
|
71
|
+
return resolveDefaultElement( this, target );
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// resolve the target to the default value for the property for every element if it's an array
|
|
76
|
+
// enums are set to a default string
|
|
77
|
+
resolveDefault( target ) {
|
|
78
|
+
|
|
79
|
+
return resolveDefault( this, target );
|
|
80
|
+
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// converts any instances of no data to the default value
|
|
84
|
+
resolveNoData( target ) {
|
|
85
|
+
|
|
86
|
+
return resolveNoData( this, target );
|
|
87
|
+
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// converts enums integers in the given target to strings
|
|
91
|
+
resolveEnumsToStrings( target ) {
|
|
92
|
+
|
|
93
|
+
const enumSet = this.enumSet;
|
|
94
|
+
if ( this.type === 'ENUM' ) {
|
|
95
|
+
|
|
96
|
+
if ( Array.isArray( target ) ) {
|
|
97
|
+
|
|
98
|
+
for ( let i = 0, l = target.length; i < l; i ++ ) {
|
|
99
|
+
|
|
100
|
+
target[ i ] = getEnumName( target[ i ] );
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
} else {
|
|
105
|
+
|
|
106
|
+
target = getEnumName( target );
|
|
107
|
+
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return target;
|
|
114
|
+
|
|
115
|
+
function getEnumName( index ) {
|
|
116
|
+
|
|
117
|
+
const match = enumSet.values.find( e => e.value === index );
|
|
118
|
+
if ( match === null ) {
|
|
119
|
+
|
|
120
|
+
// the default "default enum" value is an empty string when we can't find a match
|
|
121
|
+
// in a case where enums are defined correctly we should never get here.
|
|
122
|
+
return '';
|
|
123
|
+
|
|
124
|
+
} else {
|
|
125
|
+
|
|
126
|
+
return match.name;
|
|
127
|
+
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// apply scales
|
|
135
|
+
adjustValueScaleOffset( target ) {
|
|
136
|
+
|
|
137
|
+
if ( isNumericType( this.type ) ) {
|
|
138
|
+
|
|
139
|
+
return adjustValueScaleOffset( this, target );
|
|
140
|
+
|
|
141
|
+
} else {
|
|
142
|
+
|
|
143
|
+
return target;
|
|
144
|
+
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { Vector2 } from 'three';
|
|
2
|
+
import { TextureReadUtility } from '../utilities/TextureReadUtility.js';
|
|
3
|
+
import { getTexCoord, getTexelIndices, getTriangleVertexIndices } from '../utilities/TexCoordUtilities.js';
|
|
4
|
+
|
|
5
|
+
const _uv = /* @__PURE__ */ new Vector2();
|
|
6
|
+
const _pixel = /* @__PURE__ */ new Vector2();
|
|
7
|
+
const _dstPixel = /* @__PURE__ */ new Vector2();
|
|
8
|
+
|
|
9
|
+
// retrieve the appropriate UV attribute based on the tex coord index
|
|
10
|
+
function getMaxBarycoordIndex( barycoord ) {
|
|
11
|
+
|
|
12
|
+
if ( barycoord.x > barycoord.y && barycoord.x > barycoord.z ) {
|
|
13
|
+
|
|
14
|
+
return 0;
|
|
15
|
+
|
|
16
|
+
} else if ( barycoord.y > barycoord.z ) {
|
|
17
|
+
|
|
18
|
+
return 1;
|
|
19
|
+
|
|
20
|
+
} else {
|
|
21
|
+
|
|
22
|
+
return 2;
|
|
23
|
+
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export class MeshFeatures {
|
|
29
|
+
|
|
30
|
+
constructor( geometry, textures, data ) {
|
|
31
|
+
|
|
32
|
+
this.geometry = geometry;
|
|
33
|
+
this.textures = textures;
|
|
34
|
+
this.data = data;
|
|
35
|
+
this._asyncRead = false;
|
|
36
|
+
|
|
37
|
+
// fill out feature id default values
|
|
38
|
+
this.featureIds = data.featureIds.map( info => {
|
|
39
|
+
|
|
40
|
+
const { texture, ...rest } = info;
|
|
41
|
+
const result = {
|
|
42
|
+
label: null,
|
|
43
|
+
propertyTable: null,
|
|
44
|
+
nullFeatureId: null,
|
|
45
|
+
...rest,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
if ( texture ) {
|
|
49
|
+
|
|
50
|
+
result.texture = {
|
|
51
|
+
texCoord: 0,
|
|
52
|
+
channels: [ 0 ],
|
|
53
|
+
...texture,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return result;
|
|
59
|
+
|
|
60
|
+
} );
|
|
61
|
+
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// returns list of textures
|
|
65
|
+
getTextures() {
|
|
66
|
+
|
|
67
|
+
return this.textures;
|
|
68
|
+
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// returns a set of info for each feature
|
|
72
|
+
getFeatureInfo() {
|
|
73
|
+
|
|
74
|
+
return this.featureIds;
|
|
75
|
+
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// performs texture data read back asynchronously
|
|
79
|
+
getFeaturesAsync( ...args ) {
|
|
80
|
+
|
|
81
|
+
this._asyncRead = true;
|
|
82
|
+
const result = this.getFeatures( ...args );
|
|
83
|
+
this._asyncRead = false;
|
|
84
|
+
return result;
|
|
85
|
+
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// returns all features for the given point on the given triangle
|
|
89
|
+
getFeatures( triangle, barycoord ) {
|
|
90
|
+
|
|
91
|
+
const { geometry, textures, featureIds } = this;
|
|
92
|
+
const result = new Array( featureIds.length ).fill( null );
|
|
93
|
+
|
|
94
|
+
// prep the canvas width
|
|
95
|
+
const width = featureIds.length;
|
|
96
|
+
TextureReadUtility.increaseSizeTo( width );
|
|
97
|
+
|
|
98
|
+
// get the attribute indices
|
|
99
|
+
const indices = getTriangleVertexIndices( geometry, triangle );
|
|
100
|
+
const closestIndex = indices[ getMaxBarycoordIndex( barycoord ) ];
|
|
101
|
+
for ( let i = 0, l = featureIds.length; i < l; i ++ ) {
|
|
102
|
+
|
|
103
|
+
// the feature id from the closest point is returned
|
|
104
|
+
const featureId = featureIds[ i ];
|
|
105
|
+
const nullFeatureId = 'nullFeatureId' in featureId ? featureId.nullFeatureId : null;
|
|
106
|
+
if ( 'texture' in featureId ) {
|
|
107
|
+
|
|
108
|
+
const texture = textures[ featureId.texture.index ];
|
|
109
|
+
|
|
110
|
+
// get the attribute of the target tex coord and pixel
|
|
111
|
+
getTexCoord( geometry, featureId.texture.texCoord, barycoord, indices, _uv );
|
|
112
|
+
getTexelIndices( _uv, texture.image.width, texture.image.height, _pixel );
|
|
113
|
+
_dstPixel.set( i, 0 );
|
|
114
|
+
|
|
115
|
+
// draw the image
|
|
116
|
+
TextureReadUtility.renderPixelToTarget( textures[ featureId.texture.index ], _pixel, _dstPixel );
|
|
117
|
+
|
|
118
|
+
} else if ( 'attribute' in featureId ) {
|
|
119
|
+
|
|
120
|
+
const attr = geometry.getAttribute( `_feature_id_${ featureId.attribute }` );
|
|
121
|
+
const value = attr.getX( closestIndex );
|
|
122
|
+
if ( value !== nullFeatureId ) {
|
|
123
|
+
|
|
124
|
+
result[ i ] = value;
|
|
125
|
+
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
} else {
|
|
129
|
+
|
|
130
|
+
// implicit id is based on vertex attributes, see 3d-tiles#763
|
|
131
|
+
const value = closestIndex;
|
|
132
|
+
if ( value !== nullFeatureId ) {
|
|
133
|
+
|
|
134
|
+
result[ i ] = value;
|
|
135
|
+
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// read the buffer data
|
|
143
|
+
const buffer = new Uint8Array( width * 4 );
|
|
144
|
+
if ( this._asyncRead ) {
|
|
145
|
+
|
|
146
|
+
return TextureReadUtility
|
|
147
|
+
.readDataAsync( buffer )
|
|
148
|
+
.then( () => {
|
|
149
|
+
|
|
150
|
+
readTextureSampleResults();
|
|
151
|
+
return result;
|
|
152
|
+
|
|
153
|
+
} );
|
|
154
|
+
|
|
155
|
+
} else {
|
|
156
|
+
|
|
157
|
+
TextureReadUtility.readData( buffer );
|
|
158
|
+
readTextureSampleResults();
|
|
159
|
+
|
|
160
|
+
return result;
|
|
161
|
+
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function readTextureSampleResults() {
|
|
165
|
+
|
|
166
|
+
// get data based on the texture information
|
|
167
|
+
const readBuffer = new Uint32Array( 1 );
|
|
168
|
+
for ( let i = 0, l = featureIds.length; i < l; i ++ ) {
|
|
169
|
+
|
|
170
|
+
const featureId = featureIds[ i ];
|
|
171
|
+
const nullFeatureId = 'nullFeatureId' in featureId ? featureId.nullFeatureId : null;
|
|
172
|
+
if ( 'texture' in featureId ) {
|
|
173
|
+
|
|
174
|
+
// TODO: do we need to handle big-endian here?
|
|
175
|
+
const { channels } = featureId.texture;
|
|
176
|
+
const data = channels.map( c => buffer[ 4 * i + c ] );
|
|
177
|
+
new Uint8Array( readBuffer.buffer ).set( data );
|
|
178
|
+
|
|
179
|
+
const value = readBuffer[ 0 ];
|
|
180
|
+
if ( value !== nullFeatureId ) {
|
|
181
|
+
|
|
182
|
+
result[ i ] = value;
|
|
183
|
+
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// dispose all of the texture data used
|
|
195
|
+
dispose() {
|
|
196
|
+
|
|
197
|
+
this.textures.forEach( texture => {
|
|
198
|
+
|
|
199
|
+
if ( texture ) {
|
|
200
|
+
|
|
201
|
+
texture.dispose();
|
|
202
|
+
|
|
203
|
+
if ( texture.image instanceof ImageBitmap ) {
|
|
204
|
+
|
|
205
|
+
texture.image.close();
|
|
206
|
+
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
} );
|
|
212
|
+
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { initializeFromClass, isMatrixType, isVectorType } from '../utilities/ClassPropertyHelpers.js';
|
|
2
|
+
import { ClassProperty } from './ClassProperty.js';
|
|
3
|
+
import { PropertySetAccessor } from './PropertySetAccessor.js';
|
|
4
|
+
|
|
5
|
+
class PropertyAttributeClassProperty extends ClassProperty {
|
|
6
|
+
|
|
7
|
+
constructor( enums, classProperty, attributeProperty = null ) {
|
|
8
|
+
|
|
9
|
+
super( enums, classProperty, attributeProperty );
|
|
10
|
+
|
|
11
|
+
this.attribute = attributeProperty.attribute;
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class PropertyAttributeAccessor extends PropertySetAccessor {
|
|
18
|
+
|
|
19
|
+
constructor( ...args ) {
|
|
20
|
+
|
|
21
|
+
super( ...args );
|
|
22
|
+
|
|
23
|
+
this.isPropertyAttributeAccessor = true;
|
|
24
|
+
this._initProperties( PropertyAttributeClassProperty );
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
getData( id, geometry, target = {} ) {
|
|
29
|
+
|
|
30
|
+
const properties = this.properties;
|
|
31
|
+
initializeFromClass( properties, target );
|
|
32
|
+
|
|
33
|
+
for ( const name in properties ) {
|
|
34
|
+
|
|
35
|
+
target[ name ] = this.getPropertyValue( name, id, geometry, target[ name ] );
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return target;
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
getPropertyValue( name, id, geometry, target = null ) {
|
|
44
|
+
|
|
45
|
+
// NOTE: arrays are not supported via attribute accessors
|
|
46
|
+
if ( id >= this.count ) {
|
|
47
|
+
|
|
48
|
+
throw new Error( 'PropertyAttributeAccessor: Requested index is outside the range of the buffer.' );
|
|
49
|
+
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// use a default of the texture accessor definition does not include the value
|
|
53
|
+
const property = this.properties[ name ];
|
|
54
|
+
const type = property.type;
|
|
55
|
+
if ( ! property ) {
|
|
56
|
+
|
|
57
|
+
throw new Error( 'PropertyAttributeAccessor: Requested class property does not exist.' );
|
|
58
|
+
|
|
59
|
+
} else if ( ! this.definition.properties[ name ] ) {
|
|
60
|
+
|
|
61
|
+
return property.resolveDefault( target );
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// initialize the array
|
|
66
|
+
target = property.shapeToProperty( target );
|
|
67
|
+
|
|
68
|
+
// Read the data values from the attribute
|
|
69
|
+
const attribute = geometry.getAttribute( property.attribute.toLowerCase() );
|
|
70
|
+
if ( isMatrixType( type ) ) {
|
|
71
|
+
|
|
72
|
+
const elements = target.elements;
|
|
73
|
+
for ( let i = 0, l = elements.length; i < l; i < l ) {
|
|
74
|
+
|
|
75
|
+
elements[ i ] = attribute.getComponent( id, i );
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
} else if ( isVectorType( type ) ) {
|
|
80
|
+
|
|
81
|
+
target.fromBufferAttribute( attribute, id );
|
|
82
|
+
|
|
83
|
+
} else if ( type === 'SCALAR' || type === 'ENUM' ) {
|
|
84
|
+
|
|
85
|
+
target = attribute.getX( id );
|
|
86
|
+
|
|
87
|
+
} else {
|
|
88
|
+
|
|
89
|
+
// BOOLEAN, STRING not supported
|
|
90
|
+
throw new Error( 'StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.' );
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// scale the numeric values
|
|
95
|
+
target = property.adjustValueScaleOffset( target );
|
|
96
|
+
|
|
97
|
+
// convert to enum strings - no data enum values are stored as strings
|
|
98
|
+
target = property.resolveEnumsToStrings( target );
|
|
99
|
+
|
|
100
|
+
// resolve to default values
|
|
101
|
+
target = property.resolveNoData( target );
|
|
102
|
+
|
|
103
|
+
return target;
|
|
104
|
+
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ClassProperty } from './ClassProperty.js';
|
|
2
|
+
|
|
3
|
+
export class PropertySetAccessor {
|
|
4
|
+
|
|
5
|
+
constructor( definition, classes = {}, enums = {}, data = null ) {
|
|
6
|
+
|
|
7
|
+
this.definition = definition;
|
|
8
|
+
this.class = classes[ definition.class ];
|
|
9
|
+
this.className = definition.class;
|
|
10
|
+
this.enums = enums;
|
|
11
|
+
this.data = data;
|
|
12
|
+
this.name = 'name' in definition ? definition.name : null;
|
|
13
|
+
|
|
14
|
+
this.properties = null;
|
|
15
|
+
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
getPropertyNames() {
|
|
19
|
+
|
|
20
|
+
return Object.keys( this.class.properties );
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
includesData( name ) {
|
|
25
|
+
|
|
26
|
+
return Boolean( this.definition.properties[ name ] );
|
|
27
|
+
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
dispose() {}
|
|
31
|
+
|
|
32
|
+
_initProperties( propertyClass = ClassProperty ) {
|
|
33
|
+
|
|
34
|
+
const properties = {};
|
|
35
|
+
for ( const key in this.class.properties ) {
|
|
36
|
+
|
|
37
|
+
properties[ key ] = new propertyClass( this.enums, this.class.properties[ key ], this.definition.properties[ key ] );
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
this.properties = properties;
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
}
|