@galacean/engine-loader 1.0.0-beta.1 → 1.0.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
@@ -1823,21 +1823,31 @@ var GLTFMeshParser = /*#__PURE__*/ function(GLTFParser1) {
1823
1823
  var vertexCount;
1824
1824
  var bufferBindIndex = 0;
1825
1825
  var positions;
1826
- keepMeshData && (positions = new Array(vertexCount));
1826
+ var boneIndices;
1827
+ var boneWeights;
1828
+ if (keepMeshData) {
1829
+ positions = new Array(vertexCount);
1830
+ boneIndices = new Array(vertexCount);
1831
+ boneWeights = new Array(vertexCount);
1832
+ }
1827
1833
  for(var attribute in attributes){
1828
1834
  var accessor = accessors[attributes[attribute]];
1829
1835
  var accessorBuffer = GLTFUtils.getAccessorBuffer(context, gltf.bufferViews, accessor);
1830
1836
  var dataElementSize = GLTFUtils.getAccessorTypeSize(accessor.type);
1831
- var attributeCount = accessor.count;
1837
+ var accessorCount = accessor.count;
1832
1838
  var vertices = accessorBuffer.data;
1833
1839
  var vertexElement = void 0;
1834
1840
  var meshId = mesh.instanceId;
1835
1841
  var vertexBindingInfos = accessorBuffer.vertexBindingInfos;
1836
- var elementFormat = GLTFUtils.getElementFormat(accessor.componentType, dataElementSize, accessor.normalized);
1842
+ var elementNormalized = accessor.normalized;
1843
+ var elementFormat = GLTFUtils.getElementFormat(accessor.componentType, dataElementSize, elementNormalized);
1844
+ var scaleFactor = void 0;
1845
+ elementNormalized && (scaleFactor = GLTFUtils.getNormalizedComponentScale(accessor.componentType));
1846
+ var elementOffset = void 0;
1837
1847
  if (accessorBuffer.interleaved) {
1838
1848
  var byteOffset = accessor.byteOffset || 0;
1839
1849
  var stride = accessorBuffer.stride;
1840
- var elementOffset = byteOffset % stride;
1850
+ elementOffset = byteOffset % stride;
1841
1851
  if (vertexBindingInfos[meshId] === undefined) {
1842
1852
  vertexElement = new engineCore.VertexElement(attribute, elementOffset, elementFormat, bufferBindIndex);
1843
1853
  var vertexBuffer = accessorBuffer.vertexBuffer;
@@ -1853,7 +1863,8 @@ var GLTFMeshParser = /*#__PURE__*/ function(GLTFParser1) {
1853
1863
  vertexElement = new engineCore.VertexElement(attribute, elementOffset, elementFormat, vertexBindingInfos[meshId]);
1854
1864
  }
1855
1865
  } else {
1856
- vertexElement = new engineCore.VertexElement(attribute, 0, elementFormat, bufferBindIndex);
1866
+ elementOffset = 0;
1867
+ vertexElement = new engineCore.VertexElement(attribute, elementOffset, elementFormat, bufferBindIndex);
1857
1868
  var vertexBuffer1 = new engineCore.Buffer(engine, engineCore.BufferBindFlag.VertexBuffer, vertices.byteLength, engineCore.BufferUsage.Static);
1858
1869
  vertexBuffer1.setData(vertices);
1859
1870
  meshRestoreInfo.vertexBuffers.push(new BufferRestoreInfo(vertexBuffer1, accessorBuffer.restoreInfo));
@@ -1862,35 +1873,61 @@ var GLTFMeshParser = /*#__PURE__*/ function(GLTFParser1) {
1862
1873
  }
1863
1874
  vertexElements.push(vertexElement);
1864
1875
  if (attribute === "POSITION") {
1865
- vertexCount = attributeCount;
1876
+ vertexCount = accessorCount;
1866
1877
  var _mesh_bounds = mesh.bounds, min = _mesh_bounds.min, max = _mesh_bounds.max;
1867
1878
  if (accessor.min && accessor.max) {
1868
1879
  min.copyFromArray(accessor.min);
1869
1880
  max.copyFromArray(accessor.max);
1870
1881
  if (keepMeshData) {
1871
- var stride1 = vertices.length / attributeCount;
1872
- for(var j = 0; j < attributeCount; j++){
1873
- var offset = j * stride1;
1874
- positions[j] = new engineMath.Vector3(vertices[offset], vertices[offset + 1], vertices[offset + 2]);
1882
+ var baseOffset = elementOffset / vertices.BYTES_PER_ELEMENT;
1883
+ var stride1 = vertices.length / accessorCount;
1884
+ for(var j = 0; j < accessorCount; j++){
1885
+ var offset = baseOffset + j * stride1;
1886
+ var position = new engineMath.Vector3(vertices[offset], vertices[offset + 1], vertices[offset + 2]);
1887
+ elementNormalized && position.scale(scaleFactor);
1888
+ positions[j] = position;
1875
1889
  }
1876
1890
  }
1877
1891
  } else {
1878
- var position = GLTFMeshParser._tempVector3;
1892
+ var position1 = GLTFMeshParser._tempVector3;
1879
1893
  min.set(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);
1880
1894
  max.set(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);
1881
- var stride2 = vertices.length / attributeCount;
1882
- for(var j1 = 0; j1 < attributeCount; j1++){
1883
- var offset1 = j1 * stride2;
1884
- position.copyFromArray(vertices, offset1);
1885
- engineMath.Vector3.min(min, position, min);
1886
- engineMath.Vector3.max(max, position, max);
1895
+ var baseOffset1 = elementOffset / vertices.BYTES_PER_ELEMENT;
1896
+ var stride2 = vertices.length / accessorCount;
1897
+ for(var j1 = 0; j1 < accessorCount; j1++){
1898
+ var offset1 = baseOffset1 + j1 * stride2;
1899
+ position1.copyFromArray(vertices, offset1);
1900
+ engineMath.Vector3.min(min, position1, min);
1901
+ engineMath.Vector3.max(max, position1, max);
1902
+ if (keepMeshData) {
1903
+ var clonePosition = position1.clone();
1904
+ elementNormalized && clonePosition.scale(scaleFactor);
1905
+ positions[j1] = clonePosition;
1906
+ }
1887
1907
  }
1888
1908
  }
1889
- if (accessor.normalized) {
1890
- var scaleFactor = GLTFUtils.getNormalizedComponentScale(accessor.componentType);
1909
+ if (elementNormalized) {
1891
1910
  min.scale(scaleFactor);
1892
1911
  max.scale(scaleFactor);
1893
1912
  }
1913
+ } else if (attribute === "JOINTS_0" && keepMeshData) {
1914
+ var baseOffset2 = elementOffset / vertices.BYTES_PER_ELEMENT;
1915
+ var stride3 = vertices.length / accessorCount;
1916
+ for(var j2 = 0; j2 < accessorCount; j2++){
1917
+ var offset2 = baseOffset2 + j2 * stride3;
1918
+ var boneIndex = new engineMath.Vector4(vertices[offset2], vertices[offset2 + 1], vertices[offset2 + 2], vertices[offset2 + 3]);
1919
+ elementNormalized && boneIndex.scale(scaleFactor);
1920
+ boneIndices[j2] = boneIndex;
1921
+ }
1922
+ } else if (attribute === "WEIGHTS_0" && keepMeshData) {
1923
+ var baseOffset3 = elementOffset / vertices.BYTES_PER_ELEMENT;
1924
+ var stride4 = vertices.length / accessorCount;
1925
+ for(var j3 = 0; j3 < accessorCount; j3++){
1926
+ var offset3 = baseOffset3 + j3 * stride4;
1927
+ var boneWeight = new engineMath.Vector4(vertices[offset3], vertices[offset3 + 1], vertices[offset3 + 2], vertices[offset3 + 3]);
1928
+ elementNormalized && boneWeight.scale(scaleFactor);
1929
+ boneWeights[j3] = boneWeight;
1930
+ }
1894
1931
  }
1895
1932
  }
1896
1933
  mesh.setVertexElements(vertexElements);
@@ -1909,6 +1946,10 @@ var GLTFMeshParser = /*#__PURE__*/ function(GLTFParser1) {
1909
1946
  mesh.uploadData(!keepMeshData);
1910
1947
  //@ts-ignore
1911
1948
  mesh._positions = positions;
1949
+ //@ts-ignore
1950
+ mesh._boneIndices = boneIndices;
1951
+ //@ts-ignore
1952
+ mesh._boneWeights = boneWeights;
1912
1953
  return Promise.resolve(mesh);
1913
1954
  };
1914
1955
  /**
@@ -1999,14 +2040,7 @@ var GLTFSceneParser = /*#__PURE__*/ function(GLTFParser1) {
1999
2040
  camera.enabled = false;
2000
2041
  };
2001
2042
  _proto._createRenderer = function _createRenderer(context, glTFNode, entity) {
2002
- var glTFResource = context.glTFResource, glTF = context.glTF;
2003
- var glTFMeshes = glTF.meshes;
2004
- var engine = glTFResource.engine, meshes = glTFResource.meshes, materials = glTFResource.materials, skins = glTFResource.skins;
2005
- var meshID = glTFNode.mesh, skinID = glTFNode.skin;
2006
- var glTFMesh = glTFMeshes[meshID];
2007
- var glTFMeshPrimitives = glTFMesh.primitives;
2008
- var blendShapeWeights = glTFNode.weights || glTFMesh.weights;
2009
- for(var i = 0; i < glTFMeshPrimitives.length; i++){
2043
+ var _loop = function(i) {
2010
2044
  var gltfPrimitive = glTFMeshPrimitives[i];
2011
2045
  var mesh = meshes[meshID][i];
2012
2046
  var renderer = void 0;
@@ -2028,8 +2062,22 @@ var GLTFSceneParser = /*#__PURE__*/ function(GLTFParser1) {
2028
2062
  var materialIndex = gltfPrimitive.material;
2029
2063
  var material = (materials == null ? void 0 : materials[materialIndex]) || GLTFSceneParser._getDefaultMaterial(engine);
2030
2064
  renderer.setMaterial(material);
2065
+ // Enable vertex color if mesh has COLOR_0 vertex element
2066
+ mesh.vertexElements.forEach(function(element) {
2067
+ if (element.semantic === "COLOR_0") {
2068
+ renderer.enableVertexColor = true;
2069
+ }
2070
+ });
2031
2071
  GLTFParser.executeExtensionsAdditiveAndParse(gltfPrimitive.extensions, context, renderer, gltfPrimitive);
2032
- }
2072
+ };
2073
+ var glTFResource = context.glTFResource, glTF = context.glTF;
2074
+ var glTFMeshes = glTF.meshes;
2075
+ var engine = glTFResource.engine, meshes = glTFResource.meshes, materials = glTFResource.materials, skins = glTFResource.skins;
2076
+ var meshID = glTFNode.mesh, skinID = glTFNode.skin;
2077
+ var glTFMesh = glTFMeshes[meshID];
2078
+ var glTFMeshPrimitives = glTFMesh.primitives;
2079
+ var blendShapeWeights = glTFNode.weights || glTFMesh.weights;
2080
+ for(var i = 0; i < glTFMeshPrimitives.length; i++)_loop(i);
2033
2081
  };
2034
2082
  _proto._createAnimator = function _createAnimator(context) {
2035
2083
  if (!context.hasSkinned && !context.glTFResource.animations) {
@@ -2327,7 +2375,9 @@ var GLTFValidator = /*#__PURE__*/ function(GLTFParser1) {
2327
2375
  return _this;
2328
2376
  }
2329
2377
  var _proto = GLTFResource.prototype;
2330
- _proto._onDestroy = function _onDestroy() {
2378
+ /**
2379
+ * @internal
2380
+ */ _proto._onDestroy = function _onDestroy() {
2331
2381
  EngineObject.prototype._onDestroy.call(this);
2332
2382
  this.defaultSceneRoot.destroy();
2333
2383
  this.textures = null;
@@ -2975,6 +3025,15 @@ KTXLoader = __decorate([
2975
3025
  ])
2976
3026
  ], KTXLoader);
2977
3027
 
3028
+ function parseProperty(object, key, value) {
3029
+ if (typeof value === "object") {
3030
+ for(var subKey in value){
3031
+ parseProperty(object[key], subKey, value[subKey]);
3032
+ }
3033
+ } else {
3034
+ object[key] = value;
3035
+ }
3036
+ }
2978
3037
  var MaterialLoader = /*#__PURE__*/ function(Loader) {
2979
3038
  _inherits(MaterialLoader, Loader);
2980
3039
  function MaterialLoader() {
@@ -2986,7 +3045,7 @@ var MaterialLoader = /*#__PURE__*/ function(Loader) {
2986
3045
  return new engineCore.AssetPromise(function(resolve, reject) {
2987
3046
  _this.request(item.url, _extends({}, item, {
2988
3047
  type: "json"
2989
- })).then(function(json) {
3048
+ })).then(function(materialSchema) {
2990
3049
  var _loop = function(key) {
2991
3050
  var _shaderData_key = shaderData[key], type = _shaderData_key.type, value = _shaderData_key.value;
2992
3051
  switch(type){
@@ -3014,27 +3073,8 @@ var MaterialLoader = /*#__PURE__*/ function(Loader) {
3014
3073
  }
3015
3074
  };
3016
3075
  var engine = resourceManager.engine;
3017
- var name = json.name, shader = json.shader, shaderData = json.shaderData, macros = json.macros, renderState = json.renderState;
3018
- var material;
3019
- switch(shader){
3020
- case "pbr":
3021
- material = new engineCore.PBRMaterial(engine);
3022
- break;
3023
- case "pbr-specular":
3024
- material = new engineCore.PBRSpecularMaterial(engine);
3025
- break;
3026
- case "unlit":
3027
- material = new engineCore.UnlitMaterial(engine);
3028
- break;
3029
- case "blinn-phong":
3030
- material = new engineCore.BlinnPhongMaterial(engine);
3031
- break;
3032
- case "bake-pbr":
3033
- // @todo refactor custom shader later
3034
- // @ts-ignore
3035
- material = new engineCore.PBRBaseMaterial(engine, engineCore.Shader.find("bake-pbr"));
3036
- break;
3037
- }
3076
+ var name = materialSchema.name, shader = materialSchema.shader, shaderData = materialSchema.shaderData, macros = materialSchema.macros, renderState = materialSchema.renderState;
3077
+ var material = new engineCore.Material(engine, engineCore.Shader.find(shader));
3038
3078
  material.name = name;
3039
3079
  var texturePromises = new Array();
3040
3080
  var materialShaderData = material.shaderData;
@@ -3047,9 +3087,7 @@ var MaterialLoader = /*#__PURE__*/ function(Loader) {
3047
3087
  materialShaderData.enableMacro(name1, value);
3048
3088
  }
3049
3089
  }
3050
- for(var key1 in renderState){
3051
- material[key1] = renderState[key1];
3052
- }
3090
+ parseProperty(material, "renderState", renderState);
3053
3091
  return Promise.all(texturePromises).then(function() {
3054
3092
  resolve(material);
3055
3093
  });
@@ -3804,6 +3842,12 @@ exports.AnimationClipDecoder = __decorate([
3804
3842
  decoder("AnimationClip")
3805
3843
  ], exports.AnimationClipDecoder);
3806
3844
 
3845
+ exports.SpecularMode = void 0;
3846
+ (function(SpecularMode) {
3847
+ SpecularMode["Sky"] = "Sky";
3848
+ SpecularMode["Custom"] = "Custom";
3849
+ })(exports.SpecularMode || (exports.SpecularMode = {}));
3850
+
3807
3851
  var SceneParserContext = /*#__PURE__*/ function() {
3808
3852
  function SceneParserContext(originalData, scene) {
3809
3853
  this.originalData = originalData;
@@ -4086,7 +4130,7 @@ var SpriteAtlasLoader = /*#__PURE__*/ function(Loader) {
4086
4130
  var atlasItem = atlasItems[i];
4087
4131
  if (atlasItem.img) {
4088
4132
  chainPromises.push(resourceManager.load({
4089
- url: atlasItem.img,
4133
+ url: engineCore.Utils.resolveAbsoluteUrl(item.url, atlasItem.img),
4090
4134
  type: engineCore.AssetType.Texture2D,
4091
4135
  params: {
4092
4136
  format: format,
@@ -4362,47 +4406,63 @@ var SceneLoader = /*#__PURE__*/ function(Loader) {
4362
4406
  // @ts-ignore
4363
4407
  engine.resourceManager.initVirtualResources(data.files);
4364
4408
  return SceneParser.parse(engine, data).then(function(scene) {
4409
+ var promises = [];
4365
4410
  // parse ambient light
4366
4411
  var ambient = data.scene.ambient;
4367
- var ambientLightPromise = Promise.resolve();
4368
- if (ambient.ambientLight) {
4369
- ambientLightPromise = resourceManager// @ts-ignore
4370
- .getResourceByRef(data.scene.ambient.ambientLight).then(function(light) {
4371
- scene.ambientLight = light;
4412
+ var useCustomAmbient = ambient.specularMode === "Custom";
4413
+ if (useCustomAmbient && ambient.customAmbientLight) {
4414
+ // @ts-ignore
4415
+ // prettier-ignore
4416
+ var customAmbientPromise = resourceManager.getResourceByRef(ambient.customAmbientLight).then(function(ambientLight) {
4417
+ scene.ambientLight = ambientLight;
4372
4418
  scene.ambientLight.diffuseIntensity = ambient.diffuseIntensity;
4373
4419
  scene.ambientLight.specularIntensity = ambient.specularIntensity;
4420
+ scene.ambientLight.diffuseMode = ambient.diffuseMode;
4421
+ scene.ambientLight.diffuseSolidColor.copyFrom(ambient.diffuseSolidColor);
4374
4422
  });
4375
- } else {
4376
- scene.ambientLight.diffuseIntensity = ambient.diffuseIntensity;
4377
- scene.ambientLight.specularIntensity = ambient.specularIntensity;
4378
- scene.ambientLight.diffuseSolidColor.copyFrom(ambient.diffuseSolidColor);
4423
+ promises.push(customAmbientPromise);
4424
+ } else if (!useCustomAmbient && ambient.ambientLight) {
4425
+ // @ts-ignore
4426
+ // prettier-ignore
4427
+ var ambientLightPromise = resourceManager.getResourceByRef(ambient.ambientLight).then(function(ambientLight) {
4428
+ scene.ambientLight = ambientLight;
4429
+ scene.ambientLight.diffuseIntensity = ambient.diffuseIntensity;
4430
+ scene.ambientLight.specularIntensity = ambient.specularIntensity;
4431
+ scene.ambientLight.diffuseMode = ambient.diffuseMode;
4432
+ scene.ambientLight.diffuseSolidColor.copyFrom(ambient.diffuseSolidColor);
4433
+ });
4434
+ promises.push(ambientLightPromise);
4379
4435
  }
4380
4436
  var background = data.scene.background;
4381
4437
  scene.background.mode = background.mode;
4382
- var backgroundPromise = Promise.resolve();
4383
4438
  switch(scene.background.mode){
4384
4439
  case engineCore.BackgroundMode.SolidColor:
4385
4440
  scene.background.solidColor.copyFrom(background.color);
4386
4441
  break;
4387
4442
  case engineCore.BackgroundMode.Sky:
4388
- if (background.sky) {
4443
+ if (background.skyMesh && background.skyMaterial) {
4389
4444
  // @ts-ignore
4390
- backgroundPromise = resourceManager.getResourceByRef(background.sky).then(function(light) {
4391
- var sky = scene.background.sky;
4392
- var skyMaterial = new engineCore.SkyBoxMaterial(engine);
4393
- skyMaterial.texture = light.specularTexture;
4394
- skyMaterial.textureDecodeRGBM = true;
4395
- sky.material = skyMaterial;
4396
- sky.mesh = engineCore.PrimitiveMesh.createCuboid(engine, 1, 1, 1);
4445
+ var skyMeshPromise = resourceManager.getResourceByRef(background.skyMesh).then(function(mesh) {
4446
+ scene.background.sky.mesh = mesh;
4397
4447
  });
4448
+ // @ts-ignore
4449
+ // prettier-ignore
4450
+ var skyMaterialPromise = resourceManager.getResourceByRef(background.skyMaterial).then(function(material) {
4451
+ scene.background.sky.material = material;
4452
+ });
4453
+ promises.push(skyMeshPromise, skyMaterialPromise);
4454
+ } else {
4455
+ engineCore.Logger.warn("Sky background mode requires skyMesh and skyMaterial");
4398
4456
  }
4399
4457
  break;
4400
4458
  case engineCore.BackgroundMode.Texture:
4401
4459
  if (background.texture) {
4402
4460
  // @ts-ignore
4403
- backgroundPromise = resourceManager.getResourceByRef(background.texture).then(function(texture) {
4461
+ // prettier-ignore
4462
+ var backgroundPromise = resourceManager.getResourceByRef(background.texture).then(function(texture) {
4404
4463
  scene.background.texture = texture;
4405
4464
  });
4465
+ promises.push(backgroundPromise);
4406
4466
  }
4407
4467
  break;
4408
4468
  }
@@ -4414,10 +4474,7 @@ var SceneLoader = /*#__PURE__*/ function(Loader) {
4414
4474
  if (shadow.shadowDistance != undefined) scene.shadowDistance = shadow.shadowDistance;
4415
4475
  if (shadow.shadowCascades != undefined) scene.shadowCascades = shadow.shadowCascades;
4416
4476
  }
4417
- return Promise.all([
4418
- ambientLightPromise,
4419
- backgroundPromise
4420
- ]).then(function() {
4477
+ return Promise.all(promises).then(function() {
4421
4478
  resolve(scene);
4422
4479
  });
4423
4480
  });
@@ -4677,6 +4734,22 @@ KHR_materials_clearcoat = __decorate([
4677
4734
  registerGLTFExtension("KHR_materials_clearcoat", exports.GLTFExtensionMode.AdditiveParse)
4678
4735
  ], KHR_materials_clearcoat);
4679
4736
 
4737
+ var KHR_materials_ior = /*#__PURE__*/ function(GLTFExtensionParser) {
4738
+ _inherits(KHR_materials_ior, GLTFExtensionParser);
4739
+ function KHR_materials_ior() {
4740
+ return GLTFExtensionParser.apply(this, arguments);
4741
+ }
4742
+ var _proto = KHR_materials_ior.prototype;
4743
+ _proto.additiveParse = function additiveParse(context, material, schema) {
4744
+ var _schema_ior = schema.ior, ior = _schema_ior === void 0 ? 1.5 : _schema_ior;
4745
+ material.ior = ior;
4746
+ };
4747
+ return KHR_materials_ior;
4748
+ }(GLTFExtensionParser);
4749
+ KHR_materials_ior = __decorate([
4750
+ registerGLTFExtension("KHR_materials_ior", exports.GLTFExtensionMode.AdditiveParse)
4751
+ ], KHR_materials_ior);
4752
+
4680
4753
  var KHR_materials_pbrSpecularGlossiness = /*#__PURE__*/ function(GLTFExtensionParser) {
4681
4754
  _inherits(KHR_materials_pbrSpecularGlossiness, GLTFExtensionParser);
4682
4755
  function KHR_materials_pbrSpecularGlossiness() {