1 | {"version":3,"file":"UniformGroup.js","sources":["../../src/shader/UniformGroup.ts"],"sourcesContent":["import { BUFFER_TYPE } from '@pixi/constants';\nimport { Buffer } from '../geometry/Buffer';\n\nimport type { Dict } from '@pixi/utils';\nimport type { UniformsSyncCallback } from './utils';\n\nlet UID = 0;\n\n/**\n * Uniform group holds uniform map and some ID's for work\n *\n * `UniformGroup` has two modes:\n *\n * 1: Normal mode\n * Normal mode will upload the uniforms with individual function calls as required\n *\n * 2: Uniform buffer mode\n * This mode will treat the uniforms as a uniform buffer. You can pass in either a buffer that you manually handle, or\n * or a generic object that PixiJS will automatically map to a buffer for you.\n * For maximum benefits, make Ubo UniformGroups static, and only update them each frame.\n *\n * Rules of UBOs:\n * - UBOs only work with WebGL2, so make sure you have a fallback!\n * - Only floats are supported (including vec[2,3,4], mat[2,3,4])\n * - Samplers cannot be used in ubo's (a GPU limitation)\n * - You must ensure that the object you pass in exactly matches in the shader ubo structure.\n * Otherwise, weirdness will ensue!\n * - The name of the ubo object added to the group must match exactly the name of the ubo in the shader.\n *\n * ```glsl\n * // UBO in shader:\n * uniform myCoolData { // Declaring a UBO...\n * mat4 uCoolMatrix;\n * float uFloatyMcFloatFace;\n * };\n * ```\n *\n * ```js\n * // A new Uniform Buffer Object...\n * const myCoolData = new UniformBufferGroup({\n * uCoolMatrix: new Matrix(),\n * uFloatyMcFloatFace: 23,\n * }}\n *\n * // Build a shader...\n * const shader = Shader.from(srcVert, srcFrag, {\n * myCoolData // Name matches the UBO name in the shader. Will be processed accordingly.\n * })\n *\n * ```\n * @memberof PIXI\n */\nexport class UniformGroup<LAYOUT = Dict<any>>\n{\n /**\n * Uniform values\n * @member {object}\n */\n public readonly uniforms: LAYOUT;\n\n /**\n * Its a group and not a single uniforms.\n * @default true\n */\n public readonly group: boolean;\n\n /**\n * unique id\n * @protected\n */\n public id: number;\n syncUniforms: Dict<UniformsSyncCallback>;\n\n /**\n * Dirty version\n * @protected\n */\n dirtyId: number;\n\n /** Flag for if uniforms wont be changed after creation. */\n static: boolean;\n\n /** Flags whether this group is treated like a uniform buffer object. */\n ubo: boolean;\n buffer?: Buffer;\n autoManage: boolean;\n\n /**\n * @param {object | Buffer} [uniforms] - Custom uniforms to use to augment the built-in ones. Or a pixi buffer.\n * @param isStatic - Uniforms wont be changed after creation.\n * @param isUbo - If true, will treat this uniform group as a uniform buffer object.\n */\n constructor(uniforms: LAYOUT | Buffer, isStatic?: boolean, isUbo?: boolean)\n {\n this.group = true;\n\n // lets generate this when the shader ?\n this.syncUniforms = {};\n this.dirtyId = 0;\n this.id = UID++;\n this.static = !!isStatic;\n this.ubo = !!isUbo;\n\n if (uniforms instanceof Buffer)\n {\n this.buffer = uniforms;\n this.buffer.type = BUFFER_TYPE.UNIFORM_BUFFER;\n this.autoManage = false;\n this.ubo = true;\n }\n else\n {\n this.uniforms = uniforms;\n\n if (this.ubo)\n {\n this.buffer = new Buffer(new Float32Array(1));\n this.buffer.type = BUFFER_TYPE.UNIFORM_BUFFER;\n this.autoManage = true;\n }\n }\n }\n\n update(): void\n {\n this.dirtyId++;\n\n if (!this.autoManage && this.buffer)\n {\n this.buffer.update();\n }\n }\n\n add(name: string, uniforms: Dict<any>, _static?: boolean): void\n {\n if (!this.ubo)\n {\n (this.uniforms as any)[name] = new UniformGroup(uniforms, _static);\n }\n else\n {\n // eslint-disable-next-line max-len\n throw new Error('[UniformGroup] uniform groups in ubo mode cannot be modified, or have uniform groups nested in them');\n }\n }\n\n static from(uniforms: Dict<any> | Buffer, _static?: boolean, _ubo?: boolean): UniformGroup\n {\n return new UniformGroup(uniforms, _static, _ubo);\n }\n\n /**\n * A short hand function for creating a static UBO UniformGroup.\n * @param uniforms - the ubo item\n * @param _static - should this be updated each time it is used? defaults to true here!\n */\n static uboFrom(uniforms: Dict<any> | Buffer, _static?: boolean): UniformGroup\n {\n return new UniformGroup(uniforms, _static ?? true, true);\n }\n}\n"],"names":["Buffer","BUFFER_TYPE"],"mappings":";;;;;;;AAMA,IAAI,GAAM,GAAA,CAAA,CAAA;AA8CH,MAAM,YACb,CAAA;AAAA,EAuCI,WAAA,CAAY,QAA2B,EAAA,QAAA,EAAoB,KAC3D,EAAA;AACI,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAA,CAAA;AAGb,IAAA,IAAA,CAAK,eAAe,EAAC,CAAA;AACrB,IAAA,IAAA,CAAK,OAAU,GAAA,CAAA,CAAA;AACf,IAAA,IAAA,CAAK,EAAK,GAAA,GAAA,EAAA,CAAA;AACV,IAAK,IAAA,CAAA,MAAA,GAAS,CAAC,CAAC,QAAA,CAAA;AAChB,IAAK,IAAA,CAAA,GAAA,GAAM,CAAC,CAAC,KAAA,CAAA;AAEb,IAAA,IAAI,oBAAoBA,aACxB,EAAA;AACI,MAAA,IAAA,CAAK,MAAS,GAAA,QAAA,CAAA;AACd,MAAK,IAAA,CAAA,MAAA,CAAO,OAAOC,qBAAY,CAAA,cAAA,CAAA;AAC/B,MAAA,IAAA,CAAK,UAAa,GAAA,KAAA,CAAA;AAClB,MAAA,IAAA,CAAK,GAAM,GAAA,IAAA,CAAA;AAAA,KAGf,MAAA;AACI,MAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAEhB,MAAA,IAAI,KAAK,GACT,EAAA;AACI,QAAA,IAAA,CAAK,SAAS,IAAID,aAAA,CAAO,IAAI,YAAA,CAAa,CAAC,CAAC,CAAA,CAAA;AAC5C,QAAK,IAAA,CAAA,MAAA,CAAO,OAAOC,qBAAY,CAAA,cAAA,CAAA;AAC/B,QAAA,IAAA,CAAK,UAAa,GAAA,IAAA,CAAA;AAAA,OACtB;AAAA,KACJ;AAAA,GACJ;AAAA,EAEA,MACA,GAAA;AACI,IAAK,IAAA,CAAA,OAAA,EAAA,CAAA;AAEL,IAAA,IAAI,CAAC,IAAA,CAAK,UAAc,IAAA,IAAA,CAAK,MAC7B,EAAA;AACI,MAAA,IAAA,CAAK,OAAO,MAAO,EAAA,CAAA;AAAA,KACvB;AAAA,GACJ;AAAA,EAEA,GAAA,CAAI,IAAc,EAAA,QAAA,EAAqB,OACvC,EAAA;AACI,IAAI,IAAA,CAAC,KAAK,GACV,EAAA;AACI,MAAC,KAAK,QAAiB,CAAA,IAAA,CAAA,GAAQ,IAAI,YAAA,CAAa,UAAU,OAAO,CAAA,CAAA;AAAA,KAGrE,MAAA;AAEI,MAAM,MAAA,IAAI,MAAM,qGAAqG,CAAA,CAAA;AAAA,KACzH;AAAA,GACJ;AAAA,EAEA,OAAO,IAAA,CAAK,QAA8B,EAAA,OAAA,EAAmB,IAC7D,EAAA;AACI,IAAA,OAAO,IAAI,YAAA,CAAa,QAAU,EAAA,OAAA,EAAS,IAAI,CAAA,CAAA;AAAA,GACnD;AAAA,EAOA,OAAO,OAAQ,CAAA,QAAA,EAA8B,OAC7C,EAAA;AACI,IAAA,OAAO,IAAI,YAAA,CAAa,QAAU,EAAA,OAAA,IAAW,MAAM,IAAI,CAAA,CAAA;AAAA,GAC3D;AACJ;;;;"} |