public static World initWorld( ResourceContext rc ) throws IOException {
		final DemoBlocks blocks = DemoBlocks.load(rc);
		
		final GenericPhysicalNonTileInternals crateInternals = getCrateInternals(rc);
		final SubstanceContainerInternals fuelCanInternals = getFuelCanInternals(rc);
		
		int worldSizePower = 24;
		int worldDataOrigin = -(1<<(worldSizePower-1));
		
		RSTNode n = QuadRSTNode.createHomogeneous(blocks.bricks.stack, worldSizePower);
		n = RSTUtil.fillShape( n, worldDataOrigin, worldDataOrigin, worldSizePower, new TCircle( -2, -2, 4 ), new SolidNodeFiller( BlockStackRSTNode.EMPTY ));
		n = RSTUtil.fillShape( n, worldDataOrigin, worldDataOrigin, worldSizePower, new TCircle( +2, +2, 4 ), new SolidNodeFiller( BlockStackRSTNode.EMPTY ));
		
		n = RSTUtil.fillShape( n, worldDataOrigin, worldDataOrigin, worldSizePower, new TRectangle( 3, 0, 32, 32 ), new SolidNodeFiller( BlockStackRSTNode.EMPTY ));
		n = RSTUtil.fillShape( n, worldDataOrigin, worldDataOrigin, worldSizePower, new TRectangle( 3, 31, 32, 1 ), new SolidNodeFiller( blocks.spikes.stack ));
		
		n = RSTUtil.fillShape( n, worldDataOrigin, worldDataOrigin, worldSizePower, new TRectangle( -24, 0, 20, 4 ), new SolidNodeFiller( BlockStackRSTNode.EMPTY ));
		n = RSTUtil.fillShape( n, worldDataOrigin, worldDataOrigin, worldSizePower, new TRectangle( -24, 4, 20, 1 ), new SolidNodeFiller( blocks.dirt.stack ));
		n = RSTUtil.fillShape( n, worldDataOrigin, worldDataOrigin, worldSizePower, new TRectangle( -24, 3, 20, 1 ), new RSTNodeUpdater() {
			final RSTNode treeAndGrass = BlockStackRSTNode.create(new Block[] { blocks.tree, blocks.grass } );
			final Random r = new Random();
			@Override public RSTNode update(RSTNode oldNode, int x, int y, int sizePower) {
				double v = r.nextDouble();
				return v < 0.1 ? blocks.bricks.stack : v < 0.25 ? treeAndGrass : blocks.grass.stack;
			}
		});
		
		EntitySpatialTreeIndex<NonTile> nonTiles = new EntitySpatialTreeIndex<NonTile>();
		
		Random r = new Random();
		for( int i=0; i<10; ++i ) {
			double sx = 0, sy = 0, dir = 0, rad = 8;
			while( rad > 1 ) {
				n = RSTUtil.fillShape( n, worldDataOrigin, worldDataOrigin, worldSizePower, new TCircle( sx, sy, rad ), new SolidNodeFiller( BlockStackRSTNode.EMPTY ));
				sx += Math.cos(dir);
				sy += Math.sin(dir);
				dir += r.nextGaussian() * 0.1;
				rad *= (0.996 + r.nextGaussian()*0.02);
			}
			//nonTiles = nonTiles.with( new BlargNonTile(0, 0, sx, sy, 0, 0, fuelCanInternals) );
		}
		
		for( int i=0; i<20; ++i ) {
			double sx = r.nextGaussian() * 10;
			double sy = r.nextGaussian() * 10;
			//nonTiles = nonTiles.with( new BlargNonTile(0, 0, sx, sy, 0, 0, crateInternals) );
		}
		
		nonTiles = nonTiles.with( new BlargNonTile(0, 0, -5, 0, 0, 0, fuelCanInternals) );
		
		return new World(0, n, worldSizePower, nonTiles,
			new LayerLink(true, new SoftResourceHandle<Layer>("urn:sha1:blah"), 0, 0, 0, 0xFF001122)
		);
	}