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,209 @@
|
|
|
1
|
+
import { ClassProperty } from './ClassProperty.js';
|
|
2
|
+
import { PropertySetAccessor } from './PropertySetAccessor.js';
|
|
3
|
+
import {
|
|
4
|
+
initializeFromClass,
|
|
5
|
+
getArrayConstructorFromComponentType,
|
|
6
|
+
readDataFromBufferToType,
|
|
7
|
+
getField,
|
|
8
|
+
isNumericType,
|
|
9
|
+
typeToComponentCount,
|
|
10
|
+
} from '../utilities/ClassPropertyHelpers.js';
|
|
11
|
+
|
|
12
|
+
class PropertyTableClassProperty extends ClassProperty {
|
|
13
|
+
|
|
14
|
+
constructor( enums, classProperty, tableProperty = null ) {
|
|
15
|
+
|
|
16
|
+
super( enums, classProperty, tableProperty );
|
|
17
|
+
|
|
18
|
+
this.values = tableProperty.values;
|
|
19
|
+
this.valueLength = typeToComponentCount( this.type );
|
|
20
|
+
this.arrayOffsets = getField( tableProperty, 'arrayOffsets', null );
|
|
21
|
+
this.stringOffsets = getField( tableProperty, 'stringOffsets', null );
|
|
22
|
+
this.arrayOffsetType = getField( tableProperty, 'arrayOffsetType', 'UINT32' );
|
|
23
|
+
this.stringOffsetType = getField( tableProperty, 'stringOffsetType', 'UINT32' );
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// returns the necessary array length based on the array offsets if present
|
|
28
|
+
getArrayLengthFromId( buffers, id ) {
|
|
29
|
+
|
|
30
|
+
let count = this.count;
|
|
31
|
+
if ( this.arrayOffsets !== null ) {
|
|
32
|
+
|
|
33
|
+
const { arrayOffsets, arrayOffsetType } = this;
|
|
34
|
+
const bufferCons = getArrayConstructorFromComponentType( arrayOffsetType );
|
|
35
|
+
const arr = new bufferCons( buffers[ arrayOffsets ] );
|
|
36
|
+
count = arr[ id + 1 ] - arr[ id ];
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return count;
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// returns the index offset into the data buffer for the given id based on the
|
|
45
|
+
// the array offsets if present
|
|
46
|
+
getIndexOffsetFromId( buffers, id ) {
|
|
47
|
+
|
|
48
|
+
let indexOffset = id;
|
|
49
|
+
if ( this.arrayOffsets ) {
|
|
50
|
+
|
|
51
|
+
const { arrayOffsets, arrayOffsetType } = this;
|
|
52
|
+
const bufferCons = getArrayConstructorFromComponentType( arrayOffsetType );
|
|
53
|
+
const arr = new bufferCons( buffers[ arrayOffsets ] );
|
|
54
|
+
indexOffset = arr[ indexOffset ];
|
|
55
|
+
|
|
56
|
+
} else if ( this.array ) {
|
|
57
|
+
|
|
58
|
+
// TODO: why do this? Revisit
|
|
59
|
+
indexOffset *= this.count;
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return indexOffset;
|
|
64
|
+
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export class PropertyTableAccessor extends PropertySetAccessor {
|
|
70
|
+
|
|
71
|
+
constructor( ...args ) {
|
|
72
|
+
|
|
73
|
+
super( ...args );
|
|
74
|
+
|
|
75
|
+
this.isPropertyTableAccessor = true;
|
|
76
|
+
this.count = this.definition.count;
|
|
77
|
+
|
|
78
|
+
this._initProperties( PropertyTableClassProperty );
|
|
79
|
+
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
getData( id, target = {} ) {
|
|
83
|
+
|
|
84
|
+
const properties = this.properties;
|
|
85
|
+
initializeFromClass( properties, target );
|
|
86
|
+
|
|
87
|
+
for ( const name in properties ) {
|
|
88
|
+
|
|
89
|
+
target[ name ] = this.getPropertyValue( name, id, target[ name ] );
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return target;
|
|
94
|
+
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// reads an individual element
|
|
98
|
+
_readValueAtIndex( name, id, index, target = null ) {
|
|
99
|
+
|
|
100
|
+
const property = this.properties[ name ];
|
|
101
|
+
const { componentType, type } = property;
|
|
102
|
+
|
|
103
|
+
const buffers = this.data;
|
|
104
|
+
const bufferView = buffers[ property.values ];
|
|
105
|
+
const bufferCons = getArrayConstructorFromComponentType( componentType, type );
|
|
106
|
+
const dataArray = new bufferCons( bufferView );
|
|
107
|
+
|
|
108
|
+
// array offsets contain element offsets, not byte offsets
|
|
109
|
+
const indexOffset = property.getIndexOffsetFromId( buffers, id );
|
|
110
|
+
|
|
111
|
+
if ( isNumericType( type ) || type === 'ENUM' ) {
|
|
112
|
+
|
|
113
|
+
// "readDataFromBufferToType" takes the start offset to read from so we multiply the
|
|
114
|
+
// index by the final value length
|
|
115
|
+
return readDataFromBufferToType( dataArray, ( indexOffset + index ) * property.valueLength, type, target );
|
|
116
|
+
|
|
117
|
+
} else if ( type === 'STRING' ) {
|
|
118
|
+
|
|
119
|
+
// https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata/#variable-length-arrays
|
|
120
|
+
|
|
121
|
+
let stringIndex = indexOffset + index;
|
|
122
|
+
let stringLength = 0;
|
|
123
|
+
if ( property.stringOffsets !== null ) {
|
|
124
|
+
|
|
125
|
+
// get the string lengths and beginning offsets if variable
|
|
126
|
+
const { stringOffsets, stringOffsetType } = property;
|
|
127
|
+
const bufferCons = getArrayConstructorFromComponentType( stringOffsetType );
|
|
128
|
+
const stringOffsetBuffer = new bufferCons( buffers[ stringOffsets ] );
|
|
129
|
+
stringLength = stringOffsetBuffer[ stringIndex + 1 ] - stringOffsetBuffer[ stringIndex ];
|
|
130
|
+
stringIndex = stringOffsetBuffer[ stringIndex ];
|
|
131
|
+
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const byteArray = new Uint8Array( dataArray.buffer, stringIndex, stringLength );
|
|
135
|
+
target = new TextDecoder().decode( byteArray );
|
|
136
|
+
|
|
137
|
+
} else if ( type === 'BOOLEAN' ) {
|
|
138
|
+
|
|
139
|
+
const offset = indexOffset + index;
|
|
140
|
+
const byteIndex = Math.floor( offset / 8 );
|
|
141
|
+
const bitIndex = offset % 8;
|
|
142
|
+
const bitValue = ( dataArray[ byteIndex ] >> bitIndex ) & 1;
|
|
143
|
+
target = bitValue === 1;
|
|
144
|
+
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return target;
|
|
148
|
+
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Reads the data for the given table index
|
|
152
|
+
getPropertyValue( name, id, target = null ) {
|
|
153
|
+
|
|
154
|
+
// check if the requested id is outside of the size of the table
|
|
155
|
+
if ( id >= this.count ) {
|
|
156
|
+
|
|
157
|
+
throw new Error( 'PropertyTableAccessor: Requested index is outside the range of the table.' );
|
|
158
|
+
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// check to see if we skip this field since its not in the table
|
|
162
|
+
const property = this.properties[ name ];
|
|
163
|
+
if ( ! property ) {
|
|
164
|
+
|
|
165
|
+
throw new Error( 'PropertyTableAccessor: Requested property does not exist.' );
|
|
166
|
+
|
|
167
|
+
} else if ( ! this.definition.properties[ name ] ) {
|
|
168
|
+
|
|
169
|
+
return property.resolveDefault( target );
|
|
170
|
+
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// get the dynamic array count from the property buffer
|
|
174
|
+
const array = property.array;
|
|
175
|
+
const buffers = this.data;
|
|
176
|
+
const count = property.getArrayLengthFromId( buffers, id );
|
|
177
|
+
|
|
178
|
+
// initialize the array
|
|
179
|
+
target = property.shapeToProperty( target, count );
|
|
180
|
+
|
|
181
|
+
// read all data
|
|
182
|
+
if ( array ) {
|
|
183
|
+
|
|
184
|
+
for ( let i = 0, l = target.length; i < l; i ++ ) {
|
|
185
|
+
|
|
186
|
+
target[ i ] = this._readValueAtIndex( name, id, i, target[ i ] );
|
|
187
|
+
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
} else {
|
|
191
|
+
|
|
192
|
+
target = this._readValueAtIndex( name, id, 0, target );
|
|
193
|
+
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// scale the numeric values
|
|
197
|
+
target = property.adjustValueScaleOffset( target );
|
|
198
|
+
|
|
199
|
+
// convert to enum strings - no data enum values are stored as strings
|
|
200
|
+
target = property.resolveEnumsToStrings( target );
|
|
201
|
+
|
|
202
|
+
// resolve to default values
|
|
203
|
+
target = property.resolveNoData( target );
|
|
204
|
+
|
|
205
|
+
return target;
|
|
206
|
+
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { Vector2 } from 'three';
|
|
2
|
+
import { PropertySetAccessor } from './PropertySetAccessor.js';
|
|
3
|
+
import { ClassProperty } from './ClassProperty.js';
|
|
4
|
+
import { TextureReadUtility } from '../utilities/TextureReadUtility.js';
|
|
5
|
+
import { getTexCoord, getTexelIndices, getTriangleVertexIndices } from '../utilities/TexCoordUtilities.js';
|
|
6
|
+
import {
|
|
7
|
+
initializeFromClass,
|
|
8
|
+
initializeFromProperty,
|
|
9
|
+
getArrayConstructorFromComponentType,
|
|
10
|
+
readDataFromBufferToType,
|
|
11
|
+
getField
|
|
12
|
+
} from '../utilities/ClassPropertyHelpers.js';
|
|
13
|
+
|
|
14
|
+
const _uv = /* @__PURE__ */ new Vector2();
|
|
15
|
+
const _srcPixel = /* @__PURE__ */ new Vector2();
|
|
16
|
+
const _dstPixel = /* @__PURE__ */ new Vector2();
|
|
17
|
+
|
|
18
|
+
class PropertyTextureClassProperty extends ClassProperty {
|
|
19
|
+
|
|
20
|
+
constructor( enums, classProperty, textureProperty = null ) {
|
|
21
|
+
|
|
22
|
+
super( enums, classProperty, textureProperty );
|
|
23
|
+
|
|
24
|
+
this.channels = getField( textureProperty, 'channels', [ 0 ] );
|
|
25
|
+
this.index = getField( textureProperty, 'index', null );
|
|
26
|
+
this.texCoord = getField( textureProperty, 'texCoord', null );
|
|
27
|
+
this.valueLength = parseInt( this.type.replace( /[^0-9]/g, '' ) ) || 1;
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// takes the buffer to read from and the value index to read
|
|
32
|
+
readDataFromBuffer( buffer, index, target = null ) {
|
|
33
|
+
|
|
34
|
+
const type = this.type;
|
|
35
|
+
if ( type === 'BOOLEAN' || type === 'STRING' ) {
|
|
36
|
+
|
|
37
|
+
throw new Error( 'PropertyTextureAccessor: BOOLEAN and STRING types not supported.' );
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// "readDataFromBufferToType" takes the start offset to read from so we multiply the index by the
|
|
42
|
+
// final value length
|
|
43
|
+
return readDataFromBufferToType( buffer, index * this.valueLength, type, target );
|
|
44
|
+
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Reads and accesses data encoded to textures
|
|
50
|
+
export class PropertyTextureAccessor extends PropertySetAccessor {
|
|
51
|
+
|
|
52
|
+
constructor( ...args ) {
|
|
53
|
+
|
|
54
|
+
super( ...args );
|
|
55
|
+
|
|
56
|
+
this.isPropertyTextureAccessor = true;
|
|
57
|
+
this._asyncRead = false;
|
|
58
|
+
|
|
59
|
+
this._initProperties( PropertyTextureClassProperty );
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Reads the full set of property data
|
|
64
|
+
getData( faceIndex, barycoord, geometry, target = {} ) {
|
|
65
|
+
|
|
66
|
+
const properties = this.properties;
|
|
67
|
+
initializeFromClass( properties, target );
|
|
68
|
+
|
|
69
|
+
const names = Object.keys( properties );
|
|
70
|
+
const results = names.map( n => target[ n ] );
|
|
71
|
+
this.getPropertyValuesAtTexel( names, faceIndex, barycoord, geometry, results );
|
|
72
|
+
|
|
73
|
+
names.forEach( ( n, i ) => target[ n ] = results[ i ] );
|
|
74
|
+
return target;
|
|
75
|
+
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Reads the full set of property data asynchronously
|
|
79
|
+
async getDataAsync( faceIndex, barycoord, geometry, target = {} ) {
|
|
80
|
+
|
|
81
|
+
const properties = this.properties;
|
|
82
|
+
initializeFromClass( properties, target );
|
|
83
|
+
|
|
84
|
+
const names = Object.keys( properties );
|
|
85
|
+
const results = names.map( n => target[ n ] );
|
|
86
|
+
await this.getPropertyValuesAtTexelAsync( names, faceIndex, barycoord, geometry, results );
|
|
87
|
+
|
|
88
|
+
names.forEach( ( n, i ) => target[ n ] = results[ i ] );
|
|
89
|
+
return target;
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Reads values asynchronously
|
|
94
|
+
getPropertyValuesAtTexelAsync( ...args ) {
|
|
95
|
+
|
|
96
|
+
this._asyncRead = true;
|
|
97
|
+
const result = this.getPropertyValuesAtTexel( ...args );
|
|
98
|
+
this._asyncRead = false;
|
|
99
|
+
return result;
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Reads values from the textures synchronously
|
|
104
|
+
getPropertyValuesAtTexel( names, faceIndex, barycoord, geometry, target = [] ) {
|
|
105
|
+
|
|
106
|
+
// resize our targets appropriately
|
|
107
|
+
while ( target.length < names.length ) target.push( null );
|
|
108
|
+
target.length = names.length;
|
|
109
|
+
TextureReadUtility.increaseSizeTo( target.length );
|
|
110
|
+
|
|
111
|
+
// get the attribute indices
|
|
112
|
+
const textures = this.data;
|
|
113
|
+
const accessorProperties = this.definition.properties;
|
|
114
|
+
const properties = this.properties;
|
|
115
|
+
const indices = getTriangleVertexIndices( geometry, faceIndex );
|
|
116
|
+
for ( let i = 0, l = names.length; i < l; i ++ ) {
|
|
117
|
+
|
|
118
|
+
// skip any requested class schema properties that are not provided via the accessor
|
|
119
|
+
const name = names[ i ];
|
|
120
|
+
if ( ! accessorProperties[ name ] ) {
|
|
121
|
+
|
|
122
|
+
continue;
|
|
123
|
+
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// get the attribute of the target tex coord
|
|
127
|
+
const property = properties[ name ];
|
|
128
|
+
const texture = textures[ property.index ];
|
|
129
|
+
getTexCoord( geometry, property.texCoord, barycoord, indices, _uv );
|
|
130
|
+
getTexelIndices( _uv, texture.image.width, texture.image.height, _srcPixel );
|
|
131
|
+
_dstPixel.set( i, 0 );
|
|
132
|
+
|
|
133
|
+
TextureReadUtility.renderPixelToTarget( texture, _srcPixel, _dstPixel );
|
|
134
|
+
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// read the data
|
|
138
|
+
const buffer = new Uint8Array( names.length * 4 );
|
|
139
|
+
if ( this._asyncRead ) {
|
|
140
|
+
|
|
141
|
+
return TextureReadUtility
|
|
142
|
+
.readDataAsync( buffer )
|
|
143
|
+
.then( () => {
|
|
144
|
+
|
|
145
|
+
readTextureSampleResults.call( this );
|
|
146
|
+
return target;
|
|
147
|
+
|
|
148
|
+
} );
|
|
149
|
+
|
|
150
|
+
} else {
|
|
151
|
+
|
|
152
|
+
TextureReadUtility.readData( buffer );
|
|
153
|
+
readTextureSampleResults.call( this );
|
|
154
|
+
|
|
155
|
+
return target;
|
|
156
|
+
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function readTextureSampleResults() {
|
|
160
|
+
|
|
161
|
+
for ( let i = 0, l = names.length; i < l; i ++ ) {
|
|
162
|
+
|
|
163
|
+
const name = names[ i ];
|
|
164
|
+
const property = properties[ name ];
|
|
165
|
+
const type = property.type;
|
|
166
|
+
|
|
167
|
+
// initialize the output value
|
|
168
|
+
target[ i ] = initializeFromProperty( property, target[ i ] );
|
|
169
|
+
|
|
170
|
+
// use a default of the texture accessor definition does not include the value
|
|
171
|
+
if ( ! property ) {
|
|
172
|
+
|
|
173
|
+
throw new Error( 'PropertyTextureAccessor: Requested property does not exist.' );
|
|
174
|
+
|
|
175
|
+
} else if ( ! accessorProperties[ name ] ) {
|
|
176
|
+
|
|
177
|
+
target[ i ] = property.resolveDefault( target );
|
|
178
|
+
continue;
|
|
179
|
+
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// get the final array length to read all data based on used buffer data
|
|
183
|
+
const length = property.valueLength * ( property.count || 1 );
|
|
184
|
+
|
|
185
|
+
// set the data read back from the texture to the target type
|
|
186
|
+
const data = property.channels.map( c => buffer[ 4 * i + c ] );
|
|
187
|
+
const componentType = property.componentType;
|
|
188
|
+
const BufferCons = getArrayConstructorFromComponentType( componentType, type );
|
|
189
|
+
const readBuffer = new BufferCons( length );
|
|
190
|
+
new Uint8Array( readBuffer.buffer ).set( data );
|
|
191
|
+
|
|
192
|
+
// read all the data
|
|
193
|
+
if ( property.array ) {
|
|
194
|
+
|
|
195
|
+
const arr = target[ i ];
|
|
196
|
+
for ( let j = 0, lj = arr.length; j < lj; j ++ ) {
|
|
197
|
+
|
|
198
|
+
arr[ j ] = property.readDataFromBuffer( readBuffer, j, arr[ j ] );
|
|
199
|
+
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
} else {
|
|
203
|
+
|
|
204
|
+
target[ i ] = property.readDataFromBuffer( readBuffer, 0, target[ i ] );
|
|
205
|
+
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// scale the numeric values
|
|
209
|
+
target[ i ] = property.adjustValueScaleOffset( target[ i ] );
|
|
210
|
+
|
|
211
|
+
// convert to enum strings - no data enum values are stored as strings
|
|
212
|
+
target[ i ] = property.resolveEnumsToStrings( target[ i ] );
|
|
213
|
+
|
|
214
|
+
// resolve to default values
|
|
215
|
+
target[ i ] = property.resolveNoData( target[ i ] );
|
|
216
|
+
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// dispose all of the texture data used
|
|
224
|
+
dispose() {
|
|
225
|
+
|
|
226
|
+
this.data.forEach( texture => {
|
|
227
|
+
|
|
228
|
+
if ( texture ) {
|
|
229
|
+
|
|
230
|
+
texture.dispose();
|
|
231
|
+
|
|
232
|
+
if ( texture.image instanceof ImageBitmap ) {
|
|
233
|
+
|
|
234
|
+
texture.image.close();
|
|
235
|
+
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
} );
|
|
241
|
+
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { PropertyAttributeAccessor } from './PropertyAttributeAccessor.js';
|
|
2
|
+
import { PropertyTableAccessor } from './PropertyTableAccessor.js';
|
|
3
|
+
import { PropertyTextureAccessor } from './PropertyTextureAccessor.js';
|
|
4
|
+
|
|
5
|
+
export class StructuralMetadata {
|
|
6
|
+
|
|
7
|
+
constructor( definition, textures, buffers, nodeMetadata = null, object = null ) {
|
|
8
|
+
|
|
9
|
+
const {
|
|
10
|
+
schema,
|
|
11
|
+
propertyTables = [],
|
|
12
|
+
propertyTextures = [],
|
|
13
|
+
propertyAttributes = [],
|
|
14
|
+
} = definition;
|
|
15
|
+
|
|
16
|
+
const { enums, classes } = schema;
|
|
17
|
+
const tableAccessors = propertyTables.map( t => new PropertyTableAccessor( t, classes, enums, buffers ) );
|
|
18
|
+
let textureAccessors = [];
|
|
19
|
+
let attributeAccessors = [];
|
|
20
|
+
|
|
21
|
+
if ( nodeMetadata ) {
|
|
22
|
+
|
|
23
|
+
if ( nodeMetadata.propertyTextures ) {
|
|
24
|
+
|
|
25
|
+
textureAccessors = nodeMetadata.propertyTextures.map( i => new PropertyTextureAccessor( propertyTextures[ i ], classes, enums, textures ) );
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if ( nodeMetadata.propertyAttributes ) {
|
|
30
|
+
|
|
31
|
+
attributeAccessors = nodeMetadata.propertyAttributes.map( i => new PropertyAttributeAccessor( propertyAttributes[ i ], classes, enums ) );
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
this.schema = schema;
|
|
38
|
+
this.tableAccessors = tableAccessors;
|
|
39
|
+
this.textureAccessors = textureAccessors;
|
|
40
|
+
this.attributeAccessors = attributeAccessors;
|
|
41
|
+
this.object = object;
|
|
42
|
+
this.textures = textures;
|
|
43
|
+
this.nodeMetadata = nodeMetadata;
|
|
44
|
+
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Property Tables
|
|
48
|
+
getPropertyTableData( tableIndices, ids, target = null ) {
|
|
49
|
+
|
|
50
|
+
if ( ! Array.isArray( tableIndices ) || ! Array.isArray( ids ) ) {
|
|
51
|
+
|
|
52
|
+
// only return a single tables data
|
|
53
|
+
target = target || {};
|
|
54
|
+
|
|
55
|
+
const table = this.tableAccessors[ tableIndices ];
|
|
56
|
+
target = table.getData( ids, target );
|
|
57
|
+
|
|
58
|
+
} else {
|
|
59
|
+
|
|
60
|
+
// return data from an array of tables and ids
|
|
61
|
+
target = target || [];
|
|
62
|
+
|
|
63
|
+
const length = Math.min( tableIndices.length, ids.length );
|
|
64
|
+
target.length = length;
|
|
65
|
+
|
|
66
|
+
for ( let i = 0; i < length; i ++ ) {
|
|
67
|
+
|
|
68
|
+
const table = this.tableAccessors[ tableIndices[ i ] ];
|
|
69
|
+
target[ i ] = table.getData( ids[ i ], target[ i ] );
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return target;
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
getPropertyTableInfo( tableIndices = null ) {
|
|
80
|
+
|
|
81
|
+
// default to all table information
|
|
82
|
+
if ( tableIndices === null ) {
|
|
83
|
+
|
|
84
|
+
tableIndices = this.tableAccessors.map( ( t, i ) => i );
|
|
85
|
+
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if ( Array.isArray( tableIndices ) ) {
|
|
89
|
+
|
|
90
|
+
// return all table information from the requested list
|
|
91
|
+
return tableIndices.map( i => {
|
|
92
|
+
|
|
93
|
+
const table = this.tableAccessors[ i ];
|
|
94
|
+
return {
|
|
95
|
+
name: table.name,
|
|
96
|
+
className: table.definition.class,
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
} );
|
|
100
|
+
|
|
101
|
+
} else {
|
|
102
|
+
|
|
103
|
+
// return the one piece of table information
|
|
104
|
+
const table = this.tableAccessors[ tableIndices ];
|
|
105
|
+
return {
|
|
106
|
+
name: table.name,
|
|
107
|
+
className: table.definition.class,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Property Textures
|
|
115
|
+
getPropertyTextureData( triangle, barycoord, target = [] ) {
|
|
116
|
+
|
|
117
|
+
const textureAccessors = this.textureAccessors;
|
|
118
|
+
target.length = textureAccessors.length;
|
|
119
|
+
|
|
120
|
+
for ( let i = 0; i < textureAccessors.length; i ++ ) {
|
|
121
|
+
|
|
122
|
+
const accessor = textureAccessors[ i ];
|
|
123
|
+
target[ i ] = accessor.getData( triangle, barycoord, this.object.geometry, target[ i ] );
|
|
124
|
+
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return target;
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async getPropertyTextureDataAsync( triangle, barycoord, target = [] ) {
|
|
132
|
+
|
|
133
|
+
const textureAccessors = this.textureAccessors;
|
|
134
|
+
target.length = textureAccessors.length;
|
|
135
|
+
|
|
136
|
+
const promises = [];
|
|
137
|
+
for ( let i = 0; i < textureAccessors.length; i ++ ) {
|
|
138
|
+
|
|
139
|
+
const accessor = textureAccessors[ i ];
|
|
140
|
+
const promise = accessor
|
|
141
|
+
.getDataAsync( triangle, barycoord, this.object.geometry, target[ i ] )
|
|
142
|
+
.then( result => {
|
|
143
|
+
|
|
144
|
+
target[ i ] = result;
|
|
145
|
+
|
|
146
|
+
} );
|
|
147
|
+
|
|
148
|
+
promises.push( promise );
|
|
149
|
+
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
await Promise.all( promises );
|
|
153
|
+
|
|
154
|
+
return target;
|
|
155
|
+
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
getPropertyTextureInfo() {
|
|
159
|
+
|
|
160
|
+
return this.textureAccessors;
|
|
161
|
+
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Property Attributes
|
|
165
|
+
getPropertyAttributeData( attributeIndex, target = [] ) {
|
|
166
|
+
|
|
167
|
+
const attributeAccessors = this.attributeAccessors;
|
|
168
|
+
target.length = attributeAccessors.length;
|
|
169
|
+
|
|
170
|
+
for ( let i = 0; i < attributeAccessors.length; i ++ ) {
|
|
171
|
+
|
|
172
|
+
const accessor = attributeAccessors[ i ];
|
|
173
|
+
target[ i ] = accessor.getData( attributeIndex, this.object.geometry, target[ i ] );
|
|
174
|
+
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return target;
|
|
178
|
+
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
getPropertyAttributeInfo() {
|
|
182
|
+
|
|
183
|
+
return this.attributeAccessors.map( acc => {
|
|
184
|
+
|
|
185
|
+
return {
|
|
186
|
+
name: acc.name,
|
|
187
|
+
className: acc.definition.class,
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
} );
|
|
191
|
+
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
dispose() {
|
|
195
|
+
|
|
196
|
+
this.textureAccessors.forEach( acc => acc.dispose() );
|
|
197
|
+
this.tableAccessors.forEach( acc => acc.dispose() );
|
|
198
|
+
this.attributeAccessors.forEach( acc => acc.dispose() );
|
|
199
|
+
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Matrix2 definition since it doesn't exist in three.js
|
|
2
|
+
export class Matrix2 {
|
|
3
|
+
|
|
4
|
+
constructor( n11, n12, n21, n22 ) {
|
|
5
|
+
|
|
6
|
+
Matrix2.prototype.isMatrix2 = true;
|
|
7
|
+
|
|
8
|
+
this.elements = [
|
|
9
|
+
1, 0,
|
|
10
|
+
0, 1,
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
if ( n11 !== undefined ) {
|
|
14
|
+
|
|
15
|
+
this.set( n11, n12, n21, n22 );
|
|
16
|
+
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
identity() {
|
|
22
|
+
|
|
23
|
+
this.set(
|
|
24
|
+
1, 0,
|
|
25
|
+
0, 1,
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
return this;
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
fromArray( array, offset = 0 ) {
|
|
33
|
+
|
|
34
|
+
for ( let i = 0; i < 4; i ++ ) {
|
|
35
|
+
|
|
36
|
+
this.elements[ i ] = array[ i + offset ];
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return this;
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
set( n11, n12, n21, n22 ) {
|
|
45
|
+
|
|
46
|
+
const te = this.elements;
|
|
47
|
+
|
|
48
|
+
te[ 0 ] = n11; te[ 1 ] = n21;
|
|
49
|
+
te[ 2 ] = n12; te[ 3 ] = n22;
|
|
50
|
+
|
|
51
|
+
return this;
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
}
|