{"version":3,"file":"createUboElementsSTD40.mjs","sources":["../../../../../../src/rendering/renderers/gl/shader/utils/createUboElementsSTD40.ts"],"sourcesContent":["import type { UboElement, UboLayout, UniformData } from '../../../shared/shader/types';\n\nexport const WGSL_TO_STD40_SIZE: Record<string, number> = {\n    f32: 4,\n    'vec2<f32>': 8,\n    'vec3<f32>': 12,\n    'vec4<f32>': 16,\n\n    'mat2x2<f32>': 16 * 2,\n    'mat3x3<f32>': 16 * 3,\n    'mat4x4<f32>': 16 * 4,\n\n    // TODO - not essential for now but support these in the future\n    // int:      4,\n    // ivec2:    8,\n    // ivec3:    12,\n    // ivec4:    16,\n\n    // uint:     4,\n    // uvec2:    8,\n    // uvec3:    12,\n    // uvec4:    16,\n\n    // bool:     4,\n    // bvec2:    8,\n    // bvec3:    12,\n    // bvec4:    16,\n\n    // mat2:     16 * 2,\n    // mat3:     16 * 3,\n    // mat4:     16 * 4,\n};\n\nexport function createUboElementsSTD40(uniformData: UniformData[]): UboLayout\n{\n    const uboElements: UboElement[] = uniformData.map((data: UniformData) =>\n        ({\n            data,\n            offset: 0,\n            size: 0,\n        }));\n\n    let size = 0;\n    let chunkSize = 0;\n    let offset = 0;\n\n    for (let i = 0; i < uboElements.length; i++)\n    {\n        const uboElement = uboElements[i];\n\n        size = WGSL_TO_STD40_SIZE[uboElement.data.type];\n\n        if (!size)\n        {\n            throw new Error(`Unknown type ${uboElement.data.type}`);\n        }\n\n        if (uboElement.data.size > 1)\n        {\n            size = Math.max(size, 16) * uboElement.data.size;\n        }\n\n        uboElement.size = size;\n\n        // add some size offset..\n        // must align to the nearest 16 bytes or internally nearest round size\n        if (chunkSize % size !== 0 && chunkSize < 16)\n        {\n            // diff required to line up..\n            const lineUpValue = (chunkSize % size) % 16;\n\n            chunkSize += lineUpValue;\n            offset += lineUpValue;\n        }\n\n        if ((chunkSize + size) > 16)\n        {\n            offset = Math.ceil(offset / 16) * 16;\n            uboElement.offset = offset;\n            offset += size;\n            chunkSize = size;\n        }\n        else\n        {\n            uboElement.offset = offset;\n            chunkSize += size;\n            offset += size;\n        }\n    }\n\n    offset = Math.ceil(offset / 16) * 16;\n\n    return { uboElements, size: offset };\n}\n\n"],"names":[],"mappings":";AAEO,MAAM,kBAA6C,GAAA;AAAA,EACtD,GAAK,EAAA,CAAA;AAAA,EACL,WAAa,EAAA,CAAA;AAAA,EACb,WAAa,EAAA,EAAA;AAAA,EACb,WAAa,EAAA,EAAA;AAAA,EAEb,eAAe,EAAK,GAAA,CAAA;AAAA,EACpB,eAAe,EAAK,GAAA,CAAA;AAAA,EACpB,eAAe,EAAK,GAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBxB,EAAA;AAEO,SAAS,uBAAuB,WACvC,EAAA;AACI,EAAA,MAAM,WAA4B,GAAA,WAAA,CAAY,GAAI,CAAA,CAAC,IAC9C,MAAA;AAAA,IACG,IAAA;AAAA,IACA,MAAQ,EAAA,CAAA;AAAA,IACR,IAAM,EAAA,CAAA;AAAA,GACR,CAAA,CAAA,CAAA;AAEN,EAAA,IAAI,IAAO,GAAA,CAAA,CAAA;AACX,EAAA,IAAI,SAAY,GAAA,CAAA,CAAA;AAChB,EAAA,IAAI,MAAS,GAAA,CAAA,CAAA;AAEb,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,WAAA,CAAY,QAAQ,CACxC,EAAA,EAAA;AACI,IAAM,MAAA,UAAA,GAAa,YAAY,CAAC,CAAA,CAAA;AAEhC,IAAO,IAAA,GAAA,kBAAA,CAAmB,UAAW,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAE9C,IAAA,IAAI,CAAC,IACL,EAAA;AACI,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,aAAA,EAAgB,UAAW,CAAA,IAAA,CAAK,IAAI,CAAE,CAAA,CAAA,CAAA;AAAA,KAC1D;AAEA,IAAI,IAAA,UAAA,CAAW,IAAK,CAAA,IAAA,GAAO,CAC3B,EAAA;AACI,MAAA,IAAA,GAAO,KAAK,GAAI,CAAA,IAAA,EAAM,EAAE,CAAA,GAAI,WAAW,IAAK,CAAA,IAAA,CAAA;AAAA,KAChD;AAEA,IAAA,UAAA,CAAW,IAAO,GAAA,IAAA,CAAA;AAIlB,IAAA,IAAI,SAAY,GAAA,IAAA,KAAS,CAAK,IAAA,SAAA,GAAY,EAC1C,EAAA;AAEI,MAAM,MAAA,WAAA,GAAe,YAAY,IAAQ,GAAA,EAAA,CAAA;AAEzC,MAAa,SAAA,IAAA,WAAA,CAAA;AACb,MAAU,MAAA,IAAA,WAAA,CAAA;AAAA,KACd;AAEA,IAAK,IAAA,SAAA,GAAY,OAAQ,EACzB,EAAA;AACI,MAAA,MAAA,GAAS,IAAK,CAAA,IAAA,CAAK,MAAS,GAAA,EAAE,CAAI,GAAA,EAAA,CAAA;AAClC,MAAA,UAAA,CAAW,MAAS,GAAA,MAAA,CAAA;AACpB,MAAU,MAAA,IAAA,IAAA,CAAA;AACV,MAAY,SAAA,GAAA,IAAA,CAAA;AAAA,KAGhB,MAAA;AACI,MAAA,UAAA,CAAW,MAAS,GAAA,MAAA,CAAA;AACpB,MAAa,SAAA,IAAA,IAAA,CAAA;AACb,MAAU,MAAA,IAAA,IAAA,CAAA;AAAA,KACd;AAAA,GACJ;AAEA,EAAA,MAAA,GAAS,IAAK,CAAA,IAAA,CAAK,MAAS,GAAA,EAAE,CAAI,GAAA,EAAA,CAAA;AAElC,EAAO,OAAA,EAAE,WAAa,EAAA,IAAA,EAAM,MAAO,EAAA,CAAA;AACvC;;;;"}