From b5fa1e68465fd2f394cfca9e5f5e30ba18672263 Mon Sep 17 00:00:00 2001 From: Sway007 Date: Mon, 11 Mar 2024 20:55:35 +0800 Subject: [PATCH 01/10] feat: add loader for shader asset --- packages/core/src/asset/AssetType.ts | 4 + packages/loader/src/MaterialLoader.ts | 118 +++++++++--------- packages/loader/src/ShaderChunkLoader.ts | 20 +++ packages/loader/src/ShaderLoader.ts | 41 ++++++ packages/loader/src/index.ts | 2 + .../resources/schema/BasicSchema.ts | 2 + .../resources/schema/MaterialSchema.ts | 3 +- 7 files changed, 132 insertions(+), 58 deletions(-) create mode 100644 packages/loader/src/ShaderChunkLoader.ts create mode 100644 packages/loader/src/ShaderLoader.ts diff --git a/packages/core/src/asset/AssetType.ts b/packages/core/src/asset/AssetType.ts index 0da3e4a24f..008af6ea37 100644 --- a/packages/core/src/asset/AssetType.ts +++ b/packages/core/src/asset/AssetType.ts @@ -23,6 +23,10 @@ export enum AssetType { TextureCube = "TextureCube", /** Material. */ Material = "Material", + /** Shader */ + Shader = "Shader", + /** Shader Chunk */ + ShaderChunk = "ShaderChunk", /** Mesh. */ Mesh = "Mesh", /** AnimationClip. */ diff --git a/packages/loader/src/MaterialLoader.ts b/packages/loader/src/MaterialLoader.ts index 6048f24301..e7e0ec09b8 100644 --- a/packages/loader/src/MaterialLoader.ts +++ b/packages/loader/src/MaterialLoader.ts @@ -32,70 +32,74 @@ class MaterialLoader extends Loader { }) .then((materialSchema: IMaterialSchema) => { const engine = resourceManager.engine; - const { name, shader, shaderData, macros, renderState } = materialSchema; - const material = new Material(engine, Shader.find(shader)); - material.name = name; + const { name, shaderData, macros, renderState, shaderRef } = materialSchema; - const texturePromises = new Array>(); - const materialShaderData = material.shaderData; - for (let key in shaderData) { - const { type, value } = shaderData[key]; + // @ts-ignore + resourceManager.getResourceByRef(shaderRef).then((shader) => { + const material = new Material(engine, shader); + material.name = name; - switch (type) { - case "Vector2": - materialShaderData.setVector2(key, new Vector2((value).x, (value).y)); - break; - case "Vector3": - materialShaderData.setVector3( - key, - new Vector3((value).x, (value).y, (value).z) - ); - break; - case "Vector4": - materialShaderData.setVector4( - key, - new Vector4((value).x, (value).y, (value).z, (value).w) - ); - break; - case "Color": - materialShaderData.setColor( - key, - new Color((value).r, (value).g, (value).b, (value).a) - ); - break; - case "Float": - materialShaderData.setFloat(key, value); - break; - case "Texture": - texturePromises.push( - // @ts-ignore - resourceManager.getResourceByRef(value).then((texture) => { - materialShaderData.setTexture(key, texture); - }) - ); - break; - case "Boolean": - materialShaderData.setInt(key, value ? 1 : 0); - break; - case "Integer": - materialShaderData.setInt(key, Number(value)); - break; + const texturePromises = new Array>(); + const materialShaderData = material.shaderData; + for (let key in shaderData) { + const { type, value } = shaderData[key]; + + switch (type) { + case "Vector2": + materialShaderData.setVector2(key, new Vector2((value).x, (value).y)); + break; + case "Vector3": + materialShaderData.setVector3( + key, + new Vector3((value).x, (value).y, (value).z) + ); + break; + case "Vector4": + materialShaderData.setVector4( + key, + new Vector4((value).x, (value).y, (value).z, (value).w) + ); + break; + case "Color": + materialShaderData.setColor( + key, + new Color((value).r, (value).g, (value).b, (value).a) + ); + break; + case "Float": + materialShaderData.setFloat(key, value); + break; + case "Texture": + texturePromises.push( + // @ts-ignore + resourceManager.getResourceByRef(value).then((texture) => { + materialShaderData.setTexture(key, texture); + }) + ); + break; + case "Boolean": + materialShaderData.setInt(key, value ? 1 : 0); + break; + case "Integer": + materialShaderData.setInt(key, Number(value)); + break; + } } - } - for (let i = 0, length = macros.length; i < length; i++) { - const { name, value } = macros[i]; - if (value == undefined) { - materialShaderData.enableMacro(name); - } else { - materialShaderData.enableMacro(name, value); + for (let i = 0, length = macros.length; i < length; i++) { + const { name, value } = macros[i]; + if (value == undefined) { + materialShaderData.enableMacro(name); + } else { + materialShaderData.enableMacro(name, value); + } } - } - parseProperty(material, "renderState", renderState); + parseProperty(material, "renderState", renderState); - return Promise.all(texturePromises).then(() => { - resolve(material); + return Promise.all(texturePromises).then(() => { + resolve(material); + }); }); }) .catch(reject); diff --git a/packages/loader/src/ShaderChunkLoader.ts b/packages/loader/src/ShaderChunkLoader.ts new file mode 100644 index 0000000000..f85229d904 --- /dev/null +++ b/packages/loader/src/ShaderChunkLoader.ts @@ -0,0 +1,20 @@ +import { + AssetPromise, + AssetType, + LoadItem, + Loader, + ResourceManager, + Shader, + ShaderFactory, + resourceLoader +} from "@galacean/engine-core"; + +@resourceLoader(AssetType.ShaderChunk, ["glsl"], false) +class ShaderLoader extends Loader { + load(item: LoadItem, resourceManager: ResourceManager): AssetPromise { + return this.request(item.url, { ...item, type: "text" }).then((code) => { + const { includeKey } = item.params; + ShaderFactory.registerInclude(includeKey, code); + }); + } +} diff --git a/packages/loader/src/ShaderLoader.ts b/packages/loader/src/ShaderLoader.ts new file mode 100644 index 0000000000..5e0cdb705e --- /dev/null +++ b/packages/loader/src/ShaderLoader.ts @@ -0,0 +1,41 @@ +import { + AssetPromise, + AssetType, + LoadItem, + Loader, + ResourceManager, + Shader, + resourceLoader +} from "@galacean/engine-core"; + +@resourceLoader(AssetType.Shader, ["gs", "gsl"], false) +class ShaderLoader extends Loader { + load(item: LoadItem, resourceManager: ResourceManager): AssetPromise { + return this.request(item.url, { ...item, type: "text" }).then((code: string) => { + const builtinShader = this.getBuiltinShader(code); + if (builtinShader) { + return Shader.find(builtinShader); + } + + const matches = code.matchAll(/^[ \t]*#include +"([^$\\"]+)"/gm); + return Promise.all( + Array.from(matches).map((m) => { + const path = m[1]; + if (path) { + // @ts-ignore + const resource = resourceManager._virtualPathMap[path]; + if (!resource) return; + return resourceManager.load({ type: AssetType.ShaderChunk, url: resource, params: { includeKey: path } }); + } + }) + ).then(() => { + return Shader.create(code); + }); + }); + } + + private getBuiltinShader(code: string) { + const match = code.match(/^\s*\/\/\s*@builtin\s+(\w+)/); + if (match && match[1]) return match[1]; + } +} diff --git a/packages/loader/src/index.ts b/packages/loader/src/index.ts index 1983a18981..cd515e8d08 100644 --- a/packages/loader/src/index.ts +++ b/packages/loader/src/index.ts @@ -18,6 +18,8 @@ import "./SpriteLoader"; import "./Texture2DLoader"; import "./TextureCubeLoader"; import "./ktx2/KTX2Loader"; +import "./ShaderLoader"; +import "./ShaderChunkLoader"; export { GLTFLoader } from "./GLTFLoader"; export type { GLTFParams } from "./GLTFLoader"; diff --git a/packages/loader/src/resource-deserialize/resources/schema/BasicSchema.ts b/packages/loader/src/resource-deserialize/resources/schema/BasicSchema.ts index 2a36864ee8..4b58ce321b 100644 --- a/packages/loader/src/resource-deserialize/resources/schema/BasicSchema.ts +++ b/packages/loader/src/resource-deserialize/resources/schema/BasicSchema.ts @@ -92,3 +92,5 @@ export type IBasicType = export type IAssetRef = { key?: string; refId: string }; export type IEntityRef = { entityId: string }; + +export type IShaderRef = { refId: string }; diff --git a/packages/loader/src/resource-deserialize/resources/schema/MaterialSchema.ts b/packages/loader/src/resource-deserialize/resources/schema/MaterialSchema.ts index 377ea86126..8364ac14b7 100644 --- a/packages/loader/src/resource-deserialize/resources/schema/MaterialSchema.ts +++ b/packages/loader/src/resource-deserialize/resources/schema/MaterialSchema.ts @@ -7,7 +7,7 @@ import { RenderQueueType, StencilOperation } from "@galacean/engine-core"; -import type { IAssetRef, IColor, IVector2, IVector3 } from "./BasicSchema"; +import type { IAssetRef, IColor, IShaderRef, IVector2, IVector3 } from "./BasicSchema"; export interface IRenderState { /** Blend state. */ @@ -96,4 +96,5 @@ export interface IMaterialSchema { }; macros: Array<{ name: string; value?: string }>; renderState: IRenderState; + shaderRef: IShaderRef; } From d8d9a873f38d25fba2ffaae2c46b5d4dd37d5453 Mon Sep 17 00:00:00 2001 From: Sway007 Date: Tue, 12 Mar 2024 13:44:15 +0800 Subject: [PATCH 02/10] feat: compatible with 1.2-pre version --- packages/loader/src/MaterialLoader.ts | 145 ++++++++++++++------------ 1 file changed, 80 insertions(+), 65 deletions(-) diff --git a/packages/loader/src/MaterialLoader.ts b/packages/loader/src/MaterialLoader.ts index e7e0ec09b8..99a01ddbdd 100644 --- a/packages/loader/src/MaterialLoader.ts +++ b/packages/loader/src/MaterialLoader.ts @@ -1,6 +1,7 @@ import { AssetPromise, AssetType, + Engine, LoadItem, Loader, Material, @@ -32,77 +33,91 @@ class MaterialLoader extends Loader { }) .then((materialSchema: IMaterialSchema) => { const engine = resourceManager.engine; - const { name, shaderData, macros, renderState, shaderRef } = materialSchema; + const { shaderRef, shader } = materialSchema; - // @ts-ignore - resourceManager.getResourceByRef(shaderRef).then((shader) => { - const material = new Material(engine, shader); - material.name = name; + if (shaderRef) { + resolve( + resourceManager + // @ts-ignore + .getResourceByRef(shaderRef) + .then((shaderObject) => this.getMaterialByShader(materialSchema, shaderObject, engine)) + ); + } else { + // compatible with 1.2-pre version material schema + const shaderObject = Shader.find(shader); + resolve(this.getMaterialByShader(materialSchema, shaderObject, engine)); + } + }) + .catch(reject); + }); + } + + private getMaterialByShader(materialSchema: IMaterialSchema, shader: Shader, engine: Engine): Promise { + const { name, shaderData, macros, renderState } = materialSchema; - const texturePromises = new Array>(); - const materialShaderData = material.shaderData; - for (let key in shaderData) { - const { type, value } = shaderData[key]; + const material = new Material(engine, shader); + material.name = name; - switch (type) { - case "Vector2": - materialShaderData.setVector2(key, new Vector2((value).x, (value).y)); - break; - case "Vector3": - materialShaderData.setVector3( - key, - new Vector3((value).x, (value).y, (value).z) - ); - break; - case "Vector4": - materialShaderData.setVector4( - key, - new Vector4((value).x, (value).y, (value).z, (value).w) - ); - break; - case "Color": - materialShaderData.setColor( - key, - new Color((value).r, (value).g, (value).b, (value).a) - ); - break; - case "Float": - materialShaderData.setFloat(key, value); - break; - case "Texture": - texturePromises.push( - // @ts-ignore - resourceManager.getResourceByRef(value).then((texture) => { - materialShaderData.setTexture(key, texture); - }) - ); - break; - case "Boolean": - materialShaderData.setInt(key, value ? 1 : 0); - break; - case "Integer": - materialShaderData.setInt(key, Number(value)); - break; - } - } + const texturePromises = new Array>(); + const materialShaderData = material.shaderData; + for (let key in shaderData) { + const { type, value } = shaderData[key]; - for (let i = 0, length = macros.length; i < length; i++) { - const { name, value } = macros[i]; - if (value == undefined) { - materialShaderData.enableMacro(name); - } else { - materialShaderData.enableMacro(name, value); - } - } + switch (type) { + case "Vector2": + materialShaderData.setVector2(key, new Vector2((value).x, (value).y)); + break; + case "Vector3": + materialShaderData.setVector3( + key, + new Vector3((value).x, (value).y, (value).z) + ); + break; + case "Vector4": + materialShaderData.setVector4( + key, + new Vector4((value).x, (value).y, (value).z, (value).w) + ); + break; + case "Color": + materialShaderData.setColor( + key, + new Color((value).r, (value).g, (value).b, (value).a) + ); + break; + case "Float": + materialShaderData.setFloat(key, value); + break; + case "Texture": + texturePromises.push( + // @ts-ignore + resourceManager.getResourceByRef(value).then((texture) => { + materialShaderData.setTexture(key, texture); + }) + ); + break; + case "Boolean": + materialShaderData.setInt(key, value ? 1 : 0); + break; + case "Integer": + materialShaderData.setInt(key, Number(value)); + break; + } + } - parseProperty(material, "renderState", renderState); + for (let i = 0, length = macros.length; i < length; i++) { + const { name, value } = macros[i]; + if (value == undefined) { + materialShaderData.enableMacro(name); + } else { + materialShaderData.enableMacro(name, value); + } + } - return Promise.all(texturePromises).then(() => { - resolve(material); - }); - }); - }) - .catch(reject); + parseProperty(material, "renderState", renderState); + + return Promise.all(texturePromises).then(() => { + return material; }); } } From a5f76dcac738b0ddc765c0e4a1a97b8b1d92082d Mon Sep 17 00:00:00 2001 From: Sway007 Date: Mon, 18 Mar 2024 10:10:01 +0800 Subject: [PATCH 03/10] feat: opt code --- packages/shader-lab/src/preprocessor/Preprocessor.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/shader-lab/src/preprocessor/Preprocessor.ts b/packages/shader-lab/src/preprocessor/Preprocessor.ts index 4de2b3ff3a..ecff714b3c 100644 --- a/packages/shader-lab/src/preprocessor/Preprocessor.ts +++ b/packages/shader-lab/src/preprocessor/Preprocessor.ts @@ -129,7 +129,6 @@ export class Preprocessor { const tokenizer = this._tokenizer; const variable = this.consumeToken(this._tokenizer); - if (variable.res?.text === "xxx") debugger; if (!variable.res || variable.end) throw "No defined variable"; if (this._definePairs.get(variable.res.text)) throw `redefined macro: ${variable.res.text}`; From 326afeae90c143ec7de8c6ef8d36646691f11a96 Mon Sep 17 00:00:00 2001 From: Sway007 Date: Fri, 26 Apr 2024 10:47:31 +0800 Subject: [PATCH 04/10] fix: keep macro declaration --- packages/shader-lab/src/RuntimeContext.ts | 5 +---- packages/shader-lab/src/preprocessor/Preprocessor.ts | 8 ++++---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/shader-lab/src/RuntimeContext.ts b/packages/shader-lab/src/RuntimeContext.ts index bad888bc0f..1a2cf6ea01 100644 --- a/packages/shader-lab/src/RuntimeContext.ts +++ b/packages/shader-lab/src/RuntimeContext.ts @@ -314,10 +314,7 @@ export default class RuntimeContext { getExtendedDefineMacros() { return Array.from(this._preprocessor._definePairs.entries()) .map(([k, v]) => { - let ret = `#define ${k}`; - if (!v.isFunction) { - ret += ` ${v.replacer}`; - } + let ret = `#define ${k} ${v.originText}`; return ret; }) .join("\n"); diff --git a/packages/shader-lab/src/preprocessor/Preprocessor.ts b/packages/shader-lab/src/preprocessor/Preprocessor.ts index ecff714b3c..fd1d543671 100644 --- a/packages/shader-lab/src/preprocessor/Preprocessor.ts +++ b/packages/shader-lab/src/preprocessor/Preprocessor.ts @@ -16,8 +16,8 @@ export class Preprocessor { private _curMacroLvl = 0; /** @internal */ - _definePairs: Map = new Map(); - private set definePairs(pairs: Map) { + _definePairs: Map = new Map(); + private set definePairs(pairs: Map) { this._definePairs = pairs; } private _replacers: IReplaceSegment[] = []; @@ -156,9 +156,9 @@ export class Preprocessor { const idx = macroArgs.findIndex((item) => item === m); return args[idx]; }); - this._definePairs.set(variable.res.text, { isFunction: true, replacer }); + this._definePairs.set(variable.res.text, { isFunction: true, replacer, originText: chunk }); } else { - this._definePairs.set(variable.res.text, { isFunction: false, replacer: chunk }); + this._definePairs.set(variable.res.text, { isFunction: false, replacer: chunk, originText: chunk }); } this._replacers.push({ startIdx: macroToken.start.index, endIdx: tokenizer.curIndex, replace: "" }); From a46c5dcb93d1e66cb26f351d67fb03514700b8dd Mon Sep 17 00:00:00 2001 From: Sway007 Date: Fri, 26 Apr 2024 11:04:12 +0800 Subject: [PATCH 05/10] test: add unitest --- tests/src/shader-lab/ShaderLab.test.ts | 4 ++++ tests/src/shader-lab/shaders/demo.shader | 2 ++ 2 files changed, 6 insertions(+) diff --git a/tests/src/shader-lab/ShaderLab.test.ts b/tests/src/shader-lab/ShaderLab.test.ts index 42d59e4422..ea2f80b555 100644 --- a/tests/src/shader-lab/ShaderLab.test.ts +++ b/tests/src/shader-lab/ShaderLab.test.ts @@ -133,6 +133,10 @@ describe("ShaderLab", () => { expect(usePass).to.equal("pbr/Default/Forward"); }); + it("marco completeness", () => { + expect(pass.vertexSource.includes("#define saturate clamp( a, 0.0, 1.0 )")).to.true; + }); + it("render state", () => { expect(pass.renderStates).not.be.null; diff --git a/tests/src/shader-lab/shaders/demo.shader b/tests/src/shader-lab/shaders/demo.shader index 7f7b7a21b3..a529185d3e 100644 --- a/tests/src/shader-lab/shaders/demo.shader +++ b/tests/src/shader-lab/shaders/demo.shader @@ -36,6 +36,8 @@ Shader "Water" { UsePass "pbr/Default/Forward" Pass "default" { + #define saturate( a ) clamp( a, 0.0, 1.0 ) + Tags { ReplacementTag = "Opaque", Tag2 = true, Tag3 = 1.9 } struct a2v { From bfd4b1dfd1367800f70cacd2cd850bee1818491f Mon Sep 17 00:00:00 2001 From: Sway007 Date: Mon, 6 May 2024 14:55:43 +0800 Subject: [PATCH 06/10] fix: macro function & line change --- packages/shader-lab/src/RuntimeContext.ts | 12 ++++++------ packages/shader-lab/src/preprocessor/Preprocessor.ts | 12 ++++++++++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/shader-lab/src/RuntimeContext.ts b/packages/shader-lab/src/RuntimeContext.ts index 1a2cf6ea01..52028b43f9 100644 --- a/packages/shader-lab/src/RuntimeContext.ts +++ b/packages/shader-lab/src/RuntimeContext.ts @@ -138,11 +138,12 @@ export default class RuntimeContext { addDiagnostic(diagnostic: IDiagnostic) { let offset = this._parsingContext.getTextLineOffsetAt(diagnostic.token.start.index); + let token: IPositionRange = { start: { ...diagnostic.token.start }, end: { ...diagnostic.token.end } }; if (offset) { - diagnostic.token.start.line += offset; - diagnostic.token.end.line += offset; + token.start.line += offset; + token.end.line += offset; } - this._diagnostics.push(diagnostic); + this._diagnostics.push({ ...diagnostic, token }); } setSerializingNode(node: AstNode) { @@ -313,9 +314,8 @@ export default class RuntimeContext { // If be aware of the complete input macro list when parsing, the snippets below is not required. getExtendedDefineMacros() { return Array.from(this._preprocessor._definePairs.entries()) - .map(([k, v]) => { - let ret = `#define ${k} ${v.originText}`; - return ret; + .map(([_, v]) => { + return v.originText; }) .join("\n"); } diff --git a/packages/shader-lab/src/preprocessor/Preprocessor.ts b/packages/shader-lab/src/preprocessor/Preprocessor.ts index fd1d543671..b0279d8383 100644 --- a/packages/shader-lab/src/preprocessor/Preprocessor.ts +++ b/packages/shader-lab/src/preprocessor/Preprocessor.ts @@ -156,9 +156,17 @@ export class Preprocessor { const idx = macroArgs.findIndex((item) => item === m); return args[idx]; }); - this._definePairs.set(variable.res.text, { isFunction: true, replacer, originText: chunk }); + this._definePairs.set(variable.res.text, { + isFunction: true, + replacer, + originText: `#define ${variable.res.text}(${macroArgs.join(",")}) ${chunk}` + }); } else { - this._definePairs.set(variable.res.text, { isFunction: false, replacer: chunk, originText: chunk }); + this._definePairs.set(variable.res.text, { + isFunction: false, + replacer: chunk, + originText: `#define ${variable.res.text} ${chunk}` + }); } this._replacers.push({ startIdx: macroToken.start.index, endIdx: tokenizer.curIndex, replace: "" }); From 5fe627d8d6aa16247cbfb2e01a939376da0ec56d Mon Sep 17 00:00:00 2001 From: Sway007 Date: Mon, 6 May 2024 15:07:08 +0800 Subject: [PATCH 07/10] fix: test case --- tests/src/shader-lab/ShaderLab.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/shader-lab/ShaderLab.test.ts b/tests/src/shader-lab/ShaderLab.test.ts index ea2f80b555..afbdbd6720 100644 --- a/tests/src/shader-lab/ShaderLab.test.ts +++ b/tests/src/shader-lab/ShaderLab.test.ts @@ -134,7 +134,7 @@ describe("ShaderLab", () => { }); it("marco completeness", () => { - expect(pass.vertexSource.includes("#define saturate clamp( a, 0.0, 1.0 )")).to.true; + expect(pass.vertexSource.includes("#define saturate(a) clamp( a, 0.0, 1.0 )")).to.true; }); it("render state", () => { From d65e88acd898fe8d89d8eb5ed90cdd4e6fa2ec89 Mon Sep 17 00:00:00 2001 From: Sway007 Date: Tue, 7 May 2024 14:00:00 +0800 Subject: [PATCH 08/10] "v0.0.0-experimental-shaderlab.0" --- packages/core/package.json | 2 +- packages/design/package.json | 2 +- packages/galacean/package.json | 2 +- packages/loader/package.json | 2 +- packages/math/package.json | 2 +- packages/physics-lite/package.json | 2 +- packages/physics-physx/package.json | 2 +- packages/rhi-webgl/package.json | 2 +- packages/shader-lab/package.json | 2 +- packages/xr-webxr/package.json | 2 +- packages/xr/package.json | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 77b01e6c5c..4d9252c3fb 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-core", - "version": "1.2.0-beta.2", + "version": "0.0.0-experimental-shaderlab.0", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/design/package.json b/packages/design/package.json index 88cae1feab..b74888de6d 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-design", - "version": "1.2.0-beta.2", + "version": "0.0.0-experimental-shaderlab.0", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/galacean/package.json b/packages/galacean/package.json index f76c1e3ff5..c72a01b5d3 100644 --- a/packages/galacean/package.json +++ b/packages/galacean/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine", - "version": "1.2.0-beta.2", + "version": "0.0.0-experimental-shaderlab.0", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/loader/package.json b/packages/loader/package.json index 908cae677f..6aa4229881 100644 --- a/packages/loader/package.json +++ b/packages/loader/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-loader", - "version": "1.2.0-beta.2", + "version": "0.0.0-experimental-shaderlab.0", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/math/package.json b/packages/math/package.json index c456af7596..4278d42c80 100644 --- a/packages/math/package.json +++ b/packages/math/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-math", - "version": "1.2.0-beta.2", + "version": "0.0.0-experimental-shaderlab.0", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/physics-lite/package.json b/packages/physics-lite/package.json index 3ae0ad8083..e02c791b88 100644 --- a/packages/physics-lite/package.json +++ b/packages/physics-lite/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-physics-lite", - "version": "1.2.0-beta.2", + "version": "0.0.0-experimental-shaderlab.0", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/physics-physx/package.json b/packages/physics-physx/package.json index cfcaa27190..b230e45879 100644 --- a/packages/physics-physx/package.json +++ b/packages/physics-physx/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-physics-physx", - "version": "1.2.0-beta.2", + "version": "0.0.0-experimental-shaderlab.0", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/rhi-webgl/package.json b/packages/rhi-webgl/package.json index cd35a713b8..deca2a084f 100644 --- a/packages/rhi-webgl/package.json +++ b/packages/rhi-webgl/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-rhi-webgl", - "version": "1.2.0-beta.2", + "version": "0.0.0-experimental-shaderlab.0", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/shader-lab/package.json b/packages/shader-lab/package.json index a5b7379c85..ca30fc7e8d 100644 --- a/packages/shader-lab/package.json +++ b/packages/shader-lab/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-shader-lab", - "version": "1.2.0-beta.2", + "version": "0.0.0-experimental-shaderlab.0", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/xr-webxr/package.json b/packages/xr-webxr/package.json index 7e23be7a19..31d5ef2721 100644 --- a/packages/xr-webxr/package.json +++ b/packages/xr-webxr/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-xr-webxr", - "version": "1.2.0-beta.2", + "version": "0.0.0-experimental-shaderlab.0", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/xr/package.json b/packages/xr/package.json index 0e170982ba..dea641cc33 100644 --- a/packages/xr/package.json +++ b/packages/xr/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-xr", - "version": "1.2.0-beta.2", + "version": "0.0.0-experimental-shaderlab.0", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" From 81ba3059a8501af42980753c9b526a39a9bcf8ee Mon Sep 17 00:00:00 2001 From: Sway007 Date: Tue, 7 May 2024 14:02:12 +0800 Subject: [PATCH 09/10] "v0.0.0-experimental-shaderlab.1" --- packages/core/package.json | 2 +- packages/design/package.json | 2 +- packages/galacean/package.json | 2 +- packages/loader/package.json | 2 +- packages/math/package.json | 2 +- packages/physics-lite/package.json | 2 +- packages/physics-physx/package.json | 2 +- packages/rhi-webgl/package.json | 2 +- packages/shader-lab/package.json | 2 +- packages/xr-webxr/package.json | 2 +- packages/xr/package.json | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 4d9252c3fb..7e198f3d0c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-core", - "version": "0.0.0-experimental-shaderlab.0", + "version": "0.0.0-experimental-shaderlab.1", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/design/package.json b/packages/design/package.json index b74888de6d..9cedb7ae0a 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-design", - "version": "0.0.0-experimental-shaderlab.0", + "version": "0.0.0-experimental-shaderlab.1", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/galacean/package.json b/packages/galacean/package.json index c72a01b5d3..ef3dd2eec1 100644 --- a/packages/galacean/package.json +++ b/packages/galacean/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine", - "version": "0.0.0-experimental-shaderlab.0", + "version": "0.0.0-experimental-shaderlab.1", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/loader/package.json b/packages/loader/package.json index 6aa4229881..f342362068 100644 --- a/packages/loader/package.json +++ b/packages/loader/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-loader", - "version": "0.0.0-experimental-shaderlab.0", + "version": "0.0.0-experimental-shaderlab.1", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/math/package.json b/packages/math/package.json index 4278d42c80..9cded8595a 100644 --- a/packages/math/package.json +++ b/packages/math/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-math", - "version": "0.0.0-experimental-shaderlab.0", + "version": "0.0.0-experimental-shaderlab.1", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/physics-lite/package.json b/packages/physics-lite/package.json index e02c791b88..70bcfd86d0 100644 --- a/packages/physics-lite/package.json +++ b/packages/physics-lite/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-physics-lite", - "version": "0.0.0-experimental-shaderlab.0", + "version": "0.0.0-experimental-shaderlab.1", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/physics-physx/package.json b/packages/physics-physx/package.json index b230e45879..70b8f02447 100644 --- a/packages/physics-physx/package.json +++ b/packages/physics-physx/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-physics-physx", - "version": "0.0.0-experimental-shaderlab.0", + "version": "0.0.0-experimental-shaderlab.1", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/rhi-webgl/package.json b/packages/rhi-webgl/package.json index deca2a084f..dd76fb6cfb 100644 --- a/packages/rhi-webgl/package.json +++ b/packages/rhi-webgl/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-rhi-webgl", - "version": "0.0.0-experimental-shaderlab.0", + "version": "0.0.0-experimental-shaderlab.1", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/shader-lab/package.json b/packages/shader-lab/package.json index ca30fc7e8d..fe9872427f 100644 --- a/packages/shader-lab/package.json +++ b/packages/shader-lab/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-shader-lab", - "version": "0.0.0-experimental-shaderlab.0", + "version": "0.0.0-experimental-shaderlab.1", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/xr-webxr/package.json b/packages/xr-webxr/package.json index 31d5ef2721..f3152d021c 100644 --- a/packages/xr-webxr/package.json +++ b/packages/xr-webxr/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-xr-webxr", - "version": "0.0.0-experimental-shaderlab.0", + "version": "0.0.0-experimental-shaderlab.1", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" diff --git a/packages/xr/package.json b/packages/xr/package.json index dea641cc33..6addc1d7a3 100644 --- a/packages/xr/package.json +++ b/packages/xr/package.json @@ -1,6 +1,6 @@ { "name": "@galacean/engine-xr", - "version": "0.0.0-experimental-shaderlab.0", + "version": "0.0.0-experimental-shaderlab.1", "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org" From 470dc628995011bc2cea7761f31b44e9fa8d8ca2 Mon Sep 17 00:00:00 2001 From: Sway007 Date: Tue, 7 May 2024 15:50:11 +0800 Subject: [PATCH 10/10] fix: recursive chunck load --- packages/loader/src/MaterialLoader.ts | 2 +- packages/loader/src/ShaderChunkLoader.ts | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/loader/src/MaterialLoader.ts b/packages/loader/src/MaterialLoader.ts index 99a01ddbdd..5fc9cb295d 100644 --- a/packages/loader/src/MaterialLoader.ts +++ b/packages/loader/src/MaterialLoader.ts @@ -91,7 +91,7 @@ class MaterialLoader extends Loader { case "Texture": texturePromises.push( // @ts-ignore - resourceManager.getResourceByRef(value).then((texture) => { + engine.resourceManager.getResourceByRef(value).then((texture) => { materialShaderData.setTexture(key, texture); }) ); diff --git a/packages/loader/src/ShaderChunkLoader.ts b/packages/loader/src/ShaderChunkLoader.ts index f85229d904..79cd824ffc 100644 --- a/packages/loader/src/ShaderChunkLoader.ts +++ b/packages/loader/src/ShaderChunkLoader.ts @@ -10,11 +10,24 @@ import { } from "@galacean/engine-core"; @resourceLoader(AssetType.ShaderChunk, ["glsl"], false) -class ShaderLoader extends Loader { +class ShaderChunkLoader extends Loader { load(item: LoadItem, resourceManager: ResourceManager): AssetPromise { - return this.request(item.url, { ...item, type: "text" }).then((code) => { + return this.request(item.url, { ...item, type: "text" }).then(async (code) => { const { includeKey } = item.params; ShaderFactory.registerInclude(includeKey, code); + + const matches = code.matchAll(/^[ \t]*#include +"([^$\\"]+)"/gm); + await Promise.all( + Array.from(matches).map((m) => { + const path = m[1]; + if (path) { + // @ts-ignore + const resource = resourceManager._virtualPathMap[path]; + if (!resource) return; + return resourceManager.load({ type: AssetType.ShaderChunk, url: resource, params: { includeKey: path } }); + } + }) + ); }); } }