itowns 2.44.3-next.9 → 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 (214) hide show
  1. package/README.md +3 -129
  2. package/examples/3dtiles_loader.html +20 -6
  3. package/examples/config.json +1 -0
  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/jsm/.eslintrc.cjs +0 -38
  43. package/lib/Controls/FirstPersonControls.js +0 -308
  44. package/lib/Controls/FlyControls.js +0 -175
  45. package/lib/Controls/GlobeControls.js +0 -1162
  46. package/lib/Controls/PlanarControls.js +0 -1025
  47. package/lib/Controls/StateControl.js +0 -429
  48. package/lib/Controls/StreetControls.js +0 -392
  49. package/lib/Converter/Feature2Mesh.js +0 -615
  50. package/lib/Converter/Feature2Texture.js +0 -170
  51. package/lib/Converter/convertToTile.js +0 -75
  52. package/lib/Converter/textureConverter.js +0 -44
  53. package/lib/Core/3DTiles/C3DTBatchTable.js +0 -131
  54. package/lib/Core/3DTiles/C3DTBatchTableHierarchyExtension.js +0 -96
  55. package/lib/Core/3DTiles/C3DTBoundingVolume.js +0 -157
  56. package/lib/Core/3DTiles/C3DTExtensions.js +0 -97
  57. package/lib/Core/3DTiles/C3DTFeature.js +0 -110
  58. package/lib/Core/3DTiles/C3DTilesEnums.js +0 -20
  59. package/lib/Core/3DTiles/C3DTileset.js +0 -99
  60. package/lib/Core/3DTiles/utils/BinaryPropertyAccessor.js +0 -100
  61. package/lib/Core/AnimationPlayer.js +0 -142
  62. package/lib/Core/CopcNode.js +0 -174
  63. package/lib/Core/Deprecated/Undeprecator.js +0 -75
  64. package/lib/Core/EntwinePointTileNode.js +0 -126
  65. package/lib/Core/Feature.js +0 -490
  66. package/lib/Core/Geographic/CoordStars.js +0 -80
  67. package/lib/Core/Geographic/Coordinates.js +0 -320
  68. package/lib/Core/Geographic/Crs.js +0 -175
  69. package/lib/Core/Geographic/Extent.js +0 -534
  70. package/lib/Core/Geographic/GeoidGrid.js +0 -109
  71. package/lib/Core/Label.js +0 -222
  72. package/lib/Core/MainLoop.js +0 -211
  73. package/lib/Core/Math/Ellipsoid.js +0 -144
  74. package/lib/Core/Picking.js +0 -255
  75. package/lib/Core/PointCloudNode.js +0 -42
  76. package/lib/Core/Potree2Node.js +0 -206
  77. package/lib/Core/Potree2PointAttributes.js +0 -139
  78. package/lib/Core/PotreeNode.js +0 -101
  79. package/lib/Core/Prefab/Globe/Atmosphere.js +0 -299
  80. package/lib/Core/Prefab/Globe/BuilderEllipsoidTile.js +0 -110
  81. package/lib/Core/Prefab/Globe/GlobeLayer.js +0 -145
  82. package/lib/Core/Prefab/Globe/SkyShader.js +0 -78
  83. package/lib/Core/Prefab/GlobeView.js +0 -161
  84. package/lib/Core/Prefab/Planar/PlanarLayer.js +0 -53
  85. package/lib/Core/Prefab/Planar/PlanarTileBuilder.js +0 -72
  86. package/lib/Core/Prefab/PlanarView.js +0 -62
  87. package/lib/Core/Prefab/TileBuilder.js +0 -80
  88. package/lib/Core/Prefab/computeBufferTileGeometry.js +0 -183
  89. package/lib/Core/Scheduler/Cache.js +0 -256
  90. package/lib/Core/Scheduler/CancelledCommandException.js +0 -15
  91. package/lib/Core/Scheduler/Scheduler.js +0 -294
  92. package/lib/Core/Style.js +0 -1121
  93. package/lib/Core/System/Capabilities.js +0 -63
  94. package/lib/Core/Tile/Tile.js +0 -219
  95. package/lib/Core/Tile/TileGrid.js +0 -46
  96. package/lib/Core/TileGeometry.js +0 -40
  97. package/lib/Core/TileMesh.js +0 -109
  98. package/lib/Core/View.js +0 -1109
  99. package/lib/Layer/C3DTilesLayer.js +0 -456
  100. package/lib/Layer/ColorLayer.js +0 -128
  101. package/lib/Layer/CopcLayer.js +0 -58
  102. package/lib/Layer/ElevationLayer.js +0 -107
  103. package/lib/Layer/EntwinePointTileLayer.js +0 -64
  104. package/lib/Layer/FeatureGeometryLayer.js +0 -63
  105. package/lib/Layer/GeoidLayer.js +0 -80
  106. package/lib/Layer/GeometryLayer.js +0 -202
  107. package/lib/Layer/InfoLayer.js +0 -64
  108. package/lib/Layer/LabelLayer.js +0 -456
  109. package/lib/Layer/Layer.js +0 -304
  110. package/lib/Layer/LayerUpdateState.js +0 -89
  111. package/lib/Layer/LayerUpdateStrategy.js +0 -80
  112. package/lib/Layer/OGC3DTilesLayer.js +0 -412
  113. package/lib/Layer/OrientedImageLayer.js +0 -222
  114. package/lib/Layer/PointCloudLayer.js +0 -359
  115. package/lib/Layer/Potree2Layer.js +0 -164
  116. package/lib/Layer/PotreeLayer.js +0 -65
  117. package/lib/Layer/RasterLayer.js +0 -27
  118. package/lib/Layer/ReferencingLayerProperties.js +0 -62
  119. package/lib/Layer/TiledGeometryLayer.js +0 -403
  120. package/lib/Loader/LASLoader.js +0 -193
  121. package/lib/Loader/Potree2BrotliLoader.js +0 -261
  122. package/lib/Loader/Potree2Loader.js +0 -207
  123. package/lib/Main.js +0 -115
  124. package/lib/MainBundle.js +0 -4
  125. package/lib/Parser/B3dmParser.js +0 -174
  126. package/lib/Parser/CameraCalibrationParser.js +0 -94
  127. package/lib/Parser/GDFParser.js +0 -72
  128. package/lib/Parser/GTXParser.js +0 -75
  129. package/lib/Parser/GeoJsonParser.js +0 -212
  130. package/lib/Parser/GpxParser.js +0 -25
  131. package/lib/Parser/ISGParser.js +0 -71
  132. package/lib/Parser/KMLParser.js +0 -25
  133. package/lib/Parser/LASParser.js +0 -137
  134. package/lib/Parser/MapBoxUrlParser.js +0 -83
  135. package/lib/Parser/PntsParser.js +0 -131
  136. package/lib/Parser/Potree2BinParser.js +0 -92
  137. package/lib/Parser/PotreeBinParser.js +0 -106
  138. package/lib/Parser/PotreeCinParser.js +0 -29
  139. package/lib/Parser/ShapefileParser.js +0 -78
  140. package/lib/Parser/VectorTileParser.js +0 -202
  141. package/lib/Parser/XbilParser.js +0 -119
  142. package/lib/Parser/deprecated/LegacyGLTFLoader.js +0 -1386
  143. package/lib/Parser/iGLTFLoader.js +0 -168
  144. package/lib/Process/3dTilesProcessing.js +0 -304
  145. package/lib/Process/FeatureProcessing.js +0 -76
  146. package/lib/Process/LayeredMaterialNodeProcessing.js +0 -221
  147. package/lib/Process/ObjectRemovalHelper.js +0 -97
  148. package/lib/Process/handlerNodeError.js +0 -23
  149. package/lib/Provider/3dTilesProvider.js +0 -149
  150. package/lib/Provider/DataSourceProvider.js +0 -8
  151. package/lib/Provider/Fetcher.js +0 -229
  152. package/lib/Provider/PointCloudProvider.js +0 -45
  153. package/lib/Provider/TileProvider.js +0 -16
  154. package/lib/Provider/URLBuilder.js +0 -116
  155. package/lib/Renderer/Camera.js +0 -281
  156. package/lib/Renderer/Color.js +0 -56
  157. package/lib/Renderer/ColorLayersOrdering.js +0 -115
  158. package/lib/Renderer/CommonMaterial.js +0 -31
  159. package/lib/Renderer/Label2DRenderer.js +0 -190
  160. package/lib/Renderer/LayeredMaterial.js +0 -243
  161. package/lib/Renderer/OBB.js +0 -153
  162. package/lib/Renderer/OrientedImageCamera.js +0 -118
  163. package/lib/Renderer/OrientedImageMaterial.js +0 -167
  164. package/lib/Renderer/PointsMaterial.js +0 -485
  165. package/lib/Renderer/RasterTile.js +0 -209
  166. package/lib/Renderer/RenderMode.js +0 -31
  167. package/lib/Renderer/Shader/ShaderChunk.js +0 -160
  168. package/lib/Renderer/Shader/ShaderUtils.js +0 -47
  169. package/lib/Renderer/SphereHelper.js +0 -23
  170. package/lib/Renderer/WebXR.js +0 -51
  171. package/lib/Renderer/c3DEngine.js +0 -214
  172. package/lib/Source/C3DTilesGoogleSource.js +0 -74
  173. package/lib/Source/C3DTilesIonSource.js +0 -54
  174. package/lib/Source/C3DTilesSource.js +0 -30
  175. package/lib/Source/CopcSource.js +0 -115
  176. package/lib/Source/EntwinePointTileSource.js +0 -62
  177. package/lib/Source/FileSource.js +0 -189
  178. package/lib/Source/OGC3DTilesGoogleSource.js +0 -29
  179. package/lib/Source/OGC3DTilesIonSource.js +0 -34
  180. package/lib/Source/OGC3DTilesSource.js +0 -21
  181. package/lib/Source/OrientedImageSource.js +0 -59
  182. package/lib/Source/Potree2Source.js +0 -167
  183. package/lib/Source/PotreeSource.js +0 -82
  184. package/lib/Source/Source.js +0 -223
  185. package/lib/Source/TMSSource.js +0 -145
  186. package/lib/Source/VectorTilesSource.js +0 -178
  187. package/lib/Source/WFSSource.js +0 -168
  188. package/lib/Source/WMSSource.js +0 -133
  189. package/lib/Source/WMTSSource.js +0 -86
  190. package/lib/ThreeExtended/capabilities/WebGL.js +0 -69
  191. package/lib/ThreeExtended/libs/ktx-parse.module.js +0 -470
  192. package/lib/ThreeExtended/libs/zstddec.module.js +0 -29
  193. package/lib/ThreeExtended/loaders/DDSLoader.js +0 -200
  194. package/lib/ThreeExtended/loaders/DRACOLoader.js +0 -399
  195. package/lib/ThreeExtended/loaders/GLTFLoader.js +0 -2876
  196. package/lib/ThreeExtended/loaders/KTX2Loader.js +0 -625
  197. package/lib/ThreeExtended/utils/BufferGeometryUtils.js +0 -846
  198. package/lib/ThreeExtended/utils/WorkerPool.js +0 -70
  199. package/lib/Utils/CameraUtils.js +0 -555
  200. package/lib/Utils/DEMUtils.js +0 -350
  201. package/lib/Utils/FeaturesUtils.js +0 -156
  202. package/lib/Utils/Gradients.js +0 -16
  203. package/lib/Utils/OrientationUtils.js +0 -457
  204. package/lib/Utils/ThreeUtils.js +0 -115
  205. package/lib/Utils/gui/C3DTilesStyle.js +0 -215
  206. package/lib/Utils/gui/Main.js +0 -7
  207. package/lib/Utils/gui/Minimap.js +0 -154
  208. package/lib/Utils/gui/Navigation.js +0 -245
  209. package/lib/Utils/gui/Scale.js +0 -107
  210. package/lib/Utils/gui/Searchbar.js +0 -234
  211. package/lib/Utils/gui/Widget.js +0 -80
  212. package/lib/Utils/placeObjectOnGround.js +0 -137
  213. package/lib/Worker/LASLoaderWorker.js +0 -19
  214. 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;