 								GLfloat(components[3]))
 		glUniform1f(poiUniforms.rankThreshold, rankThreshold)
 		
-		for poiPlanes in regionPrimitives.values {
-			_ = poiPlanes.map { (poiPlane) in
-				glUniform1f(poiUniforms.progress, GLfloat(poiPlane.progress))
-				render(primitive: poiPlane.primitive)
-			}
+		for poiPlane in regionPrimitives {
+			glUniform1f(poiUniforms.progress, 1.0)	// $ Lookup progress in fade list
+			render(primitive: poiPlane.primitive)
 		}
+		
 		glDisable(GLenum(GL_BLEND))
 		glPopGroupMarkerEXT()
 	}

		let primitive = IndexedRenderPrimitive(vertices: vertices,
																						indices: indices, scalarAttribs: scalars,
																						color: rank.hashColor.tuple(),
																						ownerHash: container.hashValue,
																						debugName: "\(container.name) - poi plane @ \(rank)")
		return PoiPlane(primitive: primitive, rank: rank, toggleTime: Date())
	}
}
	
extension GeoRegion {
	func poiRenderPlanes() -> [PoiPlane] {
		return sortPlacesIntoPoiPlanes(places, in: self);

	func updatePrimitives<T:GeoNode>(for node: T, with subRegions: Set<T.SubType>)
		where T.SubType : GeoPlaceContainer {
		if AppDelegate.sharedUserState.placeVisited(node) {
			let removedRegionsHash = node.hashValue
			regionPrimitives = regionPrimitives.filter { $0.ownerHash != removedRegionsHash }
			let subregionPrimitives = subRegions.flatMap { $0.poiRenderPlanes() }
			regionPrimitives.append(contentsOf: subregionPrimitives)
		}
	}
	
	func updateZoomThreshold(viewZoom: Float) {
		let previousPois = Set(regionPrimitives.filter { Float($0.rank) <= rankThreshold })
		let visiblePois = Set(regionPrimitives.filter { Float($0.rank) <= viewZoom })

		let A = previousPois.subtracting(visiblePois)	// Culled this frame
		let B = visiblePois.subtracting(previousPois) // Shown this frame
