private EntityTreeNode<EC> subDivide() {
			ArrayList<EC> oldEntities = localEntities;
			double
				bMinX = maxX, bMinY = maxY, bMinZ = maxZ,
				bMaxX = minX, bMaxY = minY, bMaxZ = minZ;
			for( EntityRange e : oldEntities ) {
				AABB aabb = e.getAabb();
				assert aabb.isFinite();
				bMinX = Math.min(bMinX, aabb.minX);
				bMinY = Math.min(bMinY, aabb.minY);
				bMinZ = Math.min(bMinZ, aabb.minZ);
				bMaxX = Math.max(bMaxX, aabb.maxX);
				bMaxY = Math.max(bMaxY, aabb.maxY);
				bMaxZ = Math.max(bMaxZ, aabb.maxZ);
			}
			
			char maxDim = 'x';
			if( bMaxY-bMinY > bMaxX-bMinX ) maxDim = 'y';
			if( bMaxZ-bMinZ > bMaxY-bMinY ) maxDim = 'z';
			
			switch( maxDim ) {
			case 'x':
				double divX = bMinX+(bMaxX-bMinX)/2;
				subNodeA = new EntityTreeNode<EC>( minX, minY, minZ, divX, maxY, maxZ );
				subNodeB = new EntityTreeNode<EC>( divX, minY, minZ, maxX, maxY, maxZ );
				break;
			case 'y':
				double divY = bMinY+(bMaxY-bMinY)/2;
				subNodeA = new EntityTreeNode<EC>( minX, minY, minZ, maxX, divY, maxZ );
				subNodeB = new EntityTreeNode<EC>( minX, divY, minZ, maxX, maxY, maxZ );
				break;
			case 'z':
				double divZ = bMinZ+(bMaxZ-bMinZ)/2;
				subNodeA = new EntityTreeNode<EC>( minX, minY, minZ, maxX, maxY, divZ );
				subNodeB = new EntityTreeNode<EC>( minX, minY, divZ, maxX, maxY, maxZ );
				break;
			}
			
			localEntities = new ArrayList<EC>();
			for( EC e : oldEntities ) {
				AABB aabb = e.getAabb();
				if( subNodeA.contains(aabb) ) {
					subNodeA.add(e);
				} else if( subNodeB.contains(aabb) ) {
					subNodeB.add(e);
				} else {
					localEntities.add(e);
				}
			}
			subNodeA.freeze();
			subNodeB.freeze();
			return this;
		}