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;