mirror of
https://github.com/Doodle3D/Doodle3D-Slicer.git
synced 2024-08-23 13:50:43 +02:00
126 lines
2.6 KiB
JavaScript
Executable File
126 lines
2.6 KiB
JavaScript
Executable File
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 );
|
|
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 = 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( {
|
|
color: 0xeeeeee,
|
|
specular: 10.0,
|
|
map: skins[ i ],
|
|
skinning: true,
|
|
morphTargets: true,
|
|
wrapAround: true
|
|
} );
|
|
|
|
}
|
|
|
|
return materials;
|
|
}
|
|
|
|
this.checkLoadComplete = function () {
|
|
|
|
scope.loadCounter -= 1;
|
|
|
|
if ( scope.loadCounter === 0 ) {
|
|
|
|
scope.onLoadComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|