336 lines
9.4 KiB
Vue
336 lines
9.4 KiB
Vue
|
if ( THREE.LoaderSupport === undefined ) { THREE.LoaderSupport = {} }
|
||
|
|
||
|
/**
|
||
|
* Validation functions.
|
||
|
* @class
|
||
|
*/
|
||
|
THREE.LoaderSupport.Validator = {
|
||
|
/**
|
||
|
* If given input is null or undefined, false is returned otherwise true.
|
||
|
*
|
||
|
* @param input Can be anything
|
||
|
* @returns {boolean}
|
||
|
*/
|
||
|
isValid: function( input ) {
|
||
|
return ( input !== null && input !== undefined );
|
||
|
},
|
||
|
/**
|
||
|
* If given input is null or undefined, the defaultValue is returned otherwise the given input.
|
||
|
*
|
||
|
* @param input Can be anything
|
||
|
* @param defaultValue Can be anything
|
||
|
* @returns {*}
|
||
|
*/
|
||
|
verifyInput: function( input, defaultValue ) {
|
||
|
return ( input === null || input === undefined ) ? defaultValue : input;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Callbacks utilized by loaders and builders.
|
||
|
* @class
|
||
|
*/
|
||
|
THREE.LoaderSupport.Callbacks = (function () {
|
||
|
|
||
|
var Validator = THREE.LoaderSupport.Validator;
|
||
|
|
||
|
function Callbacks() {
|
||
|
this.onProgress = null;
|
||
|
this.onMeshAlter = null;
|
||
|
this.onLoad = null;
|
||
|
this.onLoadMaterials = null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register callback function that is invoked by internal function "announceProgress" to print feedback.
|
||
|
* @memberOf THREE.LoaderSupport.Callbacks
|
||
|
*
|
||
|
* @param {callback} callbackOnProgress Callback function for described functionality
|
||
|
*/
|
||
|
Callbacks.prototype.setCallbackOnProgress = function ( callbackOnProgress ) {
|
||
|
this.onProgress = Validator.verifyInput( callbackOnProgress, this.onProgress );
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Register callback function that is called every time a mesh was loaded.
|
||
|
* Use {@link THREE.LoaderSupport.LoadedMeshUserOverride} for alteration instructions (geometry, material or disregard mesh).
|
||
|
* @memberOf THREE.LoaderSupport.Callbacks
|
||
|
*
|
||
|
* @param {callback} callbackOnMeshAlter Callback function for described functionality
|
||
|
*/
|
||
|
Callbacks.prototype.setCallbackOnMeshAlter = function ( callbackOnMeshAlter ) {
|
||
|
this.onMeshAlter = Validator.verifyInput( callbackOnMeshAlter, this.onMeshAlter );
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Register callback function that is called once loading of the complete OBJ file is completed.
|
||
|
* @memberOf THREE.LoaderSupport.Callbacks
|
||
|
*
|
||
|
* @param {callback} callbackOnLoad Callback function for described functionality
|
||
|
*/
|
||
|
Callbacks.prototype.setCallbackOnLoad = function ( callbackOnLoad ) {
|
||
|
this.onLoad = Validator.verifyInput( callbackOnLoad, this.onLoad );
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Register callback function that is called when materials have been loaded.
|
||
|
* @memberOf THREE.LoaderSupport.Callbacks
|
||
|
*
|
||
|
* @param {callback} callbackOnLoadMaterials Callback function for described functionality
|
||
|
*/
|
||
|
Callbacks.prototype.setCallbackOnLoadMaterials = function ( callbackOnLoadMaterials ) {
|
||
|
this.onLoadMaterials = Validator.verifyInput( callbackOnLoadMaterials, this.onLoadMaterials );
|
||
|
};
|
||
|
|
||
|
return Callbacks;
|
||
|
})();
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Object to return by callback onMeshAlter. Used to disregard a certain mesh or to return one to many meshes.
|
||
|
* @class
|
||
|
*
|
||
|
* @param {boolean} disregardMesh=false Tell implementation to completely disregard this mesh
|
||
|
* @param {boolean} disregardMesh=false Tell implementation that mesh(es) have been altered or added
|
||
|
*/
|
||
|
THREE.LoaderSupport.LoadedMeshUserOverride = (function () {
|
||
|
|
||
|
function LoadedMeshUserOverride( disregardMesh, alteredMesh ) {
|
||
|
this.disregardMesh = disregardMesh === true;
|
||
|
this.alteredMesh = alteredMesh === true;
|
||
|
this.meshes = [];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add a mesh created within callback.
|
||
|
*
|
||
|
* @memberOf THREE.OBJLoader2.LoadedMeshUserOverride
|
||
|
*
|
||
|
* @param {THREE.Mesh} mesh
|
||
|
*/
|
||
|
LoadedMeshUserOverride.prototype.addMesh = function ( mesh ) {
|
||
|
this.meshes.push( mesh );
|
||
|
this.alteredMesh = true;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Answers if mesh shall be disregarded completely.
|
||
|
*
|
||
|
* @returns {boolean}
|
||
|
*/
|
||
|
LoadedMeshUserOverride.prototype.isDisregardMesh = function () {
|
||
|
return this.disregardMesh;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Answers if new mesh(es) were created.
|
||
|
*
|
||
|
* @returns {boolean}
|
||
|
*/
|
||
|
LoadedMeshUserOverride.prototype.providesAlteredMeshes = function () {
|
||
|
return this.alteredMesh;
|
||
|
};
|
||
|
|
||
|
return LoadedMeshUserOverride;
|
||
|
})();
|
||
|
|
||
|
|
||
|
/**
|
||
|
* A resource description used by {@link THREE.LoaderSupport.PrepData} and others.
|
||
|
* @class
|
||
|
*
|
||
|
* @param {string} url URL to the file
|
||
|
* @param {string} extension The file extension (type)
|
||
|
*/
|
||
|
THREE.LoaderSupport.ResourceDescriptor = (function () {
|
||
|
|
||
|
var Validator = THREE.LoaderSupport.Validator;
|
||
|
|
||
|
function ResourceDescriptor( url, extension ) {
|
||
|
var urlParts = url.split( '/' );
|
||
|
|
||
|
if ( urlParts.length < 2 ) {
|
||
|
|
||
|
this.path = null;
|
||
|
this.name = url;
|
||
|
this.url = url;
|
||
|
|
||
|
} else {
|
||
|
|
||
|
this.path = Validator.verifyInput( urlParts.slice( 0, urlParts.length - 1).join( '/' ) + '/', null );
|
||
|
this.name = Validator.verifyInput( urlParts[ urlParts.length - 1 ], null );
|
||
|
this.url = url;
|
||
|
|
||
|
}
|
||
|
this.extension = Validator.verifyInput( extension, "default" );
|
||
|
this.extension = this.extension.trim();
|
||
|
this.content = null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the content of this resource
|
||
|
* @memberOf THREE.LoaderSupport.ResourceDescriptor
|
||
|
*
|
||
|
* @param {Object} content The file content as arraybuffer or text
|
||
|
*/
|
||
|
ResourceDescriptor.prototype.setContent = function ( content ) {
|
||
|
this.content = Validator.verifyInput( content, null );
|
||
|
};
|
||
|
|
||
|
return ResourceDescriptor;
|
||
|
})();
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Configuration instructions to be used by run method.
|
||
|
* @class
|
||
|
*/
|
||
|
THREE.LoaderSupport.PrepData = (function () {
|
||
|
|
||
|
var Validator = THREE.LoaderSupport.Validator;
|
||
|
|
||
|
function PrepData( modelName ) {
|
||
|
this.logging = {
|
||
|
enabled: true,
|
||
|
debug: false
|
||
|
};
|
||
|
this.modelName = Validator.verifyInput( modelName, '' );
|
||
|
this.resources = [];
|
||
|
this.callbacks = new THREE.LoaderSupport.Callbacks();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Enable or disable logging in general (except warn and error), plus enable or disable debug logging.
|
||
|
* @memberOf THREE.LoaderSupport.PrepData
|
||
|
*
|
||
|
* @param {boolean} enabled True or false.
|
||
|
* @param {boolean} debug True or false.
|
||
|
*/
|
||
|
PrepData.prototype.setLogging = function ( enabled, debug ) {
|
||
|
this.logging.enabled = enabled === true;
|
||
|
this.logging.debug = debug === true;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Returns all callbacks as {@link THREE.LoaderSupport.Callbacks}
|
||
|
* @memberOf THREE.LoaderSupport.PrepData
|
||
|
*
|
||
|
* @returns {THREE.LoaderSupport.Callbacks}
|
||
|
*/
|
||
|
PrepData.prototype.getCallbacks = function () {
|
||
|
return this.callbacks;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Add a resource description.
|
||
|
* @memberOf THREE.LoaderSupport.PrepData
|
||
|
*
|
||
|
* @param {THREE.LoaderSupport.ResourceDescriptor} Adds a {@link THREE.LoaderSupport.ResourceDescriptor}
|
||
|
*/
|
||
|
PrepData.prototype.addResource = function ( resource ) {
|
||
|
this.resources.push( resource );
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Clones this object and returns it afterwards. Callbacks and resources are not cloned deep (references!).
|
||
|
* @memberOf THREE.LoaderSupport.PrepData
|
||
|
*
|
||
|
* @returns {@link THREE.LoaderSupport.PrepData}
|
||
|
*/
|
||
|
PrepData.prototype.clone = function () {
|
||
|
var clone = new THREE.LoaderSupport.PrepData( this.modelName );
|
||
|
clone.logging.enabled = this.logging.enabled;
|
||
|
clone.logging.debug = this.logging.debug;
|
||
|
clone.resources = this.resources;
|
||
|
clone.callbacks = this.callbacks;
|
||
|
|
||
|
var property, value;
|
||
|
for ( property in this ) {
|
||
|
|
||
|
value = this[ property ];
|
||
|
if ( ! clone.hasOwnProperty( property ) && typeof this[ property ] !== 'function' ) {
|
||
|
|
||
|
clone[ property ] = value;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return clone;
|
||
|
};
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Identify files or content of interest from an Array of {@link THREE.LoaderSupport.ResourceDescriptor}.
|
||
|
* @memberOf THREE.LoaderSupport.PrepData
|
||
|
*
|
||
|
* @param {THREE.LoaderSupport.ResourceDescriptor[]} resources Array of {@link THREE.LoaderSupport.ResourceDescriptor}
|
||
|
* @param Object fileDesc Object describing which resources are of interest (ext, type (string or UInt8Array) and ignore (boolean))
|
||
|
* @returns {{}} Object with each "ext" and the corresponding {@link THREE.LoaderSupport.ResourceDescriptor}
|
||
|
*/
|
||
|
PrepData.prototype.checkResourceDescriptorFiles = function ( resources, fileDesc ) {
|
||
|
var resource, triple, i, found;
|
||
|
var result = {};
|
||
|
|
||
|
for ( var index in resources ) {
|
||
|
|
||
|
resource = resources[ index ];
|
||
|
found = false;
|
||
|
if ( ! Validator.isValid( resource.name ) ) continue;
|
||
|
if ( Validator.isValid( resource.content ) ) {
|
||
|
|
||
|
for ( i = 0; i < fileDesc.length && !found; i++ ) {
|
||
|
|
||
|
triple = fileDesc[ i ];
|
||
|
if ( resource.extension.toLowerCase() === triple.ext.toLowerCase() ) {
|
||
|
|
||
|
if ( triple.ignore ) {
|
||
|
|
||
|
found = true;
|
||
|
|
||
|
} else if ( triple.type === "ArrayBuffer" ) {
|
||
|
|
||
|
// fast-fail on bad type
|
||
|
if ( ! ( resource.content instanceof ArrayBuffer || resource.content instanceof Uint8Array ) ) throw 'Provided content is not of type ArrayBuffer! Aborting...';
|
||
|
result[ triple.ext ] = resource;
|
||
|
found = true;
|
||
|
|
||
|
} else if ( triple.type === "String" ) {
|
||
|
|
||
|
if ( ! ( typeof( resource.content ) === 'string' || resource.content instanceof String) ) throw 'Provided content is not of type String! Aborting...';
|
||
|
result[ triple.ext ] = resource;
|
||
|
found = true;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
if ( !found ) throw 'Unidentified resource "' + resource.name + '": ' + resource.url;
|
||
|
|
||
|
} else {
|
||
|
|
||
|
// fast-fail on bad type
|
||
|
if ( ! ( typeof( resource.name ) === 'string' || resource.name instanceof String ) ) throw 'Provided file is not properly defined! Aborting...';
|
||
|
for ( i = 0; i < fileDesc.length && !found; i++ ) {
|
||
|
|
||
|
triple = fileDesc[ i ];
|
||
|
if ( resource.extension.toLowerCase() === triple.ext.toLowerCase() ) {
|
||
|
|
||
|
if ( ! triple.ignore ) result[ triple.ext ] = resource;
|
||
|
found = true;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
if ( !found ) throw 'Unidentified resource "' + resource.name + '": ' + resource.url;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
};
|
||
|
|
||
|
return PrepData;
|
||
|
})();
|