StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
StackGenVis/frontend/node_modules/gl-util/uniform.js

159 lines
3.9 KiB

/* @module gl-util/unifrom */
'use strict'
const isPlainObject = require('is-plain-obj')
const isInt = require('number-is-integer')
const extend = require('object-assign')
const getProgram = require('./program')
const WeakMap = require('weak-map')
let uniformsCache = setUniform.cache = new WeakMap();
module.exports = setUniform;
function setUniform (gl, name, options) {
if (!gl) throw Error('WebGL context is not provided');
let program
if (gl instanceof WebGLProgram) {
program = gl
gl = gl.gl
}
else {
program = getProgram(gl)
}
if (!program) throw Error('Context has no active program');
// object with uniforms passed
if (name && typeof name != 'string') {
let result = {};
let uniforms = name;
for (let name in uniforms) {
result[name] = setUniform(gl, name, uniforms[name], program);
}
return result;
}
let uniforms = uniformsCache.has(program) ? uniformsCache.get(program) : uniformsCache.set(program, {}).get(program);
// return all uniforms if no name provided
if (!name) return uniforms;
let uniform = uniforms[name];
// autoinit uniform(s)
if (!uniform) {
let count = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
for (var i=0; i < count; ++i) {
let info = gl.getActiveUniform(program, i);
if (!info) continue;
// ignore textures
if (info.type === gl.SAMPLER_2D || info.type === gl.SAMPLER_CUBE) {
}
else {
uniforms[info.name] = {name: info.name, type: info.type, data: null}
}
}
if (!uniforms[name]) uniforms[name] = {name: name, data: null, type: null}
uniform = uniforms[name];
}
// detect location
if (uniform.location == null) {
uniform.location = gl.getUniformLocation(program, name);
}
// if no options passed - just return known uniform info
if (options == null) return uniform;
if (!isPlainObject(options)) options = {data: options};
extend(uniform, options);
// detect type
if (uniform.type == null && uniform.data) {
if (typeof uniform.data === 'number') {
if (isInt(uniform.data)) {
uniform.type = gl.INT;
}
else uniform.type = gl.FLOAT;
}
else if (uniform.data.length === 16) {
uniform.type = gl.FLOAT_MAT4;
}
else if (uniform.data.length === 9) {
uniform.type = gl.FLOAT_MAT3;
}
else if (uniform.data.length <= 4 ) {
if (uniform.data instanceof Float32Array) {
uniform.type = gl.FLOAT_VEC2 + (uniform.data.length-2);
}
else if (ArrayBuffer.isView(uniform.data)) {
uniform.type = gl.INT_VEC2 + (uniform.data.length-2);
}
else if (Array.isArray(uniform.data)) {
if (uniform.data.every(isInt)) {
uniform.type = gl.INT_VEC2 + (uniform.data.length-2);
}
else {
uniform.type = gl.FLOAT_VEC2 + (uniform.data.length-2);
}
}
}
}
// make sure data is typed array
if (Array.isArray(uniform.data)) {
switch (uniform.type) {
case gl.INT_VEC2:
case gl.INT_VEC3:
case gl.INT_VEC4:
uniform.data = new Int32Array(uniform.data);
break;
default:
uniform.data = new Float32Array(uniform.data);
}
}
// put data to shader
if (uniform.location && uniform.data != null) {
switch (uniform.type) {
case gl.FLOAT_VEC4:
case gl.FLOAT_MAT2:
gl.uniform4fv(uniform.location, uniform.data);
break;
case gl.INT_VEC4:
gl.uniform4iv(uniform.location, uniform.data);
break;
case gl.FLOAT_VEC3:
gl.uniform3fv(uniform.location, uniform.data);
break;
case gl.INT_VEC3:
gl.uniform3iv(uniform.location, uniform.data);
break;
case gl.FLOAT_VEC2:
gl.uniform2fv(uniform.location, uniform.data);
break;
case gl.INT_VEC2:
gl.uniform2iv(uniform.location, uniform.data);
break;
case gl.FLOAT:
gl.uniform1f(uniform.location, uniform.data);
break;
case gl.INT:
gl.uniform1i(uniform.location, uniform.data);
break;
}
}
return uniform;
}