@Override
        protected Void doInBackground() throws Exception{
            OctTreeNode world = new OctTreeNode(8);
            //OctTreeNode.fillCube(world, new IntPosition(12,1,1), new IntPosition(14,5,5), new ByteVoxel((byte)0x78));
            //OctTreeNode.fillCube(world, new IntPosition(1,12,1), new IntPosition(2,15,5), new ByteVoxel((byte)0xA8));
            world.Insert(VoxelBatch.batch[0xa5], new IntPosition(14,4,4));
            world.Insert(VoxelBatch.batch[0xc5], new IntPosition(14,3,4));
            world.Insert(VoxelBatch.batch[0xf5], new IntPosition(14,4,3));
            world.Insert(VoxelBatch.batch[0x85], new IntPosition(14,3,3));

            int floorSize = 30;
            for(int i = -floorSize; i < floorSize; i++){
                for (int j = -floorSize; j < floorSize; j++){
                    world.Insert(VoxelBatch.batch[(j^i)&0x000000ff], new IntPosition(i,j,-1));
                    world.Insert(VoxelBatch.batch[(j^i)&0x000000ff], new IntPosition(-floorSize,i,j));
                    world.Insert(VoxelBatch.batch[(j^i)&0x000000ff], new IntPosition(floorSize,i,j));
                    world.Insert(VoxelBatch.batch[(j^i)&0x000000ff], new IntPosition(i,j,20));
                    world.Insert(VoxelBatch.batch[(j^i)&0x000000ff], new IntPosition(i,floorSize,j));
                    world.Insert(VoxelBatch.batch[(j^i)&0x000000ff], new IntPosition(i,-floorSize,j));

                }
            }

            Tracer t = new Tracer();
            t.init();
            t.setWorld(world);
            t.cam.SetBackPlaneDistance(200);

            t.cam.x = 0;
            t.cam.y = 0;
            t.cam.z = 10;
            //t.cam.horizontalAngle = Math.PI/4;
            t.cam.verticalAngle=-Math.PI/8;
            int frames = 0;
            int[] mem = new int[FRAME_WIDTH * FRAME_HEIGHT];
            long start = System.currentTimeMillis();
            long end = start + 15000;
            long last = start;
            boolean runForever = false;
            BufferedImage bi = new BufferedImage(FRAME_WIDTH, FRAME_HEIGHT, BufferedImage.TYPE_INT_ARGB);
                
            while (last < end || runForever){
                
                readInputAndUpdateCamera(t.cam);
                
//                int col = colors[frames % colors.length].getRGB();
                
                t.parallelRender(mem,FRAME_WIDTH, FRAME_HEIGHT);
                
                //TODO: Re-Enable this
                if (!runForever)t.cam.horizontalAngle +=Math.PI/128 ;
                
                Image img = createImage(new MemoryImageSource(FRAME_WIDTH,FRAME_HEIGHT, mem, 0, FRAME_WIDTH));
                Graphics2D g2 = bi.createGraphics();
                g2.drawImage(img, 0, 0, null);
                g2.dispose();
                publish(bi);
                
                last = System.currentTimeMillis();
                frames++;
                
            }
            System.err.println("Frames = " + frames + ", fps = " + ((double) frames / (last - start) * 1000));
            return null;
        }