mirror of
https://github.com/tengge1/ShadowEditor.git
synced 2026-01-25 15:08:11 +00:00
108 lines
3.3 KiB
JavaScript
108 lines
3.3 KiB
JavaScript
import BaseLoader from './BaseLoader';
|
|
|
|
/**
|
|
* MMDLoader
|
|
* @author tengge / https://github.com/tengge1
|
|
*/
|
|
function MMDLoader() {
|
|
BaseLoader.call(this);
|
|
}
|
|
|
|
MMDLoader.prototype = Object.create(BaseLoader.prototype);
|
|
MMDLoader.prototype.constructor = MMDLoader;
|
|
|
|
MMDLoader.prototype.load = function (url, options, environment) {
|
|
return new Promise(resolve => {
|
|
this.require('MMD').then(() => {
|
|
var loader = new THREE.MMDLoader();
|
|
|
|
var promise1 = options.Animation && options.Animation.Url ?
|
|
this.loadWithAnimation(url, options, environment, loader) :
|
|
this.loadModel(url, options, environment, loader);
|
|
var promise2 = this.loadCameraAnimation(url, options, environment, loader);
|
|
var promise3 = this.loadAudio(url, options, environment, loader);
|
|
|
|
Promise.all([promise1, promise2, promise3]).then(obj => {
|
|
var mesh = obj[0].mesh;
|
|
var animation = obj[0].animation;
|
|
var cameraAnimation = obj[1];
|
|
var audio = obj[2];
|
|
|
|
Object.assign(mesh.userData, {
|
|
obj: {
|
|
animation: animation,
|
|
cameraAnimation: cameraAnimation,
|
|
audio: audio
|
|
}
|
|
});
|
|
|
|
resolve(mesh);
|
|
});
|
|
});
|
|
});
|
|
};
|
|
|
|
MMDLoader.prototype.loadModel = function (url, options, environment, loader) {
|
|
return new Promise(resolve => {
|
|
loader.load(url, mesh => {
|
|
resolve({
|
|
mesh: mesh,
|
|
animation: null
|
|
});
|
|
}, undefined, () => {
|
|
// 某个图片下载失败会导致返回null
|
|
// resolve(null);
|
|
});
|
|
});
|
|
};
|
|
|
|
MMDLoader.prototype.loadWithAnimation = function (url, options, environment, loader) {
|
|
if (!options.Animation || !options.Animation.Url) {
|
|
return new Promise(resolve => {
|
|
resolve(null);
|
|
});
|
|
}
|
|
|
|
return new Promise(resolve => {
|
|
loader.loadWithAnimation(url, [environment.server + options.Animation.Url], mmd => {
|
|
resolve(mmd);
|
|
}, undefined, () => {
|
|
resolve(null);
|
|
});
|
|
});
|
|
};
|
|
|
|
MMDLoader.prototype.loadCameraAnimation = function (url, options, environment, loader) {
|
|
if (!options.CameraAnimation || !options.CameraAnimation.Url) {
|
|
return new Promise(resolve => {
|
|
resolve(null);
|
|
});
|
|
}
|
|
|
|
return new Promise(resolve => {
|
|
loader.loadAnimation([environment.server + options.CameraAnimation.Url], environment.camera, vmd => {
|
|
resolve(vmd);
|
|
}, undefined, () => {
|
|
resolve(null);
|
|
});
|
|
});
|
|
};
|
|
|
|
MMDLoader.prototype.loadAudio = function (url, options, environment, loader) {
|
|
if (!options.Audio || !options.Audio.Url) {
|
|
return new Promise(resolve => {
|
|
resolve(null);
|
|
});
|
|
}
|
|
|
|
return new Promise(resolve => {
|
|
var loader = new THREE.AudioLoader();
|
|
loader.load(environment.server + options.Audio.Url, buffer => {
|
|
var audio = new THREE.Audio(environment.audioListener).setBuffer(buffer);
|
|
Object.assign(audio.userData, options.Audio);
|
|
resolve(audio);
|
|
});
|
|
});
|
|
};
|
|
|
|
export default MMDLoader; |