@galacean/engine-loader 1.1.0-beta.1 → 1.1.0-beta.10

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
@@ -527,12 +527,12 @@ function _construct(Parent, args, Class) {
527
527
  }
528
528
 
529
529
  var ReflectionParser = /*#__PURE__*/ function() {
530
- function ReflectionParser() {}
531
- ReflectionParser.registerCustomParseComponent = function registerCustomParseComponent(componentType, handle) {
532
- this.customParseComponentHandles[componentType] = handle;
533
- };
534
- ReflectionParser.parseEntity = function parseEntity(entityConfig, engine) {
535
- return ReflectionParser.getEntityByConfig(entityConfig, engine).then(function(entity) {
530
+ function ReflectionParser(_context) {
531
+ this._context = _context;
532
+ }
533
+ var _proto = ReflectionParser.prototype;
534
+ _proto.parseEntity = function parseEntity(entityConfig) {
535
+ return this._getEntityByConfig(entityConfig).then(function(entity) {
536
536
  var _entityConfig_isActive;
537
537
  entity.isActive = (_entityConfig_isActive = entityConfig.isActive) != null ? _entityConfig_isActive : true;
538
538
  var position = entityConfig.position, rotation = entityConfig.rotation, scale = entityConfig.scale;
@@ -542,72 +542,29 @@ var ReflectionParser = /*#__PURE__*/ function() {
542
542
  return entity;
543
543
  });
544
544
  };
545
- ReflectionParser.getEntityByConfig = function getEntityByConfig(entityConfig, engine) {
546
- // @ts-ignore
547
- var assetRefId = entityConfig.assetRefId;
548
- if (assetRefId) {
549
- return engine.resourceManager// @ts-ignore
550
- .getResourceByRef({
551
- refId: assetRefId,
552
- key: entityConfig.key,
553
- isClone: entityConfig.isClone
554
- }).then(function(entity) {
555
- entity.name = entityConfig.name;
556
- return entity;
557
- });
558
- } else {
559
- var entity = new engineCore.Entity(engine, entityConfig.name);
560
- return Promise.resolve(entity);
561
- }
562
- };
563
- ReflectionParser.parseClassObject = function parseClassObject(item, engine, resourceManager) {
564
- if (resourceManager === void 0) resourceManager = engine.resourceManager;
545
+ _proto.parseClassObject = function parseClassObject(item) {
565
546
  var Class = engineCore.Loader.getClass(item.class);
566
547
  var _item_constructParams;
567
548
  var params = (_item_constructParams = item.constructParams) != null ? _item_constructParams : [];
568
549
  var instance = _construct(Class, [].concat(params));
569
- return this.parsePropsAndMethods(instance, item, engine, resourceManager);
570
- };
571
- ReflectionParser.parseBasicType = function parseBasicType(value, engine, resourceManager) {
572
- if (resourceManager === void 0) resourceManager = engine.resourceManager;
573
- var _this = this;
574
- if (Array.isArray(value)) {
575
- return Promise.all(value.map(function(item) {
576
- return _this.parseBasicType(item, engine, resourceManager);
577
- }));
578
- } else if (typeof value === "object" && value != null) {
579
- if (this._isClass(value)) {
580
- // class object
581
- return this.parseClassObject(value, engine, resourceManager);
582
- } else if (this._isRef(value)) {
583
- // reference object
584
- return resourceManager.getResourceByRef(value);
585
- } else {
586
- // basic type
587
- return Promise.resolve(value);
588
- }
589
- } else {
590
- return Promise.resolve(value);
591
- }
550
+ return this.parsePropsAndMethods(instance, item);
592
551
  };
593
- ReflectionParser.parsePropsAndMethods = function parsePropsAndMethods(instance, item, engine, resourceManager) {
594
- if (resourceManager === void 0) resourceManager = engine.resourceManager;
595
- var _this = this;
552
+ _proto.parsePropsAndMethods = function parsePropsAndMethods(instance, item) {
596
553
  var promises = [];
597
554
  if (item.methods) {
598
555
  for(var methodName in item.methods){
599
556
  var methodParams = item.methods[methodName];
600
557
  for(var i = 0, count = methodParams.length; i < count; i++){
601
558
  var params = methodParams[i];
602
- var promise = this.parseMethod(instance, methodName, params, engine, resourceManager);
559
+ var promise = this.parseMethod(instance, methodName, params);
603
560
  promises.push(promise);
604
561
  }
605
562
  }
606
563
  }
607
564
  if (item.props) {
608
- var _this1 = this, _loop = function(key) {
565
+ var _this = this, _loop = function(key) {
609
566
  var value = item.props[key];
610
- var promise = _this1.parseBasicType(value, engine).then(function(v) {
567
+ var promise = _this.parseBasicType(value).then(function(v) {
611
568
  return instance[key] = v;
612
569
  });
613
570
  promises.push(promise);
@@ -615,27 +572,76 @@ var ReflectionParser = /*#__PURE__*/ function() {
615
572
  for(var key in item.props)_loop(key);
616
573
  }
617
574
  return Promise.all(promises).then(function() {
618
- var handle = _this.customParseComponentHandles[instance.constructor.name];
619
- if (handle) return handle(instance, item, engine);
575
+ var handle = ReflectionParser.customParseComponentHandles[instance.constructor.name];
576
+ if (handle) return handle(instance, item);
620
577
  else return instance;
621
578
  });
622
579
  };
623
- ReflectionParser.parseMethod = function parseMethod(instance, methodName, methodParams, engine, resourceManager) {
624
- if (resourceManager === void 0) resourceManager = engine.resourceManager;
580
+ _proto.parseMethod = function parseMethod(instance, methodName, methodParams) {
625
581
  var _this = this;
626
582
  return Promise.all(methodParams.map(function(param) {
627
- return _this.parseBasicType(param, engine, resourceManager);
583
+ return _this.parseBasicType(param);
628
584
  })).then(function(result) {
629
585
  var _instance;
630
586
  return (_instance = instance)[methodName].apply(_instance, [].concat(result));
631
587
  });
632
588
  };
589
+ _proto.parseBasicType = function parseBasicType(value) {
590
+ var _this = this;
591
+ if (Array.isArray(value)) {
592
+ return Promise.all(value.map(function(item) {
593
+ return _this.parseBasicType(item);
594
+ }));
595
+ } else if (typeof value === "object" && value != null) {
596
+ if (ReflectionParser._isClass(value)) {
597
+ // class object
598
+ return this.parseClassObject(value);
599
+ } else if (ReflectionParser._isAssetRef(value)) {
600
+ // reference object
601
+ // @ts-ignore
602
+ return this._context.resourceManager.getResourceByRef(value);
603
+ } else if (ReflectionParser._isEntityRef(value)) {
604
+ // entity reference
605
+ return Promise.resolve(this._context.entityMap.get(value.entityId));
606
+ } else {
607
+ // basic type
608
+ return Promise.resolve(value);
609
+ }
610
+ } else {
611
+ return Promise.resolve(value);
612
+ }
613
+ };
614
+ _proto._getEntityByConfig = function _getEntityByConfig(entityConfig) {
615
+ // @ts-ignore
616
+ var assetRefId = entityConfig.assetRefId;
617
+ var engine = this._context.engine;
618
+ if (assetRefId) {
619
+ return engine.resourceManager// @ts-ignore
620
+ .getResourceByRef({
621
+ refId: assetRefId,
622
+ key: entityConfig.key,
623
+ isClone: entityConfig.isClone
624
+ }).then(function(entity) {
625
+ entity.name = entityConfig.name;
626
+ return entity;
627
+ });
628
+ } else {
629
+ var entity = new engineCore.Entity(engine, entityConfig.name);
630
+ return Promise.resolve(entity);
631
+ }
632
+ };
633
+ ReflectionParser.registerCustomParseComponent = function registerCustomParseComponent(componentType, handle) {
634
+ this.customParseComponentHandles[componentType] = handle;
635
+ };
633
636
  ReflectionParser._isClass = function _isClass(value) {
634
637
  return value["class"] != undefined;
635
638
  };
636
- ReflectionParser._isRef = function _isRef(value) {
639
+ ReflectionParser._isAssetRef = function _isAssetRef(value) {
637
640
  return value["refId"] != undefined;
638
641
  };
642
+ ReflectionParser._isEntityRef = function _isEntityRef(value) {
643
+ return value["entityId"] != undefined;
644
+ };
639
645
  return ReflectionParser;
640
646
  }();
641
647
  (function() {
@@ -903,6 +909,8 @@ var SceneParserContext = /*#__PURE__*/ function() {
903
909
  this.assets = new Map();
904
910
  this.entityConfigMap = new Map();
905
911
  this.rootIds = [];
912
+ this.engine = scene.engine;
913
+ this.resourceManager = scene.engine.resourceManager;
906
914
  }
907
915
  var _proto = SceneParserContext.prototype;
908
916
  _proto.destroy = function destroy() {
@@ -919,7 +927,7 @@ var SceneParserContext = /*#__PURE__*/ function() {
919
927
  function SceneParser(context) {
920
928
  var _this = this;
921
929
  this.context = context;
922
- this._engine = this.context.scene.engine;
930
+ this._engine = context.scene.engine;
923
931
  this._organizeEntities = this._organizeEntities.bind(this);
924
932
  this._parseComponents = this._parseComponents.bind(this);
925
933
  this._clearAndResolveScene = this._clearAndResolveScene.bind(this);
@@ -927,22 +935,24 @@ var SceneParserContext = /*#__PURE__*/ function() {
927
935
  _this._reject = reject;
928
936
  _this._resolve = resolve;
929
937
  });
938
+ this._reflectionParser = new ReflectionParser(context);
930
939
  }
931
940
  var _proto = SceneParser.prototype;
932
941
  /** start parse the scene */ _proto.start = function start() {
933
942
  this._parseEntities().then(this._organizeEntities).then(this._parseComponents).then(this._clearAndResolveScene).then(this._resolve).catch(this._reject);
934
943
  };
935
944
  _proto._parseEntities = function _parseEntities() {
945
+ var _this = this;
936
946
  var entitiesConfig = this.context.originalData.entities;
937
947
  var entityConfigMap = this.context.entityConfigMap;
938
948
  var entitiesMap = this.context.entityMap;
939
949
  var rootIds = this.context.rootIds;
940
- var engine = this._engine;
950
+ this._engine;
941
951
  var promises = entitiesConfig.map(function(entityConfig) {
942
952
  entityConfigMap.set(entityConfig.id, entityConfig);
943
953
  // record root entities
944
954
  if (!entityConfig.parent) rootIds.push(entityConfig.id);
945
- return ReflectionParser.parseEntity(entityConfig, engine);
955
+ return _this._reflectionParser.parseEntity(entityConfig);
946
956
  });
947
957
  return Promise.all(promises).then(function(entities) {
948
958
  for(var i = 0, l = entities.length; i < l; i++){
@@ -980,7 +990,7 @@ var SceneParserContext = /*#__PURE__*/ function() {
980
990
  component = entity.getComponent(engineCore.Loader.getClass(key));
981
991
  }
982
992
  component = component || entity.addComponent(engineCore.Loader.getClass(key));
983
- var promise = ReflectionParser.parsePropsAndMethods(component, componentConfig, entity.engine);
993
+ var promise = this._reflectionParser.parsePropsAndMethods(component, componentConfig);
984
994
  promises.push(promise);
985
995
  }
986
996
  }
@@ -2429,20 +2439,56 @@ var AbstractTranscoder = /*#__PURE__*/ function() {
2429
2439
  }();
2430
2440
 
2431
2441
  /** @internal */ function TranscodeWorkerCode$1() {
2432
- var concat = function concat(arrays) {
2433
- if (arrays.length === 1) return arrays[0];
2434
- var totalByteLength = 0;
2435
- for(var i = 0; i < arrays.length; i++){
2436
- totalByteLength += arrays[i].byteLength;
2442
+ self.onmessage = function onmessage(event) {
2443
+ var message = event.data;
2444
+ switch(message.type){
2445
+ case "init":
2446
+ init(message.transcoderWasm).then(function() {
2447
+ self.postMessage("init-completed");
2448
+ }).catch(function(e) {
2449
+ return self.postMessage({
2450
+ error: e
2451
+ });
2452
+ });
2453
+ break;
2454
+ case "transcode":
2455
+ init().then(function(KTX2File) {
2456
+ var result = transcode(message.buffer, message.format, KTX2File);
2457
+ // @ts-ignore
2458
+ result.type = "transcoded";
2459
+ self.postMessage(result);
2460
+ }).catch(function(e) {
2461
+ return self.postMessage({
2462
+ error: e
2463
+ });
2464
+ });
2465
+ break;
2437
2466
  }
2438
- var result = new Uint8Array(totalByteLength);
2439
- var byteOffset = 0;
2440
- for(var i1 = 0; i1 < arrays.length; i1++){
2441
- result.set(arrays[i1], byteOffset);
2442
- byteOffset += arrays[i1].byteLength;
2467
+ };
2468
+ }
2469
+ var _init = function init() {
2470
+ var initPromise;
2471
+ return function init(wasmBinary) {
2472
+ if (!initPromise) {
2473
+ initPromise = new Promise(function(resolve, reject) {
2474
+ var BasisModule = {
2475
+ wasmBinary: wasmBinary,
2476
+ onRuntimeInitialized: function() {
2477
+ return resolve(BasisModule);
2478
+ },
2479
+ onAbort: reject
2480
+ };
2481
+ self["BASIS"](BasisModule);
2482
+ }).then(function(BasisModule) {
2483
+ BasisModule.initializeBasis();
2484
+ return BasisModule.KTX2File;
2485
+ });
2443
2486
  }
2444
- return result;
2487
+ return initPromise;
2445
2488
  };
2489
+ };
2490
+ var init = _init();
2491
+ function transcode(buffer, targetFormat, KTX2File) {
2446
2492
  var getTranscodeFormatFromTarget = function getTranscodeFormatFromTarget(target, hasAlpha) {
2447
2493
  switch(target){
2448
2494
  case 2:
@@ -2459,76 +2505,24 @@ var AbstractTranscoder = /*#__PURE__*/ function() {
2459
2505
  return 7;
2460
2506
  }
2461
2507
  };
2462
- var init = function init(wasmBinary) {
2463
- transcodePromise = new Promise(function(resolve, reject) {
2464
- var BasisModule = {
2465
- wasmBinary: wasmBinary,
2466
- onRuntimeInitialized: function() {
2467
- return resolve(BasisModule);
2468
- },
2469
- onAbort: reject
2470
- };
2471
- self["BASIS"](BasisModule);
2472
- }).then(function(BasisModule) {
2473
- BasisModule.initializeBasis();
2474
- return BasisModule.KTX2File;
2475
- });
2476
- return transcodePromise;
2477
- };
2478
- var transcode = function transcode(buffer, targetFormat, KTX2File) {
2479
- var ktx2File = new KTX2File(new Uint8Array(buffer));
2480
- function cleanup() {
2481
- ktx2File.close();
2482
- ktx2File.delete();
2483
- }
2484
- if (!ktx2File.isValid()) {
2485
- cleanup();
2486
- throw new Error("Invalid or unsupported .ktx2 file");
2487
- }
2488
- var width = ktx2File.getWidth();
2489
- var height = ktx2File.getHeight();
2490
- var layerCount = ktx2File.getLayers() || 1;
2491
- var levelCount = ktx2File.getLevels();
2492
- var hasAlpha = ktx2File.getHasAlpha();
2493
- var faceCount = ktx2File.getFaces();
2494
- var format = getTranscodeFormatFromTarget(targetFormat, hasAlpha);
2495
- var faces = new Array(faceCount);
2496
- for(var face = 0; face < faceCount; face++){
2497
- var mipmaps = new Array(levelCount);
2498
- for(var mip = 0; mip < levelCount; mip++){
2499
- var layerMips = new Array(layerCount);
2500
- var mipWidth = void 0, mipHeight = void 0;
2501
- for(var layer = 0; layer < layerCount; layer++){
2502
- var levelInfo = ktx2File.getImageLevelInfo(mip, layer, face);
2503
- mipWidth = levelInfo.origWidth;
2504
- mipHeight = levelInfo.origHeight;
2505
- var dst = new Uint8Array(ktx2File.getImageTranscodedSizeInBytes(mip, layer, 0, format));
2506
- var status = ktx2File.transcodeImage(dst, mip, layer, face, format, 0, -1, -1);
2507
- if (!status) {
2508
- cleanup();
2509
- throw new Error("transcodeImage failed.");
2510
- }
2511
- layerMips[layer] = dst;
2512
- }
2513
- mipmaps[mip] = {
2514
- data: concat(layerMips),
2515
- width: mipWidth,
2516
- height: mipHeight
2517
- };
2518
- }
2519
- faces[face] = mipmaps;
2508
+ var concat = function concat(arrays) {
2509
+ if (arrays.length === 1) return arrays[0];
2510
+ var totalByteLength = 0;
2511
+ for(var i = 0; i < arrays.length; i++){
2512
+ totalByteLength += arrays[i].byteLength;
2520
2513
  }
2521
- cleanup();
2522
- return {
2523
- faces: faces,
2524
- width: width,
2525
- height: height,
2526
- hasAlpha: hasAlpha,
2527
- faceCount: faceCount,
2528
- format: format
2529
- };
2514
+ var result = new Uint8Array(totalByteLength);
2515
+ var byteOffset = 0;
2516
+ for(var i1 = 0; i1 < arrays.length; i1++){
2517
+ result.set(arrays[i1], byteOffset);
2518
+ byteOffset += arrays[i1].byteLength;
2519
+ }
2520
+ return result;
2521
+ };
2522
+ var cleanup = function cleanup() {
2523
+ ktx2File.close();
2524
+ ktx2File.delete();
2530
2525
  };
2531
- var transcodePromise;
2532
2526
  var BasisFormat;
2533
2527
  (function(BasisFormat) {
2534
2528
  BasisFormat[BasisFormat["ETC1"] = 0] = "ETC1";
@@ -2554,31 +2548,56 @@ var AbstractTranscoder = /*#__PURE__*/ function() {
2554
2548
  TargetFormat[TargetFormat["RG8"] = 6] = "RG8";
2555
2549
  TargetFormat[TargetFormat["RGBA8"] = 7] = "RGBA8";
2556
2550
  })(TargetFormat || (TargetFormat = {}));
2557
- self.onmessage = function onmessage(event) {
2558
- var message = event.data;
2559
- switch(message.type){
2560
- case "init":
2561
- init(message.transcoderWasm).then(function() {
2562
- return self.postMessage("init-completed");
2563
- }).catch(function(e) {
2564
- return self.postMessage({
2565
- error: e
2566
- });
2567
- });
2568
- break;
2569
- case "transcode":
2570
- transcodePromise.then(function(KTX2File) {
2571
- var result = transcode(message.buffer, message.format, KTX2File);
2572
- // @ts-ignore
2573
- result.type = "transcoded";
2574
- self.postMessage(result);
2575
- }).catch(function(e) {
2576
- return self.postMessage({
2577
- error: e
2578
- });
2579
- });
2580
- break;
2551
+ var ktx2File = new KTX2File(new Uint8Array(buffer));
2552
+ if (!ktx2File.isValid()) {
2553
+ cleanup();
2554
+ throw new Error("Invalid or unsupported .ktx2 file");
2555
+ }
2556
+ if (!ktx2File.startTranscoding()) {
2557
+ cleanup();
2558
+ throw new Error("KTX2 startTranscoding failed");
2559
+ }
2560
+ var width = ktx2File.getWidth();
2561
+ var height = ktx2File.getHeight();
2562
+ var layerCount = ktx2File.getLayers() || 1;
2563
+ var levelCount = ktx2File.getLevels();
2564
+ var hasAlpha = ktx2File.getHasAlpha();
2565
+ var faceCount = ktx2File.getFaces();
2566
+ var format = getTranscodeFormatFromTarget(targetFormat, hasAlpha);
2567
+ var faces = new Array(faceCount);
2568
+ for(var face = 0; face < faceCount; face++){
2569
+ var mipmaps = new Array(levelCount);
2570
+ for(var mip = 0; mip < levelCount; mip++){
2571
+ var layerMips = new Array(layerCount);
2572
+ var mipWidth = void 0, mipHeight = void 0;
2573
+ for(var layer = 0; layer < layerCount; layer++){
2574
+ var levelInfo = ktx2File.getImageLevelInfo(mip, layer, face);
2575
+ mipWidth = levelInfo.origWidth;
2576
+ mipHeight = levelInfo.origHeight;
2577
+ var dst = new Uint8Array(ktx2File.getImageTranscodedSizeInBytes(mip, layer, 0, format));
2578
+ var status = ktx2File.transcodeImage(dst, mip, layer, face, format, 0, -1, -1);
2579
+ if (!status) {
2580
+ cleanup();
2581
+ throw new Error("transcodeImage failed.");
2582
+ }
2583
+ layerMips[layer] = dst;
2584
+ }
2585
+ mipmaps[mip] = {
2586
+ data: concat(layerMips),
2587
+ width: mipWidth,
2588
+ height: mipHeight
2589
+ };
2581
2590
  }
2591
+ faces[face] = mipmaps;
2592
+ }
2593
+ cleanup();
2594
+ return {
2595
+ faces: faces,
2596
+ width: width,
2597
+ height: height,
2598
+ hasAlpha: hasAlpha,
2599
+ faceCount: faceCount,
2600
+ format: format
2582
2601
  };
2583
2602
  }
2584
2603
 
@@ -2599,23 +2618,49 @@ var AbstractTranscoder = /*#__PURE__*/ function() {
2599
2618
  })
2600
2619
  ]).then(function(param) {
2601
2620
  var jsCode = param[0], wasmBuffer = param[1];
2602
- var funcCode = TranscodeWorkerCode$1.toString();
2603
- var transcodeString = funcCode.substring(funcCode.indexOf("{"), funcCode.lastIndexOf("}") + 1);
2604
- var workerCode = "\n " + jsCode + "\n " + transcodeString + "\n ";
2605
- var workerURL = URL.createObjectURL(new Blob([
2606
- workerCode
2607
- ], {
2608
- type: "application/javascript"
2609
- }));
2610
- return _this._createTranscodePool(workerURL, wasmBuffer);
2621
+ if (_this.workerLimitCount === 0) {
2622
+ return new Promise(function(resolve, reject) {
2623
+ var scriptDom = document.createElement("script");
2624
+ scriptDom.src = URL.createObjectURL(new Blob([
2625
+ jsCode
2626
+ ], {
2627
+ type: "application/javascript"
2628
+ }));
2629
+ document.body.appendChild(scriptDom);
2630
+ scriptDom.onload = function() {
2631
+ init(wasmBuffer).then(function() {
2632
+ resolve(null);
2633
+ });
2634
+ };
2635
+ scriptDom.onerror = function() {
2636
+ reject();
2637
+ };
2638
+ });
2639
+ } else {
2640
+ var funcCode = TranscodeWorkerCode$1.toString();
2641
+ var transcodeString = funcCode.substring(funcCode.indexOf("{"), funcCode.lastIndexOf("}") + 1);
2642
+ var workerCode = "\n " + jsCode + "\n var init = (" + _init.toString() + ")();\n " + transcode.toString() + "\n " + transcodeString + "\n ";
2643
+ var workerURL = URL.createObjectURL(new Blob([
2644
+ workerCode
2645
+ ], {
2646
+ type: "application/javascript"
2647
+ }));
2648
+ return _this._createTranscodePool(workerURL, wasmBuffer);
2649
+ }
2611
2650
  });
2612
2651
  };
2613
- _proto.transcode = function transcode(buffer, format) {
2614
- return this._transcodeWorkerPool.postMessage({
2615
- buffer: buffer,
2616
- format: format,
2617
- type: "transcode"
2618
- });
2652
+ _proto.transcode = function transcode1(buffer, format) {
2653
+ if (this.workerLimitCount === 0) {
2654
+ return init().then(function(KTX2File) {
2655
+ return transcode(buffer, format, KTX2File);
2656
+ });
2657
+ } else {
2658
+ return this._transcodeWorkerPool.postMessage({
2659
+ buffer: buffer,
2660
+ format: format,
2661
+ type: "transcode"
2662
+ });
2663
+ }
2619
2664
  };
2620
2665
  return BinomialLLCTranscoder;
2621
2666
  }(AbstractTranscoder);
@@ -2843,7 +2888,7 @@ exports.KTX2Loader = (_KTX2Loader = /*#__PURE__*/ function(Loader1) {
2843
2888
  _proto.initialize = function initialize(engine, configuration) {
2844
2889
  if (configuration.ktx2Loader) {
2845
2890
  var options = configuration.ktx2Loader;
2846
- if (this._isKhronosSupported(options.priorityFormats, engine)) {
2891
+ if (this._isKhronosSupported(options.priorityFormats, engine) && options.workerCount !== 0) {
2847
2892
  return exports.KTX2Loader._getKhronosTranscoder(options.workerCount).init();
2848
2893
  } else {
2849
2894
  return exports.KTX2Loader._getBinomialLLCTranscoder(options.workerCount).init();
@@ -3564,12 +3609,12 @@ exports.GLTFAnimationParser = /*#__PURE__*/ function(GLTFParser1) {
3564
3609
  if (curve2.interpolation === engineCore.InterpolationType.CubicSpine) {
3565
3610
  keyframe2.inTangent = Array.from(output.subarray(offset2, offset2 + outputSize));
3566
3611
  offset2 += outputSize;
3567
- keyframe2.value = output.subarray(offset2, offset2 + outputSize);
3612
+ keyframe2.value = output.slice(offset2, offset2 + outputSize);
3568
3613
  offset2 += outputSize;
3569
3614
  keyframe2.outTangent = Array.from(output.subarray(offset2, offset2 + outputSize));
3570
3615
  offset2 += outputSize;
3571
3616
  } else {
3572
- keyframe2.value = output.subarray(offset2, offset2 + outputSize);
3617
+ keyframe2.value = output.slice(offset2, offset2 + outputSize);
3573
3618
  offset2 += outputSize;
3574
3619
  }
3575
3620
  curve2.addKey(keyframe2);
@@ -4320,8 +4365,7 @@ exports.GLTFTextureParser = (_GLTFTextureParser = /*#__PURE__*/ function(GLTFPar
4320
4365
  mipmap: (_samplerInfo = samplerInfo) == null ? void 0 : _samplerInfo.mipmap
4321
4366
  }
4322
4367
  }).then(function(texture) {
4323
- var _texture;
4324
- (_texture = texture).name || (_texture.name = textureName || imageName || "texture_" + index);
4368
+ texture.name = textureName || imageName || texture.name || "texture_" + index;
4325
4369
  useSampler && GLTFUtils.parseSampler(texture, samplerInfo);
4326
4370
  return texture;
4327
4371
  });
@@ -5428,6 +5472,39 @@ TextureCubeLoader = __decorate([
5428
5472
  ])
5429
5473
  ], TextureCubeLoader);
5430
5474
 
5475
+ var ProjectLoader = /*#__PURE__*/ function(Loader1) {
5476
+ _inherits(ProjectLoader, Loader1);
5477
+ function ProjectLoader() {
5478
+ return Loader1.apply(this, arguments);
5479
+ }
5480
+ var _proto = ProjectLoader.prototype;
5481
+ _proto.load = function load(item, resourceManager) {
5482
+ var _this = this;
5483
+ var engine = resourceManager.engine;
5484
+ return new engineCore.AssetPromise(function(resolve, reject) {
5485
+ _this.request(item.url, {
5486
+ type: "json"
5487
+ }).then(function(data) {
5488
+ // @ts-ignore
5489
+ engine.resourceManager.initVirtualResources(data.files);
5490
+ return resourceManager.load({
5491
+ type: engineCore.AssetType.Scene,
5492
+ url: data.scene
5493
+ }).then(function(scene) {
5494
+ engine.sceneManager.activeScene = scene;
5495
+ resolve();
5496
+ });
5497
+ }).catch(reject);
5498
+ });
5499
+ };
5500
+ return ProjectLoader;
5501
+ }(engineCore.Loader);
5502
+ ProjectLoader = __decorate([
5503
+ engineCore.resourceLoader(engineCore.AssetType.Project, [
5504
+ "proj"
5505
+ ], false)
5506
+ ], ProjectLoader);
5507
+
5431
5508
  var SceneLoader = /*#__PURE__*/ function(Loader1) {
5432
5509
  _inherits(SceneLoader, Loader1);
5433
5510
  function SceneLoader() {
@@ -5446,32 +5523,28 @@ var SceneLoader = /*#__PURE__*/ function(Loader1) {
5446
5523
  // parse ambient light
5447
5524
  var ambient = data.scene.ambient;
5448
5525
  var useCustomAmbient = ambient.specularMode === "Custom";
5526
+ var useSH = ambient.diffuseMode === engineCore.DiffuseMode.SphericalHarmonics;
5527
+ scene.ambientLight.diffuseIntensity = ambient.diffuseIntensity;
5528
+ scene.ambientLight.specularIntensity = ambient.specularIntensity;
5529
+ scene.ambientLight.diffuseMode = ambient.diffuseMode;
5530
+ scene.ambientLight.diffuseSolidColor.copyFrom(ambient.diffuseSolidColor);
5531
+ scene.ambientLight.specularTextureDecodeRGBM = true;
5449
5532
  if (useCustomAmbient && ambient.customAmbientLight) {
5450
- // @ts-ignore
5451
- // prettier-ignore
5452
- var customAmbientPromise = resourceManager.getResourceByRef(ambient.customAmbientLight).then(function(ambientLight) {
5453
- scene.ambientLight = ambientLight;
5454
- scene.ambientLight.diffuseIntensity = ambient.diffuseIntensity;
5455
- scene.ambientLight.specularIntensity = ambient.specularIntensity;
5456
- scene.ambientLight.diffuseMode = ambient.diffuseMode;
5457
- scene.ambientLight.diffuseSolidColor.copyFrom(ambient.diffuseSolidColor);
5458
- });
5459
- promises.push(customAmbientPromise);
5460
- } else if (!useCustomAmbient && ambient.ambientLight) {
5461
- // @ts-ignore
5462
- // prettier-ignore
5463
- var ambientLightPromise = resourceManager.getResourceByRef(ambient.ambientLight).then(function(ambientLight) {
5464
- scene.ambientLight = ambientLight;
5465
- scene.ambientLight.diffuseIntensity = ambient.diffuseIntensity;
5466
- scene.ambientLight.specularIntensity = ambient.specularIntensity;
5467
- scene.ambientLight.diffuseMode = ambient.diffuseMode;
5468
- scene.ambientLight.diffuseSolidColor.copyFrom(ambient.diffuseSolidColor);
5469
- });
5470
- promises.push(ambientLightPromise);
5471
- } else {
5472
- scene.ambientLight.diffuseIntensity = ambient.diffuseIntensity;
5473
- scene.ambientLight.specularIntensity = ambient.specularIntensity;
5474
- scene.ambientLight.diffuseSolidColor.copyFrom(ambient.diffuseSolidColor);
5533
+ promises.push(// @ts-ignore
5534
+ resourceManager.getResourceByRef(ambient.customAmbientLight).then(function(ambientLight) {
5535
+ scene.ambientLight.specularTexture = ambientLight.specularTexture;
5536
+ }));
5537
+ }
5538
+ if (ambient.ambientLight && (!useCustomAmbient || useSH)) {
5539
+ promises.push(// @ts-ignore
5540
+ resourceManager.getResourceByRef(ambient.ambientLight).then(function(ambientLight) {
5541
+ if (!useCustomAmbient) {
5542
+ scene.ambientLight.specularTexture = ambientLight.specularTexture;
5543
+ }
5544
+ if (useSH) {
5545
+ scene.ambientLight.diffuseSphericalHarmonics = ambientLight.diffuseSphericalHarmonics;
5546
+ }
5547
+ }));
5475
5548
  }
5476
5549
  var background = data.scene.background;
5477
5550
  scene.background.mode = background.mode;