55 * @author Genesis / https://github.com/NGenesis/
66 */
77
8- THREE . BOMLoader = function ( manager ) {
8+ THREE . BOMLoader = function ( manager ) {
99
1010 this . manager = ( manager !== undefined ) ? manager : THREE . DefaultLoadingManager ;
1111
12- }
12+ } ;
1313
1414THREE . BOMLoader . prototype = {
1515
@@ -54,6 +54,12 @@ THREE.BOMLoader.prototype = {
5454
5555 } ,
5656
57+ setPerfTimer : function ( value ) {
58+
59+ this . performanceTimer = value ;
60+
61+ } ,
62+
5763 setResponseType : function ( value ) {
5864
5965 this . responseType = value ;
@@ -62,9 +68,18 @@ THREE.BOMLoader.prototype = {
6268
6369 parse : function ( buffer ) {
6470
65- console . time ( 'BOMLoader' ) ;
71+ if ( this . performanceTimer ) console . time ( 'BOMLoader' ) ;
72+
73+ var FaceCulling = {
6674
67- var FileDataAttribute = {
75+ NONE : 0 ,
76+ FRONT : 1 ,
77+ BACK : 2 ,
78+ ALL : 3
79+
80+ } ,
81+
82+ FileDataAttribute = {
6883
6984 NONE : 1 << 0 ,
7085 MATERIAL_LIBRARY : 1 << 1
@@ -115,9 +130,10 @@ THREE.BOMLoader.prototype = {
115130 EMISSIVE_MAP : 1 << 13 ,
116131 DISSOLVE_MAP : 1 << 14 ,
117132 BUMP_MAP : 1 << 15 ,
118- DISPLACEMENT_MAP : 1 << 16
133+ DISPLACEMENT_MAP : 1 << 16 ,
134+ FACE_CULLING : 1 << 17
119135
120- } ;
136+ } ,
121137
122138 MapDataAttribute = {
123139
@@ -130,7 +146,7 @@ THREE.BOMLoader.prototype = {
130146
131147 } ;
132148
133- var view = new DataView ( buffer ) , pos = 0 , isArrayContainer = ( this . responseType == 'array' ) , containers = ( isArrayContainer ? [ ] : new THREE . Group ( ) ) ;
149+ var view = new DataView ( buffer ) , pos = 0 , isArrayContainer = ( this . responseType === 'array' ) , containers = ( isArrayContainer ? [ ] : new THREE . Group ( ) ) ;
134150
135151 function readUint8 ( ) {
136152
@@ -224,10 +240,22 @@ THREE.BOMLoader.prototype = {
224240 function loadTexture ( url ) {
225241
226242 url = resolveURL ( url ) ;
227- var loader = THREE . Loader . Handlers . get ( url ) ;
228- if ( loader === null ) loader = new THREE . TextureLoader ( scope . manager ) ;
229- if ( loader . setCrossOrigin ) loader . setCrossOrigin ( scope . crossOrigin ) ;
230- var texture = loader . load ( url ) ;
243+ var texture ;
244+
245+ if ( altspace && altspace . inClient ) {
246+
247+ // Defer Texture Image Loading To Native Altspace Client
248+ texture = new THREE . Texture ( { src : url } ) ;
249+
250+ } else {
251+
252+ var loader = THREE . Loader . Handlers . get ( url ) ;
253+ if ( loader === null ) loader = new THREE . TextureLoader ( scope . manager ) ;
254+ loader . setCrossOrigin ( scope . crossOrigin ) ;
255+ texture = loader . load ( url ) ;
256+
257+ }
258+
231259 texture . side = THREE . FrontSide ;
232260 texture . wrapS = texture . wrapT = THREE . RepeatWrapping ;
233261
@@ -236,7 +264,7 @@ THREE.BOMLoader.prototype = {
236264 }
237265
238266 // File Signature
239- var fileSignature = readString ( 3 ) ;
267+ var fileSignature = readString ( 3 ) ;
240268 if ( this . debug ) console . log ( 'File Signature' , fileSignature ) ;
241269
242270 // Version
@@ -286,7 +314,8 @@ THREE.BOMLoader.prototype = {
286314 'Specular Map' , ( materialAttributes & MaterialDataAttribute . SPECULAR_MAP ) ? true : false , '\n' ,
287315 'Dissolve Map' , ( materialAttributes & MaterialDataAttribute . DISSOLVE_MAP ) ? true : false , '\n' ,
288316 'Bump Map' , ( materialAttributes & MaterialDataAttribute . BUMP_MAP ) ? true : false , '\n' ,
289- 'Displacement Map' , ( materialAttributes & MaterialDataAttribute . DISPLACEMENT_MAP ) ? true : false
317+ 'Displacement Map' , ( materialAttributes & MaterialDataAttribute . DISPLACEMENT_MAP ) ? true : false , '\n' ,
318+ 'Face Culling' , ( materialAttributes & MaterialDataAttribute . FACE_CULLING ) ? true : false
290319
291320 ) ;
292321
@@ -452,6 +481,17 @@ THREE.BOMLoader.prototype = {
452481
453482 }
454483
484+ // Face Culling (cull_face)
485+ if ( materialAttributes & MaterialDataAttribute . FACE_CULLING ) {
486+
487+ var faceCulling = readUint8 ( ) ;
488+ if ( faceCulling === FaceCulling . ALL ) params . visible = false ;
489+ else if ( faceCulling === FaceCulling . FRONT ) params . side = THREE . BackSide ;
490+ else if ( faceCulling === FaceCulling . BACK ) params . side = THREE . FrontSide ;
491+ else params . side = THREE . DoubleSide ;
492+
493+ }
494+
455495 var material = new THREE . MeshPhongMaterial ( params ) ;
456496 materials . push ( material ) ;
457497
@@ -489,8 +529,8 @@ THREE.BOMLoader.prototype = {
489529 if ( containerId >= containers . length ) containers . push ( new THREE . Group ( ) ) ;
490530 containers [ containerId ] . add ( object ) ;
491531
492- }
493- else {
532+ } else {
533+
494534 if ( containerId >= containers . children . length ) containers . add ( new THREE . Group ( ) ) ;
495535 containers . children [ containerId ] . add ( object ) ;
496536
@@ -618,10 +658,39 @@ THREE.BOMLoader.prototype = {
618658
619659 }
620660
621- console . timeEnd ( 'BOMLoader' ) ;
661+ if ( this . performanceTimer ) console . timeEnd ( 'BOMLoader' ) ;
622662
623663 return containers ;
624664
625665 }
626666
627- } ;
667+ } ;
668+
669+ THREE . BOMLoaderUtil = THREE . BOMLoaderUtil || { } ;
670+ THREE . BOMLoaderUtil . multiload = function ( requests , onComplete ) {
671+
672+ requests = ( requests . constructor === Array ) ? requests : [ requests ] ;
673+ var requestCount = requests . length ;
674+ var responses = [ ] ;
675+
676+ function loadRequest ( index , request ) {
677+
678+ var loader = new THREE . BOMLoader ( ) ;
679+ loader . setTexturePath ( request . url . split ( '/' ) . slice ( 0 , - 1 ) . join ( '/' ) + '/' ) ;
680+ if ( request . debug !== undefined ) loader . setDebug ( request . debug ) ;
681+ if ( request . timer !== undefined ) loader . setPerfTimer ( request . timer ) ;
682+ if ( request . crossOrigin !== undefined ) loader . setCrossOrigin ( request . crossOrigin ) ;
683+ if ( request . responseType !== undefined ) loader . setResponseType ( request . responseType ) ;
684+ loader . load ( request . url , function ( object ) {
685+
686+ request . object = object ;
687+ responses [ index ] = request ;
688+ if ( -- requestCount <= 0 ) onComplete ( responses ) ;
689+
690+ } ) ;
691+
692+ }
693+
694+ for ( var i = 0 ; i < requests . length ; ++ i ) loadRequest ( i , requests [ i ] ) ;
695+
696+ } ;
0 commit comments