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,495 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Vector2,
|
|
3
|
+
Vector3,
|
|
4
|
+
Vector4,
|
|
5
|
+
Matrix3,
|
|
6
|
+
Matrix4,
|
|
7
|
+
} from 'three';
|
|
8
|
+
import { Matrix2 } from '../math/Matrix2.js';
|
|
9
|
+
|
|
10
|
+
// returns the field in the object with a resolved default
|
|
11
|
+
export function getField( object, key, def ) {
|
|
12
|
+
|
|
13
|
+
return object && key in object ? object[ key ] : def;
|
|
14
|
+
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// checks the structural metadata type
|
|
18
|
+
export function isNumericType( type ) {
|
|
19
|
+
|
|
20
|
+
return type !== 'BOOLEAN' && type !== 'STRING' && type !== 'ENUM';
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// check if the class property type is a float component type value
|
|
25
|
+
export function isFloatComponentType( type ) {
|
|
26
|
+
|
|
27
|
+
return /^FLOAT/.test( type );
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// check if the class property type is a vector type
|
|
32
|
+
export function isVectorType( type ) {
|
|
33
|
+
|
|
34
|
+
return /^VEC/.test( type );
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// check if the class property type is a matrix type
|
|
39
|
+
export function isMatrixType( type ) {
|
|
40
|
+
|
|
41
|
+
return /^MATRIX/.test( type );
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// returns a value from the given buffer of the given type
|
|
46
|
+
export function readDataFromBufferToType( buffer, offset, type, target = null ) {
|
|
47
|
+
|
|
48
|
+
if ( isMatrixType( type ) ) {
|
|
49
|
+
|
|
50
|
+
return target.fromArray( buffer, offset );
|
|
51
|
+
|
|
52
|
+
} else if ( isVectorType( type ) ) {
|
|
53
|
+
|
|
54
|
+
return target.fromArray( buffer, offset );
|
|
55
|
+
|
|
56
|
+
} else {
|
|
57
|
+
|
|
58
|
+
return buffer[ offset ];
|
|
59
|
+
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// gets a new instance of the given structural metadata type
|
|
65
|
+
export function getTypeInstance( property ) {
|
|
66
|
+
|
|
67
|
+
const { type, componentType } = property;
|
|
68
|
+
switch ( type ) {
|
|
69
|
+
|
|
70
|
+
case 'SCALAR': return componentType === 'INT64' ? 0n : 0;
|
|
71
|
+
case 'VEC2': return new Vector2();
|
|
72
|
+
case 'VEC3': return new Vector3();
|
|
73
|
+
case 'VEC4': return new Vector4();
|
|
74
|
+
case 'MAT2': return new Matrix2();
|
|
75
|
+
case 'MAT3': return new Matrix3();
|
|
76
|
+
case 'MAT4': return new Matrix4();
|
|
77
|
+
case 'BOOLEAN': return false;
|
|
78
|
+
case 'STRING': return '';
|
|
79
|
+
|
|
80
|
+
// the final value for enums is a string but are represented as integers
|
|
81
|
+
// during intermediate steps
|
|
82
|
+
case 'ENUM': return 0;
|
|
83
|
+
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// returns false if the given value is not of "type"
|
|
89
|
+
export function isTypeInstance( type, value ) {
|
|
90
|
+
|
|
91
|
+
if ( value === null || value === undefined ) {
|
|
92
|
+
|
|
93
|
+
return false;
|
|
94
|
+
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
switch ( type ) {
|
|
98
|
+
|
|
99
|
+
case 'SCALAR': return typeof value === 'number' || typeof value === 'bigint';
|
|
100
|
+
case 'VEC2': return value.isVector2;
|
|
101
|
+
case 'VEC3': return value.isVector3;
|
|
102
|
+
case 'VEC4': return value.isVector4;
|
|
103
|
+
case 'MAT2': return value.isMatrix2;
|
|
104
|
+
case 'MAT3': return value.isMatrix3;
|
|
105
|
+
case 'MAT4': return value.isMatrix4;
|
|
106
|
+
case 'BOOLEAN': return typeof value === 'boolean';
|
|
107
|
+
case 'STRING': return typeof value === 'string';
|
|
108
|
+
case 'ENUM': return typeof value === 'number' || typeof value === 'bigint';
|
|
109
|
+
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
throw new Error( 'ClassProperty: invalid type.' );
|
|
113
|
+
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// gets a new numeric array constructor from the given structural metadata type
|
|
117
|
+
export function getArrayConstructorFromComponentType( componentType, type = null ) {
|
|
118
|
+
|
|
119
|
+
switch ( componentType ) {
|
|
120
|
+
|
|
121
|
+
case 'INT8': return Int8Array;
|
|
122
|
+
case 'INT16': return Int16Array;
|
|
123
|
+
case 'INT32': return Int32Array;
|
|
124
|
+
case 'INT64': return BigInt64Array;
|
|
125
|
+
|
|
126
|
+
case 'UINT8': return Uint8Array;
|
|
127
|
+
case 'UINT16': return Uint16Array;
|
|
128
|
+
case 'UINT32': return Uint32Array;
|
|
129
|
+
case 'UINT64': return BigUint64Array;
|
|
130
|
+
|
|
131
|
+
case 'FLOAT32': return Float32Array;
|
|
132
|
+
case 'FLOAT64': return Float64Array;
|
|
133
|
+
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
switch ( type ) {
|
|
137
|
+
|
|
138
|
+
case 'BOOLEAN': return Uint8Array;
|
|
139
|
+
case 'STRING': return Uint8Array;
|
|
140
|
+
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
throw new Error( 'ClassProperty: invalid type.' );
|
|
144
|
+
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// resolve a full default value for the given property including arrays
|
|
148
|
+
export function resolveDefault( property, target = null ) {
|
|
149
|
+
|
|
150
|
+
const array = property.array;
|
|
151
|
+
if ( array ) {
|
|
152
|
+
|
|
153
|
+
target = target && Array.isArray( target ) ? target : [];
|
|
154
|
+
target.length = property.count;
|
|
155
|
+
for ( let i = 0, l = target.length; i < l; i ++ ) {
|
|
156
|
+
|
|
157
|
+
target[ i ] = resolveDefaultElement( property, target[ i ] );
|
|
158
|
+
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
} else {
|
|
162
|
+
|
|
163
|
+
target = resolveDefaultElement( property, target );
|
|
164
|
+
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return target;
|
|
168
|
+
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// gets the default value of the given type
|
|
172
|
+
export function resolveDefaultElement( property, target = null ) {
|
|
173
|
+
|
|
174
|
+
const defaultValue = property.default;
|
|
175
|
+
const type = property.type;
|
|
176
|
+
|
|
177
|
+
target = target || getTypeInstance( property );
|
|
178
|
+
|
|
179
|
+
if ( defaultValue === null ) {
|
|
180
|
+
|
|
181
|
+
switch ( type ) {
|
|
182
|
+
|
|
183
|
+
case 'SCALAR': return 0;
|
|
184
|
+
case 'VEC2': return target.set( 0, 0 );
|
|
185
|
+
case 'VEC3': return target.set( 0, 0, 0 );
|
|
186
|
+
case 'VEC4': return target.set( 0, 0, 0, 0 );
|
|
187
|
+
case 'MAT2': return target.identity();
|
|
188
|
+
case 'MAT3': return target.identity();
|
|
189
|
+
case 'MAT4': return target.identity();
|
|
190
|
+
case 'BOOLEAN': return false;
|
|
191
|
+
case 'STRING': return '';
|
|
192
|
+
case 'ENUM': return '';
|
|
193
|
+
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
throw new Error( 'ClassProperty: invalid type.' );
|
|
197
|
+
|
|
198
|
+
} else {
|
|
199
|
+
|
|
200
|
+
if ( isMatrixType( type ) ) {
|
|
201
|
+
|
|
202
|
+
target.fromArray( defaultValue );
|
|
203
|
+
|
|
204
|
+
} else if ( isVectorType( type ) ) {
|
|
205
|
+
|
|
206
|
+
target.fromArray( defaultValue );
|
|
207
|
+
|
|
208
|
+
} else {
|
|
209
|
+
|
|
210
|
+
return defaultValue;
|
|
211
|
+
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// check for of instances of "no data" in the given target value and adjust them to the
|
|
219
|
+
// default value.
|
|
220
|
+
export function resolveNoData( property, target ) {
|
|
221
|
+
|
|
222
|
+
if ( property.noData === null ) {
|
|
223
|
+
|
|
224
|
+
return target;
|
|
225
|
+
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const noData = property.noData;
|
|
229
|
+
const type = property.type;
|
|
230
|
+
if ( Array.isArray( target ) ) {
|
|
231
|
+
|
|
232
|
+
for ( let i = 0, l = target.length; i < l; i ++ ) {
|
|
233
|
+
|
|
234
|
+
target[ i ] = performResolution( target[ i ] );
|
|
235
|
+
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
} else {
|
|
239
|
+
|
|
240
|
+
target = performResolution( target );
|
|
241
|
+
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return target;
|
|
245
|
+
|
|
246
|
+
// replace the value with a default if no data is encountered
|
|
247
|
+
function performResolution( target ) {
|
|
248
|
+
|
|
249
|
+
if ( isNoDataEqual( target ) ) {
|
|
250
|
+
|
|
251
|
+
target = resolveDefaultElement( property, target );
|
|
252
|
+
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return target;
|
|
256
|
+
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// checks if the given value is equal to the no data value
|
|
260
|
+
function isNoDataEqual( value ) {
|
|
261
|
+
|
|
262
|
+
if ( isMatrixType( type ) ) {
|
|
263
|
+
|
|
264
|
+
const elements = value.elements;
|
|
265
|
+
for ( let i = 0, l = noData.length; i < l; i ++ ) {
|
|
266
|
+
|
|
267
|
+
if ( noData[ i ] !== elements[ i ] ) {
|
|
268
|
+
|
|
269
|
+
return false;
|
|
270
|
+
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return true;
|
|
276
|
+
|
|
277
|
+
} else if ( isVectorType( type ) ) {
|
|
278
|
+
|
|
279
|
+
for ( let i = 0, l = noData.length; i < l; i ++ ) {
|
|
280
|
+
|
|
281
|
+
if ( noData[ i ] !== value.getComponent( i ) ) {
|
|
282
|
+
|
|
283
|
+
return false;
|
|
284
|
+
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return true;
|
|
290
|
+
|
|
291
|
+
} else {
|
|
292
|
+
|
|
293
|
+
return noData === value;
|
|
294
|
+
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export function normalizeValue( componentType, v ) {
|
|
302
|
+
|
|
303
|
+
// formulas defined here but normalizing 64 bit ints will result in precision loss:
|
|
304
|
+
// https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata/#normalized-values
|
|
305
|
+
switch ( componentType ) {
|
|
306
|
+
|
|
307
|
+
case 'INT8': return Math.max( v / 127.0, - 1.0 );
|
|
308
|
+
case 'INT16': return Math.max( v, 32767.0, - 1.0 );
|
|
309
|
+
case 'INT32': return Math.max( v / 2147483647.0, - 1.0 );
|
|
310
|
+
case 'INT64': return Math.max( Number( v ) / 9223372036854775807.0, - 1.0 ); // eslint-disable-line no-loss-of-precision
|
|
311
|
+
|
|
312
|
+
case 'UINT8': return v / 255.0;
|
|
313
|
+
case 'UINT16': return v / 65535.0;
|
|
314
|
+
case 'UINT32': return v / 4294967295.0;
|
|
315
|
+
case 'UINT64': return Number( v ) / 18446744073709551615.0; // eslint-disable-line no-loss-of-precision
|
|
316
|
+
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// scales the value based on property settings
|
|
322
|
+
// the provided target value is normalized, scaled, and then offset if numeric
|
|
323
|
+
export function adjustValueScaleOffset( property, target ) {
|
|
324
|
+
|
|
325
|
+
const {
|
|
326
|
+
type,
|
|
327
|
+
componentType,
|
|
328
|
+
scale,
|
|
329
|
+
offset,
|
|
330
|
+
normalized,
|
|
331
|
+
} = property;
|
|
332
|
+
|
|
333
|
+
if ( Array.isArray( target ) ) {
|
|
334
|
+
|
|
335
|
+
for ( let i = 0, l = target.length; i < l; i ++ ) {
|
|
336
|
+
|
|
337
|
+
target[ i ] = adjustFromType( target[ i ] );
|
|
338
|
+
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
} else {
|
|
342
|
+
|
|
343
|
+
target = adjustFromType( target );
|
|
344
|
+
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return target;
|
|
348
|
+
|
|
349
|
+
function adjustFromType( value ) {
|
|
350
|
+
|
|
351
|
+
if ( isMatrixType( type ) ) {
|
|
352
|
+
|
|
353
|
+
value = adjustMatrix( value );
|
|
354
|
+
|
|
355
|
+
} else if ( isVectorType( type ) ) {
|
|
356
|
+
|
|
357
|
+
value = adjustVector( value );
|
|
358
|
+
|
|
359
|
+
} else {
|
|
360
|
+
|
|
361
|
+
value = adjustScalar( value );
|
|
362
|
+
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
return value;
|
|
366
|
+
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
function adjustVector( value ) {
|
|
370
|
+
|
|
371
|
+
value.x = adjustScalar( value.x );
|
|
372
|
+
value.y = adjustScalar( value.y );
|
|
373
|
+
if ( 'z' in value ) value.z = adjustScalar( value.z );
|
|
374
|
+
if ( 'w' in value ) value.w = adjustScalar( value.w );
|
|
375
|
+
return value;
|
|
376
|
+
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
function adjustMatrix( value ) {
|
|
380
|
+
|
|
381
|
+
const elements = value.elements;
|
|
382
|
+
for ( let i = 0, l = elements.length; i < l; i ++ ) {
|
|
383
|
+
|
|
384
|
+
elements[ i ] = adjustScalar( elements[ i ] );
|
|
385
|
+
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
return value;
|
|
389
|
+
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
function adjustScalar( value ) {
|
|
393
|
+
|
|
394
|
+
if ( normalized ) {
|
|
395
|
+
|
|
396
|
+
value = normalizeValue( componentType, value );
|
|
397
|
+
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
if ( normalized || isFloatComponentType( componentType ) ) {
|
|
401
|
+
|
|
402
|
+
value = value * scale + offset;
|
|
403
|
+
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
return value;
|
|
407
|
+
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// Shape the given target object based on the provided property. If overrideCount is
|
|
413
|
+
// provided then it will be used to specify the array length.
|
|
414
|
+
export function initializeFromProperty( property, target, overrideCount = null ) {
|
|
415
|
+
|
|
416
|
+
if ( property.array ) {
|
|
417
|
+
|
|
418
|
+
if ( ! Array.isArray( target ) ) {
|
|
419
|
+
|
|
420
|
+
target = new Array( property.count || 0 );
|
|
421
|
+
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
target.length = overrideCount !== null ? overrideCount : property.count;
|
|
425
|
+
|
|
426
|
+
for ( let i = 0, l = target.length; i < l; i ++ ) {
|
|
427
|
+
|
|
428
|
+
if ( ! isTypeInstance( property.type, target[ i ] ) ) {
|
|
429
|
+
|
|
430
|
+
target[ i ] = getTypeInstance( property );
|
|
431
|
+
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
} else {
|
|
437
|
+
|
|
438
|
+
if ( ! isTypeInstance( property.type, target ) ) {
|
|
439
|
+
|
|
440
|
+
target = getTypeInstance( property );
|
|
441
|
+
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
return target;
|
|
447
|
+
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// Shape the "target" object based on the provided set of properties
|
|
451
|
+
export function initializeFromClass( properties, target ) {
|
|
452
|
+
|
|
453
|
+
// remove unused fields
|
|
454
|
+
for ( const key in target ) {
|
|
455
|
+
|
|
456
|
+
if ( ! ( key in properties ) ) {
|
|
457
|
+
|
|
458
|
+
delete target[ key ];
|
|
459
|
+
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// add and adjust any fields required by the set of properties
|
|
465
|
+
for ( const key in properties ) {
|
|
466
|
+
|
|
467
|
+
const prop = properties[ key ];
|
|
468
|
+
target[ key ] = initializeFromProperty( prop, target[ key ] );
|
|
469
|
+
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// Returns the number of components required for the given type
|
|
475
|
+
export function typeToComponentCount( type ) {
|
|
476
|
+
|
|
477
|
+
switch ( type ) {
|
|
478
|
+
|
|
479
|
+
case 'ENUM': return 1;
|
|
480
|
+
case 'SCALAR': return 1;
|
|
481
|
+
case 'VEC2': return 2;
|
|
482
|
+
case 'VEC3': return 3;
|
|
483
|
+
case 'VEC4': return 4;
|
|
484
|
+
case 'MAT2': return 4;
|
|
485
|
+
case 'MAT3': return 9;
|
|
486
|
+
case 'MAT4': return 16;
|
|
487
|
+
|
|
488
|
+
// unused
|
|
489
|
+
case 'BOOLEAN': return - 1;
|
|
490
|
+
case 'STRING': return - 1;
|
|
491
|
+
default: return - 1;
|
|
492
|
+
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Vector2 } from 'three';
|
|
2
|
+
|
|
3
|
+
const _uv0 = /* @__PURE__ */ new Vector2();
|
|
4
|
+
const _uv1 = /* @__PURE__ */ new Vector2();
|
|
5
|
+
const _uv2 = /* @__PURE__ */ new Vector2();
|
|
6
|
+
|
|
7
|
+
// returns the uv attribute of the given index
|
|
8
|
+
export function getTextureCoordAttribute( geometry, index ) {
|
|
9
|
+
|
|
10
|
+
if ( index === 0 ) {
|
|
11
|
+
|
|
12
|
+
return geometry.getAttribute( 'uv' );
|
|
13
|
+
|
|
14
|
+
} else {
|
|
15
|
+
|
|
16
|
+
return geometry.getAttribute( `uv${ index }` );
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// returns the vertex indices associated with the triangle index
|
|
23
|
+
export function getTriangleVertexIndices( geometry, faceIndex, target = new Array( 3 ) ) {
|
|
24
|
+
|
|
25
|
+
// get the attribute indices
|
|
26
|
+
let i0 = 3 * faceIndex;
|
|
27
|
+
let i1 = 3 * faceIndex + 1;
|
|
28
|
+
let i2 = 3 * faceIndex + 2;
|
|
29
|
+
if ( geometry.index ) {
|
|
30
|
+
|
|
31
|
+
i0 = geometry.index.getX( i0 );
|
|
32
|
+
i1 = geometry.index.getX( i1 );
|
|
33
|
+
i2 = geometry.index.getX( i2 );
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
target[ 0 ] = i0;
|
|
38
|
+
target[ 1 ] = i1;
|
|
39
|
+
target[ 2 ] = i2;
|
|
40
|
+
return target;
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// takes a tex coord index, barycoord, vertex indices, and target to set
|
|
45
|
+
// sets target to the interpolated uv value
|
|
46
|
+
export function getTexCoord( geometry, texCoord, barycoord, indices, target ) {
|
|
47
|
+
|
|
48
|
+
const [ i0, i1, i2 ] = indices;
|
|
49
|
+
const attr = getTextureCoordAttribute( geometry, texCoord );
|
|
50
|
+
_uv0.fromBufferAttribute( attr, i0 );
|
|
51
|
+
_uv1.fromBufferAttribute( attr, i1 );
|
|
52
|
+
_uv2.fromBufferAttribute( attr, i2 );
|
|
53
|
+
|
|
54
|
+
target
|
|
55
|
+
.set( 0, 0, 0 )
|
|
56
|
+
.addScaledVector( _uv0, barycoord.x )
|
|
57
|
+
.addScaledVector( _uv1, barycoord.y )
|
|
58
|
+
.addScaledVector( _uv2, barycoord.z );
|
|
59
|
+
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// gets the x, y index of the pixel at the given uv coordinate
|
|
63
|
+
export function getTexelIndices( uv, width, height, target ) {
|
|
64
|
+
|
|
65
|
+
const fx = uv.x - Math.floor( uv.x );
|
|
66
|
+
const fy = uv.y - Math.floor( uv.y );
|
|
67
|
+
const px = Math.floor( ( fx * width ) % width );
|
|
68
|
+
const py = Math.floor( ( fy * height ) % height );
|
|
69
|
+
target.set( px, py );
|
|
70
|
+
return target;
|
|
71
|
+
|
|
72
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { WebGLRenderTarget, WebGLRenderer, Box2, Vector2, Vector4, ShaderMaterial, REVISION, CustomBlending, ZeroFactor, OneFactor } from 'three';
|
|
2
|
+
import { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';
|
|
3
|
+
|
|
4
|
+
const REVISION_GEQ_165 = parseInt( REVISION ) >= 165;
|
|
5
|
+
const REVISION_GEQ_166 = parseInt( REVISION ) >= 166;
|
|
6
|
+
const _box = /* @__PURE__ */ new Box2();
|
|
7
|
+
const _currentScissor = /* @__PURE__ */ new Vector4();
|
|
8
|
+
const _pos = /* @__PURE__ */ new Vector2();
|
|
9
|
+
|
|
10
|
+
// Utility for reading sets of individual pixel values from textures
|
|
11
|
+
export const TextureReadUtility = new ( class {
|
|
12
|
+
|
|
13
|
+
constructor() {
|
|
14
|
+
|
|
15
|
+
this._renderer = new WebGLRenderer();
|
|
16
|
+
this._target = new WebGLRenderTarget( 1, 1 );
|
|
17
|
+
this._texTarget = new WebGLRenderTarget();
|
|
18
|
+
|
|
19
|
+
// quad to render just a single pixel from the provided texture
|
|
20
|
+
this._quad = new FullScreenQuad( new ShaderMaterial( {
|
|
21
|
+
|
|
22
|
+
blending: CustomBlending,
|
|
23
|
+
blendDst: ZeroFactor,
|
|
24
|
+
blendSrc: OneFactor,
|
|
25
|
+
|
|
26
|
+
uniforms: {
|
|
27
|
+
|
|
28
|
+
map: { value: null },
|
|
29
|
+
pixel: { value: new Vector2() }
|
|
30
|
+
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
vertexShader: /* glsl */`
|
|
34
|
+
void main() {
|
|
35
|
+
|
|
36
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
`,
|
|
40
|
+
|
|
41
|
+
fragmentShader: /* glsl */`
|
|
42
|
+
uniform sampler2D map;
|
|
43
|
+
uniform ivec2 pixel;
|
|
44
|
+
|
|
45
|
+
void main() {
|
|
46
|
+
|
|
47
|
+
gl_FragColor = texelFetch( map, pixel, 0 );
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
`,
|
|
51
|
+
|
|
52
|
+
} ) );
|
|
53
|
+
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// increases the width of the target render target to support more data
|
|
57
|
+
increaseSizeTo( width ) {
|
|
58
|
+
|
|
59
|
+
this._target.setSize( Math.max( this._target.width, width ), 1 );
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// read data from the rendered texture asynchronously
|
|
64
|
+
readDataAsync( buffer ) {
|
|
65
|
+
|
|
66
|
+
const { _renderer, _target } = this;
|
|
67
|
+
if ( REVISION_GEQ_165 ) {
|
|
68
|
+
|
|
69
|
+
return _renderer.readRenderTargetPixelsAsync( _target, 0, 0, buffer.length / 4, 1, buffer );
|
|
70
|
+
|
|
71
|
+
} else {
|
|
72
|
+
|
|
73
|
+
return Promise.resolve().then( () => this.readData( buffer ) );
|
|
74
|
+
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// read data from the rendered texture
|
|
80
|
+
readData( buffer ) {
|
|
81
|
+
|
|
82
|
+
const { _renderer, _target } = this;
|
|
83
|
+
_renderer.readRenderTargetPixels( _target, 0, 0, buffer.length / 4, 1, buffer );
|
|
84
|
+
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// render a single pixel from the source at the destination point on the render target
|
|
88
|
+
// takes the texture, pixel to read from, and pixel to render in to
|
|
89
|
+
renderPixelToTarget( texture, pixel, dstPixel ) {
|
|
90
|
+
|
|
91
|
+
const { _quad, _renderer, _target, _texTarget } = this;
|
|
92
|
+
|
|
93
|
+
if ( REVISION_GEQ_166 ) {
|
|
94
|
+
|
|
95
|
+
// copies the pixel directly to the target buffer
|
|
96
|
+
_box.min.copy( pixel );
|
|
97
|
+
_box.max.copy( pixel );
|
|
98
|
+
_box.max.x += 1;
|
|
99
|
+
_box.max.y += 1;
|
|
100
|
+
_renderer.initRenderTarget( _target );
|
|
101
|
+
_renderer.copyTextureToTexture( texture, _target.texture, _box, dstPixel, 0 );
|
|
102
|
+
|
|
103
|
+
} else {
|
|
104
|
+
|
|
105
|
+
// save state
|
|
106
|
+
const currentAutoClear = _renderer.autoClear;
|
|
107
|
+
const currentTarget = _renderer.getRenderTarget();
|
|
108
|
+
const currentScissorTest = _renderer.getScissorTest();
|
|
109
|
+
_renderer.getScissor( _currentScissor );
|
|
110
|
+
|
|
111
|
+
// initialize the render target
|
|
112
|
+
_texTarget.setSize( texture.image.width, texture.image.height );
|
|
113
|
+
_renderer.setRenderTarget( _texTarget );
|
|
114
|
+
|
|
115
|
+
// render the data
|
|
116
|
+
_pos.set( 0, 0 );
|
|
117
|
+
if ( REVISION_GEQ_165 ) {
|
|
118
|
+
|
|
119
|
+
_renderer.copyTextureToTexture( texture, _texTarget.texture, null, _pos );
|
|
120
|
+
|
|
121
|
+
} else {
|
|
122
|
+
|
|
123
|
+
_renderer.copyTextureToTexture( _pos, texture, _texTarget.texture );
|
|
124
|
+
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
_quad.material.uniforms.map.value = _texTarget.texture;
|
|
128
|
+
_quad.material.uniforms.pixel.value.copy( pixel );
|
|
129
|
+
|
|
130
|
+
// if we set the render target after setting scissor state it is reset
|
|
131
|
+
_renderer.setRenderTarget( _target );
|
|
132
|
+
|
|
133
|
+
// init state
|
|
134
|
+
_renderer.setScissorTest( true );
|
|
135
|
+
_renderer.setScissor( dstPixel.x, dstPixel.y, 1, 1 );
|
|
136
|
+
_renderer.autoClear = false;
|
|
137
|
+
|
|
138
|
+
// render
|
|
139
|
+
_quad.render( _renderer );
|
|
140
|
+
|
|
141
|
+
// reset state
|
|
142
|
+
_renderer.setScissorTest( currentScissorTest );
|
|
143
|
+
_renderer.setScissor( _currentScissor );
|
|
144
|
+
_renderer.setRenderTarget( currentTarget );
|
|
145
|
+
_renderer.autoClear = currentAutoClear;
|
|
146
|
+
|
|
147
|
+
// remove the memory
|
|
148
|
+
_texTarget.dispose();
|
|
149
|
+
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
} )();
|