void IndexTable::Calculate (int sides)
	{
		IndexBuffer *buf = &buffers[sides];
		buf->Init (sizeof(index_t)*MAX_INDICES);
		index_t *begin = (index_t*)buf->LockData (), *i = begin;

		int ystart = 0, xstart = 0;
		int yend = QUAD_W, xend = QUAD_W;
		if (sides & left_bit) xstart++;
		if (sides & right_bit) xend--;
		if (sides & up_bit) ystart++;
		if (sides & down_bit) yend--;

		if (sides & up_bit) {
			for (int x=xstart;x<QUAD_W;x++) {
				if (x&1) {
					TRI(x-1, x+1, VERTC+x);
					if (x<xend) TRI(x+1, VERTC+x+1, VERTC+x);
				} else {
					TRI(x, VERTC+x+1, VERTC+x);
				}
			}
		}

		for (int y=ystart;y<QUAD_W;y++)
		{
			if (sides & left_bit) {
				if (y&1) {
					TRI(VRT(0,y-1),VRT(1,y),VRT(0,y+1));
					if (y<yend) TRI(VRT(1,y),VRT(1,y+1),VRT(0,y+1));
				} else {
					TRI(VRT(0,y),VRT(1,y),VRT(1,y+1));
				}
			}

			if (y>=ystart && y<yend) {
				for (int x=xstart;x<xend;x++)
				{
					TRI(y*VERTC+x, y*VERTC+x+1, (y+1)*VERTC+x+1);
					TRI(y*VERTC+x, (y+1)*VERTC+x+1, (y+1)*VERTC+x);
				}
			}

			if (sides & right_bit) {
				int x=QUAD_W-1;
				if (y&1) {
					TRI(VRT(x+1,y-1),VRT(x+1,y+1),VRT(x,y));
					if(y<yend) TRI(VRT(x,y),VRT(x+1,y+1),VRT(x,y+1));
				} else {
					TRI(VRT(x,y),VRT(x+1,y),VRT(x,y+1));
				}
			}
		}

		if (sides & down_bit) {
			int y=QUAD_W-1;
			for (int x=xstart;x<QUAD_W;x++) {
				if (x&1) {
					TRI(VRT(x,y),VRT(x+1,y+1),VRT(x-1,y+1));
					if (x<xend) TRI(VRT(x,y),VRT(x+1,y),VRT(x+1,y+1));
				} else {
					TRI(VRT(x,y),VRT(x+1,y),VRT(x,y+1));
				}
			}
		}

		size[sides]=i-begin;
		assert (size[sides]<=MAX_INDICES);
		buf->UnlockData ();
	}