json-object-editor 0.9.901 → 0.10.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.
- package/CHANGELOG.md +2 -0
- package/app.js +5 -4
- package/css/jif/Read Me.txt +5 -5
- package/css/jif/demo-files/demo.css +153 -153
- package/css/jif/demo-files/demo.js +30 -30
- package/css/jif/demo.html +285 -285
- package/css/jif/fonts/joeiconfont.svg +24 -24
- package/css/jif/ie7/ie7.css +45 -45
- package/css/jif/ie7/ie7.js +46 -46
- package/css/jif/selection.json +573 -573
- package/css/joe.css +6 -6
- package/css/jquery-ui-1.10.4.custom.min.css +5 -5
- package/css/jquery-ui.min.css +6 -6
- package/css/jquery.timepicker.css +72 -72
- package/es5-build/capp/capp.js +1083 -1083
- package/es5-build/js/JsonObjectEditor_es5.jquery.craydent.js +11047 -11047
- package/es5-build/web-components/account-info.js +136 -136
- package/es5-build/web-components/capp-components.js +160 -160
- package/es5-build/web-components/capp-panel.js +85 -85
- package/es5-build/web-components/capp-view.js +73 -73
- package/es5-build/web-components/joe-autocomplete.js +149 -149
- package/es5-build/web-components/joe-button.js +132 -132
- package/es5-build/web-components/joe-card.js +92 -92
- package/es5-build/web-components/joe-component.js +74 -74
- package/es5-build/web-components/joe-field.js +70 -70
- package/es5-build/web-components/joe-list-item.js +176 -176
- package/es5-build/web-components/joe-user-cube.js +100 -100
- package/es5-build/web-components/report-components.js +133 -133
- package/grunt/build +86 -86
- package/grunt/package-lock.json +6301 -2489
- package/grunt/package.json +47 -47
- package/grunt/src +86 -86
- package/js/JsonObjectEditor.jquery.craydent.js +3 -2
- package/js/joe-full.js +11 -10
- package/js/joe.js +12 -11
- package/js/joe_es5.js +11056 -11056
- package/js/jquery.timepicker.min.js +1 -1
- package/js/leaflet.js +8 -8
- package/js/libs/adapter-latest.js +4400 -4400
- package/js/libs/craydent-1.9.2.js +11741 -11741
- package/js/libs/craydent-upload-2.0.0.js +394 -394
- package/js/libs/hammer.min.208.js +6 -6
- package/js/libs/jquery-3.5.1.min.js +2 -2
- package/js/libs/moment.min.js +6 -6
- package/js/native-shim.js +46 -46
- package/js/plugins/c3/c3.min.js +5 -5
- package/js/plugins/c3/d3.v3.min.js +4 -4
- package/js/plugins/threejs/Detector.js +78 -78
- package/js/plugins/threejs/LICENSE +21 -21
- package/js/plugins/threejs/MTLLoader.js +417 -417
- package/js/plugins/threejs/OBJLoader.js +564 -564
- package/js/plugins/threejs/OrbitControls.js +1037 -1037
- package/js/plugins/threejs/README.md +9 -9
- package/js/plugins/threejs/assets/female-croupier-2013-03-26.mtl +3 -3
- package/js/plugins/threejs/index.html +178 -178
- package/js/plugins/threejs/three.js +41507 -41507
- package/package copy.json +62 -0
- package/package.json +12 -13
- package/projectFilesBackup/.idea/workspace.xml +0 -424
|
@@ -1,417 +1,417 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Loads a Wavefront .mtl file specifying materials
|
|
3
|
-
*
|
|
4
|
-
* @author angelxuanchang
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
THREE.MTLLoader = function( manager ) {
|
|
8
|
-
|
|
9
|
-
this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
|
|
10
|
-
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
THREE.MTLLoader.prototype = {
|
|
14
|
-
|
|
15
|
-
constructor: THREE.MTLLoader,
|
|
16
|
-
|
|
17
|
-
load: function ( url, onLoad, onProgress, onError ) {
|
|
18
|
-
|
|
19
|
-
var scope = this;
|
|
20
|
-
|
|
21
|
-
var loader = new THREE.XHRLoader( this.manager );
|
|
22
|
-
loader.setPath( this.path );
|
|
23
|
-
loader.load( url, function ( text ) {
|
|
24
|
-
|
|
25
|
-
onLoad( scope.parse( text ) );
|
|
26
|
-
|
|
27
|
-
}, onProgress, onError );
|
|
28
|
-
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
setPath: function ( value ) {
|
|
32
|
-
|
|
33
|
-
this.path = value;
|
|
34
|
-
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
setBaseUrl: function( value ) {
|
|
38
|
-
|
|
39
|
-
// TODO: Merge with setPath()? Or rename to setTexturePath?
|
|
40
|
-
|
|
41
|
-
this.baseUrl = value;
|
|
42
|
-
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
setCrossOrigin: function ( value ) {
|
|
46
|
-
|
|
47
|
-
this.crossOrigin = value;
|
|
48
|
-
|
|
49
|
-
},
|
|
50
|
-
|
|
51
|
-
setMaterialOptions: function ( value ) {
|
|
52
|
-
|
|
53
|
-
this.materialOptions = value;
|
|
54
|
-
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Parses loaded MTL file
|
|
59
|
-
* @param text - Content of MTL file
|
|
60
|
-
* @return {THREE.MTLLoader.MaterialCreator}
|
|
61
|
-
*/
|
|
62
|
-
parse: function ( text ) {
|
|
63
|
-
|
|
64
|
-
var lines = text.split( "\n" );
|
|
65
|
-
var info = {};
|
|
66
|
-
var delimiter_pattern = /\s+/;
|
|
67
|
-
var materialsInfo = {};
|
|
68
|
-
|
|
69
|
-
for ( var i = 0; i < lines.length; i ++ ) {
|
|
70
|
-
|
|
71
|
-
var line = lines[ i ];
|
|
72
|
-
line = line.trim();
|
|
73
|
-
|
|
74
|
-
if ( line.length === 0 || line.charAt( 0 ) === '#' ) {
|
|
75
|
-
|
|
76
|
-
// Blank line or comment ignore
|
|
77
|
-
continue;
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
var pos = line.indexOf( ' ' );
|
|
82
|
-
|
|
83
|
-
var key = ( pos >= 0 ) ? line.substring( 0, pos ) : line;
|
|
84
|
-
key = key.toLowerCase();
|
|
85
|
-
|
|
86
|
-
var value = ( pos >= 0 ) ? line.substring( pos + 1 ) : "";
|
|
87
|
-
value = value.trim();
|
|
88
|
-
|
|
89
|
-
if ( key === "newmtl" ) {
|
|
90
|
-
|
|
91
|
-
// New material
|
|
92
|
-
|
|
93
|
-
info = { name: value };
|
|
94
|
-
materialsInfo[ value ] = info;
|
|
95
|
-
|
|
96
|
-
} else if ( info ) {
|
|
97
|
-
|
|
98
|
-
if ( key === "ka" || key === "kd" || key === "ks" ) {
|
|
99
|
-
|
|
100
|
-
var ss = value.split( delimiter_pattern, 3 );
|
|
101
|
-
info[ key ] = [ parseFloat( ss[ 0 ] ), parseFloat( ss[ 1 ] ), parseFloat( ss[ 2 ] ) ];
|
|
102
|
-
|
|
103
|
-
} else {
|
|
104
|
-
|
|
105
|
-
info[ key ] = value;
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
var materialCreator = new THREE.MTLLoader.MaterialCreator( this.baseUrl, this.materialOptions );
|
|
114
|
-
materialCreator.setCrossOrigin( this.crossOrigin );
|
|
115
|
-
materialCreator.setManager( this.manager );
|
|
116
|
-
materialCreator.setMaterials( materialsInfo );
|
|
117
|
-
return materialCreator;
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Create a new THREE-MTLLoader.MaterialCreator
|
|
125
|
-
* @param baseUrl - Url relative to which textures are loaded
|
|
126
|
-
* @param options - Set of options on how to construct the materials
|
|
127
|
-
* side: Which side to apply the material
|
|
128
|
-
* THREE.FrontSide (default), THREE.BackSide, THREE.DoubleSide
|
|
129
|
-
* wrap: What type of wrapping to apply for textures
|
|
130
|
-
* THREE.RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping
|
|
131
|
-
* normalizeRGB: RGBs need to be normalized to 0-1 from 0-255
|
|
132
|
-
* Default: false, assumed to be already normalized
|
|
133
|
-
* ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's
|
|
134
|
-
* Default: false
|
|
135
|
-
* @constructor
|
|
136
|
-
*/
|
|
137
|
-
|
|
138
|
-
THREE.MTLLoader.MaterialCreator = function( baseUrl, options ) {
|
|
139
|
-
|
|
140
|
-
this.baseUrl = baseUrl;
|
|
141
|
-
this.options = options;
|
|
142
|
-
this.materialsInfo = {};
|
|
143
|
-
this.materials = {};
|
|
144
|
-
this.materialsArray = [];
|
|
145
|
-
this.nameLookup = {};
|
|
146
|
-
|
|
147
|
-
this.side = ( this.options && this.options.side ) ? this.options.side : THREE.FrontSide;
|
|
148
|
-
this.wrap = ( this.options && this.options.wrap ) ? this.options.wrap : THREE.RepeatWrapping;
|
|
149
|
-
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
THREE.MTLLoader.MaterialCreator.prototype = {
|
|
153
|
-
|
|
154
|
-
constructor: THREE.MTLLoader.MaterialCreator,
|
|
155
|
-
|
|
156
|
-
setCrossOrigin: function ( value ) {
|
|
157
|
-
|
|
158
|
-
this.crossOrigin = value;
|
|
159
|
-
|
|
160
|
-
},
|
|
161
|
-
|
|
162
|
-
setManager: function ( value ) {
|
|
163
|
-
|
|
164
|
-
this.manager = value;
|
|
165
|
-
|
|
166
|
-
},
|
|
167
|
-
|
|
168
|
-
setMaterials: function( materialsInfo ) {
|
|
169
|
-
|
|
170
|
-
this.materialsInfo = this.convert( materialsInfo );
|
|
171
|
-
this.materials = {};
|
|
172
|
-
this.materialsArray = [];
|
|
173
|
-
this.nameLookup = {};
|
|
174
|
-
|
|
175
|
-
},
|
|
176
|
-
|
|
177
|
-
convert: function( materialsInfo ) {
|
|
178
|
-
|
|
179
|
-
if ( ! this.options ) return materialsInfo;
|
|
180
|
-
|
|
181
|
-
var converted = {};
|
|
182
|
-
|
|
183
|
-
for ( var mn in materialsInfo ) {
|
|
184
|
-
|
|
185
|
-
// Convert materials info into normalized form based on options
|
|
186
|
-
|
|
187
|
-
var mat = materialsInfo[ mn ];
|
|
188
|
-
|
|
189
|
-
var covmat = {};
|
|
190
|
-
|
|
191
|
-
converted[ mn ] = covmat;
|
|
192
|
-
|
|
193
|
-
for ( var prop in mat ) {
|
|
194
|
-
|
|
195
|
-
var save = true;
|
|
196
|
-
var value = mat[ prop ];
|
|
197
|
-
var lprop = prop.toLowerCase();
|
|
198
|
-
|
|
199
|
-
switch ( lprop ) {
|
|
200
|
-
|
|
201
|
-
case 'kd':
|
|
202
|
-
case 'ka':
|
|
203
|
-
case 'ks':
|
|
204
|
-
|
|
205
|
-
// Diffuse color (color under white light) using RGB values
|
|
206
|
-
|
|
207
|
-
if ( this.options && this.options.normalizeRGB ) {
|
|
208
|
-
|
|
209
|
-
value = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ];
|
|
210
|
-
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if ( this.options && this.options.ignoreZeroRGBs ) {
|
|
214
|
-
|
|
215
|
-
if ( value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 1 ] === 0 ) {
|
|
216
|
-
|
|
217
|
-
// ignore
|
|
218
|
-
|
|
219
|
-
save = false;
|
|
220
|
-
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
break;
|
|
226
|
-
|
|
227
|
-
default:
|
|
228
|
-
|
|
229
|
-
break;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
if ( save ) {
|
|
233
|
-
|
|
234
|
-
covmat[ lprop ] = value;
|
|
235
|
-
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
return converted;
|
|
243
|
-
|
|
244
|
-
},
|
|
245
|
-
|
|
246
|
-
preload: function () {
|
|
247
|
-
|
|
248
|
-
for ( var mn in this.materialsInfo ) {
|
|
249
|
-
|
|
250
|
-
this.create( mn );
|
|
251
|
-
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
},
|
|
255
|
-
|
|
256
|
-
getIndex: function( materialName ) {
|
|
257
|
-
|
|
258
|
-
return this.nameLookup[ materialName ];
|
|
259
|
-
|
|
260
|
-
},
|
|
261
|
-
|
|
262
|
-
getAsArray: function() {
|
|
263
|
-
|
|
264
|
-
var index = 0;
|
|
265
|
-
|
|
266
|
-
for ( var mn in this.materialsInfo ) {
|
|
267
|
-
|
|
268
|
-
this.materialsArray[ index ] = this.create( mn );
|
|
269
|
-
this.nameLookup[ mn ] = index;
|
|
270
|
-
index ++;
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
return this.materialsArray;
|
|
275
|
-
|
|
276
|
-
},
|
|
277
|
-
|
|
278
|
-
create: function ( materialName ) {
|
|
279
|
-
|
|
280
|
-
if ( this.materials[ materialName ] === undefined ) {
|
|
281
|
-
|
|
282
|
-
this.createMaterial_( materialName );
|
|
283
|
-
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
return this.materials[ materialName ];
|
|
287
|
-
|
|
288
|
-
},
|
|
289
|
-
|
|
290
|
-
createMaterial_: function ( materialName ) {
|
|
291
|
-
|
|
292
|
-
// Create material
|
|
293
|
-
|
|
294
|
-
var mat = this.materialsInfo[ materialName ];
|
|
295
|
-
var params = {
|
|
296
|
-
|
|
297
|
-
name: materialName,
|
|
298
|
-
side: this.side
|
|
299
|
-
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
for ( var prop in mat ) {
|
|
303
|
-
|
|
304
|
-
var value = mat[ prop ];
|
|
305
|
-
|
|
306
|
-
if ( value === '' ) continue;
|
|
307
|
-
|
|
308
|
-
switch ( prop.toLowerCase() ) {
|
|
309
|
-
|
|
310
|
-
// Ns is material specular exponent
|
|
311
|
-
|
|
312
|
-
case 'kd':
|
|
313
|
-
|
|
314
|
-
// Diffuse color (color under white light) using RGB values
|
|
315
|
-
|
|
316
|
-
params[ 'color' ] = new THREE.Color().fromArray( value );
|
|
317
|
-
|
|
318
|
-
break;
|
|
319
|
-
|
|
320
|
-
case 'ks':
|
|
321
|
-
|
|
322
|
-
// Specular color (color when light is reflected from shiny surface) using RGB values
|
|
323
|
-
params[ 'specular' ] = new THREE.Color().fromArray( value );
|
|
324
|
-
|
|
325
|
-
break;
|
|
326
|
-
|
|
327
|
-
case 'map_kd':
|
|
328
|
-
|
|
329
|
-
// Diffuse texture map
|
|
330
|
-
|
|
331
|
-
params[ 'map' ] = this.loadTexture( this.baseUrl + value );
|
|
332
|
-
params[ 'map' ].wrapS = this.wrap;
|
|
333
|
-
params[ 'map' ].wrapT = this.wrap;
|
|
334
|
-
|
|
335
|
-
break;
|
|
336
|
-
|
|
337
|
-
case 'ns':
|
|
338
|
-
|
|
339
|
-
// The specular exponent (defines the focus of the specular highlight)
|
|
340
|
-
// A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.
|
|
341
|
-
|
|
342
|
-
params[ 'shininess' ] = parseFloat( value );
|
|
343
|
-
|
|
344
|
-
break;
|
|
345
|
-
|
|
346
|
-
case 'd':
|
|
347
|
-
|
|
348
|
-
if ( value < 1 ) {
|
|
349
|
-
|
|
350
|
-
params[ 'opacity' ] = value;
|
|
351
|
-
params[ 'transparent' ] = true;
|
|
352
|
-
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
break;
|
|
356
|
-
|
|
357
|
-
case 'Tr':
|
|
358
|
-
|
|
359
|
-
if ( value > 0 ) {
|
|
360
|
-
|
|
361
|
-
params[ 'opacity' ] = 1 - value;
|
|
362
|
-
params[ 'transparent' ] = true;
|
|
363
|
-
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
break;
|
|
367
|
-
|
|
368
|
-
case 'map_bump':
|
|
369
|
-
case 'bump':
|
|
370
|
-
|
|
371
|
-
// Bump texture map
|
|
372
|
-
|
|
373
|
-
if ( params[ 'bumpMap' ] ) break; // Avoid loading twice.
|
|
374
|
-
|
|
375
|
-
params[ 'bumpMap' ] = this.loadTexture( this.baseUrl + value );
|
|
376
|
-
params[ 'bumpMap' ].wrapS = this.wrap;
|
|
377
|
-
params[ 'bumpMap' ].wrapT = this.wrap;
|
|
378
|
-
|
|
379
|
-
break;
|
|
380
|
-
|
|
381
|
-
default:
|
|
382
|
-
break;
|
|
383
|
-
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
this.materials[ materialName ] = new THREE.MeshPhongMaterial( params );
|
|
389
|
-
return this.materials[ materialName ];
|
|
390
|
-
|
|
391
|
-
},
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
loadTexture: function ( url, mapping, onLoad, onProgress, onError ) {
|
|
395
|
-
|
|
396
|
-
var texture;
|
|
397
|
-
var loader = THREE.Loader.Handlers.get( url );
|
|
398
|
-
var manager = ( this.manager !== undefined ) ? this.manager : THREE.DefaultLoadingManager;
|
|
399
|
-
|
|
400
|
-
if ( loader === null ) {
|
|
401
|
-
|
|
402
|
-
loader = new THREE.TextureLoader( manager );
|
|
403
|
-
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
if ( loader.setCrossOrigin ) loader.setCrossOrigin( this.crossOrigin );
|
|
407
|
-
texture = loader.load( url, onLoad, onProgress, onError );
|
|
408
|
-
|
|
409
|
-
if ( mapping !== undefined ) texture.mapping = mapping;
|
|
410
|
-
|
|
411
|
-
return texture;
|
|
412
|
-
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
};
|
|
416
|
-
|
|
417
|
-
THREE.EventDispatcher.prototype.apply( THREE.MTLLoader.prototype );
|
|
1
|
+
/**
|
|
2
|
+
* Loads a Wavefront .mtl file specifying materials
|
|
3
|
+
*
|
|
4
|
+
* @author angelxuanchang
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
THREE.MTLLoader = function( manager ) {
|
|
8
|
+
|
|
9
|
+
this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
|
|
10
|
+
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
THREE.MTLLoader.prototype = {
|
|
14
|
+
|
|
15
|
+
constructor: THREE.MTLLoader,
|
|
16
|
+
|
|
17
|
+
load: function ( url, onLoad, onProgress, onError ) {
|
|
18
|
+
|
|
19
|
+
var scope = this;
|
|
20
|
+
|
|
21
|
+
var loader = new THREE.XHRLoader( this.manager );
|
|
22
|
+
loader.setPath( this.path );
|
|
23
|
+
loader.load( url, function ( text ) {
|
|
24
|
+
|
|
25
|
+
onLoad( scope.parse( text ) );
|
|
26
|
+
|
|
27
|
+
}, onProgress, onError );
|
|
28
|
+
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
setPath: function ( value ) {
|
|
32
|
+
|
|
33
|
+
this.path = value;
|
|
34
|
+
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
setBaseUrl: function( value ) {
|
|
38
|
+
|
|
39
|
+
// TODO: Merge with setPath()? Or rename to setTexturePath?
|
|
40
|
+
|
|
41
|
+
this.baseUrl = value;
|
|
42
|
+
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
setCrossOrigin: function ( value ) {
|
|
46
|
+
|
|
47
|
+
this.crossOrigin = value;
|
|
48
|
+
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
setMaterialOptions: function ( value ) {
|
|
52
|
+
|
|
53
|
+
this.materialOptions = value;
|
|
54
|
+
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Parses loaded MTL file
|
|
59
|
+
* @param text - Content of MTL file
|
|
60
|
+
* @return {THREE.MTLLoader.MaterialCreator}
|
|
61
|
+
*/
|
|
62
|
+
parse: function ( text ) {
|
|
63
|
+
|
|
64
|
+
var lines = text.split( "\n" );
|
|
65
|
+
var info = {};
|
|
66
|
+
var delimiter_pattern = /\s+/;
|
|
67
|
+
var materialsInfo = {};
|
|
68
|
+
|
|
69
|
+
for ( var i = 0; i < lines.length; i ++ ) {
|
|
70
|
+
|
|
71
|
+
var line = lines[ i ];
|
|
72
|
+
line = line.trim();
|
|
73
|
+
|
|
74
|
+
if ( line.length === 0 || line.charAt( 0 ) === '#' ) {
|
|
75
|
+
|
|
76
|
+
// Blank line or comment ignore
|
|
77
|
+
continue;
|
|
78
|
+
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
var pos = line.indexOf( ' ' );
|
|
82
|
+
|
|
83
|
+
var key = ( pos >= 0 ) ? line.substring( 0, pos ) : line;
|
|
84
|
+
key = key.toLowerCase();
|
|
85
|
+
|
|
86
|
+
var value = ( pos >= 0 ) ? line.substring( pos + 1 ) : "";
|
|
87
|
+
value = value.trim();
|
|
88
|
+
|
|
89
|
+
if ( key === "newmtl" ) {
|
|
90
|
+
|
|
91
|
+
// New material
|
|
92
|
+
|
|
93
|
+
info = { name: value };
|
|
94
|
+
materialsInfo[ value ] = info;
|
|
95
|
+
|
|
96
|
+
} else if ( info ) {
|
|
97
|
+
|
|
98
|
+
if ( key === "ka" || key === "kd" || key === "ks" ) {
|
|
99
|
+
|
|
100
|
+
var ss = value.split( delimiter_pattern, 3 );
|
|
101
|
+
info[ key ] = [ parseFloat( ss[ 0 ] ), parseFloat( ss[ 1 ] ), parseFloat( ss[ 2 ] ) ];
|
|
102
|
+
|
|
103
|
+
} else {
|
|
104
|
+
|
|
105
|
+
info[ key ] = value;
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
var materialCreator = new THREE.MTLLoader.MaterialCreator( this.baseUrl, this.materialOptions );
|
|
114
|
+
materialCreator.setCrossOrigin( this.crossOrigin );
|
|
115
|
+
materialCreator.setManager( this.manager );
|
|
116
|
+
materialCreator.setMaterials( materialsInfo );
|
|
117
|
+
return materialCreator;
|
|
118
|
+
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Create a new THREE-MTLLoader.MaterialCreator
|
|
125
|
+
* @param baseUrl - Url relative to which textures are loaded
|
|
126
|
+
* @param options - Set of options on how to construct the materials
|
|
127
|
+
* side: Which side to apply the material
|
|
128
|
+
* THREE.FrontSide (default), THREE.BackSide, THREE.DoubleSide
|
|
129
|
+
* wrap: What type of wrapping to apply for textures
|
|
130
|
+
* THREE.RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping
|
|
131
|
+
* normalizeRGB: RGBs need to be normalized to 0-1 from 0-255
|
|
132
|
+
* Default: false, assumed to be already normalized
|
|
133
|
+
* ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's
|
|
134
|
+
* Default: false
|
|
135
|
+
* @constructor
|
|
136
|
+
*/
|
|
137
|
+
|
|
138
|
+
THREE.MTLLoader.MaterialCreator = function( baseUrl, options ) {
|
|
139
|
+
|
|
140
|
+
this.baseUrl = baseUrl;
|
|
141
|
+
this.options = options;
|
|
142
|
+
this.materialsInfo = {};
|
|
143
|
+
this.materials = {};
|
|
144
|
+
this.materialsArray = [];
|
|
145
|
+
this.nameLookup = {};
|
|
146
|
+
|
|
147
|
+
this.side = ( this.options && this.options.side ) ? this.options.side : THREE.FrontSide;
|
|
148
|
+
this.wrap = ( this.options && this.options.wrap ) ? this.options.wrap : THREE.RepeatWrapping;
|
|
149
|
+
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
THREE.MTLLoader.MaterialCreator.prototype = {
|
|
153
|
+
|
|
154
|
+
constructor: THREE.MTLLoader.MaterialCreator,
|
|
155
|
+
|
|
156
|
+
setCrossOrigin: function ( value ) {
|
|
157
|
+
|
|
158
|
+
this.crossOrigin = value;
|
|
159
|
+
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
setManager: function ( value ) {
|
|
163
|
+
|
|
164
|
+
this.manager = value;
|
|
165
|
+
|
|
166
|
+
},
|
|
167
|
+
|
|
168
|
+
setMaterials: function( materialsInfo ) {
|
|
169
|
+
|
|
170
|
+
this.materialsInfo = this.convert( materialsInfo );
|
|
171
|
+
this.materials = {};
|
|
172
|
+
this.materialsArray = [];
|
|
173
|
+
this.nameLookup = {};
|
|
174
|
+
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
convert: function( materialsInfo ) {
|
|
178
|
+
|
|
179
|
+
if ( ! this.options ) return materialsInfo;
|
|
180
|
+
|
|
181
|
+
var converted = {};
|
|
182
|
+
|
|
183
|
+
for ( var mn in materialsInfo ) {
|
|
184
|
+
|
|
185
|
+
// Convert materials info into normalized form based on options
|
|
186
|
+
|
|
187
|
+
var mat = materialsInfo[ mn ];
|
|
188
|
+
|
|
189
|
+
var covmat = {};
|
|
190
|
+
|
|
191
|
+
converted[ mn ] = covmat;
|
|
192
|
+
|
|
193
|
+
for ( var prop in mat ) {
|
|
194
|
+
|
|
195
|
+
var save = true;
|
|
196
|
+
var value = mat[ prop ];
|
|
197
|
+
var lprop = prop.toLowerCase();
|
|
198
|
+
|
|
199
|
+
switch ( lprop ) {
|
|
200
|
+
|
|
201
|
+
case 'kd':
|
|
202
|
+
case 'ka':
|
|
203
|
+
case 'ks':
|
|
204
|
+
|
|
205
|
+
// Diffuse color (color under white light) using RGB values
|
|
206
|
+
|
|
207
|
+
if ( this.options && this.options.normalizeRGB ) {
|
|
208
|
+
|
|
209
|
+
value = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ];
|
|
210
|
+
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if ( this.options && this.options.ignoreZeroRGBs ) {
|
|
214
|
+
|
|
215
|
+
if ( value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 1 ] === 0 ) {
|
|
216
|
+
|
|
217
|
+
// ignore
|
|
218
|
+
|
|
219
|
+
save = false;
|
|
220
|
+
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
break;
|
|
226
|
+
|
|
227
|
+
default:
|
|
228
|
+
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if ( save ) {
|
|
233
|
+
|
|
234
|
+
covmat[ lprop ] = value;
|
|
235
|
+
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return converted;
|
|
243
|
+
|
|
244
|
+
},
|
|
245
|
+
|
|
246
|
+
preload: function () {
|
|
247
|
+
|
|
248
|
+
for ( var mn in this.materialsInfo ) {
|
|
249
|
+
|
|
250
|
+
this.create( mn );
|
|
251
|
+
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
},
|
|
255
|
+
|
|
256
|
+
getIndex: function( materialName ) {
|
|
257
|
+
|
|
258
|
+
return this.nameLookup[ materialName ];
|
|
259
|
+
|
|
260
|
+
},
|
|
261
|
+
|
|
262
|
+
getAsArray: function() {
|
|
263
|
+
|
|
264
|
+
var index = 0;
|
|
265
|
+
|
|
266
|
+
for ( var mn in this.materialsInfo ) {
|
|
267
|
+
|
|
268
|
+
this.materialsArray[ index ] = this.create( mn );
|
|
269
|
+
this.nameLookup[ mn ] = index;
|
|
270
|
+
index ++;
|
|
271
|
+
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return this.materialsArray;
|
|
275
|
+
|
|
276
|
+
},
|
|
277
|
+
|
|
278
|
+
create: function ( materialName ) {
|
|
279
|
+
|
|
280
|
+
if ( this.materials[ materialName ] === undefined ) {
|
|
281
|
+
|
|
282
|
+
this.createMaterial_( materialName );
|
|
283
|
+
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return this.materials[ materialName ];
|
|
287
|
+
|
|
288
|
+
},
|
|
289
|
+
|
|
290
|
+
createMaterial_: function ( materialName ) {
|
|
291
|
+
|
|
292
|
+
// Create material
|
|
293
|
+
|
|
294
|
+
var mat = this.materialsInfo[ materialName ];
|
|
295
|
+
var params = {
|
|
296
|
+
|
|
297
|
+
name: materialName,
|
|
298
|
+
side: this.side
|
|
299
|
+
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
for ( var prop in mat ) {
|
|
303
|
+
|
|
304
|
+
var value = mat[ prop ];
|
|
305
|
+
|
|
306
|
+
if ( value === '' ) continue;
|
|
307
|
+
|
|
308
|
+
switch ( prop.toLowerCase() ) {
|
|
309
|
+
|
|
310
|
+
// Ns is material specular exponent
|
|
311
|
+
|
|
312
|
+
case 'kd':
|
|
313
|
+
|
|
314
|
+
// Diffuse color (color under white light) using RGB values
|
|
315
|
+
|
|
316
|
+
params[ 'color' ] = new THREE.Color().fromArray( value );
|
|
317
|
+
|
|
318
|
+
break;
|
|
319
|
+
|
|
320
|
+
case 'ks':
|
|
321
|
+
|
|
322
|
+
// Specular color (color when light is reflected from shiny surface) using RGB values
|
|
323
|
+
params[ 'specular' ] = new THREE.Color().fromArray( value );
|
|
324
|
+
|
|
325
|
+
break;
|
|
326
|
+
|
|
327
|
+
case 'map_kd':
|
|
328
|
+
|
|
329
|
+
// Diffuse texture map
|
|
330
|
+
|
|
331
|
+
params[ 'map' ] = this.loadTexture( this.baseUrl + value );
|
|
332
|
+
params[ 'map' ].wrapS = this.wrap;
|
|
333
|
+
params[ 'map' ].wrapT = this.wrap;
|
|
334
|
+
|
|
335
|
+
break;
|
|
336
|
+
|
|
337
|
+
case 'ns':
|
|
338
|
+
|
|
339
|
+
// The specular exponent (defines the focus of the specular highlight)
|
|
340
|
+
// A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.
|
|
341
|
+
|
|
342
|
+
params[ 'shininess' ] = parseFloat( value );
|
|
343
|
+
|
|
344
|
+
break;
|
|
345
|
+
|
|
346
|
+
case 'd':
|
|
347
|
+
|
|
348
|
+
if ( value < 1 ) {
|
|
349
|
+
|
|
350
|
+
params[ 'opacity' ] = value;
|
|
351
|
+
params[ 'transparent' ] = true;
|
|
352
|
+
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
break;
|
|
356
|
+
|
|
357
|
+
case 'Tr':
|
|
358
|
+
|
|
359
|
+
if ( value > 0 ) {
|
|
360
|
+
|
|
361
|
+
params[ 'opacity' ] = 1 - value;
|
|
362
|
+
params[ 'transparent' ] = true;
|
|
363
|
+
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
break;
|
|
367
|
+
|
|
368
|
+
case 'map_bump':
|
|
369
|
+
case 'bump':
|
|
370
|
+
|
|
371
|
+
// Bump texture map
|
|
372
|
+
|
|
373
|
+
if ( params[ 'bumpMap' ] ) break; // Avoid loading twice.
|
|
374
|
+
|
|
375
|
+
params[ 'bumpMap' ] = this.loadTexture( this.baseUrl + value );
|
|
376
|
+
params[ 'bumpMap' ].wrapS = this.wrap;
|
|
377
|
+
params[ 'bumpMap' ].wrapT = this.wrap;
|
|
378
|
+
|
|
379
|
+
break;
|
|
380
|
+
|
|
381
|
+
default:
|
|
382
|
+
break;
|
|
383
|
+
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
this.materials[ materialName ] = new THREE.MeshPhongMaterial( params );
|
|
389
|
+
return this.materials[ materialName ];
|
|
390
|
+
|
|
391
|
+
},
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
loadTexture: function ( url, mapping, onLoad, onProgress, onError ) {
|
|
395
|
+
|
|
396
|
+
var texture;
|
|
397
|
+
var loader = THREE.Loader.Handlers.get( url );
|
|
398
|
+
var manager = ( this.manager !== undefined ) ? this.manager : THREE.DefaultLoadingManager;
|
|
399
|
+
|
|
400
|
+
if ( loader === null ) {
|
|
401
|
+
|
|
402
|
+
loader = new THREE.TextureLoader( manager );
|
|
403
|
+
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
if ( loader.setCrossOrigin ) loader.setCrossOrigin( this.crossOrigin );
|
|
407
|
+
texture = loader.load( url, onLoad, onProgress, onError );
|
|
408
|
+
|
|
409
|
+
if ( mapping !== undefined ) texture.mapping = mapping;
|
|
410
|
+
|
|
411
|
+
return texture;
|
|
412
|
+
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
THREE.EventDispatcher.prototype.apply( THREE.MTLLoader.prototype );
|