/*------------------------------------------------------------------------- * 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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} */ 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} */ 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); } }; });