-
Notifications
You must be signed in to change notification settings - Fork 57
/
Copy pathGLTFLoader.js
83 lines (79 loc) · 3.26 KB
/
GLTFLoader.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import Class from '../core/Class';
import BasicLoader from './BasicLoader';
import GLTFParser from './GLTFParser';
import Loader from './Loader';
import log from '../utils/log';
/**
* glTF模型加载类
* @class
* @extends {BasicLoader}
* @example
* var loader = new Hilo3d.GLTFLoader();
* loader.load({
* src: '//ossgw.alicdn.com/tmall-c3/tmx/a9bedc04da498b95c57057d6a5d29fe7.gltf'
* }).then(function (model) {
* stage.addChild(model.node);
* });
*/
const GLTFLoader = Class.create(/** @lends GLTFLoader.prototype */{
Extends: BasicLoader,
/**
* @default true
* @type {boolean}
*/
isGLTFLoader: true,
/**
* @default GLTFLoader
* @type {string}
*/
className: 'GLTFLoader',
/**
* @constructs
*/
constructor() {
GLTFLoader.superclass.constructor.call(this);
},
/**
* 加载glTF模型
* @param {object} params 加载参数
* @param {string} params.src glTF模型地址
* @param {number|string} [params.defaultScene] 加载后要展示的场景,默认读模型里的
* @param {boolean} [params.isMultiAnim=false] 模型是否多动画,如果是的话会返回 anims 对象保存多个动画对象
* @param {boolean} [params.isProgressive=false] 是否渐进式加载,图片加载完前使用占位图片
* @param {boolean} [params.isUnQuantizeInShader=true] 是否在shader中进行量化解压数据
* @param {boolean} [params.ignoreTextureError=false] 是否忽略图片加载错误
* @param {boolean} [params.forceCreateNewBuffer=false] 解析模型数据的时候是否强制创建新buffer,以防内存被引用导致无法释放
* @param {function} [params.preHandlerImageURI=null] 图片URL预处理函数
* @param {function} [params.preHandlerBufferURI=null] Buffer URL预处理函数
* @param {function} [params.customMaterialCreator=null] 是否使用自定义的Material创建器
* @param {function} [params.isLoadAllTextures=false] 是否加载所有的贴图,默认只加载用到的贴图
* @async
* @return {Promise<GLTFModel, Error>} 返回加载完的模型对象
*/
load(params) {
return this.loadRes(params.src, 'buffer')
.then((buffer) => {
let parser = new GLTFParser(buffer, params);
return parser.parse(this);
}).catch((err) => {
log.error('load gltf failed', err.message, err.stack);
throw err;
});
}
});
Loader.addLoader('gltf', GLTFLoader);
Loader.addLoader('glb', GLTFLoader);
export default GLTFLoader;
/**
* GLTFLoader 模型加载完返回的对象格式
* @typedef {object} GLTFModel
* @property {Object} json 原始数据
* @property {Node} [node] 模型的根节点
* @property {Mesh[]} [meshes] 模型的所有Mesh对象数组
* @property {Animation} [anim] 模型的动画对象数组,没有动画的话为null
* @property {Camera[]} [cameras] 模型中的所有Camera对象数组
* @property {Light[]} [lights] 模型中的所有Light对象数组
* @property {Texture[]} [textures] 模型中的所有Texture对象数组
* @property {BasicMaterial[]} [materials] 模型中的所有Material对象数组
* @property {Skeleton[]} [skins] 模型中的所有Skeleton对象数组
*/