Mercurial > repos > blastem
comparison vdp.c @ 27:aa1c47fab3f1
Fix sprite transparency for overlapping sprites
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 08 Dec 2012 16:58:11 -0800 |
parents | a7c2b92d8056 |
children | 037963b4c92d |
comparison
equal
deleted
inserted
replaced
26:a7c2b92d8056 | 27:aa1c47fab3f1 |
---|---|
36 dir = -1; | 36 dir = -1; |
37 } else { | 37 } else { |
38 x = d->x_pos; | 38 x = d->x_pos; |
39 dir = 1; | 39 dir = 1; |
40 } | 40 } |
41 printf("Draw Slot %d of %d, Rendering sprite cell from %X to x: %d\n", context->cur_slot, context->sprite_draws, d->address, x); | 41 //printf("Draw Slot %d of %d, Rendering sprite cell from %X to x: %d\n", context->cur_slot, context->sprite_draws, d->address, x); |
42 context->cur_slot--; | 42 context->cur_slot--; |
43 for (uint16_t address = d->address; address < d->address+4; address++) { | 43 for (uint16_t address = d->address; address < d->address+4; address++) { |
44 if (x >= 0 && x < 320) { | 44 if (x >= 0 && x < 320 && !(context->linebuf[x] & 0xF)) { |
45 context->linebuf[x] = (context->vdpmem[address] >> 4) | d->pal_priority; | 45 context->linebuf[x] = (context->vdpmem[address] >> 4) | d->pal_priority; |
46 } | 46 } |
47 x += dir; | 47 x += dir; |
48 if (x >= 0 && x < 320) { | 48 if (x >= 0 && x < 320 && !(context->linebuf[x] & 0xF)) { |
49 context->linebuf[x] = (context->vdpmem[address] & 0xF) | d->pal_priority; | 49 context->linebuf[x] = (context->vdpmem[address] & 0xF) | d->pal_priority; |
50 } | 50 } |
51 x += dir; | 51 x += dir; |
52 } | 52 } |
53 } | 53 } |
64 uint16_t address = context->sprite_index * 8 + sat_address; | 64 uint16_t address = context->sprite_index * 8 + sat_address; |
65 int16_t y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) - 128; | 65 int16_t y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) - 128; |
66 uint8_t height = ((context->vdpmem[address+2] & 0x3) + 1) * 8; | 66 uint8_t height = ((context->vdpmem[address+2] & 0x3) + 1) * 8; |
67 //printf("Sprite %d | y: %d, height: %d\n", context->sprite_index, y, height); | 67 //printf("Sprite %d | y: %d, height: %d\n", context->sprite_index, y, height); |
68 if (y <= line && line < (y + height)) { | 68 if (y <= line && line < (y + height)) { |
69 printf("Sprite %d at y: %d with height %d is on line %d\n", context->sprite_index, y, height, line); | 69 //printf("Sprite %d at y: %d with height %d is on line %d\n", context->sprite_index, y, height, line); |
70 context->sprite_info_list[--(context->slot_counter)].size = context->vdpmem[address+2]; | 70 context->sprite_info_list[--(context->slot_counter)].size = context->vdpmem[address+2]; |
71 context->sprite_info_list[context->slot_counter].index = context->sprite_index; | 71 context->sprite_info_list[context->slot_counter].index = context->sprite_index; |
72 context->sprite_info_list[context->slot_counter].y = y; | 72 context->sprite_info_list[context->slot_counter].y = y; |
73 } | 73 } |
74 context->sprite_index = context->vdpmem[address+3] & 0x7F; | 74 context->sprite_index = context->vdpmem[address+3] & 0x7F; |
76 { | 76 { |
77 address = context->sprite_index * 8 + sat_address; | 77 address = context->sprite_index * 8 + sat_address; |
78 y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) - 128; | 78 y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) - 128; |
79 height = ((context->vdpmem[address+2] & 0x3) + 1) * 8; | 79 height = ((context->vdpmem[address+2] & 0x3) + 1) * 8; |
80 if (y <= line && line < (y + height)) { | 80 if (y <= line && line < (y + height)) { |
81 printf("Sprite %d at y: %d with height %d is on line %d\n", context->sprite_index, y, height, line); | 81 //printf("Sprite %d at y: %d with height %d is on line %d\n", context->sprite_index, y, height, line); |
82 context->sprite_info_list[--(context->slot_counter)].size = context->vdpmem[address+2]; | 82 context->sprite_info_list[--(context->slot_counter)].size = context->vdpmem[address+2]; |
83 context->sprite_info_list[context->slot_counter].index = context->sprite_index; | 83 context->sprite_info_list[context->slot_counter].index = context->sprite_index; |
84 context->sprite_info_list[context->slot_counter].y = y; | 84 context->sprite_info_list[context->slot_counter].y = y; |
85 } | 85 } |
86 context->sprite_index = context->vdpmem[address+3] & 0x7F; | 86 context->sprite_index = context->vdpmem[address+3] & 0x7F; |
110 uint16_t address = ((tileinfo & 0x7FF) << 5) + row * 4; | 110 uint16_t address = ((tileinfo & 0x7FF) << 5) + row * 4; |
111 int16_t x = ((context->vdpmem[att_addr+ 2] & 0x3) << 8) | context->vdpmem[att_addr + 3]; | 111 int16_t x = ((context->vdpmem[att_addr+ 2] & 0x3) << 8) | context->vdpmem[att_addr + 3]; |
112 if (x) { | 112 if (x) { |
113 x -= 128; | 113 x -= 128; |
114 int16_t base_x = x; | 114 int16_t base_x = x; |
115 printf("Sprite %d | x: %d, y: %d, width: %d, height: %d, pal_priority: %X, row: %d, tile addr: %X\n", context->sprite_info_list[context->cur_slot].index, x, context->sprite_info_list[context->cur_slot].y, width, height, pal_priority, row, address); | 115 //printf("Sprite %d | x: %d, y: %d, width: %d, height: %d, pal_priority: %X, row: %d, tile addr: %X\n", context->sprite_info_list[context->cur_slot].index, x, context->sprite_info_list[context->cur_slot].y, width, height, pal_priority, row, address); |
116 for (;width && context->sprite_draws; --width, x += 8) { | 116 for (;width && context->sprite_draws; --width, x += 8) { |
117 --context->sprite_draws; | 117 --context->sprite_draws; |
118 context->sprite_draw_list[context->sprite_draws].address = address + ((x-base_x) / 8) * height * 4; | 118 context->sprite_draw_list[context->sprite_draws].address = address + ((x-base_x) / 8) * height * 4; |
119 context->sprite_draw_list[context->sprite_draws].x_pos = x; | 119 context->sprite_draw_list[context->sprite_draws].x_pos = x; |
120 context->sprite_draw_list[context->sprite_draws].pal_priority = pal_priority; | 120 context->sprite_draw_list[context->sprite_draws].pal_priority = pal_priority; |