function setBlockUniforms(uniformBlockInfo, values) {
  var setters = uniformBlockInfo.setters;

  for (var name in values) {
    var setter = setters[name];

    if (setter) {
      var value = values[name];
      setter(value);
    }
  }
}
Sets values of a uniform block object

@param {module:twgl.UniformBlockInfo} uniformBlockInfo A UniformBlockInfo as returned by {@link module:twgl.createUniformBlockInfo}.
@param {Object.<string, ?>} values A uniform name to value map where the value is correct for the given
   type of uniform. So for example given a block like

      uniform SomeBlock {
        float someFloat;
        vec2 someVec2;
        vec3 someVec3Array[2];
        int someInt;
      }

 You can set the values of the uniform block with

      twgl.setBlockUniforms(someBlockInfo, {
         someFloat: 12.3,
         someVec2: [1, 2],
         someVec3Array: [1, 2, 3, 4, 5, 6],
         someInt: 5,
      }

 Arrays can be JavaScript arrays or typed arrays

 You can also fill out structure and array values either via
 shortcut. Example

    // -- in shader --
    struct Light {
      float intensity;
      vec4 color;
      float nearFar[2];
    };
    uniform Lights {
      Light lights[2];
    };

    // in JavaScript

    twgl.setBlockUniforms(someBlockInfo, {
      lights: [
        { intensity: 5.0, color: [1, 0, 0, 1], nearFar[0.1, 10] },
        { intensity: 2.0, color: [0, 0, 1, 1], nearFar[0.2, 15] },
      ],
    });

  or the more traditional way

    twgl.setBlockUniforms(someBlockInfo, {
      "lights[0].intensity": 5.0,
      "lights[0].color": [1, 0, 0, 1],
      "lights[0].nearFar": [0.1, 10],
      "lights[1].intensity": 2.0,
      "lights[1].color": [0, 0, 1, 1],
      "lights[1].nearFar": [0.2, 15],
    });

  You can also specify partial paths

    twgl.setBlockUniforms(someBlockInfo, {
      'lights[1]': { intensity: 5.0, color: [1, 0, 0, 1], nearFar[0.2, 15] },
    });

  But you can not specify leaf array indices.

    twgl.setBlockUniforms(someBlockInfo, {
      'lights[1].nearFar[1]': 15,     // BAD! nearFar is a leaf
      'lights[1].nearFar': [0.2, 15], // GOOD
    });

 **IMPORTANT!**, packing in a UniformBlock is unintuitive.
 For example the actual layout of `someVec3Array` above in memory
 is `1, 2, 3, unused, 4, 5, 6, unused`. twgl takes in 6 values
 as shown about and copies them, skipping the padding. This might
 be confusing if you're already familiar with Uniform blocks.

 If you want to deal with the padding yourself you can access the array
 buffer views directly. eg:

     someBlockInfo.someVec3Array.set([1, 2, 3, 0, 4, 5, 6, 0]);

 Any name that doesn't match will be ignored
@memberOf module:twgl/programs