@xviewer.js/core 1.0.0-alpha.55 → 1.0.0-alpha.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -1106,10 +1106,14 @@ aLoader._texKeys = [
1106
1106
  ];
1107
1107
 
1108
1108
  class aEXRLoader extends aLoader {
1109
- load({ url, onLoad, onProgress, onError, texSettings }) {
1110
- const loader = new EXRLoader_js.EXRLoader(this.manager.loadingManager);
1111
- loader.setPath(this.manager.path);
1112
- loader.setResourcePath(this.manager.resourcePath);
1109
+ load({ url, path, resourcePath, manager, texSettings, onLoad, onProgress, onError }) {
1110
+ let loader = this._loader;
1111
+ if (loader === undefined) {
1112
+ loader = this._loader = new EXRLoader_js.EXRLoader();
1113
+ }
1114
+ loader.manager = manager;
1115
+ loader.setPath(path);
1116
+ loader.setResourcePath(resourcePath);
1113
1117
  loader.load(url, (tex)=>onLoad(Object.assign(tex, texSettings)), onProgress, onError);
1114
1118
  }
1115
1119
  constructor(...args){
@@ -1121,14 +1125,22 @@ class aEXRLoader extends aLoader {
1121
1125
  }
1122
1126
 
1123
1127
  class aFBXLoader extends aLoader {
1124
- load({ url, onLoad, onProgress, onError }) {
1128
+ load({ url, buffer, path, resourcePath, manager, onLoad, onProgress, onError }) {
1129
+ let loader = this._loader;
1130
+ if (loader === undefined) {
1131
+ loader = this._loader = new FBXLoader_js.FBXLoader();
1132
+ }
1133
+ loader.manager = manager;
1134
+ loader.setPath(path);
1135
+ loader.setResourcePath(resourcePath);
1125
1136
  const loadCallback = (node)=>{
1126
1137
  onLoad(aLoader._setUserData(node));
1127
1138
  };
1128
- const loader = new FBXLoader_js.FBXLoader(this.manager.loadingManager);
1129
- loader.setPath(this.manager.path);
1130
- loader.setResourcePath(this.manager.resourcePath);
1131
- loader.load(url, loadCallback, onProgress, onError);
1139
+ if (buffer) {
1140
+ loadCallback(loader.parse(buffer, path));
1141
+ } else {
1142
+ loader.load(url, loadCallback, onProgress, onError);
1143
+ }
1132
1144
  }
1133
1145
  constructor(...args){
1134
1146
  super(...args);
@@ -1139,20 +1151,32 @@ class aFBXLoader extends aLoader {
1139
1151
  }
1140
1152
 
1141
1153
  class aGLTFLoader extends aLoader {
1142
- load({ url, onLoad, onProgress, onError }) {
1154
+ load({ url, buffer, path, resourcePath, dracoPath, manager, onLoad, onProgress, onError }) {
1155
+ let dracoLoader = this._dracoLoader;
1156
+ if (dracoLoader === undefined) {
1157
+ dracoLoader = this._dracoLoader = new DRACOLoader_js.DRACOLoader();
1158
+ }
1159
+ dracoLoader.manager = manager;
1160
+ dracoLoader.setDecoderPath(dracoPath);
1161
+ let loader = this._loader;
1162
+ if (loader === undefined) {
1163
+ loader = this._loader = new GLTFLoader_js.GLTFLoader();
1164
+ loader.setDRACOLoader(dracoLoader);
1165
+ loader.setMeshoptDecoder(meshopt_decoder_module_js.MeshoptDecoder);
1166
+ }
1167
+ loader.manager = manager;
1168
+ loader.setPath(path);
1169
+ loader.setResourcePath(resourcePath);
1143
1170
  const loadCallback = (gltf)=>{
1144
1171
  const node = gltf.scene;
1145
- if (gltf.animations) node.animations = gltf.animations;
1172
+ node.animations.push(...gltf.animations);
1146
1173
  onLoad(aLoader._setUserData(node));
1147
1174
  };
1148
- let gltfLoader = new GLTFLoader_js.GLTFLoader(this.manager.loadingManager);
1149
- gltfLoader.setPath(this.manager.path);
1150
- gltfLoader.setResourcePath(this.manager.resourcePath);
1151
- let dracoLoader = new DRACOLoader_js.DRACOLoader(this.manager.loadingManager);
1152
- dracoLoader.setDecoderPath(this.manager.dracoPath);
1153
- gltfLoader.setDRACOLoader(dracoLoader);
1154
- gltfLoader.setMeshoptDecoder(meshopt_decoder_module_js.MeshoptDecoder);
1155
- gltfLoader.load(url, loadCallback, onProgress, onError);
1175
+ if (buffer) {
1176
+ loader.parse(buffer, resourcePath, loadCallback, onError);
1177
+ } else {
1178
+ loader.load(url, loadCallback, onProgress, onError);
1179
+ }
1156
1180
  }
1157
1181
  constructor(...args){
1158
1182
  super(...args);
@@ -1164,14 +1188,18 @@ class aGLTFLoader extends aLoader {
1164
1188
  }
1165
1189
 
1166
1190
  class aHDRLoader extends aLoader {
1167
- load({ url, onLoad, onProgress, onError, texSettings }) {
1168
- texSettings = Object.assign({
1191
+ load({ url, path, resourcePath, manager, texSettings, onLoad, onProgress, onError }) {
1192
+ let loader = this._loader;
1193
+ if (loader === undefined) {
1194
+ loader = this._loader = new RGBELoader_js.RGBELoader();
1195
+ }
1196
+ loader.manager = manager;
1197
+ loader.setPath(path);
1198
+ loader.setResourcePath(resourcePath);
1199
+ const settings = Object.assign({
1169
1200
  mapping: three.EquirectangularReflectionMapping
1170
1201
  }, texSettings);
1171
- const loader = new RGBELoader_js.RGBELoader(this.manager.loadingManager);
1172
- loader.setPath(this.manager.path);
1173
- loader.setResourcePath(this.manager.resourcePath);
1174
- loader.load(url, (tex)=>onLoad(Object.assign(tex, texSettings)), onProgress, onError);
1202
+ loader.load(url, (tex)=>onLoad(Object.assign(tex, settings)), onProgress, onError);
1175
1203
  }
1176
1204
  constructor(...args){
1177
1205
  super(...args);
@@ -1182,10 +1210,14 @@ class aHDRLoader extends aLoader {
1182
1210
  }
1183
1211
 
1184
1212
  class aJSONLoader extends aLoader {
1185
- load({ url, onLoad, onProgress, onError }) {
1186
- const loader = new three.FileLoader(this.manager.loadingManager);
1187
- loader.setPath(this.manager.path);
1188
- loader.setResourcePath(this.manager.resourcePath);
1213
+ load({ url, path, resourcePath, manager, onLoad, onProgress, onError }) {
1214
+ let loader = this._loader;
1215
+ if (loader === undefined) {
1216
+ loader = this._loader = new three.FileLoader();
1217
+ }
1218
+ loader.manager = manager;
1219
+ loader.setPath(path);
1220
+ loader.setResourcePath(resourcePath);
1189
1221
  loader.load(url, (file)=>onLoad(JSON.parse(file)), onProgress, onError);
1190
1222
  }
1191
1223
  constructor(...args){
@@ -1197,14 +1229,18 @@ class aJSONLoader extends aLoader {
1197
1229
  }
1198
1230
 
1199
1231
  class aTextureLoader extends aLoader {
1200
- load({ url, onLoad, onProgress, onError, texSettings }) {
1232
+ load({ url, path, resourcePath, manager, texSettings, onLoad, onProgress, onError }) {
1233
+ let loader = this._loader;
1234
+ if (loader === undefined) {
1235
+ loader = this._loader = new three.TextureLoader();
1236
+ }
1237
+ loader.manager = manager;
1238
+ loader.setPath(path);
1239
+ loader.setResourcePath(resourcePath);
1201
1240
  const loadCallback = (tex)=>{
1202
1241
  tex.colorSpace = three.SRGBColorSpace;
1203
1242
  onLoad(Object.assign(tex, texSettings));
1204
1243
  };
1205
- const loader = new three.TextureLoader(this.manager.loadingManager);
1206
- loader.setPath(this.manager.path);
1207
- loader.setResourcePath(this.manager.resourcePath);
1208
1244
  loader.load(url, loadCallback, onProgress, onError);
1209
1245
  }
1210
1246
  constructor(...args){
@@ -2866,13 +2902,13 @@ class FreelookVirtualCamera extends VirtualCamera {
2866
2902
  this._touchID = -1;
2867
2903
  this._preLoc0 = new three.Vector2();
2868
2904
  this._preLoc1 = new three.Vector2();
2869
- this._spherical = new three.Spherical(2, Math.PI / 2);
2905
+ this._spherical = new three.Spherical(4, Math.PI / 2);
2870
2906
  this._lookAt = new three.Vector3();
2871
2907
  this._tempSmoothing = 6;
2872
2908
  this._tempRotateSmoothing = 8;
2873
2909
  this._targetTheta = 0;
2874
2910
  this._targetPhi = 0;
2875
- this._targetSpringLength = 1;
2911
+ this._targetSpringLength = 4;
2876
2912
  this._targetFov = this.fov;
2877
2913
  this._targetLookAt = new three.Vector3();
2878
2914
  this.forbidX = false;
@@ -4243,7 +4279,7 @@ class ResourceManager {
4243
4279
  static extension(path) {
4244
4280
  let str = path.split(".");
4245
4281
  if (str.length > 1) {
4246
- return str.pop();
4282
+ return str.pop().toLowerCase();
4247
4283
  }
4248
4284
  return "";
4249
4285
  }
@@ -4255,15 +4291,6 @@ class ResourceManager {
4255
4291
  let str = path.split("/").pop();
4256
4292
  return ext ? str.replace("." + ext, "") : str;
4257
4293
  }
4258
- static _getTextureKey(url, settings) {
4259
- let keys = [
4260
- url
4261
- ];
4262
- for(let k in settings){
4263
- if (settings[k] !== undefined) keys.push(k + "=" + settings[k]);
4264
- }
4265
- return keys.join(",");
4266
- }
4267
4294
  static _splitTextureSettings(props) {
4268
4295
  let settings = {};
4269
4296
  for (let v of ResourceManager._texSettingKeys){
@@ -4278,55 +4305,43 @@ class ResourceManager {
4278
4305
  return settings;
4279
4306
  }
4280
4307
  destroy() {
4281
- this._caches.clear();
4282
4308
  this._loaders.clear();
4283
4309
  }
4310
+ getLoader(ext) {
4311
+ return this._loaders.get(ext);
4312
+ }
4284
4313
  addLoader(Loader) {
4285
4314
  let loader = new Loader(this);
4286
4315
  for (let ext of loader.extension){
4287
4316
  this._loaders.set(ext, loader);
4288
4317
  }
4289
4318
  }
4290
- loadAsset({ url, ext, onProgress, ...props }) {
4319
+ loadAsset({ url, buffer, ext, path, resourcePath, dracoPath, manager, onProgress, ...props }) {
4291
4320
  return new Promise((resolve, reject)=>{
4292
- const ext_ = ResourceManager.extension(url);
4321
+ const sel = ext || url && ResourceManager.extension(url) || "";
4293
4322
  const texSettings = ResourceManager._splitTextureSettings(props);
4294
- const key = ResourceManager._getTextureKey(url, texSettings);
4295
- let result = this._caches.get(key);
4296
- if (result) {
4297
- resolve(result);
4323
+ if (this._loaders.has(sel)) {
4324
+ this._loaders.get(sel).load({
4325
+ url,
4326
+ buffer,
4327
+ texSettings,
4328
+ path,
4329
+ resourcePath,
4330
+ dracoPath,
4331
+ manager,
4332
+ onProgress,
4333
+ onLoad: resolve,
4334
+ onError: (e)=>{
4335
+ console.error(`${url} not exist`, e);
4336
+ }
4337
+ });
4298
4338
  } else {
4299
- const onLoad = (file)=>{
4300
- this._caches.set(key, file);
4301
- resolve(file);
4302
- };
4303
- let sel = ext || ext_;
4304
- if (this._loaders.has(sel)) {
4305
- this._loaders.get(sel).load({
4306
- url,
4307
- texSettings,
4308
- onProgress,
4309
- onLoad,
4310
- onError: (e)=>{
4311
- console.error(`${url} not exist`, e);
4312
- }
4313
- });
4314
- } else {
4315
- reject("ResourceManager.loadAsset: missing loader for " + ext);
4316
- }
4339
+ reject("ResourceManager.loadAsset: missing loader for " + url);
4317
4340
  }
4318
4341
  });
4319
4342
  }
4320
- constructor(props){
4321
- this.path = "";
4322
- this.resourcePath = "";
4323
- this.dracoPath = "";
4324
- this._caches = new Map();
4343
+ constructor(){
4325
4344
  this._loaders = new Map();
4326
- this.path = props.path;
4327
- this.resourcePath = props.resourcePath;
4328
- this.dracoPath = props.dracoPath;
4329
- this.loadingManager = props.loadingManager;
4330
4345
  }
4331
4346
  }
4332
4347
  ResourceManager._texSettingKeys = [
@@ -4535,9 +4550,6 @@ class Viewer extends EventEmitter {
4535
4550
  static getMesh(node, name, group = false) {
4536
4551
  return Viewer._getObjectValue(node.userData.meshes, name, group);
4537
4552
  }
4538
- get instanceId() {
4539
- return this._instanceId;
4540
- }
4541
4553
  get root() {
4542
4554
  return this._root;
4543
4555
  }
@@ -4589,6 +4601,18 @@ class Viewer extends EventEmitter {
4589
4601
  set targetFrameRate(v) {
4590
4602
  this._targetFrameRate = Math.max(0.001, v);
4591
4603
  }
4604
+ get instanceId() {
4605
+ return this._instanceId;
4606
+ }
4607
+ get loadingManager() {
4608
+ return this._loadingManager;
4609
+ }
4610
+ get resourceManager() {
4611
+ return this._resourceManager;
4612
+ }
4613
+ get taskManager() {
4614
+ return this._taskManager;
4615
+ }
4592
4616
  destroy() {
4593
4617
  this.stop();
4594
4618
  this._renderer.dispose();
@@ -4713,7 +4737,10 @@ class Viewer extends EventEmitter {
4713
4737
  }
4714
4738
  }
4715
4739
  loadAsset(props) {
4716
- return this._resourceManager.loadAsset(props);
4740
+ return this._resourceManager.loadAsset(Object.assign(Object.assign({}, this._defaultProps), props));
4741
+ }
4742
+ getLoader(ext) {
4743
+ return this._resourceManager.getLoader(ext);
4717
4744
  }
4718
4745
  addLoader(Loader) {
4719
4746
  this._resourceManager.addLoader(Loader);
@@ -4758,6 +4785,9 @@ class Viewer extends EventEmitter {
4758
4785
  removeComponent(node, component) {
4759
4786
  return this._componentManager.removeComponent(node, component);
4760
4787
  }
4788
+ addTask(task) {
4789
+ this._taskManager.add(task);
4790
+ }
4761
4791
  addNode(object, { args, debug, scale, position, rotation, layer, shadowArgs, makeDefault, component, parent = this._scene, ...props } = {}) {
4762
4792
  let node = null;
4763
4793
  let ins = getClassInstance(object, args);
@@ -4903,6 +4933,7 @@ class Viewer extends EventEmitter {
4903
4933
  factor: 1
4904
4934
  };
4905
4935
  this._orientation = exports.Orientation.AUTO;
4936
+ this._defaultProps = {};
4906
4937
  this._running = false;
4907
4938
  this._rootRotated = false;
4908
4939
  this._time = 0;
@@ -4936,17 +4967,18 @@ class Viewer extends EventEmitter {
4936
4967
  this._renderer.shadowMap.enabled = !!shadows;
4937
4968
  this._renderer.shadowMap.type = typeof shadows === "boolean" ? three.PCFSoftShadowMap : shadows;
4938
4969
  this._renderer.info.autoReset = false;
4939
- const loadingManager = new three.LoadingManager(loader.onLoad, loader.onProgress, loader.onError);
4940
- this._resourceManager = new ResourceManager({
4941
- path,
4942
- resourcePath,
4943
- dracoPath,
4944
- loadingManager
4945
- });
4970
+ this._resourceManager = new ResourceManager();
4971
+ this._loadingManager = new three.LoadingManager(loader.onLoad, loader.onProgress, loader.onError);
4946
4972
  this._taskManager = new TaskManager(tasker.onComplete, tasker.onProgress, tasker.onError);
4947
4973
  this._componentManager = new ComponentManager(this);
4948
4974
  this._pluginManager = new PluginManager(this);
4949
4975
  this._tweenManager = new TweenManager();
4976
+ this._defaultProps = {
4977
+ path,
4978
+ resourcePath,
4979
+ dracoPath,
4980
+ manager: this._loadingManager
4981
+ };
4950
4982
  this._autoResize = autoResize;
4951
4983
  this._targetFrameRate = targetFrameRate;
4952
4984
  this._input = new DeviceInput(this);
@@ -5540,6 +5572,149 @@ class PerformanceMonitorPlugin extends Plugin {
5540
5572
  }
5541
5573
  }
5542
5574
 
5575
+ class DropFilePlugin extends Plugin {
5576
+ install() {
5577
+ document.addEventListener("dragover", this._onDrogOver);
5578
+ document.addEventListener("drop", this._onDrop);
5579
+ }
5580
+ uninstall() {
5581
+ document.removeEventListener("dragover", this._onDrogOver);
5582
+ document.removeEventListener("drop", this._onDrop);
5583
+ }
5584
+ _loadItemList(items) {
5585
+ getFilesFromItemList(items, (files, filesMap, dirs)=>{
5586
+ this._loadFiles(files, filesMap, dirs);
5587
+ });
5588
+ }
5589
+ _loadFiles(files, filesMap, dirs) {
5590
+ if (files.length > 0) {
5591
+ filesMap = filesMap || createFilesMap(files);
5592
+ dirs = dirs || [];
5593
+ this.viewer.loadingManager.setURLModifier((url)=>{
5594
+ url = url.replace(/^(\.?\/)/, ''); // remove './'
5595
+ const file = filesMap[url];
5596
+ if (file) {
5597
+ console.log('Loading', url);
5598
+ return URL.createObjectURL(file);
5599
+ }
5600
+ return url;
5601
+ });
5602
+ for(let i = 0; i < files.length; i++){
5603
+ this._loadFile(files[i], dirs[i]);
5604
+ }
5605
+ }
5606
+ }
5607
+ _loadFile(file, dir = "") {
5608
+ const filename = file.name;
5609
+ const ext = ResourceManager.extension(filename);
5610
+ if (this._extensions.some((v)=>v === ext)) {
5611
+ const reader = new FileReader();
5612
+ reader.addEventListener("progress", (event)=>{
5613
+ const size = '(' + Math.floor(event.total / 1000) + ' KB)';
5614
+ const progress = Math.floor(event.loaded / event.total * 100) + '%';
5615
+ console.log('Loading', filename, size, progress);
5616
+ });
5617
+ const loadCallback = (asset)=>{
5618
+ asset.userData.ext = ext;
5619
+ this._onLoad && this._onLoad(asset);
5620
+ };
5621
+ if ([
5622
+ "fbx",
5623
+ "gltf",
5624
+ "glb"
5625
+ ].some((v)=>v === ext)) {
5626
+ reader.addEventListener("load", (event)=>{
5627
+ this.viewer.loadAsset({
5628
+ ext,
5629
+ buffer: event.target.result,
5630
+ resourcePath: dir
5631
+ }).then(loadCallback);
5632
+ }, false);
5633
+ reader.readAsArrayBuffer(file);
5634
+ } else {
5635
+ reader.addEventListener("load", (event)=>{
5636
+ this.viewer.loadAsset({
5637
+ ext,
5638
+ url: event.target.result
5639
+ }).then(loadCallback);
5640
+ }, false);
5641
+ reader.readAsDataURL(file);
5642
+ }
5643
+ }
5644
+ }
5645
+ constructor({ onLoad, extension = [
5646
+ "glb",
5647
+ "gltf",
5648
+ "fbx",
5649
+ "hdr"
5650
+ ] } = {}){
5651
+ super();
5652
+ this._onDrogOver = (e)=>{
5653
+ e.preventDefault();
5654
+ e.dataTransfer.dropEffect = "copy";
5655
+ };
5656
+ this._onDrop = (e)=>{
5657
+ e.preventDefault();
5658
+ if (e.dataTransfer.types[0] === "text/plain") return; // Outliner drop
5659
+ if (e.dataTransfer.items) {
5660
+ this._loadItemList(e.dataTransfer.items);
5661
+ } else {
5662
+ this._loadFiles(e.dataTransfer.files);
5663
+ }
5664
+ };
5665
+ this._onLoad = onLoad;
5666
+ this._extensions = Array.isArray(extension) ? extension : [
5667
+ extension
5668
+ ];
5669
+ }
5670
+ }
5671
+ function createFilesMap(files) {
5672
+ const map = {};
5673
+ for(let i = 0; i < files.length; i++){
5674
+ const file = files[i];
5675
+ map[file.name] = file;
5676
+ }
5677
+ return map;
5678
+ }
5679
+ function getFilesFromItemList(items, onDone) {
5680
+ let itemsCount = 0;
5681
+ let itemsTotal = 0;
5682
+ const dirs = [];
5683
+ const files = [];
5684
+ const filesMap = {};
5685
+ function onEntryHandled() {
5686
+ itemsCount++;
5687
+ if (itemsCount === itemsTotal) {
5688
+ onDone(files, filesMap, dirs);
5689
+ }
5690
+ }
5691
+ function handleEntry(entry, dir = "") {
5692
+ if (entry.isDirectory) {
5693
+ const reader = entry.createReader();
5694
+ reader.readEntries((entries)=>{
5695
+ for(let i = 0; i < entries.length; i++){
5696
+ handleEntry(entries[i], dir + "/" + entry.name + "/");
5697
+ }
5698
+ onEntryHandled();
5699
+ });
5700
+ } else if (entry.isFile) {
5701
+ entry.file((file)=>{
5702
+ files.push(file);
5703
+ filesMap[entry.fullPath.slice(1)] = file;
5704
+ dirs.push(dir);
5705
+ onEntryHandled();
5706
+ });
5707
+ }
5708
+ itemsTotal++;
5709
+ }
5710
+ for(let i = 0; i < items.length; i++){
5711
+ const item = items[i];
5712
+ if (item.kind === 'file') {
5713
+ handleEntry(item.webkitGetAsEntry());
5714
+ }
5715
+ }
5716
+ }
5717
+
5543
5718
  exports.AnimationCurve = AnimationCurve;
5544
5719
  exports.Box = Box;
5545
5720
  exports.BoxProjectionPlugin = BoxProjectionPlugin;
@@ -5548,6 +5723,7 @@ exports.CinestationBrain = CinestationBrain;
5548
5723
  exports.Component = Component;
5549
5724
  exports.DebugPlugin = DebugPlugin;
5550
5725
  exports.DeviceInput = DeviceInput;
5726
+ exports.DropFilePlugin = DropFilePlugin;
5551
5727
  exports.Easing = Easing;
5552
5728
  exports.EnvironmentPlugin = EnvironmentPlugin;
5553
5729
  exports.EventEmitter = EventEmitter;
@@ -5570,6 +5746,7 @@ exports.Quat_quarticDamp = Quat_quarticDamp;
5570
5746
  exports.Quat_smoothDamp = Quat_smoothDamp;
5571
5747
  exports.Reflector = Reflector;
5572
5748
  exports.ReflectorMaterial = ReflectorMaterial;
5749
+ exports.ResourceManager = ResourceManager;
5573
5750
  exports.Sphere = Sphere;
5574
5751
  exports.SystemInfo = SystemInfo;
5575
5752
  exports.Tween = Tween;