{"record":{"id":"a6de42ebf65c653a","repo":"BabylonJS/Babylon.js","slug":"appropriate-material-adapter-class-not-found","errorCode":null,"errorMessage":"Appropriate material adapter class not found","messagePattern":"Appropriate material adapter class not found","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/dev/loaders/src/glTF/2.0/glTFLoader.pure.ts","lineNumber":357,"sourceCode":"\r\n    /**\r\n     * Creates or gets a cached material loading adapter with dynamic imports\r\n     * @param material The material to adapt\r\n     * @returns Promise that resolves to the appropriate adapter\r\n     * @internal\r\n     */\r\n    public _getOrCreateMaterialAdapter(material: Material): IMaterialLoadingAdapter {\r\n        let adapter = this._materialAdapterCache.get(material);\r\n        if (!adapter) {\r\n            const materialImpls = Array.from(this._pbrMaterialImpls.values());\r\n            for (const impl of materialImpls) {\r\n                if (material instanceof impl.materialClass) {\r\n                    adapter = new impl.adapterClass(material);\r\n                    break;\r\n                }\r\n            }\r\n            if (!adapter) {\r\n                throw new Error(`Appropriate material adapter class not found`);\r\n            }\r\n            const createdAdapter = adapter;\r\n            this._materialAdapterCache.set(material, createdAdapter);\r\n            this._materialAdapters.add(createdAdapter);\r\n        }\r\n        return adapter;\r\n    }\r\n\r\n    /** @internal */\r\n    public dispose(): void {\r\n        if (this._disposed) {\r\n            return;\r\n        }\r\n\r\n        this._disposed = true;\r\n\r\n        this._completePromises.length = 0;\r\n\r","sourceCodeStart":339,"sourceCodeEnd":375,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/loaders/src/glTF/2.0/glTFLoader.pure.ts#L339-L375","documentation":"_getOrCreateMaterialAdapter matches a loaded Babylon material against a list of registered adapter implementations (materialClass + adapterClass pairs). If the material's concrete class matches none of the registered implementations, the loop ends with `adapter` undefined and this error is thrown — the loader has no adapter capable of wrapping that material type.","triggerScenarios":"A material created during glTF loading (e.g. PBRMaterial, StandardMaterial, or a material produced by another extension/plugin) whose class is not in the loader's material adapter registry; custom Material subclasses reaching the adapter path.","commonSituations":"Using a Babylon build where an adapter implementation isn't registered (missing/failed plugin, tree-shaken module); a third-party material class flowing into the glTF adapter cache; version mismatch between loader and material classes.","solutions":["Ensure the module registering the needed material adapter implementation is imported (not tree-shaken away)","Upgrade/align Babylon.js packages so loader and material classes match versions","Check what material class triggered it (inspect the material) and whether a plugin should provide its adapter","If you ship a custom material, register an adapter implementation for it before loading"],"exampleFix":"// before\nimport { GLTFLoader } from \"core/Loaders/glTF\"; // adapter implementations never registered\nconst adapter = loader._getOrCreateMaterialAdapter(customMaterial); // throws\n// after\nimport \"core/Loaders/glTF/2.0/glTFMaterialAdapter\"; // registers PBR/Standard material adapters\nconst adapter = loader._getOrCreateMaterialAdapter(pbrMaterial);","handlingStrategy":"try-catch","validationCode":"import \"core/Loaders/glTF/2.0/...\"; // ensure adapter-registration modules are side-effect imported before loading\nif (!(material instanceof PBRMaterial) && !(material instanceof StandardMaterial)) {\n    console.warn(\"Material class has no registered glTF adapter:\", material?.getClassName?.());\n}","typeGuard":"function hasMaterialAdapter(material: unknown): material is PBRMaterial | StandardMaterial {\n    return material instanceof PBRMaterial || material instanceof StandardMaterial;\n}","tryCatchPattern":"try {\n    const adapter = loader._getOrCreateMaterialAdapter(material);\n} catch (e) {\n    if (String(e.message).includes(\"Appropriate material adapter class not found\")) {\n        console.error(`No adapter for material class ${material.getClassName()}; check imports/plugin registration`);\n    } else throw e;\n}","preventionTips":["Side-effect import all glTF material adapter registration modules so they are not tree-shaken","Keep all @babylonjs/* packages on the same version","Register adapters for custom material classes before running the loader","Inspect material.getClassName() when this error occurs to identify the unhandled class"],"tags":["gltf","materials","adapter","plugin-registry"],"backgroundTag":"material-adapter-not-registered","analyzedSha":"0592b347b8a4ee0236089ea86a749cacfdb266d8","analyzedAt":"2026-08-30T15:11:20.442Z","schemaVersion":2},"datasetVersion":"2026-08-30T18:17:15.746Z"}