Source: dependencies/pixi-gl-core/shader/generateUniformAccessObject.js

dependencies/pixi-gl-core/shader/generateUniformAccessObject.js

  1. /**
  2. * Extracts the attributes
  3. * @class
  4. * @memberof PIXI.glCore.shader
  5. * @param gl {WebGLRenderingContext} The current WebGL rendering context
  6. * @param uniforms {Array} @mat ?
  7. * @return attributes {Object}
  8. */
  9. var generateUniformAccessObject = function(gl, uniformData)
  10. {
  11. // this is the object we will be sending back.
  12. // an object hierachy will be created for structs
  13. var uniforms = {data:{}};
  14. uniforms.gl = gl;
  15. var uniformKeys= Object.keys(uniformData);
  16. for (var i = 0; i < uniformKeys.length; i++)
  17. {
  18. var fullName = uniformKeys[i];
  19. var nameTokens = fullName.split('.');
  20. var name = nameTokens[nameTokens.length - 1];
  21. var uniformGroup = getUniformGroup(nameTokens, uniforms);
  22. var uniform = uniformData[fullName];
  23. uniformGroup.data[name] = uniform;
  24. uniformGroup.gl = gl;
  25. Object.defineProperty(uniformGroup, name, {
  26. get: generateGetter(name),
  27. set: generateSetter(name, uniform)
  28. });
  29. }
  30. return uniforms;
  31. };
  32. var generateGetter = function(name)
  33. {
  34. return function() {
  35. return this.data[name].value;
  36. };
  37. };
  38. var GLSL_SINGLE_SETTERS = {
  39. float: function setSingleFloat(gl, location, value) { gl.uniform1f(location, value); },
  40. vec2: function setSingleVec2(gl, location, value) { gl.uniform2f(location, value[0], value[1]); },
  41. vec3: function setSingleVec3(gl, location, value) { gl.uniform3f(location, value[0], value[1], value[2]); },
  42. vec4: function setSingleVec4(gl, location, value) { gl.uniform4f(location, value[0], value[1], value[2], value[3]); },
  43. int: function setSingleInt(gl, location, value) { gl.uniform1i(location, value); },
  44. ivec2: function setSingleIvec2(gl, location, value) { gl.uniform2i(location, value[0], value[1]); },
  45. ivec3: function setSingleIvec3(gl, location, value) { gl.uniform3i(location, value[0], value[1], value[2]); },
  46. ivec4: function setSingleIvec4(gl, location, value) { gl.uniform4i(location, value[0], value[1], value[2], value[3]); },
  47. bool: function setSingleBool(gl, location, value) { gl.uniform1i(location, value); },
  48. bvec2: function setSingleBvec2(gl, location, value) { gl.uniform2i(location, value[0], value[1]); },
  49. bvec3: function setSingleBvec3(gl, location, value) { gl.uniform3i(location, value[0], value[1], value[2]); },
  50. bvec4: function setSingleBvec4(gl, location, value) { gl.uniform4i(location, value[0], value[1], value[2], value[3]); },
  51. mat2: function setSingleMat2(gl, location, value) { gl.uniformMatrix2fv(location, false, value); },
  52. mat3: function setSingleMat3(gl, location, value) { gl.uniformMatrix3fv(location, false, value); },
  53. mat4: function setSingleMat4(gl, location, value) { gl.uniformMatrix4fv(location, false, value); },
  54. sampler2D: function setSingleSampler2D(gl, location, value) { gl.uniform1i(location, value); },
  55. };
  56. var GLSL_ARRAY_SETTERS = {
  57. float: function setFloatArray(gl, location, value) { gl.uniform1fv(location, value); },
  58. vec2: function setVec2Array(gl, location, value) { gl.uniform2fv(location, value); },
  59. vec3: function setVec3Array(gl, location, value) { gl.uniform3fv(location, value); },
  60. vec4: function setVec4Array(gl, location, value) { gl.uniform4fv(location, value); },
  61. int: function setIntArray(gl, location, value) { gl.uniform1iv(location, value); },
  62. ivec2: function setIvec2Array(gl, location, value) { gl.uniform2iv(location, value); },
  63. ivec3: function setIvec3Array(gl, location, value) { gl.uniform3iv(location, value); },
  64. ivec4: function setIvec4Array(gl, location, value) { gl.uniform4iv(location, value); },
  65. bool: function setBoolArray(gl, location, value) { gl.uniform1iv(location, value); },
  66. bvec2: function setBvec2Array(gl, location, value) { gl.uniform2iv(location, value); },
  67. bvec3: function setBvec3Array(gl, location, value) { gl.uniform3iv(location, value); },
  68. bvec4: function setBvec4Array(gl, location, value) { gl.uniform4iv(location, value); },
  69. sampler2D: function setSampler2DArray(gl, location, value) { gl.uniform1iv(location, value); },
  70. };
  71. function generateSetter(name, uniform)
  72. {
  73. return function(value) {
  74. this.data[name].value = value;
  75. var location = this.data[name].location;
  76. if (uniform.size === 1)
  77. {
  78. GLSL_SINGLE_SETTERS[uniform.type](this.gl, location, value);
  79. }
  80. else
  81. {
  82. // glslSetArray(gl, location, type, value) {
  83. GLSL_ARRAY_SETTERS[uniform.type](this.gl, location, value);
  84. }
  85. };
  86. }
  87. function getUniformGroup(nameTokens, uniform)
  88. {
  89. var cur = uniform;
  90. for (var i = 0; i < nameTokens.length - 1; i++)
  91. {
  92. var o = cur[nameTokens[i]] || {data:{}};
  93. cur[nameTokens[i]] = o;
  94. cur = o;
  95. }
  96. return cur;
  97. }
  98. module.exports = generateUniformAccessObject;