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 (); }