// cv = CachedValue
// v = value
// ud = uniformData
// uv = uniformValue
// l = location
/* eslint-disable max-len */
const GLSL_TO_SINGLE_SETTERS = {
float(gl, location, cv, v)
{
if (cv !== v)
{
cv.v = v;
gl.uniform1f(location, v);
}
},
vec2(gl, location, cv, v)
{
if (cv[0] !== v[0] || cv[1] !== v[1])
{
cv[0] = v[0];
cv[1] = v[1];
gl.uniform2f(location, v[0], v[1]);
}
},
vec3(gl, location, cv, v)
{
if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2])
{
cv[0] = v[0];
cv[1] = v[1];
cv[2] = v[2];
gl.uniform3f(location, v[0], v[1], v[2]);
}
},
int(gl, location, cv, value) { gl.uniform1i(location, value); },
ivec2(gl, location, cv, value) { gl.uniform2i(location, value[0], value[1]); },
ivec3(gl, location, cv, value) { gl.uniform3i(location, value[0], value[1], value[2]); },
ivec4(gl, location, cv, value) { gl.uniform4i(location, value[0], value[1], value[2], value[3]); },
bool(gl, location, cv, value) { gl.uniform1i(location, value); },
bvec2(gl, location, cv, value) { gl.uniform2i(location, value[0], value[1]); },
bvec3(gl, location, cv, value) { gl.uniform3i(location, value[0], value[1], value[2]); },
bvec4(gl, location, cv, value) { gl.uniform4i(location, value[0], value[1], value[2], value[3]); },
mat2(gl, location, cv, value) { gl.uniformMatrix2fv(location, false, value); },
mat3(gl, location, cv, value) { gl.uniformMatrix3fv(location, false, value); },
mat4(gl, location, cv, value) { gl.uniformMatrix4fv(location, false, value); },
sampler2D(gl, location, cv, value) { gl.uniform1i(location, value); },
samplerCube(gl, location, cv, value) { gl.uniform1i(location, value); },
sampler2DArray(gl, location, cv, value) { gl.uniform1i(location, value); },
};
const GLSL_TO_ARRAY_SETTERS = {
float(gl, location, cv, value) { gl.uniform1fv(location, value); },
vec2(gl, location, cv, value) { gl.uniform2fv(location, value); },
vec3(gl, location, cv, value) { gl.uniform3fv(location, value); },
vec4(gl, location, cv, value) { gl.uniform4fv(location, value); },
int(gl, location, cv, value) { gl.uniform1iv(location, value); },
ivec2(gl, location, cv, value) { gl.uniform2iv(location, value); },
ivec3(gl, location, cv, value) { gl.uniform3iv(location, value); },
ivec4(gl, location, cv, value) { gl.uniform4iv(location, value); },
bool(gl, location, cv, value) { gl.uniform1iv(location, value); },
bvec2(gl, location, cv, value) { gl.uniform2iv(location, value); },
bvec3(gl, location, cv, value) { gl.uniform3iv(location, value); },
bvec4(gl, location, cv, value) { gl.uniform4iv(location, value); },
sampler2D(gl, location, cv, value) { gl.uniform1iv(location, value); },
samplerCube(gl, location, cv, value) { gl.uniform1iv(location, value); },
sampler2DArray(gl, location, cv, value) { gl.uniform1iv(location, value); },
};
/* eslint-disable max-len */
export function syncUniforms(group, uniformData, ud, uv, renderer)
{
let textureCount = 0;
let v = null;
let cv = null;
const gl = renderer.gl;
for (const i in group.uniforms)
{
const data = uniformData[i];
const uvi = uv[i];
const udi = ud[i];
const gu = group.uniforms[i];
if (!data)
{
if (gu.group)
{
renderer.shader.syncUniformGroup(uvi);
}
continue;
}
if (data.type === 'float' && data.size === 1)
{
if (uvi !== udi.value)
{
udi.value = uvi;
gl.uniform1f(udi.location, uvi);
}
}
/* eslint-disable max-len */
else if ((data.type === 'sampler2D' || data.type === 'samplerCube' || data.type === 'sampler2DArray') && data.size === 1 && !data.isArray)
/* eslint-disable max-len */
{
renderer.texture.bind(uvi, textureCount);
if (udi.value !== textureCount)
{
udi.value = textureCount;
gl.uniform1i(udi.location, textureCount);
}
textureCount++;
}
else if (data.type === 'mat3' && data.size === 1)
{
if (gu.a !== undefined)
{
gl.uniformMatrix3fv(udi.location, false, uvi.toArray(true));
}
else
{
gl.uniformMatrix3fv(udi.location, false, uvi);
}
}
else if (data.type === 'vec2' && data.size === 1)
{
if (gu.x !== undefined)
{
cv = udi.value;
v = uvi;
if (cv[0] !== v.x || cv[1] !== v.y)
{
cv[0] = v.x;
cv[1] = v.y;
gl.uniform2f(udi.location, v.x, v.y);
}
}
else
{
cv = udi.value;
v = uvi;
if (cv[0] !== v[0] || cv[1] !== v[1])
{
cv[0] = v[0];
cv[1] = v[1];
gl.uniform2f(udi.location, v[0], v[1]);
}
}
}
else if (data.type === 'vec4' && data.size === 1)
{
if (gu.width !== undefined)
{
cv = udi.value;
v = uvi;
if (cv[0] !== v.x || cv[1] !== v.y || cv[2] !== v.width || cv[3] !== v.height)
{
cv[0] = v.x;
cv[1] = v.y;
cv[2] = v.width;
cv[3] = v.height;
gl.uniform4f(udi.location, v.x, v.y, v.width, v.height);
}
}
else
{
cv = udi.value;
v = uvi;
if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3])
{
cv[0] = v[0];
cv[1] = v[1];
cv[2] = v[2];
cv[3] = v[3];
gl.uniform4f(udi.location, v[0], v[1], v[2], v[3]);
}
}
}
else
{
const funcArray = (data.size === 1) ? GLSL_TO_SINGLE_SETTERS : GLSL_TO_ARRAY_SETTERS;
funcArray[data.type].call(null, gl, udi.location, udi.value, uvi);
}
}
}