UNPKG

@pixi/core

Version:
175 lines (167 loc) 5.02 kB
import "./index.mjs"; import { uniformParsers } from "./uniformParsers.mjs"; import { mapSize } from "./mapSize.mjs"; function uboUpdate(_ud, _uv, _renderer, _syncData, buffer) { _renderer.buffer.update(buffer); } const UBO_TO_SINGLE_SETTERS = { float: ` data[offset] = v; `, vec2: ` data[offset] = v[0]; data[offset+1] = v[1]; `, vec3: ` data[offset] = v[0]; data[offset+1] = v[1]; data[offset+2] = v[2]; `, vec4: ` data[offset] = v[0]; data[offset+1] = v[1]; data[offset+2] = v[2]; data[offset+3] = v[3]; `, mat2: ` data[offset] = v[0]; data[offset+1] = v[1]; data[offset+4] = v[2]; data[offset+5] = v[3]; `, mat3: ` data[offset] = v[0]; data[offset+1] = v[1]; data[offset+2] = v[2]; data[offset + 4] = v[3]; data[offset + 5] = v[4]; data[offset + 6] = v[5]; data[offset + 8] = v[6]; data[offset + 9] = v[7]; data[offset + 10] = v[8]; `, mat4: ` for(var i = 0; i < 16; i++) { data[offset + i] = v[i]; } ` }, GLSL_TO_STD40_SIZE = { float: 4, vec2: 8, vec3: 12, vec4: 16, int: 4, ivec2: 8, ivec3: 12, ivec4: 16, uint: 4, uvec2: 8, uvec3: 12, uvec4: 16, bool: 4, bvec2: 8, bvec3: 12, bvec4: 16, mat2: 16 * 2, mat3: 16 * 3, mat4: 16 * 4 }; function createUBOElements(uniformData) { const uboElements = uniformData.map((data) => ({ data, offset: 0, dataLen: 0, dirty: 0 })); let size = 0, chunkSize = 0, offset = 0; for (let i = 0; i < uboElements.length; i++) { const uboElement = uboElements[i]; if (size = GLSL_TO_STD40_SIZE[uboElement.data.type], uboElement.data.size > 1 && (size = Math.max(size, 16) * uboElement.data.size), uboElement.dataLen = size, chunkSize % size !== 0 && chunkSize < 16) { const lineUpValue = chunkSize % size % 16; chunkSize += lineUpValue, offset += lineUpValue; } chunkSize + size > 16 ? (offset = Math.ceil(offset / 16) * 16, uboElement.offset = offset, offset += size, chunkSize = size) : (uboElement.offset = offset, chunkSize += size, offset += size); } return offset = Math.ceil(offset / 16) * 16, { uboElements, size: offset }; } function getUBOData(uniforms, uniformData) { const usedUniformDatas = []; for (const i in uniforms) uniformData[i] && usedUniformDatas.push(uniformData[i]); return usedUniformDatas.sort((a, b) => a.index - b.index), usedUniformDatas; } function generateUniformBufferSync(group, uniformData) { if (!group.autoManage) return { size: 0, syncFunc: uboUpdate }; const usedUniformDatas = getUBOData(group.uniforms, uniformData), { uboElements, size } = createUBOElements(usedUniformDatas), funcFragments = [` var v = null; var v2 = null; var cv = null; var t = 0; var gl = renderer.gl var index = 0; var data = buffer.data; `]; for (let i = 0; i < uboElements.length; i++) { const uboElement = uboElements[i], uniform = group.uniforms[uboElement.data.name], name = uboElement.data.name; let parsed = !1; for (let j = 0; j < uniformParsers.length; j++) { const uniformParser = uniformParsers[j]; if (uniformParser.codeUbo && uniformParser.test(uboElement.data, uniform)) { funcFragments.push( `offset = ${uboElement.offset / 4};`, uniformParsers[j].codeUbo(uboElement.data.name, uniform) ), parsed = !0; break; } } if (!parsed) if (uboElement.data.size > 1) { const size2 = mapSize(uboElement.data.type), rowSize = Math.max(GLSL_TO_STD40_SIZE[uboElement.data.type] / 16, 1), elementSize = size2 / rowSize, remainder = (4 - elementSize % 4) % 4; funcFragments.push(` cv = ud.${name}.value; v = uv.${name}; offset = ${uboElement.offset / 4}; t = 0; for(var i=0; i < ${uboElement.data.size * rowSize}; i++) { for(var j = 0; j < ${elementSize}; j++) { data[offset++] = v[t++]; } offset += ${remainder}; } `); } else { const template = UBO_TO_SINGLE_SETTERS[uboElement.data.type]; funcFragments.push(` cv = ud.${name}.value; v = uv.${name}; offset = ${uboElement.offset / 4}; ${template}; `); } } return funcFragments.push(` renderer.buffer.update(buffer); `), { size, // eslint-disable-next-line no-new-func syncFunc: new Function( "ud", "uv", "renderer", "syncData", "buffer", funcFragments.join(` `) ) }; } export { createUBOElements, generateUniformBufferSync, getUBOData }; //# sourceMappingURL=generateUniformBufferSync.mjs.map