docs: function buildEdgeNormalRanges(edge) {
  	let front = {};
  	let back = {};
  	
  	let m_v0 = edge.vertices[0];
  	let m_v1 = edge.vertices[1];
  	let m_v2 = edge.vertices[2];
  	let m_v3 = edge.vertices[3];
  	
  	let hasVertex0 = !!m_v0;
  	let hasVertex3 = !!m_v3;
  	
  	let edge0;
  	let edge1 = Vector.sub(m_v2, m_v1);
  	edge1 = Vector.normalise(edge1);
  	let edge2;
  	
  	let m_normal0 = edge.normals[0];
  	let m_normal1 = edge.normals[1];
  	let m_normal2 = edge.normals[2];
  
  	let convex1 = false;
  	let convex2 = false;
  	
  	// Is there a leading edge, is it convex?
  	if (hasVertex0) {
  		edge0 = Vector.sub(m_v1, m_v0);
  		edge0 = Vector.normalise(edge0);
  		convex1 = Vector.cross(edge0, edge1) >= 0.0;
  	}
  	
  	// Is there a trailing edge, is it convex?
  	if (hasVertex3) {
  		edge2 = Vector.sub(m_v3, m_v2);
  		edge2 = Vector.normalise(edge2);
  		convex2 = Vector.cross(edge1, edge2) >= 0.0;
  	}
  	
  	// Determine collision normal limits for front and back collisions
  	if (hasVertex0 && hasVertex3) {
  		if (convex1 && convex2) {
  			front.normal = m_normal1;
  			front.lowerLimit = m_normal0;
  			front.upperLimit = m_normal2;
  
  			back.normal = Vector.neg(m_normal1);
  			back.lowerLimit = Vector.neg(m_normal1);
  			back.upperLimit = Vector.neg(m_normal1);
  		}  else if (convex1) {
  			front.normal = m_normal1;
  			front.lowerLimit = m_normal0;
  			front.upperLimit = m_normal1;
  			
  			back.normal = Vector.neg(m_normal1);
  			back.lowerLimit = Vector.neg(m_normal2);
  			back.upperLimit = Vector.neg(m_normal1);
  		} else if (convex2)	{
  			front.normal = m_normal1;
  			front.lowerLimit = m_normal1;
  			front.upperLimit = m_normal2;
  			
  			back.normal = Vector.neg(m_normal1);
  			back.lowerLimit = Vector.neg(m_normal1);
  			back.upperLimit = Vector.neg(m_normal0);
  		} else {
  			front.normal = m_normal1;
  			front.lowerLimit = m_normal1;
  			front.upperLimit = m_normal1;
  
  			back.normal = Vector.neg(m_normal1);
  			back.lowerLimit = Vector.neg(m_normal2);
  			back.upperLimit = Vector.neg(m_normal0);
  		}
  	} else if (hasVertex0) {
  		if (convex1) {
  			front.normal = m_normal1;
  			front.lowerLimit = m_normal0;
  			front.upperLimit = Vector.neg(m_normal1);
  			
  			back.normal = Vector.neg(m_normal1);
  			back.lowerLimit = m_normal1;
  			back.upperLimit = Vector.neg(m_normal1);
  		} else {
  			front.normal = m_normal1;
  			front.lowerLimit = m_normal1;
  			front.upperLimit = Vector.neg(m_normal1);
  			
  			back.normal = Vector.neg(m_normal1);
  			back.lowerLimit = m_normal1;
  			back.upperLimit = Vector.neg(m_normal0);
  		}
  	} else if (hasVertex3) {
  		if (convex2) {
  			front.normal = m_normal1;
  			front.lowerLimit = Vector.neg(m_normal1);
  			front.upperLimit = m_normal2;
  
  			back.normal = Vector.neg(m_normal1);
  			back.lowerLimit = Vector.neg(m_normal1);
  			back.upperLimit = m_normal1;
  		} else {
  			front.normal = m_normal1;
  			front.lowerLimit = Vector.neg(m_normal1);
  			front.upperLimit = m_normal1;
  
  			back.normal = Vector.neg(m_normal1);
  			back.lowerLimit = Vector.neg(m_normal2);
  			back.upperLimit = m_normal1;
  		}
  	} else {
  		front.normal = m_normal1;
  		front.lowerLimit = Vector.neg(m_normal1);
  		front.upperLimit = Vector.neg(m_normal1);
  
  		back.normal = Vector.neg(m_normal1);
  		back.lowerLimit = m_normal1;
  		back.upperLimit = m_normal1;
  	}
  	
  	edge.convexPrev = convex1;
  	edge.convexNext = convex2;
  	
  	edge.normalRanges = {
  		front,
  		back
  	};
  }