UNPKG

@pixi/core

Version:
195 lines (185 loc) 5.15 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]; } ` }; const 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; let chunkSize = 0; let offset = 0; for (let i = 0; i < uboElements.length; i++) { const uboElement = uboElements[i]; size = GLSL_TO_STD40_SIZE[uboElement.data.type]; if (uboElement.data.size > 1) { size = Math.max(size, 16) * uboElement.data.size; } uboElement.dataLen = size; if (chunkSize % size !== 0 && chunkSize < 16) { const lineUpValue = chunkSize % size % 16; chunkSize += lineUpValue; offset += lineUpValue; } if (chunkSize + size > 16) { offset = Math.ceil(offset / 16) * 16; uboElement.offset = offset; offset += size; chunkSize = size; } else { uboElement.offset = offset; chunkSize += size; offset += size; } } offset = Math.ceil(offset / 16) * 16; return { uboElements, size: offset }; } function getUBOData(uniforms, uniformData) { const usedUniformDatas = []; for (const i in uniforms) { if (uniformData[i]) { usedUniformDatas.push(uniformData[i]); } } usedUniformDatas.sort((a, b) => a.index - b.index); return usedUniformDatas; } function generateUniformBufferSync(group, uniformData) { if (!group.autoManage) { return { size: 0, syncFunc: uboUpdate }; } const usedUniformDatas = getUBOData(group.uniforms, uniformData); const { uboElements, size } = createUBOElements(usedUniformDatas); const 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]; const uniform = group.uniforms[uboElement.data.name]; const name = uboElement.data.name; let parsed = false; 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 = true; break; } } if (!parsed) { if (uboElement.data.size > 1) { const size2 = mapSize(uboElement.data.type); const rowSize = Math.max(GLSL_TO_STD40_SIZE[uboElement.data.type] / 16, 1); const elementSize = size2 / rowSize; const 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}; `); } } } funcFragments.push(` renderer.buffer.update(buffer); `); return { size, syncFunc: new Function("ud", "uv", "renderer", "syncData", "buffer", funcFragments.join("\n")) }; } export { createUBOElements, generateUniformBufferSync, getUBOData }; //# sourceMappingURL=generateUniformBufferSync.mjs.map