@galacean/engine-loader 2.0.0-alpha.5 → 2.0.0-alpha.7

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
@@ -252,7 +252,9 @@ var decoderMap = {};
252
252
  };
253
253
  }
254
254
 
255
- var FileHeader = /*#__PURE__*/ function() {
255
+ /**
256
+ * Binary format: [MAGIC(4B)] [totalLength(4B)] [version(1B)] [typeLen(2B)] [type] [nameLen(2B)] [name] [data...]
257
+ */ var FileHeader = /*#__PURE__*/ function() {
256
258
  function FileHeader() {
257
259
  this.totalLength = 0;
258
260
  this.version = 0;
@@ -260,14 +262,23 @@ var FileHeader = /*#__PURE__*/ function() {
260
262
  this.name = "";
261
263
  this.headerLength = 0;
262
264
  }
265
+ FileHeader.checkMagic = function checkMagic(arrayBuffer) {
266
+ if (arrayBuffer.byteLength < 4) return false;
267
+ var view = new DataView(arrayBuffer);
268
+ return view.getUint32(0, true) === FileHeader.MAGIC;
269
+ };
263
270
  FileHeader.decode = function decode(arrayBuffer) {
264
271
  var dataView = new DataView(arrayBuffer);
265
- var totalLen = dataView.getUint32(0, true);
266
- var fileVersion = dataView.getUint8(4);
267
- var typeLen = dataView.getUint16(5, true);
268
- var typeUint8Array = new Uint8Array(arrayBuffer, 7, typeLen);
269
- var nameLen = dataView.getUint16(7 + typeLen, true);
270
- var nameUint8Array = new Uint8Array(arrayBuffer, 9 + typeLen, nameLen);
272
+ if (!FileHeader.checkMagic(arrayBuffer)) {
273
+ throw new Error("Invalid Galacean binary file: missing GLCN magic header.");
274
+ }
275
+ var offset = 4;
276
+ var totalLen = dataView.getUint32(offset, true);
277
+ var fileVersion = dataView.getUint8(offset + 4);
278
+ var typeLen = dataView.getUint16(offset + 5, true);
279
+ var typeUint8Array = new Uint8Array(arrayBuffer, offset + 7, typeLen);
280
+ var nameLen = dataView.getUint16(offset + 7 + typeLen, true);
281
+ var nameUint8Array = new Uint8Array(arrayBuffer, offset + 9 + typeLen, nameLen);
271
282
  var name = engineCore.Utils.decodeText(nameUint8Array);
272
283
  var type = engineCore.Utils.decodeText(typeUint8Array);
273
284
  var header = new FileHeader();
@@ -275,7 +286,7 @@ var FileHeader = /*#__PURE__*/ function() {
275
286
  header.name = name;
276
287
  header.type = type;
277
288
  header.version = fileVersion;
278
- header.headerLength = nameUint8Array.byteLength + typeUint8Array.byteLength + 9;
289
+ header.headerLength = offset + nameUint8Array.byteLength + typeUint8Array.byteLength + 9;
279
290
  return header;
280
291
  };
281
292
  _create_class(FileHeader, [
@@ -288,6 +299,8 @@ var FileHeader = /*#__PURE__*/ function() {
288
299
  ]);
289
300
  return FileHeader;
290
301
  }();
302
+ FileHeader.MAGIC = 0x4e434c47 // "GLCN" in little-endian
303
+ ;
291
304
 
292
305
  var InterpolableValueType = /*#__PURE__*/ function(InterpolableValueType) {
293
306
  InterpolableValueType[InterpolableValueType["Float"] = 0] = "Float";
@@ -694,12 +707,12 @@ var ParserType = /*#__PURE__*/ function(ParserType) {
694
707
  this.rootIds.length = 0;
695
708
  this.strippedIds.length = 0;
696
709
  };
697
- /** @internal */ _proto._addDependentAsset = function _addDependentAsset(refID, promise) {
710
+ /** @internal */ _proto._addDependentAsset = function _addDependentAsset(url, promise) {
698
711
  var _this = this;
699
712
  var tasks = this._tasks;
700
- if (tasks.has(refID)) return;
713
+ if (tasks.has(url)) return;
701
714
  ++this._total;
702
- tasks.add(refID);
715
+ tasks.add(url);
703
716
  promise.finally(function() {
704
717
  ++_this._loaded;
705
718
  _this._setTaskCompleteProgress(_this._loaded, _this._total);
@@ -807,7 +820,7 @@ var ReflectionParser = /*#__PURE__*/ function() {
807
820
  // reference object
808
821
  // @ts-ignore
809
822
  return context.resourceManager.getResourceByRef(value).then(function(resource) {
810
- if (context.type === ParserType.Prefab) {
823
+ if (resource && context.type === ParserType.Prefab) {
811
824
  // @ts-ignore
812
825
  context.resource._addDependenceAsset(resource);
813
826
  }
@@ -850,18 +863,18 @@ var ReflectionParser = /*#__PURE__*/ function() {
850
863
  _proto._getEntityByConfig = function _getEntityByConfig(entityConfig) {
851
864
  var _this = this;
852
865
  // @ts-ignore
853
- var assetRefId = entityConfig.assetRefId;
866
+ var assetUrl = entityConfig.assetUrl;
854
867
  var engine = this._context.engine;
855
- if (assetRefId) {
868
+ if (assetUrl) {
856
869
  return engine.resourceManager// @ts-ignore
857
870
  .getResourceByRef({
858
- refId: assetRefId,
871
+ url: assetUrl,
859
872
  key: entityConfig.key,
860
873
  isClone: entityConfig.isClone
861
874
  }).then(function(entity) {
862
875
  // @ts-ignore
863
- var resource = engine.resourceManager._objectPool[assetRefId];
864
- if (_this._context.type === ParserType.Prefab) {
876
+ var resource = engine.resourceManager._objectPool[assetUrl];
877
+ if (resource && _this._context.type === ParserType.Prefab) {
865
878
  // @ts-ignore
866
879
  _this._context.resource._addDependenceAsset(resource);
867
880
  }
@@ -884,7 +897,7 @@ var ReflectionParser = /*#__PURE__*/ function() {
884
897
  return value["classType"] !== undefined;
885
898
  };
886
899
  ReflectionParser._isAssetRef = function _isAssetRef(value) {
887
- return value["refId"] !== undefined;
900
+ return value["url"] !== undefined;
888
901
  };
889
902
  ReflectionParser._isEntityRef = function _isEntityRef(value) {
890
903
  return value["entityId"] !== undefined;
@@ -903,7 +916,7 @@ exports.Texture2DDecoder = /*#__PURE__*/ function() {
903
916
  function Texture2DDecoder() {}
904
917
  Texture2DDecoder.decode = function decode(engine, bufferReader, restoredTexture) {
905
918
  return new engineCore.AssetPromise(function(resolve, reject) {
906
- var objectId = bufferReader.nextStr();
919
+ var url = bufferReader.nextStr();
907
920
  var mipmap = !!bufferReader.nextUint8();
908
921
  var filterMode = bufferReader.nextUint8();
909
922
  var anisoLevel = bufferReader.nextUint8();
@@ -932,7 +945,7 @@ exports.Texture2DDecoder = /*#__PURE__*/ function() {
932
945
  }
933
946
  }
934
947
  // @ts-ignore
935
- engine.resourceManager._objectPool[objectId] = texture2D;
948
+ engine.resourceManager._objectPool[url] = texture2D;
936
949
  resolve(texture2D);
937
950
  } else {
938
951
  var blob = new window.Blob([
@@ -1236,7 +1249,7 @@ function _create_for_of_iterator_helper_loose(o, allowArrayLike) {
1236
1249
  _proto._getEntityByConfig = function _getEntityByConfig(entityConfig, engine) {
1237
1250
  var _this = this;
1238
1251
  var entityPromise;
1239
- if (entityConfig.assetRefId) {
1252
+ if (entityConfig.assetUrl) {
1240
1253
  entityPromise = this._parsePrefab(entityConfig, engine);
1241
1254
  } else if (entityConfig.strippedId) {
1242
1255
  entityPromise = this._parseStrippedEntity(entityConfig);
@@ -1256,10 +1269,10 @@ function _create_for_of_iterator_helper_loose(o, allowArrayLike) {
1256
1269
  };
1257
1270
  _proto._parsePrefab = function _parsePrefab(entityConfig, engine) {
1258
1271
  var _this = this;
1259
- var assetRefId = entityConfig.assetRefId;
1272
+ var assetUrl = entityConfig.assetUrl;
1260
1273
  return engine.resourceManager// @ts-ignore
1261
1274
  .getResourceByRef({
1262
- refId: assetRefId
1275
+ url: assetUrl
1263
1276
  }).then(function(prefabResource) {
1264
1277
  var entity = _instanceof(prefabResource, PrefabResource) ? prefabResource.instantiate() : prefabResource.instantiateSceneRoot();
1265
1278
  var instanceContext = new ParserContext(engine, ParserType.Prefab, null);
@@ -1310,7 +1323,7 @@ function _create_for_of_iterator_helper_loose(o, allowArrayLike) {
1310
1323
  var componentConfigMap = context.componentConfigMap;
1311
1324
  for(var i = 0, n = components.length; i < n; i++){
1312
1325
  var componentConfig = components[i];
1313
- var key = !componentConfig.refId ? componentConfig.class : componentConfig.refId;
1326
+ var key = !componentConfig.url ? componentConfig.class : componentConfig.url;
1314
1327
  var componentId = componentConfig.id;
1315
1328
  var component = entity.addComponent(engineCore.Loader.getClass(key));
1316
1329
  componentMap.set(componentId, component);
@@ -1358,53 +1371,6 @@ function _create_for_of_iterator_helper_loose(o, allowArrayLike) {
1358
1371
  return HierarchyParser;
1359
1372
  }();
1360
1373
 
1361
- exports.EditorTextureLoader = /*#__PURE__*/ function(Loader) {
1362
- _inherits(EditorTextureLoader, Loader);
1363
- function EditorTextureLoader() {
1364
- return Loader.apply(this, arguments) || this;
1365
- }
1366
- var _proto = EditorTextureLoader.prototype;
1367
- _proto.load = function load(item, resourceManager) {
1368
- var requestConfig = _extends({}, item, {
1369
- type: "arraybuffer"
1370
- });
1371
- var url = item.url;
1372
- return new engineCore.AssetPromise(function(resolve, reject) {
1373
- resourceManager// @ts-ignore
1374
- ._request(url, requestConfig).then(function(data) {
1375
- decode(data, resourceManager.engine).then(function(texture) {
1376
- resourceManager.addContentRestorer(new EditorTexture2DContentRestorer(texture, url, requestConfig));
1377
- resolve(texture);
1378
- });
1379
- }).catch(reject);
1380
- });
1381
- };
1382
- return EditorTextureLoader;
1383
- }(engineCore.Loader);
1384
- exports.EditorTextureLoader = __decorate([
1385
- engineCore.resourceLoader("EditorTexture2D", [
1386
- "prefab"
1387
- ], true)
1388
- ], exports.EditorTextureLoader);
1389
- var EditorTexture2DContentRestorer = /*#__PURE__*/ function(ContentRestorer) {
1390
- _inherits(EditorTexture2DContentRestorer, ContentRestorer);
1391
- function EditorTexture2DContentRestorer(resource, url, requestConfig) {
1392
- var _this;
1393
- _this = ContentRestorer.call(this, resource) || this, _this.url = url, _this.requestConfig = requestConfig;
1394
- return _this;
1395
- }
1396
- var _proto = EditorTexture2DContentRestorer.prototype;
1397
- _proto.restoreContent = function restoreContent() {
1398
- var texture = this.resource;
1399
- var engine = texture.engine;
1400
- return engine.resourceManager// @ts-ignore
1401
- ._request(this.url, this.requestConfig).then(function(data) {
1402
- return decode(data, engine, texture);
1403
- });
1404
- };
1405
- return EditorTexture2DContentRestorer;
1406
- }(engineCore.ContentRestorer);
1407
-
1408
1374
  var MaterialLoaderType = /*#__PURE__*/ function(MaterialLoaderType) {
1409
1375
  MaterialLoaderType["Vector2"] = "Vector2";
1410
1376
  MaterialLoaderType["Vector3"] = "Vector3";
@@ -1445,11 +1411,11 @@ var SpecularMode = /*#__PURE__*/ function(SpecularMode) {
1445
1411
  var customAmbientLight = ambient.customAmbientLight, ambientLight = ambient.ambientLight;
1446
1412
  if (useCustomAmbient && customAmbientLight) {
1447
1413
  // @ts-ignore
1448
- context._addDependentAsset(customAmbientLight.refId, resourceManager.getResourceByRef(customAmbientLight));
1414
+ context._addDependentAsset(customAmbientLight.url, resourceManager.getResourceByRef(customAmbientLight));
1449
1415
  }
1450
1416
  if (ambientLight && (!useCustomAmbient || useSH)) {
1451
1417
  // @ts-ignore
1452
- context._addDependentAsset(ambientLight.refId, resourceManager.getResourceByRef(ambientLight));
1418
+ context._addDependentAsset(ambientLight.url, resourceManager.getResourceByRef(ambientLight));
1453
1419
  }
1454
1420
  }
1455
1421
  var background = scene.background;
@@ -1457,14 +1423,14 @@ var SpecularMode = /*#__PURE__*/ function(SpecularMode) {
1457
1423
  if (backgroundMode === engineCore.BackgroundMode.Texture) {
1458
1424
  var texture = background.texture;
1459
1425
  // @ts-ignore
1460
- texture && context._addDependentAsset(texture.refId, resourceManager.getResourceByRef(texture));
1426
+ texture && context._addDependentAsset(texture.url, resourceManager.getResourceByRef(texture));
1461
1427
  } else if (backgroundMode === engineCore.BackgroundMode.Sky) {
1462
1428
  var skyMesh = background.skyMesh, skyMaterial = background.skyMaterial;
1463
1429
  if (skyMesh && skyMaterial) {
1464
1430
  // @ts-ignore
1465
- context._addDependentAsset(skyMesh.refId, resourceManager.getResourceByRef(skyMesh));
1431
+ context._addDependentAsset(skyMesh.url, resourceManager.getResourceByRef(skyMesh));
1466
1432
  // @ts-ignore
1467
- context._addDependentAsset(skyMaterial.refId, resourceManager.getResourceByRef(skyMaterial));
1433
+ context._addDependentAsset(skyMaterial.url, resourceManager.getResourceByRef(skyMaterial));
1468
1434
  }
1469
1435
  }
1470
1436
  };
@@ -1480,12 +1446,12 @@ var SpecularMode = /*#__PURE__*/ function(SpecularMode) {
1480
1446
  var entities = file.entities;
1481
1447
  for(var i = 0, n = entities.length; i < n; i++){
1482
1448
  var entity = entities[i];
1483
- if (!!entity.assetRefId) {
1449
+ if (!!entity.assetUrl) {
1484
1450
  var context = this.context;
1485
- var refId = entity.assetRefId, key = entity.key;
1451
+ var url = entity.assetUrl, key = entity.key;
1486
1452
  // @ts-ignore
1487
- context._addDependentAsset(refId, context.resourceManager.getResourceByRef({
1488
- refId: refId,
1453
+ context._addDependentAsset(url, context.resourceManager.getResourceByRef({
1454
+ url: url,
1489
1455
  key: key
1490
1456
  }));
1491
1457
  } else if (entity.strippedId) {
@@ -1510,7 +1476,7 @@ var SpecularMode = /*#__PURE__*/ function(SpecularMode) {
1510
1476
  if (ReflectionParser._isAssetRef(value)) {
1511
1477
  var context = this.context;
1512
1478
  // @ts-ignore
1513
- context._addDependentAsset(value.refId, context.resourceManager.getResourceByRef(value));
1479
+ context._addDependentAsset(value.url, context.resourceManager.getResourceByRef(value));
1514
1480
  } else {
1515
1481
  for(var key in value){
1516
1482
  this._searchDependentAssets(value[key]);
@@ -1574,7 +1540,7 @@ var AnimationClipLoader = /*#__PURE__*/ function(Loader) {
1574
1540
  };
1575
1541
  _proto._parseKeyframeValue = function _parseKeyframeValue(keyframe, resourceManager) {
1576
1542
  var value = keyframe.value;
1577
- if ((typeof value === "undefined" ? "undefined" : _type_of(value)) === "object" && (value == null ? void 0 : value.refId)) {
1543
+ if ((typeof value === "undefined" ? "undefined" : _type_of(value)) === "object" && (value == null ? void 0 : value.url)) {
1578
1544
  return new Promise(function(resolve) {
1579
1545
  resourceManager// @ts-ignore
1580
1546
  .getResourceByRef(value).then(function(asset) {
@@ -1590,7 +1556,7 @@ var AnimationClipLoader = /*#__PURE__*/ function(Loader) {
1590
1556
  }(engineCore.Loader);
1591
1557
  AnimationClipLoader = __decorate([
1592
1558
  engineCore.resourceLoader(engineCore.AssetType.AnimationClip, [
1593
- "ani"
1559
+ "anim"
1594
1560
  ])
1595
1561
  ], AnimationClipLoader);
1596
1562
 
@@ -1702,8 +1668,8 @@ var AnimatorControllerLoader = /*#__PURE__*/ function(Loader1) {
1702
1668
  }(engineCore.Loader);
1703
1669
  AnimatorControllerLoader = __decorate([
1704
1670
  engineCore.resourceLoader(engineCore.AssetType.AnimatorController, [
1705
- "json"
1706
- ], false)
1671
+ "animCtrl"
1672
+ ])
1707
1673
  ], AnimatorControllerLoader);
1708
1674
 
1709
1675
  var base64Regex = /^data:(.+?);base64,/;
@@ -1731,8 +1697,7 @@ var BufferLoader = /*#__PURE__*/ function(Loader) {
1731
1697
  }(engineCore.Loader);
1732
1698
  BufferLoader = __decorate([
1733
1699
  engineCore.resourceLoader(engineCore.AssetType.Buffer, [
1734
- "bin",
1735
- "r3bin"
1700
+ "bin"
1736
1701
  ])
1737
1702
  ], BufferLoader);
1738
1703
 
@@ -1759,7 +1724,6 @@ var EnvLoader = /*#__PURE__*/ function(Loader) {
1759
1724
  sh.copyFromArray(new Float32Array(arraybuffer, 0, 27));
1760
1725
  ambientLight.diffuseSphericalHarmonics = sh;
1761
1726
  ambientLight.specularTexture = texture;
1762
- ambientLight.specularTextureDecodeRGBM = true;
1763
1727
  resolve(ambientLight);
1764
1728
  }).catch(function(e) {
1765
1729
  reject(e);
@@ -1772,7 +1736,7 @@ var EnvLoader = /*#__PURE__*/ function(Loader) {
1772
1736
  var _this;
1773
1737
  var shByteLength = 27 * 4;
1774
1738
  var size = (_this = new Uint16Array(buffer, shByteLength, 1)) == null ? void 0 : _this[0];
1775
- texture || (texture = new engineCore.TextureCube(engine, size, undefined, undefined, false));
1739
+ texture || (texture = new engineCore.TextureCube(engine, size, engineCore.TextureFormat.R16G16B16A16, true, false));
1776
1740
  texture.filterMode = engineCore.TextureFilterMode.Trilinear;
1777
1741
  var mipmapCount = texture.mipmapCount;
1778
1742
  var offset = shByteLength + 2;
@@ -1780,8 +1744,8 @@ var EnvLoader = /*#__PURE__*/ function(Loader) {
1780
1744
  var mipSize = size >> mipLevel;
1781
1745
  for(var face = 0; face < 6; face++){
1782
1746
  var dataSize = mipSize * mipSize * 4;
1783
- var data = new Uint8Array(buffer, offset, dataSize);
1784
- offset += dataSize;
1747
+ var data = new Uint16Array(buffer, offset, dataSize);
1748
+ offset += dataSize * 2;
1785
1749
  texture.setPixelBuffer(engineCore.TextureCubeFace.PositiveX + face, data, mipLevel);
1786
1750
  }
1787
1751
  }
@@ -5310,341 +5274,6 @@ PrefabLoader = __decorate([
5310
5274
  ])
5311
5275
  ], PrefabLoader);
5312
5276
 
5313
- var PI = Math.PI;
5314
- // referenece: https://www.flipcode.com/archives/HDR_Image_Reader.shtml
5315
- var HDRLoader = /*#__PURE__*/ function(Loader) {
5316
- _inherits(HDRLoader, Loader);
5317
- function HDRLoader() {
5318
- return Loader.apply(this, arguments) || this;
5319
- }
5320
- var _proto = HDRLoader.prototype;
5321
- _proto.load = function load(item, resourceManager) {
5322
- return new engineCore.AssetPromise(function(resolve, reject) {
5323
- var engine = resourceManager.engine;
5324
- var requestConfig = _extends({}, item, {
5325
- type: "arraybuffer"
5326
- });
5327
- var url = item.url;
5328
- resourceManager// @ts-ignore
5329
- ._request(url, requestConfig).then(function(buffer) {
5330
- var texture = HDRLoader._setTextureByBuffer(engine, buffer);
5331
- engine.resourceManager.addContentRestorer(new HDRContentRestorer(texture, url, requestConfig));
5332
- resolve(texture);
5333
- }).catch(reject);
5334
- });
5335
- };
5336
- /**
5337
- * @internal
5338
- */ HDRLoader._setTextureByBuffer = function _setTextureByBuffer(engine, buffer, texture) {
5339
- var bufferArray = new Uint8Array(buffer);
5340
- var _HDRLoader__parseHeader = HDRLoader._parseHeader(bufferArray), width = _HDRLoader__parseHeader.width, height = _HDRLoader__parseHeader.height, dataPosition = _HDRLoader__parseHeader.dataPosition;
5341
- var cubeSize = height >> 1;
5342
- texture || (texture = new engineCore.TextureCube(engine, cubeSize, undefined, undefined, false));
5343
- var pixels = HDRLoader._readPixels(bufferArray.subarray(dataPosition), width, height);
5344
- var cubeMapData = HDRLoader._convertToCubemap(pixels, width, height, cubeSize);
5345
- for(var faceIndex = 0; faceIndex < 6; faceIndex++){
5346
- texture.setPixelBuffer(engineCore.TextureCubeFace.PositiveX + faceIndex, cubeMapData[faceIndex], 0);
5347
- }
5348
- texture.generateMipmaps();
5349
- return texture;
5350
- };
5351
- HDRLoader._convertToCubemap = function _convertToCubemap(pixels, inputWidth, inputHeight, size) {
5352
- if (!pixels) {
5353
- throw "ConvertPanoramaToCubemap: input cannot be null";
5354
- }
5355
- if (pixels.length != inputWidth * inputHeight * 4) {
5356
- throw "ConvertPanoramaToCubemap: input size is wrong";
5357
- }
5358
- var textureRight = this._createCubemapData(size, this._faceRight, pixels, inputWidth, inputHeight);
5359
- var textureLeft = this._createCubemapData(size, this._faceLeft, pixels, inputWidth, inputHeight);
5360
- var textureUp = this._createCubemapData(size, this._faceUp, pixels, inputWidth, inputHeight);
5361
- var textureDown = this._createCubemapData(size, this._faceBottom, pixels, inputWidth, inputHeight);
5362
- var textureFront = this._createCubemapData(size, this._faceFront, pixels, inputWidth, inputHeight);
5363
- var textureBack = this._createCubemapData(size, this._faceBack, pixels, inputWidth, inputHeight);
5364
- return [
5365
- textureRight,
5366
- textureLeft,
5367
- textureUp,
5368
- textureDown,
5369
- textureFront,
5370
- textureBack
5371
- ];
5372
- };
5373
- HDRLoader._createCubemapData = function _createCubemapData(texSize, faceData, pixels, inputWidth, inputHeight) {
5374
- var textureArray = new Uint8ClampedArray(texSize * texSize * 4);
5375
- var rotDX1 = this._tempVector3.set(0, 0, 0).add(faceData[1]).subtract(faceData[0]).scale(1 / texSize);
5376
- var rotDX2 = this._temp2Vector3.set(0, 0, 0).add(faceData[3]).subtract(faceData[2]).scale(1 / texSize);
5377
- var dy = 1 / texSize;
5378
- var fy = 0;
5379
- for(var y = 0; y < texSize; y++){
5380
- var xv1 = this._temp3Vector3.set(0, 0, 0).add(faceData[0]);
5381
- var xv2 = this._temp4Vector3.set(0, 0, 0).add(faceData[2]);
5382
- for(var x = 0; x < texSize; x++){
5383
- var v = this._temp5Vector3.set(0, 0, 0).add(xv2).subtract(xv1).scale(fy).add(xv1);
5384
- v.normalize();
5385
- var color = this._calcProjectionSpherical(v, pixels, inputWidth, inputHeight);
5386
- this._RGBEToLinear(color);
5387
- this._linearToRGBM(color, 5);
5388
- // 4 channels per pixels
5389
- var index = y * texSize * 4 + x * 4;
5390
- textureArray[index] = color.r;
5391
- textureArray[index + 1] = color.g;
5392
- textureArray[index + 2] = color.b;
5393
- textureArray[index + 3] = color.a;
5394
- xv1.add(rotDX1);
5395
- xv2.add(rotDX2);
5396
- }
5397
- fy += dy;
5398
- }
5399
- return textureArray;
5400
- };
5401
- HDRLoader._calcProjectionSpherical = function _calcProjectionSpherical(vDir, pixels, inputWidth, inputHeight) {
5402
- var theta = Math.atan2(vDir.z, vDir.x);
5403
- var phi = Math.acos(vDir.y);
5404
- while(theta < -PI){
5405
- theta += 2 * PI;
5406
- }
5407
- while(theta > PI){
5408
- theta -= 2 * PI;
5409
- }
5410
- var dx = theta / PI;
5411
- var dy = phi / PI;
5412
- // recenter.
5413
- dx = dx * 0.5 + 0.5;
5414
- var px = Math.round(dx * inputWidth);
5415
- if (px < 0) {
5416
- px = 0;
5417
- } else if (px >= inputWidth) {
5418
- px = inputWidth - 1;
5419
- }
5420
- var py = Math.round(dy * inputHeight);
5421
- if (py < 0) {
5422
- py = 0;
5423
- } else if (py >= inputHeight) {
5424
- py = inputHeight - 1;
5425
- }
5426
- var inputY = inputHeight - py - 1;
5427
- var index = inputY * inputWidth * 4 + px * 4;
5428
- var r = pixels[index];
5429
- var g = pixels[index + 1];
5430
- var b = pixels[index + 2];
5431
- var a = pixels[index + 3];
5432
- return new engineMath.Color(r, g, b, a);
5433
- };
5434
- HDRLoader._readStringLine = function _readStringLine(uint8array, startIndex) {
5435
- var line = "";
5436
- var character = "";
5437
- for(var i = startIndex; i < uint8array.length - startIndex; i++){
5438
- character = String.fromCharCode(uint8array[i]);
5439
- if (character == "\n") {
5440
- break;
5441
- }
5442
- line += character;
5443
- }
5444
- return line;
5445
- };
5446
- HDRLoader._parseHeader = function _parseHeader(uint8array) {
5447
- var height = 0;
5448
- var width = 0;
5449
- var line = this._readStringLine(uint8array, 0);
5450
- if (line[0] != "#" || line[1] != "?") {
5451
- throw "Bad HDR Format.";
5452
- }
5453
- var endOfHeader = false;
5454
- var findFormat = false;
5455
- var lineIndex = 0;
5456
- do {
5457
- lineIndex += line.length + 1;
5458
- line = this._readStringLine(uint8array, lineIndex);
5459
- if (line == "FORMAT=32-bit_rle_rgbe") {
5460
- findFormat = true;
5461
- } else if (line.length == 0) {
5462
- endOfHeader = true;
5463
- }
5464
- }while (!endOfHeader);
5465
- if (!findFormat) {
5466
- throw "HDR Bad header format, unsupported FORMAT";
5467
- }
5468
- lineIndex += line.length + 1;
5469
- line = this._readStringLine(uint8array, lineIndex);
5470
- var sizeRegexp = /^\-Y (.*) \+X (.*)$/g;
5471
- var match = sizeRegexp.exec(line);
5472
- // TODO. Support +Y and -X if needed.
5473
- if (!match || match.length < 3) {
5474
- throw "HDR Bad header format, no size";
5475
- }
5476
- width = parseInt(match[2]);
5477
- height = parseInt(match[1]);
5478
- if (width < 8 || width > 0x7fff) {
5479
- throw "HDR Bad header format, unsupported size";
5480
- }
5481
- lineIndex += line.length + 1;
5482
- return {
5483
- height: height,
5484
- width: width,
5485
- dataPosition: lineIndex
5486
- };
5487
- };
5488
- HDRLoader._readPixels = function _readPixels(buffer, width, height) {
5489
- var scanLineWidth = width;
5490
- var byteLength = buffer.byteLength;
5491
- var dataRGBA = new Uint8Array(4 * width * height);
5492
- var offset = 0, pos = 0;
5493
- var ptrEnd = 4 * scanLineWidth;
5494
- var scanLineBuffer = new Uint8Array(ptrEnd);
5495
- var numScanLines = height; // read in each successive scanLine
5496
- while(numScanLines > 0 && pos < byteLength){
5497
- var a = buffer[pos++];
5498
- var b = buffer[pos++];
5499
- var c = buffer[pos++];
5500
- var d = buffer[pos++];
5501
- if (a != 2 || b != 2 || c & 0x80 || width < 8 || width > 32767) {
5502
- // this file is not run length encoded
5503
- // read values sequentially
5504
- return buffer;
5505
- }
5506
- if ((c << 8 | d) != scanLineWidth) {
5507
- // eslint-disable-next-line no-throw-literal
5508
- throw "HDR Bad header format, wrong scan line width";
5509
- }
5510
- // read each of the four channels for the scanline into the buffer
5511
- // first red, then green, then blue, then exponent
5512
- var ptr = 0, count = void 0;
5513
- while(ptr < ptrEnd && pos < byteLength){
5514
- count = buffer[pos++];
5515
- var isEncodedRun = count > 128;
5516
- if (isEncodedRun) count -= 128;
5517
- if (0 === count || ptr + count > ptrEnd) {
5518
- throw "HDR Bad Format, bad scanline data (run)";
5519
- }
5520
- if (isEncodedRun) {
5521
- // a (encoded) run of the same value
5522
- var byteValue = buffer[pos++];
5523
- for(var i = 0; i < count; i++){
5524
- scanLineBuffer[ptr++] = byteValue;
5525
- } //ptr += count;
5526
- } else {
5527
- // a literal-run
5528
- scanLineBuffer.set(buffer.subarray(pos, pos + count), ptr);
5529
- ptr += count;
5530
- pos += count;
5531
- }
5532
- } // now convert data from buffer into rgba
5533
- // first red, then green, then blue, then exponent (alpha)
5534
- var l = scanLineWidth; //scanLine_buffer.byteLength;
5535
- for(var i1 = 0; i1 < l; i1++){
5536
- var off = 0;
5537
- dataRGBA[offset] = scanLineBuffer[i1 + off];
5538
- off += scanLineWidth;
5539
- dataRGBA[offset + 1] = scanLineBuffer[i1 + off];
5540
- off += scanLineWidth;
5541
- dataRGBA[offset + 2] = scanLineBuffer[i1 + off];
5542
- off += scanLineWidth;
5543
- dataRGBA[offset + 3] = scanLineBuffer[i1 + off];
5544
- offset += 4;
5545
- }
5546
- numScanLines--;
5547
- }
5548
- return dataRGBA;
5549
- };
5550
- HDRLoader._RGBEToLinear = function _RGBEToLinear(color) {
5551
- var scaleFactor = Math.pow(2, color.a - 128) / 255;
5552
- color.r *= scaleFactor;
5553
- color.g *= scaleFactor;
5554
- color.b *= scaleFactor;
5555
- color.a = 1;
5556
- };
5557
- HDRLoader._linearToRGBM = function _linearToRGBM(color, maxRange) {
5558
- var maxRGB = Math.max(color.r, Math.max(color.g, color.b));
5559
- var M = Math.min(maxRGB / maxRange, 1);
5560
- M = Math.ceil(M * 255);
5561
- var scaleFactor = 65025 / (M * maxRange); // 255 * (255 / (M * maxRange) )
5562
- color.r *= scaleFactor;
5563
- color.g *= scaleFactor;
5564
- color.b *= scaleFactor;
5565
- color.a *= M;
5566
- };
5567
- return HDRLoader;
5568
- }(engineCore.Loader);
5569
- HDRLoader._rightBottomBack = new engineMath.Vector3(1.0, -1.0, -1.0);
5570
- HDRLoader._rightBottomFront = new engineMath.Vector3(1.0, -1.0, 1.0);
5571
- HDRLoader._rightUpBack = new engineMath.Vector3(1.0, 1.0, -1.0);
5572
- HDRLoader._rightUpFront = new engineMath.Vector3(1.0, 1.0, 1.0);
5573
- HDRLoader._leftBottomBack = new engineMath.Vector3(-1.0, -1.0, -1.0);
5574
- HDRLoader._leftBottomFront = new engineMath.Vector3(-1.0, -1.0, 1.0);
5575
- HDRLoader._leftUpBack = new engineMath.Vector3(-1.0, 1.0, -1.0);
5576
- HDRLoader._leftUpFront = new engineMath.Vector3(-1.0, 1.0, 1.0);
5577
- HDRLoader._faceRight = [
5578
- HDRLoader._rightBottomBack,
5579
- HDRLoader._rightBottomFront,
5580
- HDRLoader._rightUpBack,
5581
- HDRLoader._rightUpFront
5582
- ];
5583
- HDRLoader._faceLeft = [
5584
- HDRLoader._leftBottomFront,
5585
- HDRLoader._leftBottomBack,
5586
- HDRLoader._leftUpFront,
5587
- HDRLoader._leftUpBack
5588
- ];
5589
- HDRLoader._faceUp = [
5590
- HDRLoader._leftBottomFront,
5591
- HDRLoader._rightBottomFront,
5592
- HDRLoader._leftBottomBack,
5593
- HDRLoader._rightBottomBack
5594
- ];
5595
- HDRLoader._faceBottom = [
5596
- HDRLoader._leftUpBack,
5597
- HDRLoader._rightUpBack,
5598
- HDRLoader._leftUpFront,
5599
- HDRLoader._rightUpFront
5600
- ];
5601
- HDRLoader._faceFront = [
5602
- HDRLoader._leftBottomBack,
5603
- HDRLoader._rightBottomBack,
5604
- HDRLoader._leftUpBack,
5605
- HDRLoader._rightUpBack
5606
- ];
5607
- HDRLoader._faceBack = [
5608
- HDRLoader._rightBottomFront,
5609
- HDRLoader._leftBottomFront,
5610
- HDRLoader._rightUpFront,
5611
- HDRLoader._leftUpFront
5612
- ];
5613
- HDRLoader._tempVector3 = new engineMath.Vector3();
5614
- HDRLoader._temp2Vector3 = new engineMath.Vector3();
5615
- HDRLoader._temp3Vector3 = new engineMath.Vector3();
5616
- HDRLoader._temp4Vector3 = new engineMath.Vector3();
5617
- HDRLoader._temp5Vector3 = new engineMath.Vector3();
5618
- HDRLoader = __decorate([
5619
- engineCore.resourceLoader(engineCore.AssetType.HDR, [
5620
- "hdr"
5621
- ])
5622
- ], HDRLoader);
5623
- /**
5624
- * @internal
5625
- */ var HDRContentRestorer = /*#__PURE__*/ function(ContentRestorer) {
5626
- _inherits(HDRContentRestorer, ContentRestorer);
5627
- function HDRContentRestorer(resource, url, requestConfig) {
5628
- var _this;
5629
- _this = ContentRestorer.call(this, resource) || this, _this.url = url, _this.requestConfig = requestConfig;
5630
- return _this;
5631
- }
5632
- var _proto = HDRContentRestorer.prototype;
5633
- _proto.restoreContent = function restoreContent() {
5634
- var _this = this;
5635
- return new engineCore.AssetPromise(function(resolve, reject) {
5636
- var resource = _this.resource;
5637
- var engine = resource.engine;
5638
- engine.resourceManager// @ts-ignore
5639
- ._request(_this.url, _this.requestConfig).then(function(buffer) {
5640
- HDRLoader._setTextureByBuffer(engine, buffer, resource);
5641
- resolve(resource);
5642
- }).catch(reject);
5643
- });
5644
- };
5645
- return HDRContentRestorer;
5646
- }(engineCore.ContentRestorer);
5647
-
5648
5277
  var JSONLoader = /*#__PURE__*/ function(Loader) {
5649
5278
  _inherits(JSONLoader, Loader);
5650
5279
  function JSONLoader() {
@@ -6047,7 +5676,7 @@ var MaterialLoader = /*#__PURE__*/ function(Loader) {
6047
5676
  }(engineCore.Loader);
6048
5677
  MaterialLoader = __decorate([
6049
5678
  engineCore.resourceLoader(engineCore.AssetType.Material, [
6050
- "json"
5679
+ "mat"
6051
5680
  ])
6052
5681
  ], MaterialLoader);
6053
5682
 
@@ -6170,7 +5799,7 @@ var ProjectLoader = /*#__PURE__*/ function(Loader) {
6170
5799
  }(engineCore.Loader);
6171
5800
  ProjectLoader = __decorate([
6172
5801
  engineCore.resourceLoader(engineCore.AssetType.Project, [
6173
- "proj"
5802
+ "project"
6174
5803
  ], false)
6175
5804
  ], ProjectLoader);
6176
5805
 
@@ -6391,28 +6020,20 @@ TextLoader = __decorate([
6391
6020
  ])
6392
6021
  ], TextLoader);
6393
6022
 
6394
- /**
6395
- * @internal
6396
- */ var Texture2DContentRestorer = /*#__PURE__*/ function(ContentRestorer) {
6397
- _inherits(Texture2DContentRestorer, ContentRestorer);
6398
- function Texture2DContentRestorer(resource, url, requestConfig) {
6399
- var _this;
6400
- _this = ContentRestorer.call(this, resource) || this, _this.url = url, _this.requestConfig = requestConfig;
6401
- return _this;
6402
- }
6403
- var _proto = Texture2DContentRestorer.prototype;
6404
- _proto.restoreContent = function restoreContent() {
6405
- var _this = this;
6406
- return engineCore.request(this.url, this.requestConfig).then(function(image) {
6407
- var resource = _this.resource;
6408
- resource.setImageSource(image);
6409
- resource.generateMipmaps();
6410
- return resource;
6411
- });
6412
- };
6413
- return Texture2DContentRestorer;
6414
- }(engineCore.ContentRestorer);
6415
-
6023
+ function loadImageFromBuffer(buffer) {
6024
+ return new engineCore.AssetPromise(function(resolve, reject) {
6025
+ var blob = new Blob([
6026
+ buffer
6027
+ ]);
6028
+ var img = new Image();
6029
+ img.onload = function() {
6030
+ URL.revokeObjectURL(img.src);
6031
+ resolve(img);
6032
+ };
6033
+ img.onerror = reject;
6034
+ img.src = URL.createObjectURL(blob);
6035
+ });
6036
+ }
6416
6037
  var Texture2DLoader = /*#__PURE__*/ function(Loader) {
6417
6038
  _inherits(Texture2DLoader, Loader);
6418
6039
  function Texture2DLoader() {
@@ -6420,36 +6041,48 @@ var Texture2DLoader = /*#__PURE__*/ function(Loader) {
6420
6041
  }
6421
6042
  var _proto = Texture2DLoader.prototype;
6422
6043
  _proto.load = function load(item, resourceManager) {
6044
+ var _this = this;
6045
+ var url = item.url;
6046
+ var requestConfig = _extends({}, item, {
6047
+ type: "arraybuffer"
6048
+ });
6423
6049
  return new engineCore.AssetPromise(function(resolve, reject, setTaskCompleteProgress, setTaskDetailProgress) {
6424
- var url = item.url;
6425
- var requestConfig = _extends({}, item, {
6426
- type: "image"
6427
- });
6428
6050
  resourceManager// @ts-ignore
6429
- ._request(url, requestConfig).onProgress(setTaskCompleteProgress, setTaskDetailProgress).then(function(image) {
6430
- var _item_params;
6431
- var _ref = (_item_params = item.params) != null ? _item_params : {}, _ref_format = _ref.format, format = _ref_format === void 0 ? engineCore.TextureFormat.R8G8B8A8 : _ref_format, anisoLevel = _ref.anisoLevel, wrapModeU = _ref.wrapModeU, wrapModeV = _ref.wrapModeV, filterMode = _ref.filterMode, _ref_isSRGBColorSpace = _ref.isSRGBColorSpace, isSRGBColorSpace = _ref_isSRGBColorSpace === void 0 ? true : _ref_isSRGBColorSpace, _ref_mipmap = _ref.mipmap, mipmap = _ref_mipmap === void 0 ? true : _ref_mipmap;
6432
- var width = image.width, height = image.height;
6433
- var engine = resourceManager.engine;
6434
- var generateMipmap = engineCore.TextureUtils.supportGenerateMipmapsWithCorrection(engine, width, height, format, mipmap, isSRGBColorSpace);
6435
- var texture = new engineCore.Texture2D(engine, width, height, format, generateMipmap, isSRGBColorSpace);
6436
- texture.anisoLevel = anisoLevel != null ? anisoLevel : texture.anisoLevel;
6437
- texture.filterMode = filterMode != null ? filterMode : texture.filterMode;
6438
- texture.wrapModeU = wrapModeU != null ? wrapModeU : texture.wrapModeU;
6439
- texture.wrapModeV = wrapModeV != null ? wrapModeV : texture.wrapModeV;
6440
- texture.setImageSource(image);
6441
- generateMipmap && texture.generateMipmaps();
6442
- if (url.indexOf("data:") !== 0) {
6443
- var index = url.lastIndexOf("/");
6444
- texture.name = url.substring(index + 1);
6051
+ ._request(url, requestConfig).onProgress(setTaskCompleteProgress, setTaskDetailProgress).then(function(buffer) {
6052
+ if (FileHeader.checkMagic(buffer)) {
6053
+ decode(buffer, resourceManager.engine).then(function(texture) {
6054
+ resourceManager.addContentRestorer(new Texture2DContentRestorer(texture, url, requestConfig));
6055
+ resolve(texture);
6056
+ }, reject);
6057
+ } else {
6058
+ loadImageFromBuffer(buffer).then(function(img) {
6059
+ var texture = _this._createTexture(img, item, resourceManager);
6060
+ resourceManager.addContentRestorer(new Texture2DContentRestorer(texture, url, requestConfig));
6061
+ resolve(texture);
6062
+ }, reject);
6445
6063
  }
6446
- resourceManager.addContentRestorer(new Texture2DContentRestorer(texture, url, requestConfig));
6447
- resolve(texture);
6448
- }).catch(function(e) {
6449
- reject(e);
6450
- });
6064
+ }).catch(reject);
6451
6065
  });
6452
6066
  };
6067
+ _proto._createTexture = function _createTexture(img, item, resourceManager) {
6068
+ var _item_params;
6069
+ var _ref = (_item_params = item.params) != null ? _item_params : {}, _ref_format = _ref.format, format = _ref_format === void 0 ? engineCore.TextureFormat.R8G8B8A8 : _ref_format, anisoLevel = _ref.anisoLevel, wrapModeU = _ref.wrapModeU, wrapModeV = _ref.wrapModeV, filterMode = _ref.filterMode, _ref_isSRGBColorSpace = _ref.isSRGBColorSpace, isSRGBColorSpace = _ref_isSRGBColorSpace === void 0 ? true : _ref_isSRGBColorSpace, _ref_mipmap = _ref.mipmap, mipmap = _ref_mipmap === void 0 ? true : _ref_mipmap;
6070
+ var width = img.width, height = img.height;
6071
+ var engine = resourceManager.engine;
6072
+ var generateMipmap = engineCore.TextureUtils.supportGenerateMipmapsWithCorrection(engine, width, height, format, mipmap, isSRGBColorSpace);
6073
+ var texture = new engineCore.Texture2D(engine, width, height, format, generateMipmap, isSRGBColorSpace);
6074
+ texture.anisoLevel = anisoLevel != null ? anisoLevel : texture.anisoLevel;
6075
+ texture.filterMode = filterMode != null ? filterMode : texture.filterMode;
6076
+ texture.wrapModeU = wrapModeU != null ? wrapModeU : texture.wrapModeU;
6077
+ texture.wrapModeV = wrapModeV != null ? wrapModeV : texture.wrapModeV;
6078
+ texture.setImageSource(img);
6079
+ generateMipmap && texture.generateMipmaps();
6080
+ var url = item.url;
6081
+ if (url.indexOf("data:") !== 0) {
6082
+ texture.name = url.substring(url.lastIndexOf("/") + 1);
6083
+ }
6084
+ return texture;
6085
+ };
6453
6086
  return Texture2DLoader;
6454
6087
  }(engineCore.Loader);
6455
6088
  Texture2DLoader = __decorate([
@@ -6457,40 +6090,319 @@ Texture2DLoader = __decorate([
6457
6090
  "png",
6458
6091
  "jpg",
6459
6092
  "webp",
6460
- "jpeg"
6093
+ "jpeg",
6094
+ "tex"
6461
6095
  ])
6462
6096
  ], Texture2DLoader);
6463
-
6464
- /**
6465
- * @internal
6466
- */ var TextureCubeContentRestorer = /*#__PURE__*/ function(ContentRestorer) {
6467
- _inherits(TextureCubeContentRestorer, ContentRestorer);
6468
- function TextureCubeContentRestorer(resource, urls, requestConfig) {
6097
+ var Texture2DContentRestorer = /*#__PURE__*/ function(ContentRestorer) {
6098
+ _inherits(Texture2DContentRestorer, ContentRestorer);
6099
+ function Texture2DContentRestorer(resource, url, requestConfig) {
6469
6100
  var _this;
6470
- _this = ContentRestorer.call(this, resource) || this, _this.urls = urls, _this.requestConfig = requestConfig;
6101
+ _this = ContentRestorer.call(this, resource) || this, _this.url = url, _this.requestConfig = requestConfig;
6471
6102
  return _this;
6472
6103
  }
6473
- var _proto = TextureCubeContentRestorer.prototype;
6104
+ var _proto = Texture2DContentRestorer.prototype;
6474
6105
  _proto.restoreContent = function restoreContent() {
6475
- var _this = this;
6476
- return new engineCore.AssetPromise(function(resolve, reject) {
6477
- Promise.all(_this.urls.map(function(url) {
6478
- return engineCore.request(url, _this.requestConfig);
6479
- })).then(function(images) {
6480
- var resource = _this.resource;
6481
- for(var faceIndex = 0; faceIndex < 6; faceIndex++){
6482
- resource.setImageSource(engineCore.TextureCubeFace.PositiveX + faceIndex, images[faceIndex], 0);
6483
- }
6484
- resource.generateMipmaps();
6485
- resolve(resource);
6486
- }).catch(function(e) {
6487
- reject(e);
6488
- });
6106
+ var texture = this.resource;
6107
+ var engine = texture.engine;
6108
+ return engine.resourceManager// @ts-ignore
6109
+ ._request(this.url, this.requestConfig).then(function(buffer) {
6110
+ if (FileHeader.checkMagic(buffer)) {
6111
+ return decode(buffer, engine, texture);
6112
+ } else {
6113
+ return loadImageFromBuffer(buffer).then(function(img) {
6114
+ texture.setImageSource(img);
6115
+ texture.generateMipmaps();
6116
+ return texture;
6117
+ });
6118
+ }
6489
6119
  });
6490
6120
  };
6491
- return TextureCubeContentRestorer;
6121
+ return Texture2DContentRestorer;
6492
6122
  }(engineCore.ContentRestorer);
6493
6123
 
6124
+ /**
6125
+ * @internal
6126
+ * HDR panorama to cubemap decoder.
6127
+ */ var HDRDecoder = /*#__PURE__*/ function() {
6128
+ function HDRDecoder() {}
6129
+ HDRDecoder.parseHeader = function parseHeader(uint8array) {
6130
+ var line = this._readStringLine(uint8array, 0);
6131
+ if (line[0] !== "#" || line[1] !== "?") {
6132
+ throw "HDRDecoder: invalid file header";
6133
+ }
6134
+ var endOfHeader = false;
6135
+ var findFormat = false;
6136
+ var lineIndex = 0;
6137
+ do {
6138
+ lineIndex += line.length + 1;
6139
+ line = this._readStringLine(uint8array, lineIndex);
6140
+ if (line === "FORMAT=32-bit_rle_rgbe") findFormat = true;
6141
+ else if (line.length === 0) endOfHeader = true;
6142
+ }while (!endOfHeader);
6143
+ if (!findFormat) {
6144
+ throw "HDRDecoder: unsupported format, expected 32-bit_rle_rgbe";
6145
+ }
6146
+ lineIndex += line.length + 1;
6147
+ line = this._readStringLine(uint8array, lineIndex);
6148
+ var match = /^\-Y (.*) \+X (.*)$/g.exec(line);
6149
+ if (!match || match.length < 3) {
6150
+ throw "HDRDecoder: missing image size, only -Y +X layout is supported";
6151
+ }
6152
+ var width = parseInt(match[2]);
6153
+ var height = parseInt(match[1]);
6154
+ if (width < 8 || width > 0x7fff) {
6155
+ throw "HDRDecoder: unsupported image width, must be between 8 and 32767";
6156
+ }
6157
+ return {
6158
+ height: height,
6159
+ width: width,
6160
+ dataPosition: lineIndex + line.length + 1
6161
+ };
6162
+ };
6163
+ HDRDecoder.decodeFaces = function decodeFaces(bufferArray, header, onFace) {
6164
+ var width = header.width, height = header.height, dataPosition = header.dataPosition;
6165
+ var cubeSize = height >> 1;
6166
+ var pixels = HDRDecoder._readPixels(bufferArray.subarray(dataPosition), width, height);
6167
+ var faces = HDRDecoder._faces;
6168
+ var faceBuffer = new Uint16Array(cubeSize * cubeSize * 4);
6169
+ for(var faceIndex = 0; faceIndex < 6; faceIndex++){
6170
+ HDRDecoder._createCubemapData(cubeSize, faces[faceIndex], pixels, width, height, faceBuffer);
6171
+ onFace(faceIndex, faceBuffer);
6172
+ }
6173
+ };
6174
+ HDRDecoder._generateFloat2HalfTables = function _generateFloat2HalfTables() {
6175
+ var baseTable = new Uint32Array(512);
6176
+ var shiftTable = new Uint32Array(512);
6177
+ for(var i = 0; i < 256; ++i){
6178
+ var e = i - 127;
6179
+ if (e < -27) {
6180
+ baseTable[i] = 0x0000;
6181
+ baseTable[i | 0x100] = 0x8000;
6182
+ shiftTable[i] = 24;
6183
+ shiftTable[i | 0x100] = 24;
6184
+ } else if (e < -14) {
6185
+ baseTable[i] = 0x0400 >> -e - 14;
6186
+ baseTable[i | 0x100] = 0x0400 >> -e - 14 | 0x8000;
6187
+ shiftTable[i] = -e - 1;
6188
+ shiftTable[i | 0x100] = -e - 1;
6189
+ } else if (e <= 15) {
6190
+ baseTable[i] = e + 15 << 10;
6191
+ baseTable[i | 0x100] = e + 15 << 10 | 0x8000;
6192
+ shiftTable[i] = 13;
6193
+ shiftTable[i | 0x100] = 13;
6194
+ } else if (e < 128) {
6195
+ baseTable[i] = 0x7c00;
6196
+ baseTable[i | 0x100] = 0xfc00;
6197
+ shiftTable[i] = 24;
6198
+ shiftTable[i | 0x100] = 24;
6199
+ } else {
6200
+ baseTable[i] = 0x7c00;
6201
+ baseTable[i | 0x100] = 0xfc00;
6202
+ shiftTable[i] = 13;
6203
+ shiftTable[i | 0x100] = 13;
6204
+ }
6205
+ }
6206
+ return {
6207
+ baseTable: baseTable,
6208
+ shiftTable: shiftTable
6209
+ };
6210
+ };
6211
+ HDRDecoder._createCubemapData = function _createCubemapData(texSize, face, pixels, inputWidth, inputHeight, facePixels) {
6212
+ var invSize = 1 / texSize;
6213
+ var rotDX1X = (face[3] - face[0]) * invSize;
6214
+ var rotDX1Y = (face[4] - face[1]) * invSize;
6215
+ var rotDX1Z = (face[5] - face[2]) * invSize;
6216
+ var rotDX2X = (face[9] - face[6]) * invSize;
6217
+ var rotDX2Y = (face[10] - face[7]) * invSize;
6218
+ var rotDX2Z = (face[11] - face[8]) * invSize;
6219
+ var floatView = HDRDecoder._floatView;
6220
+ var uint32View = HDRDecoder._uint32View;
6221
+ var _HDRDecoder__float2HalfTables = HDRDecoder._float2HalfTables, baseTable = _HDRDecoder__float2HalfTables.baseTable, shiftTable = _HDRDecoder__float2HalfTables.shiftTable;
6222
+ var one = HDRDecoder._one;
6223
+ var fy = 0;
6224
+ for(var y = 0; y < texSize; y++){
6225
+ var xv1X = face[0], xv1Y = face[1], xv1Z = face[2];
6226
+ var xv2X = face[6], xv2Y = face[7], xv2Z = face[8];
6227
+ for(var x = 0; x < texSize; x++){
6228
+ var dirX = xv1X + (xv2X - xv1X) * fy;
6229
+ var dirY = xv1Y + (xv2Y - xv1Y) * fy;
6230
+ var dirZ = xv1Z + (xv2Z - xv1Z) * fy;
6231
+ var invLen = 1 / Math.sqrt(dirX * dirX + dirY * dirY + dirZ * dirZ);
6232
+ dirX *= invLen;
6233
+ dirY *= invLen;
6234
+ dirZ *= invLen;
6235
+ var px = Math.round((Math.atan2(dirZ, dirX) / Math.PI * 0.5 + 0.5) * inputWidth);
6236
+ if (px < 0) px = 0;
6237
+ else if (px >= inputWidth) px = inputWidth - 1;
6238
+ var py = Math.round(Math.acos(dirY) / Math.PI * inputHeight);
6239
+ if (py < 0) py = 0;
6240
+ else if (py >= inputHeight) py = inputHeight - 1;
6241
+ var srcIndex = (inputHeight - py - 1) * inputWidth * 4 + px * 4;
6242
+ var scaleFactor = Math.pow(2, pixels[srcIndex + 3] - 128) / 255;
6243
+ var dstIndex = y * texSize * 4 + x * 4;
6244
+ for(var c = 0; c < 3; c++){
6245
+ floatView[0] = pixels[srcIndex + c] * scaleFactor;
6246
+ var f = uint32View[0];
6247
+ var e = f >> 23 & 0x1ff;
6248
+ facePixels[dstIndex + c] = baseTable[e] + ((f & 0x007fffff) >> shiftTable[e]);
6249
+ }
6250
+ facePixels[dstIndex + 3] = one;
6251
+ xv1X += rotDX1X;
6252
+ xv1Y += rotDX1Y;
6253
+ xv1Z += rotDX1Z;
6254
+ xv2X += rotDX2X;
6255
+ xv2Y += rotDX2Y;
6256
+ xv2Z += rotDX2Z;
6257
+ }
6258
+ fy += invSize;
6259
+ }
6260
+ };
6261
+ HDRDecoder._readStringLine = function _readStringLine(uint8array, startIndex) {
6262
+ var line = "";
6263
+ for(var i = startIndex, n = uint8array.length; i < n; i++){
6264
+ var character = String.fromCharCode(uint8array[i]);
6265
+ if (character === "\n") break;
6266
+ line += character;
6267
+ }
6268
+ return line;
6269
+ };
6270
+ HDRDecoder._readPixels = function _readPixels(buffer, width, height) {
6271
+ var byteLength = buffer.byteLength;
6272
+ var dataRGBA = new Uint8Array(4 * width * height);
6273
+ var offset = 0;
6274
+ var pos = 0;
6275
+ var ptrEnd = 4 * width;
6276
+ var scanLineBuffer = new Uint8Array(ptrEnd);
6277
+ var numScanLines = height;
6278
+ while(numScanLines > 0 && pos < byteLength){
6279
+ var a = buffer[pos++];
6280
+ var b = buffer[pos++];
6281
+ var c = buffer[pos++];
6282
+ var d = buffer[pos++];
6283
+ if (a !== 2 || b !== 2 || c & 0x80 || width < 8 || width > 32767) return buffer;
6284
+ if ((c << 8 | d) !== width) throw "HDRDecoder: wrong scanline width";
6285
+ var ptr = 0;
6286
+ while(ptr < ptrEnd && pos < byteLength){
6287
+ var count = buffer[pos++];
6288
+ var isEncodedRun = count > 128;
6289
+ if (isEncodedRun) count -= 128;
6290
+ if (count === 0 || ptr + count > ptrEnd) throw "HDRDecoder: bad scanline data";
6291
+ if (isEncodedRun) {
6292
+ var byteValue = buffer[pos++];
6293
+ for(var i = 0; i < count; i++)scanLineBuffer[ptr++] = byteValue;
6294
+ } else {
6295
+ scanLineBuffer.set(buffer.subarray(pos, pos + count), ptr);
6296
+ ptr += count;
6297
+ pos += count;
6298
+ }
6299
+ }
6300
+ for(var i1 = 0; i1 < width; i1++, offset += 4){
6301
+ dataRGBA[offset] = scanLineBuffer[i1];
6302
+ dataRGBA[offset + 1] = scanLineBuffer[i1 + width];
6303
+ dataRGBA[offset + 2] = scanLineBuffer[i1 + width * 2];
6304
+ dataRGBA[offset + 3] = scanLineBuffer[i1 + width * 3];
6305
+ }
6306
+ numScanLines--;
6307
+ }
6308
+ return dataRGBA;
6309
+ };
6310
+ return HDRDecoder;
6311
+ }();
6312
+ // Float32 to Float16 lookup tables (http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf)
6313
+ HDRDecoder._float2HalfTables = HDRDecoder._generateFloat2HalfTables();
6314
+ HDRDecoder._floatView = new Float32Array(1);
6315
+ HDRDecoder._uint32View = new Uint32Array(HDRDecoder._floatView.buffer);
6316
+ HDRDecoder._one = 0x3c00 // Half float for 1.0
6317
+ ;
6318
+ // prettier-ignore
6319
+ HDRDecoder._faces = [
6320
+ /* +X */ [
6321
+ 1,
6322
+ -1,
6323
+ -1,
6324
+ 1,
6325
+ -1,
6326
+ 1,
6327
+ 1,
6328
+ 1,
6329
+ -1,
6330
+ 1,
6331
+ 1,
6332
+ 1
6333
+ ],
6334
+ /* -X */ [
6335
+ -1,
6336
+ -1,
6337
+ 1,
6338
+ -1,
6339
+ -1,
6340
+ -1,
6341
+ -1,
6342
+ 1,
6343
+ 1,
6344
+ -1,
6345
+ 1,
6346
+ -1
6347
+ ],
6348
+ /* +Y */ [
6349
+ -1,
6350
+ -1,
6351
+ 1,
6352
+ 1,
6353
+ -1,
6354
+ 1,
6355
+ -1,
6356
+ -1,
6357
+ -1,
6358
+ 1,
6359
+ -1,
6360
+ -1
6361
+ ],
6362
+ /* -Y */ [
6363
+ -1,
6364
+ 1,
6365
+ -1,
6366
+ 1,
6367
+ 1,
6368
+ -1,
6369
+ -1,
6370
+ 1,
6371
+ 1,
6372
+ 1,
6373
+ 1,
6374
+ 1
6375
+ ],
6376
+ /* +Z */ [
6377
+ -1,
6378
+ -1,
6379
+ -1,
6380
+ 1,
6381
+ -1,
6382
+ -1,
6383
+ -1,
6384
+ 1,
6385
+ -1,
6386
+ 1,
6387
+ 1,
6388
+ -1
6389
+ ],
6390
+ /* -Z */ [
6391
+ 1,
6392
+ -1,
6393
+ 1,
6394
+ -1,
6395
+ -1,
6396
+ 1,
6397
+ 1,
6398
+ 1,
6399
+ 1,
6400
+ -1,
6401
+ 1,
6402
+ 1
6403
+ ]
6404
+ ];
6405
+
6494
6406
  var TextureCubeLoader = /*#__PURE__*/ function(Loader) {
6495
6407
  _inherits(TextureCubeLoader, Loader);
6496
6408
  function TextureCubeLoader() {
@@ -6498,6 +6410,44 @@ var TextureCubeLoader = /*#__PURE__*/ function(Loader) {
6498
6410
  }
6499
6411
  var _proto = TextureCubeLoader.prototype;
6500
6412
  _proto.load = function load(item, resourceManager) {
6413
+ if (item.urls) {
6414
+ return this._loadCubeFaces(item, resourceManager);
6415
+ } else {
6416
+ return this._loadHDR(item, resourceManager);
6417
+ }
6418
+ };
6419
+ _proto._loadHDR = function _loadHDR(item, resourceManager) {
6420
+ return new engineCore.AssetPromise(function(resolve, reject) {
6421
+ var engine = resourceManager.engine;
6422
+ var url = item.url;
6423
+ var requestConfig = _extends({}, item, {
6424
+ type: "arraybuffer"
6425
+ });
6426
+ resourceManager// @ts-ignore
6427
+ ._request(url, requestConfig).then(function(buffer) {
6428
+ if (!engineCore.SystemInfo.supportsTextureFormat(engine, engineCore.TextureFormat.R16G16B16A16)) {
6429
+ reject(new Error("TextureCubeLoader: HDR texture requires half float support."));
6430
+ return;
6431
+ }
6432
+ var _item_params;
6433
+ var _ref = (_item_params = item.params) != null ? _item_params : {}, _ref_mipmap = _ref.mipmap, mipmap = _ref_mipmap === void 0 ? true : _ref_mipmap, anisoLevel = _ref.anisoLevel, wrapModeU = _ref.wrapModeU, wrapModeV = _ref.wrapModeV, filterMode = _ref.filterMode;
6434
+ var bufferArray = new Uint8Array(buffer);
6435
+ var header = HDRDecoder.parseHeader(bufferArray);
6436
+ var texture = new engineCore.TextureCube(engine, header.height >> 1, engineCore.TextureFormat.R16G16B16A16, mipmap, false);
6437
+ HDRDecoder.decodeFaces(bufferArray, header, function(faceIndex, data) {
6438
+ texture.setPixelBuffer(engineCore.TextureCubeFace.PositiveX + faceIndex, data, 0);
6439
+ });
6440
+ texture.generateMipmaps();
6441
+ texture.anisoLevel = anisoLevel != null ? anisoLevel : texture.anisoLevel;
6442
+ texture.filterMode = filterMode != null ? filterMode : texture.filterMode;
6443
+ texture.wrapModeU = wrapModeU != null ? wrapModeU : texture.wrapModeU;
6444
+ texture.wrapModeV = wrapModeV != null ? wrapModeV : texture.wrapModeV;
6445
+ resourceManager.addContentRestorer(new HDRContentRestorer(texture, url, requestConfig));
6446
+ resolve(texture);
6447
+ }).catch(reject);
6448
+ });
6449
+ };
6450
+ _proto._loadCubeFaces = function _loadCubeFaces(item, resourceManager) {
6501
6451
  return new engineCore.AssetPromise(function(resolve, reject) {
6502
6452
  var urls = item.urls;
6503
6453
  var requestConfig = _extends({}, item, {
@@ -6511,7 +6461,7 @@ var TextureCubeLoader = /*#__PURE__*/ function(Loader) {
6511
6461
  var _ref = (_item_params = item.params) != null ? _item_params : {}, _ref_format = _ref.format, format = _ref_format === void 0 ? engineCore.TextureFormat.R8G8B8A8 : _ref_format, anisoLevel = _ref.anisoLevel, wrapModeU = _ref.wrapModeU, wrapModeV = _ref.wrapModeV, filterMode = _ref.filterMode, _ref_isSRGBColorSpace = _ref.isSRGBColorSpace, isSRGBColorSpace = _ref_isSRGBColorSpace === void 0 ? true : _ref_isSRGBColorSpace, _ref_mipmap = _ref.mipmap, mipmap = _ref_mipmap === void 0 ? true : _ref_mipmap;
6512
6462
  var _images_ = images[0], width = _images_.width, height = _images_.height;
6513
6463
  if (width !== height) {
6514
- console.error("The cube texture must have the same width and height");
6464
+ reject(new Error("The cube texture must have the same width and height"));
6515
6465
  return;
6516
6466
  }
6517
6467
  var engine = resourceManager.engine;
@@ -6524,21 +6474,70 @@ var TextureCubeLoader = /*#__PURE__*/ function(Loader) {
6524
6474
  for(var faceIndex = 0; faceIndex < 6; faceIndex++){
6525
6475
  texture.setImageSource(engineCore.TextureCubeFace.PositiveX + faceIndex, images[faceIndex], 0);
6526
6476
  }
6527
- generateMipmap && texture.generateMipmaps();
6528
- resourceManager.addContentRestorer(new TextureCubeContentRestorer(texture, urls, requestConfig));
6477
+ texture.generateMipmaps();
6478
+ resourceManager.addContentRestorer(new CubeFaceContentRestorer(texture, urls, requestConfig));
6529
6479
  resolve(texture);
6530
- }).catch(function(e) {
6531
- reject(e);
6532
- });
6480
+ }).catch(reject);
6533
6481
  });
6534
6482
  };
6535
6483
  return TextureCubeLoader;
6536
6484
  }(engineCore.Loader);
6537
6485
  TextureCubeLoader = __decorate([
6538
6486
  engineCore.resourceLoader(engineCore.AssetType.TextureCube, [
6539
- ""
6487
+ "texCube",
6488
+ "hdr"
6540
6489
  ])
6541
6490
  ], TextureCubeLoader);
6491
+ var HDRContentRestorer = /*#__PURE__*/ function(ContentRestorer) {
6492
+ _inherits(HDRContentRestorer, ContentRestorer);
6493
+ function HDRContentRestorer(resource, url, requestConfig) {
6494
+ var _this;
6495
+ _this = ContentRestorer.call(this, resource) || this, _this.url = url, _this.requestConfig = requestConfig;
6496
+ return _this;
6497
+ }
6498
+ var _proto = HDRContentRestorer.prototype;
6499
+ _proto.restoreContent = function restoreContent() {
6500
+ var _this = this;
6501
+ return new engineCore.AssetPromise(function(resolve, reject) {
6502
+ var resource = _this.resource;
6503
+ resource.engine.resourceManager// @ts-ignore
6504
+ ._request(_this.url, _this.requestConfig).then(function(buffer) {
6505
+ var bufferArray = new Uint8Array(buffer);
6506
+ HDRDecoder.decodeFaces(bufferArray, HDRDecoder.parseHeader(bufferArray), function(faceIndex, data) {
6507
+ resource.setPixelBuffer(engineCore.TextureCubeFace.PositiveX + faceIndex, data, 0);
6508
+ });
6509
+ resource.generateMipmaps();
6510
+ resolve(resource);
6511
+ }).catch(reject);
6512
+ });
6513
+ };
6514
+ return HDRContentRestorer;
6515
+ }(engineCore.ContentRestorer);
6516
+ var CubeFaceContentRestorer = /*#__PURE__*/ function(ContentRestorer) {
6517
+ _inherits(CubeFaceContentRestorer, ContentRestorer);
6518
+ function CubeFaceContentRestorer(resource, urls, requestConfig) {
6519
+ var _this;
6520
+ _this = ContentRestorer.call(this, resource) || this, _this.urls = urls, _this.requestConfig = requestConfig;
6521
+ return _this;
6522
+ }
6523
+ var _proto = CubeFaceContentRestorer.prototype;
6524
+ _proto.restoreContent = function restoreContent() {
6525
+ var _this = this;
6526
+ return new engineCore.AssetPromise(function(resolve, reject) {
6527
+ Promise.all(_this.urls.map(function(url) {
6528
+ return engineCore.request(url, _this.requestConfig);
6529
+ })).then(function(images) {
6530
+ var resource = _this.resource;
6531
+ for(var faceIndex = 0; faceIndex < 6; faceIndex++){
6532
+ resource.setImageSource(engineCore.TextureCubeFace.PositiveX + faceIndex, images[faceIndex], 0);
6533
+ }
6534
+ resource.generateMipmaps();
6535
+ resolve(resource);
6536
+ }).catch(reject);
6537
+ });
6538
+ };
6539
+ return CubeFaceContentRestorer;
6540
+ }(engineCore.ContentRestorer);
6542
6541
 
6543
6542
  var AudioLoader = /*#__PURE__*/ function(Loader) {
6544
6543
  _inherits(AudioLoader, Loader);
@@ -6688,7 +6687,7 @@ var PhysicsMaterialLoader = /*#__PURE__*/ function(Loader) {
6688
6687
  }(engineCore.Loader);
6689
6688
  PhysicsMaterialLoader = __decorate([
6690
6689
  engineCore.resourceLoader(engineCore.AssetType.PhysicsMaterial, [
6691
- "mesh"
6690
+ "physMat"
6692
6691
  ])
6693
6692
  ], PhysicsMaterialLoader);
6694
6693
 
@@ -6723,7 +6722,6 @@ var SceneLoader = /*#__PURE__*/ function(Loader) {
6723
6722
  scene.ambientLight.specularIntensity = ambient.specularIntensity;
6724
6723
  scene.ambientLight.diffuseMode = ambient.diffuseMode;
6725
6724
  scene.ambientLight.diffuseSolidColor.copyFrom(ambient.diffuseSolidColor);
6726
- scene.ambientLight.specularTextureDecodeRGBM = true;
6727
6725
  if (useCustomAmbient && ambient.customAmbientLight) {
6728
6726
  promises.push(// @ts-ignore
6729
6727
  resourceManager.getResourceByRef(ambient.customAmbientLight).then(function(ambientLight) {