@pixi/core
Version:
Core PixiJS
175 lines (167 loc) • 5.02 kB
JavaScript
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