itowns 2.44.3-next.8 → 2.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/README.md +3 -129
  2. package/examples/3dtiles_loader.html +123 -48
  3. package/examples/config.json +3 -10
  4. package/examples/copc_simple_loader.html +15 -5
  5. package/examples/effects_stereo.html +2 -2
  6. package/examples/entwine_3d_loader.html +3 -1
  7. package/examples/entwine_simple_loader.html +1 -1
  8. package/examples/images/itowns_logo.svg +123 -0
  9. package/examples/js/plugins/COGParser.js +1 -1
  10. package/examples/jsm/OGC3DTilesHelper.js +6 -1
  11. package/examples/layers/JSONLayers/GeoidMNT.json +3 -1
  12. package/examples/misc_collada.html +2 -2
  13. package/examples/source_file_geojson_3d.html +0 -1
  14. package/examples/source_file_kml_raster_usgs.html +0 -1
  15. package/examples/source_stream_wfs_raster.html +0 -7
  16. package/examples/vector_tile_mapbox_raster.html +91 -0
  17. package/examples/view_3d_map_webxr.html +3 -1
  18. package/examples/view_multi_25d.html +2 -2
  19. package/package.json +21 -75
  20. package/CODING.md +0 -120
  21. package/CONTRIBUTING.md +0 -150
  22. package/CONTRIBUTORS.md +0 -55
  23. package/LICENSE.md +0 -44
  24. package/changelog.md +0 -1361
  25. package/dist/455.js +0 -2
  26. package/dist/455.js.map +0 -1
  27. package/dist/debug.js +0 -3
  28. package/dist/debug.js.LICENSE.txt +0 -13
  29. package/dist/debug.js.map +0 -1
  30. package/dist/itowns.js +0 -3
  31. package/dist/itowns.js.LICENSE.txt +0 -7
  32. package/dist/itowns.js.map +0 -1
  33. package/dist/itowns_lasparser.js +0 -2
  34. package/dist/itowns_lasparser.js.map +0 -1
  35. package/dist/itowns_lasworker.js +0 -2
  36. package/dist/itowns_lasworker.js.map +0 -1
  37. package/dist/itowns_potree2worker.js +0 -2
  38. package/dist/itowns_potree2worker.js.map +0 -1
  39. package/dist/itowns_widgets.js +0 -2
  40. package/dist/itowns_widgets.js.map +0 -1
  41. package/examples/.eslintrc.cjs +0 -35
  42. package/examples/3dtiles_25d.html +0 -120
  43. package/examples/3dtiles_basic.html +0 -94
  44. package/examples/3dtiles_batch_table.html +0 -86
  45. package/examples/3dtiles_ion.html +0 -126
  46. package/examples/3dtiles_pointcloud.html +0 -95
  47. package/examples/jsm/.eslintrc.cjs +0 -38
  48. package/lib/Controls/FirstPersonControls.js +0 -308
  49. package/lib/Controls/FlyControls.js +0 -175
  50. package/lib/Controls/GlobeControls.js +0 -1162
  51. package/lib/Controls/PlanarControls.js +0 -1025
  52. package/lib/Controls/StateControl.js +0 -429
  53. package/lib/Controls/StreetControls.js +0 -392
  54. package/lib/Converter/Feature2Mesh.js +0 -615
  55. package/lib/Converter/Feature2Texture.js +0 -170
  56. package/lib/Converter/convertToTile.js +0 -75
  57. package/lib/Converter/textureConverter.js +0 -44
  58. package/lib/Core/3DTiles/C3DTBatchTable.js +0 -131
  59. package/lib/Core/3DTiles/C3DTBatchTableHierarchyExtension.js +0 -96
  60. package/lib/Core/3DTiles/C3DTBoundingVolume.js +0 -157
  61. package/lib/Core/3DTiles/C3DTExtensions.js +0 -97
  62. package/lib/Core/3DTiles/C3DTFeature.js +0 -110
  63. package/lib/Core/3DTiles/C3DTilesEnums.js +0 -20
  64. package/lib/Core/3DTiles/C3DTileset.js +0 -99
  65. package/lib/Core/3DTiles/utils/BinaryPropertyAccessor.js +0 -100
  66. package/lib/Core/AnimationPlayer.js +0 -142
  67. package/lib/Core/CopcNode.js +0 -174
  68. package/lib/Core/Deprecated/Undeprecator.js +0 -75
  69. package/lib/Core/EntwinePointTileNode.js +0 -126
  70. package/lib/Core/Feature.js +0 -490
  71. package/lib/Core/Geographic/CoordStars.js +0 -80
  72. package/lib/Core/Geographic/Coordinates.js +0 -320
  73. package/lib/Core/Geographic/Crs.js +0 -175
  74. package/lib/Core/Geographic/Extent.js +0 -534
  75. package/lib/Core/Geographic/GeoidGrid.js +0 -109
  76. package/lib/Core/Label.js +0 -222
  77. package/lib/Core/MainLoop.js +0 -211
  78. package/lib/Core/Math/Ellipsoid.js +0 -144
  79. package/lib/Core/Picking.js +0 -255
  80. package/lib/Core/PointCloudNode.js +0 -42
  81. package/lib/Core/Potree2Node.js +0 -206
  82. package/lib/Core/Potree2PointAttributes.js +0 -139
  83. package/lib/Core/PotreeNode.js +0 -101
  84. package/lib/Core/Prefab/Globe/Atmosphere.js +0 -299
  85. package/lib/Core/Prefab/Globe/BuilderEllipsoidTile.js +0 -110
  86. package/lib/Core/Prefab/Globe/GlobeLayer.js +0 -145
  87. package/lib/Core/Prefab/Globe/SkyShader.js +0 -78
  88. package/lib/Core/Prefab/GlobeView.js +0 -161
  89. package/lib/Core/Prefab/Planar/PlanarLayer.js +0 -53
  90. package/lib/Core/Prefab/Planar/PlanarTileBuilder.js +0 -72
  91. package/lib/Core/Prefab/PlanarView.js +0 -62
  92. package/lib/Core/Prefab/TileBuilder.js +0 -80
  93. package/lib/Core/Prefab/computeBufferTileGeometry.js +0 -183
  94. package/lib/Core/Scheduler/Cache.js +0 -256
  95. package/lib/Core/Scheduler/CancelledCommandException.js +0 -15
  96. package/lib/Core/Scheduler/Scheduler.js +0 -294
  97. package/lib/Core/Style.js +0 -1121
  98. package/lib/Core/System/Capabilities.js +0 -63
  99. package/lib/Core/Tile/Tile.js +0 -219
  100. package/lib/Core/Tile/TileGrid.js +0 -46
  101. package/lib/Core/TileGeometry.js +0 -40
  102. package/lib/Core/TileMesh.js +0 -109
  103. package/lib/Core/View.js +0 -1109
  104. package/lib/Layer/C3DTilesLayer.js +0 -455
  105. package/lib/Layer/ColorLayer.js +0 -128
  106. package/lib/Layer/CopcLayer.js +0 -58
  107. package/lib/Layer/ElevationLayer.js +0 -107
  108. package/lib/Layer/EntwinePointTileLayer.js +0 -64
  109. package/lib/Layer/FeatureGeometryLayer.js +0 -63
  110. package/lib/Layer/GeoidLayer.js +0 -80
  111. package/lib/Layer/GeometryLayer.js +0 -202
  112. package/lib/Layer/InfoLayer.js +0 -64
  113. package/lib/Layer/LabelLayer.js +0 -456
  114. package/lib/Layer/Layer.js +0 -304
  115. package/lib/Layer/LayerUpdateState.js +0 -89
  116. package/lib/Layer/LayerUpdateStrategy.js +0 -80
  117. package/lib/Layer/OGC3DTilesLayer.js +0 -387
  118. package/lib/Layer/OrientedImageLayer.js +0 -222
  119. package/lib/Layer/PointCloudLayer.js +0 -359
  120. package/lib/Layer/Potree2Layer.js +0 -164
  121. package/lib/Layer/PotreeLayer.js +0 -65
  122. package/lib/Layer/RasterLayer.js +0 -27
  123. package/lib/Layer/ReferencingLayerProperties.js +0 -62
  124. package/lib/Layer/TiledGeometryLayer.js +0 -403
  125. package/lib/Loader/LASLoader.js +0 -193
  126. package/lib/Loader/Potree2BrotliLoader.js +0 -261
  127. package/lib/Loader/Potree2Loader.js +0 -207
  128. package/lib/Main.js +0 -115
  129. package/lib/MainBundle.js +0 -4
  130. package/lib/Parser/B3dmParser.js +0 -174
  131. package/lib/Parser/CameraCalibrationParser.js +0 -94
  132. package/lib/Parser/GDFParser.js +0 -72
  133. package/lib/Parser/GTXParser.js +0 -75
  134. package/lib/Parser/GeoJsonParser.js +0 -212
  135. package/lib/Parser/GpxParser.js +0 -25
  136. package/lib/Parser/ISGParser.js +0 -71
  137. package/lib/Parser/KMLParser.js +0 -25
  138. package/lib/Parser/LASParser.js +0 -137
  139. package/lib/Parser/MapBoxUrlParser.js +0 -83
  140. package/lib/Parser/PntsParser.js +0 -131
  141. package/lib/Parser/Potree2BinParser.js +0 -92
  142. package/lib/Parser/PotreeBinParser.js +0 -106
  143. package/lib/Parser/PotreeCinParser.js +0 -29
  144. package/lib/Parser/ShapefileParser.js +0 -78
  145. package/lib/Parser/VectorTileParser.js +0 -202
  146. package/lib/Parser/XbilParser.js +0 -119
  147. package/lib/Parser/deprecated/LegacyGLTFLoader.js +0 -1386
  148. package/lib/Parser/iGLTFLoader.js +0 -168
  149. package/lib/Process/3dTilesProcessing.js +0 -304
  150. package/lib/Process/FeatureProcessing.js +0 -76
  151. package/lib/Process/LayeredMaterialNodeProcessing.js +0 -221
  152. package/lib/Process/ObjectRemovalHelper.js +0 -97
  153. package/lib/Process/handlerNodeError.js +0 -23
  154. package/lib/Provider/3dTilesProvider.js +0 -149
  155. package/lib/Provider/DataSourceProvider.js +0 -8
  156. package/lib/Provider/Fetcher.js +0 -229
  157. package/lib/Provider/PointCloudProvider.js +0 -45
  158. package/lib/Provider/TileProvider.js +0 -16
  159. package/lib/Provider/URLBuilder.js +0 -116
  160. package/lib/Renderer/Camera.js +0 -281
  161. package/lib/Renderer/Color.js +0 -56
  162. package/lib/Renderer/ColorLayersOrdering.js +0 -115
  163. package/lib/Renderer/CommonMaterial.js +0 -31
  164. package/lib/Renderer/Label2DRenderer.js +0 -190
  165. package/lib/Renderer/LayeredMaterial.js +0 -243
  166. package/lib/Renderer/OBB.js +0 -153
  167. package/lib/Renderer/OrientedImageCamera.js +0 -118
  168. package/lib/Renderer/OrientedImageMaterial.js +0 -167
  169. package/lib/Renderer/PointsMaterial.js +0 -485
  170. package/lib/Renderer/RasterTile.js +0 -209
  171. package/lib/Renderer/RenderMode.js +0 -31
  172. package/lib/Renderer/Shader/ShaderChunk.js +0 -160
  173. package/lib/Renderer/Shader/ShaderUtils.js +0 -47
  174. package/lib/Renderer/SphereHelper.js +0 -23
  175. package/lib/Renderer/WebXR.js +0 -51
  176. package/lib/Renderer/c3DEngine.js +0 -214
  177. package/lib/Source/C3DTilesGoogleSource.js +0 -74
  178. package/lib/Source/C3DTilesIonSource.js +0 -54
  179. package/lib/Source/C3DTilesSource.js +0 -30
  180. package/lib/Source/CopcSource.js +0 -115
  181. package/lib/Source/EntwinePointTileSource.js +0 -62
  182. package/lib/Source/FileSource.js +0 -189
  183. package/lib/Source/OGC3DTilesGoogleSource.js +0 -29
  184. package/lib/Source/OGC3DTilesIonSource.js +0 -34
  185. package/lib/Source/OGC3DTilesSource.js +0 -21
  186. package/lib/Source/OrientedImageSource.js +0 -59
  187. package/lib/Source/Potree2Source.js +0 -167
  188. package/lib/Source/PotreeSource.js +0 -82
  189. package/lib/Source/Source.js +0 -223
  190. package/lib/Source/TMSSource.js +0 -145
  191. package/lib/Source/VectorTilesSource.js +0 -178
  192. package/lib/Source/WFSSource.js +0 -168
  193. package/lib/Source/WMSSource.js +0 -133
  194. package/lib/Source/WMTSSource.js +0 -86
  195. package/lib/ThreeExtended/capabilities/WebGL.js +0 -69
  196. package/lib/ThreeExtended/libs/ktx-parse.module.js +0 -470
  197. package/lib/ThreeExtended/libs/zstddec.module.js +0 -29
  198. package/lib/ThreeExtended/loaders/DDSLoader.js +0 -200
  199. package/lib/ThreeExtended/loaders/DRACOLoader.js +0 -399
  200. package/lib/ThreeExtended/loaders/GLTFLoader.js +0 -2876
  201. package/lib/ThreeExtended/loaders/KTX2Loader.js +0 -625
  202. package/lib/ThreeExtended/utils/BufferGeometryUtils.js +0 -846
  203. package/lib/ThreeExtended/utils/WorkerPool.js +0 -70
  204. package/lib/Utils/CameraUtils.js +0 -555
  205. package/lib/Utils/DEMUtils.js +0 -350
  206. package/lib/Utils/FeaturesUtils.js +0 -156
  207. package/lib/Utils/Gradients.js +0 -16
  208. package/lib/Utils/OrientationUtils.js +0 -457
  209. package/lib/Utils/ThreeUtils.js +0 -115
  210. package/lib/Utils/gui/C3DTilesStyle.js +0 -215
  211. package/lib/Utils/gui/Main.js +0 -7
  212. package/lib/Utils/gui/Minimap.js +0 -154
  213. package/lib/Utils/gui/Navigation.js +0 -245
  214. package/lib/Utils/gui/Scale.js +0 -107
  215. package/lib/Utils/gui/Searchbar.js +0 -234
  216. package/lib/Utils/gui/Widget.js +0 -80
  217. package/lib/Utils/placeObjectOnGround.js +0 -137
  218. package/lib/Worker/LASLoaderWorker.js +0 -19
  219. package/lib/Worker/Potree2Worker.js +0 -21
@@ -1,1386 +0,0 @@
1
- /* eslint-disable */
2
- // LegacyGLTFLoader for loading gltf 1.0 files taken from THREE v110 because it was removed in THREE v111 and maintained
3
- // since
4
- import * as THREE from 'three';
5
- const threeExamples = {};
6
- /**
7
- * @author Rich Tibbett / https://github.com/richtr
8
- * @author mrdoob / http://mrdoob.com/
9
- * @author Tony Parisi / http://www.tonyparisi.com/
10
- * @author Takahiro / https://github.com/takahirox
11
- */
12
-
13
- threeExamples.LegacyGLTFLoader = function () {
14
- class LegacyGLTFLoader extends THREE.Loader {
15
- constructor(manager) {
16
- super(manager);
17
- }
18
- load(url, onLoad, onProgress, onError) {
19
- var scope = this;
20
- var resourcePath;
21
- if (this.resourcePath !== '') {
22
- resourcePath = this.resourcePath;
23
- } else if (this.path !== '') {
24
- resourcePath = this.path;
25
- } else {
26
- resourcePath = THREE.LoaderUtils.extractUrlBase(url);
27
- }
28
- var loader = new THREE.FileLoader(scope.manager);
29
- loader.setPath(this.path);
30
- loader.setResponseType('arraybuffer');
31
- loader.load(url, function (data) {
32
- scope.parse(data, resourcePath, onLoad);
33
- }, onProgress, onError);
34
- }
35
- parse(data, path, callback) {
36
- var content;
37
- var extensions = {};
38
- var magic = THREE.LoaderUtils.decodeText(new Uint8Array(data, 0, 4));
39
- if (magic === BINARY_EXTENSION_HEADER_DEFAULTS.magic) {
40
- extensions[EXTENSIONS.KHR_BINARY_GLTF] = new GLTFBinaryExtension(data);
41
- content = extensions[EXTENSIONS.KHR_BINARY_GLTF].content;
42
- } else {
43
- content = THREE.LoaderUtils.decodeText(new Uint8Array(data));
44
- }
45
- var json = JSON.parse(content);
46
- if (json.extensionsUsed && json.extensionsUsed.indexOf(EXTENSIONS.KHR_MATERIALS_COMMON) >= 0) {
47
- extensions[EXTENSIONS.KHR_MATERIALS_COMMON] = new GLTFMaterialsCommonExtension(json);
48
- }
49
- if (json.extensionsUsed && json.extensionsUsed.indexOf(EXTENSIONS.CESIUM_RTC) >= 0) {
50
- extensions[EXTENSIONS.CESIUM_RTC] = new CesiumRTCExtension(json);
51
- }
52
- var parser = new GLTFParser(json, extensions, {
53
- crossOrigin: this.crossOrigin,
54
- manager: this.manager,
55
- path: path || this.resourcePath || ''
56
- });
57
- parser.parse(function (scene, scenes, cameras, animations) {
58
- callback({
59
- "scene": scene,
60
- "scenes": scenes,
61
- "cameras": cameras,
62
- "animations": animations
63
- });
64
- });
65
- }
66
- }
67
-
68
- /* GLTFREGISTRY */
69
-
70
- function GLTFRegistry() {
71
- var objects = {};
72
- return {
73
- get: function (key) {
74
- return objects[key];
75
- },
76
- add: function (key, object) {
77
- objects[key] = object;
78
- },
79
- remove: function (key) {
80
- delete objects[key];
81
- },
82
- removeAll: function () {
83
- objects = {};
84
- },
85
- update: function (scene, camera) {
86
- for (var name in objects) {
87
- var object = objects[name];
88
- if (object.update) {
89
- object.update(scene, camera);
90
- }
91
- }
92
- }
93
- };
94
- }
95
-
96
- /* GLTFSHADERS */
97
-
98
- LegacyGLTFLoader.Shaders = {
99
- update: function () {
100
- console.warn('threeExamples.LegacyGLTFLoader.Shaders has been deprecated, and now updates automatically.');
101
- }
102
- };
103
-
104
- /* GLTFSHADER */
105
-
106
- function GLTFShader(targetNode, allNodes) {
107
- var boundUniforms = {};
108
-
109
- // bind each uniform to its source node
110
-
111
- var uniforms = targetNode.material.uniforms;
112
- for (var uniformId in uniforms) {
113
- var uniform = uniforms[uniformId];
114
- if (uniform.semantic) {
115
- var sourceNodeRef = uniform.node;
116
- var sourceNode = targetNode;
117
- if (sourceNodeRef) {
118
- sourceNode = allNodes[sourceNodeRef];
119
- }
120
- boundUniforms[uniformId] = {
121
- semantic: uniform.semantic,
122
- sourceNode: sourceNode,
123
- targetNode: targetNode,
124
- uniform: uniform
125
- };
126
- }
127
- }
128
- this.boundUniforms = boundUniforms;
129
- this._m4 = new THREE.Matrix4();
130
- }
131
-
132
- // Update - update all the uniform values
133
- GLTFShader.prototype.update = function (scene, camera) {
134
- var boundUniforms = this.boundUniforms;
135
- for (var name in boundUniforms) {
136
- var boundUniform = boundUniforms[name];
137
- switch (boundUniform.semantic) {
138
- case "MODELVIEW":
139
- var m4 = boundUniform.uniform.value;
140
- m4.multiplyMatrices(camera.matrixWorldInverse, boundUniform.sourceNode.matrixWorld);
141
- break;
142
- case "MODELVIEWINVERSETRANSPOSE":
143
- var m3 = boundUniform.uniform.value;
144
- this._m4.multiplyMatrices(camera.matrixWorldInverse, boundUniform.sourceNode.matrixWorld);
145
- m3.getNormalMatrix(this._m4);
146
- break;
147
- case "PROJECTION":
148
- var m4 = boundUniform.uniform.value;
149
- m4.copy(camera.projectionMatrix);
150
- break;
151
- case "JOINTMATRIX":
152
- var m4v = boundUniform.uniform.value;
153
- for (var mi = 0; mi < m4v.length; mi++) {
154
- // So it goes like this:
155
- // SkinnedMesh world matrix is already baked into MODELVIEW;
156
- // transform joints to local space,
157
- // then transform using joint's inverse
158
- m4v[mi].getInverse(boundUniform.sourceNode.matrixWorld).multiply(boundUniform.targetNode.skeleton.bones[mi].matrixWorld).multiply(boundUniform.targetNode.skeleton.boneInverses[mi]).multiply(boundUniform.targetNode.bindMatrix);
159
- }
160
- break;
161
- default:
162
- console.warn("Unhandled shader semantic: " + boundUniform.semantic);
163
- break;
164
- }
165
- }
166
- };
167
-
168
- /* ANIMATION */
169
-
170
- LegacyGLTFLoader.Animations = {
171
- update: function () {
172
- console.warn('threeExamples.LegacyGLTFLoader.Animation has been deprecated. Use THREE.AnimationMixer instead.');
173
- }
174
- };
175
-
176
- /*********************************/
177
- /********** EXTENSIONS ***********/
178
- /*********************************/
179
-
180
- var EXTENSIONS = {
181
- KHR_BINARY_GLTF: 'KHR_binary_glTF',
182
- KHR_MATERIALS_COMMON: 'KHR_materials_common',
183
- CESIUM_RTC: 'CESIUM_RTC'
184
- };
185
-
186
- /* MATERIALS COMMON EXTENSION */
187
-
188
- function GLTFMaterialsCommonExtension(json) {
189
- this.name = EXTENSIONS.KHR_MATERIALS_COMMON;
190
- this.lights = {};
191
- var extension = json.extensions && json.extensions[EXTENSIONS.KHR_MATERIALS_COMMON] || {};
192
- var lights = extension.lights || {};
193
- for (var lightId in lights) {
194
- var light = lights[lightId];
195
- var lightNode;
196
- var lightParams = light[light.type];
197
- var color = new THREE.Color().fromArray(lightParams.color);
198
- switch (light.type) {
199
- case "directional":
200
- lightNode = new THREE.DirectionalLight(color);
201
- lightNode.position.set(0, 0, 1);
202
- break;
203
- case "point":
204
- lightNode = new THREE.PointLight(color);
205
- break;
206
- case "spot":
207
- lightNode = new THREE.SpotLight(color);
208
- lightNode.position.set(0, 0, 1);
209
- break;
210
- case "ambient":
211
- lightNode = new THREE.AmbientLight(color);
212
- break;
213
- }
214
- if (lightNode) {
215
- this.lights[lightId] = lightNode;
216
- }
217
- }
218
- }
219
-
220
- /* BINARY EXTENSION */
221
-
222
- var BINARY_EXTENSION_HEADER_DEFAULTS = {
223
- magic: 'glTF',
224
- version: 1,
225
- contentFormat: 0
226
- };
227
- var BINARY_EXTENSION_HEADER_LENGTH = 20;
228
- function GLTFBinaryExtension(data) {
229
- this.name = EXTENSIONS.KHR_BINARY_GLTF;
230
- var headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH);
231
- var header = {
232
- magic: THREE.LoaderUtils.decodeText(new Uint8Array(data.slice(0, 4))),
233
- version: headerView.getUint32(4, true),
234
- length: headerView.getUint32(8, true),
235
- contentLength: headerView.getUint32(12, true),
236
- contentFormat: headerView.getUint32(16, true)
237
- };
238
- for (var key in BINARY_EXTENSION_HEADER_DEFAULTS) {
239
- var value = BINARY_EXTENSION_HEADER_DEFAULTS[key];
240
- if (header[key] !== value) {
241
- throw new Error('Unsupported glTF-Binary header: Expected "%s" to be "%s".', key, value);
242
- }
243
- }
244
- var contentArray = new Uint8Array(data, BINARY_EXTENSION_HEADER_LENGTH, header.contentLength);
245
- this.header = header;
246
- this.content = THREE.LoaderUtils.decodeText(contentArray);
247
- this.body = data.slice(BINARY_EXTENSION_HEADER_LENGTH + header.contentLength, header.length);
248
- }
249
- GLTFBinaryExtension.prototype.loadShader = function (shader, bufferViews) {
250
- var bufferView = bufferViews[shader.extensions[EXTENSIONS.KHR_BINARY_GLTF].bufferView];
251
- var array = new Uint8Array(bufferView);
252
- return THREE.LoaderUtils.decodeText(array);
253
- };
254
-
255
- // Ref spec https://github.com/KhronosGroup/glTF/blob/main/extensions/1.0/Vendor/CESIUM_RTC/README.md
256
- // Only the json storage method is implemented since it is the only one we've seen out there and since this extension
257
- // is specific to deprecated 3D tiles with GLTF 1.0
258
- function CesiumRTCExtension(json) {
259
- this.name = EXTENSIONS.CESIUM_RTC;
260
- this.center = [0, 0, 0];
261
- if (json.extensions && json.extensions[EXTENSIONS.CESIUM_RTC] && json.extensions[EXTENSIONS.CESIUM_RTC].center && json.extensions[EXTENSIONS.CESIUM_RTC].center.length === 3) {
262
- this.center = json.extensions[EXTENSIONS.CESIUM_RTC].center;
263
- }
264
- }
265
-
266
- /*********************************/
267
- /********** INTERNALS ************/
268
- /*********************************/
269
-
270
- /* CONSTANTS */
271
-
272
- var WEBGL_CONSTANTS = {
273
- FLOAT: 5126,
274
- //FLOAT_MAT2: 35674,
275
- FLOAT_MAT3: 35675,
276
- FLOAT_MAT4: 35676,
277
- FLOAT_VEC2: 35664,
278
- FLOAT_VEC3: 35665,
279
- FLOAT_VEC4: 35666,
280
- LINEAR: 9729,
281
- REPEAT: 10497,
282
- SAMPLER_2D: 35678,
283
- TRIANGLES: 4,
284
- LINES: 1,
285
- UNSIGNED_BYTE: 5121,
286
- UNSIGNED_SHORT: 5123,
287
- VERTEX_SHADER: 35633,
288
- FRAGMENT_SHADER: 35632
289
- };
290
- var WEBGL_TYPE = {
291
- 5126: Number,
292
- //35674: THREE.Matrix2,
293
- 35675: THREE.Matrix3,
294
- 35676: THREE.Matrix4,
295
- 35664: THREE.Vector2,
296
- 35665: THREE.Vector3,
297
- 35666: THREE.Vector4,
298
- 35678: THREE.Texture
299
- };
300
- var WEBGL_COMPONENT_TYPES = {
301
- 5120: Int8Array,
302
- 5121: Uint8Array,
303
- 5122: Int16Array,
304
- 5123: Uint16Array,
305
- 5125: Uint32Array,
306
- 5126: Float32Array
307
- };
308
- var WEBGL_FILTERS = {
309
- 9728: THREE.NearestFilter,
310
- 9729: THREE.LinearFilter,
311
- 9984: THREE.NearestMipmapNearestFilter,
312
- 9985: THREE.LinearMipmapNearestFilter,
313
- 9986: THREE.NearestMipmapLinearFilter,
314
- 9987: THREE.LinearMipmapLinearFilter
315
- };
316
- var WEBGL_WRAPPINGS = {
317
- 33071: THREE.ClampToEdgeWrapping,
318
- 33648: THREE.MirroredRepeatWrapping,
319
- 10497: THREE.RepeatWrapping
320
- };
321
- var WEBGL_TEXTURE_FORMATS = {
322
- 6406: THREE.AlphaFormat,
323
- 6407: THREE.RGBAFormat,
324
- 6408: THREE.RGBAFormat,
325
- 6409: THREE.LuminanceFormat,
326
- 6410: THREE.LuminanceAlphaFormat
327
- };
328
- var WEBGL_TEXTURE_DATATYPES = {
329
- 5121: THREE.UnsignedByteType,
330
- 32819: THREE.UnsignedShort4444Type,
331
- 32820: THREE.UnsignedShort5551Type,
332
- 33635: THREE.UnsignedShort5551Type
333
- };
334
- var WEBGL_SIDES = {
335
- 1028: THREE.BackSide,
336
- // Culling front
337
- 1029: THREE.FrontSide // Culling back
338
- //1032: THREE.NoSide // Culling front and back, what to do?
339
- };
340
- var WEBGL_DEPTH_FUNCS = {
341
- 512: THREE.NeverDepth,
342
- 513: THREE.LessDepth,
343
- 514: THREE.EqualDepth,
344
- 515: THREE.LessEqualDepth,
345
- 516: THREE.GreaterEqualDepth,
346
- 517: THREE.NotEqualDepth,
347
- 518: THREE.GreaterEqualDepth,
348
- 519: THREE.AlwaysDepth
349
- };
350
- var WEBGL_BLEND_EQUATIONS = {
351
- 32774: THREE.AddEquation,
352
- 32778: THREE.SubtractEquation,
353
- 32779: THREE.ReverseSubtractEquation
354
- };
355
- var WEBGL_BLEND_FUNCS = {
356
- 0: THREE.ZeroFactor,
357
- 1: THREE.OneFactor,
358
- 768: THREE.SrcColorFactor,
359
- 769: THREE.OneMinusSrcColorFactor,
360
- 770: THREE.SrcAlphaFactor,
361
- 771: THREE.OneMinusSrcAlphaFactor,
362
- 772: THREE.DstAlphaFactor,
363
- 773: THREE.OneMinusDstAlphaFactor,
364
- 774: THREE.DstColorFactor,
365
- 775: THREE.OneMinusDstColorFactor,
366
- 776: THREE.SrcAlphaSaturateFactor
367
- // The followings are not supported by Three.js yet
368
- //32769: CONSTANT_COLOR,
369
- //32770: ONE_MINUS_CONSTANT_COLOR,
370
- //32771: CONSTANT_ALPHA,
371
- //32772: ONE_MINUS_CONSTANT_COLOR
372
- };
373
- var WEBGL_TYPE_SIZES = {
374
- 'SCALAR': 1,
375
- 'VEC2': 2,
376
- 'VEC3': 3,
377
- 'VEC4': 4,
378
- 'MAT2': 4,
379
- 'MAT3': 9,
380
- 'MAT4': 16
381
- };
382
- var PATH_PROPERTIES = {
383
- scale: 'scale',
384
- translation: 'position',
385
- rotation: 'quaternion'
386
- };
387
- var INTERPOLATION = {
388
- LINEAR: THREE.InterpolateLinear,
389
- STEP: THREE.InterpolateDiscrete
390
- };
391
- var STATES_ENABLES = {
392
- 2884: 'CULL_FACE',
393
- 2929: 'DEPTH_TEST',
394
- 3042: 'BLEND',
395
- 3089: 'SCISSOR_TEST',
396
- 32823: 'POLYGON_OFFSET_FILL',
397
- 32926: 'SAMPLE_ALPHA_TO_COVERAGE'
398
- };
399
-
400
- /* UTILITY FUNCTIONS */
401
-
402
- function _each(object, callback, thisObj) {
403
- if (!object) {
404
- return Promise.resolve();
405
- }
406
- var results;
407
- var fns = [];
408
- if (Object.prototype.toString.call(object) === '[object Array]') {
409
- results = [];
410
- var length = object.length;
411
- for (var idx = 0; idx < length; idx++) {
412
- var value = callback.call(thisObj || this, object[idx], idx);
413
- if (value) {
414
- fns.push(value);
415
- if (value instanceof Promise) {
416
- value.then(function (key, value) {
417
- results[key] = value;
418
- }.bind(this, idx));
419
- } else {
420
- results[idx] = value;
421
- }
422
- }
423
- }
424
- } else {
425
- results = {};
426
- for (var key in object) {
427
- if (object.hasOwnProperty(key)) {
428
- var value = callback.call(thisObj || this, object[key], key);
429
- if (value) {
430
- fns.push(value);
431
- if (value instanceof Promise) {
432
- value.then(function (key, value) {
433
- results[key] = value;
434
- }.bind(this, key));
435
- } else {
436
- results[key] = value;
437
- }
438
- }
439
- }
440
- }
441
- }
442
- return Promise.all(fns).then(function () {
443
- return results;
444
- });
445
- }
446
- function resolveURL(url, path) {
447
- // Invalid URL
448
- if (typeof url !== 'string' || url === '') return '';
449
-
450
- // Absolute URL http://,https://,//
451
- if (/^(https?:)?\/\//i.test(url)) {
452
- return url;
453
- }
454
-
455
- // Data URI
456
- if (/^data:.*,.*$/i.test(url)) {
457
- return url;
458
- }
459
-
460
- // Blob URL
461
- if (/^blob:.*$/i.test(url)) {
462
- return url;
463
- }
464
-
465
- // Relative URL
466
- return (path || '') + url;
467
- }
468
-
469
- // Three.js seems too dependent on attribute names so globally
470
- // replace those in the shader code
471
- function replaceTHREEShaderAttributes(shaderText, technique) {
472
- // Expected technique attributes
473
- var attributes = {};
474
- for (var attributeId in technique.attributes) {
475
- var pname = technique.attributes[attributeId];
476
- var param = technique.parameters[pname];
477
- var atype = param.type;
478
- var semantic = param.semantic;
479
- attributes[attributeId] = {
480
- type: atype,
481
- semantic: semantic
482
- };
483
- }
484
-
485
- // Figure out which attributes to change in technique
486
-
487
- var shaderParams = technique.parameters;
488
- var shaderAttributes = technique.attributes;
489
- var params = {};
490
- for (var attributeId in attributes) {
491
- var pname = shaderAttributes[attributeId];
492
- var shaderParam = shaderParams[pname];
493
- var semantic = shaderParam.semantic;
494
- if (semantic) {
495
- params[attributeId] = shaderParam;
496
- }
497
- }
498
- for (var pname in params) {
499
- var param = params[pname];
500
- var semantic = param.semantic;
501
- var regEx = new RegExp("\\b" + pname + "\\b", "g");
502
- switch (semantic) {
503
- case "POSITION":
504
- shaderText = shaderText.replace(regEx, 'position');
505
- break;
506
- case "NORMAL":
507
- shaderText = shaderText.replace(regEx, 'normal');
508
- break;
509
- case 'TEXCOORD_0':
510
- case 'TEXCOORD0':
511
- case 'TEXCOORD':
512
- shaderText = shaderText.replace(regEx, 'uv');
513
- break;
514
- case 'TEXCOORD_1':
515
- shaderText = shaderText.replace(regEx, 'uv2');
516
- break;
517
- case 'COLOR_0':
518
- case 'COLOR0':
519
- case 'COLOR':
520
- shaderText = shaderText.replace(regEx, 'color');
521
- break;
522
- case "WEIGHT":
523
- shaderText = shaderText.replace(regEx, 'skinWeight');
524
- break;
525
- case "JOINT":
526
- shaderText = shaderText.replace(regEx, 'skinIndex');
527
- break;
528
- }
529
- }
530
- return shaderText;
531
- }
532
- function createDefaultMaterial() {
533
- return new THREE.MeshPhongMaterial({
534
- color: 0x00000,
535
- emissive: 0x888888,
536
- specular: 0x000000,
537
- shininess: 0,
538
- transparent: false,
539
- depthTest: true,
540
- side: THREE.FrontSide
541
- });
542
- }
543
-
544
- /**
545
- * Verifies if the shaders are Cesium specific: if they contain attributes, uniforms or functions starting with
546
- * `czm_`. The cesium gltf-pipeline (the ancestor of cesium ion) used to create 3D Tiles tilesets they are only
547
- * defined in Cesium.
548
- * @param {Object} shaders
549
- */
550
- function areShadersCesiumSpecific(shaders) {
551
- for (const shaderId in shaders) {
552
- if (shaders[shaderId].includes('czm_')) {
553
- return true;
554
- }
555
- }
556
- return false;
557
- }
558
-
559
- // Deferred constructor for RawShaderMaterial types
560
- function DeferredShaderMaterial(params) {
561
- this.isDeferredShaderMaterial = true;
562
- this.params = params;
563
- }
564
- DeferredShaderMaterial.prototype.create = function () {
565
- var uniforms = THREE.UniformsUtils.clone(this.params.uniforms);
566
- for (var uniformId in this.params.uniforms) {
567
- var originalUniform = this.params.uniforms[uniformId];
568
- if (originalUniform.value instanceof THREE.Texture) {
569
- uniforms[uniformId].value = originalUniform.value;
570
- uniforms[uniformId].value.needsUpdate = true;
571
- }
572
- uniforms[uniformId].semantic = originalUniform.semantic;
573
- uniforms[uniformId].node = originalUniform.node;
574
- }
575
- this.params.uniforms = uniforms;
576
- return new THREE.RawShaderMaterial(this.params);
577
- };
578
-
579
- /* GLTF PARSER */
580
-
581
- function GLTFParser(json, extensions, options) {
582
- this.json = json || {};
583
- this.extensions = extensions || {};
584
- this.options = options || {};
585
-
586
- // loader object cache
587
- this.cache = new GLTFRegistry();
588
- }
589
- GLTFParser.prototype._withDependencies = function (dependencies) {
590
- var _dependencies = {};
591
- for (var i = 0; i < dependencies.length; i++) {
592
- var dependency = dependencies[i];
593
- var fnName = "load" + dependency.charAt(0).toUpperCase() + dependency.slice(1);
594
- var cached = this.cache.get(dependency);
595
- if (cached !== undefined) {
596
- _dependencies[dependency] = cached;
597
- } else if (this[fnName]) {
598
- var fn = this[fnName]();
599
- this.cache.add(dependency, fn);
600
- _dependencies[dependency] = fn;
601
- }
602
- }
603
- return _each(_dependencies, function (dependency) {
604
- return dependency;
605
- });
606
- };
607
- GLTFParser.prototype.parse = function (callback) {
608
- var json = this.json;
609
-
610
- // Clear the loader cache
611
- this.cache.removeAll();
612
-
613
- // Fire the callback on complete
614
- this._withDependencies(["scenes", "cameras", "animations"]).then(function (dependencies) {
615
- var scenes = [];
616
- for (var name in dependencies.scenes) {
617
- scenes.push(dependencies.scenes[name]);
618
- }
619
- var scene = json.scene !== undefined ? dependencies.scenes[json.scene] : scenes[0];
620
- var cameras = [];
621
- for (var name in dependencies.cameras) {
622
- var camera = dependencies.cameras[name];
623
- cameras.push(camera);
624
- }
625
- var animations = [];
626
- for (var name in dependencies.animations) {
627
- animations.push(dependencies.animations[name]);
628
- }
629
- callback(scene, scenes, cameras, animations);
630
- });
631
- };
632
- GLTFParser.prototype.loadShaders = function () {
633
- var json = this.json;
634
- var extensions = this.extensions;
635
- var options = this.options;
636
- return this._withDependencies(["bufferViews"]).then(function (dependencies) {
637
- return _each(json.shaders, function (shader) {
638
- if (shader.extensions && shader.extensions[EXTENSIONS.KHR_BINARY_GLTF]) {
639
- return extensions[EXTENSIONS.KHR_BINARY_GLTF].loadShader(shader, dependencies.bufferViews);
640
- }
641
- return new Promise(function (resolve) {
642
- var loader = new THREE.FileLoader(options.manager);
643
- loader.setResponseType('text');
644
- loader.load(resolveURL(shader.uri, options.path), function (shaderText) {
645
- resolve(shaderText);
646
- });
647
- });
648
- });
649
- });
650
- };
651
- GLTFParser.prototype.loadBuffers = function () {
652
- var json = this.json;
653
- var extensions = this.extensions;
654
- var options = this.options;
655
- return _each(json.buffers, function (buffer, name) {
656
- if (name === 'binary_glTF' || name === EXTENSIONS.KHR_BINARY_GLTF) {
657
- return extensions[EXTENSIONS.KHR_BINARY_GLTF].body;
658
- }
659
- if (buffer.type === 'arraybuffer' || buffer.type === undefined) {
660
- return new Promise(function (resolve) {
661
- var loader = new THREE.FileLoader(options.manager);
662
- loader.setResponseType('arraybuffer');
663
- loader.load(resolveURL(buffer.uri, options.path), function (buffer) {
664
- resolve(buffer);
665
- });
666
- });
667
- } else {
668
- console.warn('threeExamples.LegacyGLTFLoader: ' + buffer.type + ' buffer type is not supported');
669
- }
670
- });
671
- };
672
- GLTFParser.prototype.loadBufferViews = function () {
673
- var json = this.json;
674
- return this._withDependencies(["buffers"]).then(function (dependencies) {
675
- return _each(json.bufferViews, function (bufferView) {
676
- var arraybuffer = dependencies.buffers[bufferView.buffer];
677
- var byteLength = bufferView.byteLength !== undefined ? bufferView.byteLength : 0;
678
- return arraybuffer.slice(bufferView.byteOffset, bufferView.byteOffset + byteLength);
679
- });
680
- });
681
- };
682
- GLTFParser.prototype.loadAccessors = function () {
683
- var json = this.json;
684
- return this._withDependencies(["bufferViews"]).then(function (dependencies) {
685
- return _each(json.accessors, function (accessor) {
686
- var arraybuffer = dependencies.bufferViews[accessor.bufferView];
687
- var itemSize = WEBGL_TYPE_SIZES[accessor.type];
688
- var TypedArray = WEBGL_COMPONENT_TYPES[accessor.componentType];
689
-
690
- // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.
691
- var elementBytes = TypedArray.BYTES_PER_ELEMENT;
692
- // The buffer is not interleaved if the stride is the item size in bytes.
693
- if (accessor.byteStride && accessor.byteStride !== elementBytes * itemSize) {
694
- // Use the full buffer if it's interleaved.
695
- var array = new TypedArray(arraybuffer);
696
-
697
- // Integer parameters to IB/IBA are in array elements, not bytes.
698
- var ib = new THREE.InterleavedBuffer(array, accessor.byteStride / elementBytes);
699
- return new THREE.InterleavedBufferAttribute(ib, itemSize, accessor.byteOffset / elementBytes);
700
- } else {
701
- array = new TypedArray(arraybuffer, accessor.byteOffset, accessor.count * itemSize);
702
- return new THREE.BufferAttribute(array, itemSize);
703
- }
704
- });
705
- });
706
- };
707
- GLTFParser.prototype.loadTextures = function () {
708
- var json = this.json;
709
- var options = this.options;
710
- return this._withDependencies(["bufferViews"]).then(function (dependencies) {
711
- return _each(json.textures, function (texture) {
712
- if (texture.source) {
713
- return new Promise(function (resolve) {
714
- var source = json.images[texture.source];
715
- var sourceUri = source.uri;
716
- var isObjectURL = false;
717
- if (source.extensions && source.extensions[EXTENSIONS.KHR_BINARY_GLTF]) {
718
- var metadata = source.extensions[EXTENSIONS.KHR_BINARY_GLTF];
719
- var bufferView = dependencies.bufferViews[metadata.bufferView];
720
- var blob = new Blob([bufferView], {
721
- type: metadata.mimeType
722
- });
723
- sourceUri = URL.createObjectURL(blob);
724
- isObjectURL = true;
725
- }
726
- var textureLoader = options.manager.getHandler(sourceUri);
727
- if (textureLoader === null) {
728
- textureLoader = new THREE.TextureLoader(options.manager);
729
- }
730
- textureLoader.setCrossOrigin(options.crossOrigin);
731
- textureLoader.load(resolveURL(sourceUri, options.path), function (_texture) {
732
- if (isObjectURL) URL.revokeObjectURL(sourceUri);
733
- _texture.flipY = false;
734
- if (texture.name !== undefined) _texture.name = texture.name;
735
- _texture.format = texture.format !== undefined ? WEBGL_TEXTURE_FORMATS[texture.format] : THREE.RGBAFormat;
736
- if (texture.internalFormat !== undefined && _texture.format !== WEBGL_TEXTURE_FORMATS[texture.internalFormat]) {
737
- console.warn('threeExamples.LegacyGLTFLoader: Three.js doesn\'t support texture internalFormat which is different from texture format. ' + 'internalFormat will be forced to be the same value as format.');
738
- }
739
- _texture.type = texture.type !== undefined ? WEBGL_TEXTURE_DATATYPES[texture.type] : THREE.UnsignedByteType;
740
- if (texture.sampler) {
741
- var sampler = json.samplers[texture.sampler];
742
- _texture.magFilter = WEBGL_FILTERS[sampler.magFilter] || THREE.LinearFilter;
743
- _texture.minFilter = WEBGL_FILTERS[sampler.minFilter] || THREE.NearestMipmapLinearFilter;
744
- _texture.wrapS = WEBGL_WRAPPINGS[sampler.wrapS] || THREE.RepeatWrapping;
745
- _texture.wrapT = WEBGL_WRAPPINGS[sampler.wrapT] || THREE.RepeatWrapping;
746
- }
747
- resolve(_texture);
748
- }, undefined, function () {
749
- if (isObjectURL) URL.revokeObjectURL(sourceUri);
750
- resolve();
751
- });
752
- });
753
- }
754
- });
755
- });
756
- };
757
- GLTFParser.prototype.loadMaterials = function () {
758
- var json = this.json;
759
- return this._withDependencies(["shaders", "textures"]).then(function (dependencies) {
760
- return _each(json.materials, function (material) {
761
- var materialType;
762
- var materialValues = {};
763
- var materialParams = {};
764
- var khr_material;
765
- if (material.extensions && material.extensions[EXTENSIONS.KHR_MATERIALS_COMMON]) {
766
- khr_material = material.extensions[EXTENSIONS.KHR_MATERIALS_COMMON];
767
- }
768
- if (khr_material) {
769
- // don't copy over unused values to avoid material warning spam
770
- var keys = ['ambient', 'emission', 'transparent', 'transparency', 'doubleSided'];
771
- switch (khr_material.technique) {
772
- case 'BLINN':
773
- case 'PHONG':
774
- materialType = THREE.MeshPhongMaterial;
775
- keys.push('diffuse', 'specular', 'shininess');
776
- break;
777
- case 'LAMBERT':
778
- materialType = THREE.MeshLambertMaterial;
779
- keys.push('diffuse');
780
- break;
781
- case 'CONSTANT':
782
- default:
783
- materialType = THREE.MeshBasicMaterial;
784
- break;
785
- }
786
- keys.forEach(function (v) {
787
- if (khr_material.values[v] !== undefined) materialValues[v] = khr_material.values[v];
788
- });
789
- if (khr_material.doubleSided || materialValues.doubleSided) {
790
- materialParams.side = THREE.DoubleSide;
791
- }
792
- if (khr_material.transparent || materialValues.transparent) {
793
- materialParams.transparent = true;
794
- materialParams.opacity = materialValues.transparency !== undefined ? materialValues.transparency : 1;
795
- }
796
- } else if (material.technique === undefined) {
797
- materialType = THREE.MeshPhongMaterial;
798
- Object.assign(materialValues, material.values);
799
- } else {
800
- const technique = json.techniques[material.technique];
801
-
802
- // If shaders are Cesium specific, set up a MeshBasicMaterial to avoid an error at shader compilation
803
- if (areShadersCesiumSpecific(dependencies.shaders)) {
804
- materialType = THREE.MeshBasicMaterial;
805
-
806
- // Retrieve texture from uniforms so it is not lost in the process.
807
- let texture = null;
808
- const uniforms = technique.uniforms;
809
- for (const uniformId in uniforms) {
810
- const pname = uniforms[uniformId];
811
- const shaderParam = technique.parameters[pname];
812
- const ptype = shaderParam.type;
813
- if (ptype === WEBGL_CONSTANTS.SAMPLER_2D) {
814
- let value;
815
- if (material.values !== undefined) value = material.values[pname];
816
- if (value !== undefined) {
817
- texture = dependencies.textures[value];
818
- } else if (shaderParam.value !== undefined) {
819
- texture = dependencies.textures[shaderParam.value];
820
- }
821
- }
822
- }
823
- if (texture) {
824
- materialParams.map = texture;
825
- }
826
- } else {
827
- materialType = DeferredShaderMaterial;
828
- materialParams.uniforms = {};
829
- var program = json.programs[technique.program];
830
- if (program) {
831
- materialParams.fragmentShader = dependencies.shaders[program.fragmentShader];
832
- if (!materialParams.fragmentShader) {
833
- console.warn("ERROR: Missing fragment shader definition:", program.fragmentShader);
834
- materialType = THREE.MeshPhongMaterial;
835
- }
836
- var vertexShader = dependencies.shaders[program.vertexShader];
837
- if (!vertexShader) {
838
- console.warn("ERROR: Missing vertex shader definition:", program.vertexShader);
839
- materialType = THREE.MeshPhongMaterial;
840
- }
841
-
842
- // IMPORTANT: FIX VERTEX SHADER ATTRIBUTE DEFINITIONS
843
- materialParams.vertexShader = replaceTHREEShaderAttributes(vertexShader, technique);
844
- const uniforms = technique.uniforms;
845
- for (const uniformId in uniforms) {
846
- const pname = uniforms[uniformId];
847
- const shaderParam = technique.parameters[pname];
848
- const ptype = shaderParam.type;
849
- if (WEBGL_TYPE[ptype]) {
850
- const pcount = shaderParam.count;
851
- let value;
852
- if (material.values !== undefined) value = material.values[pname];
853
- var uvalue = new WEBGL_TYPE[ptype]();
854
- var usemantic = shaderParam.semantic;
855
- var unode = shaderParam.node;
856
- switch (ptype) {
857
- case WEBGL_CONSTANTS.FLOAT:
858
- uvalue = shaderParam.value;
859
- if (pname == "transparency") {
860
- materialParams.transparent = true;
861
- }
862
- if (value !== undefined) {
863
- uvalue = value;
864
- }
865
- break;
866
- case WEBGL_CONSTANTS.FLOAT_VEC2:
867
- case WEBGL_CONSTANTS.FLOAT_VEC3:
868
- case WEBGL_CONSTANTS.FLOAT_VEC4:
869
- case WEBGL_CONSTANTS.FLOAT_MAT3:
870
- if (shaderParam && shaderParam.value) {
871
- uvalue.fromArray(shaderParam.value);
872
- }
873
- if (value) {
874
- uvalue.fromArray(value);
875
- }
876
- break;
877
- case WEBGL_CONSTANTS.FLOAT_MAT2:
878
- // what to do?
879
- console.warn("FLOAT_MAT2 is not a supported uniform type");
880
- break;
881
- case WEBGL_CONSTANTS.FLOAT_MAT4:
882
- if (pcount) {
883
- uvalue = new Array(pcount);
884
- for (var mi = 0; mi < pcount; mi++) {
885
- uvalue[mi] = new WEBGL_TYPE[ptype]();
886
- }
887
- if (shaderParam && shaderParam.value) {
888
- var m4v = shaderParam.value;
889
- uvalue.fromArray(m4v);
890
- }
891
- if (value) {
892
- uvalue.fromArray(value);
893
- }
894
- } else {
895
- if (shaderParam && shaderParam.value) {
896
- var m4 = shaderParam.value;
897
- uvalue.fromArray(m4);
898
- }
899
- if (value) {
900
- uvalue.fromArray(value);
901
- }
902
- }
903
- break;
904
- case WEBGL_CONSTANTS.SAMPLER_2D:
905
- if (value !== undefined) {
906
- uvalue = dependencies.textures[value];
907
- } else if (shaderParam.value !== undefined) {
908
- uvalue = dependencies.textures[shaderParam.value];
909
- } else {
910
- uvalue = null;
911
- }
912
- break;
913
- }
914
- materialParams.uniforms[uniformId] = {
915
- value: uvalue,
916
- semantic: usemantic,
917
- node: unode
918
- };
919
- } else {
920
- throw new Error("Unknown shader uniform param type: " + ptype);
921
- }
922
- }
923
- var states = technique.states || {};
924
- var enables = states.enable || [];
925
- var functions = states.functions || {};
926
- var enableCullFace = false;
927
- var enableDepthTest = false;
928
- var enableBlend = false;
929
- for (var i = 0, il = enables.length; i < il; i++) {
930
- var enable = enables[i];
931
- switch (STATES_ENABLES[enable]) {
932
- case 'CULL_FACE':
933
- enableCullFace = true;
934
- break;
935
- case 'DEPTH_TEST':
936
- enableDepthTest = true;
937
- break;
938
- case 'BLEND':
939
- enableBlend = true;
940
- break;
941
-
942
- // TODO: implement
943
- case 'SCISSOR_TEST':
944
- case 'POLYGON_OFFSET_FILL':
945
- case 'SAMPLE_ALPHA_TO_COVERAGE':
946
- break;
947
- default:
948
- throw new Error("Unknown technique.states.enable: " + enable);
949
- }
950
- }
951
- if (enableCullFace) {
952
- materialParams.side = functions.cullFace !== undefined ? WEBGL_SIDES[functions.cullFace] : THREE.FrontSide;
953
- } else {
954
- materialParams.side = THREE.DoubleSide;
955
- }
956
- materialParams.depthTest = enableDepthTest;
957
- materialParams.depthFunc = functions.depthFunc !== undefined ? WEBGL_DEPTH_FUNCS[functions.depthFunc] : THREE.LessDepth;
958
- materialParams.depthWrite = functions.depthMask !== undefined ? functions.depthMask[0] : true;
959
- materialParams.blending = enableBlend ? THREE.CustomBlending : THREE.NoBlending;
960
- materialParams.transparent = enableBlend;
961
- var blendEquationSeparate = functions.blendEquationSeparate;
962
- if (blendEquationSeparate !== undefined) {
963
- materialParams.blendEquation = WEBGL_BLEND_EQUATIONS[blendEquationSeparate[0]];
964
- materialParams.blendEquationAlpha = WEBGL_BLEND_EQUATIONS[blendEquationSeparate[1]];
965
- } else {
966
- materialParams.blendEquation = THREE.AddEquation;
967
- materialParams.blendEquationAlpha = THREE.AddEquation;
968
- }
969
- var blendFuncSeparate = functions.blendFuncSeparate;
970
- if (blendFuncSeparate !== undefined) {
971
- materialParams.blendSrc = WEBGL_BLEND_FUNCS[blendFuncSeparate[0]];
972
- materialParams.blendDst = WEBGL_BLEND_FUNCS[blendFuncSeparate[1]];
973
- materialParams.blendSrcAlpha = WEBGL_BLEND_FUNCS[blendFuncSeparate[2]];
974
- materialParams.blendDstAlpha = WEBGL_BLEND_FUNCS[blendFuncSeparate[3]];
975
- } else {
976
- materialParams.blendSrc = THREE.OneFactor;
977
- materialParams.blendDst = THREE.ZeroFactor;
978
- materialParams.blendSrcAlpha = THREE.OneFactor;
979
- materialParams.blendDstAlpha = THREE.ZeroFactor;
980
- }
981
- }
982
- }
983
- }
984
- if (Array.isArray(materialValues.diffuse)) {
985
- materialParams.color = new THREE.Color().fromArray(materialValues.diffuse);
986
- } else if (typeof materialValues.diffuse === 'string') {
987
- materialParams.map = dependencies.textures[materialValues.diffuse];
988
- }
989
- delete materialParams.diffuse;
990
- if (typeof materialValues.reflective === 'string') {
991
- materialParams.envMap = dependencies.textures[materialValues.reflective];
992
- }
993
- if (typeof materialValues.bump === 'string') {
994
- materialParams.bumpMap = dependencies.textures[materialValues.bump];
995
- }
996
- if (Array.isArray(materialValues.emission)) {
997
- if (materialType === THREE.MeshBasicMaterial) {
998
- materialParams.color = new THREE.Color().fromArray(materialValues.emission);
999
- } else {
1000
- materialParams.emissive = new THREE.Color().fromArray(materialValues.emission);
1001
- }
1002
- } else if (typeof materialValues.emission === 'string') {
1003
- if (materialType === THREE.MeshBasicMaterial) {
1004
- materialParams.map = dependencies.textures[materialValues.emission];
1005
- } else {
1006
- materialParams.emissiveMap = dependencies.textures[materialValues.emission];
1007
- }
1008
- }
1009
- if (Array.isArray(materialValues.specular)) {
1010
- materialParams.specular = new THREE.Color().fromArray(materialValues.specular);
1011
- } else if (typeof materialValues.specular === 'string') {
1012
- materialParams.specularMap = dependencies.textures[materialValues.specular];
1013
- }
1014
- if (materialValues.shininess !== undefined) {
1015
- materialParams.shininess = materialValues.shininess;
1016
- }
1017
- var _material = new materialType(materialParams);
1018
- if (material.name !== undefined) _material.name = material.name;
1019
- return _material;
1020
- });
1021
- });
1022
- };
1023
- GLTFParser.prototype.loadMeshes = function () {
1024
- var json = this.json;
1025
- return this._withDependencies(["accessors", "materials"]).then(function (dependencies) {
1026
- return _each(json.meshes, function (mesh) {
1027
- var group = new THREE.Group();
1028
- if (mesh.name !== undefined) group.name = mesh.name;
1029
- if (mesh.extras) group.userData = mesh.extras;
1030
- var primitives = mesh.primitives || [];
1031
- for (var name in primitives) {
1032
- var primitive = primitives[name];
1033
- if (primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === undefined) {
1034
- var geometry = new THREE.BufferGeometry();
1035
- var attributes = primitive.attributes;
1036
- for (var attributeId in attributes) {
1037
- var attributeEntry = attributes[attributeId];
1038
- if (!attributeEntry) return;
1039
- var bufferAttribute = dependencies.accessors[attributeEntry];
1040
- switch (attributeId) {
1041
- case 'POSITION':
1042
- geometry.setAttribute('position', bufferAttribute);
1043
- break;
1044
- case 'NORMAL':
1045
- geometry.setAttribute('normal', bufferAttribute);
1046
- break;
1047
- case 'TEXCOORD_0':
1048
- case 'TEXCOORD0':
1049
- case 'TEXCOORD':
1050
- geometry.setAttribute('uv', bufferAttribute);
1051
- break;
1052
- case 'TEXCOORD_1':
1053
- geometry.setAttribute('uv2', bufferAttribute);
1054
- break;
1055
- case 'COLOR_0':
1056
- case 'COLOR0':
1057
- case 'COLOR':
1058
- geometry.setAttribute('color', bufferAttribute);
1059
- break;
1060
- case 'WEIGHT':
1061
- geometry.setAttribute('skinWeight', bufferAttribute);
1062
- break;
1063
- case 'JOINT':
1064
- geometry.setAttribute('skinIndex', bufferAttribute);
1065
- break;
1066
- default:
1067
- if (!primitive.material) break;
1068
- var material = json.materials[primitive.material];
1069
- if (!material.technique) break;
1070
- var parameters = json.techniques[material.technique].parameters || {};
1071
- for (var attributeName in parameters) {
1072
- if (parameters[attributeName]['semantic'] === attributeId) {
1073
- geometry.setAttribute(attributeName, bufferAttribute);
1074
- }
1075
- }
1076
- }
1077
- }
1078
- if (primitive.indices) {
1079
- geometry.setIndex(dependencies.accessors[primitive.indices]);
1080
- }
1081
- var material = dependencies.materials !== undefined ? dependencies.materials[primitive.material] : createDefaultMaterial();
1082
- var meshNode = new THREE.Mesh(geometry, material);
1083
- meshNode.castShadow = true;
1084
- meshNode.name = name === "0" ? group.name : group.name + name;
1085
- if (primitive.extras) meshNode.userData = primitive.extras;
1086
- group.add(meshNode);
1087
- } else if (primitive.mode === WEBGL_CONSTANTS.LINES) {
1088
- var geometry = new THREE.BufferGeometry();
1089
- var attributes = primitive.attributes;
1090
- for (var attributeId in attributes) {
1091
- var attributeEntry = attributes[attributeId];
1092
- if (!attributeEntry) return;
1093
- var bufferAttribute = dependencies.accessors[attributeEntry];
1094
- switch (attributeId) {
1095
- case 'POSITION':
1096
- geometry.setAttribute('position', bufferAttribute);
1097
- break;
1098
- case 'COLOR_0':
1099
- case 'COLOR0':
1100
- case 'COLOR':
1101
- geometry.setAttribute('color', bufferAttribute);
1102
- break;
1103
- }
1104
- }
1105
- var material = dependencies.materials[primitive.material];
1106
- var meshNode;
1107
- if (primitive.indices) {
1108
- geometry.setIndex(dependencies.accessors[primitive.indices]);
1109
- meshNode = new THREE.LineSegments(geometry, material);
1110
- } else {
1111
- meshNode = new THREE.Line(geometry, material);
1112
- }
1113
- meshNode.name = name === "0" ? group.name : group.name + name;
1114
- if (primitive.extras) meshNode.userData = primitive.extras;
1115
- group.add(meshNode);
1116
- } else {
1117
- console.warn("Only triangular and line primitives are supported");
1118
- }
1119
- }
1120
- return group;
1121
- });
1122
- });
1123
- };
1124
- GLTFParser.prototype.loadCameras = function () {
1125
- var json = this.json;
1126
- return _each(json.cameras, function (camera) {
1127
- if (camera.type == "perspective" && camera.perspective) {
1128
- var yfov = camera.perspective.yfov;
1129
- var aspectRatio = camera.perspective.aspectRatio !== undefined ? camera.perspective.aspectRatio : 1;
1130
-
1131
- // According to COLLADA spec...
1132
- // aspectRatio = xfov / yfov
1133
-
1134
- var _camera = new THREE.PerspectiveCamera(THREE.MathUtils.radToDeg(yfov * aspectRatio), aspectRatio, camera.perspective.znear || 1, camera.perspective.zfar || 2e6);
1135
- if (camera.name !== undefined) _camera.name = camera.name;
1136
- if (camera.extras) _camera.userData = camera.extras;
1137
- return _camera;
1138
- } else if (camera.type == "orthographic" && camera.orthographic) {
1139
- var _camera = new THREE.OrthographicCamera(window.innerWidth / -2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / -2, camera.orthographic.znear, camera.orthographic.zfar);
1140
- if (camera.name !== undefined) _camera.name = camera.name;
1141
- if (camera.extras) _camera.userData = camera.extras;
1142
- return _camera;
1143
- }
1144
- });
1145
- };
1146
- GLTFParser.prototype.loadSkins = function () {
1147
- var json = this.json;
1148
- return this._withDependencies(["accessors"]).then(function (dependencies) {
1149
- return _each(json.skins, function (skin) {
1150
- var bindShapeMatrix = new THREE.Matrix4();
1151
- if (skin.bindShapeMatrix !== undefined) bindShapeMatrix.fromArray(skin.bindShapeMatrix);
1152
- var _skin = {
1153
- bindShapeMatrix: bindShapeMatrix,
1154
- jointNames: skin.jointNames,
1155
- inverseBindMatrices: dependencies.accessors[skin.inverseBindMatrices]
1156
- };
1157
- return _skin;
1158
- });
1159
- });
1160
- };
1161
- GLTFParser.prototype.loadAnimations = function () {
1162
- var json = this.json;
1163
- return this._withDependencies(["accessors", "nodes"]).then(function (dependencies) {
1164
- return _each(json.animations, function (animation, animationId) {
1165
- var tracks = [];
1166
- for (var channelId in animation.channels) {
1167
- var channel = animation.channels[channelId];
1168
- var sampler = animation.samplers[channel.sampler];
1169
- if (sampler) {
1170
- var target = channel.target;
1171
- var name = target.id;
1172
- var input = animation.parameters !== undefined ? animation.parameters[sampler.input] : sampler.input;
1173
- var output = animation.parameters !== undefined ? animation.parameters[sampler.output] : sampler.output;
1174
- var inputAccessor = dependencies.accessors[input];
1175
- var outputAccessor = dependencies.accessors[output];
1176
- var node = dependencies.nodes[name];
1177
- if (node) {
1178
- node.updateMatrix();
1179
- node.matrixAutoUpdate = true;
1180
- var TypedKeyframeTrack = PATH_PROPERTIES[target.path] === PATH_PROPERTIES.rotation ? THREE.QuaternionKeyframeTrack : THREE.VectorKeyframeTrack;
1181
- var targetName = node.name ? node.name : node.uuid;
1182
- var interpolation = sampler.interpolation !== undefined ? INTERPOLATION[sampler.interpolation] : THREE.InterpolateLinear;
1183
-
1184
- // KeyframeTrack.optimize() will modify given 'times' and 'values'
1185
- // buffers before creating a truncated copy to keep. Because buffers may
1186
- // be reused by other tracks, make copies here.
1187
- tracks.push(new TypedKeyframeTrack(targetName + '.' + PATH_PROPERTIES[target.path], inputAccessor.array.slice(), outputAccessor.array.slice(), interpolation));
1188
- }
1189
- }
1190
- }
1191
- var name = animation.name !== undefined ? animation.name : "animation_" + animationId;
1192
- return new THREE.AnimationClip(name, undefined, tracks);
1193
- });
1194
- });
1195
- };
1196
- GLTFParser.prototype.loadNodes = function () {
1197
- var json = this.json;
1198
- var extensions = this.extensions;
1199
- var scope = this;
1200
- return _each(json.nodes, function (node) {
1201
- var matrix = new THREE.Matrix4();
1202
- var _node;
1203
- if (node.jointName) {
1204
- _node = new THREE.Bone();
1205
- _node.name = node.name !== undefined ? node.name : node.jointName;
1206
- _node.jointName = node.jointName;
1207
- } else {
1208
- _node = new THREE.Object3D();
1209
- if (node.name !== undefined) _node.name = node.name;
1210
- }
1211
- if (node.extras) _node.userData = node.extras;
1212
- if (node.matrix !== undefined) {
1213
- matrix.fromArray(node.matrix);
1214
- _node.applyMatrix4(matrix);
1215
- } else {
1216
- if (node.translation !== undefined) {
1217
- _node.position.fromArray(node.translation);
1218
- }
1219
- if (node.rotation !== undefined) {
1220
- _node.quaternion.fromArray(node.rotation);
1221
- }
1222
- if (node.scale !== undefined) {
1223
- _node.scale.fromArray(node.scale);
1224
- }
1225
- }
1226
- return _node;
1227
- }).then(function (__nodes) {
1228
- return scope._withDependencies(["meshes", "skins", "cameras"]).then(function (dependencies) {
1229
- return _each(__nodes, function (_node, nodeId) {
1230
- var node = json.nodes[nodeId];
1231
- if (node.meshes !== undefined) {
1232
- for (var meshId in node.meshes) {
1233
- var mesh = node.meshes[meshId];
1234
- var group = dependencies.meshes[mesh];
1235
- if (group === undefined) {
1236
- console.warn('LegacyGLTFLoader: Couldn\'t find node "' + mesh + '".');
1237
- continue;
1238
- }
1239
- for (var childrenId in group.children) {
1240
- var child = group.children[childrenId];
1241
-
1242
- // clone Mesh to add to _node
1243
-
1244
- var originalMaterial = child.material;
1245
- var originalGeometry = child.geometry;
1246
- var originalUserData = child.userData;
1247
- var originalName = child.name;
1248
- var material;
1249
- if (originalMaterial.isDeferredShaderMaterial) {
1250
- originalMaterial = material = originalMaterial.create();
1251
- } else {
1252
- material = originalMaterial;
1253
- }
1254
- switch (child.type) {
1255
- case 'LineSegments':
1256
- child = new THREE.LineSegments(originalGeometry, material);
1257
- break;
1258
- case 'LineLoop':
1259
- child = new THREE.LineLoop(originalGeometry, material);
1260
- break;
1261
- case 'Line':
1262
- child = new THREE.Line(originalGeometry, material);
1263
- break;
1264
- default:
1265
- child = new THREE.Mesh(originalGeometry, material);
1266
- }
1267
- child.castShadow = true;
1268
- child.userData = originalUserData;
1269
- child.name = originalName;
1270
- var skinEntry;
1271
- if (node.skin) {
1272
- skinEntry = dependencies.skins[node.skin];
1273
- }
1274
-
1275
- // Replace Mesh with SkinnedMesh in library
1276
- if (skinEntry) {
1277
- var getJointNode = function (jointId) {
1278
- var keys = Object.keys(__nodes);
1279
- for (var i = 0, il = keys.length; i < il; i++) {
1280
- var n = __nodes[keys[i]];
1281
- if (n.jointName === jointId) return n;
1282
- }
1283
- return null;
1284
- };
1285
- var geometry = originalGeometry;
1286
- var material = originalMaterial;
1287
- material.skinning = true;
1288
- child = new THREE.SkinnedMesh(geometry, material);
1289
- child.castShadow = true;
1290
- child.userData = originalUserData;
1291
- child.name = originalName;
1292
- var bones = [];
1293
- var boneInverses = [];
1294
- for (var i = 0, l = skinEntry.jointNames.length; i < l; i++) {
1295
- var jointId = skinEntry.jointNames[i];
1296
- var jointNode = getJointNode(jointId);
1297
- if (jointNode) {
1298
- bones.push(jointNode);
1299
- var m = skinEntry.inverseBindMatrices.array;
1300
- var mat = new THREE.Matrix4().fromArray(m, i * 16);
1301
- boneInverses.push(mat);
1302
- } else {
1303
- console.warn("WARNING: joint: '" + jointId + "' could not be found");
1304
- }
1305
- }
1306
- child.bind(new THREE.Skeleton(bones, boneInverses), skinEntry.bindShapeMatrix);
1307
- var buildBoneGraph = function (parentJson, parentObject, property) {
1308
- var children = parentJson[property];
1309
- if (children === undefined) return;
1310
- for (var i = 0, il = children.length; i < il; i++) {
1311
- var nodeId = children[i];
1312
- var bone = __nodes[nodeId];
1313
- var boneJson = json.nodes[nodeId];
1314
- if (bone !== undefined && bone.isBone === true && boneJson !== undefined) {
1315
- parentObject.add(bone);
1316
- buildBoneGraph(boneJson, bone, 'children');
1317
- }
1318
- }
1319
- };
1320
- buildBoneGraph(node, child, 'skeletons');
1321
- }
1322
- _node.add(child);
1323
- }
1324
- }
1325
- }
1326
- if (node.camera !== undefined) {
1327
- var camera = dependencies.cameras[node.camera];
1328
- _node.add(camera);
1329
- }
1330
- if (node.extensions && node.extensions[EXTENSIONS.KHR_MATERIALS_COMMON] && node.extensions[EXTENSIONS.KHR_MATERIALS_COMMON].light) {
1331
- var extensionLights = extensions[EXTENSIONS.KHR_MATERIALS_COMMON].lights;
1332
- var light = extensionLights[node.extensions[EXTENSIONS.KHR_MATERIALS_COMMON].light];
1333
- _node.add(light);
1334
- }
1335
- return _node;
1336
- });
1337
- });
1338
- });
1339
- };
1340
- GLTFParser.prototype.loadScenes = function () {
1341
- var json = this.json;
1342
- var extensions = this.extensions;
1343
-
1344
- // scene node hierachy builder
1345
-
1346
- function buildNodeHierachy(nodeId, parentObject, allNodes) {
1347
- var _node = allNodes[nodeId];
1348
- parentObject.add(_node);
1349
- var node = json.nodes[nodeId];
1350
- if (node.children) {
1351
- var children = node.children;
1352
- for (var i = 0, l = children.length; i < l; i++) {
1353
- var child = children[i];
1354
- buildNodeHierachy(child, _node, allNodes);
1355
- }
1356
- }
1357
- }
1358
- return this._withDependencies(["nodes"]).then(function (dependencies) {
1359
- return _each(json.scenes, function (scene) {
1360
- var _scene = new THREE.Scene();
1361
- if (scene.name !== undefined) _scene.name = scene.name;
1362
- if (scene.extras) _scene.userData = scene.extras;
1363
- var nodes = scene.nodes || [];
1364
- for (var i = 0, l = nodes.length; i < l; i++) {
1365
- var nodeId = nodes[i];
1366
- buildNodeHierachy(nodeId, _scene, dependencies.nodes);
1367
- }
1368
- _scene.traverse(function (child) {
1369
- // Register raw material meshes with LegacyGLTFLoader.Shaders
1370
- if (child.material && child.material.isRawShaderMaterial) {
1371
- child.gltfShader = new GLTFShader(child, dependencies.nodes);
1372
- child.onBeforeRender = function (renderer, scene, camera) {
1373
- this.gltfShader.update(scene, camera);
1374
- };
1375
- }
1376
- });
1377
- if (extensions[EXTENSIONS.CESIUM_RTC]) {
1378
- _scene.position.fromArray(extensions[EXTENSIONS.CESIUM_RTC].center);
1379
- }
1380
- return _scene;
1381
- });
1382
- });
1383
- };
1384
- return LegacyGLTFLoader;
1385
- }();
1386
- export default threeExamples.LegacyGLTFLoader;