From 2f1a8043a6b8df12a5bc0a387955ccdb1ce22bc4 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Sat, 14 Sep 2019 15:20:09 -0700 Subject: [PATCH] Removed AWDLoader (use GLTF instead). --- editor/index.html | 1 - editor/js/Loader.js | 14 - editor/sw.js | 1 - examples/files.js | 1 - examples/js/loaders/AWDLoader.js | 1219 ----------------- examples/models/awd/simple/simple.awd | Bin 55420 -> 0 bytes .../models/awd/simple/textures/texture.jpg | Bin 12887 -> 0 bytes examples/webgl_loader_awd.html | 123 -- utils/modularize.js | 1 - 9 files changed, 1360 deletions(-) delete mode 100644 examples/js/loaders/AWDLoader.js delete mode 100644 examples/models/awd/simple/simple.awd delete mode 100644 examples/models/awd/simple/textures/texture.jpg delete mode 100644 examples/webgl_loader_awd.html diff --git a/editor/index.html b/editor/index.html index abea38481d..43aa8bce72 100644 --- a/editor/index.html +++ b/editor/index.html @@ -23,7 +23,6 @@ - diff --git a/editor/js/Loader.js b/editor/js/Loader.js index b04f241fb4..a3a881ffbc 100644 --- a/editor/js/Loader.js +++ b/editor/js/Loader.js @@ -86,20 +86,6 @@ var Loader = function ( editor ) { break; - case 'awd': - - reader.addEventListener( 'load', function ( event ) { - - var loader = new THREE.AWDLoader(); - var scene = loader.parse( event.target.result ); - - editor.execute( new SetSceneCommand( editor, scene ) ); - - }, false ); - reader.readAsArrayBuffer( file ); - - break; - case 'dae': reader.addEventListener( 'load', function ( event ) { diff --git a/editor/sw.js b/editor/sw.js index f07fc2558f..0f51845022 100644 --- a/editor/sw.js +++ b/editor/sw.js @@ -15,7 +15,6 @@ const staticAssets = [ '../examples/js/libs/inflate.min.js', '../examples/js/loaders/AMFLoader.js', - '../examples/js/loaders/AWDLoader.js', '../examples/js/loaders/ColladaLoader.js', '../examples/js/loaders/DRACOLoader.js', '../examples/js/loaders/FBXLoader.js', diff --git a/examples/files.js b/examples/files.js index 218f7ac188..3eb6312edb 100644 --- a/examples/files.js +++ b/examples/files.js @@ -78,7 +78,6 @@ var files = { "webgl_loader_amf", "webgl_loader_assimp", "webgl_loader_assimp2json", - "webgl_loader_awd", "webgl_loader_bvh", "webgl_loader_collada", "webgl_loader_collada_kinematics", diff --git a/examples/js/loaders/AWDLoader.js b/examples/js/loaders/AWDLoader.js deleted file mode 100644 index c928160d96..0000000000 --- a/examples/js/loaders/AWDLoader.js +++ /dev/null @@ -1,1219 +0,0 @@ -/** - * Author: Pierre Lepers - * Date: 09/12/2013 17:21 - */ - -THREE.AWDLoader = ( function () { - - var //UNCOMPRESSED = 0, - //DEFLATE = 1, - //LZMA = 2, - - AWD_FIELD_INT8 = 1, - AWD_FIELD_INT16 = 2, - AWD_FIELD_INT32 = 3, - AWD_FIELD_UINT8 = 4, - AWD_FIELD_UINT16 = 5, - AWD_FIELD_UINT32 = 6, - AWD_FIELD_FLOAT32 = 7, - AWD_FIELD_FLOAT64 = 8, - AWD_FIELD_BOOL = 21, - //AWD_FIELD_COLOR = 22, - AWD_FIELD_BADDR = 23, - //AWD_FIELD_STRING = 31, - //AWD_FIELD_BYTEARRAY = 32, - AWD_FIELD_VECTOR2x1 = 41, - AWD_FIELD_VECTOR3x1 = 42, - AWD_FIELD_VECTOR4x1 = 43, - AWD_FIELD_MTX3x2 = 44, - AWD_FIELD_MTX3x3 = 45, - AWD_FIELD_MTX4x3 = 46, - AWD_FIELD_MTX4x4 = 47, - - BOOL = 21, - //COLOR = 22, - BADDR = 23, - - //INT8 = 1, - //INT16 = 2, - //INT32 = 3, - UINT8 = 4, - UINT16 = 5, - //UINT32 = 6, - FLOAT32 = 7, - FLOAT64 = 8; - - var littleEndian = true; - - function Block() { - - this.id = 0; - this.data = null; - this.namespace = 0; - this.flags = 0; - - } - - function AWDProperties() {} - - AWDProperties.prototype = { - set: function ( key, value ) { - - this[ key ] = value; - - }, - - get: function ( key, fallback ) { - - if ( this.hasOwnProperty( key ) ) { - - return this[ key ]; - - } else { - - return fallback; - - } - - } - }; - - var AWDLoader = function ( manager ) { - - THREE.Loader.call( this, manager ); - - this.trunk = new THREE.Object3D(); - - this.materialFactory = undefined; - - this._url = ''; - this._baseDir = ''; - - this._data = undefined; - this._ptr = 0; - - this._version = []; - this._streaming = false; - this._optimized_for_accuracy = false; - this._compression = 0; - this._bodylen = 0xFFFFFFFF; - - this._blocks = [ new Block() ]; - - this._accuracyMatrix = false; - this._accuracyGeo = false; - this._accuracyProps = false; - - }; - - AWDLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype ), { - - constructor: AWDLoader, - - load: function ( url, onLoad, onProgress, onError ) { - - var scope = this; - - this._url = url; - this._baseDir = url.substr( 0, url.lastIndexOf( '/' ) + 1 ); - - var loader = new THREE.FileLoader( this.manager ); - loader.setPath( this.path ); - loader.setResponseType( 'arraybuffer' ); - loader.load( url, function ( text ) { - - onLoad( scope.parse( text ) ); - - }, onProgress, onError ); - - }, - - parse: function ( data ) { - - var blen = data.byteLength; - - this._ptr = 0; - this._data = new DataView( data ); - - this._parseHeader( ); - - if ( this._compression != 0 ) { - - console.error( 'compressed AWD not supported' ); - - } - - if ( ! this._streaming && this._bodylen != data.byteLength - this._ptr ) { - - console.error( 'AWDLoader: body len does not match file length', this._bodylen, blen - this._ptr ); - - } - - while ( this._ptr < blen ) { - - this.parseNextBlock(); - - } - - return this.trunk; - - }, - - parseNextBlock: function () { - - var assetData, - block, - blockId = this.readU32(), - ns = this.readU8(), - type = this.readU8(), - flags = this.readU8(), - len = this.readU32(); - - - switch ( type ) { - - case 1: - assetData = this.parseMeshData(); - break; - - case 22: - assetData = this.parseContainer(); - break; - - case 23: - assetData = this.parseMeshInstance(); - break; - - case 81: - assetData = this.parseMaterial(); - break; - - case 82: - assetData = this.parseTexture(); - break; - - case 101: - assetData = this.parseSkeleton(); - break; - - case 112: - assetData = this.parseMeshPoseAnimation( false ); - break; - - case 113: - assetData = this.parseVertexAnimationSet(); - break; - - case 102: - assetData = this.parseSkeletonPose(); - break; - - case 103: - assetData = this.parseSkeletonAnimation(); - break; - - case 122: - assetData = this.parseAnimatorSet(); - break; - - default: - //debug('Ignoring block!',type, len); - this._ptr += len; - break; - - } - - - // Store block reference for later use - this._blocks[ blockId ] = block = new Block(); - block.data = assetData; - block.id = blockId; - block.namespace = ns; - block.flags = flags; - - - }, - - _parseHeader: function () { - - var version = this._version, - awdmagic = ( this.readU8() << 16 ) | ( this.readU8() << 8 ) | this.readU8(); - - if ( awdmagic != 4282180 ) - throw new Error( "AWDLoader - bad magic" ); - - version[ 0 ] = this.readU8(); - version[ 1 ] = this.readU8(); - - var flags = this.readU16(); - - this._streaming = ( flags & 0x1 ) == 0x1; - - if ( ( version[ 0 ] === 2 ) && ( version[ 1 ] === 1 ) ) { - - this._accuracyMatrix = ( flags & 0x2 ) === 0x2; - this._accuracyGeo = ( flags & 0x4 ) === 0x4; - this._accuracyProps = ( flags & 0x8 ) === 0x8; - - } - - this._geoNrType = this._accuracyGeo ? FLOAT64 : FLOAT32; - this._matrixNrType = this._accuracyMatrix ? FLOAT64 : FLOAT32; - this._propsNrType = this._accuracyProps ? FLOAT64 : FLOAT32; - - this._optimized_for_accuracy = ( flags & 0x2 ) === 0x2; - - this._compression = this.readU8(); - this._bodylen = this.readU32(); - - }, - - parseContainer: function () { - - var parent, - ctr = new THREE.Object3D(), - par_id = this.readU32(), - mtx = this.parseMatrix4(); - - ctr.name = this.readUTF(); - ctr.applyMatrix( mtx ); - - parent = this._blocks[ par_id ].data || this.trunk; - parent.add( ctr ); - - this.parseProperties( { - 1: this._matrixNrType, - 2: this._matrixNrType, - 3: this._matrixNrType, - 4: UINT8 - } ); - - ctr.extra = this.parseUserAttributes(); - - return ctr; - - }, - - parseMeshInstance: function () { - - var name, - mesh, geometries, meshLen, meshes, - par_id, data_id, - mtx, - materials, mat, mat_id, - num_materials, - parent, - i; - - par_id = this.readU32(); - mtx = this.parseMatrix4(); - name = this.readUTF(); - data_id = this.readU32(); - num_materials = this.readU16(); - - geometries = this.getBlock( data_id ); - - materials = []; - - for ( i = 0; i < num_materials; i ++ ) { - - mat_id = this.readU32(); - mat = this.getBlock( mat_id ); - materials.push( mat ); - - } - - meshLen = geometries.length; - meshes = []; - - // TODO : BufferGeometry don't support "geometryGroups" for now. - // so we create sub meshes for each groups - if ( meshLen > 1 ) { - - mesh = new THREE.Object3D(); - for ( i = 0; i < meshLen; i ++ ) { - - var sm = new THREE.Mesh( geometries[ i ] ); - meshes.push( sm ); - mesh.add( sm ); - - } - - } else { - - mesh = new THREE.Mesh( geometries[ 0 ] ); - meshes.push( mesh ); - - } - - mesh.applyMatrix( mtx ); - mesh.name = name; - - - parent = this.getBlock( par_id ) || this.trunk; - parent.add( mesh ); - - - var matLen = materials.length; - var maxLen = Math.max( meshLen, matLen ); - for ( i = 0; i < maxLen; i ++ ) - meshes[ i % meshLen ].material = materials[ i % matLen ]; - - - // Ignore for now - this.parseProperties( null ); - mesh.extra = this.parseUserAttributes(); - - return mesh; - - }, - - parseMaterial: function () { - - var name, - type, - props, - mat, - attributes, - num_methods, - methods_parsed; - - name = this.readUTF(); - type = this.readU8(); - num_methods = this.readU8(); - - //log( "AWDLoader parseMaterial ",name ) - - // Read material numerical properties - // (1=color, 2=bitmap url, 11=alpha_blending, 12=alpha_threshold, 13=repeat) - props = this.parseProperties( { - 1: AWD_FIELD_INT32, - 2: AWD_FIELD_BADDR, - 11: AWD_FIELD_BOOL, - 12: AWD_FIELD_FLOAT32, - 13: AWD_FIELD_BOOL - } ); - - methods_parsed = 0; - - while ( methods_parsed < num_methods ) { - - // read method_type before - this.readU16(); - this.parseProperties( null ); - this.parseUserAttributes(); - - } - - attributes = this.parseUserAttributes(); - - if ( this.materialFactory !== undefined ) { - - mat = this.materialFactory( name ); - if ( mat ) return mat; - - } - - mat = new THREE.MeshPhongMaterial(); - - if ( type === 1 ) { - - // Color material - mat.color.setHex( props.get( 1, 0xcccccc ) ); - - } else if ( type === 2 ) { - - // Bitmap material - var tex_addr = props.get( 2, 0 ); - mat.map = this.getBlock( tex_addr ); - - } - - mat.extra = attributes; - mat.alphaThreshold = props.get( 12, 0.0 ); - mat.repeat = props.get( 13, false ); - - - return mat; - - }, - - parseTexture: function () { - - var name = this.readUTF(), - type = this.readU8(), - asset, - data_len; - - // External - if ( type === 0 ) { - - data_len = this.readU32(); - var url = this.readUTFBytes( data_len ); - console.log( url ); - - asset = this.loadTexture( url ); - asset.userData = {}; - asset.userData.name = name; - - } else { - // embed texture not supported - } - // Ignore for now - this.parseProperties( null ); - - this.parseUserAttributes(); - return asset; - - }, - - loadTexture: function ( url ) { - - var tex = new THREE.Texture(); - - var loader = new THREE.ImageLoader( this.manager ); - - loader.load( this._baseDir + url, function ( image ) { - - tex.image = image; - tex.needsUpdate = true; - - } ); - - return tex; - - }, - - parseSkeleton: function () { - - // Array - // - this.readUTF(); - var num_joints = this.readU16(), - skeleton = [], - joints_parsed = 0; - - this.parseProperties( null ); - - while ( joints_parsed < num_joints ) { - - var joint, ibp; - - // Ignore joint id - this.readU16(); - - joint = new THREE.Bone(); - joint.parent = this.readU16() - 1; // 0=null in AWD - joint.name = this.readUTF(); - - ibp = this.parseMatrix4(); - joint.skinMatrix = ibp; - - // Ignore joint props/attributes for now - this.parseProperties( null ); - this.parseUserAttributes(); - - skeleton.push( joint ); - joints_parsed ++; - - } - - // Discard attributes for now - this.parseUserAttributes(); - - - return skeleton; - - }, - - parseSkeletonPose: function () { - - var name = this.readUTF(); - - var num_joints = this.readU16(); - this.parseProperties( null ); - - // debug( 'parse Skeleton Pose. joints : ' + num_joints); - - var pose = []; - - var joints_parsed = 0; - - while ( joints_parsed < num_joints ) { - - var has_transform; //:uint; - var mtx_data; - - has_transform = this.readU8(); - - if ( has_transform === 1 ) { - - mtx_data = this.parseMatrix4(); - - } else { - - mtx_data = new THREE.Matrix4(); - - } - pose[ joints_parsed ] = mtx_data; - joints_parsed ++; - - } - - // Skip attributes for now - this.parseUserAttributes(); - - return pose; - - }, - - parseSkeletonAnimation: function () { - - var frame_dur; - var pose_addr; - var pose; - - var name = this.readUTF(); - - var clip = []; - - var num_frames = this.readU16(); - this.parseProperties( null ); - - var frames_parsed = 0; - - // debug( 'parse Skeleton Animation. frames : ' + num_frames); - - while ( frames_parsed < num_frames ) { - - pose_addr = this.readU32(); - frame_dur = this.readU16(); - - pose = this._blocks[ pose_addr ].data; - // debug( 'pose address ',pose[2].elements[12],pose[2].elements[13],pose[2].elements[14] ); - clip.push( { - pose: pose, - duration: frame_dur - } ); - - frames_parsed ++; - - } - - if ( clip.length === 0 ) { - - // debug("Could not this SkeletonClipNode, because no Frames where set."); - return; - - } - // Ignore attributes for now - this.parseUserAttributes(); - return clip; - - }, - - parseVertexAnimationSet: function () { - - var poseBlockAdress, - name = this.readUTF(), - num_frames = this.readU16(), - props = this.parseProperties( { 1: UINT16 } ), - frames_parsed = 0, - skeletonFrames = []; - - while ( frames_parsed < num_frames ) { - - poseBlockAdress = this.readU32(); - skeletonFrames.push( this._blocks[ poseBlockAdress ].data ); - frames_parsed ++; - - } - - this.parseUserAttributes(); - - - return skeletonFrames; - - }, - - parseAnimatorSet: function () { - - var animSetBlockAdress; //:int - - var targetAnimationSet; //:AnimationSetBase; - var name = this.readUTF(); - var type = this.readU16(); - - var props = this.parseProperties( { 1: BADDR } ); - - animSetBlockAdress = this.readU32(); - var targetMeshLength = this.readU16(); - - var meshAdresses = []; //:Vector. = new Vector.; - - for ( var i = 0; i < targetMeshLength; i ++ ) - meshAdresses.push( this.readU32() ); - - var activeState = this.readU16(); - var autoplay = Boolean( this.readU8() ); - this.parseUserAttributes(); - this.parseUserAttributes(); - - var targetMeshes = []; //:Vector. = new Vector.; - - for ( i = 0; i < meshAdresses.length; i ++ ) { - - // returnedArray = getAssetByID(meshAdresses[i], [AssetType.MESH]); - // if (returnedArray[0]) - targetMeshes.push( this._blocks[ meshAdresses[ i ] ].data ); - - } - - targetAnimationSet = this._blocks[ animSetBlockAdress ].data; - var thisAnimator; - - if ( type == 1 ) { - - - thisAnimator = { - animationSet: targetAnimationSet, - skeleton: this._blocks[ props.get( 1, 0 ) ].data - }; - - } else if ( type == 2 ) { - // debug( "vertex Anim???"); - } - - - for ( i = 0; i < targetMeshes.length; i ++ ) { - - targetMeshes[ i ].animator = thisAnimator; - - } - // debug("Parsed a Animator: Name = " + name); - - return thisAnimator; - - }, - - parseMeshData: function () { - - var name = this.readUTF(), - num_subs = this.readU16(), - geom, - subs_parsed = 0, - buffer, - geometries = []; - - // Ignore for now - this.parseProperties( { 1: this._geoNrType, 2: this._geoNrType } ); - - // Loop through sub meshes - while ( subs_parsed < num_subs ) { - - var sm_len, sm_end, attrib; - - geom = new THREE.BufferGeometry(); - geom.name = name; - geometries.push( geom ); - - - sm_len = this.readU32(); - sm_end = this._ptr + sm_len; - - - // Ignore for now - this.parseProperties( { 1: this._geoNrType, 2: this._geoNrType } ); - - // Loop through data streams - while ( this._ptr < sm_end ) { - - var idx = 0, - str_type = this.readU8(), - str_ftype = this.readU8(), - str_len = this.readU32(), - str_end = str_len + this._ptr; - - if ( str_type === 1 ) { - - // VERTICES - - buffer = new Float32Array( ( str_len / 12 ) * 3 ); - attrib = new THREE.BufferAttribute( buffer, 3 ); - - geom.addAttribute( 'position', attrib ); - idx = 0; - - while ( this._ptr < str_end ) { - - buffer[ idx ] = - this.readF32(); - buffer[ idx + 1 ] = this.readF32(); - buffer[ idx + 2 ] = this.readF32(); - idx += 3; - - } - - } else if ( str_type === 2 ) { - - // INDICES - - buffer = new Uint16Array( str_len / 2 ); - attrib = new THREE.BufferAttribute( buffer, 1 ); - geom.setIndex( attrib ); - - idx = 0; - - while ( this._ptr < str_end ) { - - buffer[ idx + 1 ] = this.readU16(); - buffer[ idx ] = this.readU16(); - buffer[ idx + 2 ] = this.readU16(); - idx += 3; - - } - - } else if ( str_type === 3 ) { - - // UVS - - buffer = new Float32Array( ( str_len / 8 ) * 2 ); - attrib = new THREE.BufferAttribute( buffer, 2 ); - - geom.addAttribute( 'uv', attrib ); - idx = 0; - - while ( this._ptr < str_end ) { - - buffer[ idx ] = this.readF32(); - buffer[ idx + 1 ] = 1.0 - this.readF32(); - idx += 2; - - } - - } else if ( str_type === 4 ) { - - // NORMALS - - buffer = new Float32Array( ( str_len / 12 ) * 3 ); - attrib = new THREE.BufferAttribute( buffer, 3 ); - geom.addAttribute( 'normal', attrib ); - idx = 0; - - while ( this._ptr < str_end ) { - - buffer[ idx ] = - this.readF32(); - buffer[ idx + 1 ] = this.readF32(); - buffer[ idx + 2 ] = this.readF32(); - idx += 3; - - } - - } else { - - this._ptr = str_end; - - } - - } - - this.parseUserAttributes(); - - geom.computeBoundingSphere(); - subs_parsed ++; - - } - - //geom.computeFaceNormals(); - - this.parseUserAttributes(); - //finalizeAsset(geom, name); - - return geometries; - - }, - - parseMeshPoseAnimation: function ( poseOnly ) { - - var num_frames = 1, - num_submeshes, - frames_parsed, - subMeshParsed, - - str_len, - str_end, - geom, - idx = 0, - clip = {}, - num_Streams, - streamsParsed, - streamtypes = [], - - props, - name = this.readUTF(), - geoAdress = this.readU32(); - - var mesh = this.getBlock( geoAdress ); - - if ( mesh === null ) { - - console.log( "parseMeshPoseAnimation target mesh not found at:", geoAdress ); - return; - - } - - geom = mesh.geometry; - geom.morphTargets = []; - - if ( ! poseOnly ) - num_frames = this.readU16(); - - num_submeshes = this.readU16(); - num_Streams = this.readU16(); - - // debug("VA num_frames : ", num_frames ); - // debug("VA num_submeshes : ", num_submeshes ); - // debug("VA numstreams : ", num_Streams ); - - streamsParsed = 0; - while ( streamsParsed < num_Streams ) { - - streamtypes.push( this.readU16() ); - streamsParsed ++; - - } - props = this.parseProperties( { 1: BOOL, 2: BOOL } ); - - clip.looping = props.get( 1, true ); - clip.stitchFinalFrame = props.get( 2, false ); - - frames_parsed = 0; - - while ( frames_parsed < num_frames ) { - - this.readU16(); - subMeshParsed = 0; - - while ( subMeshParsed < num_submeshes ) { - - streamsParsed = 0; - str_len = this.readU32(); - str_end = this._ptr + str_len; - - while ( streamsParsed < num_Streams ) { - - if ( streamtypes[ streamsParsed ] === 1 ) { - - //geom.addAttribute( 'morphTarget'+frames_parsed, Float32Array, str_len/12, 3 ); - var buffer = new Float32Array( str_len / 4 ); - geom.morphTargets.push( { - array: buffer - } ); - - //buffer = geom.attributes['morphTarget'+frames_parsed].array - idx = 0; - - while ( this._ptr < str_end ) { - - buffer[ idx ] = this.readF32(); - buffer[ idx + 1 ] = this.readF32(); - buffer[ idx + 2 ] = this.readF32(); - idx += 3; - - } - - - subMeshParsed ++; - - } else - this._ptr = str_end; - streamsParsed ++; - - } - - } - - - frames_parsed ++; - - } - - this.parseUserAttributes(); - - return null; - - }, - - getBlock: function ( id ) { - - return this._blocks[ id ].data; - - }, - - parseMatrix4: function () { - - var mtx = new THREE.Matrix4(); - var e = mtx.elements; - - e[ 0 ] = this.readF32(); - e[ 1 ] = this.readF32(); - e[ 2 ] = this.readF32(); - e[ 3 ] = 0.0; - //e[3] = 0.0; - - e[ 4 ] = this.readF32(); - e[ 5 ] = this.readF32(); - e[ 6 ] = this.readF32(); - //e[7] = this.readF32(); - e[ 7 ] = 0.0; - - e[ 8 ] = this.readF32(); - e[ 9 ] = this.readF32(); - e[ 10 ] = this.readF32(); - //e[11] = this.readF32(); - e[ 11 ] = 0.0; - - e[ 12 ] = - this.readF32(); - e[ 13 ] = this.readF32(); - e[ 14 ] = this.readF32(); - //e[15] = this.readF32(); - e[ 15 ] = 1.0; - return mtx; - - }, - - parseProperties: function ( expected ) { - - var list_len = this.readU32(); - var list_end = this._ptr + list_len; - - var props = new AWDProperties(); - - if ( expected ) { - - while ( this._ptr < list_end ) { - - var key = this.readU16(); - var len = this.readU32(); - var type; - - if ( expected.hasOwnProperty( key ) ) { - - type = expected[ key ]; - props.set( key, this.parseAttrValue( type, len ) ); - - } else { - - this._ptr += len; - - } - - } - - } - - return props; - - }, - - parseUserAttributes: function () { - - // skip for now - this._ptr = this.readU32() + this._ptr; - return null; - - }, - - parseAttrValue: function ( type, len ) { - - var elem_len; - var read_func; - - switch ( type ) { - - case AWD_FIELD_INT8: - elem_len = 1; - read_func = this.readI8; - break; - - case AWD_FIELD_INT16: - elem_len = 2; - read_func = this.readI16; - break; - - case AWD_FIELD_INT32: - elem_len = 4; - read_func = this.readI32; - break; - - case AWD_FIELD_BOOL: - case AWD_FIELD_UINT8: - elem_len = 1; - read_func = this.readU8; - break; - - case AWD_FIELD_UINT16: - elem_len = 2; - read_func = this.readU16; - break; - - case AWD_FIELD_UINT32: - case AWD_FIELD_BADDR: - elem_len = 4; - read_func = this.readU32; - break; - - case AWD_FIELD_FLOAT32: - elem_len = 4; - read_func = this.readF32; - break; - - case AWD_FIELD_FLOAT64: - elem_len = 8; - read_func = this.readF64; - break; - - case AWD_FIELD_VECTOR2x1: - case AWD_FIELD_VECTOR3x1: - case AWD_FIELD_VECTOR4x1: - case AWD_FIELD_MTX3x2: - case AWD_FIELD_MTX3x3: - case AWD_FIELD_MTX4x3: - case AWD_FIELD_MTX4x4: - elem_len = 8; - read_func = this.readF64; - break; - - } - - if ( elem_len < len ) { - - var list; - var num_read; - var num_elems; - - list = []; - num_read = 0; - num_elems = len / elem_len; - - while ( num_read < num_elems ) { - - list.push( read_func.call( this ) ); - num_read ++; - - } - - return list; - - } else { - - return read_func.call( this ); - - } - - }, - - readU8: function () { - - return this._data.getUint8( this._ptr ++ ); - - }, - readI8: function () { - - return this._data.getInt8( this._ptr ++ ); - - }, - readU16: function () { - - var a = this._data.getUint16( this._ptr, littleEndian ); - this._ptr += 2; - return a; - - }, - readI16: function () { - - var a = this._data.getInt16( this._ptr, littleEndian ); - this._ptr += 2; - return a; - - }, - readU32: function () { - - var a = this._data.getUint32( this._ptr, littleEndian ); - this._ptr += 4; - return a; - - }, - readI32: function () { - - var a = this._data.getInt32( this._ptr, littleEndian ); - this._ptr += 4; - return a; - - }, - readF32: function () { - - var a = this._data.getFloat32( this._ptr, littleEndian ); - this._ptr += 4; - return a; - - }, - readF64: function () { - - var a = this._data.getFloat64( this._ptr, littleEndian ); - this._ptr += 8; - return a; - - }, - - /** - * Converts a UTF-8 byte array to JavaScript's 16-bit Unicode. - * @param {Array.} bytes UTF-8 byte array. - * @return {string} 16-bit Unicode string. - */ - readUTF: function () { - - var len = this.readU16(); - return this.readUTFBytes( len ); - - }, - - /** - * Converts a UTF-8 byte array to JavaScript's 16-bit Unicode. - * @param {Array.} bytes UTF-8 byte array. - * @return {string} 16-bit Unicode string. - */ - readUTFBytes: function ( len ) { - - // TODO(user): Use native implementations if/when available - var out = [], c = 0; - - while ( out.length < len ) { - - var c1 = this._data.getUint8( this._ptr ++, littleEndian ); - if ( c1 < 128 ) { - - out[ c ++ ] = String.fromCharCode( c1 ); - - } else if ( c1 > 191 && c1 < 224 ) { - - var c2 = this._data.getUint8( this._ptr ++, littleEndian ); - out[ c ++ ] = String.fromCharCode( ( c1 & 31 ) << 6 | c2 & 63 ); - - } else { - - var c2 = this._data.getUint8( this._ptr ++, littleEndian ); - var c3 = this._data.getUint8( this._ptr ++, littleEndian ); - out[ c ++ ] = String.fromCharCode( ( c1 & 15 ) << 12 | ( c2 & 63 ) << 6 | c3 & 63 ); - - } - - } - return out.join( '' ); - - } - - } ); - - return AWDLoader; - -} )(); diff --git a/examples/models/awd/simple/simple.awd b/examples/models/awd/simple/simple.awd deleted file mode 100644 index aedc62e098a712922cd05e97251000d0d91607b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55420 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 diff --git a/examples/models/awd/simple/textures/texture.jpg b/examples/models/awd/simple/textures/texture.jpg deleted file mode 100644 index 9578adcaa8ac672834a1f4e2739c6a17537a4286..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12887 zcmb_?bzD|U_wRl{y1P3CNd=^l5CQ2_ng>u)y5qs4h|&!L(%s$gh;&LLozk6>cZ26W z?>WD?_w&2=?mza-tXZ?>yS{7o%$_~_X5wZ6AeC{mFb4oRIW_i|LL#^Ba z2yhP+-v@x39RT}@=^GO>z!VNjAU9LMI{*_E6%`E?6AcX$4+9MYj}QkF6NiulAD<8( zpM)5Xkbr;?kC>R8f{KEin1O+rnSp`#_Imu+1;NC?z{JMH!NS5J#Ky)ZB*ekR#UZ2w z+Yt~@GLRF47dZnhJrxxdJ?(9CW@c_~PHyhM+CRR519+$i00Mvrp$8D~Ac%O7n^qtI z#D@fdK>qCz06{>!hlGrR`VZkMJ$CsZ3G45TaArO4mul!swLvv zx9EU&@7MOeszTGRdR3pJskBCC10fZt#fwnW7g}7pL0frz$WpN|Bh9tAzUq~8 zMEo&R5(W5QGxN(tn;h5lcc-gZnGDzPmhzNs)sqpA_9%raELPhx1GJqjZQUK`l^2#S z{Av^t!*x-_|FKaV5XeA6!#2)BKW+Om&%?AzOIXF!WNGE)^0IDlkEZhTnC=csCV;-P zt)siLtFxLSChto;M|8*t8EMTgty)3iC5KVruPp zSla%R>5p*KH;YTA?cB|_0t{&PzslK0x$-!GD50dFdz~%v_G+3L>9r9sTr=Y(b6u?i zoBWcXs0c5W>V5k%D5+sJMfkg@`HX6?Gj0g+Q%%5c7!0RC2I$G;AbO zgwix@r0??54v&n*f*+)WZ40!so_;#6k{b1EO^2wx`}rGG7^ z1L;r1>2|^J?ghdkKj9h{?t-0<{Rng14)KcmG!!ZN>eLw;?^|AXVxUV!(gl6Ug|I;* z8J;^BJ&VgRfrjCr3kAF{nzV+%{}XfsL?eg>4+sO_5=&aBZS3AC;rnM14^V)&FwDkl z%o~8|@>{#X4S?($acxA6fQ|s5!bt~p#t`^w zwKOV0S5a7-oe*iQGlG|`MS3udn7$)RiVR=I@78^(VaVFcy5a^tY-QU$YS43V7NWhK zh*FrI)&d*vRr;hrl2b;cml@*lE%7>odrh+tS9k^NLR?W_IbmSWv%eQ`)0ss$GFKoY zw3&G@l_XI~{P+_-qXg@pVHGjk-Fx+m>nCIcoJ&d5bx_+&b-IADb|t9f@wrP>v6*^BC<}e`q^X(tP`yO6BcDC}`N5*G;Rc%Mit9+#E@G~~rFUk6 zyXLl_u&89A&7;yocEuE@nBDP;Qj9E)pid{Ug)_T|QgIA5TH0*yqT$R*%b()ON~;p) z`M1Z+&8G8SV+-e=Z{|Fh8e6a=rxPH0Ic}`H-JyB|u+7czc*I_RV>pfY)eU#@wK)&{ zrFFgLUA;lGqI;4382GoSW<&f>QR(rVdSG7lo1LT^Aj{+OJXEpLXG?=qzAj>>WWRh! zl!8N)x})RJZ+5aN34^;jWioM{LMAHnGKtI6T3uH%znsmBEI>B9;9 zFD3LxEjKyT+&!z1wWcuNGfx_t ze)qw(rtlkJc;f8ZPN=|woZr+O`k7ycWV@`DOlxZT1&o-!3y)Ba{$2o;K#8Q@P%87f zMjV!-=ETPBXtAsg*zq&&RWg1tL(zvY&Mo-f;I*SfWiQ?|yQ61&eTt4N>WWh_d#ifG zy@NVg_O=&ubkTd9!r$}{-jxZrUm0QS>{IR%&KwBN?IKu>uc>5%XUhN(&5?tT$vU92dJCOQUez2!~pUK>`)#B_l@>N1+jUKPH{)F!P?_9Yb9em5a z?0${y)zX%9)#kjNS@;0po(WH{6(q>?LumxU{pcNHQ|%g9YFJQE>snvJKJP*5OTS)c z(#C9#5u=U%0iiytl2yljD}9&)8Lp)?bGs5j(PHt)j4Q;Tl}fdCc>aWlXKzO9nNEN+5(`S{@QY@GvQOOIs{gAI_R510rPXZT;?4=J67$iihbA4&TFS@)| z90t^`#eY94cTqq|JD0ryl%Y$%282W@hA?gb954@G-yd6g+ReHo{kyZVW4{&c>$XlwK}mb}`Y7jiw>rLw#p7IUo% zsdRl!h0Jj^rC6Xa6=FzyvIHf*o)=OeskY(NZ7`l_E~&LWBkw+Si)`Fdcmw?vbnM%} zwX&u;>Tj(`RAFClM#=1B?_Hbu1?;-DYMS{Sp1#jclV?7P;6t~!aKPx*z$tj74oHPD1 z41$78Srxg;Ta3-|*PWDcRIetqF9%Mfw%D&N>uDXp}!(={FCFX3F8v>+!=VamTxYz$D@GVVzk&88^#DnoOLuH|m89bQjEh^Wck3r8mHev^&*L!!dpvl*n1+$j)8z z1I+R8Sw1i>*~cM!=N<0x$07S-CCJHR!maMeR-L-b@wFRHz1+ z9A95(^G7p@rl*RgSTE^MTR{ynu|3+lRfbDF?Wm9vE(Bs0!e@;qn@h?mVf@6hZp92x z-lpLx%^YVdBV}}tUXk=8X+%5i164LDlMg9GIM1X%&=L`zPgfjS zuZwoK^><$p>&s9#O?!~2c(Ru6G;eW>By3XTY_N<8_l|~ZHVDqYZV1_@mUU0u4cPTd zKZb!}NgBZRbt9+I0pnpk`|9wb)%5~i&%R8;bsD|m+2HRAi`ZUFno4z8*II#7v8PfL z6yJXvN3!4)tRsJ0sypN0~cmYQ+e9ACJLE3wQw9hnvS02$h=bpK8 zCnhsn`IpERWKG#Oz^{JrHrjX|goC18h4MJ7h%w?xAHv*Y!8RqML^#Kx=eIJpcAZ$xRY4aln&Uqhor6g1zugjx+T&IyiijkIyh zOrr(^P=BvvGFDT857`YQ%*>n35?yr@RAbv+1oMBqq8O)N=L*6R-6*$xv%o5&nRcof zs7=$N8kiAAA<94L^h)8qnT4#tuz3|jR!dEy3OQ~?j;zN})}oG{2ARiV3TcvLce-HE z856TJmE0)zMsr_~DMim}ZM%upSV_eV-G zJ5%Z14ZmCnwrp%-e|`~l+3p!Z8P$+sYP)AGgJJJl^-t zDK6C)m3KIl8?1@H+JQ_+#ISz4Hwfu;kYp4Da#T`sAlNByVPs;35usT^`M%u-Gu3Mf zeg$S8Wy$6q#WZ<_S8|X;o!=e*H+RUJOyimU4Pu_c-Ka>11=0((*w#-UEY^zRyV{dg zYML#=w_X;TRh%^U`*Krnu!2!3{icK0S?p~6pbK|e6Oo0Jf~?y)0V|g(Mw%_&Zqu3tE4rM#h4*rygYV;bJEqT`ZvVvS(^AecjAjr&kd!J?~Oi8H4f%CEAGSnls+ z(GYUtkk#%OzM-MpuD`)i2-ENHRTRx4mg#e#@?=)`>=b})+K)a8$xej|WlIrc8+SYE z@|Rbyoe61Z0<-HeFF*0qQN6cjCpQTuoti)i^q74ZntSMc(#v9WTu@nL;u`?{_!kG(P`)geZfxs^g^R3XpQkpxx>Ytyx|Pk$%fpqN=o+_ZLO>`T9$P*t!bIppz1uO^Xsy z5er#mtyFa3_U==eU77Px8lfFxCB}m3iX>ZQvs_h8R=rCy?V9t)*`uXf%T8MX25%Fg zw(7y2OoWrKaT2*bXw>?fUD^_q9+o6OG%SmXS*trK`MTzOwk}5dChZ&!CU|oWdt^UO4+mEOSI~PP^g;F#6JHFi_EaHtG{=zpfet z)h5kYK9>I!?Pchu$}z=Wc}eU31?TC8;9)(cm11{`?a$)hDE2V_OVb{vP}0%%`+}ls zX_aXbGfHl?#&{jR=2ECzZb@uY$iLn86i@#n8{LS4 zOZT=fYKjL80I(<-5CrK3)6D(lAo9oM4>{X2PAJra*rm)Uq}?x?hz~PB9~%mNWcg5=ks_$Z4=w`tp3` zeceiMQPSS5)Zz!)N>4bKXptZ)k+=EJ~ilfuIg8Eov z-@-oKvZ@9v+wxea%vvuA({q#|ZJ}9@o~}TB0b;p6aM|XoeBvv&9b=P|5s{`FVCUf@ zMil^E(hbh%AEiUhV+y6covag0Y zzL3a^{Nz0Np;;|D{q*~PXo^bQ7Vo`=O0~X5&BP~b$&B%rr+qb3t`>YL!&LJlicL!R zzF(iIQ)hQQ=H?8QK+WcANDXcekr@2(4<}8-uT)I0{uId4^XLaXg=Xk9N^Dk6 z)q8D%;aaT*ykEEug>DQ7v?A^K0h;!r!qHY=X~I$1#@~w5BlcR>{Qp#Y{WcJmf}m=L z&WQj+lYz6=fa8e-NSkK`qVy1cR|y%)isE%Anp6rP8EnWU{uuI*y?jvI{h^OmNX)5i zRrw=^=WB9ULXsF=e=%}3wcwmRO3fiwo=$cE<;H}b4<^=ZA}FI?2j>%NxwiNm+lJ&J0cuz z2#WEDbg;Cmjxm>T{R&YIx-F=Tk;9vR3W{+bQYMp0>D0j+!2*xhH?T&XM29?VgG`L) z1~Ba0Cp%d!@hRc_d%P8j z+icLhcz=ULg+#30x0P%B&Dkf950(haj$EUjPlFQ!Ln!p0KU0`|S|rl=4ynoO?1Pvo z`5!6-hpVlEhj-hf)qw!V?A8w|mI$^^XMZ}K{F@{!$&Fj#r(*f~XME_{gqs|2_xZmM zIx3t@eU9a84KWMK{l@hV7b2l|bfeIY$mHlt$mQ_iSz<{j{BM(0<>fQvZj(Tq+pXx_DyUfV&}ku!d{~1SQw5I;xAr~ zT!o**6Lji2`2ue>)38i75xh-uaqowyBX~>Z;#z_yYT%ZTc8o2Kn2yVWyyoEQGY=g{ z&Ui=c)^}oOmpPZc-}r?PGq|?1CQgP+{c2Wfz=OPLa(IG@B^?<0|B&eX7XF#sxlU3U z?``e_C*y=tc7n%zehhKrye!~Jh+=`FDYl6fg12!&F?dXA_M9*J_-!1q^QSDWF<~8Y zt?aGPG0jSGqevZsO)OJ#@c8b$O`Uy{GV9(3G^!iSBecZTbrRmDVR>fGJl#ew-Zf@e zE%ltdZh3c=VKtEqQcxL~^M}rDA2}bu#OBHGL~@fBgr58_4l%b|5-f$7I#kVLvtPt06cQ$x0y(rHH7G!waALL|KCBPaB42(6WC%L#WMBqP( z-2Hm*&R=YAzil}p#%bPu+S2yS3Z#mF_y~fuYz?)`O8b` z1x&*{<2vXNY zN%S0pyu*t9_K|3b`#lhJ)G5J1B={VI4IC-mAS>l)7tcn^9VebLvTQTRj}DkY9OEck zs<{n}h(XBgAX20+Mvmyy@Sl)ZcNK!L7a-EY+u*ss-7K~dJ|%L0o1gr#_tFsD0jL7$ z=-dE0cluw%s1NV^QFYa*HwO^p*T4TsB-ma565C-BR^5kfte#ktvdYPd;RW(w;IQ~d zVvXOMI2P{Qem#|jl{SbK*kQ4ty`*C-AyN|vqG4_S30Os3`(7+t{0ByVD52IsJ;^IK zvV(AnuyMXt=;uX{q7J$utAGx^Run{?6XnoQH-x|-umatgl0Z<<2C-t!PHp7)D1*JiuQwVA1mrQZ?l*R3g6 z8khCK-!2NTHzM8p`C7iLxTQlzKTX$#llf9e*8Y))@}l1WpM9HJrLyh5g+t-?MfTG= z*~P#WD!3zIU4HXUa73;4neIh@=8M>l-U(Ta^zDhjS zo$>hgV=?wr);sR_mDwiFA*eD!H%x+{b2PDs*nQpOQC)WY;n&dIx4kFl+M|uJrE{wa z&HKvQ`urj&oC(x`yZ8@ftrLR|-z2Ub#G~x|dM+K`B+eV4O%&Rb4macs1w`V{)knLd z8o?tsA^jWR6VA|=!W%%G#`Tl#$<`&om{*<1y@Rzq#IEE_Z~Y&)aAIzNL6mhv&}_+{ zZ9E2IWnu14Zjj{xu=Q4B$cbC#)gY&b_-N!y{Y@+%jaZsiQLBG-=yy&tN)>A@-VYl3 zj3Gm06oTA`#rvEXk3yW(YE!**G}~}0Pcyv@Dki=eQ+KnMB)2vhHlY> zr-<6zIilHGvMSRx2gup(rTRqXa5~)IThI=%V|8t(ndVx7>(wXSGaod}E1t21rj_hp z0~gsv`s?|A$>GDqGcb4k{=m_~-9$0w>wN<^Z%K+3n&_*g!Lm9{tCH@{b*ynCTqhcr zri@Ke+yQ?B(IBhA!Xzb!s9YARJf0sl&Eihf*+Gm;BRsDd6M}qSCs6h>$7?{jJ;{~~0oy_^y_Ly~*p5yRExc#&NQ zqn2+RJWqDqaH}}u^mVc+cACwLA}n&o)OED77Jt2VO++vb;4t~DH>xFCjM(ezGp;-S z(6DX(qr+(TJa*&;IB;uDcig2e0o;X7l{X4)#4_HkJGzx|xdZXpMM?_|2!wv;77LPF@H1Bz9t57ymAt%BSQ|lbk5e z3S8O@fE_Gg8)jY2FD~_8?Id~dr{uF>J+!bNwpELr7Tr{dh$d1io<X(Z1l z8ICf*#d4_uNA9(C7lLn@nG;SJM0P|_PQXMqD|6ymox{8}JE|)aBn*rp*9ZfAd^u%> zme;FE1Q8te<14f)t(ckMsEv5cqwgQefsqQ4fBew}zk|%~!61Ogj_Oc}F9B(&*~7w{ ze+<~h?P2l!Jq-Zmlz@P=l(ZW*K#_@&X-5bsvOY?cxHnXTmc{@>7Pe=Ij)o^n+#jIk zDk*fu68omw##1z8WMr`3t^ZyjiB4fHNvb5SBPiJj_ejqYXW4r(#6Abv_!w6F*B{ z(^4}x-q$6}iXXM;ja7&XC~J1e87GIUlBvWqFes27HndPm^)j?#;XZ6=7m@0vyUVrw zBlo+ug;M$ubstfhEogOwu2q>k6!%fy+nl~b(tUzn<5n!8lsw+cTMN)uEJcL?%ct6L z9RXjU)U;NXl9nGMf2uB0o81-yEI)?-tFReh_4mT>8m@TR0P^$nRz3!X-t<;Oo={xA zO4>YL5SnT5dj_b{6F}{^+54BIZ`HAj8#Nx`qJe&h;1G&#jopHaz{~%ZdR?{e>Ac@$6LCS(f|8zq<;k$l~_ryq=0_aeJ0+YkKk% z>B71cS-p~egp@#ojgK4r7c(SSE&A+Uj;7xsbFDp=11_NNut>hrDgkls39t%-A#8@- z-HnSR0gNI&DZQEifHU_`MJ$I!TA*&Fm9G<2FBzu;kVZM_iu9xb61^J#T2z3u7P;2` zx5ee(iah~;S&YTKZ7@zd&Po55WzV^~1P@Un|Fy_k;b9wf8(TTe;cDaY#8-9CpdEuT zRPnj}+QstciWd(@6*=o0qY29Y#m8NWP^3>7xfm$(e0*DW-bl666Vtlu4PP1cHv%DD zc&gxq^q9F?;#HdGL&T>96N+{Z58#YpA_Xuq{bLY-Ivoom+TU5#_W;1k7HC9^trFId3&3f*!W!Zsr1%b| zl>ZM2&T^-q8U!XB(>eq{opT;4=aQaxh-Tf%-I6cUex+UR+v5CzYo|}ngC%R@ow3fe zm9pi}fk{u|G3S490jLf5jF32TMhOL;%vbF=8NFIo_+d`$Rh=M+KhaB_$}w-QP0yROgFllw%T)&ZKhUQ#`3fRMec(`1)p_~3AY`mmjCESYlKN-HE^Gf0=}zz zyf1WXhT$Yl-~0Z;CE^JMTdqq9dp>kDMz1;~kbfWi=T?gb;!|`+q5AC)>XKA>zYoW+ z;9>=56q^Wi$EZ7qU)*+K;~{5Mh;aXfP-Ik0rjRpyS)x7uB|n6=qGW(O_1&DYh=-^5 z2bovdx`h}q=Vq0a-?25F#^E08p?(umnNz6`JT#l;A6E{|0SC2iNw4gy`;IQN!tWA zoQ%mG#CHd|b_Cs-@SWsm6*XAi%;R>H57*zo#)oMTYhvXqWW{1_Agv17d=oMv#P!(y zyNXpcgvCc^Y<^wJL`5xVFH;9ijoY;RZ7!X)P>MaX?RPd(@G79uc^Yt%cUwL=cIT9u{o4K&bP}%(>%~szSmkq^P0VV3o4tAi zs3t{kUc_!bx8b{dvw>*qcyi4P#{Y5kMo*FEa-LoBF@f%J(gd3W!5R1th+WLQf~PgQ z`({Znf3~F2p}ACH={gP7 z35_dP`w+B&qd3Bx-q*bS@djYHYTm%PF!AlY0p6U$j*_0_8OmDiicDQk#2$!GU8geb Q8rWF3q+eE^!ft;2FQ58pivR!s diff --git a/examples/webgl_loader_awd.html b/examples/webgl_loader_awd.html deleted file mode 100644 index 5ea0543f6a..0000000000 --- a/examples/webgl_loader_awd.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - three.js webgl - collada - - - - - -
- three.js - AWD loader -
- - - - diff --git a/utils/modularize.js b/utils/modularize.js index c742bdb8d5..a3bd2e0ab4 100644 --- a/utils/modularize.js +++ b/utils/modularize.js @@ -73,7 +73,6 @@ var files = [ { path: 'loaders/deprecated/LegacyJSONLoader.js', dependencies: [], ignoreList: [ 'ObjectLoader' ] }, { path: 'loaders/3MFLoader.js', dependencies: [], ignoreList: [] }, { path: 'loaders/AMFLoader.js', dependencies: [], ignoreList: [] }, - { path: 'loaders/AWDLoader.js', dependencies: [], ignoreList: [] }, { path: 'loaders/AssimpJSONLoader.js', dependencies: [], ignoreList: [] }, { path: 'loaders/AssimpLoader.js', dependencies: [], ignoreList: [] }, { path: 'loaders/BasisTextureLoader.js', dependencies: [], ignoreList: [] }, -- GitLab