@jdultra/threedtiles 8.0.1 → 9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -2
- package/dist/threedtiles.min.js +2 -0
- package/package.json +17 -13
- package/.babelrc +0 -8
- package/.vscode/settings.json +0 -2
- package/index.html +0 -56
- package/src/decoder/B3DMDecoder.js +0 -125
- package/src/decoder/FeatureTable.js +0 -169
- package/src/decoder/LegacyGLTFLoader.js +0 -2216
- package/src/geometry/obb.js +0 -47
- package/src/images/skybox/back.png +0 -0
- package/src/images/skybox/bottom.png +0 -0
- package/src/images/skybox/front.png +0 -0
- package/src/images/skybox/left.png +0 -0
- package/src/images/skybox/right.png +0 -0
- package/src/images/skybox/top.png +0 -0
- package/src/index.js +0 -331
- package/src/tileset/OGC3DTile.js +0 -676
- package/src/tileset/OcclusionCullingService.js +0 -79
- package/src/tileset/TileLoader.js +0 -381
- package/src/tileset/instanced/InstancedOGC3DTile.js +0 -55
- package/src/tileset/instanced/InstancedTile.js +0 -588
- package/src/tileset/instanced/InstancedTileLoader.js +0 -396
- package/src/tileset/instanced/JsonTile.js +0 -41
- package/src/tileset/instanced/MeshTile.js +0 -81
- package/threedtiles.js +0 -82894
- package/threedtiles.js.map +0 -1
- package/webpack.config.js +0 -142
|
@@ -1,2216 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @author Rich Tibbett / https://github.com/richtr
|
|
3
|
-
* @author mrdoob / http://mrdoob.com/
|
|
4
|
-
* @author Tony Parisi / http://www.tonyparisi.com/
|
|
5
|
-
* @author Takahiro / https://github.com/takahirox
|
|
6
|
-
*/
|
|
7
|
-
import * as THREE from 'three';
|
|
8
|
-
const LegacyGLTFLoader = ( function () {
|
|
9
|
-
|
|
10
|
-
function LegacyGLTFLoader( manager ) {
|
|
11
|
-
|
|
12
|
-
this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
LegacyGLTFLoader.prototype = {
|
|
17
|
-
|
|
18
|
-
constructor: LegacyGLTFLoader,
|
|
19
|
-
|
|
20
|
-
load: function ( url, onLoad, onProgress, onError ) {
|
|
21
|
-
|
|
22
|
-
var scope = this;
|
|
23
|
-
|
|
24
|
-
var path = this.path && ( typeof this.path === "string" ) ? this.path : THREE.Loader.prototype.extractUrlBase( url );
|
|
25
|
-
|
|
26
|
-
var loader = new THREE.FileLoader( scope.manager );
|
|
27
|
-
|
|
28
|
-
loader.setResponseType( 'arraybuffer' );
|
|
29
|
-
|
|
30
|
-
loader.load( url, function ( data ) {
|
|
31
|
-
|
|
32
|
-
scope.parse( data, onLoad, path );
|
|
33
|
-
|
|
34
|
-
}, onProgress, onError );
|
|
35
|
-
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
setCrossOrigin: function ( value ) {
|
|
39
|
-
|
|
40
|
-
this.crossOrigin = value;
|
|
41
|
-
|
|
42
|
-
},
|
|
43
|
-
|
|
44
|
-
setPath: function ( value ) {
|
|
45
|
-
|
|
46
|
-
this.path = value;
|
|
47
|
-
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
parse: function ( data, callback, path ) {
|
|
51
|
-
|
|
52
|
-
var content;
|
|
53
|
-
var extensions = {};
|
|
54
|
-
|
|
55
|
-
var magic = convertUint8ArrayToString( new Uint8Array( data, 0, 4 ) );
|
|
56
|
-
|
|
57
|
-
if ( magic === BINARY_EXTENSION_HEADER_DEFAULTS.magic ) {
|
|
58
|
-
|
|
59
|
-
extensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );
|
|
60
|
-
content = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content;
|
|
61
|
-
|
|
62
|
-
} else {
|
|
63
|
-
|
|
64
|
-
content = convertUint8ArrayToString( new Uint8Array( data ) );
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
var json = JSON.parse( content );
|
|
69
|
-
|
|
70
|
-
if ( json.extensionsUsed && json.extensionsUsed.indexOf( EXTENSIONS.KHR_MATERIALS_COMMON ) >= 0 ) {
|
|
71
|
-
|
|
72
|
-
extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ] = new GLTFMaterialsCommonExtension( json );
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
console.time( 'LegacyGLTFLoader' );
|
|
77
|
-
|
|
78
|
-
var parser = new GLTFParser( json, extensions, {
|
|
79
|
-
|
|
80
|
-
path: path || this.path,
|
|
81
|
-
crossOrigin: this.crossOrigin
|
|
82
|
-
|
|
83
|
-
} );
|
|
84
|
-
|
|
85
|
-
parser.parse( function ( scene, scenes, cameras, animations ) {
|
|
86
|
-
|
|
87
|
-
console.timeEnd( 'LegacyGLTFLoader' );
|
|
88
|
-
|
|
89
|
-
var glTF = {
|
|
90
|
-
"scene": scene,
|
|
91
|
-
"scenes": scenes,
|
|
92
|
-
"cameras": cameras,
|
|
93
|
-
"animations": animations
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
callback( glTF );
|
|
97
|
-
|
|
98
|
-
} );
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
/* GLTFREGISTRY */
|
|
105
|
-
|
|
106
|
-
function GLTFRegistry() {
|
|
107
|
-
|
|
108
|
-
var objects = {};
|
|
109
|
-
|
|
110
|
-
return {
|
|
111
|
-
|
|
112
|
-
get: function ( key ) {
|
|
113
|
-
|
|
114
|
-
return objects[ key ];
|
|
115
|
-
|
|
116
|
-
},
|
|
117
|
-
|
|
118
|
-
add: function ( key, object ) {
|
|
119
|
-
|
|
120
|
-
objects[ key ] = object;
|
|
121
|
-
|
|
122
|
-
},
|
|
123
|
-
|
|
124
|
-
remove: function ( key ) {
|
|
125
|
-
|
|
126
|
-
delete objects[ key ];
|
|
127
|
-
|
|
128
|
-
},
|
|
129
|
-
|
|
130
|
-
removeAll: function () {
|
|
131
|
-
|
|
132
|
-
objects = {};
|
|
133
|
-
|
|
134
|
-
},
|
|
135
|
-
|
|
136
|
-
update: function ( scene, camera ) {
|
|
137
|
-
|
|
138
|
-
for ( var name in objects ) {
|
|
139
|
-
|
|
140
|
-
var object = objects[ name ];
|
|
141
|
-
|
|
142
|
-
if ( object.update ) {
|
|
143
|
-
|
|
144
|
-
object.update( scene, camera );
|
|
145
|
-
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/* GLTFSHADERS */
|
|
157
|
-
|
|
158
|
-
LegacyGLTFLoader.Shaders = {
|
|
159
|
-
|
|
160
|
-
update: function () {
|
|
161
|
-
|
|
162
|
-
console.warn( 'THREE.LegacyGLTFLoader.Shaders has been deprecated, and now updates automatically.' );
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
/* GLTFSHADER */
|
|
169
|
-
|
|
170
|
-
function GLTFShader( targetNode, allNodes ) {
|
|
171
|
-
|
|
172
|
-
var boundUniforms = {};
|
|
173
|
-
|
|
174
|
-
// bind each uniform to its source node
|
|
175
|
-
|
|
176
|
-
var uniforms = targetNode.material.uniforms;
|
|
177
|
-
|
|
178
|
-
for ( var uniformId in uniforms ) {
|
|
179
|
-
|
|
180
|
-
var uniform = uniforms[ uniformId ];
|
|
181
|
-
|
|
182
|
-
if ( uniform.semantic ) {
|
|
183
|
-
|
|
184
|
-
var sourceNodeRef = uniform.node;
|
|
185
|
-
|
|
186
|
-
var sourceNode = targetNode;
|
|
187
|
-
|
|
188
|
-
if ( sourceNodeRef ) {
|
|
189
|
-
|
|
190
|
-
sourceNode = allNodes[ sourceNodeRef ];
|
|
191
|
-
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
boundUniforms[ uniformId ] = {
|
|
195
|
-
semantic: uniform.semantic,
|
|
196
|
-
sourceNode: sourceNode,
|
|
197
|
-
targetNode: targetNode,
|
|
198
|
-
uniform: uniform
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
this.boundUniforms = boundUniforms;
|
|
206
|
-
this._m4 = new THREE.Matrix4();
|
|
207
|
-
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Update - update all the uniform values
|
|
211
|
-
GLTFShader.prototype.update = function ( scene, camera ) {
|
|
212
|
-
|
|
213
|
-
var boundUniforms = this.boundUniforms;
|
|
214
|
-
|
|
215
|
-
for ( var name in boundUniforms ) {
|
|
216
|
-
|
|
217
|
-
var boundUniform = boundUniforms[ name ];
|
|
218
|
-
|
|
219
|
-
switch ( boundUniform.semantic ) {
|
|
220
|
-
|
|
221
|
-
case "MODELVIEW":
|
|
222
|
-
|
|
223
|
-
var m4 = boundUniform.uniform.value;
|
|
224
|
-
m4.multiplyMatrices( camera.matrixWorldInverse, boundUniform.sourceNode.matrixWorld );
|
|
225
|
-
break;
|
|
226
|
-
|
|
227
|
-
case "MODELVIEWINVERSETRANSPOSE":
|
|
228
|
-
|
|
229
|
-
var m3 = boundUniform.uniform.value;
|
|
230
|
-
this._m4.multiplyMatrices( camera.matrixWorldInverse, boundUniform.sourceNode.matrixWorld );
|
|
231
|
-
m3.getNormalMatrix( this._m4 );
|
|
232
|
-
break;
|
|
233
|
-
|
|
234
|
-
case "PROJECTION":
|
|
235
|
-
|
|
236
|
-
var m4 = boundUniform.uniform.value;
|
|
237
|
-
m4.copy( camera.projectionMatrix );
|
|
238
|
-
break;
|
|
239
|
-
|
|
240
|
-
case "JOINTMATRIX":
|
|
241
|
-
|
|
242
|
-
var m4v = boundUniform.uniform.value;
|
|
243
|
-
|
|
244
|
-
for ( var mi = 0; mi < m4v.length; mi ++ ) {
|
|
245
|
-
|
|
246
|
-
// So it goes like this:
|
|
247
|
-
// SkinnedMesh world matrix is already baked into MODELVIEW;
|
|
248
|
-
// transform joints to local space,
|
|
249
|
-
// then transform using joint's inverse
|
|
250
|
-
m4v[ mi ]
|
|
251
|
-
.getInverse( boundUniform.sourceNode.matrixWorld )
|
|
252
|
-
.multiply( boundUniform.targetNode.skeleton.bones[ mi ].matrixWorld )
|
|
253
|
-
.multiply( boundUniform.targetNode.skeleton.boneInverses[ mi ] )
|
|
254
|
-
.multiply( boundUniform.targetNode.bindMatrix );
|
|
255
|
-
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
break;
|
|
259
|
-
|
|
260
|
-
default :
|
|
261
|
-
|
|
262
|
-
console.warn( "Unhandled shader semantic: " + boundUniform.semantic );
|
|
263
|
-
break;
|
|
264
|
-
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
};
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
/* ANIMATION */
|
|
273
|
-
|
|
274
|
-
LegacyGLTFLoader.Animations = {
|
|
275
|
-
|
|
276
|
-
update: function () {
|
|
277
|
-
|
|
278
|
-
console.warn( 'THREE.LegacyGLTFLoader.Animation has been deprecated. Use THREE.AnimationMixer instead.' );
|
|
279
|
-
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
/*********************************/
|
|
285
|
-
/********** EXTENSIONS ***********/
|
|
286
|
-
/*********************************/
|
|
287
|
-
|
|
288
|
-
var EXTENSIONS = {
|
|
289
|
-
KHR_BINARY_GLTF: 'KHR_binary_glTF',
|
|
290
|
-
KHR_MATERIALS_COMMON: 'KHR_materials_common'
|
|
291
|
-
};
|
|
292
|
-
|
|
293
|
-
/* MATERIALS COMMON EXTENSION */
|
|
294
|
-
|
|
295
|
-
function GLTFMaterialsCommonExtension( json ) {
|
|
296
|
-
|
|
297
|
-
this.name = EXTENSIONS.KHR_MATERIALS_COMMON;
|
|
298
|
-
|
|
299
|
-
this.lights = {};
|
|
300
|
-
|
|
301
|
-
var extension = ( json.extensions && json.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ] ) || {};
|
|
302
|
-
var lights = extension.lights || {};
|
|
303
|
-
|
|
304
|
-
for ( var lightId in lights ) {
|
|
305
|
-
|
|
306
|
-
var light = lights[ lightId ];
|
|
307
|
-
var lightNode;
|
|
308
|
-
|
|
309
|
-
var lightParams = light[ light.type ];
|
|
310
|
-
var color = new THREE.Color().fromArray( lightParams.color );
|
|
311
|
-
|
|
312
|
-
switch ( light.type ) {
|
|
313
|
-
|
|
314
|
-
case "directional":
|
|
315
|
-
lightNode = new THREE.DirectionalLight( color );
|
|
316
|
-
lightNode.position.set( 0, 0, 1 );
|
|
317
|
-
break;
|
|
318
|
-
|
|
319
|
-
case "point":
|
|
320
|
-
lightNode = new THREE.PointLight( color );
|
|
321
|
-
break;
|
|
322
|
-
|
|
323
|
-
case "spot":
|
|
324
|
-
lightNode = new THREE.SpotLight( color );
|
|
325
|
-
lightNode.position.set( 0, 0, 1 );
|
|
326
|
-
break;
|
|
327
|
-
|
|
328
|
-
case "ambient":
|
|
329
|
-
lightNode = new THREE.AmbientLight( color );
|
|
330
|
-
break;
|
|
331
|
-
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
if ( lightNode ) {
|
|
335
|
-
|
|
336
|
-
this.lights[ lightId ] = lightNode;
|
|
337
|
-
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/* BINARY EXTENSION */
|
|
345
|
-
|
|
346
|
-
var BINARY_EXTENSION_BUFFER_NAME = 'binary_glTF';
|
|
347
|
-
|
|
348
|
-
var BINARY_EXTENSION_HEADER_DEFAULTS = { magic: 'glTF', version: 1, contentFormat: 0 };
|
|
349
|
-
|
|
350
|
-
var BINARY_EXTENSION_HEADER_LENGTH = 20;
|
|
351
|
-
|
|
352
|
-
function GLTFBinaryExtension( data ) {
|
|
353
|
-
|
|
354
|
-
this.name = EXTENSIONS.KHR_BINARY_GLTF;
|
|
355
|
-
|
|
356
|
-
var headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );
|
|
357
|
-
|
|
358
|
-
var header = {
|
|
359
|
-
magic: convertUint8ArrayToString( new Uint8Array( data.slice( 0, 4 ) ) ),
|
|
360
|
-
version: headerView.getUint32( 4, true ),
|
|
361
|
-
length: headerView.getUint32( 8, true ),
|
|
362
|
-
contentLength: headerView.getUint32( 12, true ),
|
|
363
|
-
contentFormat: headerView.getUint32( 16, true )
|
|
364
|
-
};
|
|
365
|
-
|
|
366
|
-
for ( var key in BINARY_EXTENSION_HEADER_DEFAULTS ) {
|
|
367
|
-
|
|
368
|
-
var value = BINARY_EXTENSION_HEADER_DEFAULTS[ key ];
|
|
369
|
-
|
|
370
|
-
if ( header[ key ] !== value ) {
|
|
371
|
-
|
|
372
|
-
throw new Error( 'Unsupported glTF-Binary header: Expected "%s" to be "%s".', key, value );
|
|
373
|
-
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
var contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH, header.contentLength );
|
|
379
|
-
|
|
380
|
-
this.header = header;
|
|
381
|
-
this.content = convertUint8ArrayToString( contentArray );
|
|
382
|
-
this.body = data.slice( BINARY_EXTENSION_HEADER_LENGTH + header.contentLength, header.length );
|
|
383
|
-
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
GLTFBinaryExtension.prototype.loadShader = function ( shader, bufferViews ) {
|
|
387
|
-
|
|
388
|
-
var bufferView = bufferViews[ shader.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].bufferView ];
|
|
389
|
-
var array = new Uint8Array( bufferView );
|
|
390
|
-
|
|
391
|
-
return convertUint8ArrayToString( array );
|
|
392
|
-
|
|
393
|
-
};
|
|
394
|
-
|
|
395
|
-
GLTFBinaryExtension.prototype.loadTextureSourceUri = function ( source, bufferViews ) {
|
|
396
|
-
|
|
397
|
-
var metadata = source.extensions[ EXTENSIONS.KHR_BINARY_GLTF ];
|
|
398
|
-
var bufferView = bufferViews[ metadata.bufferView ];
|
|
399
|
-
var stringData = convertUint8ArrayToString( new Uint8Array( bufferView ) );
|
|
400
|
-
|
|
401
|
-
return 'data:' + metadata.mimeType + ';base64,' + btoa( stringData );
|
|
402
|
-
|
|
403
|
-
};
|
|
404
|
-
|
|
405
|
-
/*********************************/
|
|
406
|
-
/********** INTERNALS ************/
|
|
407
|
-
/*********************************/
|
|
408
|
-
|
|
409
|
-
/* CONSTANTS */
|
|
410
|
-
|
|
411
|
-
var WEBGL_CONSTANTS = {
|
|
412
|
-
FLOAT: 5126,
|
|
413
|
-
//FLOAT_MAT2: 35674,
|
|
414
|
-
FLOAT_MAT3: 35675,
|
|
415
|
-
FLOAT_MAT4: 35676,
|
|
416
|
-
FLOAT_VEC2: 35664,
|
|
417
|
-
FLOAT_VEC3: 35665,
|
|
418
|
-
FLOAT_VEC4: 35666,
|
|
419
|
-
LINEAR: 9729,
|
|
420
|
-
REPEAT: 10497,
|
|
421
|
-
SAMPLER_2D: 35678,
|
|
422
|
-
TRIANGLES: 4,
|
|
423
|
-
LINES: 1,
|
|
424
|
-
UNSIGNED_BYTE: 5121,
|
|
425
|
-
UNSIGNED_SHORT: 5123,
|
|
426
|
-
|
|
427
|
-
VERTEX_SHADER: 35633,
|
|
428
|
-
FRAGMENT_SHADER: 35632
|
|
429
|
-
};
|
|
430
|
-
|
|
431
|
-
var WEBGL_TYPE = {
|
|
432
|
-
5126: Number,
|
|
433
|
-
//35674: THREE.Matrix2,
|
|
434
|
-
35670: Boolean,
|
|
435
|
-
35675: THREE.Matrix3,
|
|
436
|
-
35676: THREE.Matrix4,
|
|
437
|
-
35664: THREE.Vector2,
|
|
438
|
-
35665: THREE.Vector3,
|
|
439
|
-
35666: THREE.Vector4,
|
|
440
|
-
35678: THREE.Texture
|
|
441
|
-
};
|
|
442
|
-
|
|
443
|
-
var WEBGL_COMPONENT_TYPES = {
|
|
444
|
-
5120: Int8Array,
|
|
445
|
-
5121: Uint8Array,
|
|
446
|
-
5122: Int16Array,
|
|
447
|
-
5123: Uint16Array,
|
|
448
|
-
5125: Uint32Array,
|
|
449
|
-
5126: Float32Array
|
|
450
|
-
};
|
|
451
|
-
|
|
452
|
-
var WEBGL_FILTERS = {
|
|
453
|
-
9728: THREE.NearestFilter,
|
|
454
|
-
9729: THREE.LinearFilter,
|
|
455
|
-
9984: THREE.NearestMipMapNearestFilter,
|
|
456
|
-
9985: THREE.LinearMipMapNearestFilter,
|
|
457
|
-
9986: THREE.NearestMipMapLinearFilter,
|
|
458
|
-
9987: THREE.LinearMipMapLinearFilter
|
|
459
|
-
};
|
|
460
|
-
|
|
461
|
-
var WEBGL_WRAPPINGS = {
|
|
462
|
-
33071: THREE.ClampToEdgeWrapping,
|
|
463
|
-
33648: THREE.MirroredRepeatWrapping,
|
|
464
|
-
10497: THREE.RepeatWrapping
|
|
465
|
-
};
|
|
466
|
-
|
|
467
|
-
var WEBGL_TEXTURE_FORMATS = {
|
|
468
|
-
6406: THREE.AlphaFormat,
|
|
469
|
-
6407: THREE.RGBFormat,
|
|
470
|
-
6408: THREE.RGBAFormat,
|
|
471
|
-
6409: THREE.LuminanceFormat,
|
|
472
|
-
6410: THREE.LuminanceAlphaFormat
|
|
473
|
-
};
|
|
474
|
-
|
|
475
|
-
var WEBGL_TEXTURE_DATATYPES = {
|
|
476
|
-
5121: THREE.UnsignedByteType,
|
|
477
|
-
32819: THREE.UnsignedShort4444Type,
|
|
478
|
-
32820: THREE.UnsignedShort5551Type,
|
|
479
|
-
33635: THREE.UnsignedShort565Type
|
|
480
|
-
};
|
|
481
|
-
|
|
482
|
-
var WEBGL_SIDES = {
|
|
483
|
-
1028: THREE.BackSide, // Culling front
|
|
484
|
-
1029: THREE.FrontSide // Culling back
|
|
485
|
-
//1032: THREE.NoSide // Culling front and back, what to do?
|
|
486
|
-
};
|
|
487
|
-
|
|
488
|
-
var WEBGL_DEPTH_FUNCS = {
|
|
489
|
-
512: THREE.NeverDepth,
|
|
490
|
-
513: THREE.LessDepth,
|
|
491
|
-
514: THREE.EqualDepth,
|
|
492
|
-
515: THREE.LessEqualDepth,
|
|
493
|
-
516: THREE.GreaterEqualDepth,
|
|
494
|
-
517: THREE.NotEqualDepth,
|
|
495
|
-
518: THREE.GreaterEqualDepth,
|
|
496
|
-
519: THREE.AlwaysDepth
|
|
497
|
-
};
|
|
498
|
-
|
|
499
|
-
var WEBGL_BLEND_EQUATIONS = {
|
|
500
|
-
32774: THREE.AddEquation,
|
|
501
|
-
32778: THREE.SubtractEquation,
|
|
502
|
-
32779: THREE.ReverseSubtractEquation
|
|
503
|
-
};
|
|
504
|
-
|
|
505
|
-
var WEBGL_BLEND_FUNCS = {
|
|
506
|
-
0: THREE.ZeroFactor,
|
|
507
|
-
1: THREE.OneFactor,
|
|
508
|
-
768: THREE.SrcColorFactor,
|
|
509
|
-
769: THREE.OneMinusSrcColorFactor,
|
|
510
|
-
770: THREE.SrcAlphaFactor,
|
|
511
|
-
771: THREE.OneMinusSrcAlphaFactor,
|
|
512
|
-
772: THREE.DstAlphaFactor,
|
|
513
|
-
773: THREE.OneMinusDstAlphaFactor,
|
|
514
|
-
774: THREE.DstColorFactor,
|
|
515
|
-
775: THREE.OneMinusDstColorFactor,
|
|
516
|
-
776: THREE.SrcAlphaSaturateFactor
|
|
517
|
-
// The followings are not supported by Three.js yet
|
|
518
|
-
//32769: CONSTANT_COLOR,
|
|
519
|
-
//32770: ONE_MINUS_CONSTANT_COLOR,
|
|
520
|
-
//32771: CONSTANT_ALPHA,
|
|
521
|
-
//32772: ONE_MINUS_CONSTANT_COLOR
|
|
522
|
-
};
|
|
523
|
-
|
|
524
|
-
var WEBGL_TYPE_SIZES = {
|
|
525
|
-
'SCALAR': 1,
|
|
526
|
-
'VEC2': 2,
|
|
527
|
-
'VEC3': 3,
|
|
528
|
-
'VEC4': 4,
|
|
529
|
-
'MAT2': 4,
|
|
530
|
-
'MAT3': 9,
|
|
531
|
-
'MAT4': 16
|
|
532
|
-
};
|
|
533
|
-
|
|
534
|
-
var PATH_PROPERTIES = {
|
|
535
|
-
scale: 'scale',
|
|
536
|
-
translation: 'position',
|
|
537
|
-
rotation: 'quaternion'
|
|
538
|
-
};
|
|
539
|
-
|
|
540
|
-
var INTERPOLATION = {
|
|
541
|
-
LINEAR: THREE.InterpolateLinear,
|
|
542
|
-
STEP: THREE.InterpolateDiscrete
|
|
543
|
-
};
|
|
544
|
-
|
|
545
|
-
var STATES_ENABLES = {
|
|
546
|
-
2884: 'CULL_FACE',
|
|
547
|
-
2929: 'DEPTH_TEST',
|
|
548
|
-
3042: 'BLEND',
|
|
549
|
-
3089: 'SCISSOR_TEST',
|
|
550
|
-
32823: 'POLYGON_OFFSET_FILL',
|
|
551
|
-
32926: 'SAMPLE_ALPHA_TO_COVERAGE'
|
|
552
|
-
};
|
|
553
|
-
|
|
554
|
-
/* UTILITY FUNCTIONS */
|
|
555
|
-
|
|
556
|
-
function _each( object, callback, thisObj ) {
|
|
557
|
-
|
|
558
|
-
if ( !object ) {
|
|
559
|
-
return Promise.resolve();
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
var results;
|
|
563
|
-
var fns = [];
|
|
564
|
-
|
|
565
|
-
if ( Object.prototype.toString.call( object ) === '[object Array]' ) {
|
|
566
|
-
|
|
567
|
-
results = [];
|
|
568
|
-
|
|
569
|
-
var length = object.length;
|
|
570
|
-
|
|
571
|
-
for ( var idx = 0; idx < length; idx ++ ) {
|
|
572
|
-
|
|
573
|
-
var value = callback.call( thisObj || this, object[ idx ], idx );
|
|
574
|
-
|
|
575
|
-
if ( value ) {
|
|
576
|
-
|
|
577
|
-
fns.push( value );
|
|
578
|
-
|
|
579
|
-
if ( value instanceof Promise ) {
|
|
580
|
-
|
|
581
|
-
value.then( function( key, value ) {
|
|
582
|
-
|
|
583
|
-
results[ key ] = value;
|
|
584
|
-
|
|
585
|
-
}.bind( this, idx ));
|
|
586
|
-
|
|
587
|
-
} else {
|
|
588
|
-
|
|
589
|
-
results[ idx ] = value;
|
|
590
|
-
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
} else {
|
|
598
|
-
|
|
599
|
-
results = {};
|
|
600
|
-
|
|
601
|
-
for ( var key in object ) {
|
|
602
|
-
|
|
603
|
-
if ( object.hasOwnProperty( key ) ) {
|
|
604
|
-
|
|
605
|
-
var value = callback.call( thisObj || this, object[ key ], key );
|
|
606
|
-
|
|
607
|
-
if ( value ) {
|
|
608
|
-
|
|
609
|
-
fns.push( value );
|
|
610
|
-
|
|
611
|
-
if ( value instanceof Promise ) {
|
|
612
|
-
|
|
613
|
-
value.then( function( key, value ) {
|
|
614
|
-
|
|
615
|
-
results[ key ] = value;
|
|
616
|
-
|
|
617
|
-
}.bind( this, key ));
|
|
618
|
-
|
|
619
|
-
} else {
|
|
620
|
-
|
|
621
|
-
results[ key ] = value;
|
|
622
|
-
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
return Promise.all( fns ).then( function() {
|
|
634
|
-
|
|
635
|
-
return results;
|
|
636
|
-
|
|
637
|
-
});
|
|
638
|
-
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
function resolveURL( url, path ) {
|
|
642
|
-
|
|
643
|
-
// Invalid URL
|
|
644
|
-
if ( typeof url !== 'string' || url === '' )
|
|
645
|
-
return '';
|
|
646
|
-
|
|
647
|
-
// Absolute URL http://,https://,//
|
|
648
|
-
if ( /^(https?:)?\/\//i.test( url ) ) {
|
|
649
|
-
|
|
650
|
-
return url;
|
|
651
|
-
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
// Data URI
|
|
655
|
-
if ( /^data:.*,.*$/i.test( url ) ) {
|
|
656
|
-
|
|
657
|
-
return url;
|
|
658
|
-
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
// Relative URL
|
|
662
|
-
return ( path || '' ) + url;
|
|
663
|
-
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
function convertUint8ArrayToString( array ) {
|
|
667
|
-
|
|
668
|
-
if ( window.TextDecoder !== undefined ) {
|
|
669
|
-
|
|
670
|
-
//return new TextDecoder().decode( array );
|
|
671
|
-
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
// Avoid the String.fromCharCode.apply(null, array) shortcut, which
|
|
675
|
-
// throws a "maximum call stack size exceeded" error for large arrays.
|
|
676
|
-
|
|
677
|
-
var s = '';
|
|
678
|
-
|
|
679
|
-
for ( var i = 0, il = array.length; i < il; i ++ ) {
|
|
680
|
-
|
|
681
|
-
s += String.fromCharCode( array[ i ] );
|
|
682
|
-
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
return s;
|
|
686
|
-
|
|
687
|
-
}
|
|
688
|
-
|
|
689
|
-
// Three.js seems too dependent on attribute names so globally
|
|
690
|
-
// replace those in the shader code
|
|
691
|
-
function replaceTHREEShaderAttributes( shaderText, technique ) {
|
|
692
|
-
|
|
693
|
-
// Expected technique attributes
|
|
694
|
-
var attributes = {};
|
|
695
|
-
|
|
696
|
-
for ( var attributeId in technique.attributes ) {
|
|
697
|
-
|
|
698
|
-
var pname = technique.attributes[ attributeId ];
|
|
699
|
-
|
|
700
|
-
var param = technique.parameters[ pname ];
|
|
701
|
-
var atype = param.type;
|
|
702
|
-
var semantic = param.semantic;
|
|
703
|
-
|
|
704
|
-
attributes[ attributeId ] = {
|
|
705
|
-
type: atype,
|
|
706
|
-
semantic: semantic
|
|
707
|
-
};
|
|
708
|
-
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
// Figure out which attributes to change in technique
|
|
712
|
-
|
|
713
|
-
var shaderParams = technique.parameters;
|
|
714
|
-
var shaderAttributes = technique.attributes;
|
|
715
|
-
var params = {};
|
|
716
|
-
|
|
717
|
-
for ( var attributeId in attributes ) {
|
|
718
|
-
|
|
719
|
-
var pname = shaderAttributes[ attributeId ];
|
|
720
|
-
var shaderParam = shaderParams[ pname ];
|
|
721
|
-
var semantic = shaderParam.semantic;
|
|
722
|
-
if ( semantic ) {
|
|
723
|
-
|
|
724
|
-
params[ attributeId ] = shaderParam;
|
|
725
|
-
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
for ( var pname in params ) {
|
|
731
|
-
|
|
732
|
-
var param = params[ pname ];
|
|
733
|
-
var semantic = param.semantic;
|
|
734
|
-
|
|
735
|
-
var regEx = new RegExp( "\\b" + pname + "\\b", "g" );
|
|
736
|
-
|
|
737
|
-
switch ( semantic ) {
|
|
738
|
-
|
|
739
|
-
case "POSITION":
|
|
740
|
-
|
|
741
|
-
shaderText = shaderText.replace( regEx, 'position' );
|
|
742
|
-
break;
|
|
743
|
-
|
|
744
|
-
case "NORMAL":
|
|
745
|
-
|
|
746
|
-
shaderText = shaderText.replace( regEx, 'normal' );
|
|
747
|
-
break;
|
|
748
|
-
|
|
749
|
-
case 'TEXCOORD_0':
|
|
750
|
-
case 'TEXCOORD0':
|
|
751
|
-
case 'TEXCOORD':
|
|
752
|
-
|
|
753
|
-
shaderText = shaderText.replace( regEx, 'uv' );
|
|
754
|
-
break;
|
|
755
|
-
|
|
756
|
-
case 'TEXCOORD_1':
|
|
757
|
-
|
|
758
|
-
shaderText = shaderText.replace( regEx, 'uv2' );
|
|
759
|
-
break;
|
|
760
|
-
|
|
761
|
-
case 'COLOR_0':
|
|
762
|
-
case 'COLOR0':
|
|
763
|
-
case 'COLOR':
|
|
764
|
-
|
|
765
|
-
shaderText = shaderText.replace( regEx, 'color' );
|
|
766
|
-
break;
|
|
767
|
-
|
|
768
|
-
case "WEIGHT":
|
|
769
|
-
|
|
770
|
-
shaderText = shaderText.replace( regEx, 'skinWeight' );
|
|
771
|
-
break;
|
|
772
|
-
|
|
773
|
-
case "JOINT":
|
|
774
|
-
|
|
775
|
-
shaderText = shaderText.replace( regEx, 'skinIndex' );
|
|
776
|
-
break;
|
|
777
|
-
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
return shaderText;
|
|
783
|
-
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
function createDefaultMaterial() {
|
|
787
|
-
|
|
788
|
-
return new THREE.MeshPhongMaterial( {
|
|
789
|
-
color: 0x00000,
|
|
790
|
-
emissive: 0x888888,
|
|
791
|
-
specular: 0x000000,
|
|
792
|
-
shininess: 0,
|
|
793
|
-
transparent: false,
|
|
794
|
-
depthTest: true,
|
|
795
|
-
side: THREE.FrontSide
|
|
796
|
-
} );
|
|
797
|
-
|
|
798
|
-
}
|
|
799
|
-
|
|
800
|
-
// Deferred constructor for RawShaderMaterial types
|
|
801
|
-
function DeferredShaderMaterial( params ) {
|
|
802
|
-
|
|
803
|
-
this.isDeferredShaderMaterial = true;
|
|
804
|
-
|
|
805
|
-
this.params = params;
|
|
806
|
-
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
DeferredShaderMaterial.prototype.create = function () {
|
|
810
|
-
|
|
811
|
-
var uniforms = THREE.UniformsUtils.clone( this.params.uniforms );
|
|
812
|
-
|
|
813
|
-
for ( var uniformId in this.params.uniforms ) {
|
|
814
|
-
|
|
815
|
-
var originalUniform = this.params.uniforms[ uniformId ];
|
|
816
|
-
|
|
817
|
-
if ( originalUniform.value instanceof THREE.Texture ) {
|
|
818
|
-
|
|
819
|
-
uniforms[ uniformId ].value = originalUniform.value;
|
|
820
|
-
uniforms[ uniformId ].value.needsUpdate = true;
|
|
821
|
-
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
uniforms[ uniformId ].semantic = originalUniform.semantic;
|
|
825
|
-
uniforms[ uniformId ].node = originalUniform.node;
|
|
826
|
-
|
|
827
|
-
}
|
|
828
|
-
|
|
829
|
-
this.params.uniforms = uniforms;
|
|
830
|
-
|
|
831
|
-
return new THREE.RawShaderMaterial( this.params );
|
|
832
|
-
|
|
833
|
-
};
|
|
834
|
-
|
|
835
|
-
/* GLTF PARSER */
|
|
836
|
-
|
|
837
|
-
function GLTFParser( json, extensions, options ) {
|
|
838
|
-
|
|
839
|
-
this.json = json || {};
|
|
840
|
-
this.extensions = extensions || {};
|
|
841
|
-
this.options = options || {};
|
|
842
|
-
|
|
843
|
-
// loader object cache
|
|
844
|
-
this.cache = new GLTFRegistry();
|
|
845
|
-
|
|
846
|
-
}
|
|
847
|
-
|
|
848
|
-
GLTFParser.prototype._withDependencies = function ( dependencies ) {
|
|
849
|
-
|
|
850
|
-
var _dependencies = {};
|
|
851
|
-
|
|
852
|
-
for ( var i = 0; i < dependencies.length; i ++ ) {
|
|
853
|
-
|
|
854
|
-
var dependency = dependencies[ i ];
|
|
855
|
-
var fnName = "load" + dependency.charAt( 0 ).toUpperCase() + dependency.slice( 1 );
|
|
856
|
-
|
|
857
|
-
var cached = this.cache.get( dependency );
|
|
858
|
-
|
|
859
|
-
if ( cached !== undefined ) {
|
|
860
|
-
|
|
861
|
-
_dependencies[ dependency ] = cached;
|
|
862
|
-
|
|
863
|
-
} else if ( this[ fnName ] ) {
|
|
864
|
-
|
|
865
|
-
var fn = this[ fnName ]();
|
|
866
|
-
this.cache.add( dependency, fn );
|
|
867
|
-
|
|
868
|
-
_dependencies[ dependency ] = fn;
|
|
869
|
-
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
return _each( _dependencies, function ( dependency ) {
|
|
875
|
-
|
|
876
|
-
return dependency;
|
|
877
|
-
|
|
878
|
-
} );
|
|
879
|
-
|
|
880
|
-
};
|
|
881
|
-
|
|
882
|
-
GLTFParser.prototype.parse = function ( callback ) {
|
|
883
|
-
|
|
884
|
-
var json = this.json;
|
|
885
|
-
|
|
886
|
-
// Clear the loader cache
|
|
887
|
-
this.cache.removeAll();
|
|
888
|
-
|
|
889
|
-
// Fire the callback on complete
|
|
890
|
-
this._withDependencies( [
|
|
891
|
-
|
|
892
|
-
"scenes",
|
|
893
|
-
"cameras",
|
|
894
|
-
"animations"
|
|
895
|
-
|
|
896
|
-
] ).then( function ( dependencies ) {
|
|
897
|
-
|
|
898
|
-
var scenes = [];
|
|
899
|
-
|
|
900
|
-
for ( var name in dependencies.scenes ) {
|
|
901
|
-
|
|
902
|
-
scenes.push( dependencies.scenes[ name ] );
|
|
903
|
-
|
|
904
|
-
}
|
|
905
|
-
|
|
906
|
-
var scene = json.scene !== undefined ? dependencies.scenes[ json.scene ] : scenes[ 0 ];
|
|
907
|
-
|
|
908
|
-
var cameras = [];
|
|
909
|
-
|
|
910
|
-
for ( var name in dependencies.cameras ) {
|
|
911
|
-
|
|
912
|
-
var camera = dependencies.cameras[ name ];
|
|
913
|
-
cameras.push( camera );
|
|
914
|
-
|
|
915
|
-
}
|
|
916
|
-
|
|
917
|
-
var animations = [];
|
|
918
|
-
|
|
919
|
-
for ( var name in dependencies.animations ) {
|
|
920
|
-
|
|
921
|
-
animations.push( dependencies.animations[ name ] );
|
|
922
|
-
|
|
923
|
-
}
|
|
924
|
-
|
|
925
|
-
callback( scene, scenes, cameras, animations );
|
|
926
|
-
|
|
927
|
-
} );
|
|
928
|
-
|
|
929
|
-
};
|
|
930
|
-
|
|
931
|
-
GLTFParser.prototype.loadShaders = function () {
|
|
932
|
-
|
|
933
|
-
var json = this.json;
|
|
934
|
-
var extensions = this.extensions;
|
|
935
|
-
var options = this.options;
|
|
936
|
-
|
|
937
|
-
return this._withDependencies( [
|
|
938
|
-
|
|
939
|
-
"bufferViews"
|
|
940
|
-
|
|
941
|
-
] ).then( function ( dependencies ) {
|
|
942
|
-
|
|
943
|
-
return _each( json.shaders, function ( shader ) {
|
|
944
|
-
|
|
945
|
-
if ( shader.extensions && shader.extensions[ EXTENSIONS.KHR_BINARY_GLTF ] ) {
|
|
946
|
-
|
|
947
|
-
return extensions[ EXTENSIONS.KHR_BINARY_GLTF ].loadShader( shader, dependencies.bufferViews );
|
|
948
|
-
|
|
949
|
-
}
|
|
950
|
-
|
|
951
|
-
return new Promise( function ( resolve ) {
|
|
952
|
-
|
|
953
|
-
var loader = new THREE.FileLoader();
|
|
954
|
-
loader.setResponseType( 'text' );
|
|
955
|
-
loader.load( resolveURL( shader.uri, options.path ), function ( shaderText ) {
|
|
956
|
-
|
|
957
|
-
resolve( shaderText );
|
|
958
|
-
|
|
959
|
-
} );
|
|
960
|
-
|
|
961
|
-
} );
|
|
962
|
-
|
|
963
|
-
} );
|
|
964
|
-
|
|
965
|
-
} );
|
|
966
|
-
|
|
967
|
-
};
|
|
968
|
-
|
|
969
|
-
GLTFParser.prototype.loadBuffers = function () {
|
|
970
|
-
|
|
971
|
-
var json = this.json;
|
|
972
|
-
var extensions = this.extensions;
|
|
973
|
-
var options = this.options;
|
|
974
|
-
|
|
975
|
-
return _each( json.buffers, function ( buffer, name ) {
|
|
976
|
-
|
|
977
|
-
if ( name === BINARY_EXTENSION_BUFFER_NAME ) {
|
|
978
|
-
|
|
979
|
-
return extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body;
|
|
980
|
-
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
if ( buffer.type === 'arraybuffer' || buffer.type === undefined ) {
|
|
984
|
-
|
|
985
|
-
return new Promise( function ( resolve ) {
|
|
986
|
-
|
|
987
|
-
var loader = new THREE.FileLoader();
|
|
988
|
-
loader.setResponseType( 'arraybuffer' );
|
|
989
|
-
loader.load( resolveURL( buffer.uri, options.path ), function ( buffer ) {
|
|
990
|
-
|
|
991
|
-
resolve( buffer );
|
|
992
|
-
|
|
993
|
-
} );
|
|
994
|
-
|
|
995
|
-
} );
|
|
996
|
-
|
|
997
|
-
} else {
|
|
998
|
-
|
|
999
|
-
console.warn( 'THREE.LegacyGLTFLoader: ' + buffer.type + ' buffer type is not supported' );
|
|
1000
|
-
|
|
1001
|
-
}
|
|
1002
|
-
|
|
1003
|
-
} );
|
|
1004
|
-
|
|
1005
|
-
};
|
|
1006
|
-
|
|
1007
|
-
GLTFParser.prototype.loadBufferViews = function () {
|
|
1008
|
-
|
|
1009
|
-
var json = this.json;
|
|
1010
|
-
|
|
1011
|
-
return this._withDependencies( [
|
|
1012
|
-
|
|
1013
|
-
"buffers"
|
|
1014
|
-
|
|
1015
|
-
] ).then( function ( dependencies ) {
|
|
1016
|
-
|
|
1017
|
-
return _each( json.bufferViews, function ( bufferView ) {
|
|
1018
|
-
|
|
1019
|
-
var arraybuffer = dependencies.buffers[ bufferView.buffer ];
|
|
1020
|
-
|
|
1021
|
-
var byteLength = bufferView.byteLength !== undefined ? bufferView.byteLength : 0;
|
|
1022
|
-
|
|
1023
|
-
return arraybuffer.slice( bufferView.byteOffset, bufferView.byteOffset + byteLength );
|
|
1024
|
-
|
|
1025
|
-
} );
|
|
1026
|
-
|
|
1027
|
-
} );
|
|
1028
|
-
|
|
1029
|
-
};
|
|
1030
|
-
|
|
1031
|
-
GLTFParser.prototype.loadAccessors = function () {
|
|
1032
|
-
|
|
1033
|
-
var json = this.json;
|
|
1034
|
-
|
|
1035
|
-
return this._withDependencies( [
|
|
1036
|
-
|
|
1037
|
-
"bufferViews"
|
|
1038
|
-
|
|
1039
|
-
] ).then( function ( dependencies ) {
|
|
1040
|
-
|
|
1041
|
-
return _each( json.accessors, function ( accessor ) {
|
|
1042
|
-
|
|
1043
|
-
var arraybuffer = dependencies.bufferViews[ accessor.bufferView ];
|
|
1044
|
-
var itemSize = WEBGL_TYPE_SIZES[ accessor.type ];
|
|
1045
|
-
var TypedArray = WEBGL_COMPONENT_TYPES[ accessor.componentType ];
|
|
1046
|
-
|
|
1047
|
-
// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.
|
|
1048
|
-
var elementBytes = TypedArray.BYTES_PER_ELEMENT;
|
|
1049
|
-
var itemBytes = elementBytes * itemSize;
|
|
1050
|
-
|
|
1051
|
-
// The buffer is not interleaved if the stride is the item size in bytes.
|
|
1052
|
-
if ( accessor.byteStride && accessor.byteStride !== itemBytes ) {
|
|
1053
|
-
|
|
1054
|
-
// Use the full buffer if it's interleaved.
|
|
1055
|
-
var array = new TypedArray( arraybuffer );
|
|
1056
|
-
|
|
1057
|
-
// Integer parameters to IB/IBA are in array elements, not bytes.
|
|
1058
|
-
var ib = new THREE.InterleavedBuffer( array, accessor.byteStride / elementBytes );
|
|
1059
|
-
|
|
1060
|
-
return new THREE.InterleavedBufferAttribute( ib, itemSize, accessor.byteOffset / elementBytes );
|
|
1061
|
-
|
|
1062
|
-
} else {
|
|
1063
|
-
|
|
1064
|
-
array = new TypedArray( arraybuffer, accessor.byteOffset, accessor.count * itemSize );
|
|
1065
|
-
|
|
1066
|
-
return new THREE.BufferAttribute( array, itemSize );
|
|
1067
|
-
|
|
1068
|
-
}
|
|
1069
|
-
|
|
1070
|
-
} );
|
|
1071
|
-
|
|
1072
|
-
} );
|
|
1073
|
-
|
|
1074
|
-
};
|
|
1075
|
-
|
|
1076
|
-
GLTFParser.prototype.loadTextures = function () {
|
|
1077
|
-
|
|
1078
|
-
var json = this.json;
|
|
1079
|
-
var extensions = this.extensions;
|
|
1080
|
-
var options = this.options;
|
|
1081
|
-
|
|
1082
|
-
return this._withDependencies( [
|
|
1083
|
-
|
|
1084
|
-
"bufferViews"
|
|
1085
|
-
|
|
1086
|
-
] ).then( function ( dependencies ) {
|
|
1087
|
-
|
|
1088
|
-
return _each( json.textures, function ( texture ) {
|
|
1089
|
-
|
|
1090
|
-
if ( texture.source ) {
|
|
1091
|
-
|
|
1092
|
-
return new Promise( function ( resolve ) {
|
|
1093
|
-
|
|
1094
|
-
var source = json.images[ texture.source ];
|
|
1095
|
-
var sourceUri = source.uri;
|
|
1096
|
-
|
|
1097
|
-
if ( source.extensions && source.extensions[ EXTENSIONS.KHR_BINARY_GLTF ] ) {
|
|
1098
|
-
|
|
1099
|
-
sourceUri = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].loadTextureSourceUri( source, dependencies.bufferViews );
|
|
1100
|
-
|
|
1101
|
-
}
|
|
1102
|
-
|
|
1103
|
-
//var textureLoader = THREE.Loader.Handlers.get( sourceUri );
|
|
1104
|
-
var textureLoader = THREE.DefaultLoadingManager.getHandler( sourceUri);
|
|
1105
|
-
|
|
1106
|
-
if ( textureLoader === null ) {
|
|
1107
|
-
|
|
1108
|
-
textureLoader = new THREE.TextureLoader();
|
|
1109
|
-
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
textureLoader.setCrossOrigin( options.crossOrigin );
|
|
1113
|
-
|
|
1114
|
-
textureLoader.load( resolveURL( sourceUri, options.path ), function ( _texture ) {
|
|
1115
|
-
|
|
1116
|
-
_texture.flipY = false;
|
|
1117
|
-
|
|
1118
|
-
if ( texture.name !== undefined ) _texture.name = texture.name;
|
|
1119
|
-
|
|
1120
|
-
_texture.format = texture.format !== undefined ? WEBGL_TEXTURE_FORMATS[ texture.format ] : THREE.RGBAFormat;
|
|
1121
|
-
|
|
1122
|
-
if ( texture.internalFormat !== undefined && _texture.format !== WEBGL_TEXTURE_FORMATS[ texture.internalFormat ] ) {
|
|
1123
|
-
|
|
1124
|
-
console.warn( 'THREE.LegacyGLTFLoader: Three.js doesn\'t support texture internalFormat which is different from texture format. ' +
|
|
1125
|
-
'internalFormat will be forced to be the same value as format.' );
|
|
1126
|
-
|
|
1127
|
-
}
|
|
1128
|
-
|
|
1129
|
-
_texture.type = texture.type !== undefined ? WEBGL_TEXTURE_DATATYPES[ texture.type ] : THREE.UnsignedByteType;
|
|
1130
|
-
|
|
1131
|
-
if ( texture.sampler ) {
|
|
1132
|
-
|
|
1133
|
-
var sampler = json.samplers[ texture.sampler ];
|
|
1134
|
-
|
|
1135
|
-
_texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || THREE.LinearFilter;
|
|
1136
|
-
_texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || THREE.NearestMipMapLinearFilter;
|
|
1137
|
-
_texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || THREE.RepeatWrapping;
|
|
1138
|
-
_texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || THREE.RepeatWrapping;
|
|
1139
|
-
|
|
1140
|
-
}
|
|
1141
|
-
|
|
1142
|
-
resolve( _texture );
|
|
1143
|
-
|
|
1144
|
-
}, undefined, function () {
|
|
1145
|
-
|
|
1146
|
-
resolve();
|
|
1147
|
-
|
|
1148
|
-
} );
|
|
1149
|
-
|
|
1150
|
-
} );
|
|
1151
|
-
|
|
1152
|
-
}
|
|
1153
|
-
|
|
1154
|
-
} );
|
|
1155
|
-
|
|
1156
|
-
} );
|
|
1157
|
-
|
|
1158
|
-
};
|
|
1159
|
-
|
|
1160
|
-
GLTFParser.prototype.loadMaterials = function () {
|
|
1161
|
-
|
|
1162
|
-
var json = this.json;
|
|
1163
|
-
|
|
1164
|
-
return this._withDependencies( [
|
|
1165
|
-
|
|
1166
|
-
"shaders",
|
|
1167
|
-
"textures"
|
|
1168
|
-
|
|
1169
|
-
] ).then( function ( dependencies ) {
|
|
1170
|
-
|
|
1171
|
-
return _each( json.materials, function ( material ) {
|
|
1172
|
-
|
|
1173
|
-
var materialType;
|
|
1174
|
-
var materialValues = {};
|
|
1175
|
-
var materialParams = {};
|
|
1176
|
-
|
|
1177
|
-
var khr_material;
|
|
1178
|
-
|
|
1179
|
-
if ( material.extensions && material.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ] ) {
|
|
1180
|
-
|
|
1181
|
-
khr_material = material.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ];
|
|
1182
|
-
|
|
1183
|
-
}
|
|
1184
|
-
|
|
1185
|
-
if ( khr_material ) {
|
|
1186
|
-
|
|
1187
|
-
// don't copy over unused values to avoid material warning spam
|
|
1188
|
-
var keys = [ 'ambient', 'emission', 'transparent', 'transparency', 'doubleSided' ];
|
|
1189
|
-
|
|
1190
|
-
switch ( khr_material.technique ) {
|
|
1191
|
-
|
|
1192
|
-
case 'BLINN' :
|
|
1193
|
-
case 'PHONG' :
|
|
1194
|
-
materialType = THREE.MeshPhongMaterial;
|
|
1195
|
-
keys.push( 'diffuse', 'specular', 'shininess' );
|
|
1196
|
-
break;
|
|
1197
|
-
|
|
1198
|
-
case 'LAMBERT' :
|
|
1199
|
-
materialType = THREE.MeshLambertMaterial;
|
|
1200
|
-
keys.push( 'diffuse' );
|
|
1201
|
-
break;
|
|
1202
|
-
|
|
1203
|
-
case 'CONSTANT' :
|
|
1204
|
-
default :
|
|
1205
|
-
materialType = THREE.MeshBasicMaterial;
|
|
1206
|
-
break;
|
|
1207
|
-
|
|
1208
|
-
}
|
|
1209
|
-
|
|
1210
|
-
keys.forEach( function( v ) {
|
|
1211
|
-
|
|
1212
|
-
if ( khr_material.values[ v ] !== undefined ) materialValues[ v ] = khr_material.values[ v ];
|
|
1213
|
-
|
|
1214
|
-
} );
|
|
1215
|
-
|
|
1216
|
-
if ( khr_material.doubleSided || materialValues.doubleSided ) {
|
|
1217
|
-
|
|
1218
|
-
materialParams.side = THREE.DoubleSide;
|
|
1219
|
-
|
|
1220
|
-
}
|
|
1221
|
-
|
|
1222
|
-
if ( khr_material.transparent || materialValues.transparent ) {
|
|
1223
|
-
|
|
1224
|
-
materialParams.transparent = true;
|
|
1225
|
-
materialParams.opacity = ( materialValues.transparency !== undefined ) ? materialValues.transparency : 1;
|
|
1226
|
-
|
|
1227
|
-
}
|
|
1228
|
-
|
|
1229
|
-
} else if ( material.technique === undefined ) {
|
|
1230
|
-
|
|
1231
|
-
materialType = THREE.MeshPhongMaterial;
|
|
1232
|
-
|
|
1233
|
-
Object.assign( materialValues, material.values );
|
|
1234
|
-
|
|
1235
|
-
} else {
|
|
1236
|
-
|
|
1237
|
-
materialType = DeferredShaderMaterial;
|
|
1238
|
-
|
|
1239
|
-
var technique = json.techniques[ material.technique ];
|
|
1240
|
-
|
|
1241
|
-
materialParams.uniforms = {};
|
|
1242
|
-
|
|
1243
|
-
var program = json.programs[ technique.program ];
|
|
1244
|
-
|
|
1245
|
-
if ( program ) {
|
|
1246
|
-
|
|
1247
|
-
materialParams.fragmentShader = dependencies.shaders[ program.fragmentShader ];
|
|
1248
|
-
|
|
1249
|
-
if ( ! materialParams.fragmentShader ) {
|
|
1250
|
-
|
|
1251
|
-
console.warn( "ERROR: Missing fragment shader definition:", program.fragmentShader );
|
|
1252
|
-
materialType = THREE.MeshPhongMaterial;
|
|
1253
|
-
|
|
1254
|
-
}
|
|
1255
|
-
|
|
1256
|
-
var vertexShader = dependencies.shaders[ program.vertexShader ];
|
|
1257
|
-
|
|
1258
|
-
if ( ! vertexShader ) {
|
|
1259
|
-
|
|
1260
|
-
console.warn( "ERROR: Missing vertex shader definition:", program.vertexShader );
|
|
1261
|
-
materialType = THREE.MeshPhongMaterial;
|
|
1262
|
-
|
|
1263
|
-
}
|
|
1264
|
-
|
|
1265
|
-
// IMPORTANT: FIX VERTEX SHADER ATTRIBUTE DEFINITIONS
|
|
1266
|
-
materialParams.vertexShader = replaceTHREEShaderAttributes( vertexShader, technique );
|
|
1267
|
-
|
|
1268
|
-
var uniforms = technique.uniforms;
|
|
1269
|
-
|
|
1270
|
-
for ( var uniformId in uniforms ) {
|
|
1271
|
-
|
|
1272
|
-
var pname = uniforms[ uniformId ];
|
|
1273
|
-
var shaderParam = technique.parameters[ pname ];
|
|
1274
|
-
|
|
1275
|
-
var ptype = shaderParam.type;
|
|
1276
|
-
|
|
1277
|
-
if ( WEBGL_TYPE[ ptype ] ) {
|
|
1278
|
-
|
|
1279
|
-
var pcount = shaderParam.count;
|
|
1280
|
-
var value;
|
|
1281
|
-
|
|
1282
|
-
if ( material.values !== undefined ) value = material.values[ pname ];
|
|
1283
|
-
|
|
1284
|
-
var uvalue = new WEBGL_TYPE[ ptype ]();
|
|
1285
|
-
var usemantic = shaderParam.semantic;
|
|
1286
|
-
var unode = shaderParam.node;
|
|
1287
|
-
|
|
1288
|
-
switch ( ptype ) {
|
|
1289
|
-
|
|
1290
|
-
case WEBGL_CONSTANTS.FLOAT:
|
|
1291
|
-
|
|
1292
|
-
uvalue = shaderParam.value;
|
|
1293
|
-
|
|
1294
|
-
if ( pname == "transparency" ) {
|
|
1295
|
-
|
|
1296
|
-
materialParams.transparent = true;
|
|
1297
|
-
|
|
1298
|
-
}
|
|
1299
|
-
|
|
1300
|
-
if ( value !== undefined ) {
|
|
1301
|
-
|
|
1302
|
-
uvalue = value;
|
|
1303
|
-
|
|
1304
|
-
}
|
|
1305
|
-
|
|
1306
|
-
break;
|
|
1307
|
-
|
|
1308
|
-
case WEBGL_CONSTANTS.FLOAT_VEC2:
|
|
1309
|
-
case WEBGL_CONSTANTS.FLOAT_VEC3:
|
|
1310
|
-
case WEBGL_CONSTANTS.FLOAT_VEC4:
|
|
1311
|
-
case WEBGL_CONSTANTS.FLOAT_MAT3:
|
|
1312
|
-
|
|
1313
|
-
if ( shaderParam && shaderParam.value ) {
|
|
1314
|
-
|
|
1315
|
-
uvalue.fromArray( shaderParam.value );
|
|
1316
|
-
|
|
1317
|
-
}
|
|
1318
|
-
|
|
1319
|
-
if ( value ) {
|
|
1320
|
-
|
|
1321
|
-
uvalue.fromArray( value );
|
|
1322
|
-
|
|
1323
|
-
}
|
|
1324
|
-
|
|
1325
|
-
break;
|
|
1326
|
-
|
|
1327
|
-
case WEBGL_CONSTANTS.FLOAT_MAT2:
|
|
1328
|
-
|
|
1329
|
-
// what to do?
|
|
1330
|
-
console.warn( "FLOAT_MAT2 is not a supported uniform type" );
|
|
1331
|
-
break;
|
|
1332
|
-
|
|
1333
|
-
case WEBGL_CONSTANTS.FLOAT_MAT4:
|
|
1334
|
-
|
|
1335
|
-
if ( pcount ) {
|
|
1336
|
-
|
|
1337
|
-
uvalue = new Array( pcount );
|
|
1338
|
-
|
|
1339
|
-
for ( var mi = 0; mi < pcount; mi ++ ) {
|
|
1340
|
-
|
|
1341
|
-
uvalue[ mi ] = new WEBGL_TYPE[ ptype ]();
|
|
1342
|
-
|
|
1343
|
-
}
|
|
1344
|
-
|
|
1345
|
-
if ( shaderParam && shaderParam.value ) {
|
|
1346
|
-
|
|
1347
|
-
var m4v = shaderParam.value;
|
|
1348
|
-
uvalue.fromArray( m4v );
|
|
1349
|
-
|
|
1350
|
-
}
|
|
1351
|
-
|
|
1352
|
-
if ( value ) {
|
|
1353
|
-
|
|
1354
|
-
uvalue.fromArray( value );
|
|
1355
|
-
|
|
1356
|
-
}
|
|
1357
|
-
|
|
1358
|
-
} else {
|
|
1359
|
-
|
|
1360
|
-
if ( shaderParam && shaderParam.value ) {
|
|
1361
|
-
|
|
1362
|
-
var m4 = shaderParam.value;
|
|
1363
|
-
uvalue.fromArray( m4 );
|
|
1364
|
-
|
|
1365
|
-
}
|
|
1366
|
-
|
|
1367
|
-
if ( value ) {
|
|
1368
|
-
|
|
1369
|
-
uvalue.fromArray( value );
|
|
1370
|
-
|
|
1371
|
-
}
|
|
1372
|
-
|
|
1373
|
-
}
|
|
1374
|
-
|
|
1375
|
-
break;
|
|
1376
|
-
|
|
1377
|
-
case WEBGL_CONSTANTS.SAMPLER_2D:
|
|
1378
|
-
|
|
1379
|
-
if ( value !== undefined ) {
|
|
1380
|
-
|
|
1381
|
-
uvalue = dependencies.textures[ value ];
|
|
1382
|
-
|
|
1383
|
-
} else if ( shaderParam.value !== undefined ) {
|
|
1384
|
-
|
|
1385
|
-
uvalue = dependencies.textures[ shaderParam.value ];
|
|
1386
|
-
|
|
1387
|
-
} else {
|
|
1388
|
-
|
|
1389
|
-
uvalue = null;
|
|
1390
|
-
|
|
1391
|
-
}
|
|
1392
|
-
|
|
1393
|
-
break;
|
|
1394
|
-
|
|
1395
|
-
}
|
|
1396
|
-
|
|
1397
|
-
materialParams.uniforms[ uniformId ] = {
|
|
1398
|
-
value: uvalue,
|
|
1399
|
-
semantic: usemantic,
|
|
1400
|
-
node: unode
|
|
1401
|
-
};
|
|
1402
|
-
|
|
1403
|
-
} else {
|
|
1404
|
-
|
|
1405
|
-
throw new Error( "Unknown shader uniform param type: " + ptype );
|
|
1406
|
-
|
|
1407
|
-
}
|
|
1408
|
-
|
|
1409
|
-
}
|
|
1410
|
-
|
|
1411
|
-
var states = technique.states || {};
|
|
1412
|
-
var enables = states.enable || [];
|
|
1413
|
-
var functions = states.functions || {};
|
|
1414
|
-
|
|
1415
|
-
var enableCullFace = false;
|
|
1416
|
-
var enableDepthTest = false;
|
|
1417
|
-
var enableBlend = false;
|
|
1418
|
-
|
|
1419
|
-
for ( var i = 0, il = enables.length; i < il; i ++ ) {
|
|
1420
|
-
|
|
1421
|
-
var enable = enables[ i ];
|
|
1422
|
-
|
|
1423
|
-
switch ( STATES_ENABLES[ enable ] ) {
|
|
1424
|
-
|
|
1425
|
-
case 'CULL_FACE':
|
|
1426
|
-
|
|
1427
|
-
enableCullFace = true;
|
|
1428
|
-
|
|
1429
|
-
break;
|
|
1430
|
-
|
|
1431
|
-
case 'DEPTH_TEST':
|
|
1432
|
-
|
|
1433
|
-
enableDepthTest = true;
|
|
1434
|
-
|
|
1435
|
-
break;
|
|
1436
|
-
|
|
1437
|
-
case 'BLEND':
|
|
1438
|
-
|
|
1439
|
-
enableBlend = true;
|
|
1440
|
-
|
|
1441
|
-
break;
|
|
1442
|
-
|
|
1443
|
-
// TODO: implement
|
|
1444
|
-
case 'SCISSOR_TEST':
|
|
1445
|
-
case 'POLYGON_OFFSET_FILL':
|
|
1446
|
-
case 'SAMPLE_ALPHA_TO_COVERAGE':
|
|
1447
|
-
|
|
1448
|
-
break;
|
|
1449
|
-
|
|
1450
|
-
default:
|
|
1451
|
-
|
|
1452
|
-
throw new Error( "Unknown technique.states.enable: " + enable );
|
|
1453
|
-
|
|
1454
|
-
}
|
|
1455
|
-
|
|
1456
|
-
}
|
|
1457
|
-
|
|
1458
|
-
if ( enableCullFace ) {
|
|
1459
|
-
|
|
1460
|
-
materialParams.side = functions.cullFace !== undefined ? WEBGL_SIDES[ functions.cullFace ] : THREE.FrontSide;
|
|
1461
|
-
|
|
1462
|
-
} else {
|
|
1463
|
-
|
|
1464
|
-
materialParams.side = THREE.DoubleSide;
|
|
1465
|
-
|
|
1466
|
-
}
|
|
1467
|
-
|
|
1468
|
-
materialParams.depthTest = enableDepthTest;
|
|
1469
|
-
materialParams.depthFunc = functions.depthFunc !== undefined ? WEBGL_DEPTH_FUNCS[ functions.depthFunc ] : THREE.LessDepth;
|
|
1470
|
-
materialParams.depthWrite = functions.depthMask !== undefined ? functions.depthMask[ 0 ] : true;
|
|
1471
|
-
|
|
1472
|
-
materialParams.blending = enableBlend ? THREE.CustomBlending : THREE.NoBlending;
|
|
1473
|
-
materialParams.transparent = enableBlend;
|
|
1474
|
-
|
|
1475
|
-
var blendEquationSeparate = functions.blendEquationSeparate;
|
|
1476
|
-
|
|
1477
|
-
if ( blendEquationSeparate !== undefined ) {
|
|
1478
|
-
|
|
1479
|
-
materialParams.blendEquation = WEBGL_BLEND_EQUATIONS[ blendEquationSeparate[ 0 ] ];
|
|
1480
|
-
materialParams.blendEquationAlpha = WEBGL_BLEND_EQUATIONS[ blendEquationSeparate[ 1 ] ];
|
|
1481
|
-
|
|
1482
|
-
} else {
|
|
1483
|
-
|
|
1484
|
-
materialParams.blendEquation = THREE.AddEquation;
|
|
1485
|
-
materialParams.blendEquationAlpha = THREE.AddEquation;
|
|
1486
|
-
|
|
1487
|
-
}
|
|
1488
|
-
|
|
1489
|
-
var blendFuncSeparate = functions.blendFuncSeparate;
|
|
1490
|
-
|
|
1491
|
-
if ( blendFuncSeparate !== undefined ) {
|
|
1492
|
-
|
|
1493
|
-
materialParams.blendSrc = WEBGL_BLEND_FUNCS[ blendFuncSeparate[ 0 ] ];
|
|
1494
|
-
materialParams.blendDst = WEBGL_BLEND_FUNCS[ blendFuncSeparate[ 1 ] ];
|
|
1495
|
-
materialParams.blendSrcAlpha = WEBGL_BLEND_FUNCS[ blendFuncSeparate[ 2 ] ];
|
|
1496
|
-
materialParams.blendDstAlpha = WEBGL_BLEND_FUNCS[ blendFuncSeparate[ 3 ] ];
|
|
1497
|
-
|
|
1498
|
-
} else {
|
|
1499
|
-
|
|
1500
|
-
materialParams.blendSrc = THREE.OneFactor;
|
|
1501
|
-
materialParams.blendDst = THREE.ZeroFactor;
|
|
1502
|
-
materialParams.blendSrcAlpha = THREE.OneFactor;
|
|
1503
|
-
materialParams.blendDstAlpha = THREE.ZeroFactor;
|
|
1504
|
-
|
|
1505
|
-
}
|
|
1506
|
-
|
|
1507
|
-
}
|
|
1508
|
-
|
|
1509
|
-
}
|
|
1510
|
-
|
|
1511
|
-
if ( Array.isArray( materialValues.diffuse ) ) {
|
|
1512
|
-
|
|
1513
|
-
materialParams.color = new THREE.Color().fromArray( materialValues.diffuse );
|
|
1514
|
-
|
|
1515
|
-
} else if ( typeof( materialValues.diffuse ) === 'string' ) {
|
|
1516
|
-
|
|
1517
|
-
materialParams.map = dependencies.textures[ materialValues.diffuse ];
|
|
1518
|
-
|
|
1519
|
-
}
|
|
1520
|
-
|
|
1521
|
-
delete materialParams.diffuse;
|
|
1522
|
-
|
|
1523
|
-
if ( typeof( materialValues.reflective ) === 'string' ) {
|
|
1524
|
-
|
|
1525
|
-
materialParams.envMap = dependencies.textures[ materialValues.reflective ];
|
|
1526
|
-
|
|
1527
|
-
}
|
|
1528
|
-
|
|
1529
|
-
if ( typeof( materialValues.bump ) === 'string' ) {
|
|
1530
|
-
|
|
1531
|
-
materialParams.bumpMap = dependencies.textures[ materialValues.bump ];
|
|
1532
|
-
|
|
1533
|
-
}
|
|
1534
|
-
|
|
1535
|
-
if ( Array.isArray( materialValues.emission ) ) {
|
|
1536
|
-
|
|
1537
|
-
if ( materialType === THREE.MeshBasicMaterial ) {
|
|
1538
|
-
|
|
1539
|
-
materialParams.color = new THREE.Color().fromArray( materialValues.emission );
|
|
1540
|
-
|
|
1541
|
-
} else {
|
|
1542
|
-
|
|
1543
|
-
materialParams.emissive = new THREE.Color().fromArray( materialValues.emission );
|
|
1544
|
-
|
|
1545
|
-
}
|
|
1546
|
-
|
|
1547
|
-
} else if ( typeof( materialValues.emission ) === 'string' ) {
|
|
1548
|
-
|
|
1549
|
-
if ( materialType === THREE.MeshBasicMaterial ) {
|
|
1550
|
-
|
|
1551
|
-
materialParams.map = dependencies.textures[ materialValues.emission ];
|
|
1552
|
-
|
|
1553
|
-
} else {
|
|
1554
|
-
|
|
1555
|
-
materialParams.emissiveMap = dependencies.textures[ materialValues.emission ];
|
|
1556
|
-
|
|
1557
|
-
}
|
|
1558
|
-
|
|
1559
|
-
}
|
|
1560
|
-
|
|
1561
|
-
if ( Array.isArray( materialValues.specular ) ) {
|
|
1562
|
-
|
|
1563
|
-
materialParams.specular = new THREE.Color().fromArray( materialValues.specular );
|
|
1564
|
-
|
|
1565
|
-
} else if ( typeof( materialValues.specular ) === 'string' ) {
|
|
1566
|
-
|
|
1567
|
-
materialParams.specularMap = dependencies.textures[ materialValues.specular ];
|
|
1568
|
-
|
|
1569
|
-
}
|
|
1570
|
-
|
|
1571
|
-
if ( materialValues.shininess !== undefined ) {
|
|
1572
|
-
|
|
1573
|
-
materialParams.shininess = materialValues.shininess;
|
|
1574
|
-
|
|
1575
|
-
}
|
|
1576
|
-
|
|
1577
|
-
var _material = new materialType( materialParams );
|
|
1578
|
-
if ( material.name !== undefined ) _material.name = material.name;
|
|
1579
|
-
|
|
1580
|
-
return _material;
|
|
1581
|
-
|
|
1582
|
-
} );
|
|
1583
|
-
|
|
1584
|
-
} );
|
|
1585
|
-
|
|
1586
|
-
};
|
|
1587
|
-
|
|
1588
|
-
GLTFParser.prototype.loadMeshes = function () {
|
|
1589
|
-
|
|
1590
|
-
var json = this.json;
|
|
1591
|
-
|
|
1592
|
-
return this._withDependencies( [
|
|
1593
|
-
|
|
1594
|
-
"accessors",
|
|
1595
|
-
"materials"
|
|
1596
|
-
|
|
1597
|
-
] ).then( function ( dependencies ) {
|
|
1598
|
-
|
|
1599
|
-
return _each( json.meshes, function ( mesh ) {
|
|
1600
|
-
|
|
1601
|
-
var group = new THREE.Group();
|
|
1602
|
-
if ( mesh.name !== undefined ) group.name = mesh.name;
|
|
1603
|
-
|
|
1604
|
-
if ( mesh.extras ) group.userData = mesh.extras;
|
|
1605
|
-
|
|
1606
|
-
var primitives = mesh.primitives || [];
|
|
1607
|
-
|
|
1608
|
-
for ( var name in primitives ) {
|
|
1609
|
-
|
|
1610
|
-
var primitive = primitives[ name ];
|
|
1611
|
-
|
|
1612
|
-
if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === undefined ) {
|
|
1613
|
-
|
|
1614
|
-
var geometry = new THREE.BufferGeometry();
|
|
1615
|
-
|
|
1616
|
-
var attributes = primitive.attributes;
|
|
1617
|
-
|
|
1618
|
-
for ( var attributeId in attributes ) {
|
|
1619
|
-
|
|
1620
|
-
var attributeEntry = attributes[ attributeId ];
|
|
1621
|
-
|
|
1622
|
-
if ( ! attributeEntry ) return;
|
|
1623
|
-
|
|
1624
|
-
var bufferAttribute = dependencies.accessors[ attributeEntry ];
|
|
1625
|
-
|
|
1626
|
-
switch ( attributeId ) {
|
|
1627
|
-
|
|
1628
|
-
case 'POSITION':
|
|
1629
|
-
geometry.addAttribute( 'position', bufferAttribute );
|
|
1630
|
-
break;
|
|
1631
|
-
|
|
1632
|
-
case 'NORMAL':
|
|
1633
|
-
geometry.addAttribute( 'normal', bufferAttribute );
|
|
1634
|
-
break;
|
|
1635
|
-
|
|
1636
|
-
case 'TEXCOORD_0':
|
|
1637
|
-
case 'TEXCOORD0':
|
|
1638
|
-
case 'TEXCOORD':
|
|
1639
|
-
geometry.addAttribute( 'uv', bufferAttribute );
|
|
1640
|
-
break;
|
|
1641
|
-
|
|
1642
|
-
case 'TEXCOORD_1':
|
|
1643
|
-
geometry.addAttribute( 'uv2', bufferAttribute );
|
|
1644
|
-
break;
|
|
1645
|
-
|
|
1646
|
-
case 'COLOR_0':
|
|
1647
|
-
case 'COLOR0':
|
|
1648
|
-
case 'COLOR':
|
|
1649
|
-
geometry.addAttribute( 'color', bufferAttribute );
|
|
1650
|
-
break;
|
|
1651
|
-
|
|
1652
|
-
case 'WEIGHT':
|
|
1653
|
-
geometry.addAttribute( 'skinWeight', bufferAttribute );
|
|
1654
|
-
break;
|
|
1655
|
-
|
|
1656
|
-
case 'JOINT':
|
|
1657
|
-
geometry.addAttribute( 'skinIndex', bufferAttribute );
|
|
1658
|
-
break;
|
|
1659
|
-
|
|
1660
|
-
}
|
|
1661
|
-
|
|
1662
|
-
}
|
|
1663
|
-
|
|
1664
|
-
if ( primitive.indices ) {
|
|
1665
|
-
|
|
1666
|
-
geometry.setIndex( dependencies.accessors[ primitive.indices ] );
|
|
1667
|
-
|
|
1668
|
-
}
|
|
1669
|
-
|
|
1670
|
-
var material = dependencies.materials !== undefined ? dependencies.materials[ primitive.material ] : createDefaultMaterial();
|
|
1671
|
-
|
|
1672
|
-
var meshNode = new THREE.Mesh( geometry, material );
|
|
1673
|
-
meshNode.castShadow = true;
|
|
1674
|
-
meshNode.name = ( name === "0" ? group.name : group.name + name );
|
|
1675
|
-
|
|
1676
|
-
if ( primitive.extras ) meshNode.userData = primitive.extras;
|
|
1677
|
-
|
|
1678
|
-
group.add( meshNode );
|
|
1679
|
-
|
|
1680
|
-
} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {
|
|
1681
|
-
|
|
1682
|
-
var geometry = new THREE.BufferGeometry();
|
|
1683
|
-
|
|
1684
|
-
var attributes = primitive.attributes;
|
|
1685
|
-
|
|
1686
|
-
for ( var attributeId in attributes ) {
|
|
1687
|
-
|
|
1688
|
-
var attributeEntry = attributes[ attributeId ];
|
|
1689
|
-
|
|
1690
|
-
if ( ! attributeEntry ) return;
|
|
1691
|
-
|
|
1692
|
-
var bufferAttribute = dependencies.accessors[ attributeEntry ];
|
|
1693
|
-
|
|
1694
|
-
switch ( attributeId ) {
|
|
1695
|
-
|
|
1696
|
-
case 'POSITION':
|
|
1697
|
-
geometry.addAttribute( 'position', bufferAttribute );
|
|
1698
|
-
break;
|
|
1699
|
-
|
|
1700
|
-
case 'COLOR_0':
|
|
1701
|
-
case 'COLOR0':
|
|
1702
|
-
case 'COLOR':
|
|
1703
|
-
geometry.addAttribute( 'color', bufferAttribute );
|
|
1704
|
-
break;
|
|
1705
|
-
|
|
1706
|
-
}
|
|
1707
|
-
|
|
1708
|
-
}
|
|
1709
|
-
|
|
1710
|
-
var material = dependencies.materials[ primitive.material ];
|
|
1711
|
-
|
|
1712
|
-
var meshNode;
|
|
1713
|
-
|
|
1714
|
-
if ( primitive.indices ) {
|
|
1715
|
-
|
|
1716
|
-
geometry.setIndex( dependencies.accessors[ primitive.indices ] );
|
|
1717
|
-
|
|
1718
|
-
meshNode = new THREE.LineSegments( geometry, material );
|
|
1719
|
-
|
|
1720
|
-
} else {
|
|
1721
|
-
|
|
1722
|
-
meshNode = new THREE.Line( geometry, material );
|
|
1723
|
-
|
|
1724
|
-
}
|
|
1725
|
-
|
|
1726
|
-
meshNode.name = ( name === "0" ? group.name : group.name + name );
|
|
1727
|
-
|
|
1728
|
-
if ( primitive.extras ) meshNode.userData = primitive.extras;
|
|
1729
|
-
|
|
1730
|
-
group.add( meshNode );
|
|
1731
|
-
|
|
1732
|
-
} else {
|
|
1733
|
-
|
|
1734
|
-
console.warn( "Only triangular and line primitives are supported" );
|
|
1735
|
-
|
|
1736
|
-
}
|
|
1737
|
-
|
|
1738
|
-
}
|
|
1739
|
-
|
|
1740
|
-
return group;
|
|
1741
|
-
|
|
1742
|
-
} );
|
|
1743
|
-
|
|
1744
|
-
} );
|
|
1745
|
-
|
|
1746
|
-
};
|
|
1747
|
-
|
|
1748
|
-
GLTFParser.prototype.loadCameras = function () {
|
|
1749
|
-
|
|
1750
|
-
var json = this.json;
|
|
1751
|
-
|
|
1752
|
-
return _each( json.cameras, function ( camera ) {
|
|
1753
|
-
|
|
1754
|
-
if ( camera.type == "perspective" && camera.perspective ) {
|
|
1755
|
-
|
|
1756
|
-
var yfov = camera.perspective.yfov;
|
|
1757
|
-
var aspectRatio = camera.perspective.aspectRatio !== undefined ? camera.perspective.aspectRatio : 1;
|
|
1758
|
-
|
|
1759
|
-
// According to COLLADA spec...
|
|
1760
|
-
// aspectRatio = xfov / yfov
|
|
1761
|
-
var xfov = yfov * aspectRatio;
|
|
1762
|
-
|
|
1763
|
-
var _camera = new THREE.PerspectiveCamera( THREE.Math.radToDeg( xfov ), aspectRatio, camera.perspective.znear || 1, camera.perspective.zfar || 2e6 );
|
|
1764
|
-
if ( camera.name !== undefined ) _camera.name = camera.name;
|
|
1765
|
-
|
|
1766
|
-
if ( camera.extras ) _camera.userData = camera.extras;
|
|
1767
|
-
|
|
1768
|
-
return _camera;
|
|
1769
|
-
|
|
1770
|
-
} else if ( camera.type == "orthographic" && camera.orthographic ) {
|
|
1771
|
-
|
|
1772
|
-
var _camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, camera.orthographic.znear, camera.orthographic.zfar );
|
|
1773
|
-
if ( camera.name !== undefined ) _camera.name = camera.name;
|
|
1774
|
-
|
|
1775
|
-
if ( camera.extras ) _camera.userData = camera.extras;
|
|
1776
|
-
|
|
1777
|
-
return _camera;
|
|
1778
|
-
|
|
1779
|
-
}
|
|
1780
|
-
|
|
1781
|
-
} );
|
|
1782
|
-
|
|
1783
|
-
};
|
|
1784
|
-
|
|
1785
|
-
GLTFParser.prototype.loadSkins = function () {
|
|
1786
|
-
|
|
1787
|
-
var json = this.json;
|
|
1788
|
-
|
|
1789
|
-
return this._withDependencies( [
|
|
1790
|
-
|
|
1791
|
-
"accessors"
|
|
1792
|
-
|
|
1793
|
-
] ).then( function ( dependencies ) {
|
|
1794
|
-
|
|
1795
|
-
return _each( json.skins, function ( skin ) {
|
|
1796
|
-
|
|
1797
|
-
var bindShapeMatrix = new THREE.Matrix4();
|
|
1798
|
-
|
|
1799
|
-
if ( skin.bindShapeMatrix !== undefined ) bindShapeMatrix.fromArray( skin.bindShapeMatrix );
|
|
1800
|
-
|
|
1801
|
-
var _skin = {
|
|
1802
|
-
bindShapeMatrix: bindShapeMatrix,
|
|
1803
|
-
jointNames: skin.jointNames,
|
|
1804
|
-
inverseBindMatrices: dependencies.accessors[ skin.inverseBindMatrices ]
|
|
1805
|
-
};
|
|
1806
|
-
|
|
1807
|
-
return _skin;
|
|
1808
|
-
|
|
1809
|
-
} );
|
|
1810
|
-
|
|
1811
|
-
} );
|
|
1812
|
-
|
|
1813
|
-
};
|
|
1814
|
-
|
|
1815
|
-
GLTFParser.prototype.loadAnimations = function () {
|
|
1816
|
-
|
|
1817
|
-
var json = this.json;
|
|
1818
|
-
|
|
1819
|
-
return this._withDependencies( [
|
|
1820
|
-
|
|
1821
|
-
"accessors",
|
|
1822
|
-
"nodes"
|
|
1823
|
-
|
|
1824
|
-
] ).then( function ( dependencies ) {
|
|
1825
|
-
|
|
1826
|
-
return _each( json.animations, function ( animation, animationId ) {
|
|
1827
|
-
|
|
1828
|
-
var tracks = [];
|
|
1829
|
-
|
|
1830
|
-
for ( var channelId in animation.channels ) {
|
|
1831
|
-
|
|
1832
|
-
var channel = animation.channels[ channelId ];
|
|
1833
|
-
var sampler = animation.samplers[ channel.sampler ];
|
|
1834
|
-
|
|
1835
|
-
if ( sampler ) {
|
|
1836
|
-
|
|
1837
|
-
var target = channel.target;
|
|
1838
|
-
var name = target.id;
|
|
1839
|
-
var input = animation.parameters !== undefined ? animation.parameters[ sampler.input ] : sampler.input;
|
|
1840
|
-
var output = animation.parameters !== undefined ? animation.parameters[ sampler.output ] : sampler.output;
|
|
1841
|
-
|
|
1842
|
-
var inputAccessor = dependencies.accessors[ input ];
|
|
1843
|
-
var outputAccessor = dependencies.accessors[ output ];
|
|
1844
|
-
|
|
1845
|
-
var node = dependencies.nodes[ name ];
|
|
1846
|
-
|
|
1847
|
-
if ( node ) {
|
|
1848
|
-
|
|
1849
|
-
node.updateMatrix();
|
|
1850
|
-
node.matrixAutoUpdate = true;
|
|
1851
|
-
|
|
1852
|
-
var TypedKeyframeTrack = PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.rotation
|
|
1853
|
-
? THREE.QuaternionKeyframeTrack
|
|
1854
|
-
: THREE.VectorKeyframeTrack;
|
|
1855
|
-
|
|
1856
|
-
var targetName = node.name ? node.name : node.uuid;
|
|
1857
|
-
var interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : THREE.InterpolateLinear;
|
|
1858
|
-
|
|
1859
|
-
// KeyframeTrack.optimize() will modify given 'times' and 'values'
|
|
1860
|
-
// buffers before creating a truncated copy to keep. Because buffers may
|
|
1861
|
-
// be reused by other tracks, make copies here.
|
|
1862
|
-
tracks.push( new TypedKeyframeTrack(
|
|
1863
|
-
targetName + '.' + PATH_PROPERTIES[ target.path ],
|
|
1864
|
-
THREE.AnimationUtils.arraySlice( inputAccessor.array, 0 ),
|
|
1865
|
-
THREE.AnimationUtils.arraySlice( outputAccessor.array, 0 ),
|
|
1866
|
-
interpolation
|
|
1867
|
-
) );
|
|
1868
|
-
|
|
1869
|
-
}
|
|
1870
|
-
|
|
1871
|
-
}
|
|
1872
|
-
|
|
1873
|
-
}
|
|
1874
|
-
|
|
1875
|
-
var name = animation.name !== undefined ? animation.name : "animation_" + animationId;
|
|
1876
|
-
|
|
1877
|
-
return new THREE.AnimationClip( name, undefined, tracks );
|
|
1878
|
-
|
|
1879
|
-
} );
|
|
1880
|
-
|
|
1881
|
-
} );
|
|
1882
|
-
|
|
1883
|
-
};
|
|
1884
|
-
|
|
1885
|
-
GLTFParser.prototype.loadNodes = function () {
|
|
1886
|
-
|
|
1887
|
-
var json = this.json;
|
|
1888
|
-
var extensions = this.extensions;
|
|
1889
|
-
var scope = this;
|
|
1890
|
-
|
|
1891
|
-
return _each( json.nodes, function ( node ) {
|
|
1892
|
-
|
|
1893
|
-
var matrix = new THREE.Matrix4();
|
|
1894
|
-
|
|
1895
|
-
var _node;
|
|
1896
|
-
|
|
1897
|
-
if ( node.jointName ) {
|
|
1898
|
-
|
|
1899
|
-
_node = new THREE.Bone();
|
|
1900
|
-
_node.name = node.name !== undefined ? node.name : node.jointName;
|
|
1901
|
-
_node.jointName = node.jointName;
|
|
1902
|
-
|
|
1903
|
-
} else {
|
|
1904
|
-
|
|
1905
|
-
_node = new THREE.Object3D();
|
|
1906
|
-
if ( node.name !== undefined ) _node.name = node.name;
|
|
1907
|
-
|
|
1908
|
-
}
|
|
1909
|
-
|
|
1910
|
-
if ( node.extras ) _node.userData = node.extras;
|
|
1911
|
-
|
|
1912
|
-
if ( node.matrix !== undefined ) {
|
|
1913
|
-
|
|
1914
|
-
matrix.fromArray( node.matrix );
|
|
1915
|
-
_node.applyMatrix( matrix );
|
|
1916
|
-
|
|
1917
|
-
} else {
|
|
1918
|
-
|
|
1919
|
-
if ( node.translation !== undefined ) {
|
|
1920
|
-
|
|
1921
|
-
_node.position.fromArray( node.translation );
|
|
1922
|
-
|
|
1923
|
-
}
|
|
1924
|
-
|
|
1925
|
-
if ( node.rotation !== undefined ) {
|
|
1926
|
-
|
|
1927
|
-
_node.quaternion.fromArray( node.rotation );
|
|
1928
|
-
|
|
1929
|
-
}
|
|
1930
|
-
|
|
1931
|
-
if ( node.scale !== undefined ) {
|
|
1932
|
-
|
|
1933
|
-
_node.scale.fromArray( node.scale );
|
|
1934
|
-
|
|
1935
|
-
}
|
|
1936
|
-
|
|
1937
|
-
}
|
|
1938
|
-
|
|
1939
|
-
return _node;
|
|
1940
|
-
|
|
1941
|
-
} ).then( function ( __nodes ) {
|
|
1942
|
-
|
|
1943
|
-
return scope._withDependencies( [
|
|
1944
|
-
|
|
1945
|
-
"meshes",
|
|
1946
|
-
"skins",
|
|
1947
|
-
"cameras"
|
|
1948
|
-
|
|
1949
|
-
] ).then( function ( dependencies ) {
|
|
1950
|
-
|
|
1951
|
-
return _each( __nodes, function ( _node, nodeId ) {
|
|
1952
|
-
|
|
1953
|
-
var node = json.nodes[ nodeId ];
|
|
1954
|
-
|
|
1955
|
-
if ( node.meshes !== undefined ) {
|
|
1956
|
-
|
|
1957
|
-
for ( var meshId in node.meshes ) {
|
|
1958
|
-
|
|
1959
|
-
var mesh = node.meshes[ meshId ];
|
|
1960
|
-
var group = dependencies.meshes[ mesh ];
|
|
1961
|
-
|
|
1962
|
-
if ( group === undefined ) {
|
|
1963
|
-
|
|
1964
|
-
console.warn( 'LegacyGLTFLoader: Couldn\'t find node "' + mesh + '".' );
|
|
1965
|
-
continue;
|
|
1966
|
-
|
|
1967
|
-
}
|
|
1968
|
-
|
|
1969
|
-
for ( var childrenId in group.children ) {
|
|
1970
|
-
|
|
1971
|
-
var child = group.children[ childrenId ];
|
|
1972
|
-
|
|
1973
|
-
// clone Mesh to add to _node
|
|
1974
|
-
|
|
1975
|
-
var originalMaterial = child.material;
|
|
1976
|
-
var originalGeometry = child.geometry;
|
|
1977
|
-
var originalUserData = child.userData;
|
|
1978
|
-
var originalName = child.name;
|
|
1979
|
-
|
|
1980
|
-
var material;
|
|
1981
|
-
|
|
1982
|
-
if ( originalMaterial.isDeferredShaderMaterial ) {
|
|
1983
|
-
|
|
1984
|
-
originalMaterial = material = originalMaterial.create();
|
|
1985
|
-
|
|
1986
|
-
} else {
|
|
1987
|
-
|
|
1988
|
-
material = originalMaterial;
|
|
1989
|
-
|
|
1990
|
-
}
|
|
1991
|
-
|
|
1992
|
-
switch ( child.type ) {
|
|
1993
|
-
|
|
1994
|
-
case 'LineSegments':
|
|
1995
|
-
child = new THREE.LineSegments( originalGeometry, material );
|
|
1996
|
-
break;
|
|
1997
|
-
|
|
1998
|
-
case 'LineLoop':
|
|
1999
|
-
child = new THREE.LineLoop( originalGeometry, material );
|
|
2000
|
-
break;
|
|
2001
|
-
|
|
2002
|
-
case 'Line':
|
|
2003
|
-
child = new THREE.Line( originalGeometry, material );
|
|
2004
|
-
break;
|
|
2005
|
-
|
|
2006
|
-
default:
|
|
2007
|
-
child = new THREE.Mesh( originalGeometry, material );
|
|
2008
|
-
|
|
2009
|
-
}
|
|
2010
|
-
|
|
2011
|
-
child.castShadow = true;
|
|
2012
|
-
child.userData = originalUserData;
|
|
2013
|
-
child.name = originalName;
|
|
2014
|
-
|
|
2015
|
-
var skinEntry;
|
|
2016
|
-
|
|
2017
|
-
if ( node.skin ) {
|
|
2018
|
-
|
|
2019
|
-
skinEntry = dependencies.skins[ node.skin ];
|
|
2020
|
-
|
|
2021
|
-
}
|
|
2022
|
-
|
|
2023
|
-
// Replace Mesh with SkinnedMesh in library
|
|
2024
|
-
if ( skinEntry ) {
|
|
2025
|
-
|
|
2026
|
-
var getJointNode = function ( jointId ) {
|
|
2027
|
-
|
|
2028
|
-
var keys = Object.keys( __nodes );
|
|
2029
|
-
|
|
2030
|
-
for ( var i = 0, il = keys.length; i < il; i ++ ) {
|
|
2031
|
-
|
|
2032
|
-
var n = __nodes[ keys[ i ] ];
|
|
2033
|
-
|
|
2034
|
-
if ( n.jointName === jointId ) return n;
|
|
2035
|
-
|
|
2036
|
-
}
|
|
2037
|
-
|
|
2038
|
-
return null;
|
|
2039
|
-
|
|
2040
|
-
};
|
|
2041
|
-
|
|
2042
|
-
var geometry = originalGeometry;
|
|
2043
|
-
var material = originalMaterial;
|
|
2044
|
-
material.skinning = true;
|
|
2045
|
-
|
|
2046
|
-
child = new THREE.SkinnedMesh( geometry, material, false );
|
|
2047
|
-
child.castShadow = true;
|
|
2048
|
-
child.userData = originalUserData;
|
|
2049
|
-
child.name = originalName;
|
|
2050
|
-
|
|
2051
|
-
var bones = [];
|
|
2052
|
-
var boneInverses = [];
|
|
2053
|
-
|
|
2054
|
-
for ( var i = 0, l = skinEntry.jointNames.length; i < l; i ++ ) {
|
|
2055
|
-
|
|
2056
|
-
var jointId = skinEntry.jointNames[ i ];
|
|
2057
|
-
var jointNode = getJointNode( jointId );
|
|
2058
|
-
|
|
2059
|
-
if ( jointNode ) {
|
|
2060
|
-
|
|
2061
|
-
bones.push( jointNode );
|
|
2062
|
-
|
|
2063
|
-
var m = skinEntry.inverseBindMatrices.array;
|
|
2064
|
-
var mat = new THREE.Matrix4().fromArray( m, i * 16 );
|
|
2065
|
-
boneInverses.push( mat );
|
|
2066
|
-
|
|
2067
|
-
} else {
|
|
2068
|
-
|
|
2069
|
-
console.warn( "WARNING: joint: '" + jointId + "' could not be found" );
|
|
2070
|
-
|
|
2071
|
-
}
|
|
2072
|
-
|
|
2073
|
-
}
|
|
2074
|
-
|
|
2075
|
-
child.bind( new THREE.Skeleton( bones, boneInverses, false ), skinEntry.bindShapeMatrix );
|
|
2076
|
-
|
|
2077
|
-
var buildBoneGraph = function ( parentJson, parentObject, property ) {
|
|
2078
|
-
|
|
2079
|
-
var children = parentJson[ property ];
|
|
2080
|
-
|
|
2081
|
-
if ( children === undefined ) return;
|
|
2082
|
-
|
|
2083
|
-
for ( var i = 0, il = children.length; i < il; i ++ ) {
|
|
2084
|
-
|
|
2085
|
-
var nodeId = children[ i ];
|
|
2086
|
-
var bone = __nodes[ nodeId ];
|
|
2087
|
-
var boneJson = json.nodes[ nodeId ];
|
|
2088
|
-
|
|
2089
|
-
if ( bone !== undefined && bone.isBone === true && boneJson !== undefined ) {
|
|
2090
|
-
|
|
2091
|
-
parentObject.add( bone );
|
|
2092
|
-
buildBoneGraph( boneJson, bone, 'children' );
|
|
2093
|
-
|
|
2094
|
-
}
|
|
2095
|
-
|
|
2096
|
-
}
|
|
2097
|
-
|
|
2098
|
-
};
|
|
2099
|
-
|
|
2100
|
-
buildBoneGraph( node, child, 'skeletons' );
|
|
2101
|
-
|
|
2102
|
-
}
|
|
2103
|
-
|
|
2104
|
-
_node.add( child );
|
|
2105
|
-
|
|
2106
|
-
}
|
|
2107
|
-
|
|
2108
|
-
}
|
|
2109
|
-
|
|
2110
|
-
}
|
|
2111
|
-
|
|
2112
|
-
if ( node.camera !== undefined ) {
|
|
2113
|
-
|
|
2114
|
-
var camera = dependencies.cameras[ node.camera ];
|
|
2115
|
-
|
|
2116
|
-
_node.add( camera );
|
|
2117
|
-
|
|
2118
|
-
}
|
|
2119
|
-
|
|
2120
|
-
if ( node.extensions
|
|
2121
|
-
&& node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ]
|
|
2122
|
-
&& node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].light ) {
|
|
2123
|
-
|
|
2124
|
-
var extensionLights = extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].lights;
|
|
2125
|
-
var light = extensionLights[ node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].light ];
|
|
2126
|
-
|
|
2127
|
-
_node.add( light );
|
|
2128
|
-
|
|
2129
|
-
}
|
|
2130
|
-
|
|
2131
|
-
return _node;
|
|
2132
|
-
|
|
2133
|
-
} );
|
|
2134
|
-
|
|
2135
|
-
} );
|
|
2136
|
-
|
|
2137
|
-
} );
|
|
2138
|
-
|
|
2139
|
-
};
|
|
2140
|
-
|
|
2141
|
-
GLTFParser.prototype.loadScenes = function () {
|
|
2142
|
-
|
|
2143
|
-
var json = this.json;
|
|
2144
|
-
|
|
2145
|
-
// scene node hierachy builder
|
|
2146
|
-
|
|
2147
|
-
function buildNodeHierachy( nodeId, parentObject, allNodes ) {
|
|
2148
|
-
|
|
2149
|
-
var _node = allNodes[ nodeId ];
|
|
2150
|
-
parentObject.add( _node );
|
|
2151
|
-
|
|
2152
|
-
var node = json.nodes[ nodeId ];
|
|
2153
|
-
|
|
2154
|
-
if ( node.children ) {
|
|
2155
|
-
|
|
2156
|
-
var children = node.children;
|
|
2157
|
-
|
|
2158
|
-
for ( var i = 0, l = children.length; i < l; i ++ ) {
|
|
2159
|
-
|
|
2160
|
-
var child = children[ i ];
|
|
2161
|
-
buildNodeHierachy( child, _node, allNodes );
|
|
2162
|
-
|
|
2163
|
-
}
|
|
2164
|
-
|
|
2165
|
-
}
|
|
2166
|
-
|
|
2167
|
-
}
|
|
2168
|
-
|
|
2169
|
-
return this._withDependencies( [
|
|
2170
|
-
|
|
2171
|
-
"nodes"
|
|
2172
|
-
|
|
2173
|
-
] ).then( function ( dependencies ) {
|
|
2174
|
-
|
|
2175
|
-
return _each( json.scenes, function ( scene ) {
|
|
2176
|
-
|
|
2177
|
-
var _scene = new THREE.Scene();
|
|
2178
|
-
if ( scene.name !== undefined ) _scene.name = scene.name;
|
|
2179
|
-
|
|
2180
|
-
if ( scene.extras ) _scene.userData = scene.extras;
|
|
2181
|
-
|
|
2182
|
-
var nodes = scene.nodes || [];
|
|
2183
|
-
|
|
2184
|
-
for ( var i = 0, l = nodes.length; i < l; i ++ ) {
|
|
2185
|
-
|
|
2186
|
-
var nodeId = nodes[ i ];
|
|
2187
|
-
buildNodeHierachy( nodeId, _scene, dependencies.nodes );
|
|
2188
|
-
|
|
2189
|
-
}
|
|
2190
|
-
|
|
2191
|
-
_scene.traverse( function ( child ) {
|
|
2192
|
-
|
|
2193
|
-
// Register raw material meshes with LegacyGLTFLoader.Shaders
|
|
2194
|
-
if ( child.material && child.material.isRawShaderMaterial ) {
|
|
2195
|
-
|
|
2196
|
-
child.gltfShader = new GLTFShader( child, dependencies.nodes );
|
|
2197
|
-
child.onBeforeRender = function(renderer, scene, camera){
|
|
2198
|
-
this.gltfShader.update(scene, camera);
|
|
2199
|
-
};
|
|
2200
|
-
|
|
2201
|
-
}
|
|
2202
|
-
|
|
2203
|
-
} );
|
|
2204
|
-
|
|
2205
|
-
return _scene;
|
|
2206
|
-
|
|
2207
|
-
} );
|
|
2208
|
-
|
|
2209
|
-
} );
|
|
2210
|
-
|
|
2211
|
-
};
|
|
2212
|
-
|
|
2213
|
-
return LegacyGLTFLoader;
|
|
2214
|
-
|
|
2215
|
-
} )();
|
|
2216
|
-
export{LegacyGLTFLoader}
|