Skip to content

Commit 7416826

Browse files
author
David Cormack
committed
Code formatting improvements.
Added check to defer texture image loading on AltspaceVR native client. Added Face Culling (cull_face) attribute support to material block. Added BOMLoader.setPerfTimer to override performance timer console output. Disabled performance timer console output by default. Added BOMLoaderUtil.multiload function as convenience to handle loading of multiple BOM files.
1 parent c4fb85b commit 7416826

File tree

2 files changed

+87
-18
lines changed

2 files changed

+87
-18
lines changed

examples/js/loaders/BOMLoader.js

Lines changed: 86 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
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

1414
THREE.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

Comments
 (0)