Page 1 of 1

how and when to invert sprite virtically ?

Posted: Wed Jan 17, 2007 10:11 pm
by mattmatteh
how and when do i invert sprites vertically ? (sprite_attribute & 0x80)


Posted: Wed Jan 17, 2007 10:30 pm
by Disch
When the sprite is evaluated -- the attributes are fetched first to see if they're to be flipped vertically.

The 'normal' CHR is determined by the subtraction of the current scanline and the sprite Y coord (also used to determine whether or not the sprite is in-range). Ex:

Code: Select all

u16 is_in_range = current_scanline - sprite_Y;
if(is_in_range < 8)
  // sprite is in range
  //  fetch CHR according to is_in_range
  //  ie:  if is_in_range == 5, CHR comes from $xxx5 and $xxxD
To flip vertically -- simply XOR is_in_range with $7 (8x8 sprites) or $F (8x16 sprites) after the sprite is found to be in range.

Posted: Thu Jan 18, 2007 10:24 am
by blargg
In case anyone misses it, Disch is using a trick of unsigned values in the comparison with 8. These are equivalent:

Code: Select all

unsigned n = current_scanline - sprite_y;
if ( n < 8 )

int n = current_scanline - sprite_y;
if ( n >= 0 && n < 8 )
This works because a negative value converted to unsigned becomes a large positive value. It's a good trick to learn.

Posted: Thu Jan 18, 2007 3:27 pm
by Zepper
There's a detail which I handle inside the own rendering core: the PPU clipping. So, instead of ">= 0" I use ">= ppu_clip_sprites", 0 or 8.

Posted: Fri Jan 19, 2007 9:29 pm
by Disch
I think you're mixing up sprite clipping with in-range evaluations.

Posted: Sat Jan 20, 2007 5:49 am
by Zepper
I guess so... :lol:
Anyway, thanks for the unsigned tip.