text: // @flow
  
  import {
      Uniform1f,
      Uniform2f,
      UniformMatrix4f
  } from '../uniform_binding';
  import EXTENT from '../../data/extent';
  import type Context from '../../gl/context';
  import type {UniformValues, UniformLocations} from '../uniform_binding';
  import type Transform from '../../geo/transform';
  import type Tile from '../../source/tile';
  
  export type CollisionUniformsType = {|
      'u_matrix': UniformMatrix4f,
      'u_camera_to_center_distance': Uniform1f,
      'u_extrude_scale': Uniform2f
  |};
  
  export type CollisionCircleUniformsType = {|
      'u_matrix': UniformMatrix4f,
      'u_inv_matrix': UniformMatrix4f,
      'u_camera_to_center_distance': Uniform1f,
      'u_viewport_size': Uniform2f
  |};
  
  const collisionUniforms = (context: Context, locations: UniformLocations): CollisionUniformsType => ({
      'u_matrix': new UniformMatrix4f(context, locations.u_matrix),
      'u_camera_to_center_distance': new Uniform1f(context, locations.u_camera_to_center_distance),
      'u_extrude_scale': new Uniform2f(context, locations.u_extrude_scale)
  });
  
  const collisionCircleUniforms = (context: Context, locations: UniformLocations): CollisionCircleUniformsType => ({
      'u_matrix': new UniformMatrix4f(context, locations.u_matrix),
      'u_inv_matrix': new UniformMatrix4f(context, locations.u_inv_matrix),
      'u_camera_to_center_distance': new Uniform1f(context, locations.u_camera_to_center_distance),
      'u_viewport_size': new Uniform2f(context, locations.u_viewport_size)
  });
  
  const collisionUniformValues = (
      matrix: Float32Array,
      transform: Transform,
      tile: Tile
  ): UniformValues<CollisionUniformsType> => {
      const pixelRatio = EXTENT / tile.tileSize;
      return {
          'u_matrix': matrix,
          'u_camera_to_center_distance': transform.cameraToCenterDistance,
          'u_extrude_scale': [transform.pixelsToGLUnits[0] / pixelRatio,
              transform.pixelsToGLUnits[1] / pixelRatio]
      };
  };
  
  const collisionCircleUniformValues = (
      matrix: Float32Array,
      invMatrix: Float32Array,
      transform: Transform
  ): UniformValues<CollisionCircleUniformsType> => {
      return {
          'u_matrix': matrix,
          'u_inv_matrix': invMatrix,
          'u_camera_to_center_distance': transform.cameraToCenterDistance,
          'u_viewport_size': [transform.width, transform.height]
      };
  };
  
  export {collisionUniforms, collisionUniformValues, collisionCircleUniforms, collisionCircleUniformValues};
  