THREE.UCSCharacter = function() { var scope = this; var mesh; this.scale = 1; this.root = new THREE.Object3D(); this.numSkins; this.numMorphs; this.skins = []; this.materials = []; this.morphs = []; this.onLoadComplete = function () {}; this.loadCounter = 0; this.loadParts = function ( config ) { this.numSkins = config.skins.length; this.numMorphs = config.morphs.length; // Character geometry + number of skins this.loadCounter = 1 + config.skins.length; // SKINS this.skins = loadTextures( config.baseUrl + "skins/", config.skins ); this.materials = createMaterials( this.skins ); // MORPHS this.morphs = config.morphs; // CHARACTER var loader = new THREE.JSONLoader(); console.log( config.baseUrl + config.character ); loader.load( config.baseUrl + config.character, function( geometry ) { geometry.computeBoundingBox(); geometry.computeVertexNormals(); THREE.AnimationHandler.add( geometry.animation ); mesh = new THREE.SkinnedMesh( geometry, new THREE.MeshFaceMaterial() ); scope.root.add( mesh ); var bb = geometry.boundingBox; scope.root.scale.set( config.s, config.s, config.s ); scope.root.position.set( config.x, config.y - bb.min.y * config.s, config.z ); mesh.castShadow = true; mesh.receiveShadow = true; animation = new THREE.Animation( mesh, geometry.animation.name ); animation.JITCompile = false; animation.interpolationType = THREE.AnimationHandler.LINEAR; animation.play(); scope.setSkin(0); scope.checkLoadComplete(); } ); }; this.setSkin = function( index ) { if ( mesh && scope.materials ) { mesh.material = scope.materials[ index ]; } }; this.updateMorphs = function( influences ) { if ( mesh ) { for ( var i = 0; i < scope.numMorphs; i ++ ) { mesh.morphTargetInfluences[ i ] = influences[ scope.morphs[ i ] ] / 100; } } } function loadTextures( baseUrl, textureUrls ) { var mapping = new THREE.UVMapping(); var textures = []; for ( var i = 0; i < textureUrls.length; i ++ ) { textures[ i ] = THREE.ImageUtils.loadTexture( baseUrl + textureUrls[ i ], mapping, scope.checkLoadComplete ); textures[ i ].name = textureUrls[ i ]; } return textures; }; function createMaterials( skins ) { var materials = []; for ( var i = 0; i < skins.length; i ++ ) { materials[i] = new THREE.MeshLambertMaterial( {"colorDiffuse" : [0.5880, 0.5880, 0.5880], "colorAmbient" : [0.5880, 0.5880, 0.5880], "colorSpecular" : [0.5000, 0.5000, 0.5000], "color" : 0xeeeeee, "transparency" : 1.0, "specularCoef" : 10.0, "wireframe" : false, "vertexColors" : false, "map" : skins[i]} ); materials[i].skinning = true; materials[i].morphTargets = true; materials[i].wrapAround = true; materials[i].perPixel = true; } return materials; } this.checkLoadComplete = function () { scope.loadCounter -= 1; if ( scope.loadCounter === 0 ) { scope.onLoadComplete(); } } }