@onerjs/loaders 8.51.4 → 8.51.5

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.
@@ -1,5 +1,4 @@
1
1
  import { Color3 } from "@onerjs/core/Maths/math.color.js";
2
- import { PBRMaterial } from "@onerjs/core/Materials/PBR/pbrMaterial.js";
3
2
  import { GLTFLoader } from "../glTFLoader.js";
4
3
  import { registerGLTFExtension, unregisterGLTFExtension } from "../glTFLoaderExtensionRegistry.js";
5
4
  const NAME = "KHR_materials_pbrSpecularGlossiness";
@@ -43,34 +42,29 @@ export class KHR_materials_pbrSpecularGlossiness {
43
42
  }
44
43
  // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax
45
44
  _loadSpecularGlossinessPropertiesAsync(context, properties, babylonMaterial) {
46
- if (!(babylonMaterial instanceof PBRMaterial)) {
47
- throw new Error(`${context}: Material type not supported`);
48
- }
45
+ const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);
49
46
  const promises = new Array();
50
- babylonMaterial.metallic = null;
51
- babylonMaterial.roughness = null;
47
+ adapter.configureSpecularGlossiness();
52
48
  if (properties.diffuseFactor) {
53
- babylonMaterial.albedoColor = Color3.FromArray(properties.diffuseFactor);
49
+ adapter.baseColor = Color3.FromArray(properties.diffuseFactor);
54
50
  babylonMaterial.alpha = properties.diffuseFactor[3];
55
51
  }
56
52
  else {
57
- babylonMaterial.albedoColor = Color3.White();
53
+ adapter.baseColor = Color3.White();
58
54
  }
59
- babylonMaterial.reflectivityColor = properties.specularFactor ? Color3.FromArray(properties.specularFactor) : Color3.White();
60
- babylonMaterial.microSurface = properties.glossinessFactor == undefined ? 1 : properties.glossinessFactor;
55
+ adapter.specularColor = properties.specularFactor ? Color3.FromArray(properties.specularFactor) : Color3.White();
56
+ adapter.glossiness = properties.glossinessFactor == undefined ? 1 : properties.glossinessFactor;
61
57
  if (properties.diffuseTexture) {
62
58
  promises.push(this._loader.loadTextureInfoAsync(`${context}/diffuseTexture`, properties.diffuseTexture, (texture) => {
63
59
  texture.name = `${babylonMaterial.name} (Diffuse)`;
64
- babylonMaterial.albedoTexture = texture;
60
+ adapter.baseColorTexture = texture;
65
61
  }));
66
62
  }
67
63
  if (properties.specularGlossinessTexture) {
68
64
  promises.push(this._loader.loadTextureInfoAsync(`${context}/specularGlossinessTexture`, properties.specularGlossinessTexture, (texture) => {
69
65
  texture.name = `${babylonMaterial.name} (Specular Glossiness)`;
70
- babylonMaterial.reflectivityTexture = texture;
71
- babylonMaterial.reflectivityTexture.hasAlpha = true;
66
+ adapter.specularColorTexture = texture;
72
67
  }));
73
- babylonMaterial.useMicroSurfaceFromReflectivityMapAlpha = true;
74
68
  }
75
69
  // eslint-disable-next-line github/no-then
76
70
  return Promise.all(promises).then(() => { });
@@ -1 +1 @@
1
- {"version":3,"file":"KHR_materials_pbrSpecularGlossiness.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { type Material } from \"core/Materials/material\";\r\n\r\nimport { type IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsPbrSpecularGlossiness } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_pbrSpecularGlossiness\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_pbrSpecularGlossiness extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_pbrSpecularGlossiness\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_pbrSpecularGlossiness implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 200;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsPbrSpecularGlossiness>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadSpecularGlossinessPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n this._loader.loadMaterialAlphaProperties(context, material, babylonMaterial);\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadSpecularGlossinessPropertiesAsync(context: string, properties: IKHRMaterialsPbrSpecularGlossiness, babylonMaterial: Material): Promise<void> {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const promises = new Array<Promise<any>>();\r\n\r\n babylonMaterial.metallic = null;\r\n babylonMaterial.roughness = null;\r\n\r\n if (properties.diffuseFactor) {\r\n babylonMaterial.albedoColor = Color3.FromArray(properties.diffuseFactor);\r\n babylonMaterial.alpha = properties.diffuseFactor[3];\r\n } else {\r\n babylonMaterial.albedoColor = Color3.White();\r\n }\r\n\r\n babylonMaterial.reflectivityColor = properties.specularFactor ? Color3.FromArray(properties.specularFactor) : Color3.White();\r\n babylonMaterial.microSurface = properties.glossinessFactor == undefined ? 1 : properties.glossinessFactor;\r\n\r\n if (properties.diffuseTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/diffuseTexture`, properties.diffuseTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Diffuse)`;\r\n babylonMaterial.albedoTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.specularGlossinessTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/specularGlossinessTexture`, properties.specularGlossinessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Specular Glossiness)`;\r\n babylonMaterial.reflectivityTexture = texture;\r\n babylonMaterial.reflectivityTexture.hasAlpha = true;\r\n })\r\n );\r\n\r\n babylonMaterial.useMicroSurfaceFromReflectivityMapAlpha = true;\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_pbrSpecularGlossiness(loader));\r\n"]}
1
+ {"version":3,"file":"KHR_materials_pbrSpecularGlossiness.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { type Material } from \"core/Materials/material\";\r\n\r\nimport { type IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsPbrSpecularGlossiness } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_pbrSpecularGlossiness\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_pbrSpecularGlossiness extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_pbrSpecularGlossiness\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_pbrSpecularGlossiness implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 200;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsPbrSpecularGlossiness>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadSpecularGlossinessPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n this._loader.loadMaterialAlphaProperties(context, material, babylonMaterial);\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadSpecularGlossinessPropertiesAsync(context: string, properties: IKHRMaterialsPbrSpecularGlossiness, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n\r\n const promises = new Array<Promise<any>>();\r\n\r\n adapter.configureSpecularGlossiness();\r\n\r\n if (properties.diffuseFactor) {\r\n adapter.baseColor = Color3.FromArray(properties.diffuseFactor);\r\n babylonMaterial.alpha = properties.diffuseFactor[3];\r\n } else {\r\n adapter.baseColor = Color3.White();\r\n }\r\n\r\n adapter.specularColor = properties.specularFactor ? Color3.FromArray(properties.specularFactor) : Color3.White();\r\n adapter.glossiness = properties.glossinessFactor == undefined ? 1 : properties.glossinessFactor;\r\n\r\n if (properties.diffuseTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/diffuseTexture`, properties.diffuseTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Diffuse)`;\r\n adapter.baseColorTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.specularGlossinessTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/specularGlossinessTexture`, properties.specularGlossinessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Specular Glossiness)`;\r\n adapter.specularColorTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_pbrSpecularGlossiness(loader));\r\n"]}
@@ -72,6 +72,8 @@ type PBRMaterialImplementation = {
72
72
  export declare class GLTFLoader implements IGLTFLoader {
73
73
  /** @internal */
74
74
  readonly _completePromises: Promise<unknown>[];
75
+ /** AbortController used to cancel in-flight finalizeAsync() calls when dispose() is called. */
76
+ private _finalizeController;
75
77
  /** @internal */
76
78
  _assetContainer: Nullable<AssetContainer>;
77
79
  /** Storage */
@@ -182,6 +182,8 @@ export class GLTFLoader {
182
182
  constructor(parent) {
183
183
  /** @internal */
184
184
  this._completePromises = new Array();
185
+ /** AbortController used to cancel in-flight finalizeAsync() calls when dispose() is called. */
186
+ this._finalizeController = null;
185
187
  /** @internal */
186
188
  this._assetContainer = null;
187
189
  /** Storage */
@@ -234,12 +236,11 @@ export class GLTFLoader {
234
236
  return;
235
237
  }
236
238
  this._disposed = true;
239
+ this._finalizeController?.abort();
240
+ this._finalizeController = null;
237
241
  this._completePromises.length = 0;
238
242
  this._extensions.forEach((extension) => extension.dispose && extension.dispose());
239
243
  this._extensions.length = 0;
240
- for (const adapter of Array.from(this._materialAdapters)) {
241
- adapter.finalize?.();
242
- }
243
244
  this._materialAdapters.clear();
244
245
  this._gltf = null; // TODO
245
246
  this._bin = null;
@@ -378,6 +379,27 @@ export class GLTFLoader {
378
379
  mat.maxSimultaneousLights = Math.max(mat.maxSimultaneousLights, this._babylonScene.lights.length);
379
380
  }
380
381
  }
382
+ // Finalize all material adapters. finalizeAsync() may return a Promise for async
383
+ // work (e.g. GPU texture processing); push any such promises into
384
+ // _completePromises so they are awaited before the COMPLETE state is reached.
385
+ // Fall back to the deprecated finalize() for third-party adapters that have not
386
+ // yet migrated, logging a warning so authors know to update.
387
+ // An AbortController is created here and aborted in dispose() so that adapters
388
+ // can detect mid-flight disposal and clean up intermediate resources early.
389
+ this._finalizeController = new AbortController();
390
+ const finalizeSignal = this._finalizeController.signal;
391
+ for (const adapter of Array.from(this._materialAdapters)) {
392
+ if (adapter.finalizeAsync) {
393
+ const finalizePromise = adapter.finalizeAsync(finalizeSignal);
394
+ if (finalizePromise) {
395
+ this._completePromises.push(finalizePromise);
396
+ }
397
+ }
398
+ else if (adapter.finalize) {
399
+ Logger.Warn("GLTFLoader: IMaterialLoadingAdapter.finalize() is deprecated. Implement finalizeAsync() instead.");
400
+ adapter.finalize();
401
+ }
402
+ }
381
403
  this._extensionsOnReady();
382
404
  this._parent._setState(GLTFLoaderState.READY);
383
405
  if (!this._skipStartAnimationStep) {