From 81032a365246cbeb8a3de294077bd63ec82eaddd Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Wed, 28 Jan 2026 20:35:22 +0100 Subject: [PATCH 1/4] MaterialLoader: Introduce `registerMaterial()`. --- src/Three.js | 9 +++++++++ src/loaders/MaterialLoader.js | 23 ++++++++++++++++++----- src/materials/Materials.js | 4 ---- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/Three.js b/src/Three.js index b74685f9a473b3..3421d6b960cdeb 100644 --- a/src/Three.js +++ b/src/Three.js @@ -7,4 +7,13 @@ export { UniformsLib } from './renderers/shaders/UniformsLib.js'; export { UniformsUtils } from './renderers/shaders/UniformsUtils.js'; export { ShaderChunk } from './renderers/shaders/ShaderChunk.js'; export { PMREMGenerator } from './extras/PMREMGenerator.js'; +export { ShaderMaterial } from './materials/ShaderMaterial.js'; +export { RawShaderMaterial } from './materials/RawShaderMaterial.js'; export { WebGLUtils } from './renderers/webgl/WebGLUtils.js'; + +import { ShaderMaterial } from './materials/ShaderMaterial.js'; +import { RawShaderMaterial } from './materials/RawShaderMaterial.js'; +import { MaterialLoader } from './loaders/MaterialLoader.js'; + +MaterialLoader.registerMaterial( 'ShaderMaterial', ShaderMaterial ); +MaterialLoader.registerMaterial( 'RawShaderMaterial', RawShaderMaterial ); diff --git a/src/loaders/MaterialLoader.js b/src/loaders/MaterialLoader.js index 6a6c08d39ea650..dd93fcb3bc8e47 100644 --- a/src/loaders/MaterialLoader.js +++ b/src/loaders/MaterialLoader.js @@ -9,8 +9,6 @@ import { Loader } from './Loader.js'; import { ShadowMaterial, SpriteMaterial, - RawShaderMaterial, - ShaderMaterial, PointsMaterial, MeshPhysicalMaterial, MeshStandardMaterial, @@ -28,6 +26,8 @@ import { } from '../materials/Materials.js'; import { error, warn } from '../utils.js'; +const _customMaterials = {}; + /** * Class for loading materials. The files are internally * loaded via {@link FileLoader}. @@ -412,8 +412,6 @@ class MaterialLoader extends Loader { const materialLib = { ShadowMaterial, SpriteMaterial, - RawShaderMaterial, - ShaderMaterial, PointsMaterial, MeshPhysicalMaterial, MeshStandardMaterial, @@ -427,13 +425,28 @@ class MaterialLoader extends Loader { MeshMatcapMaterial, LineDashedMaterial, LineBasicMaterial, - Material + Material, + ... _customMaterials }; return new materialLib[ type ](); } + /** + * Registers the given material at the internal + * material library. + * + * @static + * @param {string} type - The material type. + * @param {Material} materialClass - The material class. + */ + static registerMaterial( type, materialClass ) { + + _customMaterials[ type ] = materialClass; + + } + } export { MaterialLoader }; diff --git a/src/materials/Materials.js b/src/materials/Materials.js index 3497fac568b182..7727cdb7077784 100644 --- a/src/materials/Materials.js +++ b/src/materials/Materials.js @@ -1,7 +1,5 @@ import { ShadowMaterial } from './ShadowMaterial.js'; import { SpriteMaterial } from './SpriteMaterial.js'; -import { RawShaderMaterial } from './RawShaderMaterial.js'; -import { ShaderMaterial } from './ShaderMaterial.js'; import { PointsMaterial } from './PointsMaterial.js'; import { MeshPhysicalMaterial } from './MeshPhysicalMaterial.js'; import { MeshStandardMaterial } from './MeshStandardMaterial.js'; @@ -20,8 +18,6 @@ import { Material } from './Material.js'; export { ShadowMaterial, SpriteMaterial, - RawShaderMaterial, - ShaderMaterial, PointsMaterial, MeshPhysicalMaterial, MeshStandardMaterial, From 2ea844306b6465c9fc6231e0bdebc1358f2451c5 Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Fri, 6 Mar 2026 12:06:17 +0100 Subject: [PATCH 2/4] Three.js: Remove shader material setup. --- src/Three.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Three.js b/src/Three.js index 3421d6b960cdeb..c2980faae0ba96 100644 --- a/src/Three.js +++ b/src/Three.js @@ -10,10 +10,3 @@ export { PMREMGenerator } from './extras/PMREMGenerator.js'; export { ShaderMaterial } from './materials/ShaderMaterial.js'; export { RawShaderMaterial } from './materials/RawShaderMaterial.js'; export { WebGLUtils } from './renderers/webgl/WebGLUtils.js'; - -import { ShaderMaterial } from './materials/ShaderMaterial.js'; -import { RawShaderMaterial } from './materials/RawShaderMaterial.js'; -import { MaterialLoader } from './loaders/MaterialLoader.js'; - -MaterialLoader.registerMaterial( 'ShaderMaterial', ShaderMaterial ); -MaterialLoader.registerMaterial( 'RawShaderMaterial', RawShaderMaterial ); From 73a73ad87f52a34de4581244b7bd3d1dba75584c Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Fri, 6 Mar 2026 12:12:52 +0100 Subject: [PATCH 3/4] MaterialLoader: Improve feedback in `createMaterialFromType()`. --- src/loaders/MaterialLoader.js | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/loaders/MaterialLoader.js b/src/loaders/MaterialLoader.js index dd93fcb3bc8e47..1127970e12e69e 100644 --- a/src/loaders/MaterialLoader.js +++ b/src/loaders/MaterialLoader.js @@ -24,7 +24,7 @@ import { LineBasicMaterial, Material, } from '../materials/Materials.js'; -import { error, warn } from '../utils.js'; +import { error, warn, warnOnce } from '../utils.js'; const _customMaterials = {}; @@ -429,7 +429,22 @@ class MaterialLoader extends Loader { ... _customMaterials }; - return new materialLib[ type ](); + const MaterialType = materialLib[ type ]; + + let materialInstance; + + if ( MaterialType === undefined ) { + + warnOnce( `MaterialLoader: Unknown material type "${ type }". Use .registerMaterial() before starting the deserialization process.` ); + materialInstance = new Material(); + + } else { + + materialInstance = new MaterialType(); + + } + + return materialInstance; } From d11a0aa6ec2030d0e6927c399fa0eb6e28cea2aa Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Fri, 6 Mar 2026 12:47:39 +0100 Subject: [PATCH 4/4] Editor: Register shader materials. --- editor/js/Loader.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/editor/js/Loader.js b/editor/js/Loader.js index 5a5515388d02f5..c10a71180bb1f6 100644 --- a/editor/js/Loader.js +++ b/editor/js/Loader.js @@ -17,6 +17,9 @@ function Loader( editor ) { this.texturePath = ''; + THREE.MaterialLoader.registerMaterial( 'ShaderMaterial', THREE.ShaderMaterial ); + THREE.MaterialLoader.registerMaterial( 'RawShaderMaterial', THREE.RawShaderMaterial ); + this.loadItemList = function ( items ) { LoaderUtils.getFilesFromItemList( items, function ( files, filesMap ) {