randomVector3 (attribute, index, base, spread, spreadClamp) {
        'use strict'

        let x = base.x + (Math.random() * spread.x - (spread.x * 0.5)),
            y = base.y + (Math.random() * spread.y - (spread.y * 0.5)),
            z = base.z + (Math.random() * spread.z - (spread.z * 0.5))

        // var x = this.randomFloat( base.x, spread.x ),
        // y = this.randomFloat( base.y, spread.y ),
        // z = this.randomFloat( base.z, spread.z );

        if (spreadClamp) {
            x = -spreadClamp.x * 0.5 + this.roundToNearestMultiple(x, spreadClamp.x)
            y = -spreadClamp.y * 0.5 + this.roundToNearestMultiple(y, spreadClamp.y)
            z = -spreadClamp.z * 0.5 + this.roundToNearestMultiple(z, spreadClamp.z)
        }

        attribute.typedArray.setVec3Components(index, x, y, z)
    }
Given an SPE.ShaderAttribute instance, and various other settings,
assign values to the attribute's array in a `vec3` format.

@param  {Object} attribute   The instance of SPE.ShaderAttribute to save the result to.
@param  {Number} index       The offset in the attribute's TypedArray to save the result from.
@param  {Object} base        THREE.Vector3 instance describing the start value.
@param  {Object} spread      THREE.Vector3 instance describing the random variance to apply to the start value.
@param  {Object} spreadClamp THREE.Vector3 instance describing the multiples to clamp the randomness to.