public static List<MeshFilter> fillCell(Vector3 start, Vector3 end, Vector3 size, Vector3 dimensions, Transform parent, Color color, Vector3 normal) {
			List<MeshFilter> meshes = new List<MeshFilter> ();

			// Calculate edge and it's magnitude
			Vector3 edge = end-start;
			Vector3 direction = edge.normalized;
			float magnitude = edge.magnitude;

			Quaternion rotation = Quaternion.FromToRotation (Vector3.forward, direction);

			int numCells = (int) Mathf.Floor(magnitude / dimensions.z) + 1; // Floor the number of cells and add one (no Roof method is available)
			float magnitudeOvershoot = -(magnitude - numCells * dimensions.z);
			Vector3 startCenter = start + direction * dimensions.z / 2;

			float overshootSize = dimensions.z - magnitudeOvershoot;

			for (int i = 0; i < numCells; i++) {
				Vector3 p = startCenter + i * direction * dimensions.z;
				if (i == numCells - 1) {
					if (overshootSize > 0.01f) {
						size.z = overshootSize;
						p -= magnitudeOvershoot / 2 * direction;
						Cell c = new Cell (parent, p, size, rotation, "CellOvershoot", normal);
						c.setColor(color);
						meshes.Add(c.getCell ().GetComponent<MeshFilter> ());
					}
				} else {
					Cell c = new Cell (parent, p, size, rotation, "Cell", normal);
					c.setColor(color);
					meshes.Add (c.getCell ().GetComponent<MeshFilter> ());
				}
			}
			return meshes;
		}
		public override List<MeshFilter> apply (Corner corner)
		{
			List<MeshFilter> meshes = new List<MeshFilter> ();
			Vector3 normal = corner.getNormal ();
			Vector3 p = corner.getVertex ().getPoint ();

			p = parent.TransformPoint (p);
			Vector3 scale = this.getCornerScale ();

			foreach (HighLevelEdge e in corner.getEdges()) {
				Vector3 direction = e.getDirection (corner).normalized;
//				Debug.DrawRay (p, direction * 0.2f, Color.cyan, 200);
				Quaternion rotation = Quaternion.FromToRotation(Vector3.forward, direction);
				Vector3 location = p + direction * scale.z / 2 + e.getNormal () * scale.x / 2;
				Cell c = new Cell (parent, location, scale, rotation, "BrickCorner");
				meshes.Add(c.getCell ().GetComponent<MeshFilter> ());
			}


//			p += Vector3.Scale(translateVector, dimensions / 2);

//			Cell c = new Cell (parent, p, scale, Quaternion.identity, "BrickCorner");
//			Color finalColor = Color.Lerp (color, Color.black, UnityEngine.Random.value * 0.3f);
//			c.setColor (finalColor);

			return meshes;
		}
		public override List<MeshFilter> apply (Corner corner)
		{
			List<MeshFilter> meshes = new List<MeshFilter>();
			Vector3 translateVector = corner.getTranslateVector ();
			Vector3 p = corner.getVertex ().getPoint ();

			p = parent.TransformPoint (p);

			Vector3 scale = this.getCornerScale ();

			p += Vector3.Scale(translateVector, dimensions / 2);

			Cell c = new Cell (parent, p, scale, Quaternion.identity, "BrickCorner");
			Color finalColor = Color.Lerp (color, Color.black, UnityEngine.Random.value * 0.3f);
			c.setColor (finalColor);
			meshes.Add (c.getCell ().GetComponent<MeshFilter> ());
			return meshes;
		}
		public override List<MeshFilter> apply (HighLevelEdge edge)
		{
			List<MeshFilter> meshes = new List<MeshFilter> ();
			Vector3 cornerDimensions = new Vector3 (1.0f, 1.0f, 1.0f);

			// Get points of edge and translate to world space
			Corner cFrom = edge.getFrom();
			Vector3 from = edge.getFrom ().getVertex().getPoint();
			Vector3 to = edge.getTo ().getVertex().getPoint();
			from = parent.TransformPoint (from);
			to = parent.TransformPoint (to);

			// Get other two edges for brick direction
			HighLevelEdge e1 = null, e2 = null;
			foreach (HighLevelEdge e in edge.getFrom().getEdges()) {
				if (e.Equals (edge))
					continue;
				else if (e1 == null) {
					e1 = e;
				} else if (e2 == null) {
					e2 = e;
				} else {
					Debug.Log ("Warning more then 3 edges, likely invalid render");
				}
			}

			if (e2 == null) {
				Debug.Log ("Warning, corner with only one edge found, something went wrong!");
				return meshes;
			}

			// Calculate rotation for the two directions
			Vector3 e1Dir = e1.getDirection(cFrom).normalized;
			Vector3 e2Dir = e2.getDirection(cFrom).normalized;

			Quaternion rotationE1 = Quaternion.FromToRotation(Vector3.forward, e1Dir);
			Quaternion rotationE2 = Quaternion.FromToRotation (Vector3.forward, e2Dir);

			// Get direction and translate to world space
			Vector3 direction = edge.getDirection ();
			direction = parent.TransformDirection (direction);
			float edgeMagnitude = parent.TransformVector (direction).magnitude - cornerDimensions.y * 2;

			direction.Normalize ();

			// Set from and to actual center points of the corner
			from = from + Vector3.Scale (edge.getFrom ().getTranslateVector (), cornerDimensions/2) + Vector3.Scale(direction, cornerDimensions/2);
			to = to + Vector3.Scale (edge.getTo ().getTranslateVector (), cornerDimensions/2) - Vector3.Scale(direction, cornerDimensions/2);

			edgeMagnitude = (to-from).magnitude;

			// These are all world space
			Vector3 dimensions = this.getCellDimensions ();
			Vector3 scale = this.getCellSize();

			// Calculate start position
			Vector3 start = from + direction * dimensions.y / 2;

			// Create each cell
			int maxCount = (int) Mathf.Floor(edgeMagnitude / scale.y) - 1;
			int i = 0;
			bool takeDir1 = direction.y >= 0;

			float stepSize = dimensions.y;

			for (Vector3 p = start; i < maxCount; p += direction * stepSize) {
				Cell c;
				Color finalColor = Color.Lerp (color, Color.black, UnityEngine.Random.value * 0.3f);
				if (takeDir1) {
					c = new Cell (parent, p + (dimensions.z / 2 - cornerDimensions.z / 2) * e1Dir, scale, rotationE1, "CornerEdgeBrick");
				} else {
					c = new Cell (parent, p + (dimensions.z / 2 - cornerDimensions.z / 2) * e2Dir, scale, rotationE2, "CornerEdgeBrick");
				}
				takeDir1 = !takeDir1;
				c.setColor (finalColor);
				i++;
				meshes.Add(c.getCell().GetComponent<MeshFilter>());
			}

			return meshes;
		}