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.
Files changed (166) hide show
  1. package/package.json +12 -0
  2. package/src/common/index.ts +24 -0
  3. package/src/common/useLine2.ts +87 -0
  4. package/src/common/useLoader.ts +184 -0
  5. package/src/common/useLocationCalculator.ts +145 -0
  6. package/src/common/useMark.ts +42 -0
  7. package/src/common/useTween.ts +86 -0
  8. package/src/core/basic/camera.ts +28 -0
  9. package/src/core/basic/clock.ts +11 -0
  10. package/src/core/basic/control.ts +32 -0
  11. package/src/core/basic/index.ts +35 -0
  12. package/src/core/basic/labelRenderer.ts +26 -0
  13. package/src/core/basic/light.ts +63 -0
  14. package/src/core/basic/renderer.ts +37 -0
  15. package/src/core/basic/scene.ts +11 -0
  16. package/src/core/basic/stats.ts +16 -0
  17. package/src/core/event.ts +74 -0
  18. package/src/core/index.ts +11 -0
  19. package/src/core/main.ts +389 -0
  20. package/src/draco/README.md +32 -0
  21. package/src/draco/draco_decoder.js +34 -0
  22. package/src/draco/draco_decoder.wasm +0 -0
  23. package/src/draco/draco_encoder.js +33 -0
  24. package/src/draco/draco_wasm_wrapper.js +117 -0
  25. package/src/draco/gltf/draco_decoder.js +33 -0
  26. package/src/draco/gltf/draco_decoder.wasm +0 -0
  27. package/src/draco/gltf/draco_encoder.js +33 -0
  28. package/src/draco/gltf/draco_wasm_wrapper.js +116 -0
  29. package/src/tileRenderer/base/Tile.d.ts +50 -0
  30. package/src/tileRenderer/base/TileBase.d.ts +76 -0
  31. package/src/tileRenderer/base/TileInternal.d.ts +36 -0
  32. package/src/tileRenderer/base/TilesRendererBase.d.ts +35 -0
  33. package/src/tileRenderer/base/TilesRendererBase.js +847 -0
  34. package/src/tileRenderer/base/Tileset.d.ts +66 -0
  35. package/src/tileRenderer/base/constants.d.ts +6 -0
  36. package/src/tileRenderer/base/constants.js +16 -0
  37. package/src/tileRenderer/base/loaders/B3DMLoaderBase.d.ts +18 -0
  38. package/src/tileRenderer/base/loaders/B3DMLoaderBase.js +85 -0
  39. package/src/tileRenderer/base/loaders/CMPTLoaderBase.d.ts +22 -0
  40. package/src/tileRenderer/base/loaders/CMPTLoaderBase.js +61 -0
  41. package/src/tileRenderer/base/loaders/I3DMLoaderBase.d.ts +21 -0
  42. package/src/tileRenderer/base/loaders/I3DMLoaderBase.js +130 -0
  43. package/src/tileRenderer/base/loaders/LoaderBase.d.ts +10 -0
  44. package/src/tileRenderer/base/loaders/LoaderBase.js +73 -0
  45. package/src/tileRenderer/base/loaders/PNTSLoaderBase.d.ts +17 -0
  46. package/src/tileRenderer/base/loaders/PNTSLoaderBase.js +82 -0
  47. package/src/tileRenderer/base/plugins/ImplicitTilingPlugin.js +12 -0
  48. package/src/tileRenderer/base/traverseFunctions.js +468 -0
  49. package/src/tileRenderer/gltf.js +144 -0
  50. package/src/tileRenderer/index.d.ts +41 -0
  51. package/src/tileRenderer/index.js +44 -0
  52. package/src/tileRenderer/plugins/README.md +578 -0
  53. package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.d.ts +2 -0
  54. package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.js +84 -0
  55. package/src/tileRenderer/plugins/base/SUBTREELoader.js +876 -0
  56. package/src/tileRenderer/plugins/index.d.ts +17 -0
  57. package/src/tileRenderer/plugins/index.js +17 -0
  58. package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.d.ts +9 -0
  59. package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.js +175 -0
  60. package/src/tileRenderer/plugins/three/DebugTilesPlugin.d.ts +29 -0
  61. package/src/tileRenderer/plugins/three/DebugTilesPlugin.js +677 -0
  62. package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.d.ts +18 -0
  63. package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.js +86 -0
  64. package/src/tileRenderer/plugins/three/GoogleAttributionsManager.js +62 -0
  65. package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.d.ts +5 -0
  66. package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.js +200 -0
  67. package/src/tileRenderer/plugins/three/ReorientationPlugin.d.ts +12 -0
  68. package/src/tileRenderer/plugins/three/ReorientationPlugin.js +136 -0
  69. package/src/tileRenderer/plugins/three/TileCompressionPlugin.d.ts +18 -0
  70. package/src/tileRenderer/plugins/three/TileCompressionPlugin.js +223 -0
  71. package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.d.ts +5 -0
  72. package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.js +87 -0
  73. package/src/tileRenderer/plugins/three/fade/FadeManager.js +370 -0
  74. package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.d.ts +9 -0
  75. package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.js +318 -0
  76. package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.d.ts +5 -0
  77. package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.js +27 -0
  78. package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.d.ts +30 -0
  79. package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.js +76 -0
  80. package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.d.ts +49 -0
  81. package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.js +147 -0
  82. package/src/tileRenderer/plugins/three/gltf/metadata/classes/ClassProperty.js +149 -0
  83. package/src/tileRenderer/plugins/three/gltf/metadata/classes/MeshFeatures.js +215 -0
  84. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyAttributeAccessor.js +107 -0
  85. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertySetAccessor.js +45 -0
  86. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTableAccessor.js +209 -0
  87. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTextureAccessor.js +244 -0
  88. package/src/tileRenderer/plugins/three/gltf/metadata/classes/StructuralMetadata.js +202 -0
  89. package/src/tileRenderer/plugins/three/gltf/metadata/math/Matrix2.js +55 -0
  90. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/ClassPropertyHelpers.js +495 -0
  91. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TexCoordUtilities.js +72 -0
  92. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TextureReadUtility.js +154 -0
  93. package/src/tileRenderer/plugins/three/objects/EllipsoidRegionHelper.js +186 -0
  94. package/src/tileRenderer/plugins/three/objects/SphereHelper.js +55 -0
  95. package/src/tileRenderer/r3f/README.md +238 -0
  96. package/src/tileRenderer/r3f/components/CameraControls.jsx +132 -0
  97. package/src/tileRenderer/r3f/components/CameraTransition.jsx +177 -0
  98. package/src/tileRenderer/r3f/components/CanvasDOMOverlay.jsx +54 -0
  99. package/src/tileRenderer/r3f/components/CompassGizmo.jsx +260 -0
  100. package/src/tileRenderer/r3f/components/TilesAttributionOverlay.jsx +110 -0
  101. package/src/tileRenderer/r3f/components/TilesRenderer.jsx +239 -0
  102. package/src/tileRenderer/r3f/index.jsx +6 -0
  103. package/src/tileRenderer/r3f/utilities/useForceUpdate.jsx +8 -0
  104. package/src/tileRenderer/r3f/utilities/useObjectDep.jsx +59 -0
  105. package/src/tileRenderer/r3f/utilities/useOptions.jsx +143 -0
  106. package/src/tileRenderer/three/DebugTilesRenderer.d.ts +28 -0
  107. package/src/tileRenderer/three/DebugTilesRenderer.js +58 -0
  108. package/src/tileRenderer/three/TilesGroup.d.ts +9 -0
  109. package/src/tileRenderer/three/TilesGroup.js +91 -0
  110. package/src/tileRenderer/three/TilesRenderer.d.ts +37 -0
  111. package/src/tileRenderer/three/TilesRenderer.js +1049 -0
  112. package/src/tileRenderer/three/controls/CameraTransitionManager.js +305 -0
  113. package/src/tileRenderer/three/controls/EnvironmentControls.js +1295 -0
  114. package/src/tileRenderer/three/controls/GlobeControls.js +684 -0
  115. package/src/tileRenderer/three/controls/PivotPointMesh.js +104 -0
  116. package/src/tileRenderer/three/controls/PointerTracker.js +257 -0
  117. package/src/tileRenderer/three/controls/utils.js +113 -0
  118. package/src/tileRenderer/three/loaders/B3DMLoader.d.ts +26 -0
  119. package/src/tileRenderer/three/loaders/B3DMLoader.js +85 -0
  120. package/src/tileRenderer/three/loaders/CMPTLoader.d.ts +19 -0
  121. package/src/tileRenderer/three/loaders/CMPTLoader.js +97 -0
  122. package/src/tileRenderer/three/loaders/GLTFExtensionLoader.d.ts +11 -0
  123. package/src/tileRenderer/three/loaders/GLTFExtensionLoader.js +68 -0
  124. package/src/tileRenderer/three/loaders/I3DMLoader.d.ts +26 -0
  125. package/src/tileRenderer/three/loaders/I3DMLoader.js +256 -0
  126. package/src/tileRenderer/three/loaders/PNTSLoader.d.ts +25 -0
  127. package/src/tileRenderer/three/loaders/PNTSLoader.js +202 -0
  128. package/src/tileRenderer/three/loaders/gltf/GLTFCesiumRTCExtension.js +12 -0
  129. package/src/tileRenderer/three/loaders/gltf/GLTFMeshFeaturesExtension.js +12 -0
  130. package/src/tileRenderer/three/loaders/gltf/GLTFStructuralMetadataExtension.js +12 -0
  131. package/src/tileRenderer/three/math/Ellipsoid.d.ts +31 -0
  132. package/src/tileRenderer/three/math/Ellipsoid.js +337 -0
  133. package/src/tileRenderer/three/math/EllipsoidRegion.d.ts +23 -0
  134. package/src/tileRenderer/three/math/EllipsoidRegion.js +178 -0
  135. package/src/tileRenderer/three/math/ExtendedFrustum.js +65 -0
  136. package/src/tileRenderer/three/math/GeoConstants.d.ts +4 -0
  137. package/src/tileRenderer/three/math/GeoConstants.js +5 -0
  138. package/src/tileRenderer/three/math/GeoUtils.d.ts +9 -0
  139. package/src/tileRenderer/three/math/GeoUtils.js +106 -0
  140. package/src/tileRenderer/three/math/OBB.js +179 -0
  141. package/src/tileRenderer/three/math/TileBoundingVolume.js +272 -0
  142. package/src/tileRenderer/three/plugins/CesiumIonAuthPlugin.js +12 -0
  143. package/src/tileRenderer/three/plugins/DebugTilesPlugin.js +26 -0
  144. package/src/tileRenderer/three/plugins/GoogleCloudAuthPlugin.js +12 -0
  145. package/src/tileRenderer/three/raycastTraverse.js +178 -0
  146. package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.d.ts +14 -0
  147. package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.js +21 -0
  148. package/src/tileRenderer/three/renderers/GoogleTilesRenderer.d.ts +43 -0
  149. package/src/tileRenderer/three/renderers/GoogleTilesRenderer.js +48 -0
  150. package/src/tileRenderer/three/utilities.js +54 -0
  151. package/src/tileRenderer/utilities/BatchTable.d.ts +24 -0
  152. package/src/tileRenderer/utilities/BatchTable.js +82 -0
  153. package/src/tileRenderer/utilities/BatchTableHierarchyExtension.js +127 -0
  154. package/src/tileRenderer/utilities/FeatureTable.d.ts +30 -0
  155. package/src/tileRenderer/utilities/FeatureTable.js +159 -0
  156. package/src/tileRenderer/utilities/LRUCache.d.ts +8 -0
  157. package/src/tileRenderer/utilities/LRUCache.js +385 -0
  158. package/src/tileRenderer/utilities/PriorityQueue.d.ts +16 -0
  159. package/src/tileRenderer/utilities/PriorityQueue.js +137 -0
  160. package/src/tileRenderer/utilities/arrayToString.js +7 -0
  161. package/src/tileRenderer/utilities/readMagicBytes.js +29 -0
  162. package/src/tileRenderer/utilities/rgb565torgb.js +22 -0
  163. package/src/tileRenderer/utilities/urlExtension.js +34 -0
  164. package/tsconfig.json +42 -0
  165. package/tsconfig.node.json +11 -0
  166. 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
+ }