Source code
Revision control
Copy as Markdown
Other Tools
/*-------------------------------------------------------------------------
* drawElements Quality Program OpenGL ES Utilities
* ------------------------------------------------
*
* Copyright 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
'use strict';
goog.provide('framework.opengl.gluShaderUtil');
goog.require('framework.delibs.debase.deMath');
goog.scope(function() {
var gluShaderUtil = framework.opengl.gluShaderUtil;
var deMath = framework.delibs.debase.deMath;
/**
* ShadingLanguageVersion
* @enum
*/
gluShaderUtil.GLSLVersion = {
V100_ES: 0, //!< GLSL ES 1.0
V300_ES: 1 //!< GLSL ES 3.0
};
/**
* gluShaderUtil.glslVersionUsesInOutQualifiers
* @param {gluShaderUtil.GLSLVersion} version
* @return {boolean}
*/
gluShaderUtil.glslVersionUsesInOutQualifiers = function(version) {
return version == gluShaderUtil.GLSLVersion.V300_ES;
};
/**
* gluShaderUtil.isGLSLVersionSupported
* @param {WebGL2RenderingContext|WebGLRenderingContextBase} ctx
* @param {gluShaderUtil.GLSLVersion} version
* @return {boolean}
*/
gluShaderUtil.isGLSLVersionSupported = function(ctx, version) {
return version <= gluShaderUtil.getGLSLVersion(ctx);
};
/**
* gluShaderUtil.getGLSLVersion - Returns a gluShaderUtil.GLSLVersion based on a given webgl context.
* @param {WebGL2RenderingContext|WebGLRenderingContextBase} gl
* @return {gluShaderUtil.GLSLVersion}
*/
gluShaderUtil.getGLSLVersion = function(gl) {
var glslversion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION);
// TODO: Versions are not yet well implemented... Firefox returns GLSL ES 1.0 in some cases,
// and Chromium returns GLSL ES 2.0 in some cases. Returning the right version for
// testing.
// return gluShaderUtil.GLSLVersion.V300_ES;
if (glslversion.indexOf('WebGL GLSL ES 1.0') != -1) return gluShaderUtil.GLSLVersion.V100_ES;
if (glslversion.indexOf('WebGL GLSL ES 3.0') != -1) return gluShaderUtil.GLSLVersion.V300_ES;
throw new Error('Invalid WebGL version');
};
/**
* gluShaderUtil.getGLSLVersionDeclaration - Returns a string declaration for the glsl version in a shader.
* @param {gluShaderUtil.GLSLVersion} version
* @return {string}
*/
gluShaderUtil.getGLSLVersionDeclaration = function(version) {
/** @type {Array<string>} */ var s_decl =
[
'#version 100',
'#version 300 es'
];
if (version > s_decl.length - 1)
throw new Error('Unsupported GLSL version.');
return s_decl[version];
};
/**
* gluShaderUtil.getGLSLVersionString - Returns the same thing as
* getGLSLVersionDeclaration() but without the substring '#version'
* @param {gluShaderUtil.GLSLVersion} version
* @return {string}
*/
gluShaderUtil.getGLSLVersionString = function(version) {
/** @type {Array<string>} */ var s_decl =
[
'100',
'300 es'
];
if (version > s_decl.length - 1)
throw new Error('Unsupported GLSL version.');
return s_decl[version];
};
/**
* @enum
*/
gluShaderUtil.precision = {
PRECISION_LOWP: 0,
PRECISION_MEDIUMP: 1,
PRECISION_HIGHP: 2
};
gluShaderUtil.getPrecisionName = function(prec) {
var s_names = [
'lowp',
'mediump',
'highp'
];
return s_names[prec];
};
/**
* The Type constants
* @enum {number}
*/
gluShaderUtil.DataType = {
INVALID: 0,
FLOAT: 1,
FLOAT_VEC2: 2,
FLOAT_VEC3: 3,
FLOAT_VEC4: 4,
FLOAT_MAT2: 5,
FLOAT_MAT2X3: 6,
FLOAT_MAT2X4: 7,
FLOAT_MAT3X2: 8,
FLOAT_MAT3: 9,
FLOAT_MAT3X4: 10,
FLOAT_MAT4X2: 11,
FLOAT_MAT4X3: 12,
FLOAT_MAT4: 13,
INT: 14,
INT_VEC2: 15,
INT_VEC3: 16,
INT_VEC4: 17,
UINT: 18,
UINT_VEC2: 19,
UINT_VEC3: 20,
UINT_VEC4: 21,
BOOL: 22,
BOOL_VEC2: 23,
BOOL_VEC3: 24,
BOOL_VEC4: 25,
SAMPLER_2D: 26,
SAMPLER_CUBE: 27,
SAMPLER_2D_ARRAY: 28,
SAMPLER_3D: 29,
SAMPLER_2D_SHADOW: 30,
SAMPLER_CUBE_SHADOW: 31,
SAMPLER_2D_ARRAY_SHADOW: 32,
INT_SAMPLER_2D: 33,
INT_SAMPLER_CUBE: 34,
INT_SAMPLER_2D_ARRAY: 35,
INT_SAMPLER_3D: 36,
UINT_SAMPLER_2D: 37,
UINT_SAMPLER_CUBE: 38,
UINT_SAMPLER_2D_ARRAY: 39,
UINT_SAMPLER_3D: 40
};
/**
* Returns type of float scalars
* @param {gluShaderUtil.DataType} dataType
* @return {string} type of float scalar
*/
gluShaderUtil.getDataTypeFloatScalars = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.FLOAT: return 'float';
case gluShaderUtil.DataType.FLOAT_VEC2: return 'vec2';
case gluShaderUtil.DataType.FLOAT_VEC3: return 'vec3';
case gluShaderUtil.DataType.FLOAT_VEC4: return 'vec4';
case gluShaderUtil.DataType.FLOAT_MAT2: return 'mat2';
case gluShaderUtil.DataType.FLOAT_MAT2X3: return 'mat2x3';
case gluShaderUtil.DataType.FLOAT_MAT2X4: return 'mat2x4';
case gluShaderUtil.DataType.FLOAT_MAT3X2: return 'mat3x2';
case gluShaderUtil.DataType.FLOAT_MAT3: return 'mat3';
case gluShaderUtil.DataType.FLOAT_MAT3X4: return 'mat3x4';
case gluShaderUtil.DataType.FLOAT_MAT4X2: return 'mat4x2';
case gluShaderUtil.DataType.FLOAT_MAT4X3: return 'mat4x3';
case gluShaderUtil.DataType.FLOAT_MAT4: return 'mat4';
case gluShaderUtil.DataType.INT: return 'float';
case gluShaderUtil.DataType.INT_VEC2: return 'vec2';
case gluShaderUtil.DataType.INT_VEC3: return 'vec3';
case gluShaderUtil.DataType.INT_VEC4: return 'vec4';
case gluShaderUtil.DataType.UINT: return 'float';
case gluShaderUtil.DataType.UINT_VEC2: return 'vec2';
case gluShaderUtil.DataType.UINT_VEC3: return 'vec3';
case gluShaderUtil.DataType.UINT_VEC4: return 'vec4';
case gluShaderUtil.DataType.BOOL: return 'float';
case gluShaderUtil.DataType.BOOL_VEC2: return 'vec2';
case gluShaderUtil.DataType.BOOL_VEC3: return 'vec3';
case gluShaderUtil.DataType.BOOL_VEC4: return 'vec4';
}
throw Error('Unrecognized dataType ' + dataType);
};
/**
* gluShaderUtil.getDataTypeVector
* @param {gluShaderUtil.DataType} scalarType
* @param {number} size
* @return {gluShaderUtil.DataType}
*/
gluShaderUtil.getDataTypeVector = function(scalarType, size) {
var floats = [gluShaderUtil.DataType.FLOAT,
gluShaderUtil.DataType.FLOAT_VEC2,
gluShaderUtil.DataType.FLOAT_VEC3,
gluShaderUtil.DataType.FLOAT_VEC4];
var ints = [gluShaderUtil.DataType.INT,
gluShaderUtil.DataType.INT_VEC2,
gluShaderUtil.DataType.INT_VEC3,
gluShaderUtil.DataType.INT_VEC4];
var uints = [gluShaderUtil.DataType.UINT,
gluShaderUtil.DataType.UINT_VEC2,
gluShaderUtil.DataType.UINT_VEC3,
gluShaderUtil.DataType.UINT_VEC4];
var bools = [gluShaderUtil.DataType.BOOL,
gluShaderUtil.DataType.BOOL_VEC2,
gluShaderUtil.DataType.BOOL_VEC3,
gluShaderUtil.DataType.BOOL_VEC4];
switch (scalarType) {
case gluShaderUtil.DataType.FLOAT: return floats[size - 1];
case gluShaderUtil.DataType.INT: return ints[size - 1];
case gluShaderUtil.DataType.UINT: return uints[size - 1];
case gluShaderUtil.DataType.BOOL: return bools[size - 1];
default:
throw new Error('Scalar type is not a vectoe:' + scalarType);
}
};
/**
* gluShaderUtil.getDataTypeFloatVec
* @param {number} vecSize
* @return {gluShaderUtil.DataType}
*/
gluShaderUtil.getDataTypeFloatVec = function(vecSize) {
return gluShaderUtil.getDataTypeVector(gluShaderUtil.DataType.FLOAT, vecSize);
};
/**
* gluShaderUtil.isDataTypeBoolOrBVec
* @param {gluShaderUtil.DataType} dataType
* @return {boolean}
*/
gluShaderUtil.isDataTypeBoolOrBVec = function(dataType) {
return (dataType >= gluShaderUtil.DataType.BOOL) && (dataType <= gluShaderUtil.DataType.BOOL_VEC4);
};
/**
* Returns type of scalar
* @param {gluShaderUtil.DataType} dataType shader
* @return {string} type of scalar type
*/
gluShaderUtil.getDataTypeScalarType = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.FLOAT: return 'float';
case gluShaderUtil.DataType.FLOAT_VEC2: return 'float';
case gluShaderUtil.DataType.FLOAT_VEC3: return 'float';
case gluShaderUtil.DataType.FLOAT_VEC4: return 'float';
case gluShaderUtil.DataType.FLOAT_MAT2: return 'float';
case gluShaderUtil.DataType.FLOAT_MAT2X3: return 'float';
case gluShaderUtil.DataType.FLOAT_MAT2X4: return 'float';
case gluShaderUtil.DataType.FLOAT_MAT3X2: return 'float';
case gluShaderUtil.DataType.FLOAT_MAT3: return 'float';
case gluShaderUtil.DataType.FLOAT_MAT3X4: return 'float';
case gluShaderUtil.DataType.FLOAT_MAT4X2: return 'float';
case gluShaderUtil.DataType.FLOAT_MAT4X3: return 'float';
case gluShaderUtil.DataType.FLOAT_MAT4: return 'float';
case gluShaderUtil.DataType.INT: return 'int';
case gluShaderUtil.DataType.INT_VEC2: return 'int';
case gluShaderUtil.DataType.INT_VEC3: return 'int';
case gluShaderUtil.DataType.INT_VEC4: return 'int';
case gluShaderUtil.DataType.UINT: return 'uint';
case gluShaderUtil.DataType.UINT_VEC2: return 'uint';
case gluShaderUtil.DataType.UINT_VEC3: return 'uint';
case gluShaderUtil.DataType.UINT_VEC4: return 'uint';
case gluShaderUtil.DataType.BOOL: return 'bool';
case gluShaderUtil.DataType.BOOL_VEC2: return 'bool';
case gluShaderUtil.DataType.BOOL_VEC3: return 'bool';
case gluShaderUtil.DataType.BOOL_VEC4: return 'bool';
case gluShaderUtil.DataType.SAMPLER_2D: return 'sampler2D';
case gluShaderUtil.DataType.SAMPLER_CUBE: return 'samplerCube';
case gluShaderUtil.DataType.SAMPLER_2D_ARRAY: return 'sampler2DArray';
case gluShaderUtil.DataType.SAMPLER_3D: return 'sampler3D';
case gluShaderUtil.DataType.SAMPLER_2D_SHADOW: return 'sampler2DShadow';
case gluShaderUtil.DataType.SAMPLER_CUBE_SHADOW: return 'samplerCubeShadow';
case gluShaderUtil.DataType.SAMPLER_2D_ARRAY_SHADOW: return 'sampler2DArrayShadow';
case gluShaderUtil.DataType.INT_SAMPLER_2D: return 'isampler2D';
case gluShaderUtil.DataType.INT_SAMPLER_CUBE: return 'isamplerCube';
case gluShaderUtil.DataType.INT_SAMPLER_2D_ARRAY: return 'isampler2DArray';
case gluShaderUtil.DataType.INT_SAMPLER_3D: return 'isampler3D';
case gluShaderUtil.DataType.UINT_SAMPLER_2D: return 'usampler2D';
case gluShaderUtil.DataType.UINT_SAMPLER_CUBE: return 'usamplerCube';
case gluShaderUtil.DataType.UINT_SAMPLER_2D_ARRAY: return 'usampler2DArray';
case gluShaderUtil.DataType.UINT_SAMPLER_3D: return 'usampler3D';
}
throw new Error('Unrecognized datatype:' + dataType);
};
/**
* Returns type of scalar
* @param {?gluShaderUtil.DataType} dataType shader
* @return {gluShaderUtil.DataType} type of scalar type
*/
gluShaderUtil.getDataTypeScalarTypeAsDataType = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.FLOAT: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_VEC2: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_VEC3: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_VEC4: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_MAT2: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_MAT2X3: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_MAT2X4: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_MAT3X2: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_MAT3: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_MAT3X4: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_MAT4X2: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_MAT4X3: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.FLOAT_MAT4: return gluShaderUtil.DataType.FLOAT;
case gluShaderUtil.DataType.INT: return gluShaderUtil.DataType.INT;
case gluShaderUtil.DataType.INT_VEC2: return gluShaderUtil.DataType.INT;
case gluShaderUtil.DataType.INT_VEC3: return gluShaderUtil.DataType.INT;
case gluShaderUtil.DataType.INT_VEC4: return gluShaderUtil.DataType.INT;
case gluShaderUtil.DataType.UINT: return gluShaderUtil.DataType.UINT;
case gluShaderUtil.DataType.UINT_VEC2: return gluShaderUtil.DataType.UINT;
case gluShaderUtil.DataType.UINT_VEC3: return gluShaderUtil.DataType.UINT;
case gluShaderUtil.DataType.UINT_VEC4: return gluShaderUtil.DataType.UINT;
case gluShaderUtil.DataType.BOOL: return gluShaderUtil.DataType.BOOL;
case gluShaderUtil.DataType.BOOL_VEC2: return gluShaderUtil.DataType.BOOL;
case gluShaderUtil.DataType.BOOL_VEC3: return gluShaderUtil.DataType.BOOL;
case gluShaderUtil.DataType.BOOL_VEC4: return gluShaderUtil.DataType.BOOL;
case gluShaderUtil.DataType.SAMPLER_2D:
case gluShaderUtil.DataType.SAMPLER_CUBE:
case gluShaderUtil.DataType.SAMPLER_2D_ARRAY:
case gluShaderUtil.DataType.SAMPLER_3D:
case gluShaderUtil.DataType.SAMPLER_2D_SHADOW:
case gluShaderUtil.DataType.SAMPLER_CUBE_SHADOW:
case gluShaderUtil.DataType.SAMPLER_2D_ARRAY_SHADOW:
case gluShaderUtil.DataType.INT_SAMPLER_2D:
case gluShaderUtil.DataType.INT_SAMPLER_CUBE:
case gluShaderUtil.DataType.INT_SAMPLER_2D_ARRAY:
case gluShaderUtil.DataType.INT_SAMPLER_3D:
case gluShaderUtil.DataType.UINT_SAMPLER_2D:
case gluShaderUtil.DataType.UINT_SAMPLER_CUBE:
case gluShaderUtil.DataType.UINT_SAMPLER_2D_ARRAY:
case gluShaderUtil.DataType.UINT_SAMPLER_3D:
return dataType;
}
throw Error('Unrecognized dataType ' + dataType);
};
/**
* Checks if dataType is integer or vectors of integers
* @param {gluShaderUtil.DataType} dataType shader
* @return {boolean} Is dataType integer or integer vector
*/
gluShaderUtil.isDataTypeIntOrIVec = function(dataType) {
/** @type {boolean} */ var retVal = false;
switch (dataType) {
case gluShaderUtil.DataType.INT:
case gluShaderUtil.DataType.INT_VEC2:
case gluShaderUtil.DataType.INT_VEC3:
case gluShaderUtil.DataType.INT_VEC4:
retVal = true;
}
return retVal;
};
/**
* Checks if dataType is unsigned integer or vectors of unsigned integers
* @param {gluShaderUtil.DataType} dataType shader
* @return {boolean} Is dataType unsigned integer or unsigned integer vector
*/
gluShaderUtil.isDataTypeUintOrUVec = function(dataType) {
/** @type {boolean} */ var retVal = false;
switch (dataType) {
case gluShaderUtil.DataType.UINT:
case gluShaderUtil.DataType.UINT_VEC2:
case gluShaderUtil.DataType.UINT_VEC3:
case gluShaderUtil.DataType.UINT_VEC4:
retVal = true;
}
return retVal;
};
/**
* Returns type of scalar size
* @param {gluShaderUtil.DataType} dataType shader
* @return {number} with size of the type of scalar
*/
gluShaderUtil.getDataTypeScalarSize = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.FLOAT: return 1;
case gluShaderUtil.DataType.FLOAT_VEC2: return 2;
case gluShaderUtil.DataType.FLOAT_VEC3: return 3;
case gluShaderUtil.DataType.FLOAT_VEC4: return 4;
case gluShaderUtil.DataType.FLOAT_MAT2: return 4;
case gluShaderUtil.DataType.FLOAT_MAT2X3: return 6;
case gluShaderUtil.DataType.FLOAT_MAT2X4: return 8;
case gluShaderUtil.DataType.FLOAT_MAT3X2: return 6;
case gluShaderUtil.DataType.FLOAT_MAT3: return 9;
case gluShaderUtil.DataType.FLOAT_MAT3X4: return 12;
case gluShaderUtil.DataType.FLOAT_MAT4X2: return 8;
case gluShaderUtil.DataType.FLOAT_MAT4X3: return 12;
case gluShaderUtil.DataType.FLOAT_MAT4: return 16;
case gluShaderUtil.DataType.INT: return 1;
case gluShaderUtil.DataType.INT_VEC2: return 2;
case gluShaderUtil.DataType.INT_VEC3: return 3;
case gluShaderUtil.DataType.INT_VEC4: return 4;
case gluShaderUtil.DataType.UINT: return 1;
case gluShaderUtil.DataType.UINT_VEC2: return 2;
case gluShaderUtil.DataType.UINT_VEC3: return 3;
case gluShaderUtil.DataType.UINT_VEC4: return 4;
case gluShaderUtil.DataType.BOOL: return 1;
case gluShaderUtil.DataType.BOOL_VEC2: return 2;
case gluShaderUtil.DataType.BOOL_VEC3: return 3;
case gluShaderUtil.DataType.BOOL_VEC4: return 4;
case gluShaderUtil.DataType.SAMPLER_2D: return 1;
case gluShaderUtil.DataType.SAMPLER_CUBE: return 1;
case gluShaderUtil.DataType.SAMPLER_2D_ARRAY: return 1;
case gluShaderUtil.DataType.SAMPLER_3D: return 1;
case gluShaderUtil.DataType.SAMPLER_2D_SHADOW: return 1;
case gluShaderUtil.DataType.SAMPLER_CUBE_SHADOW: return 1;
case gluShaderUtil.DataType.SAMPLER_2D_ARRAY_SHADOW: return 1;
case gluShaderUtil.DataType.INT_SAMPLER_2D: return 1;
case gluShaderUtil.DataType.INT_SAMPLER_CUBE: return 1;
case gluShaderUtil.DataType.INT_SAMPLER_2D_ARRAY: return 1;
case gluShaderUtil.DataType.INT_SAMPLER_3D: return 1;
case gluShaderUtil.DataType.UINT_SAMPLER_2D: return 1;
case gluShaderUtil.DataType.UINT_SAMPLER_CUBE: return 1;
case gluShaderUtil.DataType.UINT_SAMPLER_2D_ARRAY: return 1;
case gluShaderUtil.DataType.UINT_SAMPLER_3D: return 1;
}
throw Error('Unrecognized dataType ' + dataType);
};
/**
* Checks if dataType is float or vector
* @param {?gluShaderUtil.DataType} dataType shader
* @return {boolean} Is dataType float or vector
*/
gluShaderUtil.isDataTypeFloatOrVec = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.FLOAT:
case gluShaderUtil.DataType.FLOAT_VEC2:
case gluShaderUtil.DataType.FLOAT_VEC3:
case gluShaderUtil.DataType.FLOAT_VEC4:
return true;
}
return false;
};
/**
* Checks if dataType is a matrix
* @param {gluShaderUtil.DataType} dataType shader
* @return {boolean} Is dataType matrix or not
*/
gluShaderUtil.isDataTypeMatrix = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.FLOAT_MAT2:
case gluShaderUtil.DataType.FLOAT_MAT2X3:
case gluShaderUtil.DataType.FLOAT_MAT2X4:
case gluShaderUtil.DataType.FLOAT_MAT3X2:
case gluShaderUtil.DataType.FLOAT_MAT3:
case gluShaderUtil.DataType.FLOAT_MAT3X4:
case gluShaderUtil.DataType.FLOAT_MAT4X2:
case gluShaderUtil.DataType.FLOAT_MAT4X3:
case gluShaderUtil.DataType.FLOAT_MAT4:
return true;
}
return false;
};
/**
* Checks if dataType is a vector
* @param {gluShaderUtil.DataType} dataType shader
* @return {boolean} Is dataType vector or not
*/
gluShaderUtil.isDataTypeScalar = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.FLOAT:
case gluShaderUtil.DataType.INT:
case gluShaderUtil.DataType.UINT:
case gluShaderUtil.DataType.BOOL:
return true;
}
return false;
};
/**
* Checks if dataType is a vector
* @param {gluShaderUtil.DataType} dataType shader
* @return {boolean} Is dataType vector or not
*/
gluShaderUtil.isDataTypeVector = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.FLOAT_VEC2:
case gluShaderUtil.DataType.FLOAT_VEC3:
case gluShaderUtil.DataType.FLOAT_VEC4:
case gluShaderUtil.DataType.INT_VEC2:
case gluShaderUtil.DataType.INT_VEC3:
case gluShaderUtil.DataType.INT_VEC4:
case gluShaderUtil.DataType.UINT_VEC2:
case gluShaderUtil.DataType.UINT_VEC3:
case gluShaderUtil.DataType.UINT_VEC4:
case gluShaderUtil.DataType.BOOL_VEC2:
case gluShaderUtil.DataType.BOOL_VEC3:
case gluShaderUtil.DataType.BOOL_VEC4:
return true;
}
return false;
};
/**
* Checks if dataType is a vector or a scalar type
* @param {gluShaderUtil.DataType} dataType shader
* @return {boolean} Is dataType vector or scalar or not
*/
gluShaderUtil.isDataTypeScalarOrVector = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.FLOAT:
case gluShaderUtil.DataType.FLOAT_VEC2:
case gluShaderUtil.DataType.FLOAT_VEC3:
case gluShaderUtil.DataType.FLOAT_VEC4:
case gluShaderUtil.DataType.INT:
case gluShaderUtil.DataType.INT_VEC2:
case gluShaderUtil.DataType.INT_VEC3:
case gluShaderUtil.DataType.INT_VEC4:
case gluShaderUtil.DataType.UINT:
case gluShaderUtil.DataType.UINT_VEC2:
case gluShaderUtil.DataType.UINT_VEC3:
case gluShaderUtil.DataType.UINT_VEC4:
case gluShaderUtil.DataType.BOOL:
case gluShaderUtil.DataType.BOOL_VEC2:
case gluShaderUtil.DataType.BOOL_VEC3:
case gluShaderUtil.DataType.BOOL_VEC4:
return true;
}
return false;
};
/**
* Checks if dataType is a sampler
* @param {gluShaderUtil.DataType} dataType shader
* @return {boolean} Is dataType vector or scalar or not
*/
gluShaderUtil.isDataTypeSampler = function(dataType) {
return (dataType >= gluShaderUtil.DataType.SAMPLER_2D) && (dataType <= gluShaderUtil.DataType.UINT_SAMPLER_3D);
};
/**
* Returns a gluShaderUtil.DataType based on given rows and columns
* @param {number} numCols
* @param {number} numRows
* @return {gluShaderUtil.DataType}
*/
gluShaderUtil.getDataTypeMatrix = function(numCols, numRows) {
if (!(deMath.deInRange32(numCols, 2, 4) && deMath.deInRange32(numRows, 2, 4)))
throw new Error('Out of bounds: (' + numCols + ',' + numRows + ')');
var size = numCols.toString() + 'x' + numRows.toString();
var datatypes = {
'2x2': gluShaderUtil.DataType.FLOAT_MAT2,
'2x3': gluShaderUtil.DataType.FLOAT_MAT2X3,
'2x4': gluShaderUtil.DataType.FLOAT_MAT2X4,
'3x2': gluShaderUtil.DataType.FLOAT_MAT3X2,
'3x3': gluShaderUtil.DataType.FLOAT_MAT3,
'3x4': gluShaderUtil.DataType.FLOAT_MAT3X4,
'4x2': gluShaderUtil.DataType.FLOAT_MAT4X2,
'4x3': gluShaderUtil.DataType.FLOAT_MAT4X3,
'4x4': gluShaderUtil.DataType.FLOAT_MAT4
};
return datatypes[size];
};
/**
* Returns number of rows of a gluShaderUtil.DataType Matrix
* @param {gluShaderUtil.DataType} dataType shader
* @return {number} with number of rows depending on gluShaderUtil.DataType Matrix
*/
gluShaderUtil.getDataTypeMatrixNumRows = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.FLOAT_MAT2: return 2;
case gluShaderUtil.DataType.FLOAT_MAT2X3: return 3;
case gluShaderUtil.DataType.FLOAT_MAT2X4: return 4;
case gluShaderUtil.DataType.FLOAT_MAT3X2: return 2;
case gluShaderUtil.DataType.FLOAT_MAT3: return 3;
case gluShaderUtil.DataType.FLOAT_MAT3X4: return 4;
case gluShaderUtil.DataType.FLOAT_MAT4X2: return 2;
case gluShaderUtil.DataType.FLOAT_MAT4X3: return 3;
case gluShaderUtil.DataType.FLOAT_MAT4: return 4;
}
throw Error('Unrecognized dataType ' + dataType);
};
/**
* Returns number of columns of a gluShaderUtil.DataType Matrix
* @param {gluShaderUtil.DataType} dataType shader
* @return {number} with number of columns depending on gluShaderUtil.DataType Matrix
*/
gluShaderUtil.getDataTypeMatrixNumColumns = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.FLOAT_MAT2: return 2;
case gluShaderUtil.DataType.FLOAT_MAT2X3: return 2;
case gluShaderUtil.DataType.FLOAT_MAT2X4: return 2;
case gluShaderUtil.DataType.FLOAT_MAT3X2: return 3;
case gluShaderUtil.DataType.FLOAT_MAT3: return 3;
case gluShaderUtil.DataType.FLOAT_MAT3X4: return 3;
case gluShaderUtil.DataType.FLOAT_MAT4X2: return 4;
case gluShaderUtil.DataType.FLOAT_MAT4X3: return 4;
case gluShaderUtil.DataType.FLOAT_MAT4: return 4;
}
throw Error('Unrecognized dataType ' + dataType);
};
/**
* @param {gluShaderUtil.DataType} dataType
* @return {number}
*/
gluShaderUtil.getDataTypeNumLocations = function(dataType) {
if (gluShaderUtil.isDataTypeScalarOrVector(dataType))
return 1;
else if (gluShaderUtil.isDataTypeMatrix(dataType))
return gluShaderUtil.getDataTypeMatrixNumColumns(dataType);
throw Error('Unrecognized dataType ' + dataType);
};
/**
* @param {gluShaderUtil.DataType} dataType
* @return {number}
*/
gluShaderUtil.getDataTypeNumComponents = function(dataType) {
if (gluShaderUtil.isDataTypeScalarOrVector(dataType))
return gluShaderUtil.getDataTypeScalarSize(dataType);
else if (gluShaderUtil.isDataTypeMatrix(dataType))
return gluShaderUtil.getDataTypeMatrixNumRows(dataType);
throw Error('Unrecognized dataType ' + dataType);
};
/**
* Returns name of the dataType
* @param {?gluShaderUtil.DataType} dataType shader
* @return {string} dataType name
*/
gluShaderUtil.getDataTypeName = function(dataType) {
switch (dataType) {
case gluShaderUtil.DataType.INVALID: return 'invalid';
case gluShaderUtil.DataType.FLOAT: return 'float';
case gluShaderUtil.DataType.FLOAT_VEC2: return 'vec2';
case gluShaderUtil.DataType.FLOAT_VEC3: return 'vec3';
case gluShaderUtil.DataType.FLOAT_VEC4: return 'vec4';
case gluShaderUtil.DataType.FLOAT_MAT2: return 'mat2';
case gluShaderUtil.DataType.FLOAT_MAT2X3: return 'mat2x3';
case gluShaderUtil.DataType.FLOAT_MAT2X4: return 'mat2x4';
case gluShaderUtil.DataType.FLOAT_MAT3X2: return 'mat3x2';
case gluShaderUtil.DataType.FLOAT_MAT3: return 'mat3';
case gluShaderUtil.DataType.FLOAT_MAT3X4: return 'mat3x4';
case gluShaderUtil.DataType.FLOAT_MAT4X2: return 'mat4x2';
case gluShaderUtil.DataType.FLOAT_MAT4X3: return 'mat4x3';
case gluShaderUtil.DataType.FLOAT_MAT4: return 'mat4';
case gluShaderUtil.DataType.INT: return 'int';
case gluShaderUtil.DataType.INT_VEC2: return 'ivec2';
case gluShaderUtil.DataType.INT_VEC3: return 'ivec3';
case gluShaderUtil.DataType.INT_VEC4: return 'ivec4';
case gluShaderUtil.DataType.UINT: return 'uint';
case gluShaderUtil.DataType.UINT_VEC2: return 'uvec2';
case gluShaderUtil.DataType.UINT_VEC3: return 'uvec3';
case gluShaderUtil.DataType.UINT_VEC4: return 'uvec4';
case gluShaderUtil.DataType.BOOL: return 'bool';
case gluShaderUtil.DataType.BOOL_VEC2: return 'bvec2';
case gluShaderUtil.DataType.BOOL_VEC3: return 'bvec3';
case gluShaderUtil.DataType.BOOL_VEC4: return 'bvec4';
case gluShaderUtil.DataType.SAMPLER_2D: return 'sampler2D';
case gluShaderUtil.DataType.SAMPLER_CUBE: return 'samplerCube';
case gluShaderUtil.DataType.SAMPLER_2D_ARRAY: return 'sampler2DArray';
case gluShaderUtil.DataType.SAMPLER_3D: return 'sampler3D';
case gluShaderUtil.DataType.SAMPLER_2D_SHADOW: return 'sampler2DShadow';
case gluShaderUtil.DataType.SAMPLER_CUBE_SHADOW: return 'samplerCubeShadow';
case gluShaderUtil.DataType.SAMPLER_2D_ARRAY_SHADOW: return 'sampler2DArrayShadow';
case gluShaderUtil.DataType.INT_SAMPLER_2D: return 'isampler2D';
case gluShaderUtil.DataType.INT_SAMPLER_CUBE: return 'isamplerCube';
case gluShaderUtil.DataType.INT_SAMPLER_2D_ARRAY: return 'isampler2DArray';
case gluShaderUtil.DataType.INT_SAMPLER_3D: return 'isampler3D';
case gluShaderUtil.DataType.UINT_SAMPLER_2D: return 'usampler2D';
case gluShaderUtil.DataType.UINT_SAMPLER_CUBE: return 'usamplerCube';
case gluShaderUtil.DataType.UINT_SAMPLER_2D_ARRAY: return 'usampler2DArray';
case gluShaderUtil.DataType.UINT_SAMPLER_3D: return 'usampler3D';
}
throw Error('Unrecognized dataType ' + dataType);
};
/**
* Returns the gluShaderUtil.DataType from the GL type
* @param {number} glType
* @return {gluShaderUtil.DataType}
*/
gluShaderUtil.getDataTypeFromGLType = function(glType) {
switch (glType) {
case gl.FLOAT: return gluShaderUtil.DataType.FLOAT;
case gl.FLOAT_VEC2: return gluShaderUtil.DataType.FLOAT_VEC2;
case gl.FLOAT_VEC3: return gluShaderUtil.DataType.FLOAT_VEC3;
case gl.FLOAT_VEC4: return gluShaderUtil.DataType.FLOAT_VEC4;
case gl.FLOAT_MAT2: return gluShaderUtil.DataType.FLOAT_MAT2;
case gl.FLOAT_MAT2x3: return gluShaderUtil.DataType.FLOAT_MAT2X3;
case gl.FLOAT_MAT2x4: return gluShaderUtil.DataType.FLOAT_MAT2X4;
case gl.FLOAT_MAT3x2: return gluShaderUtil.DataType.FLOAT_MAT3X2;
case gl.FLOAT_MAT3: return gluShaderUtil.DataType.FLOAT_MAT3;
case gl.FLOAT_MAT3x4: return gluShaderUtil.DataType.FLOAT_MAT3X4;
case gl.FLOAT_MAT4x2: return gluShaderUtil.DataType.FLOAT_MAT4X2;
case gl.FLOAT_MAT4x3: return gluShaderUtil.DataType.FLOAT_MAT4X3;
case gl.FLOAT_MAT4: return gluShaderUtil.DataType.FLOAT_MAT4;
case gl.INT: return gluShaderUtil.DataType.INT;
case gl.INT_VEC2: return gluShaderUtil.DataType.INT_VEC2;
case gl.INT_VEC3: return gluShaderUtil.DataType.INT_VEC3;
case gl.INT_VEC4: return gluShaderUtil.DataType.INT_VEC4;
case gl.UNSIGNED_INT: return gluShaderUtil.DataType.UINT;
case gl.UNSIGNED_INT_VEC2: return gluShaderUtil.DataType.UINT_VEC2;
case gl.UNSIGNED_INT_VEC3: return gluShaderUtil.DataType.UINT_VEC3;
case gl.UNSIGNED_INT_VEC4: return gluShaderUtil.DataType.UINT_VEC4;
case gl.BOOL: return gluShaderUtil.DataType.BOOL;
case gl.BOOL_VEC2: return gluShaderUtil.DataType.BOOL_VEC2;
case gl.BOOL_VEC3: return gluShaderUtil.DataType.BOOL_VEC3;
case gl.BOOL_VEC4: return gluShaderUtil.DataType.BOOL_VEC4;
case gl.SAMPLER_2D: return gluShaderUtil.DataType.SAMPLER_2D;
case gl.SAMPLER_CUBE: return gluShaderUtil.DataType.SAMPLER_CUBE;
case gl.SAMPLER_2D_ARRAY: return gluShaderUtil.DataType.SAMPLER_2D_ARRAY;
case gl.SAMPLER_3D: return gluShaderUtil.DataType.SAMPLER_3D;
case gl.SAMPLER_2D_SHADOW: return gluShaderUtil.DataType.SAMPLER_2D_SHADOW;
case gl.SAMPLER_CUBE_SHADOW: return gluShaderUtil.DataType.SAMPLER_CUBE_SHADOW;
case gl.SAMPLER_2D_ARRAY_SHADOW: return gluShaderUtil.DataType.SAMPLER_2D_ARRAY_SHADOW;
case gl.INT_SAMPLER_2D: return gluShaderUtil.DataType.INT_SAMPLER_2D;
case gl.INT_SAMPLER_CUBE: return gluShaderUtil.DataType.INT_SAMPLER_CUBE;
case gl.INT_SAMPLER_2D_ARRAY: return gluShaderUtil.DataType.INT_SAMPLER_2D_ARRAY;
case gl.INT_SAMPLER_3D: return gluShaderUtil.DataType.INT_SAMPLER_3D;
case gl.UNSIGNED_INT_SAMPLER_2D: return gluShaderUtil.DataType.UINT_SAMPLER_2D;
case gl.UNSIGNED_INT_SAMPLER_CUBE: return gluShaderUtil.DataType.UINT_SAMPLER_CUBE;
case gl.UNSIGNED_INT_SAMPLER_2D_ARRAY: return gluShaderUtil.DataType.UINT_SAMPLER_2D_ARRAY;
case gl.UNSIGNED_INT_SAMPLER_3D: return gluShaderUtil.DataType.UINT_SAMPLER_3D;
default:
throw new Error('Unrecognized GL type:' + glType);
}
};
});