code: func (gu *gsUniformAttr) Value() interface{} {
  	if !gu.ispointer {
  		return gu.value
  	}
  	switch gu.Type {
  	case glhf.Vec2:
  		return *gu.value.(*mgl32.Vec2)
  	case glhf.Vec3:
  		return *gu.value.(*mgl32.Vec3)
  	case glhf.Vec4:
  		return *gu.value.(*mgl32.Vec4)
  	case glhf.Mat2:
  		return *gu.value.(*mgl32.Mat2)
  	case glhf.Mat23:
  		return *gu.value.(*mgl32.Mat2x3)
  	case glhf.Mat24:
  		return *gu.value.(*mgl32.Mat2x4)
  	case glhf.Mat3:
  		return *gu.value.(*mgl32.Mat3)
  	case glhf.Mat32:
  		return *gu.value.(*mgl32.Mat3x2)
  	case glhf.Mat34:
  		return *gu.value.(*mgl32.Mat3x4)
  	case glhf.Mat4:
  		return *gu.value.(*mgl32.Mat4)
  	case glhf.Mat42:
  		return *gu.value.(*mgl32.Mat4x2)
  	case glhf.Mat43:
  		return *gu.value.(*mgl32.Mat4x3)
  	case glhf.Int:
  		return *gu.value.(*int32)
  	case glhf.Float:
  		return *gu.value.(*float32)
  	default:
  		panic("invalid attrtype")
  	}
  }
docs: // Value returns the attribute's concrete value. If the stored value
  // is a pointer, we return the dereferenced value.